diff --git a/CMakeLists.txt b/CMakeLists.txt index b6d40a034..f7829fc9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -403,8 +403,10 @@ if(SLIC3R_STATIC) set(USE_BLOSC TRUE) endif() -#find_package(OpenVDB 5.0 COMPONENTS openvdb) -#slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) +find_package(OpenVDB 5.0 COMPONENTS openvdb) +if(OpenVDB_FOUND) + slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) +endif() # libslic3r, PrusaSlicer GUI and the PrusaSlicer executable. add_subdirectory(src) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 9afe8a235..dd4ff5b20 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -108,6 +108,18 @@ if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() +if(OpenVDB_FIND_QUIETLY) + set (_quiet "QUIET") +else() + set (_quiet "") +endif() + +if(OpenVDB_FIND_REQUIRED) + set (_required "REQUIRED") +else() + set (_required "") +endif() + # Include utility functions for version information include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake) @@ -146,7 +158,7 @@ set(_OPENVDB_ROOT_SEARCH_DIR "") # Additionally try and use pkconfig to find OpenVDB -find_package(PkgConfig) +find_package(PkgConfig ${_quiet} ${_required}) pkg_check_modules(PC_OpenVDB QUIET OpenVDB) # ------------------------------------------------------------------------ @@ -250,7 +262,7 @@ OPENVDB_ABI_VERSION_FROM_PRINT( ABI OpenVDB_ABI ) -if(NOT OpenVDB_FIND_QUIET) +if(NOT OpenVDB_FIND_QUIETLY) if(NOT OpenVDB_ABI) message(WARNING "Unable to determine OpenVDB ABI version from OpenVDB " "installation. The library major version \"${OpenVDB_MAJOR_VERSION}\" " @@ -268,7 +280,17 @@ endif() # Add standard dependencies -find_package(IlmBase COMPONENTS Half) +macro(just_fail msg) + set(OpenVDB_FOUND FALSE) + if(OpenVDB_FIND_REQUIRED) + message(FATAL_ERROR msg) + elseif(NOT OpenVDB_FIND_QUIETLY) + message(ERROR msg) + endif() + return() +endmacro() + +find_package(IlmBase QUIET COMPONENTS Half) if(NOT IlmBase_FOUND) pkg_check_modules(IlmBase QUIET IlmBase) endif() @@ -276,20 +298,20 @@ if (IlmBase_FOUND AND NOT TARGET IlmBase::Half) message(STATUS "Falling back to IlmBase found by pkg-config...") find_library(IlmHalf_LIBRARY NAMES Half) - if(IlmHalf_LIBRARY-NOTFOUND) - message(FATAL_ERROR "IlmBase::Half can not be found!") + if(IlmHalf_LIBRARY-NOTFOUND OR NOT IlmBase_INCLUDE_DIRS) + just_fail("IlmBase::Half can not be found!") endif() add_library(IlmBase::Half UNKNOWN IMPORTED) set_target_properties(IlmBase::Half PROPERTIES IMPORTED_LOCATION "${IlmHalf_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES ${IlmBase_INCLUDE_DIRS}) + INTERFACE_INCLUDE_DIRECTORIES "${IlmBase_INCLUDE_DIRS}") elseif(NOT IlmBase_FOUND) - message(FATAL_ERROR "IlmBase::Half can not be found!") + just_fail("IlmBase::Half can not be found!") endif() -find_package(TBB REQUIRED COMPONENTS tbb) -find_package(ZLIB REQUIRED) -find_package(Boost REQUIRED COMPONENTS iostreams system) +find_package(TBB ${_quiet} ${_required} COMPONENTS tbb) +find_package(ZLIB ${_quiet} ${_required}) +find_package(Boost ${_quiet} ${_required} COMPONENTS iostreams system ) # Use GetPrerequisites to see which libraries this OpenVDB lib has linked to # which we can query for optional deps. This basically runs ldd/otoll/objdump @@ -350,7 +372,7 @@ unset(_OPENVDB_PREREQUISITE_LIST) unset(_HAS_DEP) if(OpenVDB_USES_BLOSC) - find_package(Blosc ) + find_package(Blosc QUIET) if(NOT Blosc_FOUND OR NOT TARGET Blosc::blosc) message(STATUS "find_package could not find Blosc. Using fallback blosc search...") find_path(Blosc_INCLUDE_DIR blosc.h) @@ -362,25 +384,25 @@ if(OpenVDB_USES_BLOSC) IMPORTED_LOCATION "${Blosc_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES ${Blosc_INCLUDE_DIR}) elseif() - message(FATAL_ERROR "Blosc library can not be found!") + just_fail("Blosc library can not be found!") endif() endif() endif() if(OpenVDB_USES_LOG4CPLUS) - find_package(Log4cplus REQUIRED) + find_package(Log4cplus ${_quiet} ${_required}) endif() if(OpenVDB_USES_ILM) - find_package(IlmBase REQUIRED) + find_package(IlmBase ${_quiet} ${_required}) endif() if(OpenVDB_USES_EXR) - find_package(OpenEXR REQUIRED) + find_package(OpenEXR ${_quiet} ${_required}) endif() if(UNIX) - find_package(Threads REQUIRED) + find_package(Threads ${_quiet} ${_required}) endif() # Set deps. Note that the order here is important. If we're building against @@ -481,7 +503,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) endif() endforeach() -if(OpenVDB_FOUND AND NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) +if(OpenVDB_FOUND AND NOT OpenVDB_FIND_QUIETLY) message(STATUS "OpenVDB libraries: ${OpenVDB_LIBRARIES}") endif() diff --git a/cmake/modules/OpenVDBUtils.cmake b/cmake/modules/OpenVDBUtils.cmake index bb3ce6e65..f64eda6f2 100644 --- a/cmake/modules/OpenVDBUtils.cmake +++ b/cmake/modules/OpenVDBUtils.cmake @@ -125,7 +125,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) cmake_parse_arguments(_VDB "QUIET" "ABI" "" ${ARGN}) if(NOT EXISTS ${OPENVDB_PRINT}) - message(WARNING "vdb_print not found! ${OPENVDB_PRINT}") + if(NOT OpenVDB_FIND_QUIETLY) + message(WARNING "vdb_print not found! ${OPENVDB_PRINT}") + endif() return() endif() @@ -148,7 +150,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) endif() if(${_VDB_PRINT_RETURN_STATUS}) - message(WARNING "vdb_print returned with status ${_VDB_PRINT_RETURN_STATUS}") + if(NOT OpenVDB_FIND_QUIETLY) + message(WARNING "vdb_print returned with status ${_VDB_PRINT_RETURN_STATUS}") + endif() return() endif() diff --git a/resources/icons/hollow.svg b/resources/icons/hollow.svg new file mode 100644 index 000000000..119fb6afc --- /dev/null +++ b/resources/icons/hollow.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandboxes/openvdb/CMakeLists.txt b/sandboxes/openvdb/CMakeLists.txt index 184452e83..c32d6c8d6 100644 --- a/sandboxes/openvdb/CMakeLists.txt +++ b/sandboxes/openvdb/CMakeLists.txt @@ -1,2 +1,7 @@ -add_executable(openvdb_example openvdb_example.cpp) -target_link_libraries(openvdb_example libslic3r) +if(TARGET OpenVDB::openvdb) + add_executable(openvdb_example openvdb_example.cpp) + + target_link_libraries(openvdb_example libslic3r) + target_link_libraries(openvdb_example OpenVDB::openvdb) +endif() + diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 0388b1ac0..33a2142f7 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -9,6 +9,11 @@ if (MINGW) add_compile_options(-Wa,-mbig-obj) endif () +set(OpenVDBUtils_SOURCES "") +if (TARGET OpenVDB::openvdb) + set(OpenVDBUtils_SOURCES OpenVDBUtils.cpp OpenVDBUtils.hpp) +endif() + add_library(libslic3r STATIC pchheader.cpp pchheader.hpp @@ -176,7 +181,9 @@ add_library(libslic3r STATIC MinAreaBoundingBox.cpp miniz_extension.hpp miniz_extension.cpp + ${OpenVDBUtils_SOURCES} SLA/SLACommon.hpp + SLA/SLACommon.cpp SLA/SLABoilerPlate.hpp SLA/SLAPad.hpp SLA/SLAPad.cpp @@ -224,10 +231,13 @@ target_link_libraries(libslic3r qhull semver TBB::tbb - # OpenVDB::openvdb ${CMAKE_DL_LIBS} ) +if (TARGET OpenVDB::openvdb) + target_link_libraries(libslic3r OpenVDB::openvdb) +endif() + if(WIN32) target_link_libraries(libslic3r Psapi.lib) endif() diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp index c805667f8..8279c5530 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -355,6 +355,35 @@ bool objparse(const char *path, ObjData &data) return true; } +bool objparse(std::istream &stream, ObjData &data) +{ + try { + char buf[65536 * 2]; + size_t len = 0; + size_t lenPrev = 0; + while ((len = size_t(stream.read(buf + lenPrev, 65536).gcount())) != 0) { + len += lenPrev; + size_t lastLine = 0; + for (size_t i = 0; i < len; ++ i) + if (buf[i] == '\r' || buf[i] == '\n') { + buf[i] = 0; + char *c = buf + lastLine; + while (*c == ' ' || *c == '\t') + ++ c; + obj_parseline(c, data); + lastLine = i + 1; + } + lenPrev = len - lastLine; + memmove(buf, buf + lastLine, lenPrev); + } + } + catch (std::bad_alloc&) { + printf("Out of memory\r\n"); + } + + return true; +} + template bool savevector(FILE *pFile, const std::vector &v) { diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 5fc25e297..5f3f010e4 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace ObjParser { @@ -97,6 +98,7 @@ struct ObjData { }; extern bool objparse(const char *path, ObjData &data); +extern bool objparse(std::istream &stream, ObjData &data); extern bool objbinsave(const char *path, const ObjData &data); diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp new file mode 100644 index 000000000..9842db2da --- /dev/null +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -0,0 +1,121 @@ +#define NOMINMAX +#include "OpenVDBUtils.hpp" +#include +#include + +namespace Slic3r { + +class TriangleMeshDataAdapter { +public: + const TriangleMesh &mesh; + + size_t polygonCount() const { return mesh.its.indices.size(); } + size_t pointCount() const { return mesh.its.vertices.size(); } + size_t vertexCount(size_t) const { return 3; } + + // Return position pos in local grid index space for polygon n and vertex v + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const; +}; + +class Contour3DDataAdapter { +public: + const sla::Contour3D &mesh; + + size_t polygonCount() const { return mesh.faces3.size() + mesh.faces4.size(); } + size_t pointCount() const { return mesh.points.size(); } + size_t vertexCount(size_t n) const { return n < mesh.faces3.size() ? 3 : 4; } + + // Return position pos in local grid index space for polygon n and vertex v + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const; +}; + +void TriangleMeshDataAdapter::getIndexSpacePoint(size_t n, + size_t v, + openvdb::Vec3d &pos) const +{ + auto vidx = size_t(mesh.its.indices[n](Eigen::Index(v))); + Slic3r::Vec3d p = mesh.its.vertices[vidx].cast(); + pos = {p.x(), p.y(), p.z()}; +} + +void Contour3DDataAdapter::getIndexSpacePoint(size_t n, + size_t v, + openvdb::Vec3d &pos) const +{ + size_t vidx = 0; + if (n < mesh.faces3.size()) vidx = size_t(mesh.faces3[n](Eigen::Index(v))); + else vidx = size_t(mesh.faces4[n - mesh.faces3.size()](Eigen::Index(v))); + + Slic3r::Vec3d p = mesh.points[vidx]; + pos = {p.x(), p.y(), p.z()}; +} + +openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, + float exteriorBandWidth, + float interiorBandWidth, + int flags, + const openvdb::math::Transform &tr) +{ + openvdb::initialize(); + return openvdb::tools::meshToVolume( + TriangleMeshDataAdapter{mesh}, tr, exteriorBandWidth, + interiorBandWidth, flags); +} + +// TODO: Do I need to call initialize? Seems to work without it as well but the +// docs say it should be called ones. It does a mutex lock-unlock sequence all +// even if was called previously. + +openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, + float exteriorBandWidth, + float interiorBandWidth, + int flags, + const openvdb::math::Transform &tr) +{ + openvdb::initialize(); + return openvdb::tools::meshToVolume( + Contour3DDataAdapter{mesh}, tr, exteriorBandWidth, interiorBandWidth, + flags); +} + +inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } +inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast(); } +inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1]), int(v[2])}; } +inline Vec4i to_vec4i(const openvdb::Vec4I &v) { return Vec4i{int(v[0]), int(v[1]), int(v[2]), int(v[3])}; } + +template +sla::Contour3D _volumeToMesh(const Grid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + openvdb::initialize(); + + std::vector points; + std::vector triangles; + std::vector quads; + + openvdb::tools::volumeToMesh(grid, points, triangles, quads, isovalue, + adaptivity, relaxDisorientedTriangles); + + sla::Contour3D ret; + ret.points.reserve(points.size()); + ret.faces3.reserve(triangles.size()); + ret.faces4.reserve(quads.size()); + + for (auto &v : points) ret.points.emplace_back(to_vec3d(v)); + for (auto &v : triangles) ret.faces3.emplace_back(to_vec3i(v)); + for (auto &v : quads) ret.faces4.emplace_back(to_vec4i(v)); + + return ret; +} + +sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + return _volumeToMesh(grid, isovalue, adaptivity, relaxDisorientedTriangles); +} + +} // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp new file mode 100644 index 000000000..ee740dd06 --- /dev/null +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -0,0 +1,29 @@ +#ifndef OPENVDBUTILS_HPP +#define OPENVDBUTILS_HPP + +#include +#include +#include + +namespace Slic3r { + +openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0, + const openvdb::math::Transform &tr = {}); + +openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D &mesh, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0, + const openvdb::math::Transform &tr = {}); + +sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue = 0.0, + double adaptivity = 0.0, + bool relaxDisorientedTriangles = true); + +} // namespace Slic3r + +#endif // OPENVDBUTILS_HPP diff --git a/src/libslic3r/SLA/SLABoilerPlate.hpp b/src/libslic3r/SLA/SLABoilerPlate.hpp index d7ce26bb2..9be91ac1d 100644 --- a/src/libslic3r/SLA/SLABoilerPlate.hpp +++ b/src/libslic3r/SLA/SLABoilerPlate.hpp @@ -12,91 +12,11 @@ #include "SLASpatIndex.hpp" namespace Slic3r { + +typedef Eigen::Matrix Vec4i; + namespace sla { -/// Intermediate struct for a 3D mesh -struct Contour3D { - Pointf3s points; - std::vector indices; - - Contour3D& merge(const Contour3D& ctr) - { - auto s3 = coord_t(points.size()); - auto s = indices.size(); - - points.insert(points.end(), ctr.points.begin(), ctr.points.end()); - indices.insert(indices.end(), ctr.indices.begin(), ctr.indices.end()); - - for(size_t n = s; n < indices.size(); n++) { - auto& idx = indices[n]; idx.x() += s3; idx.y() += s3; idx.z() += s3; - } - - return *this; - } - - Contour3D& merge(const Pointf3s& triangles) - { - const size_t offs = points.size(); - points.insert(points.end(), triangles.begin(), triangles.end()); - indices.reserve(indices.size() + points.size() / 3); - - for(int i = int(offs); i < int(points.size()); i += 3) - indices.emplace_back(i, i + 1, i + 2); - - return *this; - } - - // Write the index triangle structure to OBJ file for debugging purposes. - void to_obj(std::ostream& stream) - { - for(auto& p : points) { - stream << "v " << p.transpose() << "\n"; - } - - for(auto& f : indices) { - stream << "f " << (f + Vec3i(1, 1, 1)).transpose() << "\n"; - } - } -}; - -using ClusterEl = std::vector; -using ClusteredPoints = std::vector; - -// Clustering a set of points by the given distance. -ClusteredPoints cluster(const std::vector& indices, - std::function pointfn, - double dist, - unsigned max_points); - -ClusteredPoints cluster(const PointSet& points, - double dist, - unsigned max_points); - -ClusteredPoints cluster( - const std::vector& indices, - std::function pointfn, - std::function predicate, - unsigned max_points); - - -// Calculate the normals for the selected points (from 'points' set) on the -// mesh. This will call squared distance for each point. -PointSet normals(const PointSet& points, - const EigenMesh3D& mesh, - double eps = 0.05, // min distance from edges - std::function throw_on_cancel = [](){}, - const std::vector& selected_points = {}); - -/// Mesh from an existing contour. -inline TriangleMesh mesh(const Contour3D& ctour) { - return {ctour.points, ctour.indices}; -} - -/// Mesh from an evaporating 3D contour -inline TriangleMesh mesh(Contour3D&& ctour) { - return {std::move(ctour.points), std::move(ctour.indices)}; -} - } } diff --git a/src/libslic3r/SLA/SLACommon.cpp b/src/libslic3r/SLA/SLACommon.cpp new file mode 100644 index 000000000..e6fbed7ec --- /dev/null +++ b/src/libslic3r/SLA/SLACommon.cpp @@ -0,0 +1,147 @@ +#include "SLACommon.hpp" +#include + +namespace Slic3r { namespace sla { + +Contour3D::Contour3D(const TriangleMesh &trmesh) +{ + points.reserve(trmesh.its.vertices.size()); + faces3.reserve(trmesh.its.indices.size()); + + for (auto &v : trmesh.its.vertices) + points.emplace_back(v.cast()); + + std::copy(trmesh.its.indices.begin(), trmesh.its.indices.end(), + std::back_inserter(faces3)); +} + +Contour3D::Contour3D(TriangleMesh &&trmesh) +{ + points.reserve(trmesh.its.vertices.size()); + + for (auto &v : trmesh.its.vertices) + points.emplace_back(v.cast()); + + faces3.swap(trmesh.its.indices); +} + +Contour3D::Contour3D(const EigenMesh3D &emesh) { + points.reserve(size_t(emesh.V().rows())); + faces3.reserve(size_t(emesh.F().rows())); + + for (int r = 0; r < emesh.V().rows(); r++) + points.emplace_back(emesh.V().row(r).cast()); + + for (int i = 0; i < emesh.F().rows(); i++) + faces3.emplace_back(emesh.F().row(i)); +} + +Contour3D &Contour3D::merge(const Contour3D &ctr) +{ + auto N = coord_t(points.size()); + auto N_f3 = faces3.size(); + auto N_f4 = faces4.size(); + + points.insert(points.end(), ctr.points.begin(), ctr.points.end()); + faces3.insert(faces3.end(), ctr.faces3.begin(), ctr.faces3.end()); + faces4.insert(faces4.end(), ctr.faces4.begin(), ctr.faces4.end()); + + for(size_t n = N_f3; n < faces3.size(); n++) { + auto& idx = faces3[n]; idx.x() += N; idx.y() += N; idx.z() += N; + } + + for(size_t n = N_f4; n < faces4.size(); n++) { + auto& idx = faces4[n]; for (int k = 0; k < 4; k++) idx(k) += N; + } + + return *this; +} + +Contour3D &Contour3D::merge(const Pointf3s &triangles) +{ + const size_t offs = points.size(); + points.insert(points.end(), triangles.begin(), triangles.end()); + faces3.reserve(faces3.size() + points.size() / 3); + + for(int i = int(offs); i < int(points.size()); i += 3) + faces3.emplace_back(i, i + 1, i + 2); + + return *this; +} + +void Contour3D::to_obj(std::ostream &stream) +{ + for(auto& p : points) + stream << "v " << p.transpose() << "\n"; + + for(auto& f : faces3) + stream << "f " << (f + Vec3i(1, 1, 1)).transpose() << "\n"; + + for(auto& f : faces4) + stream << "f " << (f + Vec4i(1, 1, 1, 1)).transpose() << "\n"; +} + +void Contour3D::from_obj(std::istream &stream) +{ + ObjParser::ObjData data; + ObjParser::objparse(stream, data); + + points.reserve(data.coordinates.size() / 4 + 1); + auto &coords = data.coordinates; + for (size_t i = 0; i < coords.size(); i += 4) + points.emplace_back(coords[i], coords[i + 1], coords[i + 2]); + + Vec3i triangle; + Vec4i quad; + size_t v = 0; + while(v < data.vertices.size()) { + size_t N = 0; + size_t i = v; + while (data.vertices[v++].coordIdx != -1) ++N; + + std::function setfn; + if (N < 3 || N > 4) continue; + else if (N == 3) setfn = [&triangle](int k, int f) { triangle(k) = f; }; + else setfn = [&quad](int k, int f) { quad(k) = f; }; + + for (size_t j = 0; j < N; ++j) + setfn(int(j), data.vertices[i + j].coordIdx); + } +} + +TriangleMesh to_triangle_mesh(const Contour3D &ctour) { + if (ctour.faces4.empty()) return {ctour.points, ctour.faces3}; + + std::vector triangles; + + triangles.reserve(ctour.faces3.size() + 2 * ctour.faces4.size()); + std::copy(ctour.faces3.begin(), ctour.faces3.end(), + std::back_inserter(triangles)); + + for (auto &quad : ctour.faces4) { + triangles.emplace_back(quad(0), quad(1), quad(2)); + triangles.emplace_back(quad(2), quad(3), quad(0)); + } + + return {ctour.points, std::move(triangles)}; +} + +TriangleMesh to_triangle_mesh(Contour3D &&ctour) { + if (ctour.faces4.empty()) + return {std::move(ctour.points), std::move(ctour.faces3)}; + + std::vector triangles; + + triangles.reserve(ctour.faces3.size() + 2 * ctour.faces4.size()); + std::copy(ctour.faces3.begin(), ctour.faces3.end(), + std::back_inserter(triangles)); + + for (auto &quad : ctour.faces4) { + triangles.emplace_back(quad(0), quad(1), quad(2)); + triangles.emplace_back(quad(2), quad(3), quad(0)); + } + + return {std::move(ctour.points), std::move(triangles)}; +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index 97b459676..7cdc62662 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -5,6 +5,11 @@ #include #include +#include "SLASpatIndex.hpp" + +#include +#include + // #define SLIC3R_SLA_NEEDS_WINDTREE namespace Slic3r { @@ -12,8 +17,7 @@ namespace Slic3r { // Typedefs from Point.hpp typedef Eigen::Matrix Vec3f; typedef Eigen::Matrix Vec3d; - -class TriangleMesh; +typedef Eigen::Matrix Vec4i; namespace sla { @@ -59,9 +63,11 @@ struct SupportPoint bool operator==(const SupportPoint &sp) const { - return (pos == sp.pos) && head_front_radius == sp.head_front_radius && + float rdiff = std::abs(head_front_radius - sp.head_front_radius); + return (pos == sp.pos) && rdiff < float(EPSILON) && is_new_island == sp.is_new_island; } + bool operator!=(const SupportPoint &sp) const { return !(sp == (*this)); } template void serialize(Archive &ar) @@ -72,8 +78,11 @@ struct SupportPoint using SupportPoints = std::vector; +struct Contour3D; + /// An index-triangle structure for libIGL functions. Also serves as an -/// alternative (raw) input format for the SLASupportTree +/// alternative (raw) input format for the SLASupportTree. +// Implemented in SLASupportTreeIGL.cpp class EigenMesh3D { class AABBImpl; @@ -86,6 +95,7 @@ public: EigenMesh3D(const TriangleMesh&); EigenMesh3D(const EigenMesh3D& other); + EigenMesh3D(const Contour3D &other); EigenMesh3D& operator=(const EigenMesh3D&); ~EigenMesh3D(); @@ -180,6 +190,63 @@ public: using PointSet = Eigen::MatrixXd; + +/// Dumb vertex mesh consisting of triangles (or) quads. Capable of merging with +/// other meshes of this type and converting to and from other mesh formats. +struct Contour3D { + Pointf3s points; + std::vector faces3; + std::vector faces4; + + Contour3D() = default; + Contour3D(const TriangleMesh &trmesh); + Contour3D(TriangleMesh &&trmesh); + Contour3D(const EigenMesh3D &emesh); + + Contour3D& merge(const Contour3D& ctr); + Contour3D& merge(const Pointf3s& triangles); + + // Write the index triangle structure to OBJ file for debugging purposes. + void to_obj(std::ostream& stream); + void from_obj(std::istream &stream); + + inline bool empty() const { return points.empty() || (faces4.empty() && faces3.empty()); } +}; + +using ClusterEl = std::vector; +using ClusteredPoints = std::vector; + +// Clustering a set of points by the given distance. +ClusteredPoints cluster(const std::vector& indices, + std::function pointfn, + double dist, + unsigned max_points); + +ClusteredPoints cluster(const PointSet& points, + double dist, + unsigned max_points); + +ClusteredPoints cluster( + const std::vector& indices, + std::function pointfn, + std::function predicate, + unsigned max_points); + + +// Calculate the normals for the selected points (from 'points' set) on the +// mesh. This will call squared distance for each point. +PointSet normals(const PointSet& points, + const EigenMesh3D& convert_mesh, + double eps = 0.05, // min distance from edges + std::function throw_on_cancel = [](){}, + const std::vector& selected_points = {}); + +/// Mesh from an existing contour. +TriangleMesh to_triangle_mesh(const Contour3D& ctour); + +/// Mesh from an evaporating 3D contour +TriangleMesh to_triangle_mesh(Contour3D&& ctour); + } // namespace sla } // namespace Slic3r diff --git a/src/libslic3r/SLA/SLAPad.cpp b/src/libslic3r/SLA/SLAPad.cpp index 7cd9eb4e4..264cfba9f 100644 --- a/src/libslic3r/SLA/SLAPad.cpp +++ b/src/libslic3r/SLA/SLAPad.cpp @@ -69,7 +69,7 @@ Contour3D walls( // Shorthand for the vertex arrays auto& upts = upper.points, &lpts = lower.points; - auto& rpts = ret.points; auto& ind = ret.indices; + auto& rpts = ret.points; auto& ind = ret.faces3; // If the Z levels are flipped, or the offset difference is negative, we // will interpret that as the triangles normals should be inverted. @@ -677,7 +677,7 @@ void create_pad(const ExPolygons &sup_blueprint, ThrowOnCancel thr) { Contour3D t = create_pad_geometry(sup_blueprint, model_blueprint, cfg, thr); - out.merge(mesh(std::move(t))); + out.merge(to_triangle_mesh(std::move(t))); } std::string PadConfig::validate() const diff --git a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp b/src/libslic3r/SLA/SLASupportTreeBuilder.cpp index 2e0310ed8..df51c6b5f 100644 --- a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp +++ b/src/libslic3r/SLA/SLASupportTreeBuilder.cpp @@ -12,7 +12,7 @@ Contour3D sphere(double rho, Portion portion, double fa) { if(rho <= 1e-6 && rho >= -1e-6) return ret; auto& vertices = ret.points; - auto& facets = ret.indices; + auto& facets = ret.faces3; // Algorithm: // Add points one-by-one to the sphere grid and form facets using relative @@ -102,7 +102,7 @@ Contour3D cylinder(double r, double h, size_t ssteps, const Vec3d &sp) auto steps = int(ssteps); auto& points = ret.points; - auto& indices = ret.indices; + auto& indices = ret.faces3; points.reserve(2*ssteps); double a = 2*PI/steps; @@ -211,8 +211,8 @@ Head::Head(double r_big_mm, coord_t i1s1 = coord_t(idx1), i1s2 = coord_t(idx2); coord_t i2s1 = i1s1 + 1, i2s2 = i1s2 + 1; - mesh.indices.emplace_back(i1s1, i2s1, i2s2); - mesh.indices.emplace_back(i1s1, i2s2, i1s2); + mesh.faces3.emplace_back(i1s1, i2s1, i2s2); + mesh.faces3.emplace_back(i1s1, i2s2, i1s2); } auto i1s1 = coord_t(s1.points.size()) - coord_t(steps); @@ -220,8 +220,8 @@ Head::Head(double r_big_mm, auto i1s2 = coord_t(s1.points.size()); auto i2s2 = coord_t(s1.points.size()) + coord_t(steps) - 1; - mesh.indices.emplace_back(i2s2, i2s1, i1s1); - mesh.indices.emplace_back(i1s2, i2s2, i1s1); + mesh.faces3.emplace_back(i2s2, i2s1, i1s1); + mesh.faces3.emplace_back(i1s2, i2s2, i1s1); // To simplify further processing, we translate the mesh so that the // last vertex of the pointing sphere (the pinpoint) will be at (0,0,0) @@ -240,7 +240,7 @@ Pillar::Pillar(const Vec3d &jp, const Vec3d &endp, double radius, size_t st): // move the data. Contour3D body = cylinder(radius, height, st, endp); mesh.points.swap(body.points); - mesh.indices.swap(body.indices); + mesh.faces3.swap(body.faces3); } } @@ -275,7 +275,7 @@ Pillar &Pillar::add_base(double baseheight, double radius) base.points.emplace_back(endpt); base.points.emplace_back(ep); - auto& indices = base.indices; + auto& indices = base.faces3; auto hcenter = int(base.points.size() - 1); auto lcenter = int(base.points.size() - 2); auto offs = int(steps); @@ -466,7 +466,7 @@ const TriangleMesh &SupportTreeBuilder::merged_mesh() const return m_meshcache; } - m_meshcache = mesh(merged); + m_meshcache = to_triangle_mesh(merged); // The mesh will be passed by const-pointer to TriangleMeshSlicer, // which will need this. diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index 05f8b1984..5e10c28c9 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -228,6 +228,26 @@ EigenMesh3D::EigenMesh3D(const EigenMesh3D &other): m_V(other.m_V), m_F(other.m_F), m_ground_level(other.m_ground_level), m_aabb( new AABBImpl(*other.m_aabb) ) {} +EigenMesh3D::EigenMesh3D(const Contour3D &other) +{ + m_V.resize(Eigen::Index(other.points.size()), 3); + m_F.resize(Eigen::Index(other.faces3.size() + 2 * other.faces4.size()), 3); + + for (Eigen::Index i = 0; i < Eigen::Index(other.points.size()); ++i) + m_V.row(i) = other.points[size_t(i)]; + + for (Eigen::Index i = 0; i < Eigen::Index(other.faces3.size()); ++i) + m_F.row(i) = other.faces3[size_t(i)]; + + size_t N = other.faces3.size() + 2 * other.faces4.size(); + for (size_t i = other.faces3.size(); i < N; i += 2) { + size_t quad_idx = (i - other.faces3.size()) / 2; + auto & quad = other.faces4[quad_idx]; + m_F.row(Eigen::Index(i)) = Vec3i{quad(0), quad(1), quad(2)}; + m_F.row(Eigen::Index(i + 1)) = Vec3i{quad(2), quad(3), quad(0)}; + } +} + EigenMesh3D &EigenMesh3D::operator=(const EigenMesh3D &other) { m_V = other.m_V; diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 84a60da6e..08cab62e2 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -47,6 +47,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoFlatten.hpp GUI/Gizmos/GLGizmoCut.cpp GUI/Gizmos/GLGizmoCut.hpp + GUI/Gizmos/GLGizmoHollow.cpp + GUI/Gizmos/GLGizmoHollow.hpp GUI/GLSelectionRectangle.cpp GUI/GLSelectionRectangle.hpp GUI/GLTexture.hpp diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 2c2676ae7..dc25f77d8 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -486,6 +486,7 @@ public: void set_color_by(const std::string& value); const Camera& get_camera() const { return m_camera; } + const Shader& get_shader() const { return m_shader; } BoundingBoxf3 volumes_bounding_box() const; BoundingBoxf3 scene_bounding_box() const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp new file mode 100644 index 000000000..5b6620ef6 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -0,0 +1,1091 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoHollow.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/Gizmos/GLGizmos.hpp" + +#include + +//#include +//#include +//#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_ObjectSettings.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/PresetBundle.hpp" +#include "libslic3r/SLAPrint.hpp" +#include "libslic3r/OpenVDBUtils.hpp" + + +namespace Slic3r { +namespace GUI { + +GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) + , m_quadric(nullptr) + , m_its(nullptr) +{ + m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + // using GLU_FILL does not work when the instance's transformation + // contains mirroring (normals are reverted) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoHollow::~GLGizmoHollow() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} + +bool GLGizmoHollow::on_init() +{ + m_shortcut_key = WXK_CONTROL_L; + + m_desc["head_diameter"] = _(L("Head diameter")) + ": "; + m_desc["lock_supports"] = _(L("Lock supports under new islands")); + m_desc["remove_selected"] = _(L("Remove selected points")); + m_desc["remove_all"] = _(L("Remove all points")); + m_desc["apply_changes"] = _(L("Apply changes")); + m_desc["discard_changes"] = _(L("Discard changes")); + m_desc["minimal_distance"] = _(L("Minimal points distance")) + ": "; + m_desc["points_density"] = _(L("Support points density")) + ": "; + m_desc["auto_generate"] = _(L("Auto-generate points")); + m_desc["manual_editing"] = _(L("Manual editing")); + m_desc["clipping_of_view"] = _(L("Clipping of view"))+ ": "; + m_desc["reset_direction"] = _(L("Reset direction")); + m_desc["hollow"] = _(L("Hollow")); + + return true; +} + +void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Selection& selection) +{ + if (! model_object || selection.is_empty()) { + m_model_object = nullptr; + return; + } + + if (m_model_object != model_object || m_model_object_id != model_object->id()) { + m_model_object = model_object; + m_print_object_idx = -1; + } + + m_active_instance = selection.get_instance_idx(); + + if (model_object && selection.is_from_single_instance()) + { + // Cache the bb - it's needed for dealing with the clipping plane quite often + // It could be done inside update_mesh but one has to account for scaling of the instance. + //FIXME calling ModelObject::instance_bounding_box() is expensive! + m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); + + if (is_mesh_update_necessary()) { + update_mesh(); + reload_cache(); + } + + if (m_state == On) { + m_parent.toggle_model_objects_visibility(false); + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + } + else + m_parent.toggle_model_objects_visibility(true, nullptr, -1); + } +} + + + +void GLGizmoHollow::on_render() const +{ + const Selection& selection = m_parent.get_selection(); + + // If current m_model_object does not match selection, ask GLCanvas3D to turn us off + if (m_state == On + && (m_model_object != selection.get_model()->objects[selection.get_object_idx()] + || m_active_instance != selection.get_instance_idx() + || m_model_object_id != m_model_object->id())) { + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS)); + return; + } + + if (! m_its || ! m_mesh) + const_cast(this)->update_mesh(); + + if (m_volume_with_cavity) { + m_parent.get_shader().start_using(); + m_volume_with_cavity->render(); + m_parent.get_shader().stop_using(); + } + + glsafe(::glEnable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); + + if (m_quadric != nullptr && selection.is_from_single_instance()) + render_points(selection, false); + + m_selection_rectangle.render(m_parent); + render_clipping_plane(selection); + + glsafe(::glDisable(GL_BLEND)); +} + + + +void GLGizmoHollow::render_clipping_plane(const Selection& selection) const +{ + if (m_clipping_plane_distance == 0.f) + return; + + // Get transformation of the instance + const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); + Geometry::Transformation trafo = vol->get_instance_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + + // Get transformation of supports + Geometry::Transformation supports_trafo; + supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), vol->get_sla_shift_z())); + supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2))); + // I don't know why, but following seems to be correct. + supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2), + 1, + 1.)); + + // Now initialize the TMS for the object, perform the cut and save the result. + if (! m_object_clipper) { + m_object_clipper.reset(new MeshClipper); + m_object_clipper->set_mesh(*mesh()); + } + m_object_clipper->set_plane(*m_clipping_plane); + m_object_clipper->set_transformation(trafo); + + + // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too. + // First we need a pointer to the respective SLAPrintObject. The index into objects vector is + // cached so we don't have todo it on each render. We only search for the po if needed: + if (m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_print_objects_count) { + m_print_objects_count = m_parent.sla_print()->objects().size(); + m_print_object_idx = -1; + for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { + ++m_print_object_idx; + if (po->model_object()->id() == m_model_object->id()) + break; + } + } + if (m_print_object_idx >= 0) { + const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx]; + + if (print_object->is_step_done(slaposSupportTree)) { + // If the supports are already calculated, save the timestamp of the respective step + // so we can later tell they were recalculated. + size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; + + if (! m_supports_clipper || (int)timestamp != m_old_timestamp) { + // The timestamp has changed. + m_supports_clipper.reset(new MeshClipper); + // The mesh should already have the shared vertices calculated. + m_supports_clipper->set_mesh(print_object->support_mesh()); + m_old_timestamp = timestamp; + } + m_supports_clipper->set_plane(*m_clipping_plane); + m_supports_clipper->set_transformation(supports_trafo); + } + else + // The supports are not valid. We better dump the cached data. + m_supports_clipper.reset(); + } + + // At this point we have the triangulated cuts for both the object and supports - let's render. + if (! m_object_clipper->get_triangles().empty()) { + ::glPushMatrix(); + ::glColor3f(1.0f, 0.37f, 0.0f); + ::glBegin(GL_TRIANGLES); + for (const Vec3f& point : m_object_clipper->get_triangles()) + ::glVertex3f(point(0), point(1), point(2)); + ::glEnd(); + ::glPopMatrix(); + } + + if (m_supports_clipper && ! m_supports_clipper->get_triangles().empty() && !m_editing_mode) { + // The supports are hidden in the editing mode, so it makes no sense to render the cuts. + ::glPushMatrix(); + ::glColor3f(1.0f, 0.f, 0.37f); + ::glBegin(GL_TRIANGLES); + for (const Vec3f& point : m_supports_clipper->get_triangles()) + ::glVertex3f(point(0), point(1), point(2)); + ::glEnd(); + ::glPopMatrix(); + } +} + + +void GLGizmoHollow::on_render_for_picking() const +{ + const Selection& selection = m_parent.get_selection(); +#if ENABLE_RENDER_PICKING_PASS + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); +#endif + + glsafe(::glEnable(GL_DEPTH_TEST)); + render_points(selection, true); +} + +void GLGizmoHollow::render_points(const Selection& selection, bool picking) const +{ + if (!picking) + glsafe(::glEnable(GL_LIGHTING)); + + const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); + const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); + const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); + + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, m_z_shift)); + glsafe(::glMultMatrixd(instance_matrix.data())); + + float render_color[4]; + size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); + for (size_t i = 0; i < cache_size; ++i) + { + const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; + const bool& point_selected = m_editing_mode ? m_editing_cache[i].selected : false; + + if (is_mesh_point_clipped(support_point.pos.cast())) + continue; + + // First decide about the color of the point. + if (picking) { + std::array color = picking_color_component(i); + render_color[0] = color[0]; + render_color[1] = color[1]; + render_color[2] = color[2]; + render_color[3] = color[3]; + } + else { + render_color[3] = 1.f; + if ((size_t(m_hover_id) == i && m_editing_mode)) { // ignore hover state unless editing mode is active + render_color[0] = 0.f; + render_color[1] = 1.0f; + render_color[2] = 1.0f; + } + else { // neigher hover nor picking + render_color[0] = point_selected ? 1.0f : 0.7f; + render_color[1] = point_selected ? 0.3f : 0.7f; + render_color[2] = point_selected ? 0.3f : 0.7f; + render_color[3] = 0.5f; + } + } + glsafe(::glColor4fv(render_color)); + float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; + glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); + + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(support_point.pos(0), support_point.pos(1), support_point.pos(2))); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + + if (vol->is_left_handed()) + glFrontFace(GL_CW); + + // Matrices set, we can render the point mark now. + // If in editing mode, we'll also render a cone pointing to the sphere. + if (m_editing_mode) { + // in case the normal is not yet cached, find and cache it + if (m_editing_cache[i].normal == Vec3f::Zero()) + m_mesh_raycaster->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); + + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); + Eigen::AngleAxisd aa(q); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); + + const double cone_radius = double(support_point.head_front_radius) * RenderPointScale; //0.25; // mm + const double cone_height = m_new_cone_height; + //const double cone_rad_diff = m_new_cone_angle*(cone_radius/(cone_height/2.))*(cone_height/2.); + const double cone_rad_diff = m_new_cone_angle*cone_radius; + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(0.f, 0.f, -cone_height/2.)); + //::gluCylinder(m_quadric, cone_radius, cone_radius, cone_height, 24, 1); + ::gluCylinder(m_quadric, cone_radius+cone_rad_diff, cone_radius-cone_rad_diff, cone_height, 24, 1); + glsafe(::glTranslatef(0.f, 0.f, cone_height)); + //::gluDisk(m_quadric, 0.0, cone_radius, 24, 1); + ::gluDisk(m_quadric, 0.0, cone_radius-cone_rad_diff, 24, 1); + glsafe(::glPopMatrix()); + } + //::gluSphere(m_quadric, (double)support_point.head_front_radius * RenderPointScale, 24, 12); + if (vol->is_left_handed()) + glFrontFace(GL_CCW); + + glsafe(::glPopMatrix()); + } + + { + // Reset emissive component to zero (the default value) + float render_color_emissive[4] = { 0.f, 0.f, 0.f, 1.f }; + glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); + } + + if (!picking) + glsafe(::glDisable(GL_LIGHTING)); + + glsafe(::glPopMatrix()); +} + + + +bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const +{ + if (m_clipping_plane_distance == 0.f) + return false; + + Vec3d transformed_point = m_model_object->instances.front()->get_transformation().get_matrix() * point; + transformed_point(2) += m_z_shift; + return m_clipping_plane->is_point_clipped(transformed_point); +} + + + +bool GLGizmoHollow::is_mesh_update_necessary() const +{ + return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) + && ((m_model_object->id() != m_model_object_id) || m_its == nullptr); +} + + + +void GLGizmoHollow::update_mesh() +{ + if (! m_model_object) + return; + + wxBusyCursor wait; + // this way we can use that mesh directly. + // This mesh does not account for the possible Z up SLA offset. + m_mesh = &m_model_object->volumes.front()->mesh(); + m_its = &m_mesh->its; + + // If this is different mesh than last time + if (m_model_object_id != m_model_object->id()) { + m_cavity_mesh.reset(); // dump the cavity + m_volume_with_cavity.reset(); + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + m_mesh_raycaster.reset(); + } + + if (! m_mesh_raycaster) + m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); + + m_model_object_id = m_model_object->id(); +} + + + +// Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal +// Return false if no intersection was found, true otherwise. +bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) +{ + // if the gizmo doesn't have the V, F structures for igl, calculate them first: + if (! m_mesh_raycaster) + update_mesh(); + + const Camera& camera = m_parent.get_camera(); + const Selection& selection = m_parent.get_selection(); + const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); + Geometry::Transformation trafo = volume->get_instance_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + + // The raycaster query + Vec3f hit; + Vec3f normal; + if (m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + // Return both the point and the facet normal. + pos_and_normal = std::make_pair(hit, normal); + return true; + } + else + return false; +} + +// Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. +// The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is +// aware that the event was reacted to and stops trying to make different sense of it. If the gizmo +// concludes that the event was not intended for it, it should return false. +bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) +{ + if (m_editing_mode) { + + // left down with shift - show the selection rectangle: + if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { + if (m_hover_id == -1) { + if (shift_down || alt_down) { + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + } + } + else { + if (m_editing_cache[m_hover_id].selected) + unselect_point(m_hover_id); + else { + if (!alt_down) + select_point(m_hover_id); + } + } + + return true; + } + + // left down without selection rectangle - place point on the mesh: + if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle.is_dragging() && !shift_down) { + // If any point is in hover state, this should initiate its move - return control back to GLCanvas: + if (m_hover_id != -1) + return false; + + // If there is some selection, don't add new point and deselect everything instead. + if (m_selection_empty) { + std::pair pos_and_normal; + if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add support point"))); + m_editing_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); + m_parent.set_as_dirty(); + m_wait_for_up_event = true; + } + else + return false; + } + else + select_point(NoPoints); + + return true; + } + + // left up with selection rectangle - select points inside the rectangle: + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { + // Is this a selection or deselection rectangle? + GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); + + // First collect positions of all the points in world coordinates. + Geometry::Transformation trafo = m_model_object->instances[m_active_instance]->get_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + std::vector points; + for (unsigned int i=0; i()); + + // Now ask the rectangle which of the points are inside. + std::vector points_inside; + std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); + for (size_t idx : points_idxs) + points_inside.push_back(points[idx].cast()); + + // Only select/deselect points that are actually visible + for (size_t idx : m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) + { + if (rectangle_status == GLSelectionRectangle::Deselect) + unselect_point(points_idxs[idx]); + else + select_point(points_idxs[idx]); + } + return true; + } + + // left up with no selection rectangle + if (action == SLAGizmoEventType::LeftUp) { + if (m_wait_for_up_event) { + m_wait_for_up_event = false; + return true; + } + } + + // dragging the selection rectangle: + if (action == SLAGizmoEventType::Dragging) { + if (m_wait_for_up_event) + return true; // point has been placed and the button not released yet + // this prevents GLCanvas from starting scene rotation + + if (m_selection_rectangle.is_dragging()) { + m_selection_rectangle.dragging(mouse_position); + return true; + } + + return false; + } + + if (action == SLAGizmoEventType::Delete) { + // delete key pressed + delete_selected_points(); + return true; + } + + if (action == SLAGizmoEventType::RightDown) { + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + delete_selected_points(); + return true; + } + return false; + } + + if (action == SLAGizmoEventType::SelectAll) { + select_point(AllPoints); + return true; + } + } + + if (action == SLAGizmoEventType::MouseWheelUp && control_down) { + m_clipping_plane_distance = std::min(1.f, m_clipping_plane_distance + 0.01f); + update_clipping_plane(true); + return true; + } + + if (action == SLAGizmoEventType::MouseWheelDown && control_down) { + m_clipping_plane_distance = std::max(0.f, m_clipping_plane_distance - 0.01f); + update_clipping_plane(true); + return true; + } + + if (action == SLAGizmoEventType::ResetClippingPlane) { + update_clipping_plane(); + return true; + } + + return false; +} + +void GLGizmoHollow::delete_selected_points(bool force) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: delete_selected_points called out of editing mode!" << std::endl; + std::abort(); + } + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete support point"))); + + for (unsigned int idx=0; idx pos_and_normal; + if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + m_editing_cache[m_hover_id].support_point.pos = pos_and_normal.first; + m_editing_cache[m_hover_id].support_point.is_new_island = false; + m_editing_cache[m_hover_id].normal = pos_and_normal.second; + // Do not update immediately, wait until the mouse is released. + // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + } + } +} + + +void GLGizmoHollow::hollow_mesh(float offset, float adaptibility) +{ + Slic3r::sla::Contour3D imesh{*m_mesh}; + auto ptr = meshToVolume(imesh, {}); + sla::Contour3D omesh = volumeToMesh(*ptr, -offset, adaptibility, true); + + if (omesh.empty()) + return; + + imesh.merge(omesh); + m_cavity_mesh.reset(new TriangleMesh); + *m_cavity_mesh = sla::to_triangle_mesh(imesh); + m_cavity_mesh.get()->require_shared_vertices(); + m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); + m_object_clipper.reset(); + + // create a new GLVolume that only has the cavity inside + m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); + m_volume_with_cavity->finalize_geometry(true); + m_volume_with_cavity->set_volume_transformation(m_model_object->volumes.front()->get_transformation()); + m_volume_with_cavity->set_instance_transformation(m_model_object->instances[m_active_instance]->get_transformation()); + m_parent.toggle_model_objects_visibility(false, m_model_object, m_active_instance); +} + +std::vector GLGizmoHollow::get_config_options(const std::vector& keys) const +{ + std::vector out; + + if (!m_model_object) + return out; + + const DynamicPrintConfig& object_cfg = m_model_object->config; + const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + std::unique_ptr default_cfg = nullptr; + + for (const std::string& key : keys) { + if (object_cfg.has(key)) + out.push_back(object_cfg.option(key)); + else + if (print_cfg.has(key)) + out.push_back(print_cfg.option(key)); + else { // we must get it from defaults + if (default_cfg == nullptr) + default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); + out.push_back(default_cfg->option(key)); + } + } + + return out; +} + + +ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const +{ + if (!m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) + return ClippingPlane::ClipsNothing(); + else + return ClippingPlane(-m_clipping_plane->get_normal(), m_clipping_plane->get_data()[3]); +} + + +void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) +{ + if (!m_model_object) + return; + + bool first_run = true; // This is a hack to redraw the button when all points are removed, + // so it is not delayed until the background process finishes. +RENDER_AGAIN: + //m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + //const ImVec2 window_size(m_imgui->scaled(18.f, 16.f)); + //ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); + //ImGui::SetNextWindowSize(ImVec2(window_size)); + + const float approx_height = m_imgui->scaled(18.0f); + y = std::min(y, bottom_limit - approx_height); + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + + // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: + + const float settings_sliders_left = std::max(m_imgui->calc_text_size(m_desc.at("minimal_distance")).x, m_imgui->calc_text_size(m_desc.at("points_density")).x) + m_imgui->scaled(1.f); + const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + m_imgui->scaled(1.5f); + const float diameter_slider_left = m_imgui->calc_text_size(m_desc.at("head_diameter")).x + m_imgui->scaled(1.f); + const float minimal_slider_width = m_imgui->scaled(4.f); + const float buttons_width_approx = m_imgui->calc_text_size(m_desc.at("apply_changes")).x + m_imgui->calc_text_size(m_desc.at("discard_changes")).x + m_imgui->scaled(1.5f); + const float lock_supports_width_approx = m_imgui->calc_text_size(m_desc.at("lock_supports")).x + m_imgui->scaled(2.f); + + float window_width = minimal_slider_width + std::max(std::max(settings_sliders_left, clipping_slider_left), diameter_slider_left); + window_width = std::max(std::max(window_width, buttons_width_approx), lock_supports_width_approx); + + + bool force_refresh = false; + bool remove_selected = false; + bool remove_all = false; + + if (m_editing_mode) { + + if (m_imgui->button(m_desc.at("hollow"))) { + hollow_mesh(m_offset, m_adaptibility); + } + + float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; + if (m_new_point_head_diameter > diameter_upper_cap) + m_new_point_head_diameter = diameter_upper_cap; + m_imgui->text(m_desc.at("head_diameter")); + ImGui::SameLine(diameter_slider_left); + ImGui::PushItemWidth(window_width - diameter_slider_left); + + // Following is a nasty way to: + // - save the initial value of the slider before one starts messing with it + // - keep updating the head radius during sliding so it is continuosly refreshed in 3D scene + // - take correct undo/redo snapshot after the user is done with moving the slider + float initial_value = m_new_point_head_diameter; + ImGui::SliderFloat("", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f"); + if (ImGui::IsItemClicked()) { + if (m_old_point_head_diameter == 0.f) + m_old_point_head_diameter = initial_value; + } + if (ImGui::IsItemEdited()) { + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; + } + if (ImGui::IsItemDeactivatedAfterEdit()) { + // momentarily restore the old value to take snapshot + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_old_point_head_diameter / 2.f; + float backup = m_new_point_head_diameter; + m_new_point_head_diameter = m_old_point_head_diameter; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change point head diameter"))); + m_new_point_head_diameter = backup; + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; + m_old_point_head_diameter = 0.f; + } + + // !!!! Something as above should be done for the cone angle + m_imgui->text("Hole taper: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_new_cone_angle, -1.f, 1.f, "%.1f"); + m_imgui->text("Hole height: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_new_cone_height, 0.1f, 10.f, "%.1f"); + + m_imgui->disabled_begin(m_selection_empty); + remove_selected = m_imgui->button(m_desc.at("remove_selected")); + m_imgui->disabled_end(); + + m_imgui->disabled_begin(m_editing_cache.empty()); + remove_all = m_imgui->button(m_desc.at("remove_all")); + m_imgui->disabled_end(); + + m_imgui->text(" "); // vertical gap + + + m_imgui->text("Offset: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_offset, 0.f, 10.f, "%.1f"); + m_imgui->text("Adaptibility: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_adaptibility, 0.f, 1.f, "%.1f"); + } + else { // not in editing mode: + m_imgui->text(m_desc.at("minimal_distance")); + ImGui::SameLine(settings_sliders_left); + ImGui::PushItemWidth(window_width - settings_sliders_left); + + std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); + float density = static_cast(opts[0])->value; + float minimal_point_distance = static_cast(opts[1])->value; + + ImGui::SliderFloat("", &minimal_point_distance, 0.f, 20.f, "%.f mm"); + bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider + bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider + bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider + + m_imgui->text(m_desc.at("points_density")); + ImGui::SameLine(settings_sliders_left); + + ImGui::SliderFloat(" ", &density, 0.f, 200.f, "%.f %%"); + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); + + if (slider_clicked) { // stash the values of the settings so we know what to revert to after undo + m_minimal_point_distance_stash = minimal_point_distance; + m_density_stash = density; + } + if (slider_edited) { + m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + } + if (slider_released) { + m_model_object->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; + m_model_object->config.opt("support_points_density_relative", true)->value = (int)m_density_stash; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Support parameter change"))); + m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + wxGetApp().obj_list()->update_and_show_object_settings_item(); + } + + + m_imgui->disabled_begin(m_normal_cache.empty()); + remove_all = m_imgui->button(m_desc.at("remove_all")); + m_imgui->disabled_end(); + + } + + + // Following is rendered in both editing and non-editing mode: + m_imgui->text(""); + if (m_clipping_plane_distance == 0.f) + m_imgui->text(m_desc.at("clipping_of_view")); + else { + if (m_imgui->button(m_desc.at("reset_direction"))) { + wxGetApp().CallAfter([this](){ + update_clipping_plane(); + }); + } + } + + ImGui::SameLine(clipping_slider_left); + ImGui::PushItemWidth(window_width - clipping_slider_left); + if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) + update_clipping_plane(true); + + + if (m_imgui->button("?")) { + wxGetApp().CallAfter([]() { + SlaGizmoHelpDialog help_dlg; + help_dlg.ShowModal(); + }); + } + + m_imgui->end(); + + if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode + m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode, m_model_object, m_active_instance); + force_refresh = true; + } + m_old_editing_state = m_editing_mode; + + if (remove_selected || remove_all) { + force_refresh = false; + m_parent.set_as_dirty(); + bool was_in_editing = m_editing_mode; + if (remove_all) { + select_point(AllPoints); + delete_selected_points(true); // true - delete regardless of locked status + } + if (remove_selected) + delete_selected_points(false); // leave locked points + + if (first_run) { + first_run = false; + goto RENDER_AGAIN; + } + } + + if (force_refresh) + m_parent.set_as_dirty(); +} + +bool GLGizmoHollow::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA + || !selection.is_from_single_instance()) + return false; + + // Check that none of the selected volumes is outside. Only SLA auxiliaries (supports) are allowed outside. + const Selection::IndicesList& list = selection.get_volume_idxs(); + for (const auto& idx : list) + if (selection.get_volume(idx)->is_outside && selection.get_volume(idx)->composite_id.volume_id >= 0) + return false; + + return true; +} + +bool GLGizmoHollow::on_is_selectable() const +{ + return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA); +} + +std::string GLGizmoHollow::on_get_name() const +{ + return (_(L("Hollowing")) + " [H]").ToUTF8().data(); +} + + +const TriangleMesh* GLGizmoHollow::mesh() const { + return (! m_mesh ? nullptr : (m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); +} + + +void GLGizmoHollow::on_set_state() +{ + // m_model_object pointer can be invalid (for instance because of undo/redo action), + // we should recover it from the object id + m_model_object = nullptr; + for (const auto mo : wxGetApp().model().objects) { + if (mo->id() == m_model_object_id) { + m_model_object = mo; + break; + } + } + + if (m_state == m_old_state) + return; + + if (m_state == On && m_old_state != On) { // the gizmo was just turned on + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); + if (is_mesh_update_necessary()) + update_mesh(); + + // we'll now reload support points: + if (m_model_object) + reload_cache(); + + m_parent.toggle_model_objects_visibility(false); + if (m_model_object) + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + + // Set default head diameter from config. + const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; + } + if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off + bool will_ask = m_model_object && false; + if (will_ask) { + wxGetApp().CallAfter([this]() { + }); + // refuse to be turned off so the gizmo is active when the CallAfter is executed + m_state = m_old_state; + } + else { + // we are actually shutting down + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); + m_parent.toggle_model_objects_visibility(true); + m_normal_cache.clear(); + m_clipping_plane_distance = 0.f; + // Release clippers and the AABB raycaster. + m_its = nullptr; + m_object_clipper.reset(); + m_supports_clipper.reset(); + m_mesh_raycaster.reset(); + m_cavity_mesh.reset(); + m_volume_with_cavity.reset(); + } + } + m_old_state = m_state; +} + + + +void GLGizmoHollow::on_start_dragging() +{ + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + m_point_before_drag = m_editing_cache[m_hover_id]; + } + else + m_point_before_drag = CacheEntry(); +} + + +void GLGizmoHollow::on_stop_dragging() +{ + if (m_hover_id != -1) { + CacheEntry backup = m_editing_cache[m_hover_id]; + + if (m_point_before_drag.support_point.pos != Vec3f::Zero() // some point was touched + && backup.support_point.pos != m_point_before_drag.support_point.pos) // and it was moved, not just selected + { + m_editing_cache[m_hover_id] = m_point_before_drag; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move support point"))); + m_editing_cache[m_hover_id] = backup; + } + } + m_point_before_drag = CacheEntry(); +} + + + +void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) +{ + ar(m_clipping_plane_distance, + *m_clipping_plane, + m_model_object_id, + m_new_point_head_diameter, + m_normal_cache, + m_editing_cache, + m_selection_empty + ); +} + + + +void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const +{ + ar(m_clipping_plane_distance, + *m_clipping_plane, + m_model_object_id, + m_new_point_head_diameter, + m_normal_cache, + m_editing_cache, + m_selection_empty + ); +} + + + +void GLGizmoHollow::select_point(int i) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: select_point called when out of editing mode!" << std::endl; + std::abort(); + } + + if (i == AllPoints || i == NoPoints) { + for (auto& point_and_selection : m_editing_cache) + point_and_selection.selected = ( i == AllPoints ); + m_selection_empty = (i == NoPoints); + + if (i == AllPoints) + m_new_point_head_diameter = m_editing_cache[0].support_point.head_front_radius * 2.f; + } + else { + m_editing_cache[i].selected = true; + m_selection_empty = false; + m_new_point_head_diameter = m_editing_cache[i].support_point.head_front_radius * 2.f; + } +} + + +void GLGizmoHollow::unselect_point(int i) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: unselect_point called when out of editing mode!" << std::endl; + std::abort(); + } + + m_editing_cache[i].selected = false; + m_selection_empty = true; + for (const CacheEntry& ce : m_editing_cache) { + if (ce.selected) { + m_selection_empty = false; + break; + } + } +} + + +bool GLGizmoHollow::unsaved_changes() const +{ + if (m_editing_cache.size() != m_normal_cache.size()) + return true; + + for (size_t i=0; iget_normal() != Vec3d::Zero() ? + m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); + + const Vec3d& center = m_model_object->instances[m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); + float dist = normal.dot(center); + *m_clipping_plane = ClippingPlane(normal, (dist - (-m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_active_instance_bb_radius)); + m_parent.set_as_dirty(); +} + + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp new file mode 100644 index 000000000..82455a9f4 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -0,0 +1,169 @@ +#ifndef slic3r_GLGizmoHollow_hpp_ +#define slic3r_GLGizmoHollow_hpp_ + +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLSelectionRectangle.hpp" + +#include "libslic3r/SLA/SLACommon.hpp" +#include + +#include + + +namespace Slic3r { +namespace GUI { + +class ClippingPlane; +class MeshClipper; +class MeshRaycaster; +enum class SLAGizmoEventType : unsigned char; + +class GLGizmoHollow : public GLGizmoBase +{ +private: + ModelObject* m_model_object = nullptr; + ObjectID m_model_object_id = 0; + int m_active_instance = -1; + float m_active_instance_bb_radius; // to cache the bb + mutable double m_z_shift = 0.f; + bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); + + const float RenderPointScale = 1.f; + + GLUquadricObj* m_quadric; + + std::unique_ptr m_mesh_raycaster; + std::unique_ptr m_cavity_mesh; + std::unique_ptr m_volume_with_cavity; + const TriangleMesh* m_mesh; + const indexed_triangle_set* m_its; + mutable const TriangleMesh* m_supports_mesh; + mutable std::vector m_triangles; + mutable std::vector m_supports_triangles; + mutable int m_old_timestamp = -1; + mutable int m_print_object_idx = -1; + mutable int m_print_objects_count = -1; + + class CacheEntry { + public: + CacheEntry() : + support_point(sla::SupportPoint()), selected(false), normal(Vec3f::Zero()) {} + + CacheEntry(const sla::SupportPoint& point, bool sel = false, const Vec3f& norm = Vec3f::Zero()) : + support_point(point), selected(sel), normal(norm) {} + + bool operator==(const CacheEntry& rhs) const { + return (support_point == rhs.support_point); + } + + bool operator!=(const CacheEntry& rhs) const { + return ! ((*this) == rhs); + } + + sla::SupportPoint support_point; + bool selected; // whether the point is selected + Vec3f normal; + + template + void serialize(Archive & ar) + { + ar(support_point, selected, normal); + } + }; + +public: + GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + ~GLGizmoHollow() override; + void set_sla_support_data(ModelObject* model_object, const Selection& selection); + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + void delete_selected_points(bool force = false); + ClippingPlane get_sla_clipping_plane() const; + + bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } + +private: + bool on_init() override; + void on_update(const UpdateData& data) override; + void on_render() const override; + void on_render_for_picking() const override; + + //void render_selection_rectangle() const; + void render_points(const Selection& selection, bool picking = false) const; + void render_clipping_plane(const Selection& selection) const; + bool is_mesh_update_necessary() const; + void update_mesh(); + void hollow_mesh(float offset = 2.f, float adaptability = 1.f); + bool unsaved_changes() const; + const TriangleMesh* mesh() const; + + bool m_editing_mode = true; // Is editing mode active? + bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). + float m_new_point_head_diameter; // Size of a new point. + float m_new_cone_angle = 0.f; + float m_new_cone_height = 5.f; + CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited + float m_old_point_head_diameter = 0.; // the same + float m_minimal_point_distance_stash = 0.f; // and again + float m_density_stash = 0.f; // and again + mutable std::vector m_editing_cache; // a support point and whether it is currently selected + std::vector m_normal_cache; // to restore after discarding changes or undo/redo + + float m_offset = 2.f; + float m_adaptibility = 1.f; + + float m_clipping_plane_distance = 0.f; + std::unique_ptr m_clipping_plane; + + // This map holds all translated description texts, so they can be easily referenced during layout calculations + // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. + std::map m_desc; + + GLSelectionRectangle m_selection_rectangle; + + bool m_wait_for_up_event = false; + bool m_selection_empty = true; + EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) + + mutable std::unique_ptr m_object_clipper; + mutable std::unique_ptr m_supports_clipper; + + std::vector get_config_options(const std::vector& keys) const; + bool is_mesh_point_clipped(const Vec3d& point) const; + //void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const; + + // Methods that do the model_object and editing cache synchronization, + // editing mode selection, etc: + enum { + AllPoints = -2, + NoPoints, + }; + void select_point(int i); + void unselect_point(int i); + void reload_cache(); + void update_clipping_plane(bool keep_normal = false) const; + +protected: + void on_set_state() override; + void on_set_hover_id() override + + { + if (! m_editing_mode || (int)m_editing_cache.size() <= m_hover_id) + m_hover_id = -1; + } + void on_start_dragging() override; + void on_stop_dragging() override; + void on_render_input_window(float x, float y, float bottom_limit) override; + + std::string on_get_name() const override; + bool on_is_activable() const override; + bool on_is_selectable() const override; + void on_load(cereal::BinaryInputArchive& ar) override; + void on_save(cereal::BinaryOutputArchive& ar) const override; +}; + + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoHollow_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmos.hpp b/src/slic3r/GUI/Gizmos/GLGizmos.hpp index 272fa098a..9f97c42b4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmos.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmos.hpp @@ -32,5 +32,6 @@ enum class SLAGizmoEventType : unsigned char { #include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp" #include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp" #include "slic3r/GUI/Gizmos/GLGizmoCut.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoHollow.hpp" #endif //slic3r_GLGizmos_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 25dab0336..be200b56d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -94,6 +94,7 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoFlatten(m_parent, "place.svg", 3)); m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 5)); + m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 6)); for (auto& gizmo : m_gizmos) { if (! gizmo->init()) { @@ -350,6 +351,7 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) return; dynamic_cast(m_gizmos[SlaSupports].get())->set_sla_support_data(model_object, m_parent.get_selection()); + dynamic_cast(m_gizmos[Hollow].get())->set_sla_support_data(model_object, m_parent.get_selection()); } // Returns true if the gizmo used the event to do something, false otherwise. @@ -358,15 +360,22 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p if (!m_enabled || m_gizmos.empty()) return false; - return dynamic_cast(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + if (m_current == SlaSupports) + return dynamic_cast(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + if (m_current == Hollow) + return dynamic_cast(m_gizmos[Hollow].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + return false; } ClippingPlane GLGizmosManager::get_sla_clipping_plane() const { - if (!m_enabled || m_current != SlaSupports || m_gizmos.empty()) + if (!m_enabled || (m_current != SlaSupports && m_current != Hollow) || m_gizmos.empty()) return ClippingPlane::ClipsNothing(); - return dynamic_cast(m_gizmos[SlaSupports].get())->get_sla_clipping_plane(); + if (m_current == SlaSupports) + return dynamic_cast(m_gizmos[SlaSupports].get())->get_sla_clipping_plane(); + else + return dynamic_cast(m_gizmos[Hollow].get())->get_sla_clipping_plane(); } bool GLGizmosManager::wants_reslice_supports_on_undo() const @@ -406,7 +415,7 @@ bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt) { bool processed = false; - if (m_current == SlaSupports) { + if (m_current == SlaSupports || m_current == Hollow) { float rot = (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta(); if (gizmo_event((rot > 0.f ? SLAGizmoEventType::MouseWheelUp : SLAGizmoEventType::MouseWheelDown), Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) processed = true; @@ -464,7 +473,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) if (evt.LeftDown()) { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) // the gizmo got the event and took some action, there is no need to do anything more processed = true; else if (!selection.is_empty() && grabber_contains_mouse()) { @@ -489,10 +498,10 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) // event was taken care of by the SlaSupports gizmo processed = true; } - else if (evt.Dragging() && (m_parent.get_move_volume_id() != -1) && (m_current == SlaSupports)) + else if (evt.Dragging() && (m_parent.get_move_volume_id() != -1) && (m_current == SlaSupports || m_current == Hollow)) // don't allow dragging objects with the Sla gizmo on processed = true; - else if (evt.Dragging() && (m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) + else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) { // the gizmo got the event and took some action, no need to do anything more here m_parent.set_as_dirty(); @@ -568,7 +577,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; } - else if (evt.LeftUp() && (m_current == SlaSupports) && !m_parent.is_mouse_dragging()) + else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow) && !m_parent.is_mouse_dragging()) { // in case SLA gizmo is selected, we just pass the LeftUp event and stop processing - neither // object moving or selecting is suppressed in that case @@ -667,7 +676,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case 'r' : case 'R' : { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) processed = true; break; @@ -679,7 +688,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case WXK_DELETE: #endif /* __APPLE__ */ { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::Delete)) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Delete)) processed = true; break; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 0defb1348..0368e433e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -60,6 +60,7 @@ public: Flatten, Cut, SlaSupports, + Hollow, Undefined }; diff --git a/tests/data/extruder_idler_quads.obj b/tests/data/extruder_idler_quads.obj new file mode 100644 index 000000000..266cb242d --- /dev/null +++ b/tests/data/extruder_idler_quads.obj @@ -0,0 +1,7348 @@ +#### +# +# OBJ File Generated by Meshlab +# +#### +# Object extruder_idler_quads.obj +# +# Vertices: 3660 +# Faces: 3672 +# +#### +v 61.288807 37.917557 6.068595 +v 61.312790 37.917618 6.193261 +v 61.356049 37.917774 6.504920 +v 46.677547 37.917866 9.519013 +v 55.420834 37.917618 7.326775 +v 55.396851 37.917557 7.202109 +v 70.876183 37.682098 2.970614 +v 46.216084 37.450668 7.120349 +v 61.171124 37.838562 5.456883 +v 70.404060 35.864510 0.516525 +v 70.345604 35.376511 0.212692 +v 54.692173 35.864510 3.539228 +v 54.633720 35.376511 3.235396 +v 61.171051 37.731289 7.795076 +v 55.864639 37.839470 8.386023 +v 55.279167 37.838562 6.590397 +v 46.326366 37.682098 7.693588 +v 70.566055 36.778572 1.358596 +v 70.661987 37.147907 1.857247 +v 54.854176 36.778572 4.381299 +v 46.112171 37.147907 6.580221 +v 55.054016 37.450668 5.420078 +v 60.659683 36.348526 2.798444 +v 54.767727 36.348526 3.931957 +v 45.929794 36.348526 5.632228 +v 50.387226 39.697979 28.801762 +v 50.382210 39.699635 28.775690 +v 48.877922 40.196674 20.956472 +v 48.879765 39.946739 20.966045 +v 48.897690 38.450691 21.059217 +v 48.672623 38.559273 19.889320 +v 48.627918 34.768574 19.656961 +v 48.967503 37.518620 21.422112 +v 49.148136 36.364048 22.361021 +v 49.308113 35.827209 23.192574 +v 49.224934 36.068989 22.760210 +v 50.379288 38.947979 28.760509 +v 50.332268 37.976688 28.516096 +v 50.291908 37.522064 28.306307 +v 50.557526 37.884193 29.686979 +v 49.863396 35.643738 26.078924 +v 49.771500 35.518578 25.601242 +v 50.513439 34.145573 29.457813 +v 46.316734 33.337154 7.643516 +v 45.795788 35.376511 4.935667 +v 46.366432 33.896751 7.901852 +v 45.854240 35.864510 5.239500 +v 46.306992 32.926773 7.592876 +v 46.316822 32.516430 7.643979 +v 46.420128 31.655691 8.180969 +v 46.451801 31.534010 8.345595 +v 46.486115 31.434301 8.523966 +v 46.599277 31.280785 9.112178 +v 46.099930 28.231632 6.516577 +v 46.638424 31.280876 9.315653 +v 47.221455 27.861065 12.346222 +v 46.715168 31.358620 9.714571 +v 46.785843 31.534855 10.081941 +v 47.732357 31.056692 15.001865 +v 46.930408 32.928387 10.833368 +v 46.927967 32.721592 10.820692 +v 47.124451 37.150532 11.842004 +v 47.220444 36.781719 12.340965 +v 46.817513 31.656748 10.246544 +v 46.870964 31.958406 10.524391 +v 46.891937 32.133430 10.633411 +v 47.306953 36.352104 12.790643 +v 46.391373 34.056538 8.031486 +v 46.016239 36.778572 6.081570 +v 46.441235 37.838562 8.290668 +v 46.598972 34.574272 9.110590 +v 46.560146 34.548199 8.908764 +v 46.558918 37.917557 8.902380 +v 46.714870 34.497074 9.713024 +v 47.020462 37.452759 11.301476 +v 46.910164 37.683620 10.728139 +v 46.870785 33.898132 10.523453 +v 46.891777 33.723171 10.632566 +v 46.751282 34.420887 9.902280 +v 51.630699 27.764736 35.265278 +v 52.147446 28.245863 37.951313 +v 46.795250 37.839470 10.130821 +v 71.227364 37.917866 4.796038 +v 76.205231 29.860657 30.670778 +v 70.878639 33.534252 2.983394 +v 70.916252 33.896751 3.178878 +v 70.969704 34.198410 3.456725 +v 71.001366 34.320305 3.621328 +v 70.991051 37.838562 3.567693 +v 71.108734 37.917557 4.179405 +v 71.109962 34.548199 4.185790 +v 71.226776 34.548508 4.792975 +v 71.345062 37.839470 5.407847 +v 71.459976 37.683620 6.005164 +v 71.301102 34.420887 5.179305 +v 71.441589 33.723171 5.909592 +v 70.479614 36.348526 0.909254 +v 70.866547 33.337154 2.920542 +v 70.765900 37.450668 2.397374 +v 70.916428 31.957125 3.179823 +v 70.304688 31.906664 0.000000 +v 71.001617 31.534010 3.622621 +v 71.035934 31.434301 3.800991 +v 71.149094 31.280785 4.389203 +v 71.110252 31.306643 4.187318 +v 71.227066 31.306923 4.794502 +v 71.301376 31.434967 5.180758 +v 71.264984 31.358620 4.991596 +v 71.458290 33.535702 5.996392 +v 71.477760 33.135204 6.097586 +v 71.480225 32.928387 6.110393 +v 72.579239 34.928131 11.823022 +v 73.058540 33.686779 14.314425 +v 71.367325 31.656748 5.523570 +v 73.568642 32.857552 16.965889 +v 73.831314 32.604336 18.331276 +v 75.124626 28.113617 25.053829 +v 74.363899 32.428364 21.099625 +v 74.895103 32.695507 23.860798 +v 75.156105 32.993713 25.217482 +v 75.149338 30.209538 25.182302 +v 76.679512 26.740294 33.136051 +v 76.697266 28.245863 33.228336 +v 76.180519 27.764736 30.542305 +v 71.996040 35.338497 8.791578 +v 72.012505 35.153580 8.877157 +v 56.978554 37.452759 9.385705 +v 57.088562 37.406780 9.449879 +v 71.674271 37.150532 7.119029 +v 60.551853 37.406780 8.783600 +v 59.598507 37.150532 9.442204 +v 47.382626 35.868492 13.183980 +v 71.856773 36.352104 8.067668 +v 71.770264 36.781719 7.617991 +v 59.439774 37.126163 9.506907 +v 58.300529 37.132675 9.716898 +v 58.834583 37.093670 9.668919 +v 71.570282 37.452759 6.578501 +v 71.932442 35.868492 8.461005 +v 47.446220 35.338497 13.514553 +v 44.992771 27.189064 13.242427 +v 51.780609 26.868217 17.170813 +v 61.232605 27.449877 5.863266 +v 58.929241 27.283329 9.023430 +v 58.809258 27.282513 9.059827 +v 58.359135 27.139223 11.484049 +v 58.309364 27.285778 9.102742 +v 55.616589 27.411655 7.567233 +v 47.938751 27.189064 12.675670 +v 54.076530 26.062111 29.879890 +v 54.026432 26.058466 29.948986 +v 53.712753 26.029385 30.483768 +v 53.552719 25.999935 30.994987 +v 53.514042 25.981487 31.303373 +v 53.514153 25.976261 31.388626 +v 50.928787 26.201115 28.217762 +v 53.514442 25.962425 31.614302 +v 68.806427 26.062111 27.046103 +v 68.623718 26.048828 27.297941 +v 68.756279 26.058466 27.115208 +v 68.515053 26.037975 27.495895 +v 62.093616 26.073893 28.145342 +v 68.338547 26.012682 27.942495 +v 68.254539 25.986547 28.385019 +v 68.244034 25.976261 28.554842 +v 68.218460 26.326206 22.850769 +v 73.165169 25.937754 28.236309 +v 73.194099 25.909863 28.685766 +v 73.183594 25.899576 28.855589 +v 72.995468 25.856739 29.590630 +v 72.923080 25.848146 29.744713 +v 72.631706 25.824013 30.194506 +v 71.988434 25.798077 30.741371 +v 71.553574 25.790627 30.946589 +v 71.338646 25.788862 31.016699 +v 70.807259 25.790627 31.090166 +v 70.411186 25.796120 31.076721 +v 70.327293 25.798077 31.060946 +v 70.105293 25.803261 31.019094 +v 58.193188 25.848146 32.578499 +v 68.283722 25.943062 29.088823 +v 68.361572 25.923698 29.389732 +v 68.626915 25.886189 29.950634 +v 68.759964 25.873442 30.132986 +v 58.265583 25.856739 32.424416 +v 68.965179 25.856739 30.365990 +v 69.023651 25.852247 30.428022 +v 69.089577 25.848146 30.482216 +v 69.263924 25.837296 30.625723 +v 69.527039 25.824013 30.791792 +v 69.604355 25.820885 30.827938 +v 68.476524 25.904634 29.678623 +v 58.435280 25.937754 31.070093 +v 58.463875 25.923698 31.293884 +v 58.464321 25.904634 31.604805 +v 58.369694 25.873442 32.131901 +v 68.810265 25.868631 30.201771 +v 69.454826 25.827658 30.746227 +v 57.951962 25.827658 32.959187 +v 69.808907 25.812611 30.923559 +v 57.688858 25.812611 33.255257 +v 70.023972 25.805826 30.992867 +v 57.514957 25.805826 33.399391 +v 57.109299 25.794794 33.657429 +v 56.904839 25.791292 33.753883 +v 56.823685 25.790627 33.780373 +v 56.608757 25.788862 33.850483 +v 56.302967 25.788862 33.909313 +v 56.077370 25.790627 33.923950 +v 55.375401 25.803261 33.852879 +v 54.874439 25.820885 33.661728 +v 54.080334 25.868631 33.035564 +v 52.746826 25.600410 37.667839 +v 54.359653 25.848146 33.316006 +v 54.533997 25.837296 33.459515 +v 54.797138 25.824013 33.625580 +v 55.079014 25.812611 33.757343 +v 55.766525 25.794794 33.915756 +v 55.681297 25.796120 33.910507 +v 73.076561 25.962425 27.850878 +v 72.993141 25.976261 27.641191 +v 72.811218 25.999935 27.289974 +v 71.911095 26.062111 26.448816 +v 71.833778 26.065239 26.412672 +v 71.629128 26.073511 26.317068 +v 70.716064 26.094831 26.144928 +v 70.630875 26.095497 26.150444 +v 69.598946 26.091330 26.416964 +v 69.521751 26.090002 26.453463 +v 66.578064 26.868217 14.324030 +v 66.011253 26.886908 14.128163 +v 60.892159 27.567686 4.006828 +v 61.173477 27.469414 5.555912 +v 61.073132 26.073893 28.341667 +v 58.403152 25.948370 30.903088 +v 58.263256 25.976261 30.474977 +v 58.081326 25.999935 30.123760 +v 57.948280 26.012682 29.941408 +v 57.618668 26.037975 29.592178 +v 57.684593 26.033876 29.646372 +v 57.444317 26.048828 29.448671 +v 57.181206 26.062111 29.282602 +v 57.103886 26.065239 29.246456 +v 56.684273 26.080296 29.081528 +v 56.899239 26.073511 29.150852 +v 55.986176 26.094831 28.978714 +v 55.675388 26.097260 28.998867 +v 54.869053 26.091330 29.250750 +v 54.791859 26.090002 29.287249 +v 54.719810 26.088047 29.333023 +v 54.463398 26.080296 29.508787 +v 53.421013 26.326206 25.697552 +v 54.529179 26.082863 29.454258 +v 67.902382 34.970417 12.655975 +v 47.462685 35.153580 13.600132 +v 54.822617 34.805954 17.855391 +v 58.905815 34.974163 14.325680 +v 54.142002 34.777916 18.443687 +v 56.180191 34.357391 24.912003 +v 64.640221 42.441532 22.165798 +v 64.498436 42.393948 21.428791 +v 64.108391 38.000809 19.401363 +v 65.105515 36.364048 19.291088 +v 64.965973 41.759834 23.859028 +v 65.182312 36.068989 19.690277 +v 64.884438 37.973030 18.141928 +v 64.924889 37.518620 18.352179 +v 64.831230 39.445396 17.865381 +v 64.038155 39.445889 19.036266 +v 65.353737 35.642532 20.581331 +v 65.445679 35.517838 21.059244 +v 65.633987 43.439590 22.038057 +v 64.077850 40.550362 19.242599 +v 64.837143 39.946739 17.896112 +v 65.265495 35.827209 20.122641 +v 64.330994 39.446640 20.558413 +v 64.055885 40.191998 19.128443 +v 64.350174 39.980480 20.658138 +v 64.243858 37.134884 20.105499 +v 64.108124 40.891331 19.399967 +v 64.364799 40.145279 20.734161 +v 64.042656 39.069904 19.059660 +v 64.078056 38.341614 19.243677 +v 64.339630 39.086071 20.603313 +v 64.350266 38.912914 20.658621 +v 64.405319 38.454250 20.944765 +v 64.488396 38.135056 21.376616 +v 64.430038 36.593735 21.073254 +v 64.301460 36.913589 20.404915 +v 64.520393 38.068111 21.542925 +v 64.587852 38.000175 21.893555 +v 64.569603 36.453186 21.798729 +v 64.640778 36.453377 22.168688 +v 64.711395 36.500771 22.535736 +v 64.721664 38.135670 22.589117 +v 64.846489 36.733505 23.237947 +v 64.804688 38.455292 23.020670 +v 64.826614 38.595646 23.134649 +v 65.063599 37.685196 24.366478 +v 64.845032 38.749439 23.230366 +v 64.243446 41.757961 20.103352 +v 64.405144 40.439426 20.943855 +v 64.300987 41.979553 20.402464 +v 64.458015 40.671249 21.218702 +v 64.488167 40.759056 21.375410 +v 64.429504 42.300076 21.070503 +v 64.553452 40.871548 21.714767 +v 64.569054 42.441341 21.795839 +v 64.656105 40.871815 22.248354 +v 64.689438 40.826614 22.421604 +v 64.845985 42.162468 23.235317 +v 64.908371 41.981129 23.559612 +v 64.804512 40.440468 23.019760 +v 64.844902 40.146526 23.229715 +v 64.859566 39.981804 23.305906 +v 64.876671 39.629799 23.394819 +v 64.751572 40.672024 22.744589 +v 64.779427 40.565052 22.889357 +v 65.101707 38.003387 24.564560 +v 65.153946 38.702721 24.836084 +v 65.131981 38.344357 24.721928 +v 65.167244 39.072823 24.905212 +v 65.153801 40.194855 24.835358 +v 64.363846 36.732250 20.729210 +v 64.966385 37.136757 23.861176 +v 66.068886 36.366562 24.298624 +v 65.820778 35.643738 23.008991 +v 66.289383 40.921688 25.444761 +v 66.318748 40.444027 25.597404 +v 64.975334 41.796913 18.614428 +v 64.146233 41.209522 19.598049 +v 64.363342 42.161217 20.726580 +v 65.728134 43.376877 22.527445 +v 64.779793 42.300983 22.891273 +v 64.056030 38.699863 19.129168 +v 64.975761 37.094627 18.616638 +v 64.146568 37.682812 19.599808 +v 64.191963 37.392635 19.835770 +v 64.042587 39.821896 19.059315 +v 64.498993 36.500225 21.431665 +v 64.780319 36.594643 22.894024 +v 66.137520 42.186985 24.655401 +v 65.101440 40.893909 24.563162 +v 64.191582 41.499920 19.833786 +v 65.035782 42.184120 18.928610 +v 64.924530 41.372654 18.350315 +v 65.353035 43.250977 20.577698 +v 65.991501 42.825726 23.896412 +v 66.068298 42.530670 24.295601 +v 64.710838 42.394493 22.532862 +v 65.171677 39.448830 24.928261 +v 66.336670 38.947979 25.690577 +v 65.017868 41.502083 24.128757 +v 65.063263 41.211906 24.364719 +v 66.318924 38.454502 25.598343 +v 65.018250 37.394798 24.130741 +v 64.908844 36.915165 23.562061 +v 65.992126 36.071102 23.899647 +v 65.634720 35.455376 22.041878 +v 65.131775 40.553104 24.720850 +v 65.167175 39.824814 24.904867 +v 66.336571 39.950649 25.690052 +v 65.539093 43.439342 21.544811 +v 68.963753 42.184120 18.172934 +v 65.264824 43.065830 20.119164 +v 65.181694 42.823616 19.687042 +v 68.852501 41.372654 17.594639 +v 68.782860 40.440216 17.232672 +v 64.884171 40.918030 18.140526 +v 70.264542 39.950649 24.934376 +v 70.267563 39.699635 24.950079 +v 65.444939 43.376144 21.055380 +v 65.104935 42.528164 19.288065 +v 69.032906 42.528164 18.532389 +v 64.854889 40.440216 17.988346 +v 68.903305 41.796913 17.858751 +v 69.748047 43.252190 22.249683 +v 65.820076 43.252190 23.005358 +v 65.908325 43.067505 23.464048 +v 70.217354 40.921688 24.689085 +v 70.246719 40.444027 24.841728 +v 66.198051 41.800091 24.970051 +v 70.065491 42.186985 23.899725 +v 66.248932 41.376099 25.234510 +v 70.176903 41.376099 24.478834 +v 65.539833 35.455128 21.548632 +v 65.733398 35.391171 22.554787 +v 65.737389 35.300861 22.575521 +v 65.728882 35.518578 22.531309 +v 65.908989 35.828888 23.467525 +v 66.514908 37.884193 26.617046 +v 66.289650 37.976688 25.446163 +v 66.249290 37.522064 25.236374 +v 66.138039 36.710598 24.658079 +v 66.198479 37.097805 24.972261 +v 66.339592 39.699635 25.705755 +v 66.342583 39.449322 25.721308 +v 64.837250 38.944069 17.896637 +v 64.855072 38.450691 17.989285 +v 65.036293 36.707745 18.931288 +v 64.597069 35.766628 16.648207 +v 64.835304 40.196674 17.886539 +v 70.272575 39.697979 24.976152 +v 68.773964 40.193138 17.186436 +v 64.845993 40.193138 17.942112 +v 69.192795 43.065830 19.363487 +v 69.274765 40.145279 19.789566 +v 69.315109 40.439426 19.999262 +v 69.367981 40.671249 20.274107 +v 69.398132 40.759056 20.430815 +v 69.467064 43.439342 20.789135 +v 69.372910 43.376144 20.299704 +v 69.430099 40.826176 20.596979 +v 69.497551 40.894455 20.947596 +v 69.566071 40.871815 21.303759 +v 69.531944 40.894543 21.126377 +v 69.561958 43.439590 21.282381 +v 69.656105 43.376877 21.771769 +v 69.599403 40.826614 21.477009 +v 69.836296 43.067505 22.708372 +v 69.919472 42.825726 23.140736 +v 69.689392 40.565052 21.944761 +v 69.996269 42.530670 23.539925 +v 69.714478 40.440468 22.075167 +v 69.754868 40.146526 22.285120 +v 70.126022 41.800091 24.214375 +v 69.736404 40.300220 22.189165 +v 68.763275 40.196674 17.130863 +v 68.812134 40.918030 17.384850 +v 69.249519 39.807266 19.658356 +v 69.243126 39.264919 19.625113 +v 69.109665 42.823616 18.931366 +v 69.281006 43.250977 19.822021 +v 69.240952 39.446640 19.613817 +v 69.315285 38.454250 20.000172 +v 69.340370 38.329666 20.130575 +v 68.904175 32.857552 17.863255 +v 68.646049 33.219078 16.521528 +v 68.513268 34.768574 15.831351 +v 69.368217 38.222706 20.275343 +v 69.166855 32.604336 19.228642 +v 69.699440 32.428364 21.996990 +v 69.566338 38.023182 21.305166 +v 70.442879 37.884193 25.861370 +v 69.736580 38.595646 22.190054 +v 69.769524 39.981804 22.361311 +v 69.769615 38.914249 22.361794 +v 69.780167 39.808659 22.416618 +v 69.786629 39.629799 22.450226 +v 70.230637 32.695507 24.758162 +v 67.914772 34.928131 12.720387 +v 68.394073 33.686779 15.211790 +v 66.470818 34.145573 26.387878 +v 64.642441 35.766621 16.639477 +v 64.630005 38.559273 16.819387 +v 44.275478 27.861065 12.912979 +v 46.509041 38.329666 24.522942 +v 46.462021 38.594498 24.278538 +v 46.418194 39.807266 24.050722 +v 45.931946 40.196674 21.523230 +v 46.428902 38.912914 24.106392 +v 45.951530 40.440216 21.625038 +v 45.942635 40.193138 21.578802 +v 46.443562 38.748192 24.182585 +v 46.483952 38.454250 24.392538 +v 46.567032 38.135056 24.824387 +v 47.555691 33.147514 29.963390 +v 46.800297 38.135670 26.036888 +v 46.948906 39.087452 26.809347 +v 47.088142 42.825726 27.533102 +v 46.938290 38.914249 26.754160 +v 47.234161 42.186985 28.292091 +v 47.345573 41.376099 28.871201 +v 46.883320 38.455292 26.468443 +v 47.611549 37.884193 30.253736 +v 47.415386 40.444027 29.234095 +v 46.957474 39.448078 26.853886 +v 47.441246 39.697979 29.368519 +v 46.132423 42.184120 22.565300 +v 46.566799 40.759056 24.823181 +v 46.598766 40.826176 24.989346 +v 46.632088 40.871548 25.162539 +v 46.541576 43.376144 24.692070 +v 46.666222 40.894455 25.339962 +v 46.700615 40.894543 25.518744 +v 46.734741 40.871815 25.696125 +v 46.858059 40.565052 26.337128 +v 46.905079 40.300220 26.581532 +v 46.923538 40.146526 26.677486 +v 46.948837 39.808659 26.808985 +v 47.004963 43.067505 27.100739 +v 45.655373 32.515556 20.085615 +v 48.601349 32.515556 19.518858 +v 46.635735 43.439342 25.181501 +v 49.581715 43.439342 24.614744 +v 50.034122 42.825726 26.966345 +v 46.361465 43.065830 23.755854 +v 46.449680 43.250977 24.214388 +v 48.967144 41.372654 21.420248 +v 48.926785 40.918030 21.210459 +v 45.980808 40.918030 21.777216 +v 49.017956 41.796913 21.684361 +v 46.824780 43.376877 26.164135 +v 47.433212 39.950649 29.326742 +v 47.436234 39.699635 29.342445 +v 49.487556 43.376144 24.125313 +v 46.201576 42.528164 22.924755 +v 46.278332 42.823616 23.323732 +v 48.897511 40.440216 21.058281 +v 48.888615 40.193138 21.012045 +v 46.071980 41.796913 22.251118 +v 46.021168 41.372654 21.987005 +v 46.730629 43.439590 25.674747 +v 47.164940 42.530670 27.932291 +v 46.916721 43.252190 26.642050 +v 49.950943 43.067505 26.533981 +v 50.361366 40.444027 28.667337 +v 50.379189 39.950649 28.759985 +v 50.180138 42.186985 27.725334 +v 50.240673 41.800091 28.039984 +v 47.294693 41.800091 28.606741 +v 50.291550 41.376099 28.304443 +v 47.386021 40.921688 29.081451 +v 50.331997 40.921688 28.514694 +v 49.676605 43.439590 25.107990 +v 49.677341 35.455376 25.111813 +v 49.582447 35.455128 24.618565 +v 49.862698 43.252190 26.075293 +v 50.607594 36.733505 25.977272 +v 50.541428 36.594643 25.633348 +v 49.396355 35.642532 23.651264 +v 50.669476 41.981129 26.298937 +v 50.094238 39.628387 23.308878 +v 49.799259 39.445889 21.775591 +v 49.838955 40.550362 21.981924 +v 49.869232 40.891331 22.139292 +v 50.144321 40.299072 23.569202 +v 50.166248 40.439426 23.683182 +v 50.004551 41.757961 22.842676 +v 49.817135 38.699863 21.868494 +v 50.219124 40.671249 23.958029 +v 50.100666 39.807266 23.342276 +v 50.111282 39.980480 23.397465 +v 50.249271 40.759056 24.114737 +v 50.062096 41.979553 23.141790 +v 50.191307 40.564144 23.813421 +v 50.281239 40.826176 24.280899 +v 50.190613 42.300076 23.809828 +v 50.314560 40.871548 24.454092 +v 50.401329 42.441532 24.905123 +v 50.417213 40.871815 24.987679 +v 50.471947 42.394493 25.272188 +v 50.450542 40.826614 25.160929 +v 50.482540 40.759663 25.327238 +v 50.540531 40.565052 25.628683 +v 50.862545 40.893909 27.302488 +v 50.824368 41.211906 27.104046 +v 49.839165 38.341614 21.983002 +v 50.111374 38.912914 23.397947 +v 49.869499 38.000809 22.140690 +v 50.004963 37.134884 22.844826 +v 50.191513 38.329666 23.814495 +v 50.166424 38.454250 23.684092 +v 50.219364 38.222706 23.959265 +v 50.281502 38.068111 24.282249 +v 50.260098 36.500225 24.170990 +v 50.383350 38.000263 24.811661 +v 50.401886 36.453377 24.908012 +v 50.330711 36.453186 24.538054 +v 50.472500 36.500771 25.275061 +v 50.450802 38.068542 25.162279 +v 50.482769 38.135670 25.328442 +v 50.669949 36.915165 26.301388 +v 50.540737 38.330574 25.629755 +v 50.892879 40.553104 27.460176 +v 50.637775 39.629799 26.134146 +v 50.779354 37.394798 26.870068 +v 50.914909 40.194855 27.574684 +v 50.587723 38.595646 25.873976 +v 50.862812 38.003387 27.303885 +v 50.620762 38.914249 26.045713 +v 50.631378 39.087452 26.100901 +v 50.932781 39.448830 27.667585 +v 50.727493 37.136757 26.600500 +v 50.111500 36.366562 27.368559 +v 50.361546 38.454502 28.668276 +v 50.893085 38.344357 27.461254 +v 50.915051 38.702721 27.575411 +v 49.907337 41.209522 22.337376 +v 48.879868 38.944069 20.966570 +v 49.953072 37.392635 22.575094 +v 49.907677 37.682812 22.339132 +v 49.078915 36.707745 22.001223 +v 50.062565 36.913589 23.144239 +v 50.191143 36.593735 23.812578 +v 50.124954 36.732250 23.468536 +v 49.770756 43.376877 25.597380 +v 50.607086 42.162468 25.974642 +v 50.540901 42.300983 25.630598 +v 50.778973 41.502083 26.868084 +v 50.034744 36.071102 26.969580 +v 49.951611 35.828888 26.537458 +v 50.180653 36.710598 27.728012 +v 50.928349 39.072823 27.644539 +v 49.078400 42.184120 21.998545 +v 48.927055 37.973030 21.211861 +v 49.018383 37.094627 21.686571 +v 49.488297 35.517838 24.129177 +v 50.110920 42.530670 27.365534 +v 50.727081 41.759834 26.598352 +v 50.928280 39.824814 27.644192 +v 50.385201 39.449322 28.791241 +v 50.824703 37.685196 27.105803 +v 50.241096 37.097805 28.042196 +v 49.803696 39.821896 21.798639 +v 48.873852 39.445396 20.935314 +v 49.307442 43.065830 23.189098 +v 49.952690 41.499920 22.573111 +v 49.803761 39.069904 21.798986 +v 49.395657 43.250977 23.647631 +v 49.147552 42.528164 22.357998 +v 49.224308 42.823616 22.756975 +v 50.124451 42.161217 23.465906 +v 49.816994 40.191998 21.867767 +v 50.330158 42.441341 24.535164 +v 50.259544 42.393948 24.168116 +v 68.149811 34.257607 13.942123 +v 72.566849 34.970417 11.758610 +v 72.814278 34.257607 13.044758 +v 73.310516 33.219078 15.624163 +v 74.630486 32.506702 22.485336 +v 69.432487 32.460957 20.609421 +v 74.096954 32.460957 19.712055 +v 69.966026 32.506702 23.382702 +v 70.491646 32.993713 26.114845 +v 64.621979 40.894543 22.070972 +v 64.587585 40.894455 21.892191 +v 50.348694 40.894455 24.631517 +v 50.383087 40.894543 24.810297 +v 69.788803 39.448078 22.461519 +v 46.955303 39.629799 26.842592 +v 69.340164 40.564144 20.129501 +v 64.430199 40.564144 21.074097 +v 46.483776 40.439426 24.391628 +v 64.430405 38.329666 21.075171 +v 64.364929 38.748192 20.734812 +v 69.274887 38.748192 19.790218 +v 50.126034 38.748192 23.474138 +v 69.661537 40.672024 21.799994 +v 64.339561 39.807266 20.602951 +v 69.243095 39.628387 19.624958 +v 46.411766 39.628387 24.017324 +v 46.443436 40.145279 24.181932 +v 64.458260 38.222706 21.219938 +v 69.398361 38.135056 20.432020 +v 50.249504 38.135056 24.115940 +v 46.536892 38.222706 24.667709 +v 69.463684 38.022903 20.771578 +v 69.430359 38.068111 20.598330 +v 50.314831 38.022903 24.455498 +v 69.293350 38.594498 19.886171 +v 50.144493 38.594498 23.570091 +v 69.249596 39.086071 19.658720 +v 69.260231 38.912914 19.714025 +v 50.100735 39.086071 23.342640 +v 64.870201 39.808659 23.361214 +v 64.520134 40.826176 21.541573 +v 69.463417 40.871548 20.770172 +v 46.508835 40.564144 24.521868 +v 46.536652 40.671249 24.666473 +v 64.333130 39.628387 20.569553 +v 46.409622 39.446640 24.006184 +v 50.092098 39.446640 23.297737 +v 69.260139 39.980480 19.713545 +v 50.125908 40.145279 23.473488 +v 46.428810 39.980480 24.105911 +v 64.383217 40.299072 20.829878 +v 69.293182 40.299072 19.885283 +v 46.461849 40.299072 24.277649 +v 46.599026 38.068111 24.990696 +v 64.553726 38.022903 21.716173 +v 50.348957 38.000175 24.632881 +v 46.632359 38.022903 25.163944 +v 64.383385 38.594498 20.830767 +v 64.333160 39.264919 20.569706 +v 46.418262 39.086071 24.051086 +v 46.411797 39.264919 24.017479 +v 50.094269 39.264919 23.309032 +v 46.883144 40.440468 26.467533 +v 50.565620 40.440468 25.759087 +v 69.714653 38.455292 22.076077 +v 46.905251 38.595646 26.582420 +v 50.565792 38.455292 25.759996 +v 50.620667 39.981804 26.045231 +v 46.938194 39.981804 26.753677 +v 69.497810 38.000175 20.948959 +v 46.666485 38.000175 25.341326 +v 50.587551 40.300220 25.873085 +v 50.606010 40.146526 25.969040 +v 64.779633 38.330574 22.890430 +v 69.599663 38.068542 21.478359 +v 69.631630 38.135670 21.644522 +v 46.768330 38.068542 25.870726 +v 50.631310 39.808659 26.100538 +v 64.721436 40.759663 22.587912 +v 69.631393 40.759663 21.643318 +v 46.768070 40.826614 25.869375 +v 46.830208 40.672024 26.192360 +v 50.512680 40.672024 25.483913 +v 46.800064 40.759663 26.035685 +v 64.826447 40.300220 23.133760 +v 69.786659 39.266331 22.450378 +v 64.878838 39.448078 23.406115 +v 50.637802 39.266331 26.134300 +v 50.639946 39.448078 26.145439 +v 64.876694 39.266331 23.394974 +v 46.955330 39.266331 26.842745 +v 64.751808 38.223469 22.745825 +v 69.661774 38.223469 21.801229 +v 69.689598 38.330574 21.945835 +v 46.830444 38.223469 26.193596 +v 46.858265 38.330574 26.338202 +v 50.512917 38.223469 25.485149 +v 64.656380 38.023182 22.249760 +v 64.689697 38.068542 22.422955 +v 46.735012 38.023182 25.697533 +v 64.622246 38.000263 22.072336 +v 69.532204 38.000263 21.127741 +v 46.700878 38.000263 25.520107 +v 50.417484 38.023182 24.989086 +v 69.754990 38.749439 22.285770 +v 64.859657 38.914249 23.306389 +v 50.606136 38.749439 25.969690 +v 46.923664 38.749439 26.678137 +v 64.870270 39.087452 23.361576 +v 69.780235 39.087452 22.416981 +v 61.316620 34.574280 6.299973 +v 61.312920 34.574375 6.490880 +v 55.456875 34.574280 7.427290 +v 61.036880 32.926773 4.759091 +v 61.039318 33.133568 4.771767 +v 70.859245 33.133568 2.882577 +v 55.144924 32.926773 5.892605 +v 60.995525 31.783306 7.656045 +v 60.987606 31.798721 7.674161 +v 71.395844 31.798721 5.671790 +v 55.257820 34.198410 6.479429 +v 70.866638 32.516430 2.921004 +v 71.072044 34.496571 3.988700 +v 46.522228 34.496571 8.711675 +v 46.485836 34.420193 8.522511 +v 70.895279 33.721729 3.069858 +v 46.328823 33.534252 7.706368 +v 55.183392 33.721729 6.092562 +v 55.166759 33.534252 6.006098 +v 70.941185 34.056538 3.308511 +v 61.096321 33.896751 5.068068 +v 61.058811 32.319458 4.873092 +v 70.878738 32.319458 2.983902 +v 46.328922 32.319458 7.706877 +v 70.859268 32.719955 2.882709 +v 61.046711 32.516430 4.810194 +v 46.908474 33.535702 10.719367 +v 56.492821 33.535702 8.875499 +v 56.404926 33.723171 8.802396 +v 71.420784 31.958406 5.801417 +v 60.925636 31.958406 7.820507 +v 46.846027 31.798721 10.394764 +v 61.272781 34.524712 5.985285 +v 61.256676 34.524712 5.988383 +v 55.360161 34.496571 7.011404 +v 61.312759 34.574272 6.279903 +v 71.148788 34.574272 4.387615 +v 61.273930 34.548199 6.078078 +v 55.453011 34.574272 7.407220 +v 55.414185 34.548199 7.205395 +v 46.419884 34.198410 8.179700 +v 71.035652 34.420193 3.799536 +v 55.323772 34.420193 6.822240 +v 46.451553 34.320305 8.344303 +v 46.309429 33.133568 7.605552 +v 55.147362 33.133568 5.905281 +v 61.075348 33.721729 4.959048 +v 46.345459 33.721729 7.792832 +v 61.274227 31.306643 6.079606 +v 55.414478 31.306643 7.206923 +v 61.181690 31.534010 5.511811 +v 55.289734 31.534010 6.645325 +v 70.941391 31.797485 3.309555 +v 70.969948 31.655691 3.457995 +v 46.391571 31.797485 8.032529 +v 55.258064 31.655691 6.480699 +v 61.235847 31.392776 5.793306 +v 71.072342 31.358046 3.990242 +v 46.522526 31.358046 8.713217 +v 55.376564 31.358046 7.009848 +v 61.274078 31.280785 6.288991 +v 55.418308 31.304075 7.226835 +v 46.560440 31.306643 8.910293 +v 70.895439 32.131989 3.070702 +v 46.366615 31.957125 7.902797 +v 46.345619 32.131989 7.793677 +v 55.183556 32.131989 6.093406 +v 70.856804 32.926773 2.869901 +v 46.309456 32.719955 7.605683 +v 56.676979 32.928387 8.958290 +v 46.927944 33.135204 10.820560 +v 71.470390 33.338730 6.059290 +v 60.891953 33.535702 8.029180 +v 46.920574 33.338730 10.782265 +v 60.946449 33.723171 7.928683 +v 71.367081 34.199467 5.522300 +v 46.845825 34.057674 10.393715 +v 61.258160 34.420887 7.111399 +v 71.335411 34.321148 5.357674 +v 55.812225 34.420887 8.159105 +v 46.785595 34.321148 10.080648 +v 71.441757 32.133430 5.910437 +v 56.384117 31.958406 8.694220 +v 56.476284 32.133430 8.789543 +v 71.470482 32.518005 6.059753 +v 60.814278 32.320908 8.044650 +v 46.920666 32.518005 10.782727 +v 56.570694 32.320908 8.861045 +v 60.751659 32.928387 8.174390 +v 71.335663 31.534855 5.358966 +v 61.176445 31.434967 7.128626 +v 46.751560 31.434967 9.903733 +v 55.776115 31.358620 7.971396 +v 71.188240 31.280876 4.592679 +v 61.270115 31.280876 6.500761 +v 61.266422 31.306923 6.710764 +v 56.582695 33.338730 8.923434 +v 71.420601 33.898132 5.800478 +v 61.088646 34.057674 7.653634 +v 71.395645 34.057674 5.670740 +v 61.060886 33.999672 7.707832 +v 46.817268 34.199467 10.245275 +v 56.036705 34.199467 8.471608 +v 55.928535 34.321148 8.321699 +v 71.264687 34.497074 4.990050 +v 55.613091 34.548508 7.796787 +v 46.676956 34.548508 9.515950 +v 61.303711 34.490608 6.923106 +v 55.693523 34.497074 7.985682 +v 71.187935 34.574375 4.591091 +v 46.638119 34.574375 9.314066 +v 71.458389 32.320908 5.996901 +v 60.868248 32.168861 7.961548 +v 46.908573 32.320908 10.719875 +v 71.477783 32.721592 6.097717 +v 60.770199 32.518005 8.118308 +v 56.674541 32.721592 8.945614 +v 56.638954 32.518005 8.913091 +v 61.266220 31.311365 6.728227 +v 55.655907 31.306923 7.790134 +v 46.677250 31.306923 9.517477 +v 55.662575 31.311365 7.806274 +v 45.754868 31.906664 4.722975 +v 46.792843 27.567686 6.719300 +v 70.601196 28.748648 1.541240 +v 60.484760 31.906664 1.889190 +v 54.592804 31.906664 3.022704 +v 51.725163 32.743256 35.756310 +v 76.274979 32.743256 31.033335 +v 75.544533 25.600410 33.281940 +v 52.123806 26.241262 37.828434 +v 72.279839 27.965517 28.017206 +v 71.904739 28.001427 27.503540 +v 71.559708 28.020782 27.254135 +v 71.366455 28.028603 27.163761 +v 70.953598 28.039904 27.058821 +v 70.527489 28.044874 27.059690 +v 67.170486 28.113617 26.584072 +v 69.045937 27.965517 28.639355 +v 69.125305 27.990200 28.221403 +v 69.203674 28.001427 28.023180 +v 69.306305 28.011675 27.836245 +v 69.577461 28.028603 27.507933 +v 69.921913 28.039904 27.257298 +v 69.741806 28.035006 27.371834 +v 70.114883 28.043211 27.166206 +v 72.439278 27.912836 28.845966 +v 72.412743 27.900188 29.057392 +v 72.359901 27.888153 29.263918 +v 72.178909 27.866678 29.649078 +v 71.743401 27.843346 30.113489 +v 71.370232 27.835142 30.319136 +v 71.167282 27.833479 30.385315 +v 69.073219 27.939177 29.063824 +v 68.226372 27.764736 32.072548 +v 69.205376 27.912836 29.468115 +v 70.531616 27.838449 30.426502 +v 70.744606 27.835142 30.439495 +v 70.321869 27.843346 30.386969 +v 69.925507 27.857569 30.231188 +v 69.745140 27.866678 30.117294 +v 69.580475 27.876926 29.981783 +v 69.434158 27.888153 29.826784 +v 67.195198 30.209538 26.712547 +v 71.908768 30.209538 25.805735 +v 72.964653 29.860657 31.294212 +v 72.943474 28.064154 31.184092 +v 68.251091 29.860657 32.201023 +v 68.569992 30.209538 26.448061 +v 71.887581 28.413034 25.695614 +v 57.682102 27.939177 31.255283 +v 57.321167 27.990200 30.492323 +v 57.174850 28.001427 30.337324 +v 57.010181 28.011675 30.201813 +v 56.829819 28.020782 30.087919 +v 56.433453 28.035006 29.932138 +v 55.797596 28.044874 29.893476 +v 55.588039 28.044874 29.933792 +v 55.385090 28.043211 29.999971 +v 54.316307 27.952452 31.686220 +v 54.316055 27.965517 31.473139 +v 54.395416 27.990200 31.055189 +v 54.576412 28.011675 30.670029 +v 54.701645 28.020782 30.497345 +v 55.011921 28.035006 30.205618 +v 55.192024 28.039904 30.091084 +v 57.709126 27.925900 31.466671 +v 57.709385 27.912836 31.679752 +v 57.630016 27.888153 32.097702 +v 57.551651 27.876926 32.295929 +v 59.584839 27.764736 33.735035 +v 57.449020 27.866678 32.482864 +v 56.640343 27.835142 33.152920 +v 56.437393 27.833479 33.219101 +v 56.227837 27.833479 33.259415 +v 54.343330 27.939177 31.897608 +v 50.574806 28.113617 29.776804 +v 54.578556 27.900188 32.488392 +v 55.015247 27.866678 32.951080 +v 58.234764 29.860657 34.127998 +v 53.840099 30.209538 29.281845 +v 50.599525 30.209538 29.905277 +v 53.818913 28.413034 29.171724 +v 58.528950 28.113617 28.246559 +v 57.157688 28.413034 28.529400 +v 58.553665 30.209538 28.375034 +v 58.213581 28.064154 34.017876 +v 59.609554 29.860657 33.863510 +v 51.655415 29.860657 35.393753 +v 69.604698 28.064154 31.826416 +v 72.962326 28.057924 31.282099 +v 69.623550 28.057924 31.924423 +v 69.104996 30.633932 29.229004 +v 68.780930 30.440424 27.544506 +v 69.422005 30.228603 30.876797 +v 69.625877 29.860657 31.936537 +v 68.548805 28.413034 26.337940 +v 69.648270 30.153843 32.052898 +v 72.760780 30.228603 30.234472 +v 71.893440 30.515184 25.726080 +v 68.554665 30.515184 26.368404 +v 68.529945 28.419264 26.239931 +v 71.868721 28.419264 25.597607 +v 72.119705 30.440424 26.902182 +v 72.443771 30.633932 28.586679 +v 72.987045 30.153843 31.410572 +v 72.764313 30.528021 30.252825 +v 72.471054 30.607592 29.011148 +v 72.470795 30.620655 28.798069 +v 72.391685 30.582907 29.429100 +v 72.210686 30.561432 29.814259 +v 72.313316 30.571682 29.627323 +v 71.775185 30.538101 30.278669 +v 71.595078 30.533205 30.393206 +v 69.425537 30.528021 30.895151 +v 69.776917 30.561432 30.282476 +v 69.340240 30.594944 29.819784 +v 72.123238 30.739841 26.920534 +v 72.390434 30.647207 28.380356 +v 72.208527 30.672918 27.995901 +v 71.771851 30.706430 27.533209 +v 71.398232 30.723356 27.328941 +v 71.195122 30.729761 27.263535 +v 70.772285 30.737967 27.211027 +v 68.784454 30.739841 27.562859 +v 69.773590 30.729761 27.537014 +v 69.609238 30.723356 27.673115 +v 69.235451 30.696182 28.188360 +v 69.338081 30.706430 28.001427 +v 69.077972 30.647207 29.017616 +v 58.232433 28.057924 34.115883 +v 54.051037 30.440424 30.378290 +v 53.824776 30.515184 29.202190 +v 53.800060 28.419264 29.073715 +v 54.692116 30.228603 33.710583 +v 54.893661 28.057924 34.758209 +v 54.895992 29.860657 34.770321 +v 54.918377 30.153843 34.886681 +v 54.874805 28.064154 34.660202 +v 58.257153 30.153843 34.244358 +v 57.389812 30.440424 29.735966 +v 57.163551 30.515184 28.559864 +v 57.138832 28.419264 28.431391 +v 57.178875 30.209538 28.639521 +v 57.661793 30.582907 32.262886 +v 57.583431 30.571682 32.461109 +v 57.355564 30.552324 32.820728 +v 58.034420 30.528021 33.086609 +v 56.672123 30.529896 33.318100 +v 54.695644 30.528021 33.728935 +v 55.420643 30.544506 33.320526 +v 55.047028 30.561432 33.116261 +v 54.736042 30.582907 32.825748 +v 54.882362 30.571682 32.980751 +v 54.507275 30.607592 32.467079 +v 54.375107 30.633932 32.062790 +v 57.581722 30.660273 31.016172 +v 55.829376 30.739630 30.058657 +v 57.393345 30.739841 29.754320 +v 55.223801 30.734657 30.256264 +v 54.374340 30.672918 31.426899 +v 54.054569 30.739841 30.396645 +v 54.348083 30.647207 31.851400 +v 58.030888 30.228603 33.068256 +v 72.358658 27.952452 28.215174 +v 72.411995 27.939177 28.421499 +v 69.126556 27.925900 29.270149 +v 69.067329 27.440147 29.033234 +v 71.161400 27.334450 30.354727 +v 70.957726 27.833479 30.425631 +v 70.951836 27.334450 30.395042 +v 69.919617 27.358541 30.200598 +v 69.739250 27.367649 30.086706 +v 69.780449 30.860849 30.300829 +v 69.431534 28.020782 27.663559 +v 69.777115 31.029179 27.555368 +v 69.302582 27.401161 29.624014 +v 69.469467 30.882324 30.010319 +v 70.947708 27.540874 27.028231 +v 71.157455 27.535978 27.067764 +v 70.985374 30.734657 27.224001 +v 70.988907 31.034075 27.242355 +v 69.072472 27.978165 28.427931 +v 69.157089 30.684956 28.386585 +v 69.104248 30.672918 28.593111 +v 69.735924 27.535978 27.341244 +v 69.953697 30.734657 27.422480 +v 70.150192 31.037384 27.349741 +v 71.907753 27.849751 29.977388 +v 70.315987 27.344318 30.356379 +v 70.563393 30.533205 30.591682 +v 70.154068 30.843924 30.505096 +v 69.960815 30.851742 30.414722 +v 69.957283 30.552324 30.396368 +v 69.199493 27.413807 29.437527 +v 69.308464 27.900188 29.654604 +v 72.311615 30.660273 28.182388 +v 71.740074 28.011675 27.368027 +v 71.734192 27.512646 27.337439 +v 71.591484 30.715538 27.419315 +v 71.898857 27.502398 27.472950 +v 72.045174 27.491171 27.627949 +v 72.051056 27.990200 27.658539 +v 71.936516 30.696182 27.668720 +v 72.082832 30.684956 27.823719 +v 70.734627 27.544182 27.015257 +v 70.740509 28.043211 27.045845 +v 70.775818 31.037384 27.229380 +v 70.317932 28.044874 27.100006 +v 70.349709 30.739630 27.265188 +v 70.559265 30.739630 27.224873 +v 71.163345 28.035006 27.098354 +v 71.401764 31.022774 27.347296 +v 69.040314 27.453424 28.821846 +v 69.081505 30.946625 29.035971 +v 69.160614 30.984373 28.404938 +v 69.040054 27.466488 28.608767 +v 69.077713 30.660273 28.804537 +v 69.046196 27.952452 28.852436 +v 69.463310 30.715538 27.828741 +v 69.466843 31.014956 27.847094 +v 69.612770 31.022774 27.691467 +v 70.108994 27.544182 27.135616 +v 70.146660 30.737967 27.331387 +v 71.402016 30.529896 30.484316 +v 71.202591 30.827650 30.568850 +v 71.199059 30.528233 30.550497 +v 71.778709 30.837519 30.297024 +v 72.047791 27.358541 29.791174 +v 72.085457 30.552324 29.986944 +v 72.088989 30.851742 30.005297 +v 71.943062 30.843924 30.160923 +v 71.939529 30.544506 30.142570 +v 72.173027 27.367649 29.618488 +v 72.316849 30.871098 29.645678 +v 72.444519 30.594944 29.222574 +v 70.118759 27.849751 30.321562 +v 70.112869 27.350721 30.290972 +v 70.353645 30.538101 30.552149 +v 70.150536 30.544506 30.486742 +v 70.566925 30.832623 30.610037 +v 70.989502 30.528233 30.590813 +v 70.776382 30.529896 30.604677 +v 69.465935 30.582907 29.991964 +v 69.574585 27.377897 29.951195 +v 69.612251 30.571682 30.146965 +v 69.120674 27.426872 29.239559 +v 69.158333 30.620655 29.435329 +v 69.240685 30.907009 29.651649 +v 69.237152 30.607592 29.633297 +v 72.170860 27.479136 27.800131 +v 72.176750 27.978165 27.830719 +v 72.212059 30.972336 28.014254 +v 71.775383 31.005848 27.551561 +v 70.562798 31.039047 27.243225 +v 71.563293 27.838449 30.228024 +v 71.598602 30.832623 30.411558 +v 72.053680 27.857569 29.821762 +v 72.275658 27.377897 29.431553 +v 72.281540 27.876926 29.462143 +v 72.439018 27.925900 28.632887 +v 57.622879 27.453424 31.018370 +v 57.676220 27.440147 31.224695 +v 54.396667 27.925900 32.103931 +v 56.469170 30.528233 33.384281 +v 56.263145 30.827650 33.442951 +v 56.259613 30.528233 33.424599 +v 55.189728 27.358541 33.034382 +v 55.227390 30.552324 33.230152 +v 54.736954 31.014956 30.680880 +v 55.006035 27.535978 30.175030 +v 55.227333 31.034075 30.274618 +v 55.043697 30.729761 30.370800 +v 54.704266 27.888153 32.660568 +v 54.610332 30.594944 32.653572 +v 56.223705 28.039904 29.892605 +v 56.217823 27.540874 29.862017 +v 56.427567 27.535978 29.901550 +v 56.468761 31.029179 30.115673 +v 56.255486 30.734657 30.057787 +v 56.465229 30.729761 30.097321 +v 56.630680 27.529573 29.966957 +v 54.342564 27.978165 31.261719 +v 54.336678 27.479136 31.231129 +v 54.427197 30.684956 31.220369 +v 54.847572 28.028603 30.341719 +v 54.841686 27.529573 30.311129 +v 54.879349 30.723356 30.506899 +v 55.186138 27.540874 30.060493 +v 55.379204 27.544182 29.969383 +v 55.416866 30.737967 30.165154 +v 57.013512 27.843346 32.947273 +v 57.213169 30.843924 32.994709 +v 57.048820 30.837519 33.130810 +v 57.209641 30.544506 32.976357 +v 55.586098 27.344318 33.190163 +v 55.833504 30.533205 33.425468 +v 55.627289 30.837519 33.404289 +v 55.623760 30.538101 33.385933 +v 55.195614 27.857569 33.064972 +v 55.230923 30.851742 33.248508 +v 54.469612 27.413807 32.271309 +v 54.510807 30.907009 32.485432 +v 57.549946 27.965517 30.850992 +v 57.628765 27.952452 31.048958 +v 57.660542 30.647207 31.214140 +v 57.585255 30.959690 31.034527 +v 57.356476 30.984373 30.675858 +v 57.478638 30.672918 30.829685 +v 56.861599 30.715538 30.253101 +v 57.041962 30.706430 30.366993 +v 57.210159 30.995600 30.520859 +v 57.352943 30.684956 30.657505 +v 55.619820 30.739630 30.098972 +v 56.636566 28.028603 29.997545 +v 56.668343 30.723356 30.162727 +v 54.347836 30.660273 31.638319 +v 54.467896 27.502398 30.826376 +v 54.389534 27.491171 31.024599 +v 54.505558 30.696182 31.022146 +v 54.473782 28.001427 30.856964 +v 54.608192 30.706430 30.835211 +v 54.310173 27.466488 31.442549 +v 54.351364 30.959690 31.656673 +v 54.695759 27.521755 30.466755 +v 54.733421 30.715538 30.662525 +v 55.623348 31.039047 30.117327 +v 57.713882 30.633932 31.420465 +v 57.740902 30.620655 31.631853 +v 56.431507 27.334450 33.188511 +v 56.833408 27.838449 33.061810 +v 57.045292 30.538101 33.112453 +v 56.865185 30.533205 33.226990 +v 57.177860 27.849751 32.811172 +v 57.359097 30.851742 32.839081 +v 57.682850 27.900188 31.891176 +v 57.714626 30.594944 32.056358 +v 57.676964 27.401161 31.860588 +v 57.744694 30.907009 31.863287 +v 57.718159 30.894361 32.074711 +v 55.591980 27.843346 33.220753 +v 55.388866 27.849751 33.155346 +v 55.424175 30.843924 33.338882 +v 55.801727 27.838449 33.260288 +v 56.014816 27.835142 33.273262 +v 56.050125 30.829313 33.456795 +v 56.046593 30.529896 33.438442 +v 54.850582 27.876926 32.815567 +v 54.844696 27.377897 32.784981 +v 55.050560 30.860849 33.134613 +v 54.475498 27.912836 32.301899 +v 54.428448 30.620655 32.269115 +v 57.440971 27.479136 30.633915 +v 57.446857 27.978165 30.664505 +v 57.206627 30.696182 30.502504 +v 55.791714 27.545847 29.862886 +v 56.010616 28.043211 29.879631 +v 56.004734 27.544182 29.849041 +v 56.045925 31.037384 30.063166 +v 56.042397 30.737967 30.044811 +v 56.675652 30.829313 33.336456 +v 57.323788 27.857569 32.655548 +v 57.317902 27.358541 32.624958 +v 57.480797 30.561432 32.648045 +v 57.484329 30.860849 32.666397 +v 57.545769 27.377897 32.265339 +v 57.703499 27.413807 31.649162 +v 57.741161 30.607592 31.844933 +v 73.133041 25.948370 28.069304 +v 68.864822 26.065239 26.983849 +v 72.354019 27.389124 29.233330 +v 72.406853 27.401161 29.026802 +v 73.155472 25.886189 29.079416 +v 72.433388 27.413807 28.815378 +v 72.352768 27.453424 28.184586 +v 71.360573 27.529573 27.133171 +v 71.414162 26.080296 26.247744 +v 71.026947 26.090002 26.163887 +v 71.110840 26.088047 26.179663 +v 72.418747 25.812611 30.421471 +v 73.194214 25.904634 28.771019 +v 72.678169 26.012682 27.107624 +v 72.920380 25.986547 27.487391 +v 71.983307 26.058466 26.494383 +v 69.803406 26.094831 26.320511 +v 70.099487 26.097260 26.223911 +v 70.521606 27.545847 27.029102 +v 70.312042 27.545847 27.069418 +v 70.405281 26.097260 26.165081 +v 68.272964 25.948370 29.004301 +v 68.243927 25.981487 28.469589 +v 68.442665 26.029385 27.649981 +v 68.359734 26.017492 27.859955 +v 69.119423 27.491171 28.190815 +v 70.525734 27.339420 30.395912 +v 70.496414 25.794794 31.081974 +v 71.032852 25.788862 31.075527 +v 68.517754 25.899576 29.753220 +v 68.305092 25.937754 29.171307 +v 72.244850 25.805826 30.565607 +v 72.179062 25.803261 30.620136 +v 72.814415 25.837296 29.942667 +v 71.901863 27.350721 29.946800 +v 72.964188 25.852247 29.669930 +v 73.099586 25.873442 29.298115 +v 73.078400 25.868631 29.380653 +v 72.414482 26.033876 26.812588 +v 72.348557 26.037975 26.758394 +v 72.472954 26.029385 26.874619 +v 72.627869 26.017492 27.038837 +v 72.174210 26.048828 26.614885 +v 71.332840 26.082863 26.221514 +v 71.553825 27.521755 27.223545 +v 69.449699 26.088047 26.499239 +v 69.916031 27.540874 27.226709 +v 69.884560 26.095497 26.294022 +v 70.941620 26.091330 26.158655 +v 68.244370 25.962425 28.780510 +v 69.425652 27.521755 27.632971 +v 68.473946 26.033876 27.570681 +v 69.197784 27.502398 27.992590 +v 68.282661 25.999935 28.161194 +v 69.066589 27.479136 28.397341 +v 70.738724 27.336113 30.408907 +v 69.428268 27.389124 29.796194 +v 68.444992 25.909863 29.599417 +v 71.364349 27.336113 30.288546 +v 71.634727 25.791292 30.920099 +v 71.839088 25.794794 30.823664 +v 71.557411 27.339420 30.197435 +v 71.916382 25.796120 30.787148 +v 71.737518 27.344318 30.082899 +v 73.193764 25.923698 28.460100 +v 72.406113 27.440147 28.390909 +v 73.154411 25.943062 28.151785 +v 72.433128 27.426872 28.602299 +v 72.961609 25.981487 27.561985 +v 72.273949 27.466488 27.986618 +v 69.193283 26.080296 26.675001 +v 69.571579 27.529573 27.477345 +v 69.019287 26.073511 26.819159 +v 69.300415 27.512646 27.805655 +v 70.722069 25.791292 31.095680 +v 72.573311 25.820885 30.256760 +v 72.681854 25.827658 30.125401 +v 69.259071 26.082863 26.620474 +v 58.424519 25.943062 30.985571 +v 57.258545 25.798077 33.575157 +v 55.597404 25.798077 33.894730 +v 58.348507 25.868631 32.214439 +v 58.453705 25.899576 31.689375 +v 57.544060 27.466488 30.820402 +v 58.346668 25.962425 30.684662 +v 56.602951 26.082863 29.055300 +v 56.380947 26.088047 29.013447 +v 55.369595 26.097260 29.057695 +v 55.382980 27.350721 33.124756 +v 57.171974 27.350721 32.780586 +v 58.190487 25.986547 30.321175 +v 57.004299 27.512646 30.171223 +v 57.253414 26.058466 29.328167 +v 55.073513 26.094831 29.154295 +v 53.744095 26.033876 30.404459 +v 53.608658 26.012682 30.776279 +v 53.629807 26.017492 30.693748 +v 53.896976 25.886189 32.784428 +v 54.337444 27.440147 31.867020 +v 54.310421 27.453424 31.655630 +v 53.543034 25.948370 31.838093 +v 53.575165 25.937754 32.005100 +v 54.390781 27.426872 32.073345 +v 53.631645 25.923698 32.223526 +v 57.449173 25.803261 33.453922 +v 57.007629 27.344318 32.916683 +v 57.443134 27.367649 32.452274 +v 58.084530 25.837296 32.776451 +v 57.624130 27.389124 32.067116 +v 58.425587 25.886189 31.913200 +v 58.464214 25.909863 31.519552 +v 57.315281 27.491171 30.461735 +v 57.743065 26.029385 29.708405 +v 57.168964 27.502398 30.306734 +v 56.823933 27.521755 30.057331 +v 55.154671 26.095497 29.127806 +v 55.582157 27.545847 29.903202 +v 56.211830 26.091330 28.992420 +v 56.297058 26.090002 28.997673 +v 55.900986 26.095497 28.984228 +v 53.893787 26.048828 30.131733 +v 53.785137 26.037975 30.329685 +v 54.134899 26.065239 29.817640 +v 53.524647 25.986547 31.218805 +v 55.795841 27.339420 33.229698 +v 53.787865 25.899576 32.587002 +v 54.572670 27.401161 32.457802 +v 54.698380 27.389124 32.629978 +v 54.030071 25.873442 32.966770 +v 54.235268 25.856739 33.199780 +v 54.293797 25.852247 33.261799 +v 55.009365 27.367649 32.920490 +v 54.724979 25.827658 33.580006 +v 53.715111 25.909863 32.433201 +v 53.746639 25.904634 32.512405 +v 53.553837 25.943062 31.922609 +v 57.901814 25.824013 33.028290 +v 56.634460 27.336113 33.122330 +v 57.186497 25.796120 33.620930 +v 56.827522 27.339420 33.031219 +v 58.234299 25.852247 32.503712 +v 57.703239 27.426872 31.436083 +v 58.231724 25.981487 30.395771 +v 57.897980 26.017492 29.872623 +v 54.289398 26.073511 29.652943 +v 54.570530 27.512646 30.639441 +v 56.221951 27.334450 33.228828 +v 56.008930 27.336113 33.242672 +v 55.992176 25.791292 33.929466 +v 57.843426 25.820885 33.090546 +v 55.294083 25.805826 33.826653 +v 72.689682 32.936100 28.577045 +v 69.957222 31.034075 27.440832 +v 69.108528 30.933350 29.247358 +v 68.913231 32.922829 29.520058 +v 68.855606 32.944691 29.174501 +v 68.873070 32.936100 29.311298 +v 72.655136 32.944691 28.443537 +v 69.657249 32.846298 30.625416 +v 72.717247 32.884747 29.409529 +v 69.370560 33.026978 27.733027 +v 69.653427 33.039387 27.476149 +v 72.393967 30.946625 28.398708 +v 69.237755 32.876957 30.205971 +v 72.448051 30.894361 29.240927 +v 69.547142 33.035244 27.564184 +v 69.770012 33.042557 27.401987 +v 70.803802 32.810127 30.994938 +v 72.447304 30.933350 28.605034 +v 72.474327 30.920073 28.816422 +v 72.656609 32.870937 29.646420 +v 71.832893 32.816372 30.695118 +v 69.081245 30.959690 28.822889 +v 68.855453 32.953144 29.036612 +v 68.886566 32.929462 29.416945 +v 69.238983 30.995600 28.206715 +v 69.234924 33.018517 27.897144 +v 70.353241 31.039047 27.283541 +v 70.314301 33.050713 27.164234 +v 72.134529 33.000874 27.627140 +v 71.415482 33.035244 27.204746 +v 70.454575 32.816372 30.960283 +v 70.357178 30.837519 30.570503 +v 69.864136 32.835857 30.755957 +v 69.468384 32.858055 30.469965 +v 69.038193 32.899254 29.880606 +v 69.343773 30.894361 29.838139 +v 72.474586 30.907009 29.029501 +v 72.747452 32.905785 29.060493 +v 72.605949 32.863670 29.774776 +v 72.214218 30.860849 29.832613 +v 72.566765 32.858055 29.873888 +v 72.395218 30.882324 29.447453 +v 72.682976 32.876957 29.543167 +v 69.107780 30.972336 28.611465 +v 69.341614 31.005848 28.019779 +v 69.297539 33.023071 27.810801 +v 70.661209 33.049877 27.111113 +v 71.198654 31.029179 27.281889 +v 70.779915 30.829313 30.623030 +v 69.615784 30.871098 30.165318 +v 72.137970 32.826893 30.464764 +v 71.949486 32.819542 30.620956 +v 72.055763 32.823685 30.532921 +v 72.367989 32.840412 30.199961 +v 72.086365 30.984373 27.842073 +v 71.595016 31.014956 27.437670 +v 71.738770 33.023071 27.341148 +v 71.945656 33.012627 27.471689 +v 71.043518 33.045006 27.117043 +v 71.148338 33.042557 27.136820 +v 69.161865 30.920073 29.453684 +v 70.559395 32.813923 30.980062 +v 69.550751 32.852936 30.537661 +v 71.405540 30.829313 30.502670 +v 71.646355 32.812271 30.797882 +v 71.390076 32.809052 30.899731 +v 71.048218 32.808216 30.979116 +v 72.305374 32.835857 30.286304 +v 72.315147 30.959690 28.200741 +v 71.940048 30.995600 27.687075 +v 70.941696 32.809052 30.985991 +v 70.993034 30.827650 30.609165 +v 54.357590 33.005993 30.963581 +v 54.156677 32.929462 32.250729 +v 54.378639 30.933350 32.081142 +v 54.431976 30.920073 32.287468 +v 57.635265 32.981972 30.724920 +v 54.143177 32.936100 32.145084 +v 57.874226 32.953144 31.149218 +v 57.987358 32.884747 32.243313 +v 54.817253 33.035244 30.397968 +v 55.047230 31.029179 30.389153 +v 56.685593 33.035244 30.038530 +v 54.426495 32.884747 32.928364 +v 58.004532 32.892925 32.106560 +v 54.189991 32.981972 31.387732 +v 54.138645 32.966003 31.658104 +v 55.040123 33.042557 30.235771 +v 55.584408 33.050713 29.998020 +v 55.824802 33.050713 29.951773 +v 55.832905 31.039047 30.077011 +v 56.211807 32.809052 33.819775 +v 54.739574 30.882324 32.844105 +v 54.570660 32.870937 33.125854 +v 57.717411 30.933350 31.438818 +v 57.744434 30.920073 31.650206 +v 54.125698 32.944691 32.008289 +v 54.351616 30.946625 31.869755 +v 54.216408 32.987988 31.284470 +v 54.267094 32.995258 31.156109 +v 54.430725 30.984373 31.238724 +v 54.505032 33.018517 30.730928 +v 54.611721 31.005848 30.853563 +v 54.882881 31.022774 30.525253 +v 56.069214 33.048801 29.935953 +v 56.671875 31.022774 30.181080 +v 55.134247 32.835857 33.589741 +v 54.885891 30.871098 32.999104 +v 54.820824 32.852936 33.371452 +v 54.613865 30.894361 32.671925 +v 54.359818 32.892925 32.807743 +v 54.308266 32.899254 32.714397 +v 58.017681 32.899254 32.000771 +v 56.660187 32.809052 33.733517 +v 57.103004 32.816372 33.528904 +v 57.785500 32.852936 32.801102 +v 57.665325 30.882324 32.281239 +v 57.586960 30.871098 32.479462 +v 57.836872 32.858055 32.707672 +v 57.953087 32.876957 32.376953 +v 57.926720 32.870937 32.480206 +v 54.125408 32.959675 31.763912 +v 54.377872 30.972336 31.445253 +v 54.509090 30.995600 31.040499 +v 54.567650 33.023071 30.644585 +v 55.420399 31.037384 30.183506 +v 57.572468 32.987988 30.638821 +v 57.045490 31.005848 30.385347 +v 56.259014 31.034075 30.076139 +v 55.931320 33.049877 29.944899 +v 54.217865 32.914238 32.487358 +v 55.837036 30.832623 33.443821 +v 55.936039 32.812271 33.820282 +v 55.829506 32.813923 33.813847 +v 55.230915 32.831951 33.634872 +v 54.738510 32.858055 33.303745 +v 57.719166 32.846298 32.922104 +v 57.477795 32.995258 30.538424 +v 57.783360 32.966003 30.956921 +v 57.482166 30.972336 30.848040 +v 56.912216 33.026978 30.129803 +v 56.865128 31.014956 30.271454 +v 57.008881 33.023071 30.174932 +v 56.313625 33.045006 29.950829 +v 56.418449 33.042557 29.970606 +v 55.457539 32.823685 33.726143 +v 55.355911 32.826893 33.693352 +v 56.868717 30.832623 33.245342 +v 57.013000 32.813923 33.586163 +v 56.916462 32.812271 33.631668 +v 56.472702 30.827650 33.402634 +v 56.318329 32.808216 33.812901 +v 57.834824 32.959675 31.050283 +v 57.664074 30.946625 31.232492 +v 57.404636 33.000874 30.460924 +v 66.344604 39.697979 25.731829 +v 45.726643 38.559273 20.456078 +v 68.557976 38.559273 16.063711 +v 59.756031 34.946129 14.619476 +v 57.905457 27.120533 11.876236 +v 65.778191 34.374424 22.787634 +v 65.364769 34.357391 23.145042 +v 55.329880 34.385426 24.618225 +v 64.885788 34.768574 16.529219 +v 65.773750 35.392830 22.519989 +v 65.713318 35.397808 22.450407 +v 64.642441 35.766628 16.639479 +v 61.281570 34.189182 26.674751 +v 64.857506 34.777916 16.382204 +v 61.639938 26.055202 28.537531 +v 47.359364 27.719242 12.310676 +v 50.426838 26.801964 29.007669 +v 69.590553 27.567686 2.333402 +v 70.554688 33.050713 27.117987 +v 70.212830 33.049877 27.197374 +v 70.081459 33.048801 27.240231 +v 69.956558 33.046658 27.299223 +v 69.860016 33.045006 27.344728 +v 69.464935 33.032036 27.632341 +v 57.215771 33.012627 30.305473 +v 69.153854 33.012627 28.008785 +v 68.919930 32.981972 28.553938 +v 68.855339 32.959675 28.930120 +v 57.986450 32.929462 31.513945 +v 57.925243 32.944691 31.277321 +v 68.885658 32.974182 28.687576 +v 57.716671 32.974182 30.836304 +v 68.946297 32.987988 28.450686 +v 69.036140 33.000874 28.223217 +v 69.087517 33.005993 28.129789 +v 57.959789 32.936100 31.410831 +v 68.868484 32.966003 28.824327 +v 68.996964 32.995258 28.322329 +v 57.322266 33.005993 30.393229 +v 57.099064 33.018517 30.231880 +v 56.787216 33.032036 30.071323 +v 56.554234 33.039387 29.996216 +v 70.387024 33.147514 25.571024 +v 56.207088 33.046658 29.944391 +v 55.226669 33.046658 30.133007 +v 54.155811 32.974182 31.521353 +v 54.125526 32.953144 31.870403 +v 50.501671 33.147514 29.396635 +v 54.306274 33.000874 31.056999 +v 54.423965 33.012627 30.842569 +v 54.735046 33.032036 30.466125 +v 54.640671 33.026978 30.566811 +v 54.923534 33.039387 30.309935 +v 55.130127 33.045006 30.178513 +v 55.351574 33.048801 30.074015 +v 55.482941 33.049877 30.031158 +v 72.564713 32.959675 28.216497 +v 72.604118 32.953144 28.315432 +v 72.446564 32.974182 28.002518 +v 72.513252 32.966003 28.123137 +v 72.302361 32.987988 27.805037 +v 72.365158 32.981972 27.891134 +v 75.218338 33.092384 25.540936 +v 72.207687 32.995258 27.704639 +v 72.052155 33.005993 27.559443 +v 71.828957 33.018517 27.398094 +v 71.642105 33.026978 27.296019 +v 71.517105 33.032036 27.237537 +v 70.553871 33.092384 26.438301 +v 71.284119 33.039387 27.162430 +v 70.936981 33.046658 27.110605 +v 70.799103 33.048801 27.102167 +v 72.729843 32.922829 28.785805 +v 72.716339 32.929462 28.680161 +v 72.747299 32.914238 28.922602 +v 72.734421 32.892925 29.272776 +v 72.747574 32.899254 29.166985 +v 72.515388 32.852936 29.967316 +v 72.449051 32.846298 30.088320 +v 72.232353 32.831951 30.364079 +v 71.742889 32.813923 30.752377 +v 71.521446 32.810127 30.856874 +v 71.288612 32.808216 30.932869 +v 57.575481 32.835857 33.120090 +v 57.999950 32.922829 31.619591 +v 68.947769 32.914238 29.653568 +v 58.017410 32.914238 31.756388 +v 68.998795 32.905785 29.781673 +v 58.017563 32.905785 31.894278 +v 69.089661 32.892925 29.973969 +v 69.156349 32.884747 30.094587 +v 69.300552 32.870937 30.292068 +v 69.395226 32.863670 30.392466 +v 57.876057 32.863670 32.608562 +v 57.638096 32.840412 33.033745 +v 69.773956 32.840412 30.699009 +v 69.960800 32.831951 30.801086 +v 57.502460 32.831951 33.197865 +v 70.085800 32.826893 30.859566 +v 70.187431 32.823685 30.892359 +v 57.325878 32.823685 33.366707 +v 70.318787 32.819542 30.934675 +v 57.408081 32.826893 33.298550 +v 57.219593 32.819542 33.454739 +v 70.665932 32.812271 30.986498 +v 56.791557 32.810127 33.690659 +v 56.558720 32.808216 33.766655 +v 54.507816 32.876957 33.039764 +v 54.183338 32.922829 32.353844 +v 54.268864 32.905785 32.615463 +v 56.073917 32.810127 33.828720 +v 55.724682 32.816372 33.794067 +v 55.588898 32.819542 33.768459 +v 55.044064 32.840412 33.532795 +v 54.927361 32.846298 33.459202 +v 54.665352 32.863670 33.226246 +v 47.791321 32.554409 23.248281 +v 48.639805 32.274055 27.658665 +v 47.329750 34.144943 21.907705 +v 47.370945 37.638145 22.121828 +v 48.502254 37.264343 28.002338 +v 48.698654 37.264343 27.964556 +v 47.567341 37.638145 22.084045 +v 48.443409 32.274055 27.696447 +v 69.065254 32.274055 23.729149 +v 67.933945 32.647858 17.848639 +v 69.124100 37.264343 24.035040 +v 69.320503 37.264343 23.997257 +v 68.189186 37.638145 18.116745 +v 69.261650 32.274055 23.691366 +v 67.992790 37.638145 18.154530 +v 68.130341 32.647858 17.810854 +v 59.409355 27.286600 8.877703 +v 55.492302 31.280785 7.401309 +v 55.574558 31.280876 7.596490 +v 55.372860 27.449877 6.990583 +v 55.496300 37.917774 7.632237 +v 55.570572 37.917866 7.808144 +v 55.531143 34.574375 7.603197 +v 55.739853 37.864441 8.207960 +v 55.700066 34.490608 8.001154 +v 61.077744 27.375963 7.098868 +v 61.134232 31.534855 7.321551 +v 61.127060 31.557924 7.355211 +v 61.165653 34.199467 7.484885 +v 61.200024 37.745140 7.734471 +v 56.505417 33.498474 8.885402 +v 56.646233 33.135204 8.950924 +v 56.489738 32.168861 8.803900 +v 56.142513 31.656748 8.452569 +v 56.272274 31.798721 8.581312 +v 56.432846 27.344353 8.508171 +v 55.975113 27.375963 8.080529 +v 56.553570 37.581589 9.135686 +v 56.316475 37.683620 8.918522 +v 56.170826 34.057674 8.599740 +v 56.297031 33.898132 8.710000 +v 55.313728 27.469414 6.683230 +v 55.359997 31.392776 6.923721 +v 55.436939 37.917618 7.323677 +v 58.218220 37.150532 9.707748 +v 57.562119 27.298674 9.036112 +v 57.679352 37.239975 9.645487 +v 56.969593 27.318205 8.831476 +v 58.184422 27.286600 9.113360 +v 55.894501 31.434967 8.144784 +v 56.005283 31.534855 8.308274 +v 56.024429 31.557924 8.336872 +v 56.097393 37.745140 8.716132 +v 56.055264 34.172634 8.497147 +v 58.924877 37.087070 9.660819 +v 60.630196 37.452759 8.683191 +v 60.826279 33.338730 8.107039 +v 60.777477 33.135204 8.156141 +v 60.432880 27.318205 8.165197 +v 60.749218 32.721592 8.161714 +v 61.236313 31.358046 5.882530 +v 61.296688 37.917618 6.196359 +v 61.060333 31.656748 7.506463 +v 61.157894 34.172634 7.515486 +v 60.075809 37.239975 9.184449 +v 59.958572 27.298674 8.575074 +v 59.525467 37.132675 9.481241 +v 61.278057 31.304075 6.099518 +v 61.220230 27.411655 6.489185 +v 61.352345 37.917866 6.695827 +v 61.308647 34.548508 6.701057 +v 61.304043 34.497074 6.906312 +v 61.343494 37.864441 7.129913 +v 61.293682 37.839470 7.341565 +v 61.210480 34.321148 7.305542 +v 61.207512 34.312927 7.317633 +v 61.215351 37.760574 7.670162 +v 61.222050 31.358620 6.923690 +v 61.191738 27.404522 6.611038 +v 61.200790 31.394100 7.019108 +v 60.864689 27.350676 7.552396 +v 60.811356 27.344353 7.665818 +v 60.875416 32.133430 7.943223 +v 60.932079 37.581589 8.293333 +v 61.012363 33.898132 7.802849 +v 60.883930 33.498474 8.043050 +v 61.071674 37.683620 8.003700 +v 55.154667 33.337154 5.943245 +v 55.204365 33.896751 6.201581 +v 55.229305 34.056538 6.331215 +v 55.289486 34.320305 6.644032 +v 54.950108 37.147907 4.879951 +v 55.164299 37.682098 5.993318 +v 55.147388 32.719955 5.905413 +v 55.154755 32.516430 5.943708 +v 55.166855 32.319458 6.006606 +v 55.204548 31.957125 6.202527 +v 55.000202 27.567686 5.140342 +v 55.229507 31.797485 6.332258 +v 55.324051 31.434301 6.823695 +v 61.058716 33.534252 4.872584 +v 61.046623 33.337154 4.809731 +v 60.525677 35.376511 2.101882 +v 60.584129 35.864510 2.405715 +v 61.039345 32.719955 4.771899 +v 61.075512 32.131989 4.959892 +v 61.121464 31.797485 5.198744 +v 61.096504 31.957125 5.069013 +v 61.150021 31.655691 5.347185 +v 61.189579 27.469414 5.552814 +v 61.216007 31.434301 5.690181 +v 61.121262 34.056538 5.197701 +v 60.746132 36.778572 3.247786 +v 61.149776 34.198410 5.345915 +v 60.842064 37.147907 3.746436 +v 61.181442 34.320305 5.510518 +v 60.945972 37.450668 4.286564 +v 61.056255 37.682098 4.859804 +v 61.252117 34.496571 5.877890 +v 61.215725 34.420193 5.688726 +v 61.219742 31.392776 5.796404 +v 55.343891 31.392776 6.926820 +v 55.297623 27.469414 6.686328 +v 55.396927 34.524712 7.115701 +v 55.380825 34.524712 7.118799 +v 44.786377 31.056692 15.568623 +v 48.252270 30.884907 17.704353 +v 45.306290 30.884907 18.271109 +v 44.413383 27.719242 12.877433 +v 47.231552 28.717300 12.398706 +v 44.285572 28.717300 12.965464 +v 47.480862 26.801964 29.574427 +v 47.982811 26.201115 28.784519 +v 47.594925 32.554409 23.286064 +v 47.526150 34.144943 21.869921 +v 66.210762 37.917587 5.186333 +v 61.326370 37.917694 6.350639 +v 66.291702 37.917820 5.650479 +v 55.466621 37.917694 7.477957 +v 50.989876 37.917587 8.114577 +v 51.086922 37.917820 8.575625 +v 65.612869 36.563549 2.078520 +v 50.391983 36.563549 5.006763 +v 65.911079 37.566383 3.628589 +v 50.690193 37.566383 6.556833 +v 66.139931 37.878059 4.818144 +v 50.919044 37.878059 7.746388 +v 65.464867 35.620510 1.309204 +v 50.243980 35.620510 4.237448 +v 66.376831 37.761543 6.673365 +v 61.207687 37.752857 7.702316 +v 61.185539 37.738213 7.764773 +v 66.265823 37.683620 7.004432 +v 51.387402 37.761543 9.557081 +v 51.613319 37.683620 9.823330 +v 66.023651 37.760330 4.213748 +v 50.802765 37.760330 7.141993 +v 65.704056 36.963242 2.552516 +v 50.483173 36.963242 5.480761 +v 65.803986 37.299286 3.071905 +v 50.583092 37.299286 6.000150 +v 65.531876 36.106518 1.657485 +v 50.310982 36.106518 4.585728 +v 50.383705 39.574478 28.783466 +v 50.382244 39.198650 28.775875 +v 50.472374 38.791084 29.244370 +v 48.883270 40.194908 20.984259 +v 48.775272 39.377975 20.422897 +v 48.773239 39.002335 20.412317 +v 48.785156 38.504982 20.474270 +v 48.820061 38.038948 20.655716 +v 48.823151 35.931602 20.671766 +v 48.888027 35.566311 21.008991 +v 49.266525 35.948097 22.976391 +v 49.352234 35.734871 23.421919 +v 49.442326 35.580185 23.890221 +v 49.535370 35.486481 24.373871 +v 49.629894 35.455254 24.865189 +v 50.459534 38.169350 29.177628 +v 50.312088 37.749374 28.411201 +v 50.399311 37.490997 28.864588 +v 50.347046 35.428085 28.592913 +v 49.570679 34.457073 24.557388 +v 49.724419 35.486977 25.356527 +v 49.817448 35.581158 25.840084 +v 49.907501 35.736313 26.308191 +v 50.274094 35.108337 28.213696 +v 45.775330 33.641586 4.829321 +v 46.322777 33.435703 7.674942 +v 46.337143 33.627991 7.749600 +v 46.081108 34.636631 6.418759 +v 46.245750 30.014559 7.274553 +v 46.308212 33.030170 7.599214 +v 46.313080 33.235359 7.624534 +v 46.308224 32.823364 7.599279 +v 46.313141 32.618195 7.624831 +v 46.322872 32.417946 7.675428 +v 46.337273 32.225723 7.750277 +v 46.356117 32.044556 7.848237 +v 46.379093 31.877304 7.967663 +v 46.435966 31.594851 8.263283 +v 46.468956 31.484156 8.434780 +v 46.504318 31.396173 8.618591 +v 46.541481 31.332344 8.811754 +v 46.579857 31.293713 9.011235 +v 46.618851 31.280830 9.213915 +v 46.660690 28.046349 9.431399 +v 47.226501 28.289183 12.372464 +v 46.657837 31.293900 9.416565 +v 46.733364 31.396793 9.809153 +v 46.768700 31.484911 9.992837 +v 47.331383 31.992538 12.917617 +v 47.072456 37.301643 11.571739 +v 46.924316 32.619797 10.801710 +v 47.172447 36.966125 12.091484 +v 46.914619 32.419456 10.751301 +v 47.263699 36.566910 12.565804 +v 47.312149 31.595062 12.817638 +v 46.696209 31.332771 9.616024 +v 46.801678 31.595802 10.164242 +v 46.831772 31.727734 10.320654 +v 46.858498 31.878563 10.459578 +v 46.881451 32.045918 10.578901 +v 47.454453 35.246040 13.557343 +v 47.344788 36.110298 12.987311 +v 47.414421 35.603493 13.349266 +v 47.857475 33.019241 15.652243 +v 48.426811 31.700232 18.611607 +v 46.148113 35.122639 6.767040 +v 46.203804 35.417557 7.056528 +v 46.266029 35.673157 7.379961 +v 46.333817 35.885487 7.732326 +v 46.406101 36.051147 8.108049 +v 46.481731 36.167564 8.501171 +v 46.559532 36.232880 8.905572 +v 46.598518 36.245964 9.108223 +v 46.677254 36.233185 9.517482 +v 46.755058 36.168274 9.921923 +v 46.830723 36.052254 10.315209 +v 46.768440 34.371017 9.991465 +v 46.801430 34.260307 10.162962 +v 46.831547 34.128571 10.319494 +v 46.858307 33.977905 10.458584 +v 46.881279 33.810654 10.578010 +v 46.900124 33.629436 10.675966 +v 46.914524 33.437218 10.750816 +v 46.924259 33.236969 10.801413 +v 46.929176 33.031796 10.826964 +v 50.587166 29.161577 29.841042 +v 51.102753 27.939177 32.521042 +v 51.643059 28.812696 35.329514 +v 51.275322 26.521614 33.418053 +v 52.135628 27.243563 37.889874 +v 51.936302 30.494560 36.853813 +v 50.464256 29.974739 29.202152 +v 51.162346 31.476397 32.830795 +v 51.182911 37.878670 8.969482 +v 55.802246 37.851955 8.296991 +v 66.348701 37.878670 6.051837 +v 61.318588 37.851955 7.235739 +v 75.183838 31.650961 25.361618 +v 76.486122 30.494560 32.130836 +v 75.746658 32.917820 28.287136 +v 70.606079 34.356834 1.566617 +v 70.872589 33.435703 2.951968 +v 70.886963 33.627991 3.026626 +v 70.905762 33.809242 3.124368 +v 70.928719 33.976646 3.243695 +v 71.031548 36.167564 3.778196 +v 70.955444 34.127472 3.382618 +v 70.985535 34.259357 3.539026 +v 70.900772 35.935432 3.098455 +v 71.109344 36.232880 4.182598 +v 71.053848 34.458382 3.894118 +v 71.188080 36.246071 4.591826 +v 71.227066 36.233185 4.794507 +v 71.304871 36.168274 5.198948 +v 71.380539 36.052254 5.592235 +v 71.452850 35.886955 5.968088 +v 71.520676 35.674999 6.320664 +v 71.582954 35.419697 6.644365 +v 71.638687 35.125118 6.934073 +v 71.687012 34.795830 7.185299 +v 70.673080 34.842842 1.914898 +v 70.764267 35.242531 2.388895 +v 70.325150 33.641586 0.106346 +v 70.858025 33.030170 2.876239 +v 70.858032 32.823364 2.876305 +v 70.862953 32.618195 2.901856 +v 70.872688 32.417946 2.952453 +v 70.887085 32.225723 3.027302 +v 70.610558 31.931894 1.589911 +v 70.928909 31.877304 3.244689 +v 70.955673 31.726589 3.383775 +v 70.985779 31.594851 3.540308 +v 71.018776 31.484156 3.711806 +v 71.054138 31.396173 3.895617 +v 71.091293 31.332344 4.088780 +v 71.129669 31.293713 4.288260 +v 71.168671 31.280830 4.490941 +v 71.207657 31.293900 4.693590 +v 71.246025 31.332771 4.893049 +v 71.283180 31.396793 5.086177 +v 71.318520 31.484911 5.269862 +v 71.727051 34.438377 7.393374 +v 71.464340 33.437218 6.027841 +v 71.474075 33.236969 6.078438 +v 71.478989 33.031796 6.103990 +v 71.479004 32.824989 6.104055 +v 71.474136 32.619797 6.078735 +v 71.464432 32.419456 6.028327 +v 72.295868 35.040855 10.350090 +v 72.696762 34.592869 12.433889 +v 71.450073 32.227169 5.953669 +v 71.431274 32.045918 5.855927 +v 72.936409 33.972191 13.679592 +v 71.408310 31.878563 5.736604 +v 71.381584 31.727734 5.597680 +v 73.184525 33.452927 14.969294 +v 71.351494 31.595802 5.441268 +v 73.439575 33.038315 16.295025 +v 72.084915 30.803101 9.253565 +v 73.699982 32.730942 17.648582 +v 73.964134 32.532646 19.021666 +v 74.230423 32.444660 20.405840 +v 74.497192 32.467533 21.792480 +v 74.762794 32.601105 23.173067 +v 75.025604 32.844612 24.539139 +v 75.136978 29.161577 25.118065 +v 76.430016 27.252514 31.839178 +v 76.192871 28.812696 30.606541 +v 73.640350 27.744471 17.338646 +v 59.737595 35.153580 11.238645 +v 57.033558 37.429771 9.417791 +v 57.383957 37.323380 9.547683 +v 57.948784 37.195251 9.676618 +v 66.152237 37.301643 7.901110 +v 60.313831 37.323380 8.984024 +v 65.636391 37.150532 8.280617 +v 63.723949 36.029697 9.904218 +v 59.561989 37.141602 9.461723 +v 59.482620 37.129417 9.494074 +v 59.182327 37.106617 9.583863 +v 58.879730 37.090370 9.664869 +v 52.760487 36.957199 11.028932 +v 59.495354 36.781719 9.979478 +v 61.001877 37.632607 8.148517 +v 60.781136 37.517174 8.488262 +v 56.435020 37.632607 9.027103 +v 53.517529 37.495701 9.940955 +v 63.791565 35.515163 10.255713 +v 48.386688 27.028641 15.206619 +v 61.211090 27.459644 5.708040 +v 61.226418 27.430767 6.176226 +v 61.205986 27.408089 6.550112 +v 61.134743 27.390244 6.854953 +v 60.971214 27.363319 7.325632 +v 60.838020 27.347515 7.609107 +v 60.622116 27.331280 7.915508 +v 60.195724 27.308439 8.370136 +v 62.185196 27.013065 12.806107 +v 59.683964 27.292637 8.726389 +v 59.169296 27.284966 8.950566 +v 58.869247 27.282921 9.041628 +v 58.559311 27.284145 9.081285 +v 58.246895 27.286190 9.108051 +v 57.960625 27.218948 10.260080 +v 57.265854 27.308439 8.933794 +v 56.701218 27.331280 8.669824 +v 52.922104 27.154799 12.275953 +v 56.203979 27.360157 8.294350 +v 55.343292 27.459644 6.836906 +v 55.795853 27.393810 7.823881 +v 51.655807 27.319469 9.833126 +v 52.696091 26.140705 28.863274 +v 52.477608 26.129791 29.083374 +v 52.356964 26.119545 29.273724 +v 52.320770 26.115250 29.350765 +v 53.619232 26.015087 30.735014 +v 53.580688 26.006310 30.885633 +v 53.538681 25.993240 31.106895 +v 53.519344 25.984016 31.261089 +v 53.514099 25.978874 31.346001 +v 53.514297 25.969343 31.501465 +v 53.548435 25.945717 31.880352 +v 53.564499 25.940407 31.963856 +v 53.528740 25.955399 31.726196 +v 50.701912 26.263660 27.241035 +v 51.045235 27.518551 6.702814 +v 68.942055 26.069374 26.901505 +v 68.835625 26.063675 27.014977 +v 68.781357 26.060287 27.080654 +v 68.690002 26.053646 27.206573 +v 68.569382 26.043402 27.396919 +v 68.494499 26.035927 27.533287 +v 68.458305 26.031631 27.610331 +v 65.226677 26.045692 28.002647 +v 65.188141 26.036915 28.153267 +v 65.168770 26.027691 28.307465 +v 65.168991 26.018158 28.462925 +v 65.156036 26.200050 25.498055 +v 65.188667 26.008476 28.617083 +v 73.143723 25.945717 28.110544 +v 73.159790 25.940407 28.194046 +v 73.179466 25.930725 28.348206 +v 73.193932 25.916780 28.572933 +v 73.194153 25.907249 28.728394 +v 73.188904 25.902105 28.813305 +v 73.169533 25.892883 28.967503 +v 73.127533 25.879814 29.188766 +v 73.088989 25.871037 29.339384 +v 73.036934 25.862686 29.485641 +v 72.979828 25.854492 29.630280 +v 72.943634 25.850197 29.707321 +v 74.179474 25.718853 31.612305 +v 74.088120 25.712212 31.738224 +v 73.981644 25.706511 31.851706 +v 73.861801 25.701836 31.951038 +v 71.952408 25.797098 30.764259 +v 71.877731 25.795456 30.805405 +v 71.736908 25.793043 30.871881 +v 71.594147 25.790958 30.933344 +v 71.446106 25.789745 30.981644 +v 71.185745 25.788862 31.046112 +v 70.920059 25.789745 31.082848 +v 70.764664 25.790958 31.092922 +v 70.609238 25.793043 31.088827 +v 70.453796 25.795456 31.079348 +v 70.369240 25.797098 31.068832 +v 70.216293 25.800669 31.040020 +v 66.496857 25.701836 33.367931 +v 70.064636 25.804543 31.005981 +v 69.706635 25.816748 30.875748 +v 63.728554 25.842720 31.602112 +v 68.333328 25.930725 29.280519 +v 68.403282 25.916780 29.494576 +v 65.285072 25.989264 28.911983 +v 68.497139 25.902105 29.715921 +v 68.572334 25.892883 29.851927 +v 68.693436 25.879814 30.041809 +v 65.225098 25.961918 29.369652 +v 63.656845 25.862686 31.290215 +v 63.644615 25.854492 31.426220 +v 63.608421 25.850197 31.503262 +v 69.359375 25.832478 30.685974 +v 69.490936 25.825836 30.769009 +v 69.565697 25.822449 30.809864 +v 57.482063 25.804543 33.426659 +v 59.748825 26.008476 29.663620 +v 58.429901 25.940407 31.027832 +v 58.449577 25.930725 31.181988 +v 58.464043 25.916780 31.406719 +v 58.464268 25.907249 31.562180 +v 58.459015 25.902105 31.647091 +v 58.439644 25.892883 31.801289 +v 58.397640 25.879814 32.022552 +v 58.359100 25.871037 32.173172 +v 58.018246 25.832478 32.867821 +v 57.926888 25.825836 32.993736 +v 57.872620 25.822449 33.059418 +v 57.766144 25.816748 33.172901 +v 57.601906 25.809219 33.327324 +v 69.916443 25.809219 30.958214 +v 57.222519 25.797098 33.598045 +v 64.145676 25.600410 35.474892 +v 57.147896 25.795456 33.639179 +v 57.007069 25.793043 33.705658 +v 56.864262 25.790958 33.767128 +v 56.716221 25.789745 33.815430 +v 56.455864 25.788862 33.879898 +v 56.190170 25.789745 33.916634 +v 55.879349 25.793043 33.922611 +v 55.639351 25.797098 33.902618 +v 54.020454 25.703117 35.747246 +v 53.810631 25.710648 35.664783 +v 53.640411 25.718853 35.563675 +v 54.055202 25.871037 33.001167 +v 53.842422 25.892883 32.685715 +v 53.603405 25.930725 32.114311 +v 51.837807 25.900763 32.942802 +v 53.673378 25.916780 32.328362 +v 53.730873 25.907249 32.472801 +v 53.767250 25.902105 32.549706 +v 53.963524 25.879814 32.875599 +v 54.157799 25.862686 33.117672 +v 53.520309 25.726330 35.464821 +v 54.761059 25.825836 33.602791 +v 55.486404 25.800669 33.873802 +v 55.723911 25.795456 33.913132 +v 56.034775 25.790958 33.926708 +v 73.104797 25.955399 27.960091 +v 72.567543 26.584049 17.807671 +v 73.034851 25.969343 27.746035 +v 72.977371 25.978874 27.601589 +v 72.940994 25.984016 27.524689 +v 72.865799 25.993240 27.388683 +v 72.744690 26.006310 27.198799 +v 72.653015 26.015087 27.073231 +v 72.550415 26.023438 26.956728 +v 72.443718 26.031631 26.843603 +v 72.381516 26.035927 26.785492 +v 72.261383 26.043402 26.686640 +v 72.078758 26.053646 26.554634 +v 71.947205 26.060287 26.471600 +v 71.872437 26.063675 26.430744 +v 71.731453 26.069374 26.364870 +v 71.521645 26.076904 26.282406 +v 71.373505 26.081579 26.234629 +v 71.221840 26.085455 26.200588 +v 71.068893 26.089024 26.171776 +v 70.984283 26.090666 26.161270 +v 70.828842 26.093081 26.151791 +v 70.673470 26.095165 26.147686 +v 70.518082 26.096378 26.157763 +v 69.158974 26.211733 24.537340 +v 69.010933 26.210518 24.585640 +v 68.870102 26.208103 24.652115 +v 68.738770 26.204535 24.735622 +v 69.106285 26.076904 26.747080 +v 67.398262 26.597212 18.587399 +v 68.084305 27.217953 8.328716 +v 65.597847 27.286371 7.690868 +v 61.040871 27.518551 4.779821 +v 59.709900 26.018158 29.513165 +v 59.652428 26.027691 29.368719 +v 59.577229 26.036915 29.232714 +v 59.485558 26.045692 29.107145 +v 57.713829 26.031631 29.677387 +v 57.651630 26.035927 29.619274 +v 57.531494 26.043402 29.520424 +v 57.348866 26.053646 29.388420 +v 57.217308 26.060287 29.305386 +v 57.142548 26.063675 29.264530 +v 57.001564 26.069374 29.198654 +v 56.791756 26.076904 29.116190 +v 56.643612 26.081579 29.068413 +v 56.491951 26.085455 29.034374 +v 56.339005 26.089024 29.005560 +v 56.254444 26.090666 28.995047 +v 56.099003 26.093081 28.985567 +v 55.943581 26.095165 28.981472 +v 55.788185 26.096378 28.991547 +v 54.145035 26.208767 27.474152 +v 54.070412 26.207127 27.515287 +v 57.247070 26.200050 27.019609 +v 54.395302 26.211733 27.377625 +v 55.114090 26.095165 29.141050 +v 54.496288 26.081579 29.481522 +v 52.531845 26.133177 29.017700 +v 69.957443 35.061996 10.766566 +v 66.685387 34.773247 16.106777 +v 62.306770 34.862022 15.500840 +v 59.330925 34.960144 14.472578 +v 56.864216 34.890060 16.090534 +v 50.802345 34.965748 16.021910 +v 66.124504 34.259998 24.587757 +v 63.323170 34.273285 24.909897 +v 54.735939 34.581673 21.530956 +v 58.492126 34.145573 27.922846 +v 58.730881 34.273285 25.793377 +v 55.755035 34.371407 24.765114 +v 65.089661 42.940437 21.855305 +v 65.018768 42.916645 21.486801 +v 64.496414 37.986919 18.771645 +v 65.488335 42.255898 23.927607 +v 64.648743 36.878342 19.563429 +v 65.007645 35.985512 21.428986 +v 64.858185 42.706097 20.652138 +v 65.543083 42.016376 24.212179 +v 65.344055 42.684242 23.177662 +v 64.783478 36.370399 20.263779 +v 64.437698 39.194977 18.466452 +v 64.847763 36.210472 20.597946 +v 64.937859 36.055786 21.066250 +v 65.543564 36.880680 24.214684 +v 64.466370 40.495289 18.615473 +v 64.583458 41.648415 19.224106 +v 64.535385 41.291088 18.974182 +v 64.772522 42.492416 20.206810 +v 64.925735 42.822464 21.003244 +v 65.184174 42.909203 22.346622 +v 64.535728 37.600716 18.975994 +v 64.470230 38.336449 18.635548 +v 64.437653 39.696312 18.466190 +v 64.186829 39.258270 19.809036 +v 64.186790 39.634270 19.808865 +v 64.194595 38.982391 19.849438 +v 64.208847 38.713844 19.923496 +v 64.194504 39.910194 19.848999 +v 64.229324 38.456863 20.029991 +v 64.255753 38.215500 20.167309 +v 64.208710 40.178814 19.922775 +v 64.287674 37.993568 20.333267 +v 64.324585 37.794567 20.525131 +v 64.229149 40.435905 20.029053 +v 64.365936 37.621628 20.740044 +v 64.411057 37.477478 20.974575 +v 64.459213 37.364395 21.224934 +v 64.509689 37.284168 21.487295 +v 64.561661 37.238045 21.757450 +v 64.595924 37.226723 21.935532 +v 64.648575 37.238281 22.209225 +v 64.700546 37.284657 22.479345 +v 64.750992 37.365158 22.741570 +v 64.799149 37.478485 22.991886 +v 64.844238 37.622871 23.226246 +v 64.885536 37.796024 23.440922 +v 64.922432 37.995224 23.632694 +v 64.954315 38.217316 23.798422 +v 64.255516 40.677399 20.166105 +v 64.287399 40.899498 20.331833 +v 64.324295 41.098694 20.523603 +v 64.365593 41.271851 20.738281 +v 64.410675 41.416233 20.972641 +v 64.458832 41.529564 21.222958 +v 64.509285 41.610062 21.485182 +v 64.561249 41.656445 21.755302 +v 64.595520 41.667942 21.933407 +v 64.648163 41.656673 22.207077 +v 64.700134 41.610554 22.477234 +v 64.750610 41.530323 22.739594 +v 64.798782 41.417244 22.989952 +v 64.843903 41.273090 23.224483 +v 64.885239 41.100151 23.439394 +v 64.922157 40.901154 23.631260 +v 64.954086 40.679214 23.797218 +v 64.980499 40.437859 23.934534 +v 65.000992 40.180882 24.041031 +v 65.015236 39.912327 24.115089 +v 65.023010 39.636444 24.155491 +v 64.980682 38.458817 23.935474 +v 65.001129 38.715904 24.041752 +v 65.015320 38.984528 24.115528 +v 65.023041 39.260452 24.155663 +v 65.608368 37.246300 24.551502 +v 65.479256 36.603928 23.880411 +v 65.333633 36.188622 23.123470 +v 65.266083 36.072254 22.772364 +v 65.721588 40.558273 25.140060 +v 65.745186 40.072754 25.262705 +v 64.501190 40.961510 18.796457 +v 64.712570 42.290787 19.895197 +v 65.253967 42.838928 22.709358 +v 64.446640 38.821968 18.512901 +v 64.591431 37.195278 19.265549 +v 64.444290 40.007515 18.500713 +v 64.850441 40.316677 17.965229 +v 64.703491 36.638817 19.848001 +v 65.690636 37.933212 24.979151 +v 65.173058 35.978073 22.288807 +v 65.600388 41.699448 24.510059 +v 65.695412 40.907799 25.003962 +v 64.648254 42.014042 19.560925 +v 65.408348 42.524315 23.511829 +v 65.754913 39.261070 25.313259 +v 65.743088 38.763664 25.251778 +v 65.725449 38.399429 25.160135 +v 65.656448 37.603630 24.801426 +v 65.419312 36.402306 23.568798 +v 65.102158 35.954281 21.920303 +v 65.656097 41.294003 24.799614 +v 65.753387 39.762222 25.305311 +v 66.341087 39.574478 25.713531 +v 67.550522 43.439468 21.413597 +v 67.034348 42.356140 18.730499 +v 67.272919 43.158401 19.970592 +v 67.187241 42.944725 19.525265 +v 66.868332 41.145340 17.867582 +v 66.833511 40.679123 17.686600 +v 66.969543 41.990517 18.393681 +v 68.302063 39.825142 25.320065 +v 67.362976 43.313560 20.438702 +v 67.456001 43.407745 20.922256 +v 67.107300 42.675888 19.109715 +v 68.778412 40.316677 17.209553 +v 66.913918 41.584785 18.104534 +v 67.645050 43.408234 21.904913 +v 67.738091 43.314533 22.388565 +v 68.066895 42.358826 24.097664 +v 67.828186 43.159847 22.856865 +v 68.268051 40.682858 25.143246 +v 68.233139 41.148895 24.961798 +v 67.993881 42.678200 23.718168 +v 68.291641 40.197338 25.265890 +v 68.131775 41.993538 24.434887 +v 68.187477 41.588097 24.724442 +v 67.913895 42.946617 23.302391 +v 65.674019 35.426590 22.246143 +v 65.723358 35.394489 22.502598 +v 65.735397 35.346016 22.565155 +v 65.757790 34.837643 22.681578 +v 65.761017 35.517830 22.698362 +v 65.843590 35.101654 23.127579 +v 66.269852 35.256065 25.343250 +v 66.416916 38.169350 26.107695 +v 66.382095 37.703129 25.926710 +v 66.492859 36.014885 26.502462 +v 66.269112 35.984661 25.339407 +v 66.428741 38.666756 26.169178 +v 64.613541 37.162949 16.733797 +v 64.730621 39.002335 17.342384 +v 64.742538 38.504982 17.404335 +v 64.760979 36.642624 17.500193 +v 64.816681 36.237186 17.789747 +v 64.889694 35.917809 18.169243 +v 64.975403 35.704582 18.614769 +v 65.068451 35.610878 19.098419 +v 64.732651 39.377975 17.352962 +v 64.840652 40.194908 17.914326 +v 68.306084 39.698807 25.340954 +v 66.799286 40.196674 17.508701 +v 69.246307 39.717827 19.641657 +v 69.254829 39.893875 19.685951 +v 69.267456 40.062881 19.751556 +v 69.283974 40.222176 19.837425 +v 69.304146 40.369247 19.942272 +v 69.401505 42.101158 20.448341 +v 69.327637 40.501785 20.064381 +v 69.354073 40.617699 20.201805 +v 69.295464 41.912445 19.897152 +v 69.414116 40.792618 20.513897 +v 69.465240 42.155445 20.779654 +v 69.529755 42.167023 21.114988 +v 69.564011 42.155701 21.293070 +v 69.627754 42.101746 21.624390 +v 69.689720 42.005928 21.946501 +v 69.748917 41.869766 22.254183 +v 69.804428 41.695389 22.542747 +v 69.855377 41.485569 22.807545 +v 69.900948 41.243603 23.044445 +v 69.940445 40.973309 23.249748 +v 68.936630 38.506760 18.031940 +v 68.665970 39.376205 16.625072 +v 69.030823 40.362648 18.521603 +v 69.076416 40.802090 18.758553 +v 69.246361 39.175495 19.641916 +v 69.141212 41.167717 19.095371 +v 69.183998 41.898907 19.317736 +v 69.242020 39.537514 19.619389 +v 69.242035 39.355782 19.619465 +v 69.254913 38.999493 19.686373 +v 69.267563 38.830551 19.752121 +v 69.284119 38.671345 19.838196 +v 69.327827 38.391960 20.065372 +v 68.940742 36.495640 18.053347 +v 68.775116 33.038315 17.192390 +v 69.151268 35.496304 19.147636 +v 69.414360 38.101585 20.515175 +v 69.315269 35.313622 20.000111 +v 69.480743 38.011539 20.860268 +v 69.482346 35.230610 20.868580 +v 69.549271 38.011723 21.216454 +v 69.649551 35.248451 21.737675 +v 69.615646 38.102104 21.561440 +v 69.646698 38.179569 21.722876 +v 69.675690 38.277023 21.873531 +v 69.702126 38.392933 22.010956 +v 69.725616 38.525467 22.133064 +v 69.745789 38.672543 22.237911 +v 70.106247 38.399223 24.111582 +v 69.774925 39.000851 22.389387 +v 69.783447 39.176891 22.433680 +v 69.973213 40.678951 23.420073 +v 69.998764 40.365173 23.552853 +v 70.016678 40.036911 23.645977 +v 70.027100 39.664719 23.700153 +v 69.787735 39.357204 22.455948 +v 70.204453 35.195450 24.622036 +v 70.357727 38.791084 25.418762 +v 70.414948 35.515854 25.716198 +v 70.361145 32.844612 25.436504 +v 70.522758 33.043049 26.276573 +v 67.908577 34.949272 12.688181 +v 68.032288 34.592869 13.331255 +v 68.271942 33.972191 14.576957 +v 68.520065 33.452927 15.866659 +v 47.518276 29.974739 29.768909 +v 49.062492 36.014885 29.855774 +v 49.523602 33.480202 29.605947 +v 60.444347 33.147514 27.483829 +v 66.600204 37.162949 16.351595 +v 66.577850 35.267597 16.235415 +v 44.535973 29.886997 14.267043 +v 45.046333 30.970798 16.919865 +v 45.691010 35.537415 20.270847 +v 46.452789 38.671345 24.230560 +v 46.180412 40.000202 22.814762 +v 45.829292 39.377975 20.989655 +v 46.072453 38.822670 22.253582 +v 46.415031 39.175495 24.034283 +v 46.410694 39.537514 24.011753 +v 46.199501 40.362648 22.913969 +v 46.224991 40.676567 23.046459 +v 46.257706 40.971096 23.216526 +v 46.410709 39.355782 24.011831 +v 46.436234 38.830551 24.144489 +v 46.472984 38.524376 24.335537 +v 46.496498 38.391960 24.457741 +v 46.522964 38.276184 24.595325 +v 46.551964 38.178879 24.746048 +v 46.583031 38.101585 24.907541 +v 46.615692 38.045509 25.077320 +v 46.649422 38.011539 25.252636 +v 47.111088 35.573845 27.652359 +v 46.717945 38.011723 25.608820 +v 46.751671 38.045860 25.784130 +v 46.784313 38.102104 25.953808 +v 47.193069 35.685493 28.078493 +v 47.196854 39.573856 28.098166 +v 47.046555 42.946617 27.316921 +v 46.952118 39.176891 26.826046 +v 47.126541 42.678200 27.732697 +v 47.187263 39.306942 28.048302 +v 47.199551 42.358826 28.112190 +v 46.930977 38.831844 26.716148 +v 47.264427 41.993538 28.449417 +v 46.914459 38.672543 26.630280 +v 47.320133 41.588097 28.738972 +v 46.894287 38.525467 26.525433 +v 47.365799 41.148895 28.976326 +v 46.870792 38.392933 26.403322 +v 47.400703 40.682858 29.157772 +v 45.480831 31.700232 19.178362 +v 47.424301 40.197338 29.280418 +v 46.844353 38.277023 26.265900 +v 45.878170 27.331514 21.243702 +v 47.526398 38.791084 29.811127 +v 46.297134 41.241596 23.421474 +v 46.342674 41.483795 23.658192 +v 46.393585 41.693878 23.922800 +v 46.449059 41.868538 24.211163 +v 46.508240 42.005016 24.518784 +v 46.570171 42.101158 24.840708 +v 46.633911 42.155445 25.172020 +v 46.668175 42.166943 25.350122 +v 46.732685 42.155701 25.685436 +v 46.796425 42.101746 26.016754 +v 46.858391 42.005928 26.338867 +v 46.815136 40.715843 26.114021 +v 46.844131 40.618538 26.264744 +v 46.870602 40.502762 26.402330 +v 46.894112 40.370346 26.524532 +v 46.914307 40.223373 26.629509 +v 46.930866 40.064163 26.715582 +v 46.943516 39.895233 26.781330 +v 46.952072 39.719231 26.825788 +v 46.956390 39.538940 26.848240 +v 48.911728 39.698807 29.072104 +v 47.415627 40.193138 21.295424 +v 47.675732 37.295708 20.000786 +v 47.628216 33.266563 19.753813 +v 48.156170 43.439468 25.144745 +v 47.639988 42.356140 22.461651 +v 48.477951 43.067505 26.817360 +v 47.878563 43.158401 23.701742 +v 47.792885 42.944725 23.256416 +v 47.473976 41.145340 21.598732 +v 47.439159 40.679123 21.417747 +v 47.575188 41.990517 22.124830 +v 48.343739 43.314533 26.119713 +v 48.907711 39.825142 29.051216 +v 50.346680 40.682858 28.591015 +v 47.968620 43.313560 24.169849 +v 48.061646 43.407745 24.653408 +v 47.712944 42.675888 22.840866 +v 48.893063 40.316677 21.035164 +v 47.519562 41.584785 21.835682 +v 48.250694 43.408234 25.636063 +v 50.145531 42.358826 27.545433 +v 49.906822 43.159847 26.304638 +v 50.072521 42.678200 27.165939 +v 50.370277 40.197338 28.713661 +v 50.210403 41.993538 27.882660 +v 50.266113 41.588097 28.172215 +v 50.311775 41.148895 28.409569 +v 49.991524 42.940437 24.759933 +v 50.086044 42.909203 25.251251 +v 50.155830 42.838928 25.613989 +v 49.550606 36.878342 22.468058 +v 50.930565 39.260826 27.656063 +v 50.445427 36.880680 27.119312 +v 50.801670 41.356995 26.986065 +v 50.202412 36.119190 25.856136 +v 50.381119 36.603928 26.785040 +v 50.577362 37.762726 27.805096 +v 50.627316 38.399429 28.064766 +v 49.674377 42.492416 23.111441 +v 49.437592 37.600716 21.880623 +v 50.310211 42.524315 26.416458 +v 50.612438 40.737396 27.987434 +v 49.955616 39.910194 22.588322 +v 49.946747 39.537140 22.542234 +v 49.969810 40.178814 22.662100 +v 49.990257 40.435905 22.768379 +v 49.947929 39.258270 22.548363 +v 50.016624 40.677399 22.905432 +v 50.048508 40.899498 23.071156 +v 49.955704 38.982391 22.588764 +v 50.085400 41.098694 23.262928 +v 50.126701 41.271851 23.477606 +v 49.969948 38.713844 22.662821 +v 50.171787 41.416233 23.711967 +v 50.219940 41.529564 23.962282 +v 50.270393 41.610062 24.224506 +v 50.322357 41.656445 24.494629 +v 50.375011 41.667992 24.768320 +v 50.409271 41.656673 24.946400 +v 50.461243 41.610554 25.216558 +v 50.511719 41.530323 25.478918 +v 50.559883 41.417244 25.729279 +v 50.605003 41.273090 25.963810 +v 50.646351 41.100151 26.178719 +v 50.576584 40.370346 25.816086 +v 50.715187 40.679214 26.536543 +v 50.741608 40.437859 26.673859 +v 49.990437 38.456863 22.769318 +v 50.016853 38.215500 22.906635 +v 50.048782 37.993568 23.072594 +v 50.085693 37.794567 23.264458 +v 50.127037 37.621628 23.479366 +v 50.172157 37.477478 23.713902 +v 50.220322 37.364395 23.964260 +v 50.270798 37.284168 24.226620 +v 50.304527 37.250198 24.401936 +v 50.357033 37.226723 24.674858 +v 50.409683 37.238281 24.948549 +v 50.461651 37.284657 25.218670 +v 50.512100 37.365158 25.480896 +v 50.560257 37.478485 25.731211 +v 50.605343 37.622871 25.965572 +v 50.646645 37.796024 26.180248 +v 50.683540 37.995224 26.372021 +v 50.715420 38.217316 26.537746 +v 50.741787 38.458817 26.674799 +v 50.762230 38.715904 26.781078 +v 50.776428 38.984528 26.854855 +v 50.762093 40.180882 26.780357 +v 50.776344 39.912327 26.854416 +v 50.784111 39.636444 26.894815 +v 50.638874 39.357204 26.139870 +v 50.532898 37.391502 27.573999 +v 49.485321 41.648415 22.128735 +v 49.760056 42.706097 23.556768 +v 49.339561 39.194977 21.371080 +v 49.372093 38.336449 21.540176 +v 49.493294 37.195278 22.170177 +v 49.605350 36.638817 22.752630 +v 49.716534 36.279732 23.330555 +v 50.366314 42.510319 26.046408 +v 50.659489 41.160637 27.570328 +v 50.039612 35.954376 25.009912 +v 50.321167 36.402306 26.473427 +v 50.400372 37.067734 27.546759 +v 50.644947 38.763664 28.156406 +v 49.368233 40.495289 21.520103 +v 49.614429 42.290787 22.799826 +v 49.348503 38.821968 21.417532 +v 49.874199 36.009033 24.150084 +v 50.418999 42.145252 26.981943 +v 50.653732 39.887733 28.202087 +v 50.747757 39.657757 28.029158 +v 49.403049 40.961510 21.701086 +v 49.338776 39.633644 21.366978 +v 49.550121 42.014042 22.465553 +v 49.398277 37.986919 21.676275 +v 49.437241 41.291088 21.878811 +v 49.920631 42.916645 24.391430 +v 49.827599 42.822464 23.907873 +v 49.346153 40.007515 21.405342 +v 71.016159 34.956318 12.079202 +v 71.431984 32.480591 22.621675 +v 70.634117 32.688740 18.474390 +v 70.898766 32.508747 19.850039 +v 71.165276 32.439228 21.235346 +v 71.697258 32.632572 24.000555 +v 73.622032 33.026604 25.624420 +v 67.059769 40.894501 21.509285 +v 48.524654 40.894501 25.075130 +v 65.968369 39.386066 20.247313 +v 48.866055 39.325497 23.541418 +v 67.332733 39.538940 22.928169 +v 49.411007 39.569225 26.374060 +v 66.885178 40.564144 20.601799 +v 48.337540 40.501785 24.102524 +v 66.885391 38.329666 20.602873 +v 48.325188 38.454250 24.038315 +v 65.991806 38.858006 20.369154 +v 48.893658 38.803097 23.684891 +v 67.220482 40.618538 22.344675 +v 49.303757 40.600708 25.816574 +v 66.943146 40.759056 20.903112 +v 48.424019 40.792618 24.552040 +v 65.983292 39.922745 20.324879 +v 48.264740 39.893875 23.724094 +v 65.974068 39.747639 20.276953 +v 48.256218 39.717827 23.679800 +v 66.013733 40.247807 20.483109 +v 48.293877 40.222176 23.875568 +v 66.928314 38.178879 20.825979 +v 49.001919 38.193485 24.247637 +v 66.085625 38.258358 20.856817 +v 48.973309 38.294010 24.098902 +v 66.992035 38.045509 21.157251 +v 49.065121 38.053043 24.576147 +v 66.849335 38.524376 20.415468 +v 65.979828 39.028351 20.306885 +v 48.264816 38.999493 23.724516 +v 67.328415 39.719231 22.905720 +v 49.405975 39.749039 26.347891 +v 66.991776 40.848862 21.155872 +v 48.456665 40.848862 24.721718 +v 67.025497 40.883003 21.331181 +v 48.490391 40.883003 24.897026 +v 48.363979 40.617699 24.239948 +v 66.104713 40.700520 20.956072 +v 48.392960 40.715153 24.390606 +v 65.969078 39.567806 20.250975 +v 48.865322 39.507221 23.537600 +v 65.996582 40.090347 20.393955 +v 48.277359 40.062881 23.789700 +v 66.034492 40.392639 20.590998 +v 48.314049 40.369247 23.980415 +v 66.146385 38.090427 21.172623 +v 49.032681 38.112743 24.407526 +v 67.042831 38.000175 21.421257 +v 49.098713 38.015327 24.750772 +v 66.007729 38.696960 20.451933 +v 48.910847 38.645729 23.774256 +v 65.971977 39.205303 20.266043 +v 48.871090 39.145687 23.567587 +v 67.094025 40.883179 21.687366 +v 48.558914 40.883179 25.253212 +v 67.246948 40.502762 22.482262 +v 49.329762 40.481998 25.951767 +v 66.448647 38.502075 22.743797 +v 49.352921 38.548859 26.072130 +v 67.307213 40.064163 22.795513 +v 49.383404 40.091618 26.230585 +v 66.247437 38.000233 21.697876 +v 48.524918 38.000221 25.076492 +v 67.290657 40.223373 22.709440 +v 49.366215 40.248989 26.141220 +v 67.234619 38.330574 22.418133 +v 49.329952 38.413719 25.952730 +v 66.347664 38.113293 22.218864 +v 49.233967 38.090916 25.453814 +v 67.319870 39.895233 22.861263 +v 49.396725 39.924091 26.299814 +v 67.160416 40.793137 22.032459 +v 48.625305 40.793137 25.598307 +v 67.191483 40.715843 22.193954 +v 49.275143 40.701237 25.667837 +v 67.127754 40.849213 21.862682 +v 48.592644 40.849213 25.428528 +v 67.270462 40.370346 22.604462 +v 66.514061 39.326916 23.083822 +v 48.796566 39.266331 26.488522 +v 66.509064 39.147079 23.057844 +v 48.671680 38.223469 25.839373 +v 66.378418 38.194202 22.378723 +v 49.265331 38.164936 25.616827 +v 67.128021 38.045860 21.864059 +v 49.201099 38.038300 25.282965 +v 66.281654 38.015545 21.875753 +v 49.167236 38.007904 25.106951 +v 67.307327 38.831844 22.796080 +v 48.779526 38.914249 26.399937 +v 66.469406 38.646912 22.851690 +v 49.372509 38.698177 26.173935 +v 66.499847 38.971985 23.009918 +v 49.400349 39.029720 26.318655 +v 66.232704 34.574276 5.343794 +v 66.250427 34.574375 5.540986 +v 51.084633 34.574375 8.458632 +v 51.027924 34.574276 8.268940 +v 65.949280 33.133568 3.827172 +v 55.146141 33.030170 5.898943 +v 60.991566 31.791014 7.665103 +v 61.027931 31.720028 7.581254 +v 56.207394 31.727734 8.516941 +v 61.135521 34.127472 5.271808 +v 50.824596 34.127472 7.255457 +v 66.006470 31.957125 4.124418 +v 55.217026 31.877304 6.267393 +v 61.052761 32.417946 4.841643 +v 55.160805 32.417946 5.975157 +v 66.125687 34.420193 4.744131 +v 50.923000 34.458382 7.766957 +v 61.067032 33.627991 4.915816 +v 55.175076 33.627991 6.049330 +v 61.108791 33.976646 5.132885 +v 50.797867 33.976646 7.116533 +v 61.198849 31.484156 5.600996 +v 55.306892 31.484156 6.734510 +v 61.067162 32.225723 4.916492 +v 55.175205 32.225723 6.050006 +v 61.043030 32.618195 4.791047 +v 55.151070 32.618195 5.924561 +v 66.202370 33.629436 6.962537 +v 56.448875 33.629436 8.838947 +v 60.956619 31.878563 7.747334 +v 56.328194 31.878563 8.637766 +v 66.172409 34.510643 4.986992 +v 61.273354 34.536453 6.031681 +v 55.405556 34.536453 7.160548 +v 50.987167 34.548199 8.057079 +v 50.960152 34.522385 7.960084 +v 66.211365 34.561234 5.232846 +v 55.433598 34.561234 7.306308 +v 61.165611 34.259357 5.428216 +v 50.854687 34.259357 7.411866 +v 61.198586 34.370247 5.599622 +v 50.887661 34.370247 7.583271 +v 61.052670 33.435703 4.841157 +v 55.160713 33.435703 5.974671 +v 61.042969 33.235359 4.790749 +v 55.151016 33.235359 5.924263 +v 61.085835 33.809242 5.013558 +v 50.774910 33.809242 6.997207 +v 61.255272 31.332344 5.981068 +v 55.395523 31.332344 7.108386 +v 61.165855 31.594851 5.429498 +v 50.839096 31.655691 7.330834 +v 61.135742 31.726589 5.272964 +v 55.243786 31.726589 6.406479 +v 61.225929 31.413540 5.741743 +v 61.228027 31.375412 5.839467 +v 64.514832 31.369623 5.222026 +v 55.333969 31.413540 6.875257 +v 55.368279 31.375412 6.966784 +v 52.414326 31.369623 7.549962 +v 61.276142 31.305359 6.089562 +v 61.276070 31.292431 6.194254 +v 55.455307 31.292431 7.314072 +v 55.416393 31.305359 7.216879 +v 61.086006 32.044556 5.014452 +v 55.194054 32.044556 6.147966 +v 61.038113 32.823364 4.765495 +v 55.146156 32.823364 5.899009 +v 60.764568 33.031796 8.165266 +v 51.803696 32.928387 9.895829 +v 60.887939 33.517090 8.036115 +v 60.855103 33.418602 8.075045 +v 56.499119 33.517090 8.880450 +v 56.544056 33.418602 8.904418 +v 66.226974 33.810654 6.856220 +v 56.350979 33.810654 8.756198 +v 66.280647 34.128571 6.577813 +v 66.242142 34.057674 6.662187 +v 56.113045 34.115154 8.548443 +v 56.045982 34.186050 8.484377 +v 66.296783 34.371017 6.234537 +v 55.870380 34.371017 8.240402 +v 60.900528 32.045918 7.881865 +v 51.684113 32.133430 9.711477 +v 60.792236 32.419456 8.081479 +v 56.604824 32.419456 8.887068 +v 66.113503 32.721592 7.129715 +v 51.801254 32.721592 9.883153 +v 61.155338 31.484911 7.225088 +v 55.949890 31.484911 8.226529 +v 61.211418 31.376360 6.971399 +v 61.188618 31.414534 7.073867 +v 55.835308 31.396793 8.058090 +v 61.268269 31.293900 6.605762 +v 55.615234 31.293900 7.693312 +v 61.272095 31.280830 6.394876 +v 55.533432 31.280830 7.498899 +v 60.801880 33.236969 8.131590 +v 56.614464 33.236969 8.937180 +v 61.074768 34.028671 7.680733 +v 61.036625 33.948902 7.755341 +v 56.233929 33.977905 8.654870 +v 66.288780 34.260307 6.413921 +v 61.186584 34.256195 7.401259 +v 55.982620 34.260307 8.396654 +v 66.286667 34.522789 5.845553 +v 51.163979 34.522789 8.754906 +v 66.302574 34.458981 6.042809 +v 61.280937 34.455750 7.017253 +v 55.756145 34.455750 8.080130 +v 51.222404 34.458981 8.943981 +v 61.310783 34.561440 6.595968 +v 55.572117 34.561440 7.699992 +v 60.841263 32.244884 8.003099 +v 60.871834 32.151146 7.952385 +v 56.530216 32.244884 8.832472 +v 56.483009 32.151146 8.796721 +v 61.130646 31.546391 7.338381 +v 61.093697 31.607336 7.430837 +v 56.014854 31.546391 8.322573 +v 56.083473 31.607336 8.394720 +v 61.266319 31.309143 6.719496 +v 61.244133 31.334991 6.825958 +v 55.659241 31.309143 7.798204 +v 55.719345 31.334991 7.888835 +v 50.692825 29.737175 4.871002 +v 46.215881 29.235327 5.986284 +v 69.947617 29.737175 1.166701 +v 60.688461 29.737175 2.948009 +v 54.613262 33.641586 3.129050 +v 60.505219 33.641586 1.995536 +v 76.120895 26.923138 33.255138 +v 74.296257 27.851955 29.481903 +v 72.385330 27.945814 28.318336 +v 72.319244 27.958984 28.116190 +v 72.228294 27.971840 27.923962 +v 72.113907 27.984182 27.744629 +v 71.977898 27.995813 27.581039 +v 71.822403 28.006550 27.435783 +v 71.649887 28.016228 27.311081 +v 71.463081 28.024693 27.208948 +v 71.264900 28.031803 27.131058 +v 71.058472 28.037455 27.078587 +v 70.847054 28.041557 27.052334 +v 70.634003 28.044043 27.052769 +v 71.147552 28.113617 25.818951 +v 70.422714 28.044874 27.079849 +v 69.059708 27.945814 28.958130 +v 69.046066 27.958984 28.745895 +v 69.059204 27.971840 28.533642 +v 69.098892 27.984182 28.324667 +v 69.164490 27.995813 28.122292 +v 69.254990 28.006550 27.929712 +v 69.368919 28.016228 27.749901 +v 69.504501 28.024693 27.585747 +v 69.659637 28.031803 27.439884 +v 69.831863 28.037455 27.314566 +v 70.018402 28.041557 27.211752 +v 70.216408 28.044043 27.133106 +v 72.439148 27.919369 28.739426 +v 72.426010 27.906513 28.951679 +v 72.386322 27.894171 29.160656 +v 72.320724 27.882540 29.363029 +v 72.230225 27.871803 29.555611 +v 72.116295 27.862123 29.735420 +v 71.980713 27.853661 29.899574 +v 71.825577 27.846548 30.045439 +v 71.653351 27.840897 30.170757 +v 71.466766 27.836796 30.273579 +v 71.268753 27.834311 30.352226 +v 71.062500 27.833479 30.405472 +v 70.851166 27.834311 30.432564 +v 67.698425 27.939177 29.328310 +v 69.099884 27.932537 29.166986 +v 69.165970 27.919369 29.369133 +v 72.203445 27.764736 31.307426 +v 70.638107 27.836796 30.432999 +v 70.426743 27.840897 30.406734 +v 70.220314 27.846548 30.354265 +v 70.022133 27.853661 30.276375 +v 69.835327 27.862123 30.174240 +v 69.662811 27.871803 30.049538 +v 69.507317 27.882540 29.904284 +v 69.371307 27.894171 29.740694 +v 69.256920 27.906513 29.561359 +v 67.182846 29.161577 26.648310 +v 68.410538 30.035097 29.324543 +v 74.056992 30.035097 28.238258 +v 72.954063 28.962406 31.239151 +v 68.927895 28.962406 32.013718 +v 71.274086 28.064154 31.505253 +v 68.559402 29.311287 26.393002 +v 70.218193 28.413034 26.016777 +v 71.898178 29.311287 25.750675 +v 59.056892 27.939177 30.990797 +v 57.655434 27.945814 31.152121 +v 57.589355 27.958984 30.949974 +v 57.498402 27.971840 30.757748 +v 57.384010 27.984182 30.578415 +v 57.248009 27.995813 30.414824 +v 57.092514 28.006550 30.269569 +v 56.919998 28.016228 30.144867 +v 56.733192 28.024693 30.042732 +v 56.535011 28.031803 29.964842 +v 56.328579 28.037455 29.912373 +v 56.117161 28.041557 29.886118 +v 55.904106 28.044043 29.886555 +v 55.692818 28.044874 29.913635 +v 54.551880 28.113617 29.011681 +v 55.486565 28.044043 29.966881 +v 54.329819 27.945814 31.791914 +v 54.316181 27.958984 31.579679 +v 54.329308 27.971840 31.367428 +v 54.368988 27.984182 31.158455 +v 54.434601 27.995813 30.956078 +v 54.525097 28.006550 30.763496 +v 54.639030 28.016228 30.583687 +v 54.774609 28.024693 30.419533 +v 54.929749 28.031803 30.273668 +v 55.101974 28.037455 30.148350 +v 55.288559 28.041557 30.045528 +v 57.695614 27.932537 31.360977 +v 57.709255 27.919369 31.573212 +v 57.696117 27.906513 31.785465 +v 57.656433 27.894171 31.994438 +v 57.590836 27.882540 32.196815 +v 57.500336 27.871803 32.389397 +v 57.386406 27.862123 32.569206 +v 57.250824 27.853661 32.733360 +v 57.095688 27.846548 32.879223 +v 56.923462 27.840897 33.004539 +v 56.736877 27.836796 33.107365 +v 56.538868 27.834311 33.186012 +v 56.332615 27.833479 33.239258 +v 56.121326 27.834311 33.266338 +v 55.908272 27.836796 33.266777 +v 54.369999 27.932537 32.000771 +v 54.436081 27.919369 32.202915 +v 54.527027 27.906513 32.395145 +v 54.641411 27.894171 32.574478 +v 54.777424 27.882540 32.738068 +v 55.607769 27.764736 34.500156 +v 55.696854 27.840897 33.240520 +v 55.490425 27.846548 33.188049 +v 55.292240 27.853661 33.110161 +v 55.105431 27.862123 33.008026 +v 54.932915 27.871803 32.883324 +v 58.394215 30.035097 31.251516 +v 52.747757 30.035097 32.337799 +v 53.829506 29.311287 29.226784 +v 57.855675 29.311287 28.452217 +v 55.488300 28.413034 28.850563 +v 59.597198 28.812696 33.799271 +v 58.224174 28.962406 34.072937 +v 56.544193 28.064154 34.339039 +v 54.885399 28.962406 34.715263 +v 71.292938 28.057924 31.603260 +v 70.199333 28.419264 25.918770 +v 68.942963 30.537178 28.386755 +v 68.562332 30.362362 26.408234 +v 69.423767 30.378311 30.885975 +v 68.996002 30.219070 28.662430 +v 69.535141 30.191223 31.464848 +v 69.624710 28.959290 31.930481 +v 72.873917 30.191223 30.822521 +v 70.337189 30.477804 26.635292 +v 69.659355 29.816544 26.111471 +v 71.901108 30.362362 25.765907 +v 72.281738 30.537178 27.744431 +v 72.334778 30.219070 28.020103 +v 72.974686 29.105885 31.346336 +v 72.762543 30.378311 30.243649 +v 72.457283 30.627293 28.692375 +v 72.470924 30.614124 28.904610 +v 72.457787 30.601269 29.116861 +v 72.418106 30.588924 29.325836 +v 72.352501 30.577293 29.528212 +v 72.262001 30.566557 29.720791 +v 72.148071 30.556877 29.900600 +v 72.012497 30.548416 30.064758 +v 71.857361 30.541304 30.210621 +v 71.685135 30.535652 30.335938 +v 71.498550 30.531551 30.438761 +v 71.300537 30.529064 30.517406 +v 71.094284 30.528233 30.570656 +v 70.207520 30.528126 30.742981 +v 70.669891 30.531551 30.598179 +v 70.458519 30.535652 30.571915 +v 70.252090 30.541304 30.519445 +v 70.053909 30.548416 30.441555 +v 69.867096 30.556877 30.339422 +v 69.694580 30.566557 30.214722 +v 69.539093 30.577293 30.069466 +v 69.403091 30.588924 29.905874 +v 69.288696 30.601269 29.726540 +v 69.197739 30.614124 29.534313 +v 69.131668 30.627293 29.332167 +v 72.417099 30.640570 28.483517 +v 72.351028 30.653740 28.281372 +v 72.260071 30.666595 28.089146 +v 72.145676 30.678936 27.909809 +v 72.009674 30.690569 27.746220 +v 71.854187 30.701305 27.600964 +v 71.681671 30.710983 27.476261 +v 71.494858 30.719448 27.374128 +v 71.296677 30.726559 27.296238 +v 71.090248 30.732208 27.243767 +v 70.878830 30.736313 27.217514 +v 70.665771 30.738798 27.217949 +v 70.454483 30.739630 27.245029 +v 70.453842 30.739841 27.241695 +v 70.248184 30.738798 27.298286 +v 70.050179 30.736313 27.376934 +v 69.863647 30.732208 27.479748 +v 69.691414 30.726559 27.605064 +v 69.536270 30.719448 27.750927 +v 69.400696 30.710983 27.915085 +v 69.286766 30.701305 28.094894 +v 69.196274 30.690569 28.287472 +v 69.130669 30.678936 28.489849 +v 69.090981 30.666595 28.698824 +v 69.077843 30.653740 28.911076 +v 69.091484 30.640570 29.123310 +v 71.007957 30.540230 27.122408 +v 56.563049 28.057924 34.437046 +v 55.469444 28.419264 28.752552 +v 54.213074 30.537178 31.220539 +v 53.832436 30.362362 29.242018 +v 54.693878 30.378311 33.719757 +v 54.266106 30.219070 31.496214 +v 54.805244 30.191223 34.298630 +v 54.902679 29.357473 34.805073 +v 58.144020 30.191223 33.656307 +v 55.607292 30.477804 29.469078 +v 54.929462 29.816544 28.945257 +v 57.158852 29.314400 28.535456 +v 57.284344 30.324982 29.187744 +v 57.551849 30.537178 30.578217 +v 57.814846 30.099600 31.945259 +v 58.244793 29.105885 34.180122 +v 58.032654 30.378311 33.077431 +v 57.727394 30.627293 31.526159 +v 57.741032 30.614124 31.738392 +v 57.727894 30.601269 31.950645 +v 57.688210 30.588924 32.159622 +v 57.622612 30.577293 32.362000 +v 57.532112 30.566557 32.554577 +v 57.418182 30.556877 32.734386 +v 57.282600 30.548416 32.898544 +v 57.127464 30.541304 33.044403 +v 56.955238 30.535652 33.169724 +v 56.768654 30.531551 33.272545 +v 56.570648 30.529064 33.351189 +v 56.364391 30.528233 33.404442 +v 55.477631 30.528126 33.576767 +v 55.940048 30.531551 33.431953 +v 55.728630 30.535652 33.405701 +v 55.522202 30.541304 33.353230 +v 55.324017 30.548416 33.275337 +v 55.137207 30.556877 33.173206 +v 54.964695 30.566557 33.048508 +v 54.809204 30.577293 32.903252 +v 54.673187 30.588924 32.739662 +v 54.558804 30.601269 32.560326 +v 54.467861 30.614124 32.368095 +v 54.401779 30.627293 32.165955 +v 57.687210 30.640570 31.317303 +v 57.621132 30.653740 31.115156 +v 57.530182 30.666595 30.922928 +v 57.415791 30.678936 30.743595 +v 57.279785 30.690569 30.580006 +v 57.124294 30.701305 30.434750 +v 56.951782 30.710983 30.310047 +v 56.764969 30.719448 30.207914 +v 56.566788 30.726559 30.130024 +v 56.360359 30.732208 30.077553 +v 56.148941 30.736313 30.051300 +v 55.935886 30.738798 30.051735 +v 55.724598 30.739630 30.078815 +v 55.723957 30.739841 30.075481 +v 55.518341 30.738798 30.132063 +v 55.320335 30.736313 30.210709 +v 55.133751 30.732208 30.313532 +v 54.961525 30.726559 30.438850 +v 54.806385 30.719448 30.584713 +v 54.670807 30.710983 30.748867 +v 54.556877 30.701305 30.928679 +v 54.466377 30.690569 31.121258 +v 54.400768 30.678936 31.323635 +v 54.361088 30.666595 31.532608 +v 54.347961 30.653740 31.744860 +v 54.361595 30.640570 31.957096 +v 56.278065 30.540230 29.956192 +v 72.420639 30.939987 28.501871 +v 72.379440 27.446785 28.287746 +v 69.135193 30.926712 29.350521 +v 69.094002 27.433510 29.136396 +v 71.056618 27.334450 30.374886 +v 71.097809 30.827650 30.589008 +v 69.742195 27.617165 30.102001 +v 69.870636 30.856297 30.357777 +v 69.363037 27.517200 27.719313 +v 69.339844 30.856140 28.010603 +v 69.825974 27.538425 27.283978 +v 69.867172 31.031628 27.498100 +v 69.365425 27.395142 29.710104 +v 69.406616 30.888344 29.924229 +v 71.052582 27.538425 27.047997 +v 71.093781 31.031628 27.262123 +v 71.457199 27.525665 27.178358 +v 71.498390 31.018864 27.392483 +v 69.093002 27.485153 28.294079 +v 69.134201 30.978355 28.508202 +v 69.653748 27.532776 27.409294 +v 69.694946 31.025976 27.623417 +v 70.012512 27.542528 27.181164 +v 70.053711 31.035728 27.395287 +v 71.819687 27.347519 30.014851 +v 71.860886 30.840721 30.228973 +v 70.420860 27.341869 30.376144 +v 70.462051 30.835072 30.590271 +v 70.016243 27.354631 30.245785 +v 70.057442 30.847832 30.459909 +v 69.251038 27.407484 29.530769 +v 69.292229 30.900684 29.744894 +v 72.313354 27.459957 28.085602 +v 72.354553 30.953157 28.299725 +v 72.108017 27.485153 27.714039 +v 72.149216 30.978355 27.928164 +v 71.737137 27.762161 27.352734 +v 71.685196 31.010403 27.494616 +v 71.972015 27.496784 27.550449 +v 72.013206 30.989986 27.764574 +v 70.841171 27.542528 27.021744 +v 70.882362 31.035728 27.235867 +v 70.416824 27.545847 27.049259 +v 70.458023 31.039047 27.263382 +v 71.259018 27.532776 27.100468 +v 71.300209 31.025976 27.314592 +v 69.040184 27.459957 28.715305 +v 69.081375 30.953157 28.929430 +v 69.158600 27.496784 28.091702 +v 69.199799 30.989986 28.305826 +v 69.249100 27.507523 27.899122 +v 69.053322 27.472813 28.503054 +v 69.094513 30.966013 28.717178 +v 69.095016 30.939987 29.141665 +v 69.053818 27.446785 28.927540 +v 69.498611 27.525665 27.555157 +v 69.539810 31.018864 27.769279 +v 70.210518 27.545013 27.102516 +v 70.251717 31.038216 27.316641 +v 71.262878 27.335281 30.321636 +v 71.304062 30.828482 30.535759 +v 71.647461 27.341869 30.140167 +v 71.688660 30.835072 30.354290 +v 71.974823 27.354631 29.868988 +v 72.016022 30.847832 30.083111 +v 72.224342 27.372772 29.525021 +v 72.212448 30.711140 29.823437 +v 72.380432 27.395142 29.130066 +v 72.421631 30.888344 29.344189 +v 72.420120 27.407484 28.921089 +v 72.461319 30.900684 29.135214 +v 72.460815 30.926712 28.710728 +v 72.422562 27.683025 28.511898 +v 70.214432 27.347519 30.323675 +v 70.255623 30.840721 30.537800 +v 70.632233 27.337767 30.402409 +v 70.778152 30.679604 30.613853 +v 70.845276 27.335281 30.401974 +v 70.886475 30.828482 30.616096 +v 69.501427 27.383511 29.873695 +v 69.542625 30.876711 30.087818 +v 69.698120 30.865974 30.233074 +v 69.160080 27.420340 29.338543 +v 69.201279 30.913540 29.552666 +v 72.222404 27.472813 27.893375 +v 72.263603 30.966013 28.107498 +v 71.857712 31.000725 27.619318 +v 70.628113 27.545013 27.022179 +v 70.669312 31.038216 27.236301 +v 71.460876 27.337767 30.242990 +v 71.502075 30.830967 30.457115 +v 72.110413 27.363094 29.704830 +v 72.314835 27.383511 29.332441 +v 72.356033 30.876711 29.546566 +v 72.433258 27.420340 28.708839 +v 72.474457 30.913540 28.922962 +v 57.690742 30.939987 31.335655 +v 57.649551 27.446785 31.121532 +v 54.405308 30.926712 32.184303 +v 54.364113 27.433510 31.970182 +v 56.326729 27.334450 33.208672 +v 56.367924 30.827650 33.422791 +v 55.012306 27.617165 32.935783 +v 55.140739 30.856297 33.191559 +v 54.633144 27.517200 30.553097 +v 54.609955 30.856140 30.844387 +v 55.096085 27.538425 30.117762 +v 55.137283 31.031628 30.331886 +v 54.635525 27.395142 32.543892 +v 54.676720 30.888344 32.758015 +v 56.322693 27.538425 29.881783 +v 56.363888 31.031628 30.095905 +v 56.727306 27.525665 30.012144 +v 56.768501 31.018864 30.226267 +v 54.363106 27.485153 31.127865 +v 54.404297 30.978355 31.341988 +v 54.923859 27.532776 30.243080 +v 54.965057 31.025976 30.457203 +v 55.282669 27.542528 30.014938 +v 55.323868 31.035728 30.229061 +v 57.089802 27.347519 32.848633 +v 57.130997 30.840721 33.062759 +v 55.690971 27.341869 33.209930 +v 55.732162 30.835072 33.424057 +v 55.286354 27.354631 33.079567 +v 55.327549 30.847832 33.293694 +v 54.521141 27.407484 32.364555 +v 54.562336 30.900684 32.578678 +v 57.583469 27.459957 30.919386 +v 57.624664 30.953157 31.133511 +v 57.378128 27.485153 30.547825 +v 57.419319 30.978355 30.761948 +v 57.007240 27.762161 30.186518 +v 56.955307 31.010403 30.328400 +v 57.242123 27.496784 30.384235 +v 57.283318 30.989986 30.598358 +v 56.111279 27.542528 29.855530 +v 56.152470 31.035728 30.069653 +v 55.686935 27.545847 29.883045 +v 55.728127 31.039047 30.097168 +v 56.529121 27.532776 29.934254 +v 56.570320 31.025976 30.148376 +v 54.310295 27.459957 31.549089 +v 54.351490 30.953157 31.763214 +v 54.428715 27.496784 30.925488 +v 54.469910 30.989986 31.139610 +v 54.519211 27.507523 30.732908 +v 54.323425 27.472813 31.336838 +v 54.364616 30.966013 31.550964 +v 54.365128 30.939987 31.975449 +v 54.323933 27.446785 31.761326 +v 54.768723 27.525665 30.388943 +v 54.809917 31.018864 30.603065 +v 55.480682 27.545013 29.936293 +v 55.521873 31.038216 30.150417 +v 57.730923 30.926712 31.544512 +v 57.689728 27.433510 31.330389 +v 56.532982 27.335281 33.155418 +v 56.574177 30.828482 33.369545 +v 56.917576 27.341869 32.973953 +v 56.958771 30.835072 33.188076 +v 57.244938 27.354631 32.702774 +v 57.286133 30.847832 32.916893 +v 57.494453 27.372772 32.358807 +v 57.482563 30.711140 32.657219 +v 57.650547 27.395142 31.963852 +v 57.691742 30.888344 32.177975 +v 57.690231 27.407484 31.754875 +v 57.731426 30.900684 31.968998 +v 55.484539 27.347519 33.157459 +v 55.525734 30.840721 33.371586 +v 55.902386 27.337767 33.236183 +v 56.048359 30.679604 33.447617 +v 56.115440 27.335281 33.235748 +v 56.156635 30.828482 33.449875 +v 54.771538 27.383511 32.707481 +v 54.812733 30.876711 32.921604 +v 54.968224 30.865974 33.066856 +v 54.430199 27.420340 32.172325 +v 54.471390 30.913540 32.386452 +v 57.492516 27.472813 30.727158 +v 57.533710 30.966013 30.941284 +v 57.127823 31.000725 30.453102 +v 55.898224 27.545013 29.855965 +v 55.939415 31.038216 30.070087 +v 56.730991 27.337767 33.076775 +v 56.772186 30.830967 33.290901 +v 57.380516 27.363094 32.538616 +v 57.584949 27.383511 32.166229 +v 57.626144 30.876711 32.380348 +v 57.703369 27.420340 31.542622 +v 57.744564 30.913540 31.756746 +v 71.968338 26.315218 30.481468 +v 70.098694 26.579535 26.529116 +v 69.414413 26.607899 30.284462 +v 72.160309 26.581665 30.184135 +v 71.733040 27.032171 27.003265 +v 69.956200 26.819508 26.728064 +v 70.342125 26.580122 26.472696 +v 68.642342 26.707924 28.801178 +v 68.660568 26.732841 28.391180 +v 68.739578 26.754332 28.025385 +v 69.299118 26.615072 30.189610 +v 68.675522 26.691605 29.061028 +v 72.108589 26.319937 30.377516 +v 72.493721 26.602472 29.780579 +v 72.015846 27.016306 27.207657 +v 69.592812 26.812012 26.920242 +v 69.678917 26.574068 26.699045 +v 68.562599 26.497252 28.167009 +v 68.509338 26.474747 28.544397 +v 69.119263 26.628878 29.998981 +v 69.728638 26.850067 30.359697 +v 68.707001 26.409433 29.571854 +v 72.668144 26.934923 28.409842 +v 72.417603 26.334480 30.080812 +v 72.495529 26.339773 29.979467 +v 69.341316 26.564245 26.924273 +v 54.651581 26.609947 33.091145 +v 58.167965 26.443861 31.037786 +v 57.984772 26.707924 30.851517 +v 57.238449 26.315218 33.315254 +v 54.565544 26.801542 29.982037 +v 58.079407 26.371498 32.235325 +v 58.013012 26.474747 30.563715 +v 55.368805 26.579535 29.362902 +v 54.993431 26.591278 33.329979 +v 55.230995 26.581665 33.441048 +v 54.771683 26.602472 33.190002 +v 57.761147 26.739536 30.378838 +v 57.003143 27.032171 29.837051 +v 55.107254 26.576782 29.458143 +v 53.974915 26.521887 30.571533 +v 53.910694 26.512682 30.734039 +v 57.818161 26.607899 32.515388 +v 57.606628 26.754332 30.167179 +v 57.285950 27.016306 30.041443 +v 54.862923 26.812012 29.754026 +v 54.949017 26.574068 29.532829 +v 55.612232 26.580122 29.306482 +v 54.232159 26.780737 30.385586 +v 54.302399 26.549704 30.054762 +v 54.033253 26.528168 30.457861 +v 54.457920 26.362295 33.082184 +v 58.015217 26.362295 32.397823 +v 57.954395 26.482391 30.450287 +v 54.224499 26.544409 30.156107 +v 55.350819 26.319937 33.601429 +v 72.581818 31.931406 28.642597 +v 69.247734 32.009239 28.014282 +v 69.908287 33.045830 27.321976 +v 72.610809 31.917156 28.869511 +v 68.997543 31.931406 29.332151 +v 72.329315 31.973259 28.008385 +v 68.968552 31.945658 29.105236 +v 72.524551 31.945658 28.421124 +v 69.718849 31.853573 30.463123 +v 72.582649 31.889553 29.325228 +v 69.417747 33.029507 27.682684 +v 69.600281 33.037315 27.520166 +v 71.349800 33.037315 27.183588 +v 69.250061 31.889553 29.966362 +v 72.740997 32.896088 29.219879 +v 72.040512 31.835407 30.312843 +v 68.996719 31.973259 28.649521 +v 69.773560 32.035866 27.478678 +v 69.506042 33.033638 27.598263 +v 70.333771 32.044880 27.223888 +v 70.872749 32.809589 30.990463 +v 69.385010 31.876631 30.151194 +v 72.525909 31.876631 29.546936 +v 71.864098 31.828529 30.458990 +v 68.855392 32.956409 28.983366 +v 69.053452 31.986179 28.427811 +v 69.137558 31.998238 28.214966 +v 69.382187 32.019012 27.828947 +v 72.171112 32.998066 27.665890 +v 70.787460 32.043091 27.165773 +v 71.459435 32.027405 27.292416 +v 70.386681 32.817955 30.947479 +v 70.253113 32.821613 30.913517 +v 69.819046 32.838135 30.727482 +v 69.509567 32.855495 30.503813 +v 69.063927 32.896088 29.927288 +v 72.747513 32.902519 29.113739 +v 71.455765 32.809589 30.878304 +v 71.787888 32.815147 30.723747 +v 72.331635 31.853573 29.960466 +v 72.441803 31.864576 29.759783 +v 72.541077 32.855495 29.920601 +v 68.861908 32.962837 28.877224 +v 69.061829 33.003433 28.176502 +v 69.266235 33.020794 27.853973 +v 70.019012 33.047729 27.269726 +v 70.147141 33.049339 27.218803 +v 72.194366 31.986179 27.823555 +v 71.860519 32.009239 27.511625 +v 70.990250 33.045830 27.113823 +v 71.173492 32.035866 27.209354 +v 70.607948 33.050293 27.114550 +v 69.054817 31.917156 29.553627 +v 70.722923 31.820793 30.804764 +v 70.612663 32.813095 30.983280 +v 70.119934 31.835407 30.682331 +v 69.912468 32.833904 30.778522 +v 69.431808 32.860863 30.431215 +v 71.783859 33.020794 27.369621 +v 71.690437 33.025024 27.318584 +v 69.018494 32.902519 29.831139 +v 70.506989 32.815147 30.970173 +v 71.694626 32.813095 30.775129 +v 71.583900 32.811199 30.827377 +v 71.339340 32.808632 30.916300 +v 71.168411 32.808216 30.955994 +v 72.259796 31.848354 30.059460 +v 72.268860 32.833904 30.325191 +v 72.538986 32.962837 28.169817 +v 72.584412 32.956409 28.265965 +v 72.093338 33.003433 27.593292 +v 70.994957 32.808632 30.982553 +v 57.851929 31.931406 31.476381 +v 54.517845 32.009239 30.848066 +v 55.178398 33.045830 30.155760 +v 57.880920 31.917156 31.703297 +v 54.267658 31.931406 32.165936 +v 57.599419 31.973259 30.842171 +v 54.238655 31.945658 31.939022 +v 57.794659 31.945658 31.254906 +v 54.988960 31.853573 33.296906 +v 57.852760 31.889553 32.159012 +v 54.808964 32.027405 30.495689 +v 54.985382 32.034283 30.349545 +v 56.511497 32.034283 30.055944 +v 54.520180 31.889553 32.800144 +v 58.011108 32.896088 32.053665 +v 57.310623 31.835407 33.146629 +v 54.266842 31.973259 31.483303 +v 55.085125 33.043781 30.207142 +v 55.704605 33.050713 29.974895 +v 56.142860 32.809589 33.824249 +v 54.655117 31.876631 32.984978 +v 57.796021 31.876631 32.380722 +v 57.161301 32.817955 33.491821 +v 54.125465 32.956409 31.817158 +v 54.323566 31.986179 31.261597 +v 54.407684 31.998238 31.048748 +v 54.652302 32.019012 30.662731 +v 55.533676 33.050293 30.014589 +v 57.441216 32.998066 30.499674 +v 56.057571 32.043091 29.999559 +v 56.729546 32.027405 30.126202 +v 55.608093 31.828529 33.586372 +v 55.089157 32.838135 33.561268 +v 54.779667 32.855495 33.337601 +v 54.334042 32.896088 32.761070 +v 58.017624 32.902519 31.947525 +v 56.725872 32.809589 33.712090 +v 57.058002 32.815147 33.557533 +v 57.601746 31.853573 32.794250 +v 57.711914 31.864576 32.593567 +v 57.811188 32.855495 32.754387 +v 54.132027 32.962837 31.711008 +v 54.331932 33.003433 31.010290 +v 54.536339 33.020794 30.687756 +v 55.385986 32.043091 30.128761 +v 57.464470 31.986179 30.657339 +v 57.130630 32.009239 30.345409 +v 56.260357 33.045830 29.947609 +v 55.878059 33.050293 29.948336 +v 54.324921 31.917156 32.387413 +v 55.993080 31.820793 33.638538 +v 55.882774 32.813095 33.817062 +v 55.390045 31.835407 33.516117 +v 55.182579 32.833904 33.612305 +v 54.701931 32.860863 33.264996 +v 57.272736 32.821613 33.410721 +v 57.053970 33.020794 30.203407 +v 56.960548 33.025024 30.152367 +v 56.366035 33.043781 29.960716 +v 54.288567 32.902519 32.664932 +v 55.777092 32.815147 33.803955 +v 56.964729 32.813095 33.608917 +v 56.854012 32.811199 33.661163 +v 56.609451 32.808632 33.750084 +v 56.438522 32.808216 33.789780 +v 57.529907 31.848354 32.893242 +v 57.538971 32.833904 33.158978 +v 57.809090 32.962837 31.003601 +v 57.854523 32.956409 31.099751 +v 57.363449 33.003433 30.427076 +v 56.265068 32.808632 33.816338 +v 67.710693 39.093384 25.775009 +v 58.390137 29.744638 12.561989 +v 53.301613 30.837086 17.513102 +v 66.998322 30.350315 22.819202 +v 53.510498 29.193283 22.495529 +v 65.717789 30.823067 15.353117 +v 65.329773 35.080704 19.524605 +v 65.208099 35.579727 19.579735 +v 65.675636 35.415257 22.173010 +v 61.460754 30.122192 27.606140 +v 47.649055 27.454153 12.493173 +v 47.290409 27.790154 12.328449 +v 70.123520 33.096260 26.457876 +v 70.434082 33.071548 26.801268 +v 69.936821 33.076488 26.816385 +v 69.685043 33.065853 27.038284 +v 69.770439 33.080070 26.789906 +v 63.151642 33.009308 29.217632 +v 63.290779 32.984978 29.587803 +v 63.429760 32.932781 30.412621 +v 63.407700 32.940395 30.292667 +v 63.390350 32.948917 30.156967 +v 63.334511 32.970093 29.822248 +v 63.318298 32.978077 29.695122 +v 63.284714 32.991623 29.480576 +v 65.170296 32.997131 29.027990 +v 61.567287 33.059551 28.702791 +v 63.587120 33.089775 27.821175 +v 63.470627 33.093452 27.783619 +v 60.887775 33.080994 28.483789 +v 54.167400 33.082066 29.759163 +v 52.926620 33.098160 29.735325 +v 52.659462 33.091377 29.897301 +v 52.462818 33.080070 30.119602 +v 52.384384 33.071388 30.276371 +v 52.328743 33.060848 30.458994 +v 52.313683 33.046104 30.702461 +v 52.329174 33.038490 30.823681 +v 52.969357 33.039158 30.689613 +v 52.571171 33.087246 29.981724 +v 53.488445 33.076488 29.980782 +v 73.954010 33.014244 27.058990 +v 73.492531 32.996738 27.433302 +v 73.832451 33.033283 26.771727 +v 73.760345 33.040184 26.672985 +v 73.582001 33.052505 26.506313 +v 73.367722 33.062210 26.389236 +v 71.162155 33.053223 26.960196 +v 70.851105 33.067471 26.787560 +v 70.676483 33.070595 26.770233 +v 74.502411 32.833042 29.909569 +v 73.923241 32.854427 29.672142 +v 74.496109 32.814003 30.221432 +v 74.465790 32.807098 30.339878 +v 73.815895 32.821659 30.227333 +v 74.362015 32.794777 30.560827 +v 73.649445 32.806507 30.506533 +v 74.206474 32.785072 30.749050 +v 74.112228 32.781399 30.827145 +v 63.571854 32.884747 31.168949 +v 63.482590 32.914238 30.704979 +v 63.449841 32.926147 30.517002 +v 65.286980 32.919964 30.264404 +v 61.677921 32.908604 31.144112 +v 65.416847 32.890198 30.725039 +v 63.595421 32.876957 31.291462 +v 63.613636 32.870937 31.386137 +v 61.732666 32.866093 31.827078 +v 61.727100 32.859928 31.928732 +v 63.721375 32.849617 31.713259 +v 63.746559 32.843353 31.810556 +v 61.692570 32.837376 32.303265 +v 63.794128 32.829422 32.028717 +v 65.893768 32.825825 31.683489 +v 61.684250 32.823376 32.533310 +v 66.160912 32.812107 31.855865 +v 66.533264 32.776691 32.361996 +v 53.116489 32.810104 34.398037 +v 52.954250 32.833042 34.055077 +v 53.403961 32.854427 33.619709 +v 53.503826 32.840313 33.830807 +v 53.653728 32.825954 34.036137 +v 54.578373 32.788551 34.468437 +v 53.657028 32.781399 34.762383 +v 53.540535 32.785072 34.724831 +v 53.326263 32.794777 34.607758 +v 48.117363 32.414230 25.472364 +v 47.936600 37.451244 25.062084 +v 47.462337 33.349678 22.596886 +v 48.472832 34.769199 27.849392 +v 48.132996 37.451244 25.024300 +v 47.448547 35.891544 21.995876 +v 47.658737 33.349678 22.559101 +v 48.669228 34.769199 27.811611 +v 68.597794 32.460957 20.770002 +v 68.529022 34.956100 20.941839 +v 68.656647 37.451244 21.075893 +v 68.725418 34.956100 20.904057 +v 69.192871 34.769199 23.863203 +v 68.061569 35.143002 17.982693 +v 55.493916 28.714106 7.319708 +v 55.513721 36.246075 7.617717 +v 55.613857 36.785557 7.873100 +v 55.716690 36.180756 8.096821 +v 61.174526 35.372417 7.578281 +v 56.715851 36.162281 9.156989 +v 56.882771 35.167583 9.204084 +v 56.822067 30.019897 8.888545 +v 56.431080 30.478729 8.663978 +v 56.156376 36.533798 8.710601 +v 55.448944 35.688725 7.386063 +v 58.242477 32.209637 9.415129 +v 57.847332 33.890442 9.466166 +v 55.887363 36.691738 8.367769 +v 60.789288 36.162281 8.373327 +v 60.650536 35.064186 8.472656 +v 60.650768 30.852600 8.148406 +v 61.226772 28.741980 5.832928 +v 61.276680 36.221165 6.092371 +v 61.304726 36.245945 6.238131 +v 61.139194 35.320530 7.654732 +v 59.853283 33.890442 9.080255 +v 61.334484 36.246075 6.497900 +v 61.323769 36.180756 7.018112 +v 61.336254 36.785557 6.772207 +v 61.212914 36.040863 7.487852 +v 61.270916 36.696884 7.311611 +v 61.101208 36.471527 7.835536 +v 60.939262 35.652382 8.111008 +v 55.129189 35.673710 5.810829 +v 55.272560 36.103405 6.556059 +v 55.155918 35.824539 5.949753 +v 55.188896 35.935432 6.121159 +v 55.388840 36.221134 7.160454 +v 55.282745 35.532955 6.608987 +v 54.923420 34.600830 4.741237 +v 55.004421 35.057861 5.162272 +v 55.052929 35.978577 5.414425 +v 54.940838 30.423944 4.831768 +v 55.182667 30.252462 6.088789 +v 55.207291 28.823801 6.216789 +v 60.840225 34.880630 3.736892 +v 60.853653 32.655666 3.806683 +v 60.900909 31.887091 4.052315 +v 60.842358 35.727879 3.747977 +v 60.912659 36.041630 4.113379 +v 60.989826 36.306293 4.514506 +v 61.135990 36.051147 5.274265 +v 61.164520 36.103405 5.422544 +v 61.280792 36.221134 6.026940 +v 61.204659 29.431095 5.674609 +v 55.328812 29.431095 6.805025 +v 61.294086 36.786648 6.124968 +v 55.408882 36.221165 7.221238 +v 46.259369 31.056692 15.285244 +v 44.349480 28.218271 12.921448 +v 44.634125 27.525064 13.077703 +v 49.204826 26.501539 28.896095 +v 45.588505 27.542517 12.810178 +# 3660 vertices, 0 vertices normals + +f 90 1792 1 1782 +f 2 1784 83 1782 +f 1783 3 1784 2 +f 3 3624 1716 1784 +f 1785 1690 3655 5 +f 1786 73 1882 4 +f 1787 1667 1785 5 +f 4 1903 1668 1787 +f 1786 5 3635 6 +f 1759 1804 18 1788 +f 97 1808 23 1788 +f 69 1805 20 1789 +f 24 1809 25 1789 +f 7 1918 99 1790 +f 1763 3649 1764 1790 +f 1739 3634 22 1791 +f 8 1879 17 1791 +f 90 1919 89 1792 +f 9 3651 1 1792 +f 6 3635 16 1793 +f 70 1881 73 1793 +f 1750 1808 10 1794 +f 11 1932 1749 1794 +f 47 1809 12 1795 +f 13 2847 45 1795 +f 94 1923 93 1796 +f 1796 1720 3628 1723 +f 1797 1676 1798 94 +f 1798 14 1799 94 +f 15 1904 82 1800 +f 76 1801 1699 1800 +f 1801 1685 3611 1699 +f 89 1915 7 1802 +f 1764 3650 9 1802 +f 16 3632 1739 1803 +f 17 1880 70 1803 +f 19 1931 18 1804 +f 1759 3647 1761 1804 +f 1738 3638 20 1805 +f 69 1877 21 1805 +f 99 1931 19 1806 +f 1761 3648 1763 1806 +f 22 3639 1738 1807 +f 21 1878 8 1807 +f 1810 27 2494 26 +f 1811 612 1812 40 +f 510 2615 29 1813 +f 1814 28 1813 29 +f 1815 31 1814 29 +f 1815 616 2590 590 +f 31 1815 590 1816 +f 1816 30 2591 606 +f 31 1816 606 1817 +f 33 1818 32 1817 +f 1818 607 2592 593 +f 32 1818 593 1819 +f 1819 34 2593 36 +f 1820 35 1821 32 +f 1821 531 1822 32 +f 1822 608 1823 32 +f 1823 527 1829 32 +f 1824 526 1830 43 +f 586 2600 37 1825 +f 1825 40 1826 38 +f 614 2587 39 1827 +f 1827 40 2424 43 +f 1828 603 2599 614 +f 43 1833 585 1828 +f 1830 42 1831 43 +f 1831 41 1832 43 +f 1832 602 1833 43 +f 1833 601 2530 585 +f 1834 859 1840 44 +f 1835 753 1836 45 +f 1836 784 1837 45 +f 46 1875 47 1837 +f 1838 791 1846 859 +f 1839 781 1840 859 +f 1841 48 1839 859 +f 1842 805 1841 859 +f 1843 49 1842 859 +f 1844 760 1843 859 +f 1845 802 1844 859 +f 1846 801 1845 859 +f 1838 54 1847 50 +f 1848 51 1847 54 +f 1849 52 1848 54 +f 1850 795 1849 54 +f 1851 799 1850 54 +f 1852 53 1851 54 +f 1853 56 1854 55 +f 1854 1776 1855 55 +f 1856 57 1865 1776 +f 1857 828 1856 1776 +f 60 2805 61 1858 +f 1859 75 1894 60 +f 1860 823 1862 59 +f 1861 62 1859 60 +f 1862 850 1864 59 +f 1863 63 1861 60 +f 1865 857 1855 1776 +f 1866 58 1857 1776 +f 1867 64 1866 1776 +f 1868 768 1867 1776 +f 1869 65 1868 1776 +f 66 1869 1776 1864 +f 1870 140 1872 60 +f 1871 67 1863 60 +f 1872 132 1871 60 +f 59 1873 255 1858 +f 1874 493 2497 32 +f 1873 1773 1874 32 +f 1875 25 1809 47 +f 1875 46 2738 68 +f 1876 69 1789 25 +f 1876 68 2728 777 +f 1877 777 2757 780 +f 1878 780 2759 751 +f 1879 751 2734 750 +f 1880 750 2753 72 +f 1881 72 2752 71 +f 73 1881 71 1882 +f 1882 847 1883 4 +f 1884 82 1883 843 +f 1885 76 1884 74 +f 1886 817 1887 75 +f 1887 838 1888 75 +f 1888 813 1889 75 +f 1889 77 1890 75 +f 1890 78 1891 75 +f 1891 763 1892 75 +f 1892 810 1893 75 +f 1893 807 1894 75 +f 1885 79 1886 75 +f 1895 938 1901 1547 +f 1896 933 1895 1547 +f 1897 80 1899 81 +f 1898 867 1899 80 +f 1900 864 1902 945 +f 938 2966 945 1902 +f 864 3539 1578 1902 +f 82 1904 1670 1903 +f 93 1922 83 1905 +f 1905 1716 3626 1719 +f 1906 1720 1796 93 +f 121 1974 120 1907 +f 1907 1593 1909 84 +f 1908 123 1977 84 +f 1909 865 1908 84 +f 98 2722 742 1910 +f 1911 98 1931 99 +f 1912 85 1911 99 +f 1913 752 1912 99 +f 1914 86 1913 99 +f 1915 749 1920 7 +f 1916 756 1914 99 +f 1917 87 1916 99 +f 778 2733 88 1918 +f 1919 91 1915 89 +f 1920 778 1918 7 +f 1919 90 1921 773 +f 1921 83 1922 846 +f 92 2719 846 1922 +f 1923 841 2823 92 +f 1924 95 2825 841 +f 1924 94 1799 138 +f 1925 815 2798 95 +f 1925 138 1983 129 +f 1926 812 2820 815 +f 1926 129 1985 134 +f 1927 836 2794 812 +f 1927 134 1992 133 +f 1928 834 2795 836 +f 1928 133 1986 139 +f 1929 139 1997 125 +f 1929 96 2792 834 +f 11 1794 10 1910 +f 1930 98 1910 10 +f 97 1788 18 1930 +f 1931 98 1930 18 +f 1932 11 1910 742 +f 1933 804 1934 101 +f 1934 761 1935 101 +f 1935 748 1936 101 +f 1936 759 1937 101 +f 1937 800 1938 101 +f 100 1939 861 1938 +f 1939 789 1940 861 +f 1940 790 1941 861 +f 1941 102 1942 861 +f 1942 103 1943 861 +f 1943 794 1944 861 +f 1944 105 1945 861 +f 1945 104 1946 861 +f 1946 830 1947 861 +f 1947 106 1948 861 +f 1948 108 1949 861 +f 1949 107 1968 861 +f 1950 826 1967 115 +f 96 1929 125 1951 +f 126 1952 109 1951 +f 1953 808 1952 126 +f 1954 110 1953 126 +f 1955 111 1954 126 +f 1956 851 1955 126 +f 1957 821 1956 126 +f 1958 112 1959 848 +f 1959 629 1960 848 +f 126 2196 628 1958 +f 1961 818 1960 629 +f 1962 113 1963 766 +f 1964 746 1963 113 +f 1965 630 1966 114 +f 1969 116 1970 117 +f 1970 633 1971 117 +f 1971 118 1972 117 +f 1972 631 1975 117 +f 1973 119 1974 121 +f 1968 115 1969 117 +f 1976 122 1978 117 +f 1978 861 1968 117 +f 124 1977 123 1976 +f 1870 255 1979 125 +f 1979 126 1951 125 +f 1859 62 1980 127 +f 1981 128 1980 62 +f 1982 1693 1981 62 +f 1983 1702 1994 130 +f 1984 1711 1985 129 +f 1871 132 1986 133 +f 132 1872 139 1986 +f 1985 131 1987 134 +f 1987 1713 1988 134 +f 1988 135 1989 134 +f 1989 1701 1992 134 +f 1990 137 3613 136 +f 1861 63 1991 1691 +f 1991 136 1982 1691 +f 63 1992 1701 1991 +f 1992 63 1863 133 +f 1863 67 1871 133 +f 1799 1733 1993 138 +f 1993 1730 1994 138 +f 1994 1702 1983 138 +f 1801 76 1885 75 +f 1995 1685 1801 75 +f 75 1859 127 1996 +f 1872 140 1997 139 +f 140 1870 125 1997 +f 142 2034 1779 1998 +f 141 3512 149 1998 +f 1999 1756 2169 1548 +f 2000 143 1999 1548 +f 2001 1715 2000 1548 +f 2002 1725 2168 231 +f 2003 1672 2002 231 +f 2004 1727 2003 231 +f 2005 1728 2004 231 +f 2006 1705 2005 231 +f 2007 146 2008 1712 +f 2009 1663 2008 146 +f 2010 144 2009 146 +f 2011 145 2010 146 +f 2012 147 2011 146 +f 1692 3613 1695 2013 +f 2013 146 3503 1535 +f 2014 1692 2013 1535 +f 2015 1694 2014 1535 +f 2016 149 2017 1682 +f 2018 1666 2035 1769 +f 1535 3504 142 2016 +f 2019 1683 2017 149 +f 2020 1666 3602 148 +f 2020 149 3512 860 +f 156 2034 252 2021 +f 2022 156 2195 150 +f 151 3351 1345 2022 +f 2023 156 2022 1345 +f 1346 3353 1319 2023 +f 2024 156 2023 1319 +f 152 3344 1321 2024 +f 2025 1320 2026 156 +f 2026 153 2027 156 +f 2027 1348 2028 156 +f 2028 154 2029 156 +f 2029 155 2030 156 +f 2030 157 2033 156 +f 2031 1360 2032 156 +f 2032 1326 2126 156 +f 2033 1325 2031 156 +f 860 2843 1744 2035 +f 2036 1226 2037 166 +f 2037 158 2038 166 +f 2038 160 2039 166 +f 2039 159 2047 166 +f 2040 161 2041 162 +f 2041 1276 2042 162 +f 2042 1248 2043 162 +f 1249 3312 163 2043 +f 2044 162 2043 163 +f 1278 3311 164 2044 +f 2045 162 2044 164 +f 1247 3321 165 2045 +f 2046 162 2045 165 +f 2046 1274 3310 1246 +f 2048 162 2046 1246 +f 2049 1225 2137 866 +f 2050 1291 2049 866 +f 2051 167 2050 866 +f 2052 1289 2051 866 +f 2053 168 2052 866 +f 2054 1237 2053 866 +f 2055 169 2054 866 +f 2056 1229 2055 866 +f 2057 1261 2056 866 +f 2058 1262 2057 866 +f 2059 170 2058 866 +f 2060 1260 2059 866 +f 1258 3316 171 2061 +f 2061 866 2062 1301 +f 172 3327 1301 2062 +f 2062 866 2063 1300 +f 1236 3306 1300 2063 +f 2063 866 2064 1256 +f 1257 3315 1256 2064 +f 2064 866 2065 173 +f 2066 1287 2065 866 +f 2067 1285 2066 866 +f 2068 1284 2067 866 +f 2069 174 2068 866 +f 2070 175 2069 866 +f 2071 1253 2070 866 +f 2072 176 2071 866 +f 2073 1299 2072 866 +f 2074 1252 2073 866 +f 2075 177 2074 866 +f 2076 178 2075 866 +f 2077 1329 2078 179 +f 2079 200 2107 1374 +f 2080 180 2090 188 +f 2048 181 3314 1255 +f 2081 182 2082 162 +f 2082 1282 2083 162 +f 2084 1254 2085 1545 +f 2085 183 2086 1545 +f 2086 184 2087 1545 +f 2088 1306 2087 197 +f 2089 185 2088 186 +f 2090 187 3305 188 +f 2091 198 2104 1332 +f 2092 190 2105 199 +f 2093 191 2079 1374 +f 2094 203 2109 202 +f 2083 192 2084 1545 +f 2095 234 3511 1545 +f 2089 187 2090 1365 +f 2096 1303 2095 1545 +f 2097 193 2096 1545 +f 2098 194 2097 1545 +f 2099 1335 2098 1545 +f 2100 195 2099 1545 +f 2101 1307 2100 1545 +f 2102 1334 2101 1545 +f 2103 196 2102 1545 +f 180 3345 1365 2090 +f 2080 189 2091 1332 +f 2106 1361 2105 190 +f 2108 201 2107 200 +f 2077 866 2110 1304 +f 2111 213 2112 1363 +f 2113 204 2112 213 +f 2114 205 2113 213 +f 2115 206 2114 213 +f 2116 207 2115 213 +f 2117 208 2116 213 +f 2118 1373 2136 213 +f 2119 219 2135 213 +f 1375 3358 210 2120 +f 211 3338 217 2121 +f 2122 213 2132 214 +f 2123 212 2131 213 +f 2124 1322 2130 213 +f 2125 1328 2127 213 +f 2127 1358 2128 213 +f 2128 1359 2129 213 +f 2129 1350 2124 213 +f 2130 1353 2123 213 +f 2131 1354 2132 213 +f 2132 1355 3329 214 +f 2122 215 3339 1357 +f 2133 216 2121 213 +f 213 2121 217 2120 +f 2134 1305 2119 213 +f 2135 218 2118 213 +f 2136 209 2117 213 +f 2137 220 2138 866 +f 2139 221 2140 1548 +f 2140 1293 2141 1548 +f 2141 1239 2142 1548 +f 2142 222 2143 1548 +f 2143 1238 2144 1548 +f 2144 1266 2145 1548 +f 2145 1265 2146 1548 +f 2146 1263 2167 1548 +f 2147 1264 2148 230 +f 2148 1267 2149 230 +f 2149 1240 2150 230 +f 2150 223 2166 230 +f 2151 224 2152 166 +f 2152 225 2153 166 +f 2153 1233 2154 166 +f 2154 1268 2155 166 +f 2155 1235 2156 166 +f 2156 1234 2157 166 +f 2157 1273 2158 166 +f 2158 226 2159 166 +f 2159 227 2160 166 +f 2160 1245 2161 166 +f 1242 3304 1272 2161 +f 2162 166 2161 1272 +f 1241 3308 228 2162 +f 2163 166 2162 228 +f 229 3318 1270 2163 +f 2164 166 2163 1270 +f 1302 3328 1295 2164 +f 2165 1297 2036 166 +f 2167 230 3507 231 +f 1548 2167 231 2168 +f 2169 232 2846 1548 +f 143 3619 233 1999 +f 2095 1303 3330 235 +f 234 2095 235 2170 +f 2170 1309 3331 236 +f 234 2170 236 2171 +f 2171 1367 3356 1315 +f 234 2171 1315 2172 +f 2172 237 3340 238 +f 234 2172 238 2173 +f 2173 1368 3346 1337 +f 2174 240 2175 234 +f 2175 239 2176 234 +f 2176 241 2177 234 +f 2177 1317 2178 234 +f 2178 242 2179 234 +f 2179 243 2180 234 +f 2180 245 2181 234 +f 2181 244 2182 234 +f 2182 1310 2191 234 +f 2183 1311 2184 252 +f 2184 1343 2185 252 +f 2185 1342 2186 252 +f 2186 246 2187 252 +f 2187 1344 2188 252 +f 2188 247 2192 252 +f 248 3349 249 2189 +f 250 3348 253 2190 +f 251 3333 1369 2021 +f 2192 1312 3336 1340 +f 2193 1318 2189 252 +f 252 2189 249 2190 +f 2194 251 2021 252 +f 1347 3352 150 2195 +f 2195 156 2021 1369 +f 254 2616 628 2196 +f 2197 439 2419 254 +f 2198 1544 2197 254 +f 2196 126 1979 257 +f 2199 1534 2198 254 +f 2200 257 1979 255 +f 2201 255 1873 32 +f 2201 258 3504 256 +f 1544 3507 1539 2197 +f 2202 1536 3505 1537 +f 2203 1543 2205 453 +f 2204 258 2201 32 +f 2206 259 2207 43 +f 2207 1538 1829 43 +f 260 2227 272 2208 +f 2209 363 2319 372 +f 2210 262 2236 283 +f 2211 312 2269 264 +f 2212 338 2291 400 +f 263 2294 279 2212 +f 2213 271 2353 386 +f 2214 347 2312 365 +f 2215 349 2211 264 +f 2216 379 2326 378 +f 2217 289 2294 265 +f 2210 266 2349 267 +f 269 2230 268 2218 +f 398 2290 282 2218 +f 2219 275 2352 270 +f 2220 288 2219 270 +f 2221 356 2253 325 +f 353 2297 342 2215 +f 2222 273 2287 369 +f 344 2299 345 2223 +f 331 2223 330 2224 +f 332 2214 365 2225 +f 261 2209 372 2226 +f 332 2261 306 2214 +f 2216 334 2267 311 +f 2227 333 2323 272 +f 2228 267 2349 336 +f 2229 335 2290 399 +f 2228 337 2237 262 +f 2222 375 2293 277 +f 269 2232 339 2230 +f 274 2347 268 2230 +f 275 2219 324 2217 +f 2231 276 2232 269 +f 2233 685 2231 282 +f 2232 276 2663 671 +f 2234 284 2233 335 +f 2235 277 2292 339 +f 2236 285 2234 283 +f 2235 671 2641 650 +f 2237 646 2236 262 +f 2238 273 2222 277 +f 2239 684 2237 337 +f 2238 650 2639 278 +f 2240 286 2239 338 +f 2241 280 2287 273 +f 2241 278 2665 281 +f 2242 645 2240 279 +f 2243 654 2242 289 +f 2244 287 2243 324 +f 2245 290 2244 288 +f 2245 340 2246 681 +f 2246 292 2247 291 +f 727 2685 291 2247 +f 2247 292 2306 293 +f 2248 724 2710 727 +f 2248 293 2296 294 +f 2249 725 2708 724 +f 2249 294 2284 341 +f 2250 295 2691 725 +f 2250 341 2283 296 +f 2251 718 2706 295 +f 2251 296 2305 357 +f 2252 700 2689 718 +f 2252 357 2282 325 +f 2253 297 2689 700 +f 2254 298 2681 297 +f 2254 356 2281 299 +f 2255 299 2304 319 +f 2255 300 2714 298 +f 2256 331 2224 280 +f 2256 281 2643 677 +f 2257 344 2223 331 +f 2257 677 2667 302 +f 2258 301 2299 344 +f 2258 302 2629 643 +f 2259 303 2288 301 +f 2259 643 2629 304 +f 2260 332 2225 303 +f 2260 304 2661 305 +f 2261 305 2637 667 +f 2262 261 2226 306 +f 2262 667 2656 307 +f 2263 308 2209 261 +f 2263 307 2658 637 +f 308 2263 637 2264 +f 2264 636 2265 260 +f 2266 350 2265 309 +f 2267 334 2266 310 +f 2268 311 2267 705 +f 2269 312 2268 317 +f 2270 264 2269 318 +f 2271 353 2270 313 +f 2272 354 2271 711 +f 2273 343 2272 314 +f 2274 360 2273 315 +f 2275 323 2274 666 +f 2276 361 2275 316 +f 2277 732 2712 300 +f 2277 319 2295 321 +f 2278 735 2716 732 +f 2278 321 2303 320 +f 2279 716 2704 735 +f 2279 320 2302 322 +f 2280 713 2702 716 +f 2280 322 2301 351 +f 2276 713 2280 351 +f 2219 288 2244 324 +f 2281 356 2221 394 +f 358 2340 326 2282 +f 327 2339 390 2283 +f 2284 294 2296 389 +f 327 2283 341 2284 +f 323 2286 329 2285 +f 362 2330 329 2286 +f 2287 346 2314 369 +f 2288 366 2320 373 +f 2225 366 2288 303 +f 334 2216 378 2289 +f 2290 398 2348 399 +f 266 2210 283 2229 +f 2291 337 2228 336 +f 405 2355 274 2292 +f 2293 405 2292 277 +f 2294 289 2242 279 +f 2294 263 2351 265 +f 271 2213 340 2220 +f 2213 292 2246 340 +f 393 2342 392 2295 +f 326 2340 394 2221 +f 359 2334 389 2296 +f 354 2307 382 2297 +f 2285 328 2298 360 +f 2298 328 2328 384 +f 2299 373 2311 345 +f 2224 346 2287 280 +f 2226 347 2214 306 +f 2208 363 2209 308 +f 2211 349 2329 348 +f 312 2211 348 2300 +f 2289 333 2227 350 +f 2227 260 2265 350 +f 335 2233 282 2290 +f 397 2309 351 2301 +f 322 2302 352 2301 +f 355 2341 352 2302 +f 2303 355 2302 320 +f 393 2295 319 2304 +f 2305 296 2283 390 +f 359 2296 293 2306 +f 2306 292 2213 386 +f 2307 384 2332 382 +f 2307 354 2272 343 +f 2300 379 2216 311 +f 2303 321 2295 392 +f 395 2304 299 2281 +f 358 2282 357 2305 +f 2298 343 2273 360 +f 361 2276 351 2308 +f 396 2317 362 2308 +f 2309 396 2308 351 +f 2286 323 2275 361 +f 417 2369 411 2310 +f 363 2208 272 2310 +f 373 2320 374 2311 +f 364 2316 345 2311 +f 433 2366 406 2312 +f 406 2384 432 2313 +f 366 2225 365 2313 +f 346 2322 367 2314 +f 429 2315 369 2314 +f 368 2321 375 2315 +f 376 2322 330 2316 +f 370 2330 362 2317 +f 396 2356 371 2317 +f 412 2363 433 2318 +f 347 2226 372 2318 +f 411 2368 412 2319 +f 432 2383 374 2320 +f 2321 404 2293 375 +f 418 2370 417 2323 +f 377 2371 418 2324 +f 333 2289 378 2324 +f 383 2375 423 2325 +f 349 2215 342 2325 +f 420 2372 377 2326 +f 380 2328 328 2327 +f 329 2330 381 2327 +f 385 2332 384 2328 +f 423 2374 421 2329 +f 383 2325 342 2331 +f 382 2332 426 2331 +f 421 2373 420 2333 +f 379 2300 348 2333 +f 359 2306 386 2334 +f 2334 1541 2335 389 +f 2335 387 2338 389 +f 2336 388 2337 327 +f 2337 1536 2339 327 +f 327 2284 389 2338 +f 2339 1536 2202 358 +f 2202 453 2340 358 +f 453 2344 394 2340 +f 391 2345 352 2341 +f 2341 355 2303 392 +f 391 2341 392 2342 +f 2342 393 2304 395 +f 2343 391 2342 395 +f 453 2343 395 2344 +f 2309 397 2345 1531 +f 2345 397 2301 352 +f 391 3502 1531 2345 +f 2346 401 2349 266 +f 2347 455 2348 398 +f 2348 455 2346 266 +f 2349 401 2350 336 +f 400 2291 336 2350 +f 2350 401 2351 263 +f 2351 401 2352 275 +f 2352 401 2353 271 +f 2354 455 2347 274 +f 2355 402 2354 274 +f 403 2415 371 2356 +f 396 2309 1531 2356 +f 2357 402 2355 404 +f 2355 405 2293 404 +f 2358 651 2385 404 +f 2359 430 2384 406 +f 2360 674 2359 406 +f 2361 407 2360 406 +f 2362 678 2361 406 +f 2363 413 2367 433 +f 2364 408 2362 406 +f 2365 642 2364 406 +f 410 2637 409 2366 +f 2367 410 2366 433 +f 2368 668 2363 412 +f 2368 411 2369 414 +f 2369 417 2370 416 +f 415 2677 416 2370 +f 2371 419 2699 415 +f 2372 706 2695 419 +f 2373 649 2697 706 +f 2374 422 2635 649 +f 2375 424 2679 422 +f 2376 427 2701 424 +f 2376 383 2331 426 +f 2377 426 2332 385 +f 2377 425 2687 427 +f 2378 435 2390 439 +f 1533 2357 428 2379 +f 2379 404 2382 663 +f 2321 368 2380 430 +f 429 2314 367 2380 +f 2381 430 2380 367 +f 376 2316 364 2381 +f 2383 430 2381 364 +f 2385 434 2386 404 +f 2386 431 2382 404 +f 2387 664 2388 1533 +f 2388 647 2389 1533 +f 2389 661 2378 1533 +f 2390 436 2391 439 +f 2392 438 2422 439 +f 440 2393 437 2391 +f 655 2394 441 2393 +f 2394 659 2395 441 +f 2396 696 2397 632 +f 2395 658 2396 632 +f 2398 443 2399 442 +f 2400 702 2401 634 +f 2401 719 2414 634 +f 2402 720 2403 444 +f 2403 691 2404 444 +f 2404 445 2405 444 +f 2405 731 2406 444 +f 2397 728 2398 442 +f 2407 736 2408 371 +f 2408 712 2413 371 +f 2409 446 2683 425 +f 2409 385 2328 380 +f 2410 448 2693 446 +f 2410 380 2327 381 +f 2406 447 2407 371 +f 2411 449 2654 448 +f 2411 381 2330 370 +f 449 2411 370 2412 +f 371 2413 640 2412 +f 2415 444 2406 371 +f 2399 701 2400 634 +f 444 2416 450 2414 +f 2416 1573 2417 450 +f 2418 635 2417 1573 +f 2420 451 2419 439 +f 2421 627 2420 439 +f 2422 452 2421 439 +f 2423 1778 1901 1578 +f 43 2424 467 2425 +f 2424 475 2454 467 +f 2343 453 2416 444 +f 2205 43 2425 1578 +f 2426 1573 2416 453 +f 1542 2346 455 2427 +f 2427 1533 2428 454 +f 439 2197 1539 2428 +f 2429 1777 3657 456 +f 2430 1772 2429 456 +f 2431 492 2445 457 +f 2432 464 2442 1532 +f 2433 459 2438 462 +f 2434 1532 2435 463 +f 1532 2442 461 2435 +f 2436 687 2441 463 +f 2437 652 2433 463 +f 2438 501 2504 462 +f 2438 459 2640 676 +f 2439 676 2666 653 +f 2440 653 2644 679 +f 2440 511 2513 512 +f 2439 512 2503 501 +f 2441 672 2437 463 +f 686 2436 463 2435 +f 2443 458 2432 1532 +f 2444 465 2443 1532 +f 2446 657 2445 492 +f 2447 466 2446 492 +f 2448 680 2447 492 +f 2449 683 2448 492 +f 697 2449 492 2450 +f 467 2451 729 2450 +f 2452 726 2451 467 +f 2453 703 2452 467 +f 2454 721 2705 468 +f 477 2703 717 2455 +f 2456 491 2493 477 +f 2457 469 2459 505 +f 2458 470 2456 477 +f 2460 514 2458 477 +f 2461 734 2463 475 +f 2462 472 2460 477 +f 2463 692 2465 475 +f 2464 521 2462 477 +f 2465 474 2467 475 +f 2466 473 2464 477 +f 2467 722 2471 475 +f 2468 523 2466 477 +f 2469 1774 2472 1778 +f 505 2507 504 2455 +f 2470 476 2468 477 +f 2471 721 2454 475 +f 2423 467 2450 492 +f 2459 471 2461 475 +f 2473 478 2494 505 +f 2474 479 2505 511 +f 2474 679 2668 644 +f 2475 507 2499 479 +f 2475 644 2630 669 +f 2476 508 2511 507 +f 2476 669 2660 670 +f 2477 497 2502 508 +f 2477 670 2662 480 +f 2478 498 2501 497 +f 2478 480 2638 481 +f 2479 483 2509 498 +f 2479 481 2657 482 +f 2480 494 2510 483 +f 2480 482 2659 484 +f 494 2480 484 2481 +f 2481 485 2482 513 +f 2483 503 2482 486 +f 2484 515 2483 707 +f 2485 708 2486 491 +f 2486 487 2487 491 +f 2487 689 2488 491 +f 2488 488 2489 491 +f 2489 489 2490 491 +f 2490 695 2491 491 +f 2491 490 2492 491 +f 2492 641 2493 491 +f 2484 710 2485 491 +f 1813 28 1814 460 +f 2495 510 1813 460 +f 1532 2434 31 2496 +f 2431 1532 2496 32 +f 525 2522 495 2498 +f 494 2481 513 2498 +f 507 2511 621 2499 +f 605 2505 479 2499 +f 2500 491 2456 496 +f 2456 470 2517 496 +f 620 2589 617 2501 +f 617 2533 622 2502 +f 512 2513 499 2503 +f 500 2504 501 2503 +f 509 2512 462 2504 +f 502 2513 511 2505 +f 528 2524 597 2506 +f 503 2483 515 2506 +f 518 2518 504 2507 +f 505 2494 27 2507 +f 2468 476 2508 524 +f 506 2614 620 2509 +f 495 2613 506 2510 +f 622 2602 621 2511 +f 2512 510 2495 462 +f 2495 463 2433 462 +f 597 2523 525 2514 +f 513 2482 503 2514 +f 2515 609 2458 514 +f 2460 472 2462 519 +f 2516 528 2506 515 +f 2500 516 2516 515 +f 2470 504 2518 517 +f 2462 521 2519 519 +f 2464 473 2520 520 +f 2466 523 2521 522 +f 2522 550 2552 625 +f 2523 597 2524 552 +f 527 1823 569 1824 +f 34 1819 593 2525 +f 2526 583 1810 612 +f 1811 37 2600 604 +f 2527 577 2599 603 +f 1823 608 2604 569 +f 2528 600 2515 519 +f 2529 530 2574 529 +f 2530 584 2527 585 +f 42 1830 570 1831 +f 41 1831 570 2529 +f 2531 580 2580 587 +f 2532 586 1825 38 +f 33 2611 560 2534 +f 1821 35 2594 595 +f 2516 516 2595 599 +f 550 2522 525 2523 +f 532 2556 598 2535 +f 2536 524 2508 578 +f 575 2561 556 2536 +f 2537 533 2538 615 +f 2538 534 2609 615 +f 2539 542 2537 624 +f 2538 533 2664 673 +f 2540 543 2539 535 +f 2541 619 2590 534 +f 2542 675 2540 536 +f 2541 673 2626 688 +f 2543 537 2542 589 +f 2544 540 2603 619 +f 2545 538 2543 618 +f 2544 688 2676 665 +f 2546 546 2545 539 +f 2547 558 2591 540 +f 2547 665 2653 559 +f 2548 541 2546 545 +f 2549 544 2548 623 +f 2550 547 2549 548 +f 2551 549 2550 626 +f 2551 625 2552 638 +f 2552 550 2553 639 +f 551 2678 639 2553 +f 2553 550 2523 552 +f 2554 553 2700 551 +f 2554 552 2524 599 +f 2555 554 2696 553 +f 2555 599 2595 598 +f 2556 709 2698 554 +f 2557 555 2636 709 +f 2557 532 2605 610 +f 2558 690 2680 555 +f 2558 610 2605 600 +f 2559 690 2558 600 +f 2528 557 2560 698 +f 2560 699 2688 698 +f 2560 557 2596 556 +f 2561 694 2684 699 +f 2562 560 2611 558 +f 2562 559 2634 648 +f 2563 592 2534 560 +f 2563 648 2674 662 +f 2564 591 2592 592 +f 2564 662 2632 563 +f 2565 561 2525 591 +f 2565 563 2632 562 +f 2566 594 2593 561 +f 2566 562 2648 564 +f 2567 596 2594 594 +f 2567 564 2646 656 +f 2568 595 2594 596 +f 2568 656 2670 565 +f 2569 566 2604 595 +f 2569 565 2650 660 +f 566 2569 660 2570 +f 2570 682 2571 569 +f 2572 568 2571 567 +f 2573 570 2572 730 +f 2574 530 2573 571 +f 2575 529 2574 572 +f 2576 573 2575 723 +f 2577 584 2576 574 +f 2578 577 2577 693 +f 2579 613 2578 579 +f 2580 580 2579 733 +f 2581 587 2580 581 +f 2582 588 2581 582 +f 2583 704 2694 694 +f 2583 575 2536 578 +f 2584 576 2655 704 +f 2584 578 2606 611 +f 2585 715 2628 576 +f 2585 611 2607 583 +f 2586 715 2585 583 +f 2526 604 2582 714 +f 601 2598 573 2530 +f 41 2529 529 1832 +f 39 2531 587 1826 +f 2587 613 2531 39 +f 587 2581 588 2532 +f 2588 618 2543 589 +f 2589 620 2614 548 +f 2593 594 1820 36 +f 34 2525 561 2593 +f 1822 531 1821 595 +f 2517 609 2605 532 +f 2535 516 2500 496 +f 518 2606 578 2518 +f 2508 517 2518 578 +f 2521 524 2536 556 +f 2520 522 2596 557 +f 2519 520 2520 557 +f 526 2597 570 1830 +f 2597 568 2572 570 +f 2598 529 2575 573 +f 2598 601 1833 602 +f 586 2532 588 2600 +f 2588 502 2505 605 +f 509 2504 500 2601 +f 539 2610 621 2602 +f 2603 540 2591 30 +f 2534 592 2592 607 +f 35 1820 594 2594 +f 2604 566 2570 569 +f 608 1822 595 2604 +f 2605 609 2515 600 +f 2606 518 2507 27 +f 27 1810 583 2607 +f 526 1824 569 2597 +f 614 2599 577 2587 +f 535 2601 500 2608 +f 616 1815 29 2609 +f 623 2533 617 2589 +f 2603 590 2590 619 +f 606 2591 558 2611 +f 2608 499 2612 536 +f 2612 499 2513 502 +f 626 2614 506 2613 +f 618 2588 605 2610 +f 2602 622 2533 545 +f 2533 623 2548 545 +f 2612 589 2542 536 +f 615 2609 29 2615 +f 2512 509 2601 624 +f 2615 510 2512 624 +f 2601 535 2539 624 +f 2613 495 2522 625 +f 2614 626 2550 548 +f 1962 629 2420 627 +f 2421 452 1965 113 +f 1967 630 2422 438 +f 2392 437 1969 115 +f 112 1958 628 2616 +f 2419 451 1959 112 +f 1972 118 2620 442 +f 442 2399 634 2617 +f 437 2393 441 2618 +f 1970 116 2618 441 +f 441 2395 632 2619 +f 1971 633 2619 632 +f 632 2397 442 2620 +f 1974 119 2621 450 +f 2417 635 2622 120 +f 1973 631 2617 634 +f 634 2414 450 2621 +f 1593 1907 120 2622 +f 2418 1599 3548 1593 +f 414 2369 416 2623 +f 636 2264 637 2623 +f 638 2552 639 2624 +f 485 2481 484 2624 +f 434 2385 276 2625 +f 2386 434 2625 685 +f 2441 687 2626 673 +f 687 2436 688 2626 +f 316 2654 449 2627 +f 640 2413 713 2627 +f 641 2492 576 2628 +f 2493 641 2628 715 +f 2364 642 2629 302 +f 546 2660 669 2630 +f 644 2668 538 2630 +f 2390 435 2651 286 +f 2631 436 2390 286 +f 2632 465 2444 562 +f 2444 457 2648 562 +f 664 2387 285 2633 +f 2388 664 2633 646 +f 2442 464 2634 559 +f 464 2432 648 2634 +f 318 2269 317 2635 +f 2486 708 2698 709 +f 2367 413 2656 667 +f 2637 410 2367 667 +f 544 2549 547 2638 +f 674 2360 278 2639 +f 2359 674 2639 650 +f 543 2666 676 2640 +f 459 2642 542 2640 +f 430 2359 650 2641 +f 2358 430 2641 671 +f 652 2437 533 2642 +f 678 2362 677 2643 +f 2361 678 2643 281 +f 537 2668 679 2644 +f 653 2666 675 2644 +f 655 2393 440 2645 +f 654 2243 287 2645 +f 2446 466 2670 656 +f 2631 645 2647 440 +f 645 2242 654 2647 +f 2445 657 2646 564 +f 658 2395 659 2649 +f 290 2245 681 2649 +f 2448 683 2672 660 +f 661 2389 684 2651 +f 2443 465 2632 662 +f 663 2382 284 2652 +f 2387 663 2652 285 +f 665 2676 686 2653 +f 461 2442 559 2653 +f 666 2693 448 2654 +f 490 2491 704 2655 +f 2492 490 2655 576 +f 413 2363 668 2656 +f 547 2550 549 2657 +f 668 2368 414 2658 +f 549 2551 638 2659 +f 2365 409 2661 304 +f 2629 642 2365 304 +f 546 2546 541 2660 +f 2637 305 2661 409 +f 541 2548 544 2662 +f 651 2358 671 2663 +f 2385 651 2663 276 +f 2437 672 2664 533 +f 672 2441 673 2664 +f 407 2361 281 2665 +f 2360 407 2665 278 +f 408 2364 302 2667 +f 2362 408 2667 677 +f 2394 655 2645 287 +f 287 2244 290 2669 +f 2447 680 2650 565 +f 2396 658 2649 681 +f 2671 696 2396 681 +f 682 2570 660 2672 +f 2449 697 2686 682 +f 647 2388 646 2673 +f 2389 647 2673 684 +f 2432 458 2674 648 +f 458 2443 662 2674 +f 431 2386 685 2675 +f 2382 431 2675 284 +f 2436 686 2676 688 +f 309 2265 636 2677 +f 486 2482 485 2678 +f 313 2270 318 2679 +f 2487 487 2636 555 +f 2404 691 2681 298 +f 691 2403 297 2681 +f 692 2463 579 2682 +f 2465 692 2682 693 +f 314 2687 425 2683 +f 446 2693 315 2683 +f 489 2489 699 2684 +f 2490 489 2684 694 +f 2671 291 2685 728 +f 567 2571 682 2686 +f 697 2450 729 2686 +f 711 2701 427 2687 +f 488 2488 698 2688 +f 2489 488 2688 699 +f 2403 720 2689 297 +f 474 2465 693 2690 +f 2467 474 2690 574 +f 2400 701 2708 725 +f 572 2574 571 2692 +f 2453 468 2707 572 +f 695 2490 694 2694 +f 2491 695 2694 704 +f 705 2267 310 2695 +f 710 2484 707 2696 +f 317 2268 705 2697 +f 2485 710 2696 554 +f 310 2266 309 2699 +f 707 2483 486 2700 +f 313 2679 424 2701 +f 2559 698 2488 689 +f 2413 712 2702 713 +f 712 2408 716 2702 +f 2586 714 2703 477 +f 2408 736 2704 716 +f 736 2407 735 2704 +f 2703 714 2582 582 +f 2457 717 2703 582 +f 2402 719 2706 718 +f 2689 720 2402 718 +f 2705 721 2471 574 +f 2471 722 2467 574 +f 2401 702 2691 295 +f 723 2575 572 2707 +f 2705 723 2707 468 +f 701 2399 443 2708 +f 571 2573 730 2709 +f 2452 703 2692 571 +f 2398 728 2685 727 +f 730 2572 567 2711 +f 2451 726 2709 730 +f 732 2716 447 2712 +f 731 2405 300 2712 +f 2713 581 2580 733 +f 2461 471 2713 733 +f 2405 445 2714 300 +f 445 2404 298 2714 +f 734 2461 733 2715 +f 2463 734 2715 579 +f 2407 447 2716 735 +f 469 2457 582 2717 +f 2713 471 2459 469 +f 2718 773 1921 846 +f 2719 738 3624 737 +f 737 3621 772 2718 +f 2720 847 2721 739 +f 71 2755 775 2721 +f 2722 741 3644 740 +f 1933 742 2722 740 +f 1839 48 2723 782 +f 2724 745 1963 746 +f 1964 114 2836 1709 +f 2725 744 2724 746 +f 2726 1680 1867 768 +f 2727 1758 1916 87 +f 747 2757 777 2728 +f 68 2738 1736 2728 +f 2729 1754 3645 1753 +f 1939 100 2729 1753 +f 1846 791 2730 1743 +f 2731 758 1936 748 +f 1843 760 2732 1741 +f 1920 749 2749 1765 +f 2733 778 1920 1765 +f 779 3636 771 2734 +f 2735 1747 1912 752 +f 1836 753 2736 754 +f 2737 757 1914 756 +f 46 2765 1735 2738 +f 1942 102 2768 787 +f 2739 1757 1943 103 +f 2740 788 1847 51 +f 1848 52 2775 1746 +f 2741 1752 1937 759 +f 1844 802 2742 1742 +f 2743 762 1935 761 +f 1842 49 2744 1740 +f 811 2792 96 2745 +f 109 1952 809 2745 +f 2746 764 1892 763 +f 1891 78 2793 765 +f 2747 767 1961 766 +f 2748 1681 1868 65 +f 2749 749 1915 91 +f 769 2749 91 2750 +f 774 3620 770 2750 +f 769 3650 1765 2749 +f 2751 776 2752 1771 +f 2752 72 2753 1771 +f 771 3632 1771 2753 +f 91 1919 773 2754 +f 772 3621 774 2754 +f 2752 776 2755 71 +f 1917 88 2758 1762 +f 2756 1760 2727 87 +f 747 3633 1737 2757 +f 2733 1766 2758 88 +f 1737 3634 779 2759 +f 2760 1748 1911 85 +f 1835 44 2761 755 +f 2762 741 2722 98 +f 1840 781 2763 1734 +f 2764 783 1913 86 +f 784 1836 754 2765 +f 1944 794 2774 1707 +f 2766 785 2778 105 +f 2767 796 2777 795 +f 1850 799 2781 786 +f 1941 790 2770 1755 +f 2769 50 1847 788 +f 1940 789 1939 1753 +f 2771 1745 2730 791 +f 2769 792 2771 791 +f 2772 793 2774 794 +f 2773 1707 2774 793 +f 2776 1689 3653 1768 +f 1849 795 2777 1768 +f 2778 1714 1945 105 +f 2779 797 1946 104 +f 1851 53 2780 798 +f 2782 1754 2729 800 +f 2729 100 1938 800 +f 1845 801 2783 803 +f 2784 1751 1934 804 +f 1841 805 2785 743 +f 1954 111 2786 1704 +f 2787 60 1894 1678 +f 1894 807 2816 1678 +f 1952 808 2788 809 +f 2789 1732 2788 808 +f 2790 1677 2791 810 +f 2791 833 1893 810 +f 1731 2818 834 2792 +f 1890 77 2819 1687 +f 1675 2821 812 2794 +f 2794 836 2795 1710 +f 2795 835 3622 1710 +f 2796 1686 1889 813 +f 2797 1700 2796 813 +f 1888 838 2822 839 +f 814 2826 95 2798 +f 815 2820 1721 2798 +f 2799 840 1887 817 +f 1886 79 2827 816 +f 2800 1729 1960 818 +f 2801 820 3610 819 +f 1869 66 2801 819 +f 1957 848 2831 822 +f 2802 852 1956 821 +f 2803 824 1862 823 +f 1955 851 2804 825 +f 2804 1706 3617 825 +f 2787 806 3608 853 +f 1950 107 2809 827 +f 2806 1673 1966 826 +f 1857 58 2807 1696 +f 1949 108 2840 1724 +f 2808 1726 2809 107 +f 1856 828 2810 829 +f 1947 830 2813 831 +f 2811 832 1948 106 +f 1855 857 2812 1665 +f 1852 55 2814 1664 +f 1953 110 2815 1703 +f 2817 835 2795 834 +f 2818 837 2817 834 +f 2820 812 2821 1722 +f 1717 2829 92 2823 +f 841 2825 1718 2823 +f 842 3605 845 2824 +f 74 1884 843 2824 +f 2825 95 2826 844 +f 845 3605 1671 2828 +f 79 1885 74 2828 +f 2829 738 2719 92 +f 2830 842 2824 843 +f 2720 1669 2830 843 +f 2832 849 2831 848 +f 2833 1679 2834 850 +f 2834 820 2801 850 +f 2801 66 1864 850 +f 2804 851 1956 852 +f 2805 853 3609 854 +f 1860 61 2805 854 +f 2835 1674 2836 114 +f 1866 64 2837 1697 +f 2838 1698 2837 64 +f 2839 855 2840 108 +f 1865 57 2841 856 +f 2842 858 2841 57 +f 2843 860 2844 859 +f 863 3640 1744 2843 +f 860 1853 54 2844 +f 101 1938 861 2845 +f 1548 2846 862 2845 +f 2847 863 1834 45 +f 1932 101 2848 1749 +f 1900 81 1908 865 +f 123 1908 81 2849 +f 1899 867 1898 213 +f 2111 866 2849 81 +f 866 2138 122 2849 +f 2850 124 1976 117 +f 2851 1022 2850 117 +f 2852 1021 2851 117 +f 2853 868 2852 117 +f 2854 1108 2853 117 +f 2855 1059 2854 117 +f 2856 869 2855 117 +f 2857 1054 2856 117 +f 2858 870 2857 117 +f 2859 871 2858 117 +f 2860 1068 2859 117 +f 2861 872 2860 117 +f 2862 1063 2861 117 +f 2863 874 2864 873 +f 2865 1075 2866 874 +f 2866 875 2867 874 +f 2867 1039 2868 874 +f 2868 876 2869 874 +f 2869 877 2870 874 +f 2870 878 2871 874 +f 2871 1031 2872 874 +f 2872 879 2873 874 +f 2873 881 2874 874 +f 2874 880 2875 874 +f 2875 882 2876 874 +f 2876 1065 2864 874 +f 2850 1022 3183 1117 +f 2877 883 2878 124 +f 2878 884 2879 124 +f 2879 885 2880 124 +f 2880 1116 2881 124 +f 2881 886 2882 124 +f 2882 1114 2883 124 +f 2883 1045 2884 124 +f 2884 887 2885 124 +f 2885 1112 2886 124 +f 2886 888 2887 124 +f 2887 889 2893 124 +f 2888 1026 2889 891 +f 2889 894 2894 891 +f 2890 891 2891 890 +f 2892 1023 2891 891 +f 2894 893 2895 891 +f 2895 895 2896 891 +f 2896 1093 2897 891 +f 2897 896 2898 891 +f 2898 897 2899 891 +f 2899 898 2900 891 +f 2900 899 2901 891 +f 2901 1052 2902 891 +f 2902 892 2892 891 +f 2903 900 2904 904 +f 2890 874 2903 904 +f 905 2979 952 2904 +f 121 1907 84 2905 +f 902 2987 901 2905 +f 2906 902 2905 84 +f 2893 891 2908 903 +f 1977 124 2893 903 +f 904 2904 952 2907 +f 2907 946 2908 891 +f 2909 905 2904 900 +f 2910 953 2903 874 +f 2911 906 1975 121 +f 2863 117 1975 906 +f 2912 940 2913 907 +f 2914 1161 2913 940 +f 2915 1160 2914 940 +f 2916 1210 2915 940 +f 2917 908 2916 940 +f 2918 909 2917 940 +f 2919 910 2918 940 +f 2920 911 2919 940 +f 2921 1171 2920 940 +f 2922 912 2921 940 +f 2923 1132 2922 940 +f 2924 1213 2923 940 +f 2925 913 2924 940 +f 2926 933 2927 914 +f 2928 916 2929 933 +f 2929 917 2930 933 +f 2930 1139 2931 933 +f 2931 918 2932 933 +f 2932 1177 2933 933 +f 2933 919 2934 933 +f 2934 920 2935 933 +f 2935 1142 2936 933 +f 2936 921 2937 933 +f 2937 922 2938 933 +f 2938 915 2927 933 +f 2939 923 2940 927 +f 2940 924 2941 927 +f 2941 1192 2942 927 +f 2942 925 2943 927 +f 2943 926 2944 927 +f 2944 928 2945 927 +f 2945 1218 2946 927 +f 2946 1190 2947 927 +f 2947 1148 2948 927 +f 2948 1187 2949 927 +f 2949 929 2950 927 +f 2950 930 2951 927 +f 2951 931 2959 927 +f 2952 1201 2953 80 +f 2953 1200 2960 80 +f 1896 80 2954 932 +f 2955 1120 2954 80 +f 2956 1207 2955 80 +f 2957 934 2956 80 +f 2958 1130 2957 80 +f 2960 1197 2961 80 +f 2961 1198 2962 80 +f 2962 1156 2963 80 +f 2963 935 2964 80 +f 2964 1204 2958 80 +f 942 2970 944 2965 +f 936 3056 1000 2965 +f 937 3047 993 2966 +f 2967 937 2966 938 +f 2926 940 2969 939 +f 1895 933 2926 939 +f 942 2965 1000 2968 +f 2968 941 2969 940 +f 2912 927 2970 942 +f 2971 936 2965 944 +f 2972 943 2970 927 +f 2973 995 1897 945 +f 2959 80 1897 995 +f 2908 946 2974 947 +f 2975 958 2910 906 +f 2976 950 3028 981 +f 905 2909 958 2977 +f 2977 957 2983 950 +f 2976 949 2978 951 +f 2979 905 2977 950 +f 2979 951 2980 952 +f 2980 954 2981 952 +f 948 2974 946 2981 +f 2909 953 2910 958 +f 2982 962 2988 954 +f 2980 951 2978 955 +f 956 2985 960 2983 +f 956 2983 957 2984 +f 2975 959 2985 956 +f 2906 903 2908 947 +f 2911 901 2985 959 +f 2985 901 2987 960 +f 961 3015 974 2986 +f 2987 955 2986 960 +f 2982 955 2987 902 +f 2988 962 2982 902 +f 2989 963 2990 961 +f 2988 947 2974 954 +f 2974 948 2981 954 +f 2991 965 2990 963 +f 2992 964 2991 963 +f 2993 1092 2992 963 +f 2994 966 2993 963 +f 2995 968 2994 963 +f 2996 967 2995 963 +f 2997 1086 2996 963 +f 2998 1089 2997 963 +f 2999 969 2998 963 +f 3000 970 2999 963 +f 3001 1081 3000 963 +f 3002 1083 3001 963 +f 1098 3002 963 3003 +f 3003 971 3004 1099 +f 3005 1047 3004 971 +f 3006 1095 3005 971 +f 3007 1096 3006 971 +f 3008 1050 3007 971 +f 3009 972 3008 971 +f 3010 1102 3009 971 +f 3011 1100 3010 971 +f 3012 973 3011 971 +f 3013 1106 3012 971 +f 3014 1104 3013 971 +f 3015 975 3016 974 +f 3016 1053 3017 974 +f 3017 976 3018 974 +f 3018 1061 3019 974 +f 3019 1060 3020 974 +f 3020 977 3021 974 +f 3021 1056 3022 974 +f 3022 978 3023 974 +f 3023 979 3024 974 +f 3024 1037 3025 974 +f 3025 980 3026 974 +f 3026 1067 3027 974 +f 3027 1066 3028 974 +f 3029 1080 3030 981 +f 3030 1043 3031 981 +f 3031 982 3032 981 +f 3032 983 3033 981 +f 3033 1076 3034 981 +f 3034 985 3035 981 +f 3035 984 3036 981 +f 3036 1040 3037 981 +f 3037 1041 3038 981 +f 3038 1074 3039 981 +f 3039 986 3040 981 +f 3040 949 2976 981 +f 2989 955 2978 971 +f 950 2983 960 3041 +f 2972 995 3042 987 +f 3043 990 2969 941 +f 3044 988 3097 1018 +f 937 2967 990 3045 +f 3045 989 3051 988 +f 3044 1012 3046 991 +f 3047 937 3045 988 +f 3047 991 3048 993 +f 3048 994 3049 993 +f 2973 993 3049 992 +f 2967 939 2969 990 +f 3050 996 3057 994 +f 3048 991 3046 1020 +f 998 3054 997 3051 +f 998 3051 989 3052 +f 3043 999 3053 998 +f 2971 943 2972 987 +f 999 3043 941 3053 +f 1000 3054 998 3053 +f 1184 3084 1015 3055 +f 3054 1000 3056 1020 +f 3055 997 3054 1020 +f 3050 1020 3056 936 +f 3057 996 3050 936 +f 3058 1004 3059 1184 +f 3057 987 3042 994 +f 3042 992 3049 994 +f 3060 1185 3059 1004 +f 3061 1224 3060 1004 +f 3062 1193 3061 1004 +f 3063 1001 3062 1004 +f 3064 1002 3063 1004 +f 3065 1220 3064 1004 +f 3066 1003 3065 1004 +f 3067 1151 3066 1004 +f 3068 1188 3067 1004 +f 3069 1189 3068 1004 +f 3070 1005 3069 1004 +f 3071 1121 3070 1004 +f 1123 3071 1004 3072 +f 3072 1006 3073 1203 +f 3074 1153 3073 1006 +f 3075 1155 3074 1006 +f 3076 1007 3075 1006 +f 3077 1125 3076 1006 +f 3078 1008 3077 1006 +f 3079 1010 3078 1006 +f 3080 1009 3079 1006 +f 3081 1131 3080 1006 +f 3082 1011 3081 1006 +f 3083 1208 3082 1006 +f 3084 1162 3085 1015 +f 3085 1013 3086 1015 +f 3086 1165 3087 1015 +f 3087 1169 3088 1015 +f 3088 1211 3089 1015 +f 3089 1167 3090 1015 +f 3090 1166 3091 1015 +f 3091 1172 3092 1015 +f 3092 1137 3093 1015 +f 3093 1136 3094 1015 +f 3094 1216 3095 1015 +f 3095 1014 3096 1015 +f 3096 1170 3097 1015 +f 3098 1147 3099 1018 +f 3099 1016 3100 1018 +f 3100 1129 3101 1018 +f 3101 1144 3102 1018 +f 3102 1182 3103 1018 +f 3103 1178 3104 1018 +f 3104 1176 3105 1018 +f 3105 1141 3106 1018 +f 3106 1017 3107 1018 +f 3107 1173 3108 1018 +f 3108 1019 3109 1018 +f 3109 1012 3044 1018 +f 988 3051 997 3110 +f 3058 1020 3046 1006 +f 3015 961 3111 1387 +f 3112 1290 2851 1021 +f 3113 1436 3014 949 +f 2891 1023 3114 1024 +f 2888 889 3170 1025 +f 3115 1027 2889 1026 +f 3116 1082 3001 1083 +f 3002 1098 3189 1447 +f 2898 896 3139 1028 +f 3117 897 2898 1028 +f 3118 1049 3007 1050 +f 3008 972 3009 1030 +f 2871 878 2870 1298 +f 3119 1275 2872 1031 +f 3120 985 3034 1077 +f 3034 1076 3167 1077 +f 2874 881 3131 1042 +f 3121 1271 2875 880 +f 3122 1032 3032 982 +f 3031 1043 3134 1377 +f 2901 899 3123 1033 +f 3124 1034 3011 973 +f 2860 872 3151 1035 +f 3125 1036 2859 1068 +f 3126 1038 3025 1037 +f 3024 979 3156 1423 +f 2858 871 3155 1232 +f 3127 1269 2857 870 +f 3128 1069 3023 978 +f 3022 1056 3148 1431 +f 2868 1039 3129 1250 +f 3130 1419 3037 1040 +f 2873 879 3166 1296 +f 3132 1078 3033 983 +f 3133 1079 2876 882 +f 3030 1080 3169 1044 +f 2884 1045 3174 1259 +f 3135 1288 2885 887 +f 3136 1088 2997 1089 +f 2998 969 3173 1084 +f 2895 893 3186 1251 +f 3137 1046 2896 895 +f 3138 1097 3004 1047 +f 3005 1095 3185 1407 +f 2897 1093 3184 1094 +f 3140 1048 3006 1096 +f 2902 1052 3141 1051 +f 3142 1411 3012 1106 +f 3143 1231 2852 868 +f 3016 975 3144 1444 +f 3145 1107 2854 1059 +f 3018 976 3146 1430 +f 3147 1054 2857 1269 +f 3021 977 3020 1110 +f 3149 1058 2855 869 +f 3019 1061 3150 1445 +f 2861 1063 3198 1062 +f 3152 1064 3026 980 +f 2864 1065 3168 1244 +f 3153 1243 2862 873 +f 3154 1402 3029 1066 +f 3027 1067 3199 1111 +f 2866 1075 3157 1073 +f 3158 1071 3039 1074 +f 2869 876 3159 1277 +f 3160 1072 3036 984 +f 2870 877 3161 1298 +f 3120 1420 3385 1400 +f 3035 985 3120 1400 +f 2867 875 3162 1279 +f 3163 1397 3038 1041 +f 3164 1378 3040 986 +f 2865 890 3165 1070 +f 2887 888 3200 1283 +f 3171 1439 3000 1081 +f 3172 1286 2886 1112 +f 2999 970 3201 1113 +f 2883 1114 3202 1085 +f 3175 1087 2996 1086 +f 3176 1090 2881 1116 +f 2995 967 3177 1091 +f 3177 1415 3399 1091 +f 3178 1227 2879 884 +f 2993 966 3179 1389 +f 3180 1228 2878 883 +f 2992 1092 3181 1412 +f 2990 965 3182 1393 +f 1022 2851 1290 3183 +f 1292 3205 1117 3183 +f 2894 894 3188 1280 +f 3187 1099 3004 1097 +f 3187 1424 3189 1098 +f 2900 898 3190 1281 +f 3191 1425 3010 1100 +f 2899 897 3117 1101 +f 3117 1029 3313 1101 +f 3192 1030 3009 1102 +f 2892 892 3193 1103 +f 3194 1105 3013 1104 +f 3195 1294 2853 1108 +f 3017 1053 3196 1109 +f 3147 1055 3317 1057 +f 2856 1054 3147 1057 +f 3020 1060 3197 1110 +f 2882 886 2881 1090 +f 3177 967 2996 1087 +f 3203 1115 2880 885 +f 2994 968 3204 1417 +f 3205 1230 2877 1117 +f 2991 964 3206 1394 +f 3084 1184 3207 1529 +f 3208 1119 2913 1161 +f 3209 1451 3083 1012 +f 2954 1120 3210 1323 +f 2951 930 3268 1186 +f 3211 1371 2952 931 +f 3212 1526 3070 1121 +f 3071 1123 3285 1122 +f 2963 1156 3235 1124 +f 3213 935 2963 1124 +f 3214 1157 3076 1125 +f 3077 1008 3078 1206 +f 2934 919 2933 1370 +f 3215 1181 2935 920 +f 3216 1178 3103 1126 +f 3103 1182 3263 1126 +f 2937 921 3227 1127 +f 3217 1145 2938 922 +f 3218 1457 3101 1129 +f 3100 1016 3230 1128 +f 2957 1130 3219 1351 +f 3220 1468 3080 1131 +f 2922 1132 3247 1133 +f 3221 1134 2921 912 +f 3222 1504 3094 1136 +f 3093 1137 3252 1135 +f 2920 1171 3251 1138 +f 3223 1339 2919 911 +f 3224 1481 3092 1172 +f 3091 1166 3244 1517 +f 2931 1139 3225 1175 +f 3226 1498 3106 1141 +f 2936 1142 3262 1143 +f 3228 1479 3102 1144 +f 3229 1146 2927 915 +f 3099 1147 3265 1501 +f 2947 1190 3272 1314 +f 3231 1330 2948 1148 +f 3232 1149 3066 1151 +f 3067 1188 3271 1150 +f 2960 1200 3282 1349 +f 3233 1152 2961 1197 +f 3234 1507 3073 1153 +f 3074 1155 3281 1154 +f 2962 1198 3280 1313 +f 3236 1199 3075 1007 +f 2956 934 3237 1158 +f 3238 1485 3081 1011 +f 3239 1118 2914 1160 +f 3085 1162 3240 1163 +f 3241 1209 2916 908 +f 3087 1165 3242 1164 +f 3243 910 2919 1339 +f 3090 1167 3089 1503 +f 3245 1336 2917 909 +f 3088 1169 3246 1168 +f 2923 1213 3294 1214 +f 3248 1215 3095 1216 +f 2925 914 3264 1341 +f 3249 1212 2924 913 +f 3250 1183 3098 1170 +f 3096 1014 3295 1466 +f 2929 916 3253 1179 +f 3254 1473 3108 1173 +f 2932 918 3255 1174 +f 3256 1476 3105 1176 +f 2933 1177 3257 1370 +f 3216 1478 3456 1499 +f 3104 1178 3216 1499 +f 2930 917 3258 1140 +f 3259 1180 3107 1017 +f 3260 1450 3109 1019 +f 2928 932 3261 1324 +f 3059 1185 3266 1470 +f 3267 1366 2939 907 +f 2950 929 3296 1362 +f 3269 1217 3069 1005 +f 3270 1364 2949 1187 +f 3068 1189 3297 1523 +f 2946 1218 3298 1219 +f 3273 1191 3065 1003 +f 3274 1331 2944 926 +f 3064 1220 3275 1493 +f 3275 1221 3470 1493 +f 3276 1333 2942 1192 +f 3062 1001 3277 1196 +f 3278 1194 2941 924 +f 3061 1193 3279 1195 +f 2953 1201 3284 1372 +f 3283 1203 3073 1507 +f 3283 1202 3285 1123 +f 2958 1204 3286 1352 +f 3287 1483 3079 1009 +f 2964 935 3213 1205 +f 3213 1356 3329 1205 +f 3288 1206 3078 1010 +f 2955 1207 3289 1327 +f 3290 1159 3082 1208 +f 3291 1308 2915 1210 +f 3086 1013 3292 1515 +f 3243 1316 3347 1338 +f 2918 910 3243 1338 +f 3089 1211 3293 1503 +f 2945 928 2944 1331 +f 3275 1220 3065 1191 +f 3299 1222 2943 925 +f 3063 1002 3300 1492 +f 3301 1223 2940 923 +f 3060 1224 3302 1471 +f 2049 1291 2050 1290 +f 3112 1231 2137 1225 +f 1257 2064 173 3303 +f 2036 1297 2165 1296 +f 2076 179 3184 1046 +f 2058 170 3203 1227 +f 2055 1229 2056 1228 +f 3180 1230 2053 1237 +f 2054 169 2055 1228 +f 2140 221 3143 1294 +f 2139 220 2137 1231 +f 3155 1036 2155 1268 +f 2154 1233 2153 1232 +f 3125 1035 2157 1234 +f 2156 1235 2155 1036 +f 1244 3168 1272 3304 +f 3139 1094 2079 191 +f 2093 190 3323 1028 +f 1029 2091 189 3305 +f 2082 182 2081 1103 +f 3306 1259 3174 1300 +f 3205 1292 2052 168 +f 2143 222 2142 1107 +f 2142 1239 2141 1107 +f 1055 3147 1269 3307 +f 2150 1240 2149 1055 +f 2152 224 3127 1232 +f 2153 225 2152 1232 +f 1079 3133 228 3308 +f 3153 1244 3304 1242 +f 1242 2161 1245 3309 +f 2160 227 3198 1243 +f 1070 3165 1246 3310 +f 2041 161 2040 1298 +f 3161 1277 2042 1276 +f 3311 1279 3162 1247 +f 3162 1073 3321 1247 +f 3312 1249 2043 1248 +f 3312 1250 3129 163 +f 3129 1279 3320 163 +f 3186 1280 2073 1252 +f 2074 177 3137 1251 +f 2071 176 3188 1027 +f 3141 1033 2084 192 +f 3190 1101 3313 186 +f 3313 187 2089 186 +f 3314 1024 3114 1255 +f 3114 1103 2081 1255 +f 1259 3306 1256 3315 +f 3135 1259 3315 1257 +f 1258 2061 1301 3316 +f 1236 2063 1256 3306 +f 2069 175 3115 1025 +f 3176 1115 2059 1260 +f 2060 171 3316 1090 +f 3178 1228 2056 1261 +f 2057 1262 2058 1227 +f 2144 1238 3145 1058 +f 2147 1263 3317 1055 +f 1263 2146 1057 3317 +f 2145 1266 2144 1058 +f 2148 1264 2147 1055 +f 2149 1267 2148 1055 +f 2151 223 3307 1269 +f 3121 1042 3318 229 +f 1271 3121 229 3319 +f 3133 1271 3319 228 +f 3308 1241 2162 1272 +f 3168 1079 3308 1272 +f 3151 1062 2158 1273 +f 2159 226 2158 1062 +f 3310 1274 2046 165 +f 2039 160 2038 1298 +f 2037 1226 3166 1275 +f 3159 1250 3312 1248 +f 1279 3311 1278 3320 +f 3157 1070 3310 165 +f 2109 200 2079 1094 +f 2072 1299 2073 1280 +f 2086 183 2085 1033 +f 2085 1254 2084 1033 +f 3123 1281 3322 184 +f 3322 197 2087 184 +f 1281 3190 186 3322 +f 1029 3117 1028 3323 +f 2092 198 2091 1029 +f 3193 1051 3324 1282 +f 1051 3141 192 3324 +f 3165 1024 3314 1246 +f 3314 181 2048 1246 +f 2067 1284 2068 1283 +f 2068 174 3170 1283 +f 2066 1285 3200 1286 +f 2065 1287 3172 1288 +f 2070 1253 2071 1027 +f 2051 1289 2052 1292 +f 2050 167 3325 1290 +f 167 2051 1292 3325 +f 2141 1293 3195 1107 +f 2146 1265 3149 1057 +f 2165 1295 3328 1296 +f 2040 159 2039 1298 +f 2038 158 3119 1298 +f 2075 178 2076 1046 +f 1085 3202 172 3326 +f 3174 1085 3326 1300 +f 1090 3316 1301 3327 +f 3202 1090 3327 172 +f 1042 3131 1302 3318 +f 3131 1296 3328 1302 +f 2078 202 2109 1094 +f 1355 3354 1205 3329 +f 1356 3339 214 3329 +f 3208 1118 3331 235 +f 1309 2170 235 3331 +f 1329 2077 1304 3332 +f 1143 3262 1347 3333 +f 2134 210 3280 1152 +f 1306 2088 185 3334 +f 2101 1334 2102 1194 +f 3278 1223 2099 195 +f 2100 1307 2101 1194 +f 1308 3291 1367 3335 +f 3239 1308 3335 236 +f 3331 1118 3239 236 +f 3251 1134 2183 1310 +f 2182 244 2181 1138 +f 3221 1133 2185 1343 +f 2184 1311 2183 1134 +f 1341 3264 1340 3336 +f 3235 1313 3338 211 +f 3337 1124 3235 211 +f 3339 215 2122 214 +f 2127 1328 2125 1327 +f 2107 201 2108 1314 +f 3301 1366 2098 1335 +f 3340 1209 3241 238 +f 237 2172 1315 3340 +f 1316 3243 1339 3341 +f 2178 1317 2177 1316 +f 2180 243 3223 1138 +f 2181 245 2180 1138 +f 1146 3229 248 3342 +f 2030 155 3253 1324 +f 152 2024 1319 3343 +f 3255 1175 3344 152 +f 2025 1321 3344 1175 +f 3225 1140 2026 1320 +f 2027 153 2026 1140 +f 2117 209 3284 1371 +f 2130 1322 2124 1351 +f 3261 1323 2031 1325 +f 2125 1326 3210 1327 +f 2094 1329 3231 1314 +f 2104 199 2105 1331 +f 2108 203 2094 1314 +f 2115 207 3211 1186 +f 180 2080 1332 3345 +f 3276 1194 2102 196 +f 2103 1306 3334 1333 +f 3346 1336 3245 1337 +f 2175 240 3347 1316 +f 240 2174 1338 3347 +f 2174 1337 3245 1338 +f 2176 239 2175 1316 +f 2177 241 2176 1316 +f 2179 242 3341 1339 +f 3348 250 2190 249 +f 3217 1127 3348 249 +f 1145 3217 249 3349 +f 3229 1145 3349 248 +f 2193 1340 3264 1146 +f 3247 1214 2186 1342 +f 2188 1344 3294 1212 +f 3249 1341 3336 1312 +f 1312 2192 247 3350 +f 2187 246 2186 1214 +f 2033 157 2030 1324 +f 1370 3353 1346 3351 +f 1181 3215 150 3352 +f 3262 1181 3352 1347 +f 3257 1174 3343 1319 +f 2028 1348 2027 1140 +f 3258 1179 2029 154 +f 3233 1349 2135 219 +f 2119 1305 2134 1152 +f 3282 1372 2118 218 +f 2124 1350 2129 1351 +f 3219 1352 2123 1353 +f 3286 1205 3354 1354 +f 2131 212 2123 1352 +f 1356 2133 1357 3339 +f 3337 216 2133 1356 +f 3289 1158 2128 1358 +f 3237 1351 2129 1359 +f 2032 1360 2031 1323 +f 2105 1361 3298 1331 +f 2113 205 2114 1362 +f 2114 206 3268 1362 +f 2112 204 3296 1364 +f 2110 1363 3270 1330 +f 2116 208 2117 1371 +f 3274 1222 3355 1365 +f 3345 1331 3274 1365 +f 3299 1333 3334 185 +f 185 2089 1365 3355 +f 2097 194 2098 1366 +f 2096 193 3267 1119 +f 1209 3340 1315 3356 +f 3291 1209 3356 1367 +f 3346 1368 2173 238 +f 3241 1336 3346 238 +f 1370 3351 151 3357 +f 3215 1370 3357 150 +f 1313 3358 1375 3338 +f 2136 1373 2118 1372 +f 2106 1374 3272 1219 +f 1127 3227 253 3348 +f 2194 253 3227 1143 +f 3111 1393 3359 1376 +f 3359 1604 3543 1376 +f 3360 1556 3519 1565 +f 3361 1553 3122 1377 +f 3134 1044 3404 1552 +f 3362 1605 3552 1603 +f 3363 1399 3563 1379 +f 3113 1378 3363 1379 +f 3364 1589 3545 1592 +f 3365 1380 3522 1381 +f 3366 1382 3544 1588 +f 3367 1383 3572 1626 +f 3368 1384 3554 1606 +f 1385 3167 1078 3369 +f 1390 3132 1032 3370 +f 1600 3409 1423 3371 +f 3366 1387 3111 1376 +f 3372 1621 3561 1388 +f 3362 1394 3206 1413 +f 3181 1389 3373 1607 +f 3374 1426 3559 1610 +f 3375 1419 3130 1557 +f 3375 1561 3524 1567 +f 3376 1032 3122 1553 +f 3377 1554 3369 1078 +f 3376 1391 3516 1386 +f 3378 1402 3154 1549 +f 3154 1111 3410 1549 +f 1446 3189 1424 3379 +f 3124 1411 3372 1388 +f 3380 1034 3124 1388 +f 3359 1393 3182 1603 +f 3182 1394 3362 1603 +f 3381 1417 3204 1414 +f 3382 1084 3397 1396 +f 3365 1071 3158 1398 +f 3383 1398 3158 1397 +f 3384 1563 3520 1557 +f 3130 1072 3384 1557 +f 3363 1378 3164 1381 +f 3164 1071 3365 1381 +f 3384 1072 3160 1568 +f 3385 1564 3527 1568 +f 3160 1400 3385 1568 +f 3360 1420 3403 1401 +f 3386 1077 3167 1385 +f 3169 1402 3378 1550 +f 3378 1403 3515 1550 +f 3387 1404 3197 1445 +f 3150 1430 3406 1594 +f 3388 1064 3152 1601 +f 3156 1069 3389 1405 +f 3389 1598 3549 1405 +f 1406 3420 1407 3390 +f 1632 3390 1407 3391 +f 3118 1030 3392 1408 +f 3380 1622 3568 1623 +f 3192 1425 3416 1409 +f 3393 1438 3367 1030 +f 3372 1411 3394 1620 +f 3142 1105 3419 1410 +f 3206 1412 3395 1413 +f 1612 3422 1439 3396 +f 3173 1113 3421 1611 +f 3398 1609 3557 1608 +f 3204 1091 3399 1414 +f 3399 1416 3556 1414 +f 3400 1416 3399 1415 +f 3179 1417 3381 1418 +f 3381 1395 3555 1418 +f 3368 1389 3179 1418 +f 3401 1558 3163 1419 +f 3402 1564 3385 1420 +f 3386 1421 3403 1420 +f 1551 3404 1044 3405 +f 3406 1430 3146 1592 +f 3146 1109 3364 1592 +f 3407 1433 3547 1596 +f 3388 1602 3551 1422 +f 3152 1038 3408 1601 +f 3199 1064 3388 1422 +f 3411 1616 3562 1618 +f 3411 1436 3113 1379 +f 3412 1635 3577 1392 +f 3412 1424 3187 1097 +f 3413 1635 3412 1097 +f 3414 1048 3140 1627 +f 3140 1049 3415 1627 +f 3191 1034 3380 1623 +f 3374 1088 3136 1428 +f 3136 1084 3382 1428 +f 3382 1427 3560 1428 +f 3398 1415 3425 1429 +f 3406 1591 3546 1594 +f 3364 1109 3427 1590 +f 3148 1110 3417 1432 +f 3407 1110 3429 1595 +f 3389 1069 3128 1597 +f 3128 1431 3418 1597 +f 3126 1423 3409 1434 +f 3409 1435 3550 1434 +f 3194 1436 3411 1618 +f 3138 1407 3420 1437 +f 3185 1048 3414 1630 +f 3414 1629 3575 1630 +f 3201 1439 3422 1440 +f 3171 1082 3423 1441 +f 3424 1613 3423 1082 +f 3116 1447 3430 1442 +f 1443 3558 1429 3425 +f 1415 3177 1087 3425 +f 3426 1443 3425 1087 +f 3175 1088 3374 1610 +f 3196 1444 3428 1587 +f 3144 1387 3366 1588 +f 3207 1470 3431 1566 +f 3431 1559 3521 1566 +f 3432 1580 3535 1448 +f 3433 1584 3218 1128 +f 3230 1501 3475 1575 +f 3434 1617 3562 1615 +f 3435 1449 3580 1639 +f 3209 1450 3435 1639 +f 3436 1562 3525 1452 +f 3437 1472 3538 1453 +f 3438 1560 3523 1454 +f 3439 1645 3587 1644 +f 3440 1455 3561 1460 +f 3441 1581 3541 1582 +f 3442 1583 3534 1456 +f 3443 1135 3252 1458 +f 3438 1529 3207 1566 +f 3444 1459 3579 1638 +f 3434 1471 3302 1619 +f 3279 1196 3445 1488 +f 3446 1633 3574 1628 +f 3447 1498 3226 1461 +f 3447 1576 3537 1462 +f 3448 1463 3442 1457 +f 3441 1479 3228 1456 +f 3228 1457 3442 1456 +f 3449 1464 3458 1183 +f 3250 1466 3479 1465 +f 1467 3285 1202 3450 +f 3220 1485 3444 1638 +f 3451 1468 3220 1638 +f 3431 1470 3266 1615 +f 3266 1471 3434 1615 +f 3452 1492 3300 1624 +f 1634 3486 1150 3453 +f 3437 1473 3254 1577 +f 3454 1577 3254 1180 +f 3455 1474 3540 1461 +f 3226 1476 3455 1461 +f 3435 1450 3260 1453 +f 3260 1473 3437 1453 +f 3455 1476 3256 1475 +f 3456 1579 3536 1475 +f 3256 1499 3456 1475 +f 3432 1478 3474 1477 +f 3457 1126 3263 1582 +f 3263 1479 3441 1582 +f 3265 1183 3458 1586 +f 3459 1530 3293 1168 +f 3246 1164 3476 1513 +f 3460 1215 3248 1574 +f 3252 1481 3461 1458 +f 3461 1571 3529 1458 +f 3462 1643 3585 1642 +f 3462 1154 3281 1521 +f 3214 1206 3463 1482 +f 3451 1469 3583 1646 +f 3288 1483 3485 1511 +f 3464 1484 3439 1206 +f 3444 1485 3465 1486 +f 3238 1159 3490 1487 +f 3302 1195 3466 1619 +f 1636 3493 1217 3467 +f 3468 1490 3453 1150 +f 3271 1523 3492 1524 +f 3469 1512 3571 1491 +f 3300 1493 3470 1624 +f 3470 1494 3570 1624 +f 3471 1494 3470 1221 +f 3277 1492 3452 1495 +f 3452 1496 3568 1495 +f 3440 1196 3277 1495 +f 3472 1497 3259 1498 +f 3473 1579 3456 1478 +f 3457 1500 3474 1478 +f 3475 1585 3533 1575 +f 3475 1501 3265 1586 +f 3476 1164 3242 1452 +f 3242 1515 3436 1452 +f 3477 1555 3528 1570 +f 3460 1480 3532 1505 +f 3248 1504 3478 1574 +f 3443 1572 3530 1520 +f 3295 1215 3460 1505 +f 3480 1506 3581 1640 +f 3480 1451 3209 1639 +f 3481 1508 3584 1641 +f 3481 1202 3283 1507 +f 3482 1508 3481 1507 +f 3483 1199 3236 1510 +f 3236 1157 3484 1510 +f 3287 1468 3451 1646 +f 3446 1149 3232 1631 +f 3232 1150 3486 1631 +f 3469 1221 3496 1625 +f 3476 1502 3526 1513 +f 3436 1515 3498 1514 +f 3244 1503 3487 1518 +f 3477 1503 3500 1569 +f 3461 1481 3224 1516 +f 3224 1517 3488 1516 +f 3222 1135 3489 1519 +f 3290 1451 3480 1640 +f 3234 1154 3491 1509 +f 3281 1199 3483 1521 +f 3483 1522 3586 1521 +f 3297 1217 3493 1525 +f 3269 1526 3494 1489 +f 3495 1637 3494 1526 +f 3212 1122 3501 1527 +f 1614 3573 1625 3496 +f 1221 3275 1191 3496 +f 3497 1614 3496 1191 +f 3273 1149 3446 1628 +f 3292 1163 3499 1528 +f 3240 1529 3438 1454 +f 2473 475 1812 26 +f 403 2356 1531 3502 +f 2415 403 3502 391 +f 1814 31 2434 460 +f 2354 402 2357 1533 +f 2199 257 3503 146 +f 2007 231 2198 1534 +f 2200 256 3504 1535 +f 2337 388 2336 1540 +f 1536 2337 1540 3505 +f 3505 166 2047 1537 +f 2047 162 2203 1537 +f 2204 1538 3506 142 +f 1538 2207 252 3506 +f 3507 230 2166 1539 +f 3508 1540 3509 454 +f 3509 1542 2427 454 +f 2166 166 3508 1539 +f 3509 1540 3510 386 +f 1540 2335 1541 3510 +f 2353 401 2346 1542 +f 2206 1543 3511 234 +f 2191 252 2207 259 +f 3507 1544 2198 231 +f 2336 387 2335 1540 +f 3511 1543 2203 162 +f 3512 1546 3513 860 +f 3513 56 1853 860 +f 1898 1547 2126 213 +f 1978 122 2138 1548 +f 3514 1553 3361 1599 +f 3410 1422 3551 1599 +f 1403 3378 1549 3515 +f 3515 1599 3405 1550 +f 3404 1551 3405 1599 +f 3361 1552 3404 1599 +f 3514 1573 3516 1391 +f 3370 1386 3516 1573 +f 3377 1390 3370 1573 +f 3369 1554 3377 1573 +f 1421 3386 1385 3517 +f 3403 1421 3517 1573 +f 1556 3360 1401 3518 +f 3518 1573 3528 1555 +f 3520 1452 3525 1557 +f 3383 1558 3499 1454 +f 1559 3563 1399 3521 +f 3522 1566 3521 1381 +f 1560 3522 1380 3523 +f 3401 1567 3498 1528 +f 3524 1514 3498 1567 +f 1562 3524 1561 3525 +f 3526 1502 3520 1563 +f 3519 1555 3477 1569 +f 3523 1398 3383 1454 +f 3526 1568 3527 1513 +f 3459 1513 3527 1564 +f 3500 1530 3459 1564 +f 3402 1565 3519 1569 +f 3487 1570 3528 1573 +f 3488 1518 3487 1573 +f 1571 3461 1516 3529 +f 3529 1573 3530 1458 +f 1572 3443 1458 3530 +f 3530 1573 3489 1520 +f 3478 1519 3489 1573 +f 1480 3460 1574 3531 +f 2426 1578 3532 1480 +f 1578 3479 1505 3532 +f 3533 1578 3433 1575 +f 3474 1500 3541 1578 +f 3535 1578 3473 1448 +f 3537 1578 3472 1462 +f 3538 1578 3539 1453 +f 3539 1449 3435 1453 +f 3538 1472 3437 1577 +f 3454 1497 3472 1578 +f 3537 1576 3447 1461 +f 1578 3537 1461 3540 +f 1578 3540 1474 3536 +f 3535 1580 3432 1477 +f 1578 3541 1581 3534 +f 1578 3534 1583 3542 +f 3448 1584 3433 1578 +f 3533 1585 3475 1586 +f 3458 1464 3449 1578 +f 3449 1465 3479 1578 +f 1909 1593 3543 1604 +f 3543 1593 3544 1382 +f 3428 1588 3544 1593 +f 3427 1587 3428 1593 +f 1589 3364 1590 3545 +f 3545 1593 3546 1592 +f 1591 3406 1592 3546 +f 3546 1593 3387 1594 +f 3429 1404 3387 1593 +f 1433 3407 1595 3547 +f 3547 1593 3417 1596 +f 3418 1432 3417 1593 +f 1598 3389 1597 3548 +f 1599 3371 1405 3549 +f 3550 1435 3409 1600 +f 1599 3408 1434 3550 +f 3551 1602 3388 1601 +f 865 1909 1604 3552 +f 865 3552 1605 3553 +f 3395 1607 3373 865 +f 3373 1606 3554 865 +f 3554 1384 3368 1418 +f 865 3554 1418 3555 +f 3555 1395 3381 1414 +f 865 3555 1414 3556 +f 3400 1608 3557 865 +f 3557 1609 3398 1429 +f 865 3557 1429 3558 +f 3426 1610 3559 865 +f 3559 1426 3374 1428 +f 865 3559 1428 3560 +f 3560 1427 3382 1396 +f 3397 1611 3421 865 +f 3421 1440 3422 865 +f 3422 1612 3396 865 +f 3396 1441 3423 865 +f 3423 1613 3424 865 +f 3424 1442 3430 865 +f 3430 1446 3379 865 +f 3379 1392 3578 865 +f 3415 1408 3573 1614 +f 3561 1455 3567 1388 +f 3562 1617 3565 1618 +f 3563 1559 3431 1615 +f 1615 3562 1616 3564 +f 3419 1618 3565 1619 +f 3466 1488 3394 1410 +f 3445 1460 3566 1620 +f 1460 3561 1621 3566 +f 1495 3568 1622 3567 +f 1496 3569 1623 3568 +f 3416 1623 3569 1624 +f 1409 3416 1624 3570 +f 3393 1409 3570 1494 +f 3471 1491 3571 1438 +f 3571 1383 3367 1438 +f 3572 1512 3469 1625 +f 3392 1626 3572 1625 +f 1408 3392 1625 3573 +f 3497 1628 3574 1627 +f 3574 1629 3414 1627 +f 1633 3391 1630 3575 +f 1632 3391 1633 3576 +f 3486 1634 3390 1632 +f 3420 1406 3390 1634 +f 3453 1490 3468 1437 +f 3468 1524 3413 1437 +f 1524 3492 1392 3577 +f 3492 1525 3493 1392 +f 3493 1636 3578 1392 +f 3467 1489 3494 864 +f 3494 1637 3495 864 +f 3495 1527 3501 864 +f 3484 1482 3463 864 +f 864 3581 1506 3580 +f 864 3490 1640 3581 +f 3465 1487 3490 864 +f 864 3579 1459 3582 +f 864 3583 1469 3579 +f 864 3485 1646 3583 +f 3578 1636 3467 864 +f 3501 1467 3450 864 +f 3450 1641 3584 864 +f 3482 1509 3491 864 +f 3491 1642 3585 864 +f 3585 1643 3462 1521 +f 864 3585 1521 3586 +f 3586 1522 3483 1510 +f 3463 1644 3587 864 +f 3587 1645 3439 1484 +f 3464 1511 3485 864 +f 1780 3594 1647 3588 +f 1648 3591 1654 3588 +f 3589 1650 3593 1649 +f 3590 1780 3591 1651 +f 3592 1653 3589 1651 +f 1653 3592 1781 3593 +f 3594 1781 3592 1652 +f 3595 1648 3588 1647 +f 3595 1652 3592 1651 +f 1656 3601 1662 3596 +f 1660 3600 1655 3596 +f 1657 3598 1661 3597 +f 1656 3596 1655 3597 +f 1657 3600 1658 3598 +f 1659 3601 1661 3598 +f 1660 3596 1662 3599 +f 1659 3598 1658 3599 +f 1660 3599 1658 3600 +f 1657 3597 1655 3600 +f 1656 3597 1661 3601 +f 1659 3599 1662 3601 +f 1988 1713 2008 1663 +f 2009 144 1989 135 +f 2780 1664 3602 1666 +f 2814 1665 2812 148 +f 2812 856 2841 148 +f 2841 858 2019 148 +f 1667 1787 1668 3603 +f 1669 2720 739 3603 +f 1669 3603 1668 3604 +f 2830 1669 3604 1670 +f 1670 1904 1671 3605 +f 2002 1672 2809 1726 +f 2806 827 2809 1672 +f 2835 1673 2806 1672 +f 2821 1675 3606 1676 +f 1675 2794 1710 3606 +f 1797 1723 3627 1722 +f 1980 128 3607 1684 +f 1677 2790 1684 3607 +f 2791 1677 3607 128 +f 2816 833 2791 128 +f 806 2787 1678 3608 +f 3608 128 3609 853 +f 3609 1694 2803 854 +f 2833 824 2803 1694 +f 2015 1682 2834 1679 +f 2838 1680 2726 1682 +f 2726 1681 2748 1682 +f 2748 819 3610 1682 +f 2017 1683 2837 1698 +f 1700 2797 1699 3611 +f 1995 1684 2796 1700 +f 2819 1686 2796 1684 +f 2793 1687 2819 1684 +f 2746 765 2793 1684 +f 2790 764 2746 1684 +f 2776 796 2767 1688 +f 2767 786 2018 1688 +f 2781 798 2780 1666 +f 2751 1770 3655 1690 +f 2755 776 2751 1690 +f 1785 1667 3603 739 +f 739 2721 775 3612 +f 1692 2014 1693 3614 +f 2014 1694 1981 1693 +f 2012 1695 3613 137 +f 2842 829 2810 1683 +f 2810 1696 2807 1683 +f 2807 1697 2837 1683 +f 1904 15 3615 1671 +f 2827 1671 3615 1699 +f 2799 816 2827 1699 +f 2822 840 2799 1699 +f 2797 839 2822 1699 +f 2011 147 1990 1701 +f 2010 145 2011 1701 +f 1994 1730 3616 130 +f 2789 1703 2815 130 +f 2815 1704 2786 130 +f 2786 825 3617 130 +f 2005 1705 2831 849 +f 2802 822 2831 1705 +f 1705 3617 1706 3618 +f 2773 1767 3652 233 +f 2766 1707 2773 233 +f 785 2766 233 3619 +f 2778 785 3619 143 +f 1708 3620 774 3621 +f 1783 1708 3621 737 +f 2003 1727 2836 1674 +f 2725 1709 2836 1727 +f 1798 1676 3606 1710 +f 14 1798 1710 3622 +f 2817 837 3629 14 +f 1984 130 3617 1705 +f 2006 1712 3623 1711 +f 1987 131 1985 1711 +f 1713 1987 1711 3623 +f 2779 1714 2778 143 +f 2000 1715 2813 797 +f 2811 831 2813 1715 +f 2839 832 2811 1715 +f 3 1783 737 3624 +f 3624 738 3626 1716 +f 2829 1717 3625 1719 +f 1718 2825 844 3625 +f 2826 814 3627 1723 +f 1906 1719 3625 844 +f 1721 2820 1722 3627 +f 2001 1725 2840 855 +f 2808 1724 2840 1725 +f 2004 1728 2724 744 +f 2747 745 2724 1728 +f 2800 767 2747 1728 +f 2832 1729 2800 1728 +f 1733 1799 14 3629 +f 2818 1731 3630 1730 +f 811 2745 809 3630 +f 2788 1732 3616 1730 +f 1993 1733 3629 837 +f 2763 782 2847 13 +f 2761 1734 3639 22 +f 2736 755 2761 22 +f 1735 2765 754 3631 +f 3631 22 3633 1736 +f 747 2728 1736 3633 +f 3633 22 3634 1737 +f 3635 1771 3632 16 +f 3637 1734 2763 13 +f 12 1809 24 3637 +f 3638 1734 3637 24 +f 2723 743 2785 863 +f 2785 1740 2744 863 +f 2744 1741 2732 863 +f 2732 1742 2742 863 +f 2742 803 2783 863 +f 2783 1743 2730 863 +f 2730 1745 3640 863 +f 1745 2771 1744 3640 +f 2771 792 3641 1744 +f 2740 1746 3642 1744 +f 2775 1768 3653 1769 +f 1769 2035 1744 3642 +f 2848 862 2762 1748 +f 2760 1747 2735 1749 +f 2735 783 2764 1749 +f 3643 1750 1794 1749 +f 757 2737 23 3643 +f 2846 232 2770 1753 +f 862 2784 740 3644 +f 2743 1751 2784 862 +f 2731 762 2743 862 +f 2741 758 2731 862 +f 2782 1752 2741 862 +f 2768 1755 2770 232 +f 2739 787 2768 232 +f 2169 1756 2772 1757 +f 2764 757 3643 1749 +f 2737 1758 3646 23 +f 1758 2727 1759 3646 +f 2727 1760 3647 1759 +f 1760 2756 1761 3647 +f 2756 1762 3648 1761 +f 1762 2758 1763 3648 +f 2758 1766 3649 1763 +f 3649 1766 2733 1765 +f 1764 3649 1765 3650 +f 769 3651 9 3650 +f 769 3654 2 3651 +f 1767 2773 793 3652 +f 1756 1999 233 3652 +f 1688 2018 1769 3653 +f 1708 1783 2 3654 +f 3620 1708 3654 769 +f 1770 2751 1771 3655 +f 3656 1772 2430 1773 +f 2430 1774 1874 1773 +f 1777 2429 1776 3657 +f 1854 56 3513 1775 +f 3513 1546 3660 1775 +f 1775 3658 456 3657 +f 3656 59 1864 1776 +f 2429 1772 3656 1776 +f 3658 141 1998 1779 +f 2472 456 3658 1779 +f 1547 1901 1778 3659 +f 1779 2034 156 3659 +f 141 3658 1775 3660 +f 2469 492 2497 493 +f 3590 1649 3593 1781 +f 1782 1 3651 2 +f 1782 83 1921 90 +f 1784 1716 1905 83 +f 1785 739 3612 1690 +f 1786 4 1787 5 +f 1786 6 1793 73 +f 1788 23 3646 1759 +f 1789 20 3638 24 +f 1790 99 1806 1763 +f 1790 1764 1802 7 +f 1791 22 1807 8 +f 1791 17 1803 1739 +f 1792 89 1802 9 +f 1793 16 1803 70 +f 1795 12 3637 13 +f 1795 45 1837 47 +f 1796 1723 1797 94 +f 1797 1722 2821 1676 +f 1800 82 1884 76 +f 1800 1699 3615 15 +f 1804 1761 1806 19 +f 1805 21 1807 1738 +f 1808 97 1930 10 +f 1808 1750 3643 23 +f 1810 26 1812 612 +f 40 1825 37 1811 +f 1811 604 2526 612 +f 475 2424 40 1812 +f 1816 590 2603 30 +f 1817 606 2611 33 +f 1817 32 2496 31 +f 1818 33 2534 607 +f 1819 36 1820 32 +f 1824 43 1829 527 +f 1826 40 1827 39 +f 1826 587 2532 38 +f 1827 43 1828 614 +f 1828 585 2527 603 +f 1538 2204 32 1829 +f 1832 529 2598 602 +f 1834 44 1835 45 +f 863 2843 859 1834 +f 755 2736 753 1835 +f 1837 784 2765 46 +f 859 2844 54 1838 +f 50 2769 791 1838 +f 782 2763 781 1839 +f 1734 2761 44 1840 +f 743 2723 48 1841 +f 1740 2785 805 1842 +f 1741 2744 49 1843 +f 1742 2732 760 1844 +f 803 2742 802 1845 +f 1743 2783 801 1846 +f 1848 1746 2740 51 +f 1768 2775 52 1849 +f 1850 786 2767 795 +f 798 2781 799 1851 +f 1852 54 1853 55 +f 1664 2780 53 1852 +f 1854 1775 3657 1776 +f 1665 2814 55 1855 +f 829 2842 57 1856 +f 1696 2810 828 1857 +f 1858 61 1860 59 +f 1858 255 1870 60 +f 854 2803 823 1860 +f 1691 1982 62 1861 +f 824 2833 850 1862 +f 856 2812 857 1865 +f 1697 2807 58 1866 +f 1680 2838 64 1867 +f 1681 2726 768 1868 +f 819 2748 65 1869 +f 1873 59 3656 1773 +f 1874 1774 2469 493 +f 1875 68 1876 25 +f 1876 777 1877 69 +f 1877 780 1878 21 +f 1878 751 1879 8 +f 1879 750 1880 17 +f 1880 72 1881 70 +f 1882 71 2721 847 +f 1883 847 2720 843 +f 82 1903 4 1883 +f 1886 816 2799 817 +f 1887 840 2822 838 +f 1888 839 2797 813 +f 1889 1686 2819 77 +f 1890 1687 2793 78 +f 1891 765 2746 763 +f 1892 764 2790 810 +f 1893 833 2816 807 +f 939 2967 938 1895 +f 1896 1547 1898 80 +f 932 2928 933 1896 +f 1897 81 1900 945 +f 1899 213 2111 81 +f 865 3578 864 1900 +f 938 1902 1578 1901 +f 1903 1670 3604 1668 +f 1905 1719 1906 93 +f 1906 844 3628 1720 +f 1748 2762 98 1911 +f 1747 2760 85 1912 +f 783 2735 752 1913 +f 757 2764 86 1914 +f 1758 2737 756 1916 +f 1917 99 1918 88 +f 1917 1762 2756 87 +f 1922 93 1923 92 +f 1923 94 1924 841 +f 1924 138 1925 95 +f 1925 129 1926 815 +f 1926 134 1927 812 +f 1927 133 1928 836 +f 1928 139 1929 834 +f 742 1933 101 1932 +f 740 2784 804 1933 +f 1751 2743 761 1934 +f 762 2731 748 1935 +f 758 2741 759 1936 +f 1752 2782 800 1937 +f 1940 1753 2770 790 +f 1941 1755 2768 102 +f 1942 787 2739 103 +f 1943 1757 2772 794 +f 1944 1707 2766 105 +f 1714 2779 104 1945 +f 1946 797 2813 830 +f 1947 831 2811 106 +f 1948 832 2839 108 +f 1949 1724 2808 107 +f 1950 115 1968 107 +f 1950 827 2806 826 +f 1951 109 2745 96 +f 1703 2789 808 1953 +f 1704 2815 110 1954 +f 825 2786 111 1955 +f 126 1958 848 1957 +f 1957 822 2802 821 +f 1959 451 2420 629 +f 1960 1729 2832 848 +f 629 1962 766 1961 +f 1961 767 2800 818 +f 1962 627 2421 113 +f 1963 745 2747 766 +f 113 1965 114 1964 +f 1964 1709 2725 746 +f 1965 452 2422 630 +f 630 1967 826 1966 +f 1966 1673 2835 114 +f 1967 438 2392 115 +f 1969 437 2618 116 +f 1970 441 2619 633 +f 1971 632 2620 118 +f 1972 442 2617 631 +f 1973 121 1975 631 +f 1973 634 2621 119 +f 1974 450 2417 120 +f 1976 123 2849 122 +f 903 2906 84 1977 +f 1548 2845 861 1978 +f 1684 1996 127 1980 +f 1694 3609 128 1981 +f 1982 136 3614 1693 +f 1983 130 1984 129 +f 1984 1705 2006 1711 +f 1988 1663 2009 135 +f 1989 144 2010 1701 +f 1990 136 1991 1701 +f 147 2012 137 1990 +f 1993 837 2818 1730 +f 75 1996 1684 1995 +f 1700 3611 1685 1995 +f 1998 149 2016 142 +f 797 2779 143 2000 +f 2001 1548 2168 1725 +f 855 2839 1715 2001 +f 1726 2808 1725 2002 +f 1674 2835 1672 2003 +f 744 2725 1727 2004 +f 849 2832 1728 2005 +f 2006 231 2007 1712 +f 2007 1534 2199 146 +f 2008 1713 3623 1712 +f 146 2013 1695 2012 +f 2015 1535 2016 1682 +f 2015 1679 2833 1694 +f 2017 1698 2838 1682 +f 2018 786 2781 1666 +f 149 2020 148 2019 +f 2019 858 2842 1683 +f 2020 860 2035 1666 +f 150 3357 151 2022 +f 1345 3351 1346 2023 +f 2024 1321 2025 156 +f 2025 1175 3225 1320 +f 2028 1140 3258 154 +f 2029 1179 3253 155 +f 2032 1323 3210 1326 +f 1324 3261 1325 2033 +f 2034 142 3506 252 +f 1296 3166 1226 2036 +f 1275 3119 158 2037 +f 2040 162 2047 159 +f 2041 1298 3161 1276 +f 2042 1277 3159 1248 +f 163 3320 1278 2044 +f 164 3311 1247 2045 +f 2048 1255 2081 162 +f 2049 1290 3112 1225 +f 2053 1230 3205 168 +f 2054 1228 3180 1237 +f 2057 1227 3178 1261 +f 2059 1115 3203 170 +f 2060 866 2061 171 +f 2060 1090 3176 1260 +f 1300 3326 172 2062 +f 1288 3303 173 2065 +f 1286 3172 1287 2066 +f 2067 1283 3200 1285 +f 2069 1025 3170 174 +f 2070 1027 3115 175 +f 2072 1280 3188 176 +f 2074 1251 3186 1252 +f 2075 1046 3137 177 +f 2076 866 2077 179 +f 1329 2094 202 2078 +f 2078 1094 3184 179 +f 188 3305 189 2080 +f 1103 3193 1282 2082 +f 2083 1282 3324 192 +f 1545 3511 162 2083 +f 1033 3123 184 2086 +f 1306 2103 1545 2087 +f 197 3322 186 2088 +f 2092 199 2104 198 +f 2092 1029 3323 190 +f 1374 2106 190 2093 +f 2093 1028 3139 191 +f 1119 3330 1303 2096 +f 2097 1366 3267 193 +f 2099 1223 3301 1335 +f 2100 1194 3278 195 +f 2103 1333 3276 196 +f 2104 1331 3345 1332 +f 1219 3298 1361 2106 +f 2107 1314 3272 1374 +f 2108 200 2109 203 +f 2110 866 2111 1363 +f 1330 3332 1304 2110 +f 1364 3270 1363 2112 +f 2113 1362 3296 204 +f 2115 1186 3268 206 +f 2116 1371 3211 207 +f 2119 1152 3233 219 +f 2120 210 2134 213 +f 2120 217 3338 1375 +f 2121 216 3337 211 +f 2122 1357 2133 213 +f 2125 213 2126 1326 +f 1547 3659 156 2126 +f 1327 3289 1358 2127 +f 1158 3237 1359 2128 +f 1351 3219 1353 2130 +f 1352 3286 1354 2131 +f 2132 1354 3354 1355 +f 2135 1349 3282 218 +f 2136 1372 3284 209 +f 220 2139 1548 2138 +f 2139 1231 3143 221 +f 1294 3195 1293 2140 +f 2143 1107 3145 1238 +f 2145 1058 3149 1265 +f 2147 230 2167 1263 +f 2150 1055 3307 223 +f 2151 166 2166 223 +f 2151 1269 3127 224 +f 2154 1232 3155 1268 +f 2156 1036 3125 1234 +f 2157 1035 3151 1273 +f 2159 1062 3198 227 +f 2160 1243 3309 1245 +f 228 3319 229 2163 +f 1270 3318 1302 2164 +f 2164 1295 2165 166 +f 1757 2739 232 2169 +f 2171 236 3335 1367 +f 2173 1337 2174 234 +f 2178 1316 3341 242 +f 2179 1339 3223 243 +f 2182 1138 3251 1310 +f 2183 252 2191 1310 +f 2184 1134 3221 1343 +f 2185 1133 3247 1342 +f 2187 1214 3294 1344 +f 2188 1212 3350 247 +f 2189 1318 3342 248 +f 2190 253 2194 252 +f 259 2206 234 2191 +f 2192 1340 2193 252 +f 1146 3342 1318 2193 +f 1143 3333 251 2194 +f 1369 3333 1347 2195 +f 2196 257 2199 254 +f 2200 255 2201 256 +f 2200 1535 3503 257 +f 2202 1537 2203 453 +f 142 3504 258 2204 +f 2205 1543 2206 43 +f 1578 2426 453 2205 +f 308 2264 260 2208 +f 267 2228 262 2210 +f 2212 400 2350 263 +f 2212 279 2240 338 +f 2215 264 2270 353 +f 2217 265 2351 275 +f 2217 324 2243 289 +f 2218 268 2347 398 +f 2218 282 2231 269 +f 2220 270 2352 271 +f 2220 340 2245 288 +f 2221 325 2282 326 +f 2222 369 2315 375 +f 2223 345 2316 330 +f 2224 330 2322 346 +f 2229 399 2348 266 +f 2229 283 2234 335 +f 2230 339 2292 274 +f 685 2625 276 2231 +f 2232 671 2235 339 +f 284 2675 685 2233 +f 285 2652 284 2234 +f 2235 650 2238 277 +f 646 2633 285 2236 +f 684 2673 646 2237 +f 2238 278 2241 273 +f 337 2291 338 2239 +f 286 2651 684 2239 +f 645 2631 286 2240 +f 2241 281 2256 280 +f 291 2671 681 2246 +f 2247 293 2248 727 +f 2248 294 2249 724 +f 2249 341 2250 725 +f 2250 296 2251 295 +f 2251 357 2252 718 +f 2252 325 2253 700 +f 2253 356 2254 297 +f 2254 299 2255 298 +f 2255 319 2277 300 +f 2256 677 2257 331 +f 2257 302 2258 344 +f 2258 643 2259 301 +f 2259 304 2260 303 +f 2260 305 2261 332 +f 2261 667 2262 306 +f 2262 307 2263 261 +f 334 2289 350 2266 +f 312 2300 311 2268 +f 313 2701 711 2271 +f 354 2297 353 2271 +f 711 2687 314 2272 +f 314 2683 315 2273 +f 315 2693 666 2274 +f 323 2285 360 2274 +f 666 2654 316 2275 +f 316 2627 713 2276 +f 2277 321 2278 732 +f 2278 320 2279 735 +f 2279 322 2280 716 +f 394 2344 395 2281 +f 2285 329 2327 328 +f 361 2308 362 2286 +f 2288 373 2299 301 +f 2297 382 2331 342 +f 2298 384 2307 343 +f 390 2339 358 2305 +f 2310 411 2319 363 +f 2310 272 2323 417 +f 2311 374 2383 364 +f 2312 406 2313 365 +f 2312 347 2318 433 +f 2313 432 2320 366 +f 2315 429 2380 368 +f 2317 371 2412 370 +f 2318 372 2319 412 +f 2321 430 2358 404 +f 2322 376 2381 367 +f 2323 333 2324 418 +f 2324 378 2326 377 +f 2325 423 2329 349 +f 2326 379 2333 420 +f 2329 421 2333 348 +f 2334 386 3510 1541 +f 2336 327 2338 387 +f 444 2415 391 2343 +f 2353 1542 3509 386 +f 1533 2427 455 2354 +f 404 2379 428 2357 +f 2365 406 2366 409 +f 2370 418 2371 415 +f 2371 377 2372 419 +f 2372 420 2373 706 +f 2373 421 2374 649 +f 2374 423 2375 422 +f 2375 383 2376 424 +f 2376 426 2377 427 +f 2377 385 2409 425 +f 439 2428 1533 2378 +f 2378 661 2651 435 +f 2379 663 2387 1533 +f 2383 432 2384 430 +f 2391 436 2631 440 +f 2391 437 2392 439 +f 2394 287 2669 659 +f 2397 696 2671 728 +f 2398 727 2710 443 +f 2400 725 2691 702 +f 2401 295 2706 719 +f 2402 444 2414 719 +f 731 2712 447 2406 +f 2409 380 2410 446 +f 2410 381 2411 448 +f 2412 640 2627 449 +f 1573 3514 1599 2418 +f 2418 1593 2622 635 +f 2419 112 2616 254 +f 1578 2425 467 2423 +f 2423 492 2469 1778 +f 1480 3531 1573 2426 +f 2428 1539 3508 454 +f 2430 456 2472 1774 +f 2431 457 2444 1532 +f 2431 32 2497 492 +f 2433 652 2642 459 +f 463 2495 460 2434 +f 2435 461 2653 686 +f 2438 676 2439 501 +f 2439 653 2440 512 +f 2440 679 2474 511 +f 2445 564 2648 457 +f 2446 656 2646 657 +f 2447 565 2670 466 +f 2448 660 2650 680 +f 2449 682 2672 683 +f 2451 730 2711 729 +f 2452 571 2709 726 +f 467 2454 468 2453 +f 2453 572 2692 703 +f 2455 717 2457 505 +f 2455 504 2470 477 +f 2458 609 2517 470 +f 475 2473 505 2459 +f 2460 519 2515 514 +f 520 2519 521 2464 +f 522 2520 473 2466 +f 524 2521 523 2468 +f 517 2508 476 2470 +f 2472 1779 3659 1778 +f 26 2494 478 2473 +f 2474 644 2475 479 +f 2475 669 2476 507 +f 2476 670 2477 508 +f 2477 480 2478 497 +f 2478 481 2479 498 +f 2479 482 2480 483 +f 491 2500 515 2484 +f 2485 554 2698 708 +f 2486 709 2636 487 +f 2487 555 2680 689 +f 715 2586 477 2493 +f 2498 495 2510 494 +f 2498 513 2514 525 +f 2499 621 2610 605 +f 2501 617 2502 497 +f 2501 498 2509 620 +f 2502 622 2511 508 +f 2503 499 2608 500 +f 2506 597 2514 503 +f 2509 483 2510 506 +f 599 2524 528 2516 +f 532 2535 496 2517 +f 557 2528 519 2519 +f 556 2596 522 2521 +f 2525 593 2592 591 +f 714 2586 583 2526 +f 2527 584 2577 577 +f 698 2559 600 2528 +f 2529 570 2573 530 +f 2530 573 2576 584 +f 2531 613 2579 580 +f 2535 598 2595 516 +f 615 2615 624 2537 +f 542 2642 533 2537 +f 2538 673 2541 534 +f 543 2640 542 2539 +f 535 2608 536 2540 +f 675 2666 543 2540 +f 2541 688 2544 619 +f 537 2644 675 2542 +f 538 2668 537 2543 +f 2544 665 2547 540 +f 618 2610 539 2545 +f 546 2630 538 2545 +f 539 2602 545 2546 +f 2547 559 2562 558 +f 623 2589 548 2549 +f 626 2613 625 2551 +f 2553 552 2554 551 +f 2554 599 2555 553 +f 2555 598 2556 554 +f 2556 532 2557 709 +f 2557 610 2558 555 +f 689 2680 690 2559 +f 2560 556 2561 699 +f 2561 575 2583 694 +f 2562 648 2563 560 +f 2563 662 2564 592 +f 2564 563 2565 591 +f 2565 562 2566 561 +f 2566 564 2567 594 +f 2567 656 2568 596 +f 2568 565 2569 595 +f 568 2597 569 2571 +f 723 2705 574 2576 +f 574 2690 693 2577 +f 693 2682 579 2578 +f 613 2587 577 2578 +f 579 2715 733 2579 +f 581 2717 582 2581 +f 604 2600 588 2582 +f 2583 578 2584 704 +f 2584 611 2585 576 +f 589 2612 502 2588 +f 2590 616 2609 534 +f 2606 27 2607 611 +f 2623 416 2677 636 +f 2623 637 2658 414 +f 2624 639 2678 485 +f 2624 484 2659 638 +f 2635 422 2679 318 +f 2635 317 2697 649 +f 2638 547 2657 481 +f 2638 480 2662 544 +f 2645 440 2647 654 +f 2649 659 2669 290 +f 2656 668 2658 307 +f 2657 549 2659 482 +f 2660 541 2662 670 +f 2677 415 2699 309 +f 2678 551 2700 486 +f 2686 729 2711 567 +f 2695 706 2697 705 +f 2695 310 2699 419 +f 2696 707 2700 553 +f 2708 443 2710 724 +f 2713 469 2717 581 +f 2718 846 2719 737 +f 2718 772 2754 773 +f 2723 863 2847 782 +f 2734 771 2753 750 +f 2734 751 2759 779 +f 2736 22 3631 754 +f 2738 1735 3631 1736 +f 1744 3641 788 2740 +f 2750 91 2754 774 +f 2750 770 3620 769 +f 2755 1690 3612 775 +f 2757 1737 2759 780 +f 1749 2848 1748 2760 +f 862 3644 741 2762 +f 788 3641 792 2769 +f 1756 3652 793 2772 +f 2775 1769 3642 1746 +f 2776 1768 2777 796 +f 1688 3653 1689 2776 +f 2782 862 3645 1754 +f 2787 853 2805 60 +f 2788 1730 3630 809 +f 130 3616 1732 2789 +f 2792 811 3630 1731 +f 2798 1721 3627 814 +f 1705 3618 852 2802 +f 852 3618 1706 2804 +f 2814 148 3602 1664 +f 2816 128 3608 1678 +f 2817 14 3622 835 +f 2823 1718 3625 1717 +f 2824 845 2828 74 +f 2826 1723 3628 844 +f 2827 79 2828 1671 +f 2829 1719 3626 738 +f 1670 3605 842 2830 +f 2834 1682 3610 820 +f 2845 862 2848 101 +f 2846 1753 3645 862 +f 2850 1117 2877 124 +f 1231 3112 1021 2852 +f 1294 3143 868 2853 +f 1107 3195 1108 2854 +f 1058 3145 1059 2855 +f 1057 3149 869 2856 +f 2858 1232 3127 870 +f 2859 1036 3155 871 +f 2860 1035 3125 1068 +f 2861 1062 3151 872 +f 2862 117 2863 873 +f 2862 1243 3198 1063 +f 906 2910 874 2863 +f 2864 1244 3153 873 +f 874 2890 890 2865 +f 1070 3157 1075 2865 +f 1073 3162 875 2866 +f 1279 3129 1039 2867 +f 1250 3159 876 2868 +f 1277 3161 877 2869 +f 2871 1298 3119 1031 +f 2872 1275 3166 879 +f 2873 1296 3131 881 +f 2874 1042 3121 880 +f 2875 1271 3133 882 +f 2876 1079 3168 1065 +f 1230 3180 883 2877 +f 1228 3178 884 2878 +f 1227 3203 885 2879 +f 1115 3176 1116 2880 +f 2882 1090 3202 1114 +f 2883 1085 3174 1045 +f 2884 1259 3135 887 +f 2885 1288 3172 1112 +f 2886 1286 3200 888 +f 2887 1283 3170 889 +f 2888 891 2893 889 +f 2888 1025 3115 1026 +f 2889 1027 3188 894 +f 904 2907 891 2890 +f 1024 3165 890 2891 +f 1103 3114 1023 2892 +f 2894 1280 3186 893 +f 2895 1251 3137 895 +f 2896 1046 3184 1093 +f 2897 1094 3139 896 +f 1101 3190 898 2899 +f 1281 3123 899 2900 +f 1033 3141 1052 2901 +f 1051 3193 892 2902 +f 953 2909 900 2903 +f 2905 901 2911 121 +f 947 2988 902 2906 +f 2907 952 2981 946 +f 959 2975 906 2911 +f 907 2939 927 2912 +f 942 2968 940 2912 +f 1119 3267 907 2913 +f 1118 3208 1161 2914 +f 1308 3239 1160 2915 +f 1209 3291 1210 2916 +f 1336 3241 908 2917 +f 1338 3245 909 2918 +f 2920 1138 3223 911 +f 2921 1134 3251 1171 +f 2922 1133 3221 912 +f 2923 1214 3247 1132 +f 2924 1212 3294 1213 +f 2925 940 2926 914 +f 2925 1341 3249 913 +f 2927 1146 3264 914 +f 1324 3253 916 2928 +f 1179 3258 917 2929 +f 1140 3225 1139 2930 +f 1175 3255 918 2931 +f 1174 3257 1177 2932 +f 2934 1370 3215 920 +f 2935 1181 3262 1142 +f 2936 1143 3227 921 +f 2937 1127 3217 922 +f 2938 1145 3229 915 +f 1366 3301 923 2939 +f 1223 3278 924 2940 +f 1194 3276 1192 2941 +f 1333 3299 925 2942 +f 1222 3274 926 2943 +f 2945 1331 3298 1218 +f 2946 1219 3272 1190 +f 2947 1314 3231 1148 +f 2948 1330 3270 1187 +f 2949 1364 3296 929 +f 2950 1362 3268 930 +f 2951 1186 3211 931 +f 2952 80 2959 931 +f 2952 1371 3284 1201 +f 2953 1372 3282 1200 +f 1323 3261 932 2954 +f 1327 3210 1120 2955 +f 1158 3289 1207 2956 +f 1351 3237 934 2957 +f 1352 3219 1130 2958 +f 995 2972 927 2959 +f 2960 1349 3233 1197 +f 2961 1152 3280 1198 +f 2962 1313 3235 1156 +f 1205 3286 1204 2964 +f 2966 993 2973 945 +f 2968 1000 3053 941 +f 943 2971 944 2970 +f 987 3057 936 2971 +f 992 3042 995 2973 +f 2975 956 2984 958 +f 2976 951 2979 950 +f 2977 958 2984 957 +f 949 3014 971 2978 +f 2980 955 2982 954 +f 2986 974 3041 960 +f 955 2989 961 2986 +f 971 3003 963 2989 +f 1393 3111 961 2990 +f 1394 3182 965 2991 +f 1412 3206 964 2992 +f 1389 3181 1092 2993 +f 1417 3179 966 2994 +f 1091 3204 968 2995 +f 2997 1088 3175 1086 +f 2998 1084 3136 1089 +f 2999 1113 3173 969 +f 3000 1439 3201 970 +f 3001 1082 3171 1081 +f 3002 1447 3116 1083 +f 1099 3187 1098 3003 +f 3005 1407 3138 1047 +f 3006 1048 3185 1095 +f 3007 1049 3140 1096 +f 3008 1030 3118 1050 +f 1425 3192 1102 3010 +f 1034 3191 1100 3011 +f 1411 3124 973 3012 +f 1105 3142 1106 3013 +f 1436 3194 1104 3014 +f 1387 3144 975 3015 +f 1444 3196 1053 3016 +f 1109 3146 976 3017 +f 1430 3150 1061 3018 +f 1445 3197 1060 3019 +f 3021 1110 3148 1056 +f 3022 1431 3128 978 +f 3023 1069 3156 979 +f 3024 1423 3126 1037 +f 3025 1038 3152 980 +f 3026 1064 3199 1067 +f 3027 1111 3154 1066 +f 3028 1066 3029 981 +f 3028 950 3041 974 +f 3029 1402 3169 1080 +f 3030 1044 3134 1043 +f 3031 1377 3122 982 +f 3032 1032 3132 983 +f 3033 1078 3167 1076 +f 1400 3160 984 3035 +f 1072 3130 1040 3036 +f 1419 3163 1041 3037 +f 1397 3158 1074 3038 +f 1071 3164 986 3039 +f 1378 3113 949 3040 +f 3043 998 3052 990 +f 3044 991 3047 988 +f 3045 990 3052 989 +f 1012 3083 1006 3046 +f 3048 1020 3050 994 +f 3055 1015 3110 997 +f 1020 3058 1184 3055 +f 1006 3072 1004 3058 +f 1470 3207 1184 3059 +f 1471 3266 1185 3060 +f 1195 3302 1224 3061 +f 1196 3279 1193 3062 +f 1492 3277 1001 3063 +f 1493 3300 1002 3064 +f 3066 1149 3273 1003 +f 3067 1150 3232 1151 +f 3068 1523 3271 1188 +f 3069 1217 3297 1189 +f 3070 1526 3269 1005 +f 3071 1122 3212 1121 +f 1203 3283 1123 3072 +f 3074 1154 3234 1153 +f 3075 1199 3281 1155 +f 3076 1157 3236 1007 +f 3077 1206 3214 1125 +f 1483 3288 1010 3079 +f 1468 3287 1009 3080 +f 1485 3220 1131 3081 +f 1159 3238 1011 3082 +f 1451 3290 1208 3083 +f 1529 3240 1162 3084 +f 1163 3292 1013 3085 +f 1515 3242 1165 3086 +f 1164 3246 1169 3087 +f 1168 3293 1211 3088 +f 3090 1503 3244 1166 +f 3091 1517 3224 1172 +f 3092 1481 3252 1137 +f 3093 1135 3222 1136 +f 3094 1504 3248 1216 +f 3095 1215 3295 1014 +f 3096 1466 3250 1170 +f 3097 1170 3098 1018 +f 3097 988 3110 1015 +f 3098 1183 3265 1147 +f 3099 1501 3230 1016 +f 3100 1128 3218 1129 +f 3101 1457 3228 1144 +f 3102 1479 3263 1182 +f 1499 3256 1176 3104 +f 1476 3226 1141 3105 +f 1498 3259 1017 3106 +f 1180 3254 1173 3107 +f 1473 3260 1019 3108 +f 1450 3209 1012 3109 +f 3116 1442 3424 1082 +f 1408 3415 1049 3118 +f 1077 3386 1420 3120 +f 1434 3408 1038 3126 +f 3132 1390 3377 1078 +f 3134 1552 3361 1377 +f 1257 3303 1288 3135 +f 1437 3413 1097 3138 +f 3142 1410 3394 1411 +f 3144 1588 3428 1444 +f 1432 3418 1431 3148 +f 3150 1594 3387 1445 +f 3153 1242 3309 1243 +f 1405 3371 1423 3156 +f 3157 165 3321 1073 +f 1558 3383 1397 3163 +f 1550 3405 1044 3169 +f 1441 3396 1439 3171 +f 3173 1611 3397 1084 +f 3175 1610 3426 1087 +f 1607 3395 1412 3181 +f 3183 1290 3325 1292 +f 1630 3391 1407 3185 +f 3189 1446 3430 1447 +f 3191 1623 3416 1425 +f 3192 1409 3393 1030 +f 3194 1618 3419 1105 +f 3196 1587 3427 1109 +f 3197 1404 3429 1110 +f 3199 1422 3410 1111 +f 3201 1440 3421 1113 +f 3208 235 3330 1119 +f 3212 1527 3495 1526 +f 1124 3337 1356 3213 +f 1482 3484 1157 3214 +f 1126 3457 1478 3216 +f 3218 1584 3448 1457 +f 1519 3478 1504 3222 +f 3230 1575 3433 1128 +f 1329 3332 1330 3231 +f 1509 3482 1507 3234 +f 3238 1487 3465 1485 +f 3240 1454 3499 1163 +f 1518 3488 1517 3244 +f 3246 1513 3459 1168 +f 3249 1312 3350 1212 +f 3250 1465 3449 1183 +f 3255 152 3343 1174 +f 3257 1319 3353 1370 +f 1497 3454 1180 3259 +f 1489 3467 1217 3269 +f 3271 1524 3468 1150 +f 3273 1628 3497 1191 +f 1488 3466 1195 3279 +f 3280 210 3358 1313 +f 3285 1467 3501 1122 +f 3287 1646 3485 1483 +f 3288 1511 3464 1206 +f 3290 1640 3490 1159 +f 3292 1528 3498 1515 +f 3293 1530 3500 1503 +f 3295 1505 3479 1466 +f 3297 1525 3492 1523 +f 3299 185 3355 1222 +f 3305 187 3313 1029 +f 1603 3552 1604 3359 +f 1565 3402 1420 3360 +f 3362 1413 3553 1605 +f 1381 3521 1399 3363 +f 3365 1398 3523 1380 +f 3366 1376 3543 1382 +f 1626 3392 1030 3367 +f 1606 3373 1389 3368 +f 3369 1573 3517 1385 +f 3370 1032 3376 1386 +f 1599 3550 1600 3371 +f 3372 1620 3566 1621 +f 3375 1557 3525 1561 +f 1567 3401 1419 3375 +f 1553 3514 1391 3376 +f 3379 1424 3412 1392 +f 1388 3567 1622 3380 +f 3384 1568 3526 1563 +f 1494 3471 1438 3393 +f 1488 3445 1620 3394 +f 865 3553 1413 3395 +f 865 3560 1396 3397 +f 1608 3400 1415 3398 +f 865 3556 1416 3400 +f 3401 1528 3499 1558 +f 1569 3500 1564 3402 +f 3403 1573 3518 1401 +f 1596 3417 1110 3407 +f 1599 3551 1601 3408 +f 3410 1599 3515 1549 +f 3411 1379 3564 1616 +f 1524 3577 1635 3413 +f 3415 1614 3497 1627 +f 3418 1593 3548 1597 +f 1619 3466 1410 3419 +f 1634 3453 1437 3420 +f 865 3558 1443 3426 +f 3427 1593 3545 1590 +f 3429 1593 3547 1595 +f 1448 3473 1478 3432 +f 3434 1619 3565 1617 +f 3436 1514 3524 1562 +f 3438 1566 3522 1560 +f 1644 3463 1206 3439 +f 1460 3445 1196 3440 +f 3440 1495 3567 1455 +f 1456 3534 1581 3441 +f 3442 1463 3542 1583 +f 1520 3489 1135 3443 +f 3444 1486 3582 1459 +f 1631 3576 1633 3446 +f 1462 3472 1498 3447 +f 1578 3542 1463 3448 +f 3450 1202 3481 1641 +f 1638 3579 1469 3451 +f 3452 1624 3569 1496 +f 1578 3538 1577 3454 +f 3455 1475 3536 1474 +f 1582 3541 1500 3457 +f 1578 3533 1586 3458 +f 1642 3491 1154 3462 +f 864 3587 1484 3464 +f 864 3582 1486 3465 +f 1491 3471 1221 3469 +f 1578 3536 1579 3473 +f 3474 1578 3535 1477 +f 1452 3520 1502 3476 +f 1570 3487 1503 3477 +f 3478 1573 3531 1574 +f 3480 1639 3580 1506 +f 864 3584 1508 3482 +f 3484 864 3586 1510 +f 1632 3576 1631 3486 +f 3488 1573 3529 1516 +f 3505 1540 3508 166 +f 3512 141 3660 1546 +f 3518 1555 3519 1556 +f 3539 864 3580 1449 +f 3548 1599 3549 1598 +f 3563 1615 3564 1379 +f 3571 1512 3572 1383 +f 3574 1633 3575 1629 +f 3588 1654 3591 1780 +f 3589 1649 3590 1651 +f 1653 3593 1650 3589 +f 3590 1781 3594 1780 +f 3591 1648 3595 1651 +f 1652 3595 1647 3594 +f 3613 1692 3614 136 +f 3632 771 3636 1739 +f 3634 1739 3636 779 +f 3635 5 3655 1771 +f 3638 1738 3639 1734 +# 3672 faces, 0 coords texture + +# End of File diff --git a/tests/example/example_tests_main.cpp b/tests/example/example_tests_main.cpp index 32e8d02b7..426d1ffef 100644 --- a/tests/example/example_tests_main.cpp +++ b/tests/example/example_tests_main.cpp @@ -1,4 +1,3 @@ -#define CATCH_CONFIG_MAIN #include TEST_CASE("Is example succesful", "[example]") { diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 02764589b..0f9d447b3 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -1,4 +1,5 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) + add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests.cpp test_3mf.cpp @@ -10,6 +11,11 @@ add_executable(${_TEST_NAME}_tests test_polygon.cpp test_stl.cpp ) + +if (TARGET OpenVDB::openvdb) + target_sources(${_TEST_NAME}_tests PRIVATE test_hollowing.cpp) +endif() + target_link_libraries(${_TEST_NAME}_tests test_common libslic3r) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp new file mode 100644 index 000000000..b74eb76ab --- /dev/null +++ b/tests/libslic3r/test_hollowing.cpp @@ -0,0 +1,78 @@ +#include +#include +#include + +#include "libslic3r/OpenVDBUtils.hpp" +#include "libslic3r/Format/OBJ.hpp" + +#if defined(WIN32) || defined(_WIN32) +#define PATH_SEPARATOR R"(\)" +#else +#define PATH_SEPARATOR R"(/)" +#endif + +static Slic3r::TriangleMesh load_model(const std::string &obj_filename) +{ + Slic3r::TriangleMesh mesh; + auto fpath = TEST_DATA_DIR PATH_SEPARATOR + obj_filename; + Slic3r::load_obj(fpath.c_str(), &mesh); + return mesh; +} + +static bool _check_normals(const Slic3r::sla::Contour3D &mesh) +{ + for (auto & face : mesh.faces3) + { + + } + + return false; +} + +TEST_CASE("Passing OpenVDB grid conversion produce similar geometry.", "[Hollowing]") +{ + Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); + Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{in_mesh}; + auto ptr = Slic3r::meshToVolume(imesh, {}); + + REQUIRE(ptr); + + std::cout << "Grid class = " << ptr->getGridClass() << std::endl; + + Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -2.9, 1.0, true); + + std::cout << "Triangle count: " << omesh.faces3.size() << std::endl; + std::cout << "Quad count: " << omesh.faces4.size() << std::endl; + + REQUIRE(!omesh.empty()); + + SECTION("Converting to Contour3D to TriangleMesh") { + Slic3r::TriangleMesh msh = Slic3r::sla::to_triangle_mesh(omesh); + + msh.require_shared_vertices(); + msh.WriteOBJFile("out_tr.obj"); + + REQUIRE(msh.volume() == Approx(in_mesh.volume())); + } + +// omesh.faces4.clear(); + std::fstream outfile{"out.obj", std::ios::out}; + omesh.to_obj(outfile); + +} + +//TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") +//{ +// Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{load_model("20mm_cube.obj")}; +// auto ptr = Slic3r::meshToVolume(imesh, {}); + +// REQUIRE(ptr); + +// Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -1., 0.0, true); + +// REQUIRE(!omesh.empty()); + +// imesh.merge(omesh); +// std::fstream merged_outfile("merged_out.obj", std::ios::out); +// imesh.to_obj(merged_outfile); +//} diff --git a/tests/sla_print/CMakeLists.txt b/tests/sla_print/CMakeLists.txt index e8921ba48..ecc68db0a 100644 --- a/tests/sla_print/CMakeLists.txt +++ b/tests/sla_print/CMakeLists.txt @@ -1,5 +1,5 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) -add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests.cpp) +add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests_main.cpp sla_print_tests.cpp) target_link_libraries(${_TEST_NAME}_tests test_common libslic3r) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index 229eb4267..e4d5e05d2 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -1,9 +1,9 @@ -#include - #include #include #include +#include + // Debug #include @@ -50,21 +50,21 @@ void check_validity(const TriangleMesh &input_mesh, ASSUME_NO_REPAIR) { TriangleMesh mesh{input_mesh}; - + if (flags & ASSUME_NO_EMPTY) { REQUIRE_FALSE(mesh.empty()); } else if (mesh.empty()) return; // If it can be empty and it is, there is nothing left to do. - + REQUIRE(stl_validate(&mesh.stl)); - + bool do_update_shared_vertices = false; mesh.repair(do_update_shared_vertices); - + if (flags & ASSUME_NO_REPAIR) { REQUIRE_FALSE(mesh.needed_repair()); } - + if (flags & ASSUME_MANIFOLD) { mesh.require_shared_vertices(); if (!mesh.is_manifold()) mesh.WriteOBJFile("non_manifold.obj"); @@ -82,36 +82,36 @@ struct PadByproducts void _test_concave_hull(const Polygons &hull, const ExPolygons &polys) { REQUIRE(polys.size() >=hull.size()); - + double polys_area = 0; for (const ExPolygon &p : polys) polys_area += p.area(); - + double cchull_area = 0; for (const Slic3r::Polygon &p : hull) cchull_area += p.area(); - + REQUIRE(cchull_area >= Approx(polys_area)); - + size_t cchull_holes = 0; for (const Slic3r::Polygon &p : hull) cchull_holes += p.is_clockwise() ? 1 : 0; - + REQUIRE(cchull_holes == 0); - + Polygons intr = diff(to_polygons(polys), hull); REQUIRE(intr.empty()); } void test_concave_hull(const ExPolygons &polys) { sla::PadConfig pcfg; - + Slic3r::sla::ConcaveHull cchull{polys, pcfg.max_merge_dist_mm, []{}}; - + _test_concave_hull(cchull.polygons(), polys); - + coord_t delta = scaled(pcfg.brim_size_mm + pcfg.wing_distance()); ExPolygons wafflex = sla::offset_waffle_style_ex(cchull, delta); Polygons waffl = sla::offset_waffle_style(cchull, delta); - + _test_concave_hull(to_polygons(wafflex), polys); _test_concave_hull(waffl, polys); } @@ -121,23 +121,23 @@ void test_pad(const std::string & obj_filename, PadByproducts & out) { REQUIRE(padcfg.validate().empty()); - + TriangleMesh mesh = load_model(obj_filename); - + REQUIRE_FALSE(mesh.empty()); - + // Create pad skeleton only from the model Slic3r::sla::pad_blueprint(mesh, out.model_contours); - + test_concave_hull(out.model_contours); - + REQUIRE_FALSE(out.model_contours.empty()); - + // Create the pad geometry for the model contours only Slic3r::sla::create_pad({}, out.model_contours, out.mesh, padcfg); - + check_validity(out.mesh); - + auto bb = out.mesh.bounding_box(); REQUIRE(bb.max.z() - bb.min.z() == Approx(padcfg.full_height())); } @@ -166,42 +166,42 @@ void check_support_tree_integrity(const sla::SupportTreeBuilder &stree, double gnd = stree.ground_level; double H1 = cfg.max_solo_pillar_height_mm; double H2 = cfg.max_dual_pillar_height_mm; - + for (const sla::Head &head : stree.heads()) { REQUIRE((!head.is_valid() || head.pillar_id != sla::ID_UNSET || head.bridge_id != sla::ID_UNSET)); } - + for (const sla::Pillar &pillar : stree.pillars()) { if (std::abs(pillar.endpoint().z() - gnd) < EPSILON) { double h = pillar.height; - + if (h > H1) REQUIRE(pillar.links >= 1); else if(h > H2) { REQUIRE(pillar.links >= 2); } } - + REQUIRE(pillar.links <= cfg.pillar_cascade_neighbors); REQUIRE(pillar.bridges <= cfg.max_bridges_on_pillar); } - + double max_bridgelen = 0.; auto chck_bridge = [&cfg](const sla::Bridge &bridge, double &max_brlen) { Vec3d n = bridge.endp - bridge.startp; double d = sla::distance(n); max_brlen = std::max(d, max_brlen); - + double z = n.z(); double polar = std::acos(z / d); double slope = -polar + PI / 2.; REQUIRE(std::abs(slope) >= cfg.bridge_slope - EPSILON); }; - + for (auto &bridge : stree.bridges()) chck_bridge(bridge, max_bridgelen); REQUIRE(max_bridgelen <= cfg.max_bridge_length_mm); - + max_bridgelen = 0; for (auto &bridge : stree.crossbridges()) chck_bridge(bridge, max_bridgelen); - + double md = cfg.max_pillar_link_distance_mm / std::cos(-cfg.bridge_slope); REQUIRE(max_bridgelen <= md); } @@ -212,35 +212,35 @@ void test_supports(const std::string & obj_filename, { using namespace Slic3r; TriangleMesh mesh = load_model(obj_filename); - + REQUIRE_FALSE(mesh.empty()); - + TriangleMeshSlicer slicer{&mesh}; - + auto bb = mesh.bounding_box(); double zmin = bb.min.z(); double zmax = bb.max.z(); double gnd = zmin - supportcfg.object_elevation_mm; auto layer_h = 0.05f; - + out.slicegrid = grid(float(gnd), float(zmax), layer_h); slicer.slice(out.slicegrid , CLOSING_RADIUS, &out.model_slices, []{}); - + // Create the special index-triangle mesh with spatial indexing which // is the input of the support point and support mesh generators sla::EigenMesh3D emesh{mesh}; - + // Create the support point generator sla::SLAAutoSupports::Config autogencfg; autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); sla::SLAAutoSupports point_gen{emesh, out.model_slices, out.slicegrid, autogencfg, [] {}, [](int) {}}; - + // Get the calculated support points. std::vector support_points = point_gen.output(); - + int validityflags = ASSUME_NO_REPAIR; - + // If there is no elevation, support points shall be removed from the // bottom of the object. if (std::abs(supportcfg.object_elevation_mm) < EPSILON) { @@ -249,32 +249,32 @@ void test_supports(const std::string & obj_filename, } else { // Should be support points at least on the bottom of the model REQUIRE_FALSE(support_points.empty()); - + // Also the support mesh should not be empty. validityflags |= ASSUME_NO_EMPTY; } - + // Generate the actual support tree sla::SupportTreeBuilder treebuilder; treebuilder.build(sla::SupportableMesh{emesh, support_points, supportcfg}); - + check_support_tree_integrity(treebuilder, supportcfg); - + const TriangleMesh &output_mesh = treebuilder.retrieve_mesh(); - + check_validity(output_mesh, validityflags); - + // Quick check if the dimensions and placement of supports are correct auto obb = output_mesh.bounding_box(); - + double allowed_zmin = zmin - supportcfg.object_elevation_mm; - + if (std::abs(supportcfg.object_elevation_mm) < EPSILON) allowed_zmin = zmin - 2 * supportcfg.head_back_radius_mm; - + REQUIRE(obb.min.z() >= allowed_zmin); REQUIRE(obb.max.z() <= zmax); - + // Move out the support tree into the byproducts, we can examine it further // in various tests. out.obj_fname = std::move(obj_filename); @@ -296,7 +296,7 @@ void export_failed_case(const std::vector &support_slices, const ExPolygons &sup_slice = support_slices[n]; const ExPolygons &mod_slice = byproducts.model_slices[n]; Polygons intersections = intersection(sup_slice, mod_slice); - + std::stringstream ss; if (!intersections.empty()) { ss << byproducts.obj_fname << std::setprecision(4) << n << ".svg"; @@ -307,7 +307,7 @@ void export_failed_case(const std::vector &support_slices, svg.Close(); } } - + TriangleMesh m; byproducts.supporttree.retrieve_full_mesh(m); m.merge(byproducts.input_mesh); @@ -321,56 +321,56 @@ void test_support_model_collision( const sla::SupportConfig &input_supportcfg = {}) { SupportByproducts byproducts; - + sla::SupportConfig supportcfg = input_supportcfg; - + // Set head penetration to a small negative value which should ensure that // the supports will not touch the model body. supportcfg.head_penetration_mm = -0.15; - + // TODO: currently, the tailheads penetrating into the model body do not // respect the penetration parameter properly. No issues were reported so // far but we should definitely fix this. supportcfg.ground_facing_only = true; - + test_supports(obj_filename, supportcfg, byproducts); - + // Slice the support mesh given the slice grid of the model. std::vector support_slices = byproducts.supporttree.slice(byproducts.slicegrid, CLOSING_RADIUS); - + // The slices originate from the same slice grid so the numbers must match - + bool support_mesh_is_empty = byproducts.supporttree.retrieve_mesh(sla::MeshType::Pad).empty() && byproducts.supporttree.retrieve_mesh(sla::MeshType::Support).empty(); - + if (support_mesh_is_empty) REQUIRE(support_slices.empty()); else REQUIRE(support_slices.size() == byproducts.model_slices.size()); - + bool notouch = true; for (size_t n = 0; notouch && n < support_slices.size(); ++n) { const ExPolygons &sup_slice = support_slices[n]; const ExPolygons &mod_slice = byproducts.model_slices[n]; - + Polygons intersections = intersection(sup_slice, mod_slice); - + notouch = notouch && intersections.empty(); } - + if (!notouch) export_failed_case(support_slices, byproducts); - + REQUIRE(notouch); } -const char * const BELOW_PAD_TEST_OBJECTS[] = { +const char *const BELOW_PAD_TEST_OBJECTS[] = { "20mm_cube.obj", "V.obj", }; -const char * const AROUND_PAD_TEST_OBJECTS[] = { +const char *const AROUND_PAD_TEST_OBJECTS[] = { "20mm_cube.obj", "V.obj", "frog_legs.obj", @@ -392,46 +392,46 @@ template void test_pairhash() I A[nums] = {0}, B[nums] = {0}; std::unordered_set CH; std::unordered_map> ints; - + std::random_device rd; std::mt19937 gen(rd()); - + const I Ibits = int(sizeof(I) * CHAR_BIT); const II IIbits = int(sizeof(II) * CHAR_BIT); - + int bits = IIbits / 2 < Ibits ? Ibits / 2 : Ibits; if (std::is_signed::value) bits -= 1; const I Imin = 0; const I Imax = I(std::pow(2., bits) - 1); - + std::uniform_int_distribution dis(Imin, Imax); - + for (size_t i = 0; i < nums;) { I a = dis(gen); if (CH.find(a) == CH.end()) { CH.insert(a); A[i] = a; ++i; } } - + for (size_t i = 0; i < nums;) { I b = dis(gen); if (CH.find(b) == CH.end()) { CH.insert(b); B[i] = b; ++i; } } - + for (size_t i = 0; i < nums; ++i) { I a = A[i], b = B[i]; - + REQUIRE(a != b); - + II hash_ab = sla::pairhash(a, b); II hash_ba = sla::pairhash(b, a); REQUIRE(hash_ab == hash_ba); - + auto it = ints.find(hash_ab); - + if (it != ints.end()) { REQUIRE(( (it->second.first == a && it->second.second == b) || (it->second.first == b && it->second.second == a) - )); + )); } else ints[hash_ab] = std::make_pair(a, b); } @@ -446,72 +446,72 @@ TEST_CASE("Pillar pairhash should be unique", "[SLASupportGeneration]") { TEST_CASE("Flat pad geometry is valid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Disable wings padcfg.wall_height_mm = .0; - + for (auto &fname : BELOW_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("WingedPadGeometryIsValid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Add some wings to the pad to test the cavity padcfg.wall_height_mm = 1.; - + for (auto &fname : BELOW_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("FlatPadAroundObjectIsValid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Add some wings to the pad to test the cavity padcfg.wall_height_mm = 0.; // padcfg.embed_object.stick_stride_mm = 0.; padcfg.embed_object.enabled = true; padcfg.embed_object.everywhere = true; - + for (auto &fname : AROUND_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("WingedPadAroundObjectIsValid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Add some wings to the pad to test the cavity padcfg.wall_height_mm = 1.; padcfg.embed_object.enabled = true; padcfg.embed_object.everywhere = true; - + for (auto &fname : AROUND_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("ElevatedSupportGeometryIsValid", "[SLASupportGeneration]") { sla::SupportConfig supportcfg; supportcfg.object_elevation_mm = 5.; - + for (auto fname : SUPPORT_TEST_MODELS) test_supports(fname); } TEST_CASE("FloorSupportGeometryIsValid", "[SLASupportGeneration]") { sla::SupportConfig supportcfg; supportcfg.object_elevation_mm = 0; - + for (auto &fname: SUPPORT_TEST_MODELS) test_supports(fname, supportcfg); } TEST_CASE("ElevatedSupportsDoNotPierceModel", "[SLASupportGeneration]") { - + sla::SupportConfig supportcfg; - + for (auto fname : SUPPORT_TEST_MODELS) test_support_model_collision(fname, supportcfg); } TEST_CASE("FloorSupportsDoNotPierceModel", "[SLASupportGeneration]") { - + sla::SupportConfig supportcfg; supportcfg.object_elevation_mm = 0; - + for (auto fname : SUPPORT_TEST_MODELS) test_support_model_collision(fname, supportcfg); } @@ -525,7 +525,7 @@ TEST_CASE("InitializedRasterShouldBeNONEmpty", "[SLARasterOutput]") { // Default Prusa SL1 display parameters sla::Raster::Resolution res{2560, 1440}; sla::Raster::PixelDim pixdim{120. / res.width_px, 68. / res.height_px}; - + sla::Raster raster; raster.reset(res, pixdim); REQUIRE_FALSE(raster.empty()); @@ -547,54 +547,54 @@ static void check_raster_transformations(sla::Raster::Orientation o, double disp_w = 120., disp_h = 68.; sla::Raster::Resolution res{2560, 1440}; sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px}; - + auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)}); sla::Raster::Trafo trafo{o, mirroring}; trafo.origin_x = bb.center().x(); trafo.origin_y = bb.center().y(); - + sla::Raster raster{res, pixdim, trafo}; - + // create box of size 32x32 pixels (not 1x1 to avoid antialiasing errors) coord_t pw = 32 * coord_t(std::ceil(scaled(pixdim.w_mm))); coord_t ph = 32 * coord_t(std::ceil(scaled(pixdim.h_mm))); ExPolygon box; box.contour.points = {{-pw, -ph}, {pw, -ph}, {pw, ph}, {-pw, ph}}; - + double tr_x = scaled(20.), tr_y = tr_x; - + box.translate(tr_x, tr_y); ExPolygon expected_box = box; - + // Now calculate the position of the translated box according to output // trafo. if (o == sla::Raster::Orientation::roPortrait) expected_box.rotate(PI / 2.); - + if (mirroring[X]) for (auto &p : expected_box.contour.points) p.x() = -p.x(); - + if (mirroring[Y]) for (auto &p : expected_box.contour.points) p.y() = -p.y(); - + raster.draw(box); - + Point expected_coords = expected_box.contour.bounding_box().center(); double rx = unscaled(expected_coords.x() + bb.center().x()) / pixdim.w_mm; double ry = unscaled(expected_coords.y() + bb.center().y()) / pixdim.h_mm; auto w = size_t(std::floor(rx)); auto h = res.height_px - size_t(std::floor(ry)); - + REQUIRE((w < res.width_px && h < res.height_px)); - + auto px = raster.read_pixel(w, h); - + if (px != FullWhite) { sla::PNGImage img; std::fstream outf("out.png", std::ios::out); - + outf << img.serialize(raster); } - + REQUIRE(px == FullWhite); } @@ -603,7 +603,7 @@ TEST_CASE("MirroringShouldBeCorrect", "[SLARasterOutput]") { sla::Raster::MirrorX, sla::Raster::MirrorY, sla::Raster::MirrorXY}; - + sla::Raster::Orientation orientations[] = {sla::Raster::roLandscape, sla::Raster::roPortrait}; for (auto orientation : orientations) @@ -615,7 +615,7 @@ static ExPolygon square_with_hole(double v) { ExPolygon poly; coord_t V = scaled(v / 2.); - + poly.contour.points = {{-V, -V}, {V, -V}, {V, V}, {-V, V}}; poly.holes.emplace_back(); V = V / 2; @@ -631,16 +631,16 @@ static double pixel_area(TPixel px, const sla::Raster::PixelDim &pxdim) static double raster_white_area(const sla::Raster &raster) { if (raster.empty()) return std::nan(""); - + auto res = raster.resolution(); double a = 0; - + for (size_t x = 0; x < res.width_px; ++x) for (size_t y = 0; y < res.height_px; ++y) { auto px = raster.read_pixel(x, y); a += pixel_area(px, raster.pixel_dimensions()); } - + return a; } @@ -648,15 +648,15 @@ static double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd) { auto lines = p.lines(); double pix_err = pixel_area(FullWhite, pd) / 2.; - + // Worst case is when a line is parallel to the shorter axis of one pixel, // when the line will be composed of the max number of pixels double pix_l = std::min(pd.h_mm, pd.w_mm); - + double error = 0.; for (auto &l : lines) error += (unscaled(l.length()) / pix_l) * pix_err; - + return error; } @@ -664,28 +664,42 @@ TEST_CASE("RasterizedPolygonAreaShouldMatch", "[SLARasterOutput]") { double disp_w = 120., disp_h = 68.; sla::Raster::Resolution res{2560, 1440}; sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px}; - + sla::Raster raster{res, pixdim}; auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)}); - + ExPolygon poly = square_with_hole(10.); poly.translate(bb.center().x(), bb.center().y()); raster.draw(poly); - + double a = poly.area() / (scaled(1.) * scaled(1.)); double ra = raster_white_area(raster); double diff = std::abs(a - ra); - + REQUIRE(diff <= predict_error(poly, pixdim)); - + raster.clear(); poly = square_with_hole(60.); poly.translate(bb.center().x(), bb.center().y()); raster.draw(poly); - + a = poly.area() / (scaled(1.) * scaled(1.)); ra = raster_white_area(raster); diff = std::abs(a - ra); - + REQUIRE(diff <= predict_error(poly, pixdim)); } + +TEST_CASE("Triangle mesh conversions should be correct", "[SLAConversions]") +{ + sla::Contour3D cntr; + + { + std::fstream infile{"extruder_idler_quads.obj", std::ios::in}; + cntr.from_obj(infile); + } + + + + +} diff --git a/tests/sla_print/sla_print_tests_main.cpp b/tests/sla_print/sla_print_tests_main.cpp new file mode 100644 index 000000000..b2aa80259 --- /dev/null +++ b/tests/sla_print/sla_print_tests_main.cpp @@ -0,0 +1 @@ +#include