[
  {
    "path": ".github/FUNDING.yml",
    "content": "ko_fi: zippy84\n"
  },
  {
    "path": ".github/workflows/cmake.yml",
    "content": "name: CMake\n\non:\n  push:\n    branches:\n      - '*'\n\njobs:\n  Build:\n    runs-on: ${{matrix.os}}\n    strategy:\n      matrix:\n        os: [ubuntu-22.04, ubuntu-latest]\n        cxx: [g++, clang++]\n        build_type: [Debug, Release]\n\n    steps:\n    - uses: actions/checkout@v3\n\n    - name: Install Deps\n      run: |\n        sudo apt-get update\n        sudo apt-get -y upgrade\n        sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata\n        sudo apt-get -y install libvtk9-dev python3-vtk9 python3-pytest\n\n    - name: Configure CMake\n      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{matrix.build_type}}\n      env:\n        CXX: ${{matrix.cxx}}\n        CXXFLAGS: ${{matrix.cxxflags}}\n\n    - name: Build\n      run: cmake --build ${{github.workspace}}/build --config ${{matrix.build_type}}\n\n    - name: Test\n      working-directory: ${{github.workspace}}/build\n      run: ctest --output-on-failure -C ${{matrix.build_type}}\n\n  Coverage:\n    if: github.ref == 'refs/heads/master'\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n\n    - name: Install Deps\n      run: |\n        sudo apt-get update\n        sudo apt-get -y upgrade\n        sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata\n        sudo apt-get -y install libvtk9-dev python3-vtk9 python3-pytest gcovr\n\n    - name: Configure CMake\n      run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=Profile -DVTKBOOL_COVERAGE=ON\n\n    - name: Build\n      run: cmake --build ${{github.workspace}}/build\n\n    - name: Test\n      working-directory: ${{github.workspace}}/build\n      run: |\n        ctest --output-on-failure\n        gcovr -r .. . --exclude-throw-branches --xml -o coverage.xml\n\n    - name: Upload coverage reports to Codecov\n      uses: codecov/codecov-action@v3\n      with:\n        token: ${{secrets.CODECOV_TOKEN}}\n\n"
  },
  {
    "path": "CITATION.cff",
    "content": "cff-version: 1.2.0\ntitle: vtkbool\nmessage: 'If you use this software, please cite it as below.'\ntype: software\nauthors:\n  - family-names: Römer\n    given-names: Ronald\nidentifiers:\n  - type: doi\n    value: 10.5281/zenodo.10461186\nrepository-code: 'https://github.com/zippy84/vtkbool'\nlicense: Apache-2.0\nversion: 3.2.0\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "# Copyright 2012-2025 Ronald Römer\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\ncmake_minimum_required(VERSION 3.12 FATAL_ERROR)\nproject(vtkbool\n    VERSION 3.2\n    HOMEPAGE_URL https://github.com/zippy84/vtkbool)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nset(CMAKE_CXX_OUTPUT_EXTENSION_REPLACE 1)\n\nif(MSVC)\n    add_compile_options(/EHsc)\n    add_compile_definitions(_SCL_SECURE_NO_WARNINGS)\n    add_compile_definitions(_USE_MATH_DEFINES)\n    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)\nelse()\n    add_compile_options(-Wall -Wextra -fPIC -Wconversion)\nendif()\n\noption(VTKBOOL_PARAVIEW \"\" OFF)\noption(VTKBOOL_DEBUG \"\" OFF)\noption(VTKBOOL_COVERAGE \"\" OFF)\n\nmark_as_advanced(VTKBOOL_DEBUG)\nmark_as_advanced(VTKBOOL_COVERAGE)\n\nif(CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\" AND VTKBOOL_COVERAGE)\n    set(CMAKE_C_FLAGS_PROFILE --coverage)\n    set(CMAKE_CXX_FLAGS_PROFILE --coverage)\n    add_link_options(\"--coverage\")\nendif()\n\ninclude_directories(\".\")\n\nif(VTKBOOL_DEBUG)\n    add_definitions(-DDEBUG)\nendif()\n\nif(VTKBOOL_PARAVIEW)\n    find_package(ParaView REQUIRED)\n\n    if(ParaView_FOUND)\n        paraview_plugin_scan(\n            PLUGIN_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/paraview/paraview.plugin\"\n            PROVIDES_PLUGINS plugins\n            ENABLE_BY_DEFAULT ON)\n\n        set(BUILD_SHARED_LIBS ON)\n\n        include(GNUInstallDirs)\n\n        paraview_plugin_build(\n            PLUGINS ${plugins})\n\n    endif()\n\nelse()\n\n    find_package(VTK REQUIRED COMPONENTS FiltersSources IOLegacy FiltersExtraction FiltersGeometry FiltersModeling FiltersFlowPaths OPTIONAL_COMPONENTS WrappingPythonCore NO_MODULE)\n\n    if(VTK_FOUND)\n\n        if(VTK_VERSION VERSION_LESS \"9.0.0\")\n            message(FATAL_ERROR \"vtkbool requires VTK 9.0.0 or newer.\")\n        endif()\n\n        vtk_module_scan(\n            MODULE_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/module/vtk.module\"\n            REQUEST_MODULES vtkbool\n            PROVIDES_MODULES modules\n            ENABLE_TESTS ON)\n\n        set(BUILD_SHARED_LIBS ON)\n\n        include(GNUInstallDirs)\n\n        vtk_module_build(MODULES ${modules})\n\n        if (VTK_WrappingPythonCore_FOUND)\n\n            vtk_module_wrap_python(\n                MODULES ${modules}\n                PYTHON_PACKAGE \"vtkbool\"\n                BUILD_STATIC OFF\n                INSTALL_HEADERS OFF)\n\n            include(CTest)\n\n            vtk_module_python_default_destination(python_default_destination)\n\n            add_test(NAME \"import_vtkbool\"\n                COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/test_python.py)\n\n            set_property(TEST \"import_vtkbool\" APPEND PROPERTY ENVIRONMENT \"PYTHONPATH=${CMAKE_BINARY_DIR}/${python_default_destination}/vtkbool\")\n\n            add_test(NAME \"test_filter\"\n                COMMAND ${Python3_EXECUTABLE} -m pytest\n                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing)\n\n            set_property(TEST \"test_filter\" APPEND PROPERTY ENVIRONMENT \"PYTHONPATH=${CMAKE_BINARY_DIR}/${python_default_destination}/vtkbool\")\n\n            add_executable(test_merger testing/test_merger.cxx)\n            target_link_libraries(test_merger PRIVATE vtkbool ${VTK_LIBRARIES})\n\n            add_executable(test_congruence testing/test_congruence.cxx)\n            target_link_libraries(test_congruence PRIVATE vtkbool ${VTK_LIBRARIES})\n\n            vtk_module_autoinit(\n                TARGETS test_merger test_congruence\n                MODULES ${VTK_LIBRARIES}\n            )\n\n            add_test(NAME \"test_merger\"\n                COMMAND test_merger\n                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing)\n\n            add_test(NAME \"test_congruence\"\n                COMMAND test_congruence\n                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing)\n\n            add_test(NAME \"generate_frieze\"\n                COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/testing/generate_frieze.py\n                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/testing)\n\n            set_property(TEST \"generate_frieze\" APPEND PROPERTY ENVIRONMENT \"PYTHONPATH=${CMAKE_BINARY_DIR}/${python_default_destination}/vtkbool\")\n\n        endif()\n\n    endif()\n\nendif()\n"
  },
  {
    "path": "Contact.cxx",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#include \"Contact.h\"\n#include \"Optimize.h\"\n\n#include <vtkCleanPolyData.h>\n#include <vtkCellIterator.h>\n#include <vtkCellData.h>\n#include <vtkTriangleStrip.h>\n#include <vtkArrayIteratorTemplate.h>\n\n// #define _debA 0\n// #define _debB 0\n\n#if (defined(_debA) && defined(_debB))\nvtkIdType _idA, _idB;\n#endif\n\nvtkSmartPointer<vtkPolyData> Clean (vtkPolyData *pd) {\n\n    auto clean = vtkSmartPointer<vtkCleanPolyData>::New();\n    clean->SetOutputPointsPrecision(vtkAlgorithm::DOUBLE_PRECISION);\n    clean->SetTolerance(1e-6);\n\n    clean->ConvertLinesToPointsOff();\n    clean->ConvertPolysToLinesOff();\n    clean->ConvertStripsToPolysOff();\n\n    clean->SetInputData(pd);\n\n    clean->Update();\n\n    auto cleaned = clean->GetOutput();\n\n    vtkIdType numCells = cleaned->GetNumberOfCells();\n\n    auto newPd = vtkSmartPointer<vtkPolyData>::New();\n    newPd->SetPoints(cleaned->GetPoints());\n    newPd->Allocate(numCells);\n\n    auto cellIds = vtkSmartPointer<vtkIdTypeArray>::New();\n    cellIds->SetName(\"OrigCellIds\");\n    cellIds->Allocate(numCells);\n\n    vtkCellIterator *cellItr = cleaned->NewCellIterator();\n\n    vtkIdType cellId;\n    vtkIdList *ptIds;\n\n    vtkIdType num;\n    const vtkIdType *pts;\n\n    for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) {\n        cellId = cellItr->GetCellId();\n        ptIds = cellItr->GetPointIds();\n\n        if (cellItr->GetCellType() == VTK_TRIANGLE || cellItr->GetCellType() == VTK_POLYGON) {\n            newPd->InsertNextCell(cellItr->GetCellType(), ptIds);\n            cellIds->InsertNextValue(cellId);\n\n        } else if (cellItr->GetCellType() == VTK_TRIANGLE_STRIP) {\n            auto cells = vtkSmartPointer<vtkCellArray>::New();\n\n            vtkTriangleStrip::DecomposeStrip(cellItr->GetNumberOfPoints(), ptIds->GetPointer(0), cells);\n\n            for (cells->InitTraversal(); cells->GetNextCell(num, pts);) {\n                if (pts[0] != pts[1] && pts[1] != pts[2] && pts[2] != pts[0]) {\n                    newPd->InsertNextCell(VTK_TRIANGLE, num, pts);\n                    cellIds->InsertNextValue(cellId);\n                }\n            }\n\n        } else if (cellItr->GetCellType() == VTK_QUAD) {\n\n            double pA[3], pB[3], pC[3], pD[3];\n\n            cleaned->GetPoint(ptIds->GetId(0), pA);\n            cleaned->GetPoint(ptIds->GetId(1), pB);\n            cleaned->GetPoint(ptIds->GetId(2), pC);\n            cleaned->GetPoint(ptIds->GetId(3), pD);\n\n            double det = vtkMath::Determinant3x3(pB[0]-pA[0], pC[0]-pA[0], pD[0]-pA[0],\n                pB[1]-pA[1], pC[1]-pA[1], pD[1]-pA[1],\n                pB[2]-pA[2], pC[2]-pA[2], pD[2]-pA[2]);\n\n            if (std::abs(det) < 1e-10) {\n                newPd->InsertNextCell(VTK_POLYGON, ptIds);\n                cellIds->InsertNextValue(cellId);\n            } else {\n                const vtkIdType cellA[] = {ptIds->GetId(0), ptIds->GetId(1), ptIds->GetId(2)};\n                const vtkIdType cellB[] = {ptIds->GetId(2), ptIds->GetId(3), ptIds->GetId(0)};\n\n                newPd->InsertNextCell(VTK_TRIANGLE, 3, cellA);\n                cellIds->InsertNextValue(cellId);\n\n                newPd->InsertNextCell(VTK_TRIANGLE, 3, cellB);\n                cellIds->InsertNextValue(cellId);\n            }\n        }\n    }\n\n    cellItr->Delete();\n\n    newPd->GetCellData()->SetScalars(cellIds);\n    newPd->Squeeze();\n\n    return newPd;\n}\n\nContact::Contact (vtkPolyData *newPdA, vtkPolyData *newPdB) : newPdA(newPdA), newPdB(newPdB) {\n    assert(newPdA->GetCellData()->GetScalars(\"OrigCellIds\") != nullptr);\n    assert(newPdB->GetCellData()->GetScalars(\"OrigCellIds\") != nullptr);\n\n    pts = vtkSmartPointer<vtkPoints>::New();\n    pts->SetDataTypeToDouble();\n\n    lines = vtkSmartPointer<vtkPolyData>::New();\n    lines->SetPoints(pts);\n    lines->Allocate(1000);\n\n    contA = vtkSmartPointer<vtkIdTypeArray>::New();\n    contB = vtkSmartPointer<vtkIdTypeArray>::New();\n\n    contA->Allocate(1000);\n    contB->Allocate(1000);\n\n    contA->SetName(\"cA\");\n    contB->SetName(\"cB\");\n\n    lines->GetCellData()->AddArray(contA);\n    lines->GetCellData()->AddArray(contB);\n\n    sourcesA = vtkSmartPointer<vtkIdTypeArray>::New();\n    sourcesB = vtkSmartPointer<vtkIdTypeArray>::New();\n\n    sourcesA->Allocate(1000);\n    sourcesB->Allocate(1000);\n\n    sourcesA->SetNumberOfComponents(2);\n    sourcesB->SetNumberOfComponents(2);\n\n    sourcesA->SetName(\"sourcesA\");\n    sourcesB->SetName(\"sourcesB\");\n\n    lines->GetCellData()->AddArray(sourcesA);\n    lines->GetCellData()->AddArray(sourcesB);\n\n    touchesEdgesA = false;\n    touchesEdgesB = false;\n\n    GetNonManifoldEdges(newPdA, edgesA);\n    GetNonManifoldEdges(newPdB, edgesB);\n\n    treeA = vtkSmartPointer<vtkOBBTree>::New();\n    treeA->SetDataSet(newPdA);\n    treeA->BuildLocator();\n\n    treeB = vtkSmartPointer<vtkOBBTree>::New();\n    treeB->SetDataSet(newPdB);\n    treeB->BuildLocator();\n}\n\nvtkSmartPointer<vtkPolyData> Contact::GetLines (vtkPolyData *pdA, vtkLinearTransform *transA, vtkPolyData *pdB, vtkLinearTransform *transB) {\n\n    auto matrix = vtkSmartPointer<vtkMatrix4x4>::New();\n\n    if (pdA != nullptr) {\n        newPdA = pdA;\n    }\n\n    if (pdB != nullptr) {\n        newPdB = pdB;\n    }\n\n    auto matrixA = vtkSmartPointer<vtkMatrix4x4>::New();\n\n    if (transA != nullptr) {\n        matrixA = transA->GetMatrix();\n    }\n\n    auto matrixB = vtkSmartPointer<vtkMatrix4x4>::New();\n\n    if (transB != nullptr) {\n        matrixB = transB->GetMatrix();\n    }\n\n    auto tmpMatrix = vtkSmartPointer<vtkMatrix4x4>::New();\n\n    vtkMatrix4x4::Invert(matrixA, tmpMatrix);\n    vtkMatrix4x4::Multiply4x4(tmpMatrix, matrixB, matrix);\n\n    sourcesA->Reset();\n    sourcesB->Reset();\n    contA->Reset();\n    contB->Reset();\n\n    lines->Reset();\n\n    treeA->IntersectWithOBBTree(treeB, matrix, InterNodes, this);\n\n    IntersectReplacements();\n\n    if (touchesEdgesA || touchesEdgesB) {\n        throw std::runtime_error(\"Intersection goes through non-manifold edges.\");\n    }\n\n    auto clean = vtkSmartPointer<vtkCleanPolyData>::New();\n    clean->SetInputData(lines);\n    clean->ToleranceIsAbsoluteOn();\n    clean->SetAbsoluteTolerance(1e-5);\n    clean->Update();\n\n    auto cleaned = clean->GetOutput();\n\n    vtkCellIterator *cellItr = cleaned->NewCellIterator();\n\n    vtkIdType cellId;\n\n    for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) {\n        cellId = cellItr->GetCellId();\n\n        if (cellItr->GetCellType() != VTK_LINE) {\n            cleaned->DeleteCell(cellId);\n        }\n    }\n\n    cellItr->Delete();\n\n    cleaned->RemoveDeletedCells();\n\n    return cleaned;\n}\n\nvoid Contact::GetNonManifoldEdges (vtkPolyData *pd, NonManifoldEdgesType &edges) {\n\n    pd->BuildLinks();\n\n    vtkCellIterator *cellItr = pd->NewCellIterator();\n\n    vtkIdType cellId;\n    vtkIdList *ptIds;\n\n    auto neigs = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType i, j, k;\n\n    vtkIdType idA, idB;\n\n    vtkIdType n;\n\n    vtkIdType num;\n    const vtkIdType *pts;\n\n    vtkIdType a, b;\n\n    for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) {\n        cellId = cellItr->GetCellId();\n        ptIds = cellItr->GetPointIds();\n\n        for (i = 0; i < ptIds->GetNumberOfIds(); i++) {\n            j = i+1;\n\n            if (j == ptIds->GetNumberOfIds()) {\n                j = 0;\n            }\n\n            idA = ptIds->GetId(i);\n            idB = ptIds->GetId(j);\n\n            pd->GetCellEdgeNeighbors(cellId, idA, idB, neigs);\n\n            if (neigs->GetNumberOfIds() > 1) {\n\n                n = 0;\n\n                for (k = 0; k < neigs->GetNumberOfIds(); k++) {\n                    pd->GetCellPoints(neigs->GetId(k), num, pts);\n\n                    for (a = 0; a < num; a++) {\n                        b = a+1;\n\n                        if (b == num) {\n                            b = 0;\n                        }\n\n                        if (pts[a] == idB && pts[b] == idA) {\n                            n++;\n                        }\n                    }\n                }\n\n                if (n > 1) {\n                    edges.emplace(idA, idB);\n                    edges.emplace(idB, idA);\n                }\n            }\n        }\n    }\n\n    cellItr->Delete();\n}\n\nvoid Contact::InterEdgeLine (InterPtsType &interPts, const Point3d &pA, const Point3d &pB, Src src) {\n    // schnitt mit x-achse\n\n    double v[3];\n    Point3d::GetVec(pA, pB, v);\n\n    double w[] = {-v[1], v[0]};\n\n    double c = w[0]*pA.x+w[1]*pA.y;\n\n    if (std::abs(w[0]) < 1e-10) {\n        if (std::abs(pA.y) < 1e-5 && std::abs(pB.y) < 1e-5) {\n            interPts.emplace_back(pA.x, 0, 0, pA.x, pA.id, pB.id, End::A, src, PointSrc::Copied);\n            interPts.emplace_back(pB.x, 0, 0, pB.x, pA.id, pB.id, End::B, src, PointSrc::Copied);\n        }\n    } else {\n        double yA = pA.y-1e-6*v[1];\n        double yB = pB.y+1e-6*v[1];\n\n        if (std::signbit(yA) != std::signbit(yB)) {\n            double x = c/w[0];\n\n            double sA[] = {pA.x-x, pA.y};\n            double sB[] = {pB.x-x, pB.y};\n\n            double dA = sA[0]*sA[0]+sA[1]*sA[1];\n            double dB = sB[0]*sB[0]+sB[1]*sB[1];\n\n            End end = dA < 1e-12 ? End::A : (dB < 1e-12 ? End::B : End::None);\n\n            interPts.emplace_back(x, 0, 0, x, pA.id, pB.id, end, src, PointSrc::Calculated);\n        }\n    }\n\n}\n\nbool Contact::InterPolyLine (InterPtsType &interPts, const Base2 &base, const Poly &poly, Src src) {\n\n#if (defined(_debA) && defined(_debB))\n    if (_idA == _debA && _idB == _debB) {\n        std::cout << \"InterPolyLine()\" << std::endl;\n    }\n#endif\n\n    Poly::const_iterator itrA, itrB;\n\n    double q[3];\n\n    for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n        itrB = itrA+1;\n\n        if (itrB == poly.end()) {\n            itrB = poly.begin();\n        }\n\n        InterEdgeLine(interPts, *itrA, *itrB, src); // schnitt mit x-achse\n    }\n\n    for (auto& p : interPts) {\n        base.BackTransform(p.pt, q);\n\n        std::copy_n(q, 3, p.pt);\n    }\n\n    std::sort(interPts.begin(), interPts.end(), [](auto &a, auto &b) { return a.t < b.t; });\n\n    struct Cmp {\n        const double tol = 1e-5;\n\n        bool operator() (const InterPt &lhs, const InterPt &rhs) const {\n            if (lhs.pointSrc == PointSrc::Copied && rhs.pointSrc == PointSrc::Copied) {\n                if (lhs.GetEnd() == rhs.GetEnd()) {\n                    return false;\n                }\n            } else if (lhs.pointSrc == PointSrc::Copied) {\n                const vtkIdType end = lhs.GetEnd();\n\n                if (end == rhs.edge.f || end == rhs.edge.g) {\n                    return false;\n                }\n            } else if (rhs.pointSrc == PointSrc::Copied) {\n                const vtkIdType end = rhs.GetEnd();\n\n                if (end == lhs.edge.f || end == lhs.edge.g) {\n                    return false;\n                }\n            }\n\n            const double d = lhs.t-rhs.t;\n\n            if (std::abs(d) < tol) {\n                return false;\n            } else {\n                return d < 0;\n            }\n        }\n    };\n\n    std::map<InterPt, InterPtsType, Cmp> grouped;\n\n    std::vector<InterPtsType> sortedPts;\n\n    for (auto &p : interPts) {\n        grouped[p].push_back(p);\n    }\n\n    for (auto& [k, v] : grouped) {\n        std::sort(v.begin(), v.end(), [](const InterPt &lhs, const InterPt &rhs) { return lhs.pointSrc > rhs.pointSrc; });\n\n        sortedPts.push_back(v);\n    }\n\n    std::map<vtkIdType, double> allEnds;\n\n    decltype(sortedPts)::iterator itr;\n\n    for (itr = sortedPts.begin(); itr != sortedPts.end(); ++itr) {\n        if (itr == sortedPts.begin()) {\n            if (itr->size() == 2) {\n                itr->pop_back();\n            }\n        } else if (itr == sortedPts.end()-1) {\n            if (itr->size() == 2) {\n                itr->pop_back();\n            }\n        } else if (itr->size() == 1 && itr->back().end != End::None) {\n            itr->push_back(itr->back());\n        }\n\n        if (itr->back().end != End::None) {\n            auto p = itr->back();\n\n            allEnds.emplace(p.end == End::A ? p.edge.f : p.edge.g, p.t);\n        }\n\n        // hier schneidet sich das polygon selbst\n\n        if (itr->size() > 2) {\n            return false;\n        }\n\n        if (itr->size() == 2) {\n            // schnitt durch kongruente kanten\n\n            if (itr->back().end == End::None) {\n                return false;\n            }\n\n            auto &edgeA = itr->front().edge;\n            auto &edgeB = itr->back().edge;\n\n            if (edgeA.f == edgeB.g && edgeB.f == edgeA.g) {\n                return false;\n            }\n\n        }\n\n    }\n\n    std::map<vtkIdType, std::reference_wrapper<const Point3d>> pts;\n\n    for (auto &p : poly) {\n        pts.emplace(p.id, p);\n    }\n\n    vtkIdType ind;\n\n    vtkIdType prev, next;\n\n    for (itr = sortedPts.begin(); itr != sortedPts.end(); ++itr) {\n        auto p = itr->back();\n\n        if (p.end == End::None) {\n            continue;\n        }\n\n        if (p.end == End::A) {\n            ind = p.edge.f;\n\n            next = p.edge.g;\n\n            auto _itr = std::find_if(poly.begin(), poly.end(), [&ind](auto &p) { return p.id == ind; });\n\n            if (_itr == poly.begin()) {\n                prev = poly.back().id;\n            } else {\n                prev = std::prev(_itr)->id;\n            }\n\n        } else {\n            ind = p.edge.g;\n\n            prev = p.edge.f;\n\n            auto _itr = std::find_if(poly.begin(), poly.end(), [&ind](auto &p) { return p.id == ind; });\n\n            if (_itr == poly.end()-1) {\n                next = poly.front().id;\n            } else {\n                next = std::next(_itr)->id;\n            }\n        }\n\n        if (itr->size() == 2) {\n            if (allEnds.count(prev) == 0 && allEnds.count(next) == 1) {\n                const Point3d &q = pts.at(prev);\n\n                if ((allEnds.at(next) < p.t && q.y < 0) || (allEnds.at(next) > p.t && q.y > 0)) {\n                    itr->pop_back();\n                }\n\n            } else if (allEnds.count(prev) == 1 && allEnds.count(next) == 0) {\n                const Point3d &q = pts.at(next);\n\n                if ((allEnds.at(prev) < p.t && q.y > 0) || (allEnds.at(prev) > p.t && q.y < 0)) {\n                    itr->pop_back();\n                }\n            }\n        }\n\n        if (allEnds.count(prev) == 0 && allEnds.count(next) == 0) {\n            const Point3d &a = pts.at(prev);\n            const Point3d &b = pts.at(next);\n\n            if (std::signbit(a.y) != std::signbit(b.y)) {\n                if (itr->size() == 2) {\n                    itr->pop_back();\n                }\n            } else {\n                if ((a.x > b.x) == std::signbit(a.y)) {\n                    itr->clear();\n                }\n            }\n\n        }\n\n    }\n\n    InterPtsType _interPts;\n\n    for (const auto &pts : sortedPts) {\n        std::copy(pts.begin(), pts.end(), std::back_inserter(_interPts));\n    }\n\n    interPts.swap(_interPts);\n\n#if (defined(_debA) && defined(_debB))\n    if (_idA == _debA && _idB == _debB) {\n        for (auto &p : interPts) {\n            std::cout << p << std::endl;\n        }\n    }\n#endif\n\n    return true;\n}\n\nvoid Contact::InterPolys (vtkIdType idA, vtkIdType idB) {\n\n#if (defined(_debA) && defined(_debB))\n    _idA = idA; _idB = idB;\n\n    if (_idA == _debA && _idB == _debB) {\n        std::cout << \"InterPolys(\" << idA << \", \" << idB << \")\" << std::endl;\n    }\n#endif\n\n    vtkIdType numA, numB;\n    const vtkIdType *ptsA, *ptsB;\n\n    newPdA->GetCellPoints(idA, numA, ptsA);\n    newPdB->GetCellPoints(idB, numB, ptsB);\n\n    Poly polyA, polyB;\n    GetPoly(newPdA->GetPoints(), numA, ptsA, polyA);\n    GetPoly(newPdB->GetPoints(), numB, ptsB, polyB);\n\n    double nA[3], nB[3], r[3], s[3];\n\n    ComputeNormal(polyA, nA);\n    ComputeNormal(polyB, nB);\n\n#if (defined(_debA) && defined(_debB))\n    if (_idA == _debA && _idB == _debB) {\n        std::cout << \"nA [\" << nA[0] << \", \" << nA[1] << \", \" << nA[2] << \"]\" << std::endl;\n        std::cout << \"nB [\" << nB[0] << \", \" << nB[1] << \", \" << nB[2] << \"]\" << std::endl;\n    }\n#endif\n\n    if (vtkMath::Dot(nA, nB) > .9999999999) {\n        return;\n    }\n\n    double dA = polyA[0].x*nA[0]+polyA[0].y*nA[1]+polyA[0].z*nA[2];\n    double dB = polyB[0].x*nB[0]+polyB[0].y*nB[1]+polyB[0].z*nB[2];\n\n    vtkMath::Cross(nA, nB, r);\n    vtkMath::Normalize(r);\n\n    std::array<std::tuple<int, int, int, double>, 3> dets {\n        std::make_tuple(0, 1, 2, nA[0]*nB[1]-nB[0]*nA[1]),\n        std::make_tuple(0, 2, 1, nA[0]*nB[2]-nB[0]*nA[2]),\n        std::make_tuple(1, 2, 0, nA[1]*nB[2]-nB[1]*nA[2])\n    };\n\n    const auto& [i, j, k, det] = *std::max_element(dets.begin(), dets.end(), [](auto &a, auto &b) { return std::abs(std::get<3>(a)) < std::abs(std::get<3>(b)); });\n\n    s[i] = (dA*nB[j]-dB*nA[j])/det;\n    s[j] = (dB*nA[i]-dA*nB[i])/det;\n    s[k] = 0;\n\n#if (defined(_debA) && defined(_debB))\n    if (_idA == _debA && _idB == _debB) {\n        std::cout << \"det \" << det << std::endl;\n        std::cout << \"r [\" << r[0] << \", \" << r[1] << \", \" << r[2] << \"]\" << std::endl;\n        std::cout << \"s [\" << s[0] << \", \" << s[1] << \", \" << s[2] << \"]\" << std::endl;\n    }\n#endif\n\n    Base2 baseA(s, r, nA);\n    Base2 baseB(s, r, nB);\n\n    Poly transA, transB;\n\n    FlattenPoly2(polyA, transA, baseA);\n    FlattenPoly2(polyB, transB, baseB);\n\n#if (defined(_debA) && defined(_debB))\n    if (_idA == _debA && _idB == _debB) {\n        std::cout << \"transA {\";\n        for (auto& p : transA) {\n            std::cout << p << \", \";\n        }\n        std::cout << std::endl;\n\n        std::cout << \"transB {\";\n        for (auto& p : transB) {\n            std::cout << p << \", \";\n        }\n        std::cout << std::endl;\n    }\n#endif\n\n    bool isPlanarA = std::find_if(transA.begin(), transA.end(), [](auto &p) { return std::abs(p.z) > 1e-6; }) == transA.end();\n    bool isPlanarB = std::find_if(transB.begin(), transB.end(), [](auto &p) { return std::abs(p.z) > 1e-6; }) == transB.end();\n\n    bool hasReplA = replsA.count(idA) == 1;\n    bool hasReplB = replsB.count(idB) == 1;\n\n    if (!isPlanarA && !hasReplA && newPdA->GetCellType(idA) != VTK_TRIANGLE) {\n        try {\n            auto newIds = PreventEqualCaptPoints::TriangulateCell(newPdA, idA, {});\n            replsA.emplace(idA, newIds);\n            hasReplA = true;\n        } catch (...) {}\n    }\n\n    if (!isPlanarB && !hasReplB && newPdB->GetCellType(idB) != VTK_TRIANGLE) {\n        try {\n            auto newIds = PreventEqualCaptPoints::TriangulateCell(newPdB, idB, {});\n            replsB.emplace(idB, newIds);\n            hasReplB = true;\n        } catch (...) {}\n    }\n\n    if (hasReplA || hasReplB) {\n        pairs.emplace_back(idA, idB);\n        return;\n    }\n\n    InterPtsType intersPtsA, intersPtsB;\n\n    if (!InterPolyLine(intersPtsA, baseA, transA, Src::A)) {\n        throw std::runtime_error(\"Found invalid intersection points.\");\n    }\n\n    if (!InterPolyLine(intersPtsB, baseB, transB, Src::B)) {\n        throw std::runtime_error(\"Found invalid intersection points.\");\n    }\n\n    if (!CheckInters(intersPtsA, newPdA)) {\n        std::stringstream ss;\n        ss << \"Intersection points do not lie on the edges (cells \" << idA << \", \" << idB << \").\";\n\n        throw std::runtime_error(ss.str());\n    }\n\n    if (!CheckInters(intersPtsB, newPdB)) {\n        std::stringstream ss;\n        ss << \"Intersection points do not lie on the edges (cells \" << idA << \", \" << idB << \").\";\n\n        throw std::runtime_error(ss.str());\n    }\n\n    if ((intersPtsA.size() & 1) == 0 && (intersPtsB.size() & 1) == 0) {\n        AddContactLines(intersPtsA, intersPtsB, idA, idB);\n    }\n\n}\n\nbool Contact::CheckInters (const InterPtsType &interPts, vtkPolyData *pd) {\n#if (defined(_debA) && defined(_debB))\n    if (_idA == _debA && _idB == _debB) {\n        std::cout << \"CheckInters()\" << std::endl;\n    }\n#endif\n\n    double ptA[3],\n        ptB[3],\n        v[3],\n        w[3],\n        k,\n        l,\n        alpha,\n        d;\n\n    for (auto &p : interPts) {\n\n#if (defined(_debA) && defined(_debB))\n        if (_idA == _debA && _idB == _debB) {\n            std::cout << p << std::endl;\n        }\n#endif\n\n        pd->GetPoint(p.edge.f, ptA);\n        pd->GetPoint(p.edge.g, ptB);\n\n        vtkMath::Subtract(ptA, ptB, v);\n        vtkMath::Normalize(v);\n        vtkMath::Subtract(ptA, p.pt, w);\n\n        k = vtkMath::Norm(w);\n        l = vtkMath::Dot(v, w);\n        alpha = std::acos(l/k);\n\n#if (defined(_debA) && defined(_debB))\n        if (_idA == _debA && _idB == _debB) {\n            std::cout << \"alpha \" << alpha << std::endl;\n        }\n#endif\n\n        if (std::isnan(alpha)) {\n            continue;\n        }\n\n        d = std::sin(alpha)*k;\n\n#if (defined(_debA) && defined(_debB))\n        if (_idA == _debA && _idB == _debB) {\n            std::cout << \"d \" << d << std::endl;\n        }\n#endif\n\n        if (d < 1e-5) {\n            continue;\n        }\n\n        return false;\n\n    }\n\n    return true;\n\n}\n\nvoid Contact::OverlapLines (OverlapsType &overlaps, InterPtsType &intersA, InterPtsType &intersB) {\n\n    auto Add = [](InterPt &a, InterPt &b, InterPt &c, InterPt &d) {\n        a.Merge(c);\n        b.Merge(d);\n\n        return std::make_tuple(a, b);\n    };\n\n    InterPtsType::iterator itr, itr2;\n\n    for (itr = intersA.begin(); itr != intersA.end(); itr += 2) {\n        for (itr2 = intersB.begin(); itr2 != intersB.end(); itr2 += 2) {\n            if (itr->t <= itr2->t && (itr+1)->t > itr2->t) {\n                if ((itr2+1)->t < (itr+1)->t) {\n                    overlaps.push_back(Add(*itr2, *(itr2+1), *itr, *(itr+1)));\n                } else {\n                    overlaps.push_back(Add(*itr2, *(itr+1), *itr, *(itr2+1)));\n                }\n            } else if (itr2->t <= itr->t && (itr2+1)->t > itr->t) {\n                if ((itr+1)->t < (itr2+1)->t) {\n                    overlaps.push_back(Add(*itr, *(itr+1), *itr2, *(itr2+1)));\n                } else {\n                    overlaps.push_back(Add(*itr, *(itr2+1), *itr2, *(itr+1)));\n                }\n            }\n        }\n    }\n\n}\n\nvoid Contact::AddContactLines (InterPtsType &intersA, InterPtsType &intersB, vtkIdType idA, vtkIdType idB) {\n\n    if (intersA.size() == 0 || intersB.size() == 0) {\n        return;\n    }\n\n    OverlapsType overlaps;\n    OverlapLines(overlaps, intersA, intersB);\n\n    OverlapsType::const_iterator itr;\n\n    for (itr = overlaps.begin(); itr != overlaps.end(); ++itr) {\n        auto &f = std::get<0>(*itr);\n        auto &s = std::get<1>(*itr);\n\n        if ((f.src == Src::A && edgesA.count(f.edge) == 1) || (s.src == Src::A && edgesA.count(s.edge) == 1)) {\n            touchesEdgesA = true;\n        }\n\n        if ((f.src == Src::B && edgesB.count(f.edge) == 1) || (s.src == Src::B && edgesB.count(s.edge) == 1)) {\n            touchesEdgesB = true;\n        }\n\n        vtkIdList *linePts = vtkIdList::New();\n\n        linePts->InsertNextId(pts->InsertNextPoint(f.pt));\n        linePts->InsertNextId(pts->InsertNextPoint(s.pt));\n\n        lines->InsertNextCell(VTK_LINE, linePts);\n\n        linePts->Delete();\n\n        const vtkIdType tupleA[] = {f.srcA, s.srcA};\n        const vtkIdType tupleB[] = {f.srcB, s.srcB};\n\n        sourcesA->InsertNextTypedTuple(tupleA);\n        sourcesB->InsertNextTypedTuple(tupleB);\n\n        contA->InsertNextValue(idA);\n        contB->InsertNextValue(idB);\n    }\n\n}\n\nint Contact::InterNodes (vtkOBBNode *nodeA, vtkOBBNode *nodeB, vtkMatrix4x4 *vtkNotUsed(matrix), void *ptr) {\n    auto _this = reinterpret_cast<Contact*>(ptr);\n\n    vtkIdList *cellsA = nodeA->Cells;\n    vtkIdList *cellsB = nodeB->Cells;\n\n    vtkIdType numCellsA = cellsA->GetNumberOfIds();\n    vtkIdType numCellsB = cellsB->GetNumberOfIds();\n\n    vtkIdType i, j, cellA, cellB;\n\n    for (i = 0; i < numCellsA; i++) {\n        cellA = cellsA->GetId(i);\n\n        for (j = 0; j < numCellsB; j++) {\n            cellB = cellsB->GetId(j);\n\n            _this->InterPolys(cellA, cellB);\n        }\n    }\n\n    return 0;\n}\n\nvoid Contact::IntersectReplacements () {\n    if (pairs.empty()) {\n        return;\n    }\n\n    while (!pairs.empty()) {\n        vtkIdType i;\n\n        auto iterA = vtkArrayIteratorTemplate<vtkIdType>::New();\n        iterA->Initialize(contA);\n\n        auto iterB = vtkArrayIteratorTemplate<vtkIdType>::New();\n        iterB->Initialize(contB);\n\n        for (i = 0; i < iterA->GetNumberOfValues(); i++) {\n            if (replsA.count(iterA->GetValue(i)) == 1 || replsB.count(iterB->GetValue(i)) == 1) {\n                lines->DeleteCell(i);\n\n                pairs.emplace_back(iterA->GetValue(i), iterB->GetValue(i));\n            }\n        }\n\n        PairsType current;\n\n        current.swap(pairs);\n\n        for (auto& [a, b] : current) {\n            auto itrA = replsA.find(a);\n            auto itrB = replsB.find(b);\n\n            IdsType cellsA, cellsB;\n\n            if (itrA == replsA.end()) {\n                cellsA.push_back(a);\n            } else {\n                auto ids = itrA->second;\n                std::copy(ids.begin(), ids.end(), std::back_inserter(cellsA));\n            }\n\n            if (itrB == replsB.end()) {\n                cellsB.push_back(b);\n            } else {\n                auto ids = itrB->second;\n                std::copy(ids.begin(), ids.end(), std::back_inserter(cellsB));\n            }\n\n            for (auto &idA : cellsA) {\n                for (auto &idB : cellsB) {\n                    InterPolys(idA, idB);\n                }\n            }\n        }\n\n    }\n\n    lines->RemoveDeletedCells();\n\n    contA = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars(\"cA\"));\n    contB = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars(\"cB\"));\n\n    sourcesA = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars(\"sourcesA\"));\n    sourcesB = vtkIdTypeArray::SafeDownCast(lines->GetCellData()->GetScalars(\"sourcesB\"));\n\n    // contA und contB aktualisieren\n\n    auto oldCellIdsA = vtkSmartPointer<vtkIdTypeArray>::New();\n    auto oldCellIdsB = vtkSmartPointer<vtkIdTypeArray>::New();\n\n    oldCellIdsA->SetName(\"OldCellIds\");\n    oldCellIdsB->SetName(\"OldCellIds\");\n\n    vtkIdType numCellsA = newPdA->GetNumberOfCells();\n    vtkIdType numCellsB = newPdB->GetNumberOfCells();\n\n    oldCellIdsA->SetNumberOfValues(numCellsA);\n    oldCellIdsB->SetNumberOfValues(numCellsB);\n\n    vtkIdType i;\n\n    for (i = 0; i < numCellsA; i++) {\n        oldCellIdsA->SetValue(i, i);\n    }\n\n    for (i = 0; i < numCellsB; i++) {\n        oldCellIdsB->SetValue(i, i);\n    }\n\n    newPdA->GetCellData()->AddArray(oldCellIdsA);\n    newPdB->GetCellData()->AddArray(oldCellIdsB);\n\n    for (auto& [k, v] : replsA) {\n        newPdA->DeleteCell(k);\n    }\n\n    for (auto& [k, v] : replsB) {\n        newPdB->DeleteCell(k);\n    }\n\n    newPdA->RemoveDeletedCells();\n    newPdB->RemoveDeletedCells();\n\n    numCellsA = newPdA->GetNumberOfCells();\n    numCellsB = newPdB->GetNumberOfCells();\n\n    oldCellIdsA = vtkIdTypeArray::SafeDownCast(newPdA->GetCellData()->GetScalars(\"OldCellIds\"));\n    oldCellIdsB = vtkIdTypeArray::SafeDownCast(newPdB->GetCellData()->GetScalars(\"OldCellIds\"));\n\n    std::map<vtkIdType, vtkIdType> newCellIdsA, newCellIdsB;\n\n    auto iterA = vtkArrayIteratorTemplate<vtkIdType>::New();\n    iterA->Initialize(oldCellIdsA);\n\n    for (i = 0; i < numCellsA; i++) {\n        newCellIdsA.emplace(iterA->GetValue(i), i);\n    }\n\n    auto iterB = vtkArrayIteratorTemplate<vtkIdType>::New();\n    iterB->Initialize(oldCellIdsB);\n\n    for (i = 0; i < numCellsB; i++) {\n        newCellIdsB.emplace(iterB->GetValue(i), i);\n    }\n\n    vtkIdType numLines = lines->GetNumberOfCells();\n\n    try {\n\n        auto _iterA = vtkArrayIteratorTemplate<vtkIdType>::New();\n        _iterA->Initialize(contA);\n\n        for (i = 0; i < numLines; i++) {\n            _iterA->SetValue(i, newCellIdsA.at(_iterA->GetValue(i)));\n        }\n\n        auto _iterB = vtkArrayIteratorTemplate<vtkIdType>::New();\n        _iterB->Initialize(contB);\n\n        for (i = 0; i < numLines; i++) {\n            _iterB->SetValue(i, newCellIdsB.at(_iterB->GetValue(i)));\n        }\n\n    } catch (const std::out_of_range &e) {\n        throw std::runtime_error(\"\");\n    }\n\n    newPdA->GetCellData()->RemoveArray(\"OldCellIds\");\n    newPdB->GetCellData()->RemoveArray(\"OldCellIds\");\n\n}\n"
  },
  {
    "path": "Contact.h",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#ifndef __Contact_h\n#define __Contact_h\n\n#include \"Utilities.h\"\n\n#include <vtkOBBTree.h>\n#include <vtkMatrix4x4.h>\n#include <vtkLinearTransform.h>\n\nenum class Src {\n    A,\n    B\n};\n\nenum class End {\n    None,\n    A,\n    B\n};\n\nenum class PointSrc {\n    Calculated,\n    Copied\n};\n\nclass InterPt {\npublic:\n    InterPt () = delete;\n\n    InterPt (double x, double y, double z, double t, vtkIdType a, vtkIdType b, End end, Src src, PointSrc pointSrc) : t(t), edge(a, b), end(end), src(src), srcA(NOTSET), srcB(NOTSET), pointSrc(pointSrc) {\n        pt[0] = x;\n        pt[1] = y;\n        pt[2] = z;\n    }\n\n    double pt[3], t;\n    Pair edge;\n    End end;\n    Src src;\n    vtkIdType srcA, srcB;\n\n    PointSrc pointSrc;\n\n    friend std::ostream& operator<< (std::ostream &out, const InterPt &s) {\n        out << \"pt [\" << s.pt[0] << \", \" << s.pt[1] << \", \" << s.pt[2] << \"]\"\n            << \", t \" << s.t\n            << \", edge \" << s.edge\n            << \", end \" << s.end\n            << \", src \" << s.src\n            << \", pointSrc \" << s.pointSrc;\n\n        return out;\n    }\n\n    void Merge (const InterPt &other) {\n        assert(src != other.src);\n\n        if (src == Src::A) {\n            srcA = GetEnd();\n        } else {\n            srcB = GetEnd();\n        }\n\n        if (std::abs(other.t-t) < 1e-5) {\n            if (other.src == Src::A) {\n                srcA = other.GetEnd();\n            } else {\n                srcB = other.GetEnd();\n            }\n        }\n    }\n\n    inline vtkIdType GetEnd () const {\n        if (end == End::A) {\n            return edge.f;\n        }\n\n        if (end == End::B) {\n            return edge.g;\n        }\n\n        return NOTSET;\n    }\n\n};\n\ntypedef std::vector<InterPt> InterPtsType;\ntypedef std::vector<std::tuple<InterPt, InterPt>> OverlapsType;\n\ntypedef std::set<Pair> NonManifoldEdgesType;\n\ntypedef std::vector<std::pair<vtkIdType, vtkIdType>> PairsType;\n\nvtkSmartPointer<vtkPolyData> Clean (vtkPolyData *pd);\n\nclass Contact {\npublic:\n    Contact () = delete;\n    Contact (vtkPolyData *newPdA, vtkPolyData *newPdB);\n\n    vtkPolyData *newPdA, *newPdB;\n\n    vtkSmartPointer<vtkPoints> pts;\n    vtkSmartPointer<vtkPolyData> lines;\n    vtkSmartPointer<vtkIdTypeArray> contA, contB, sourcesA, sourcesB;\n\n    bool touchesEdgesA, touchesEdgesB;\n\n    NonManifoldEdgesType edgesA, edgesB;\n\n    vtkSmartPointer<vtkOBBTree> treeA, treeB;\n\n    vtkSmartPointer<vtkPolyData> GetLines (vtkPolyData *pdA = nullptr, vtkLinearTransform *transA = nullptr, vtkPolyData *pdB = nullptr, vtkLinearTransform *transB = nullptr);\n\n    void GetNonManifoldEdges (vtkPolyData *pd, NonManifoldEdgesType &edges);\n\n    void InterEdgeLine (InterPtsType &interPts, const Point3d &pA, const Point3d &pB, Src src);\n\n    bool InterPolyLine (InterPtsType &interPts, const Base2 &base, const Poly &poly, Src src);\n\n    void InterPolys (vtkIdType idA, vtkIdType idB);\n\n    bool CheckInters (const InterPtsType &interPts, vtkPolyData *pd);\n\n    void OverlapLines (OverlapsType &overlaps, InterPtsType &intersA, InterPtsType &intersB);\n\n    void AddContactLines (InterPtsType &intersA, InterPtsType &intersB, vtkIdType idA, vtkIdType idB);\n\n    static int InterNodes (vtkOBBNode *nodeA, vtkOBBNode *nodeB, vtkMatrix4x4 *vtkNotUsed(matrix), void *ptr);\n\n    PairsType pairs;\n\n    std::map<vtkIdType, IdsType> replsA, replsB;\n\n    void IntersectReplacements ();\n};\n\n#endif\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n"
  },
  {
    "path": "Merger.cxx",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#include \"Merger.h\"\n\n#include <vtkCellData.h>\n\nMerger::Merger (vtkPolyData *pd, const PStrips &pStrips, const StripsType &strips, const IdsType &descIds, vtkIdType origId) : pd(pd), pStrips(pStrips), origId(origId) {\n\n    const StripPtsType &pts = pStrips.pts;\n    const Base &base = pStrips.base;\n\n    vtkIdType i, num;\n    const vtkIdType *cell;\n\n    double pt[3];\n\n    for (auto id : descIds) {\n        pd->GetCellPoints(id, num, cell);\n\n        Poly p;\n\n        for (i = 0; i < num; i++) {\n            pd->GetPoint(cell[i], pt);\n\n            double proj[2];\n            Transform(pt, proj, base);\n\n            p.emplace_back(proj[0], proj[1], 0, cell[i]);\n\n        }\n\n        polys.push_back(p);\n\n        pd->DeleteCell(id);\n    }\n\n    for (auto &strip : strips) {\n        Poly p;\n\n        for (auto &sp : strip) {\n            const double *pt = pts.at(sp.ind).pt;\n\n            double proj[2];\n            Transform(pt, proj, base);\n\n            p.emplace_back(proj[0], proj[1], 0, NOTSET, sp.ind);\n        }\n\n        p.pop_back();\n\n        double n[3];\n        ComputeNormal(p, n);\n\n        if (n[2] < 0) {\n            Poly q(p.rbegin(), p.rend());\n            p.swap(q);\n        }\n\n        innerIds.push_back(polys.size());\n\n        polys.push_back(p);\n    }\n\n}\n\nvoid Merger::Run () {\n    // mergen mit hilfe von vtkKdTree und vtkModifiedBSPTree\n\n    vtkPoints *pdPts = pd->GetPoints();\n    vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars(\"OrigCellIds\"));\n\n    assert(origCellIds != nullptr);\n\n    std::vector<GroupType> groups(polys.size());\n\n    PolysType::const_iterator itrA, itrB;\n\n    std::size_t i {0};\n\n    for (itrA = polys.begin(); itrA != polys.end(); ++itrA) {\n        if (std::find(innerIds.begin(), innerIds.end(), i) != innerIds.end()) {\n            std::size_t j {0};\n            for (itrB = polys.begin(); itrB != polys.end(); ++itrB) {\n                if (itrA != itrB && PointInPoly(*itrB, *itrA->begin())) {\n                    groups[j].push_back(i);\n                }\n                j++;\n            }\n        }\n        i++;\n    }\n\n    std::size_t parent = 0;\n\n    for (auto &group : groups) {\n        GroupType parents;\n\n        for (auto &index : group) {\n            const GroupType &_group = groups[index];\n            parents.insert(parents.end(), _group.begin(), _group.end());\n        }\n\n        std::sort(group.begin(), group.end());\n        std::sort(parents.begin(), parents.end());\n\n        GroupType _group {parent++};\n        std::set_difference(group.begin(), group.end(), parents.begin(), parents.end(), std::back_inserter(_group));\n\n#ifdef DEBUG\n        std::cout << \"[\";\n        for (auto &index : _group) {\n            std::cout << index << \", \";\n        }\n        std::cout << \"]\" << std::endl;\n#endif\n\n        PolysType merged;\n\n        MergeGroup(_group, merged);\n\n        std::map<vtkIdType, vtkIdType> newIds;\n\n        for (auto &poly : merged) {\n            auto newCell = vtkSmartPointer<vtkIdList>::New();\n\n            for (auto &p : poly) {\n                vtkIdType id = p.id;\n\n                if (id == NOTSET) {\n                    auto itr = newIds.find(p.otherId);\n\n                    if (itr == newIds.end()) {\n                        auto &q = pStrips.pts.at(p.otherId);\n\n                        id = pdPts->InsertNextPoint(q.pt);\n                        newIds.emplace(p.otherId, id);\n                    } else {\n                        id = itr->second;\n                    }\n                }\n\n                newCell->InsertNextId(id);\n\n            }\n\n            pd->InsertNextCell(VTK_POLYGON, newCell);\n            origCellIds->InsertNextValue(origId);\n        }\n\n    }\n\n}\n\nvoid Merger::MergeGroup (const GroupType &group, PolysType &merged) {\n    if (group.size() == 1) {\n        merged.push_back(polys.at(group.back()));\n\n        return;\n    }\n\n    auto pts = vtkSmartPointer<vtkPoints>::New();\n    pts->SetDataTypeToDouble();\n\n    IndexedPolysType indexedPolys;\n\n    ReferencedPointsType refPts;\n\n    SourcesType sources;\n    std::size_t src = 0;\n\n    for (auto &index : group) {\n        const Poly &poly = polys.at(index);\n\n        IndexedPoly ids;\n\n        for (auto &p : poly) {\n            vtkIdType id = pts->InsertNextPoint(p.x, p.y, p.z);\n\n            ids.push_back(id);\n            sources.emplace(id, src);\n\n            refPts.emplace(id, p);\n        }\n\n        indexedPolys.push_back(std::move(ids));\n        src++;\n    }\n\n    auto kdTree = vtkSmartPointer<vtkKdTree>::New();\n    kdTree->OmitZPartitioning();\n    kdTree->BuildLocatorFromPoints(pts);\n\n    auto linesA = vtkSmartPointer<vtkPolyData>::New();\n    linesA->SetPoints(pts);\n    linesA->Allocate(1);\n\n    IndexedPoly::const_iterator itrA, itrB;\n\n    for (const auto &ids : indexedPolys) {\n        for (itrA = ids.begin(); itrA != ids.end(); ++itrA) {\n            itrB = itrA+1;\n            if (itrB == ids.end()) {\n                itrB = ids.begin();\n            }\n\n            vtkIdList *line = vtkIdList::New();\n            line->InsertNextId(*itrA);\n            line->InsertNextId(*itrB);\n\n            linesA->InsertNextCell(VTK_LINE, line);\n\n            line->Delete();\n        }\n    }\n\n#ifdef DEBUG\n    WriteVTK(\"linesA.vtk\", linesA);\n#endif\n\n    auto bspTreeA = vtkSmartPointer<vtkModifiedBSPTree>::New();\n    bspTreeA->SetDataSet(linesA);\n\n    int n = 0;\n\n    PolyConnsType polyConns;\n\n    FindConns(linesA, kdTree, bspTreeA, polyConns, indexedPolys, sources, n);\n\n    PolyConnsType connected {{0, {}}};\n    _IdsType restricted; // keine der conns darf im gleichen punkt beginnen\n\n    auto linesB = vtkSmartPointer<vtkPolyData>::New();\n    linesB->SetPoints(pts);\n    linesB->Allocate(1);\n\n    auto bspTreeB = vtkSmartPointer<vtkModifiedBSPTree>::New();\n    bspTreeB->SetDataSet(linesB);\n\n    ConnsType firstConns;\n\n    std::size_t i, numPolys = indexedPolys.size();\n\n    double ptA[3], ptB[3];\n\n    while (connected.size() < numPolys) {\n\n        bool foundOne = false;\n\n        for (i = 1; i < numPolys; i++) {\n            if (connected.count(i) == 0) {\n                const ConnsType &conns = polyConns[i];\n\n                for (auto &conn : conns) {\n                    if (connected.count(sources.at(conn.j)) == 1\n                        && restricted.count(conn.j) == 0) {\n\n                        pts->GetPoint(conn.i, ptA);\n                        pts->GetPoint(conn.j, ptB);\n\n                        if (bspTreeB->IntersectWithLine(ptA, ptB, 1e-5, nullptr, nullptr) == 0) {\n                            connected[sources.at(conn.i)].push_back(conn);\n\n                            // das andere poly auch aktualisieren\n                            connected[sources.at(conn.j)].emplace_back(conn.d, conn.j, conn.i);\n\n                            restricted.insert(conn.i);\n                            restricted.insert(conn.j);\n\n                            vtkIdList *line = vtkIdList::New();\n                            line->InsertNextId(conn.i);\n                            line->InsertNextId(conn.j);\n\n                            linesB->InsertNextCell(VTK_LINE, line);\n\n                            line->Delete();\n\n                            bspTreeB->Modified();\n\n                            foundOne = true;\n\n                            firstConns.push_back(conn);\n\n                            break;\n                        }\n\n                    }\n                }\n            }\n        }\n\n        if (!foundOne) {\n            if (!FindConns(linesA, kdTree, bspTreeA, polyConns, indexedPolys, sources, n)) {\n                throw std::runtime_error(\"Merging failed.\");\n            }\n        }\n    }\n\n    std::map<std::size_t, std::vector<std::size_t>> chains;\n\n    PolyConnsType::const_iterator itrC;\n\n    for (itrC = connected.begin(); itrC != connected.end(); ++itrC) {\n        auto &chain = chains[itrC->first];\n        chain.push_back(itrC->first);\n\n        while (chain.back() != 0) {\n            chain.push_back(sources.at(connected.at(chain.back()).front().j));\n        }\n    }\n\n#ifdef DEBUG\n    std::cout << connected;\n\n    decltype(chains)::const_iterator itrD;\n\n    for (itrD = chains.begin(); itrD != chains.end(); ++itrD) {\n        std::cout << itrD->first << \": [\";\n        for (auto &id : itrD->second) {\n            std::cout << id << \", \";\n        }\n        std::cout << \"]\" << std::endl;\n    }\n#endif\n\n    std::set<std::size_t> solved {0};\n\n    std::deque<std::size_t> searchInds;\n\n    for (i = 1; i < numPolys; i++) {\n        if (connected.at(i).size() == 1) {\n            searchInds.push_back(i);\n        }\n    }\n\n    while (!searchInds.empty()) {\n        PriosType prios;\n\n        for (auto ind : searchInds) {\n            PolyPriosType polyPrios;\n\n#ifdef DEBUG\n            std::cout << \"ind \" << ind << std::endl;\n#endif\n\n            const Conn &first = connected.at(ind).back();\n\n            for (auto &conn : polyConns.at(ind)) {\n                auto &src = sources.at(conn.j);\n\n                if (polyPrios.count(src) == 1) {\n                    continue;\n                }\n\n                if (conn.i != first.i\n                    && conn.j != first.j\n                    && restricted.count(conn.i) == 0\n                    && restricted.count(conn.j) == 0) {\n\n                    pts->GetPoint(conn.i, ptA);\n                    pts->GetPoint(conn.j, ptB);\n\n                    if (bspTreeB->IntersectWithLine(ptA, ptB, 1e-5, nullptr, nullptr) == 0) {\n                        auto &chainA = chains.at(ind),\n                            &chainB = chains.at(src);\n\n                        std::set<std::size_t> _chainA(chainA.begin(), chainA.end()),\n                            _chainB(chainB.begin(), chainB.end());\n\n                        // gemeinsame eltern\n                        std::set<std::size_t> shared;\n\n                        std::set_intersection(_chainA.begin(), _chainA.end(), _chainB.begin(), _chainB.end(), std::inserter(shared, shared.end()));\n\n                        // gemeinsame eltern müssen sich alle in solved befinden\n                        if (std::includes(solved.begin(), solved.end(), shared.begin(), shared.end())) {\n                            std::set<std::size_t> solvable;\n\n                            std::set_difference(_chainA.begin(), _chainA.end(), solved.begin(), solved.end(), std::inserter(solvable, solvable.end()));\n                            std::set_difference(_chainB.begin(), _chainB.end(), solved.begin(), solved.end(), std::inserter(solvable, solvable.end()));\n\n                            polyPrios.emplace(std::piecewise_construct,\n                                std::forward_as_tuple(src),\n                                std::forward_as_tuple(conn, solvable, -conn.d));\n                        }\n                    }\n                }\n            }\n\n            PolyPriosType::const_iterator itr;\n            for (itr = polyPrios.begin(); itr != polyPrios.end(); ++itr) {\n                prios.insert(itr->second);\n            }\n        }\n\n        if (!prios.empty()) {\n            auto &prio = *prios.rbegin();\n\n#ifdef DEBUG\n            std::cout << \"found \" << prio << std::endl;\n#endif\n\n            auto &conns = connected.at(sources.at(prio.conn.i));\n\n            conns.push_back(prio.conn);\n\n            connected.at(sources.at(prio.conn.j)).emplace_back(prio.conn.d, prio.conn.j, prio.conn.i);\n\n            restricted.insert(prio.conn.i);\n            restricted.insert(prio.conn.j);\n\n            vtkIdList *line = vtkIdList::New();\n            line->InsertNextId(prio.conn.i);\n            line->InsertNextId(prio.conn.j);\n\n            linesB->InsertNextCell(VTK_LINE, line);\n\n            line->Delete();\n\n            bspTreeB->Modified();\n\n            solved.insert(prio.solvable.begin(), prio.solvable.end());\n\n            searchInds.erase(std::find(searchInds.begin(), searchInds.end(), sources.at(prio.conn.i)));\n\n            auto itr = std::find(searchInds.begin(), searchInds.end(), sources.at(prio.conn.j));\n\n            if (itr != searchInds.end()) {\n                searchInds.erase(itr);\n            }\n        } else {\n            if (!FindConns(linesA, kdTree, bspTreeA, polyConns, indexedPolys, sources, n)) {\n                break;\n            }\n        }\n    }\n\n#ifdef DEBUG\n    std::cout << connected;\n#endif\n\n    // fallback\n\n    double pt[3];\n\n    if (!searchInds.empty()) {\n        for (auto ind : searchInds) {\n            std::vector<std::size_t> newChain;\n\n            for (auto c : chains.at(ind)) {\n                if (solved.find(c) != solved.end()) {\n                    break;\n                }\n\n                newChain.push_back(c);\n            }\n\n            ConnsType &conns = connected.at(ind);\n\n            decltype(newChain)::const_reverse_iterator itr;\n\n            for (itr = newChain.rbegin(); itr != newChain.rend(); itr++) {\n                // gesucht ist hier die kürzeste verbindung\n\n#ifdef DEBUG\n                std::cout << \"itr \" << *itr << std::endl;\n#endif\n\n                // polyConns.at(*itr) ist nach d sortiert\n\n                std::shared_ptr<Conn> found;\n\n                for (auto &conn : polyConns.at(*itr)) {\n                    auto &src = sources.at(conn.j);\n\n                    if (solved.find(src) != solved.end()) {\n                        if (restricted.count(conn.i) == 0\n                            // && restricted.count(conn.j) == 0\n                            && std::find_if(conns.begin(), conns.end(), [&conn](const Conn &other) { return conn.i == other.i || conn.j == other.j; }) == conns.end()) {\n\n                            pts->GetPoint(conn.i, ptA);\n                            pts->GetPoint(conn.j, ptB);\n\n                            auto intersPts = vtkSmartPointer<vtkPoints>::New();\n                            intersPts->SetDataTypeToDouble();\n\n                            auto c = bspTreeB->IntersectWithLine(ptA, ptB, 1e-5, intersPts, nullptr);\n\n                            if (c == 0) {\n                                found = std::make_shared<Conn>(conn);\n\n                                break;\n                            }\n\n                            // wenn schnittpunkte existieren, dann müssen alle mit ptB übereinstimmen\n\n                            vtkIdType i, numPts = intersPts->GetNumberOfPoints();\n\n                            std::set<Point3d> foundPts {{ptB[0], ptB[1], ptB[2]}};\n\n                            for (i = 0; i < numPts; i++) {\n                                intersPts->GetPoint(i, pt);\n                                foundPts.emplace(pt[0], pt[1], pt[2]);\n                            }\n\n                            if (foundPts.size() == 1) {\n                                found = std::make_shared<Conn>(conn);\n\n                                break;\n                            }\n\n                        }\n                    }\n                }\n\n                if (found) {\n#ifdef DEBUG\n                    std::cout << \"found \" << *found << std::endl;\n#endif\n\n                    conns.push_back(*found);\n\n                    connected.at(sources.at(found->j)).emplace_back(found->d, found->j, found->i);\n\n                    restricted.insert(found->i);\n                    restricted.insert(found->j);\n\n                    vtkIdList *line = vtkIdList::New();\n                    line->InsertNextId(found->i);\n                    line->InsertNextId(found->j);\n\n                    linesB->InsertNextCell(VTK_LINE, line);\n\n                    line->Delete();\n\n                    bspTreeB->Modified();\n\n                    solved.insert(*itr);\n\n                } else {\n                    throw std::runtime_error(\"Merging failed.\");\n                }\n\n            }\n        }\n    }\n\n#ifdef DEBUG\n    WriteVTK(\"linesB.vtk\", linesB);\n#endif\n\n    ConnsType2 usedConns(firstConns.begin(), firstConns.end());\n\n    IndexedPoly polyA {indexedPolys.front()};\n\n    MergeStage1(indexedPolys, refPts, sources, firstConns, polyA);\n\n    IndexedPolysType splitted {polyA};\n\n    ConnsType2 leftConns;\n\n    for (itrC = connected.begin(); itrC != connected.end(); ++itrC) {\n        if (itrC->first == 0) {\n            continue;\n        }\n\n        auto &conns = itrC->second;\n\n        ConnsType::const_iterator itr;\n\n        for (itr = conns.begin()+1; itr != conns.end(); ++itr) {\n            Conn conn(0, itr->j, itr->i);\n\n            if (usedConns.find(conn) == usedConns.end()) {\n                if (itr->i < itr->j) {\n                    leftConns.emplace(0, itr->i, itr->j);\n                } else {\n                    leftConns.insert(std::move(conn));\n                }\n            }\n        }\n\n    }\n\n#ifdef DEBUG\n    std::cout << \"leftConns: [\";\n    for (auto &conn : leftConns) {\n        std::cout << conn << \", \";\n    }\n    std::cout << \"]\" << std::endl;\n#endif\n\n    MergeStage2(leftConns, refPts, usedConns, splitted);\n\n    PolysType newPolys;\n    GetPolys(refPts, splitted, newPolys);\n\n#ifdef DEBUG\n    WritePolys(\"merged_stage2.vtk\", newPolys);\n#endif\n\n    std::move(newPolys.begin(), newPolys.end(), std::back_inserter(merged));\n\n}\n\nbool Merger::FindConns (vtkPolyData *lines, vtkSmartPointer<vtkKdTree> kdTree, vtkSmartPointer<vtkModifiedBSPTree> bspTree, PolyConnsType &polyConns, const IndexedPolysType &indexedPolys, const SourcesType &sources, int &n) {\n\n    vtkPoints *pts = lines->GetPoints();\n\n    if (n > pts->GetNumberOfPoints()) {\n        return false;\n    }\n\n    n += 10;\n\n    auto foundPts = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType i, numPts;\n\n    vtkIdType idB;\n\n    auto lineIds = vtkSmartPointer<vtkIdList>::New();\n\n    double ptA[3], ptB[3];\n\n    bool good;\n\n    vtkIdType j;\n    vtkIdType _idA, _idB;\n\n    std::map<std::size_t, std::set<Conn, ConnCmp>> _polyConns;\n\n    auto line = vtkSmartPointer<vtkIdList>::New();\n\n    for (const auto &ids : indexedPolys) {\n        for (vtkIdType idA : ids) {\n            pts->GetPoint(idA, ptA);\n\n            kdTree->FindClosestNPoints(n, ptA, foundPts);\n\n            numPts = foundPts->GetNumberOfIds();\n\n            for (i = 0; i < numPts; i++) {\n                idB = foundPts->GetId(i);\n\n                auto srcA = sources.at(idA),\n                    srcB = sources.at(idB);\n\n                if (srcA == srcB) {\n                    continue;\n                }\n\n                pts->GetPoint(idB, ptB);\n\n                good = true;\n\n                if (bspTree->IntersectWithLine(ptA, ptB, 1e-5, nullptr, lineIds) == 1) {\n                    for (j = 0; j < lineIds->GetNumberOfIds(); j++) {\n                        lines->GetCellPoints(lineIds->GetId(j), line);\n\n                        _idA = line->GetId(0);\n                        _idB = line->GetId(1);\n\n                        if (_idA != idA && _idA != idB\n                            && _idB != idA && _idB != idB) {\n\n                            good = false;\n                            break;\n                        }\n                    }\n                }\n\n                if (good) {\n                    double d = vtkMath::Distance2BetweenPoints(ptA, ptB);\n\n                    _polyConns[srcA].emplace(d, idA, idB);\n                    _polyConns[srcB].emplace(d, idB, idA);\n                }\n            }\n        }\n    }\n\n    decltype(_polyConns)::const_iterator itr;\n\n    for (itr = _polyConns.begin(); itr != _polyConns.end(); ++itr) {\n        auto &_conns = itr->second;\n\n        ConnsType conns(_conns.begin(), _conns.end());\n        std::sort(conns.begin(), conns.end());\n\n        polyConns[itr->first].swap(conns);\n\n    }\n\n    return true;\n}\n\nvoid Merger::MergeStage1 (const IndexedPolysType &indexedPolys, [[maybe_unused]] const ReferencedPointsType &refPts, const SourcesType &sources, const ConnsType &conns, IndexedPoly &polyA) {\n\n    for (const auto &conn : conns) {\n        auto itrA = std::find(polyA.begin(), polyA.end(), conn.j);\n\n        assert(itrA != polyA.end());\n\n        IndexedPoly polyB(indexedPolys.at(sources.at(conn.i)));\n\n        auto itrB = std::find(polyB.begin(), polyB.end(), conn.i);\n\n        assert(itrB != polyB.end());\n\n        std::rotate(polyA.begin(), itrA, polyA.end());\n        std::rotate(polyB.begin(), itrB, polyB.end());\n\n        IndexedPoly newPoly {polyA};\n        newPoly.push_back(polyA.front());\n        newPoly.push_back(polyB.front());\n\n        newPoly.insert(newPoly.end(), polyB.rbegin(), polyB.rend());\n\n        polyA.swap(newPoly);\n\n    }\n\n#ifdef DEBUG\n    PolysType newPolys;\n    GetPolys(refPts, {polyA}, newPolys);\n\n    WritePolys(\"merged_stage1.vtk\", newPolys);\n#endif\n\n}\n\nvoid Merger::MergeStage2 (const ConnsType2 &conns, const ReferencedPointsType &refPts, const ConnsType2 &usedConns, IndexedPolysType &splitted) {\n    std::set<Point3d> endPts;\n\n    for (const Conn &conn : usedConns) {\n        endPts.emplace(refPts.at(conn.i));\n        endPts.emplace(refPts.at(conn.j));\n    }\n\n    IndexedPolysType::iterator itr;\n\n    double vA[3], vB[3], w[3], ang, phi;\n\n    const double n[] = {0, 0, 1};\n\n    IndexedPoly::iterator itrA, itrB;\n\n    IndexedPoly::iterator prev, next;\n\n    for (auto &conn : conns) {\n        for (itr = splitted.begin(); itr != splitted.end(); ++itr) {\n            IndexedPoly poly(itr->begin(), itr->end());\n\n            if (endPts.count(refPts.at(conn.i)) == 0)  {\n                itrA = std::find(poly.begin(), poly.end(), conn.i);\n            } else {\n                Point3d::GetVec(refPts.at(conn.i), refPts.at(conn.j), w);\n\n                itrA = poly.begin();\n                while ((itrA = std::find(itrA, poly.end(), conn.i)) != poly.end()) {\n                    next = itrA+1;\n                    if (next == poly.end()) {\n                        next = poly.begin();\n                    }\n\n                    if (itrA == poly.begin()) {\n                        prev = poly.end()-1;\n                    } else {\n                        prev = itrA-1;\n                    }\n\n                    Point3d::GetVec(refPts.at(conn.i), refPts.at(*next), vA);\n                    Point3d::GetVec(refPts.at(conn.i), refPts.at(*prev), vB);\n\n                    ang = GetAngle(vA, vB, n);\n                    phi = GetAngle(vA, w, n);\n\n                    if (phi < ang) {\n                        break;\n                    }\n\n                    ++itrA;\n                }\n            }\n\n            if (itrA == poly.end()) {\n                continue;\n            }\n\n            std::rotate(poly.begin(), itrA, poly.end());\n\n            if (endPts.count(refPts.at(conn.j)) == 0)  {\n                itrB = std::find(poly.begin(), poly.end(), conn.j);\n            } else {\n                Point3d::GetVec(refPts.at(conn.j), refPts.at(conn.i), w);\n\n                itrB = poly.begin();\n                while ((itrB = std::find(itrB, poly.end(), conn.j)) != poly.end()) {\n                    next = itrB+1;\n                    if (next == poly.end()) {\n                        next = poly.begin();\n                    }\n\n                    if (itrB == poly.begin()) {\n                        prev = poly.end()-1;\n                    } else {\n                        prev = itrB-1;\n                    }\n\n                    Point3d::GetVec(refPts.at(conn.j), refPts.at(*next), vA);\n                    Point3d::GetVec(refPts.at(conn.j), refPts.at(*prev), vB);\n\n                    ang = GetAngle(vA, vB, n);\n                    phi = GetAngle(vA, w, n);\n\n                    if (phi < ang) {\n                        break;\n                    }\n\n                    ++itrB;\n                }\n            }\n\n            if (itrB == poly.end()) {\n                continue;\n            }\n\n            IndexedPoly newPolyA(poly.begin(), itrB+1);\n            IndexedPoly newPolyB(itrB, poly.end());\n\n            newPolyB.push_back(poly.front());\n\n            splitted.erase(itr);\n\n            splitted.push_back(std::move(newPolyA));\n            splitted.push_back(std::move(newPolyB));\n\n            endPts.emplace(refPts.at(conn.i));\n            endPts.emplace(refPts.at(conn.j));\n\n            break;\n        }\n    }\n\n}\n"
  },
  {
    "path": "Merger.h",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#ifndef __Merger_h\n#define __Merger_h\n\n#include \"vtkPolyDataBooleanFilter.h\"\n\ntypedef std::vector<std::size_t> GroupType;\n\ntypedef std::map<vtkIdType, std::size_t> SourcesType;\n\nclass Conn {\npublic:\n    Conn () = delete;\n    Conn (double d, vtkIdType i, vtkIdType j) : d(d), i(i), j(j) {}\n\n    double d;\n    vtkIdType i, j;\n\n    bool operator< (const Conn &other) const {\n        return d < other.d;\n    }\n\n    friend std::ostream& operator<< (std::ostream &out, const Conn &c) {\n        out << \"Conn(d=\" << c.d\n            << \", i=\" << c.i\n            << \", j=\" << c.j\n            << \")\";\n        return out;\n    }\n\n};\n\nstruct ConnCmp {\n    bool operator() (const Conn &a, const Conn &b) const {\n        return std::tie(a.i, a.j) < std::tie(b.i, b.j);\n    }\n};\n\ntypedef std::vector<Conn> ConnsType;\ntypedef std::map<std::size_t, ConnsType> PolyConnsType;\n\ntypedef std::set<Conn, ConnCmp> ConnsType2;\n\ninline std::ostream& operator<< (std::ostream &out, const PolyConnsType& polyConns) {\n    PolyConnsType::const_iterator itr;\n\n    for (itr = polyConns.begin(); itr != polyConns.end(); ++itr) {\n        out << itr->first << \": [\";\n        for (auto &conn : itr->second) {\n            out << conn << \", \";\n        }\n        out << \"]\" << std::endl;\n    }\n\n    return out;\n}\n\nclass Prio {\npublic:\n    Prio () = delete;\n    Prio (const Conn &conn, const std::set<std::size_t> &solvable, double d) : conn(conn), solvable(solvable), d(d) {}\n\n    Conn conn;\n    std::set<std::size_t> solvable;\n    double d;\n\n    friend std::ostream& operator<< (std::ostream &out, const Prio &p) {\n        out << \"Prio(conn=\" << p.conn\n            << \", d=\" << p.d\n            << \")\";\n        return out;\n    }\n};\n\nstruct Cmp {\n    bool operator() (const Prio &a, const Prio &b) const {\n        const auto _a = a.solvable.size(),\n            _b = b.solvable.size();\n        return std::tie(_a, a.d) < std::tie(_b, b.d);\n    }\n};\n\ntypedef std::set<Prio, Cmp> PriosType;\n\ntypedef std::map<std::size_t, Prio> PolyPriosType;\n\nclass Merger {\n    vtkPolyData *pd;\n    const PStrips &pStrips;\n    vtkIdType origId;\n\n    PolysType polys;\n    std::vector<std::size_t> innerIds;\npublic:\n    Merger () = delete;\n    Merger (vtkPolyData *pd, const PStrips &pStrips, const StripsType &strips, const IdsType &descIds, vtkIdType origId);\n    void Run ();\n\nprivate:\n    void MergeGroup (const GroupType &group, PolysType &merged);\n    bool FindConns (vtkPolyData *lines, vtkSmartPointer<vtkKdTree> kdTree, vtkSmartPointer<vtkModifiedBSPTree> bspTree, PolyConnsType &polyConns, const IndexedPolysType &indexedPolys, const SourcesType &sources, int &n);\n\n    void MergeStage1 (const IndexedPolysType &indexedPolys, const ReferencedPointsType &refPts, const SourcesType &sources, const ConnsType &conns, IndexedPoly &polyA);\n    void MergeStage2 (const ConnsType2 &conns, const ReferencedPointsType &refPts, const ConnsType2 &usedConns, IndexedPolysType &splitted);\n};\n\n#endif\n"
  },
  {
    "path": "Optimize.cxx",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#include \"Optimize.h\"\n\n#include <vtkCellArrayIterator.h>\n#include <vtkModifiedBSPTree.h>\n#include <vtkCellData.h>\n#include <vtkPolygon.h>\n#include <vtkSmartPointer.h>\n\n// #define _DEBUG\n\nPreventEqualCaptPoints::PreventEqualCaptPoints (vtkPolyData *pdA, vtkPolyData *pdB) : pdA(pdA), pdB(pdB) {}\n\nvoid PreventEqualCaptPoints::Run () {\n#ifdef _DEBUG\n    WriteVTK(\"captA.vtk\", pdA);\n    WriteVTK(\"captB.vtk\", pdB);\n#endif\n\n    pdA->BuildLinks();\n    pdB->BuildLinks();\n\n    Find(pdA, pdB, \"A\");\n\n#ifdef _DEBUG\n    WriteVTK(\"modB.vtk\", pdB);\n#endif\n\n    Find(pdB, pdA, \"B\");\n\n#ifdef _DEBUG\n    WriteVTK(\"modA.vtk\", pdA);\n#endif\n}\n\nvoid PreventEqualCaptPoints::Find (vtkPolyData *pd, vtkPolyData *other, [[maybe_unused]] const std::string &name) {\n#ifdef _DEBUG\n    std::cout << \"Find(\" << name << \")\" << std::endl;\n#endif\n\n    vtkIdType num;\n    const vtkIdType *poly;\n\n    vtkIdType i, j;\n\n    std::set<Pair> lines;\n\n    auto polyItr = vtk::TakeSmartPointer(pd->GetPolys()->NewIterator());\n\n    for (polyItr->GoToFirstCell(); !polyItr->IsDoneWithTraversal(); polyItr->GoToNextCell()) {\n        polyItr->GetCurrentCell(num, poly);\n\n        for (i = 0; i < num; i++) {\n            j = i+1;\n\n            if (j == num) {\n                j = 0;\n            }\n\n            if (poly[i] < poly[j]) {\n                lines.emplace(poly[i], poly[j]);\n            } else {\n                lines.emplace(poly[j], poly[i]);\n            }\n        }\n    }\n\n    auto tree = vtkSmartPointer<vtkModifiedBSPTree>::New();\n    tree->SetDataSet(other);\n    tree->BuildLocator();\n\n    auto pts = vtkSmartPointer<vtkPoints>::New();\n    pts->SetDataTypeToDouble();\n\n    auto cells = vtkSmartPointer<vtkIdList>::New();\n\n    double pA[3], pB[3];\n\n    vtkIdType cellId;\n\n    double tr[2];\n\n#ifdef _DEBUG\n    auto pdVerts = vtkSmartPointer<vtkPolyData>::New();\n    pdVerts->Allocate(1);\n\n    auto ptsVerts = vtkSmartPointer<vtkPoints>::New();\n    ptsVerts->SetDataTypeToDouble();\n#endif\n\n    std::map<vtkIdType, std::vector<SnapPoint>> pointSnaps;\n    std::map<Point3d, std::vector<SnapEdge>> edgeSnaps;\n\n    for (auto &line : lines) {\n        pd->GetPoint(line.f, pA);\n        pd->GetPoint(line.g, pB);\n\n        if (tree->IntersectWithLine(pA, pB, 1e-5, pts, cells) == 0) {\n            continue;\n        }\n\n        for (i = 0; i < pts->GetNumberOfPoints(); i++) {\n            const double *pt = pts->GetPoint(i);\n\n            Point3d sA(pt[0], pt[1], pt[2]);\n\n            cellId = cells->GetId(i);\n\n            other->GetCellPoints(cellId, num, poly);\n\n            Base base(other->GetPoints(), num, poly);\n\n            Poly polyA, polyB;\n\n            GetPoly(other->GetPoints(), num, poly, polyA);\n\n            FlattenPoly(polyA, polyB, base);\n\n            Transform(pt, tr, base);\n\n            Point3d sB(tr[0], tr[1], 0);\n\n            if (PointInPoly(polyB, sB)) {\n#ifdef _DEBUG\n                auto vert = vtkSmartPointer<vtkIdList>::New();\n                vert->InsertNextId(ptsVerts->InsertNextPoint(pt));\n\n                pdVerts->InsertNextCell(VTK_VERTEX, vert);\n#endif\n\n                // snap auf ecke oder kante?\n\n                auto snap = std::find_if(polyA.begin(), polyA.end(), [&](const Point3d &p) { return Point3d::GetDist(p, sA) < 1e-10; });\n\n                if (snap != polyA.end()) {\n                    double d = Point3d::GetDist(*snap, sA);\n\n                    pointSnaps[snap->id].emplace_back(cellId, line, *snap, sA, d);\n\n                } else {\n                    // projektion auf kante\n\n                    auto edgeProj = GetEdgeProj(polyA, sA);\n\n                    if (edgeProj != nullptr) {\n                        edgeSnaps[edgeProj->proj].emplace_back(cellId, line, edgeProj->edge, edgeProj->proj, sA, edgeProj->d);\n                    }\n                }\n            }\n        }\n    }\n\n    for (const auto& [id, snaps] : pointSnaps) {\n        if (snaps.size() > 1) {\n#ifdef _DEBUG\n            std::cout << \"id \" << id << \", snaps\" << std::endl;\n\n            for (const auto &s : snaps) {\n                std::cout << s << std::endl;\n            }\n#endif\n\n            std::set<Pair> allLines;\n\n            std::transform(snaps.begin(), snaps.end(), std::inserter(allLines, allLines.end()), [](const SnapPoint &p) { return p.line; });\n\n#ifdef _DEBUG\n            std::cout << \"allLines\" << std::endl;\n\n            for (const auto &line : allLines) {\n                std::cout << line << std::endl;\n            }\n#endif\n\n            auto itrA = snaps.begin();\n            decltype(itrA) itrB;\n\n            double d;\n\n            bool collapse = true;\n\n            for (; itrA != snaps.end()-1 && collapse; ++itrA) {\n                for (itrB = itrA+1; itrB < snaps.end(); ++itrB) {\n                    d = Point3d::GetDist(itrA->inter, itrB->inter);\n\n#ifdef _DEBUG\n                    std::cout << d << std::endl;\n#endif\n\n                    if (d > 1e-10) {\n                        collapse = false;\n                        break;\n                    }\n                }\n            }\n\n            if (collapse) {\n                continue;\n            }\n\n            if (allLines.size() == 1) {\n                std::shared_ptr<Point3d> proj;\n                ProjOnLine(pd, snaps.back().line, snaps.back().point, proj);\n\n                PreventEqualCaptPoints::MovePoint(other, id, *proj);\n\n            } else {\n                // gemeinsamen punkt ermitteln\n\n                std::set<vtkIdType> allIds;\n\n                for (auto &line : allLines) {\n                    allIds.insert(line.f);\n                    allIds.insert(line.g);\n                }\n\n                if (allIds.size() == allLines.size()+1) {\n                    std::vector<Pair> _allLines(allLines.begin(), allLines.end());\n\n                    vtkIdType s = _allLines[0] & _allLines[1];\n\n#ifdef _DEBUG\n                    std::cout << \"line \"\n                        << _allLines[0]\n                        << \" & \"\n                        << _allLines[1]\n                        << \" -> \"\n                        << s\n                        << std::endl;\n#endif\n\n                    double pt[3];\n                    pd->GetPoint(s, pt);\n\n                    Point3d p(pt[0], pt[1], pt[2]);\n\n                    PreventEqualCaptPoints::MovePoint(other, id, p);\n                } else {\n                    throw std::runtime_error(\"\");\n                }\n            }\n        }\n    }\n\n    using Snap = std::tuple<SnapEdge, Point3d, double>;\n\n    struct Cmp {\n        bool operator() (const Snap &l, const Snap &r) const {\n            return std::get<2>(l) < std::get<2>(r);\n        }\n    };\n\n    std::map<Pair, std::set<Snap, Cmp>> allEdgeSnaps;\n\n    double pt[3], t;\n\n    for (const auto& [proj, snaps] : edgeSnaps) {\n        if (snaps.size() > 1) {\n            if (snaps.size() > 2) {\n#ifdef _DEBUG\n                std::cout << proj << std::endl;\n\n                for (const auto &s : snaps) {\n                    std::cout << s << std::endl;\n\n                    auto &line = s.line;\n\n                    pd->GetPoint(line.f, pA);\n                    pd->GetPoint(line.g, pB);\n\n                    std::cout << Point3d(pA[0], pA[1], pA[2]) << std::endl;\n                    std::cout << Point3d(pB[0], pB[1], pB[2]) << std::endl;\n                }\n#endif\n\n                continue;\n            }\n\n            const auto &snapA = snaps[0];\n            const auto &snapB = snaps[1];\n\n            {\n                Pair edge(snapA.edge);\n\n                if (edge.f > edge.g) {\n                    std::swap(edge.f, edge.g);\n                }\n\n                std::shared_ptr<Point3d> p;\n\n                if (snapA.line == snapB.line) {\n                    ProjOnLine(pd, snapA.line, snapA.proj, p);\n\n                } else {\n                    vtkIdType s = snapA.line & snapB.line;\n\n                    pd->GetPoint(s, pt);\n\n                    p = std::make_shared<Point3d>(pt[0], pt[1], pt[2]);\n                }\n\n                other->GetPoint(edge.f, pt);\n\n                Point3d q(pt[0], pt[1], pt[2]);\n\n                t = Point3d::GetDist(q, snapA.proj);\n\n                allEdgeSnaps[edge].emplace(snapA, *p, t);\n            }\n        }\n    }\n\n    std::map<vtkIdType, Edges> newCells;\n\n    for (const auto& [edge, data] : allEdgeSnaps) {\n        Points pts;\n\n        for (const auto &d : data) {\n            const auto &p = std::get<1>(d);\n            pts.emplace_back(p.x, p.y, p.z, other->GetPoints()->InsertNextPoint(p.x, p.y, p.z));\n        }\n\n        const auto &first = std::get<0>(*(data.begin()));\n\n        auto neigs = vtkSmartPointer<vtkIdList>::New();\n\n        other->GetCellEdgeNeighbors(first.cellId, first.edge.f, first.edge.g, neigs);\n\n        if (neigs->GetNumberOfIds() != 1) {\n            throw std::runtime_error(\"\");\n        }\n\n        vtkIdType neig = neigs->GetId(0);\n\n        auto _edge = Pair(first.edge.g, first.edge.f);\n\n        if (edge == first.edge) {\n            std::for_each(pts.begin(), pts.end(), [&](const Point3d &p) { newCells[first.cellId][first.edge].emplace_back(p); });\n            std::for_each(pts.rbegin(), pts.rend(), [&](const Point3d &p) { newCells[neig][_edge].emplace_back(p); });\n        } else {\n            std::for_each(pts.rbegin(), pts.rend(), [&](const Point3d &p) { newCells[first.cellId][first.edge].emplace_back(p); });\n            std::for_each(pts.begin(), pts.end(), [&](const Point3d &p) { newCells[neig][_edge].emplace_back(p); });\n        }\n    }\n\n    for (const auto& [cellId, edges] : newCells) {\n        PreventEqualCaptPoints::TriangulateCell(other, cellId, edges);\n        other->DeleteCell(cellId);\n    }\n\n    other->RemoveDeletedCells();\n\n#ifdef _DEBUG\n    pdVerts->SetPoints(ptsVerts);\n\n    auto fileName = \"verts\" + name + \".vtk\";\n\n    WriteVTK(fileName.c_str(), pdVerts);\n#endif\n\n}\n\nIdsType PreventEqualCaptPoints::TriangulateCell (vtkPolyData *pd, vtkIdType cellId, const Edges &edges) {\n    vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars(\"OrigCellIds\"));\n\n    IdsType newCellIds;\n\n    vtkIdType num;\n    const vtkIdType *poly;\n\n    pd->GetCellPoints(cellId, num, poly);\n\n    Poly _poly;\n\n    double pt[3];\n\n    vtkIdType i, j;\n\n    vtkIdType newNum = num;\n\n    for (i = 0; i < num; i++) {\n        j = i+1;\n\n        if (j == num) {\n            j = 0;\n        }\n\n        pd->GetPoint(poly[i], pt);\n\n        _poly.emplace_back(pt[0], pt[1], pt[2], poly[i]);\n\n        Pair edge(poly[i], poly[j]);\n\n        auto itr = edges.find(edge);\n\n        if (itr != edges.end()) {\n            auto &pts = itr->second;\n\n            for (const auto &p : pts) {\n                _poly.emplace_back(p);\n\n                newNum++;\n            }\n        }\n    }\n\n    auto vtkPoly = vtkSmartPointer<vtkPolygon>::New();\n\n    vtkPoly->GetPointIds()->SetNumberOfIds(newNum);\n    vtkPoly->GetPoints()->SetNumberOfPoints(newNum);\n\n    Base base(pd->GetPoints(), num, poly);\n\n    Poly flattened;\n\n    FlattenPoly(_poly, flattened, base);\n\n    for (const auto &p : flattened) {\n        vtkPoly->GetPointIds()->SetId(p.id, p.id);\n        vtkPoly->GetPoints()->SetPoint(p.id, p.x, p.y, p.z);\n    }\n\n    auto triangles = vtkSmartPointer<vtkIdList>::New();\n\n#if (VTK_MAJOR_VERSION >= 9 && VTK_MINOR_VERSION > 3)\n    if (vtkPoly->TriangulateLocalIds(0, triangles) != 1) {\n        throw std::runtime_error(\"\");\n    }\n#else\n    if (vtkPoly->Triangulate(triangles) != 1) {\n        throw std::runtime_error(\"\");\n    }\n#endif\n\n    auto ids = vtkSmartPointer<vtkIdList>::New();\n\n    for (const auto &p : _poly) {\n        ids->InsertNextId(p.id);\n    }\n\n    double pA[3], pB[3], pC[3];\n\n    for (i = 0; i < triangles->GetNumberOfIds(); i += 3) {\n        pd->GetPoint(ids->GetId(triangles->GetId(i)), pA);\n        pd->GetPoint(ids->GetId(triangles->GetId(i+1)), pB);\n        pd->GetPoint(ids->GetId(triangles->GetId(i+2)), pC);\n\n        Poly p = { {pA[0], pA[1], pA[2]}, {pB[0], pB[1], pB[2]}, {pC[0], pC[1], pC[2]} };\n\n        double quality = GetTriangleQuality(p);\n\n        if (quality < 0.001) {\n            throw std::runtime_error(\"\");\n        }\n    }\n\n    vtkIdType origId = origCellIds->GetValue(cellId);\n\n    auto triangle = vtkSmartPointer<vtkIdList>::New();\n    triangle->SetNumberOfIds(3);\n\n    for (i = 0; i < triangles->GetNumberOfIds(); i += 3) {\n        triangle->SetId(0, ids->GetId(triangles->GetId(i)));\n        triangle->SetId(1, ids->GetId(triangles->GetId(i+1)));\n        triangle->SetId(2, ids->GetId(triangles->GetId(i+2)));\n\n        newCellIds.push_back(pd->InsertNextCell(VTK_TRIANGLE, triangle));\n\n        origCellIds->InsertNextValue(origId);\n    }\n\n    return newCellIds;\n\n}\n\nvoid PreventEqualCaptPoints::MovePoint (vtkPolyData *pd, vtkIdType ind, const Point3d &p) {\n    auto cells = vtkSmartPointer<vtkIdList>::New();\n    pd->GetPointCells(ind, cells);\n\n    vtkIdType i, cellId;\n\n    for (i = 0; i < cells->GetNumberOfIds(); i++) {\n        cellId = cells->GetId(i);\n\n        if (pd->GetCellType(cellId) == VTK_POLYGON) {\n            PreventEqualCaptPoints::TriangulateCell(pd, cellId, {});\n            pd->DeleteCell(cellId);\n        }\n    }\n\n#ifdef _DEBUG\n    double pt[3];\n    pd->GetPoints()->GetPoint(ind, pt);\n\n    Point3d q(pt[0], pt[1], pt[2]);\n\n    std::cout << q\n        << \" -> \"\n        << p\n        << std::endl;\n#endif\n\n    pd->GetPoints()->SetPoint(ind, p.x, p.y, p.z);\n}\n"
  },
  {
    "path": "Optimize.h",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#ifndef __Optimize_h\n#define __Optimize_h\n\n#include \"Utilities.h\"\n\ntypedef std::map<Pair, Points> Edges;\n\nclass SnapPoint {\npublic:\n    SnapPoint () = delete;\n    SnapPoint (vtkIdType cellId, const Pair &line, const Point3d &point, const Point3d &inter, double d) : cellId(cellId), line(line), point(point), inter(inter), d(d) {}\n\n    vtkIdType cellId;\n    Pair line;\n    Point3d point;\n    Point3d inter;\n    double d;\n\n    friend std::ostream& operator<< (std::ostream &out, const SnapPoint &s) {\n        out << \"cellId \" << s.cellId\n            << \", line \" << s.line\n            << \", point \" << s.point\n            << \", inter \" << s.inter\n            << \", d \" << s.d;\n\n        return out;\n    }\n};\n\nclass SnapEdge {\npublic:\n    SnapEdge () = delete;\n    SnapEdge (vtkIdType cellId, const Pair &line, const Pair &edge, const Point3d &proj, const Point3d &inter, double d) : cellId(cellId), line(line), edge(edge), proj(proj), inter(inter), d(d) {}\n\n    vtkIdType cellId;\n    Pair line;\n    Pair edge;\n    Point3d proj;\n    Point3d inter;\n    double d;\n\n    friend std::ostream& operator<< (std::ostream &out, const SnapEdge &s) {\n        out << \"cellId \" << s.cellId\n            << \", line \" << s.line\n            << \", edge \" << s.edge\n            << \", proj \" << s.proj\n            << \", inter \" << s.inter\n            << \", d \" << s.d;\n\n        return out;\n    }\n};\n\nclass PreventEqualCaptPoints {\n    vtkPolyData *pdA, *pdB;\npublic:\n    static IdsType TriangulateCell (vtkPolyData *pd, vtkIdType cellId, const Edges &edges);\n    static void MovePoint (vtkPolyData *pd, vtkIdType ind, const Point3d &p);\n\n    PreventEqualCaptPoints () = delete;\n    PreventEqualCaptPoints (vtkPolyData *pdA, vtkPolyData *pdB);\n    void Run ();\nprivate:\n    void Find (vtkPolyData *pd, vtkPolyData *other, const std::string &name);\n};\n\n#endif\n"
  },
  {
    "path": "README.md",
    "content": "# vtkbool [![CMake](https://github.com/zippy84/vtkbool/actions/workflows/cmake.yml/badge.svg)](https://github.com/zippy84/vtkbool/actions/workflows/cmake.yml) [![codecov](https://codecov.io/gh/zippy84/vtkbool/branch/master/graph/badge.svg?token=EUV9QKEW1M)](https://codecov.io/gh/zippy84/vtkbool) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.10461186.svg)](https://zenodo.org/doi/10.5281/zenodo.10461186)\n\n## About\n\nThis is an extension of the graphics library VTK. The goal of the extension is to equip the library with rebust boolean operations on polygonal meshes. I started the project at the end of my studies in mechanical engineering at the University of Applied Sciences ([HTWK](http://htwk-leipzig.de/)) in Leipzig. I used VTK to develop a program, which I had to create for a paper. At this time I would have wished, that this feature already exists. There was several implementations from third parties, but after some tests, I came to the conclusion, that none of them worked correct. I decided to start with my own implementation. This library is the result of my efforts.\n\n## Features\n\n- based on VTK\n- 4 operation types available (union, intersection, difference and difference2 - difference with interchanged operands)\n- triangulation is not needed\n- all types of polygonal cells are supported (triangles, quads, polygons, triangle-strips)\n- triangle-strips and quads will be transformed into triangles (quads only if their points are not on the same plane)\n- non-convex polygons are allowed\n- meshes can be stacked (coplanar polygons are right handled)\n- the meshes don’t need to be watertight\n- CellData is passed (attached by the rules of vtkAppendPolyData)\n- contact-lines are available in the 3th output\n- the filter is able to embed holes\n- compileable as ParaView plugin\n- Python wrapped\n\n## Limitations\n\n- the filter assumes well defined triangles, quads and polygons\n- PointData is not preserved - you have to do your own mapping with *OrigCellIdsA* and *OrigCellIdsB*\n\n## Requirements\n\n- CMake >= 3.12\n- VTK >= 9.0\n- C++17 compiler\n\n### Optional\n\n- ParaView >= 5.0\n- Python 3.x\n\n## Library\n\nTo include vtkbool into your program, you have to compile it as a library. All you need is an installation of VTK with header files. If you have installed VTK over your package manager, CMake is able to find the required files. Otherwise you have to set **VTK\\_DIR** manually. It must be a path like */home/zippy/VTK9/lib/cmake/vtk-9.1* or *C:/Users/zippy/VTK9/lib/cmake/vtk-9.1*.\n\nThe usage of the library is very simple. Look at the example in the section below. You can set the operation mode by calling one of the named methods:\n\n- `SetOperModeToNone`\n- `SetOperModeToUnion`\n- `SetOperModeToIntersection`\n- `SetOperModeToDifference`\n- `SetOperModeToDifference2`\n\nThe alternative is the more generic `SetOperMode`. The method must be called with the number of the desired operation, an integer between 0 and 4, with the same meaning as mentioned before. The default is Union.\n\n### C++ Example\n\nCreate a directory somewhere in your file system, download vtkbool and unpack it into that.\n\n```\nmkdir example\ncd example\ngit clone https://github.com/zippy84/vtkbool.git\n```\n\nThen create the following two files:\n\n**test.cxx**\n\n```C++\n#include <vtkSmartPointer.h>\n#include <vtkCubeSource.h>\n#include <vtkCylinderSource.h>\n#include <vtkPolyDataWriter.h>\n\n#include \"vtkPolyDataBooleanFilter.h\"\n\nint main (int argc, char *argv[]) {\n    auto cube = vtkSmartPointer<vtkCubeSource>::New();\n    cube->SetYLength(.5);\n\n    auto cyl = vtkSmartPointer<vtkCylinderSource>::New();\n    cyl->SetResolution(32);\n    cyl->SetHeight(.5);\n    cyl->SetCenter(0, .5, 0);\n\n    auto bf = vtkSmartPointer<vtkPolyDataBooleanFilter>::New();\n    bf->SetInputConnection(0, cube->GetOutputPort());\n    bf->SetInputConnection(1, cyl->GetOutputPort());\n    bf->SetOperModeToDifference();\n\n    auto writer = vtkSmartPointer<vtkPolyDataWriter>::New();\n    writer->SetInputConnection(bf->GetOutputPort());\n    writer->SetFileName(\"result.vtk\");\n    writer->Update();\n\n    return 0;\n}\n```\n\n**CMakeLists.txt**\n\n```CMake\ncmake_minimum_required(VERSION 3.12 FATAL_ERROR)\nproject(test)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\n# find_package(VTK REQUIRED COMPONENTS FiltersSources IOLegacy)\n\nfind_package(VTK REQUIRED COMPONENTS FiltersSources IOLegacy FiltersExtraction FiltersGeometry FiltersModeling FiltersFlowPaths WrappingPythonCore)\n\nif(VTK_FOUND)\n    include_directories(vtkbool)\n    add_subdirectory(vtkbool)\n\n    add_executable(test test.cxx)\n    target_link_libraries(test PRIVATE vtkbool ${VTK_LIBRARIES})\n\n    vtk_module_autoinit(\n        TARGETS test\n        MODULES ${VTK_LIBRARIES}\n    )\nendif(VTK_FOUND)\n```\n\nInside the `example` directory, create a subdirectory called `build` and `cd` into it. You should have a directory structure that looks something like this:\n\n```\nexample\n├── build\n├── CMakeLists.txt\n├── test.cxx\n└── vtkbool\n    ├── CMakeLists.txt\n    ├── ...\n    └── vtkPolyDataBooleanFilter.h\n```\n\nFrom inside the `build` directory, run `ccmake ..`, follow the instructions, and finally type `make`.\n\nRunning `./test` will now produce the `result.vtk` file.\n\n## ParaView Plugin\n\nTo build the plugin you have to compile ParaView from source. Download the current version from <http://www.paraview.org> and follow the compilation instructions. As soon as ParaView is compiled, it may take a while, you can build the plugin by activating the **VTKBOOL_PARAVIEW** option within CMake. In CMake you also have to point to **ParaView_DIR** if CMake can't found it and it is not installed in a common location like */usr/lib* or */usr/local/lib*. Make sure **PARAVIEW_INSTALL_DEVELOPMENT_FILES** is set.\n\nWhen everything has been compiled successfully, you can install the plugin.\n\n## Python\n\nThe Python module will be generated automatically, if three conditions are met:\n\n- vtkbool is configured as a library\n- Python 3 is installed with header files\n- VTK itself is wrapped to Python\n\nAfter a successful compilation, the module can be used as follows:\n\n```python\n#!/usr/bin/env python\n\nimport sys\nsys.path.append('/path/to/your/build/directory') # also look into the python files in the testing directory\n\nfrom vtkmodules.vtkFiltersSources import vtkCubeSource, vtkSphereSource\nfrom vtkmodules.vtkIOLegacy import vtkPolyDataWriter\nfrom vtkbool import vtkPolyDataBooleanFilter\n\ncube = vtkCubeSource()\n\nsphere = vtkSphereSource()\nsphere.SetCenter(.5, .5, .5)\nsphere.SetThetaResolution(20)\nsphere.SetPhiResolution(20)\n\nbf = vtkPolyDataBooleanFilter()\nbf.SetInputConnection(0, cube.GetOutputPort())\nbf.SetInputConnection(1, sphere.GetOutputPort())\nbf.SetOperModeToDifference()\n\n# write the result, if you want ...\n\nwriter = vtkPolyDataWriter()\nwriter.SetInputConnection(bf.GetOutputPort())\nwriter.SetFileName('result.vtk')\n\nwriter.Update()\n```\n\nOr with VTK >= 9.4:\n\n```python\n#!/usr/bin/env python\n\nimport sys\nsys.path.append('/path/to/your/build/directory')\n\nfrom vtkmodules.vtkFiltersSources import vtkCubeSource, vtkSphereSource\nfrom vtkmodules.vtkIOLegacy import vtkPolyDataWriter\nfrom vtkmodules.util.execution_model import select_ports\n\nfrom vtkbool import vtkPolyDataBooleanFilter, OPER_DIFFERENCE\n\ncube = vtkCubeSource()\nsphere = vtkSphereSource(center=[.5, .5, .5], theta_resolution=20, phi_resolution=20)\n\nbf = vtkPolyDataBooleanFilter(oper_mode=OPER_DIFFERENCE)\ncube >> bf\nsphere >> select_ports(1, bf)\n\n(bf >> vtkPolyDataWriter(file_name='result.vtk')).update()\n\n```\n\n## Conda\n\nThe library is also available at [conda-forge](https://anaconda.org/conda-forge/vtkbool). In your virtual environment you can install the package with:\n\n```\nconda install -c conda-forge vtkbool\n```\n\nUnlike in the python example, you need to import it like this:\n\n```python\nfrom vtkbool.vtkbool import vtkPolyDataBooleanFilter\n```\n\n## Errors and their meaning\n\n- *Contact failed with ...*\n\n  - *Found invalid intersection points.*\n\n    This problem occurs when an intersection point is located on congruent edges of a self-intersecting polygon.\n\n  - *Intersection points do not lie on the edges (cells a, b).*\n\n    At least one intersection point does not lie on the boundary of the intersected polygon. The points of the polygon do not lie on a plane. The polygon is degenerated.\n\n  - *Intersection goes through non-manifold edges.*\n\n    Non-manifold edges are generally not a problem. Unless they are part of the intersection.\n\n- *Cannot prevent equal capture points.*\n\n  A capture point is the projection of a point onto one of the edges of the intersected polygon. This point, not the projection, is usually used by two lines that are assigned to the two adjacent polygons, sharing this edge. There is a case where two different points have the same projection. The error occurs when the problem could not be solved.\n\n- *There is no contact.*\n\n  What it says.\n\n- *At least one line-end has only one neighbor.*\n\n  The intersection is incomplete. Therefore the cell cannot be divided.\n\n- *Strips are invalid.*\n\n  There are intersection lines that intersect themselves. Either one of the inputs contains an assembly or there is one self-intersecting polygon that is involved in the intersection.\n\n- *CutCells failed.*\n\n  Will be printed out only, if some holes couldn't be merged into their outer polygons.\n\n- *Boolean operation failed.*\n\n  A boolean operation can fail at the end, if some of the intersection lines are not part of the result.\n\n## Copyright\n\n2012-2025 Ronald Römer\n\n## License\n\nApache License, Version 2.0\n"
  },
  {
    "path": "Utilities.cxx",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#include \"Utilities.h\"\n\n#include <cmath>\n\n#include <vtkPoints.h>\n#include <vtkIdList.h>\n#include <vtkMath.h>\n#include <vtkPolyData.h>\n#include <vtkDataWriter.h>\n#include <vtkSmartPointer.h>\n\n#include <vtkPolyDataWriter.h>\n\ndouble ComputeNormal (vtkPoints *pts, double *n, vtkIdType num, const vtkIdType *poly) {\n    n[0] = 0; n[1] = 0; n[2] = 0;\n\n    double pA[3], pB[3];\n\n    vtkIdType i, a, b;\n\n    for (i = 0; i < num; i++) {\n        a = poly[i];\n        b = poly[i+1 == num ? 0 : i+1];\n\n        pts->GetPoint(a, pA);\n        pts->GetPoint(b, pB);\n\n        n[0] += (pA[1]-pB[1])*(pA[2]+pB[2]);\n        n[1] += (pA[2]-pB[2])*(pA[0]+pB[0]);\n        n[2] += (pA[0]-pB[0])*(pA[1]+pB[1]);\n    }\n\n    return vtkMath::Normalize(n);\n}\n\nvoid FindPoints (vtkKdTreePointLocator *pl, const double *pt, vtkIdList *pts, double tol) {\n    pts->Reset();\n\n    vtkPolyData *pd = vtkPolyData::SafeDownCast(pl->GetDataSet());\n\n    vtkIdList *closest = vtkIdList::New();\n\n    pl->FindPointsWithinRadius(std::max(1e-3, tol), pt, closest);\n\n    vtkIdType i, numPts = closest->GetNumberOfIds();\n\n    double c[3], v[3];\n\n    for (i = 0; i < numPts; i++) {\n        pd->GetPoint(closest->GetId(i), c);\n        vtkMath::Subtract(pt, c, v);\n\n        if (vtkMath::Norm(v) < tol) {\n            pts->InsertNextId(closest->GetId(i));\n        }\n    }\n\n    closest->Delete();\n}\n\n#ifdef DEBUG\nvoid WriteVTK (const char *name, vtkPolyData *pd) {\n    std::cout << \"Writing \" << name << std::endl;\n\n    vtkPolyDataWriter *w = vtkPolyDataWriter::New();\n    w->SetInputData(pd);\n    w->SetFileName(name);\n    w->Update();\n    w->Delete();\n}\n#endif\n\ndouble GetAngle (const double *vA, const double *vB, const double *n) {\n    // http://math.stackexchange.com/questions/878785/how-to-find-an-angle-in-range0-360-between-2-vectors\n\n    double _vA[3];\n\n    vtkMath::Cross(n, vA, _vA);\n    double ang = std::atan2(vtkMath::Dot(_vA, vB), vtkMath::Dot(vA, vB));\n\n    if (ang < 0) {\n        ang += 2*M_PI;\n    }\n\n    return ang;\n}\n\nBase::Base (vtkPoints *pts, vtkIdType num, const vtkIdType *poly) {\n    ComputeNormal(pts, n, num, poly);\n\n    double ptA[3],\n        ptB[3];\n\n    pts->GetPoint(poly[0], ptA);\n    pts->GetPoint(poly[1], ptB);\n\n    ei[0] = ptB[0]-ptA[0];\n    ei[1] = ptB[1]-ptA[1];\n    ei[2] = ptB[2]-ptA[2];\n\n    vtkMath::Normalize(ei);\n\n    ej[0] = n[1]*ei[2]-n[2]*ei[1];\n    ej[1] = -n[0]*ei[2]+n[2]*ei[0];\n    ej[2] = n[0]*ei[1]-n[1]*ei[0];\n\n    vtkMath::Normalize(ej);\n\n    d = n[0]*ptA[0]+n[1]*ptA[1]+n[2]*ptA[2];\n}\n\nvoid Transform (const double *in, double *out, const Base &base) {\n    double x = base.ei[0]*in[0]+base.ei[1]*in[1]+base.ei[2]*in[2],\n        y = base.ej[0]*in[0]+base.ej[1]*in[1]+base.ej[2]*in[2];\n\n    out[0] = x;\n    out[1] = y;\n}\n\n/*void BackTransform (const double *in, double *out, const Base &base) {\n    double x = in[0]*base.ei[0]+in[1]*base.ej[0]+base.d*base.n[0],\n        y = in[0]*base.ei[1]+in[1]*base.ej[1]+base.d*base.n[1],\n        z = in[0]*base.ei[2]+in[1]*base.ej[2]+base.d*base.n[2];\n\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n}*/\n\ndouble ComputeNormal (const Poly &poly, double *n) {\n    n[0] = 0; n[1] = 0; n[2] = 0;\n\n    Poly::const_iterator itrA, itrB;\n\n    for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n        itrB = itrA+1;\n\n        if (itrB == poly.end()) {\n            itrB = poly.begin();\n        }\n\n        const Point3d &ptA = *itrA,\n            &ptB = *itrB;\n\n        n[0] += (ptA.y-ptB.y)*(ptA.z+ptB.z);\n        n[1] += (ptA.z-ptB.z)*(ptA.x+ptB.x);\n        n[2] += (ptA.x-ptB.x)*(ptA.y+ptB.y);\n    }\n\n    return vtkMath::Normalize(n);\n}\n\nbool PointInPoly (const Poly &poly, const Point3d &p) {\n    bool in = false;\n\n    Poly::const_iterator itrA, itrB;\n\n    for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n        itrB = itrA+1;\n\n        if (itrB == poly.end()) {\n            itrB = poly.begin();\n        }\n\n        const Point3d &ptA = *itrA,\n            &ptB = *itrB;\n\n        if ((ptA.x <= p.x || ptB.x <= p.x)\n            && ((ptA.y < p.y && ptB.y >= p.y)\n                || (ptB.y < p.y && ptA.y >= p.y))) {\n\n            // schnittpunkt mit bounding box und strahlensatz\n            if (ptA.x+(p.y-ptA.y)*(ptB.x-ptA.x)/(ptB.y-ptA.y) < p.x) {\n                in = !in;\n            }\n        }\n    }\n\n    return in;\n}\n\n#ifdef DEBUG\nvoid WritePolys (const char *name, const PolysType &polys) {\n    auto pts = vtkSmartPointer<vtkPoints>::New();\n    pts->SetDataTypeToDouble();\n\n    auto pd = vtkSmartPointer<vtkPolyData>::New();\n    pd->SetPoints(pts);\n    pd->Allocate(1);\n\n    for (auto &poly : polys) {\n        auto cell = vtkSmartPointer<vtkIdList>::New();\n\n        for (auto &p : poly) {\n            cell->InsertNextId(pts->InsertNextPoint(p.x, p.y, p.z));\n        }\n\n        pd->InsertNextCell(VTK_POLYGON, cell);\n    }\n\n    WriteVTK(name, pd);\n}\n#endif\n\nvoid GetPolys (const ReferencedPointsType &pts, const IndexedPolysType &indexedPolys, PolysType &polys) {\n    for (const auto &poly : indexedPolys) {\n        Poly newPoly;\n\n        for (auto &id : poly) {\n            newPoly.push_back(pts.at(id));\n        }\n\n        polys.push_back(std::move(newPoly));\n    }\n}\n\nvoid GetPoly (vtkPoints *pts, vtkIdType num, const vtkIdType *poly, Poly &out) {\n    vtkIdType i;\n\n    double p[3];\n\n    for (i = 0; i < num; i++) {\n        pts->GetPoint(poly[i], p);\n\n        out.emplace_back(p[0], p[1], p[2], poly[i]);\n    }\n}\n\nvoid FlattenPoly (const Poly &poly, Poly &out, const Base &base) {\n    double pt[3], tr[2];\n\n    vtkIdType i = 0;\n\n    for (auto &p : poly) {\n        pt[0] = p.x;\n        pt[1] = p.y;\n        pt[2] = p.z;\n\n        Transform(pt, tr, base);\n\n        out.emplace_back(tr[0], tr[1], 0, i++);\n    }\n}\n\nvoid FlattenPoly2 (const Poly &poly, Poly &out, const Base2 &base) {\n    double pt[3], tr[3];\n\n    for (auto &p : poly) {\n        pt[0] = p.x;\n        pt[1] = p.y;\n        pt[2] = p.z;\n\n        base.Transform(pt, tr);\n\n        out.emplace_back(tr[0], tr[1], tr[2], p.id);\n    }\n}\n\nstd::shared_ptr<Proj> GetEdgeProj (const Poly &poly, const Point3d &p) {\n    Poly::const_iterator itrA, itrB;\n\n    double d, t;\n\n    std::shared_ptr<Point3d> proj;\n\n    for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n        itrB = itrA+1;\n\n        if (itrB == poly.end()) {\n            itrB = poly.begin();\n        }\n\n        ProjOnLine(*itrA, *itrB, p, &d, &t, proj);\n\n        if (d > 0 && d < 1e-5 && t > 0 && t < 1) {\n            return std::make_shared<Proj>(itrA->id, itrB->id, *proj, d);\n        }\n\n    }\n\n    return nullptr;\n}\n\nvoid ProjOnLine (const Point3d &a, const Point3d &b, const Point3d &p, double *d, double *t, std::shared_ptr<Point3d> &proj) {\n    double v[3], w[3];\n\n    double v_ = Point3d::GetVec(a, b, v);\n    double w_ = Point3d::GetVec(a, p, w);\n\n    double pr = std::min(std::max(vtkMath::Dot(v, w), -1.), 1.);\n\n    *d = std::sin(std::acos(pr))*w_;\n\n    vtkMath::MultiplyScalar(v, std::sqrt(w_*w_-*d**d));\n\n    proj = std::make_shared<Point3d>(a.x+v[0], a.y+v[1], a.z+v[2]);\n\n    *t = pr*w_/v_;\n}\n\nvoid ProjOnLine (vtkPolyData *pd, const Pair &line, const Point3d &p, std::shared_ptr<Point3d> &proj) {\n    double pA[3], pB[3];\n\n    pd->GetPoint(line.f, pA);\n    pd->GetPoint(line.g, pB);\n\n    Point3d a(pA[0], pA[1], pA[2]);\n    Point3d b(pB[0], pB[1], pB[2]);\n\n    double d, t;\n\n    ProjOnLine(a, b, p, &d, &t, proj);\n}\n\nvtkSmartPointer<vtkPolyData> CreatePolyData (const PolysType &polys) {\n    auto pts = vtkSmartPointer<vtkPoints>::New();\n    pts->SetDataTypeToDouble();\n\n    auto pd = vtkSmartPointer<vtkPolyData>::New();\n    pd->SetPoints(pts);\n    pd->Allocate(100);\n\n    for (const auto &poly : polys) {\n        auto cell = vtkSmartPointer<vtkIdList>::New();\n\n        for (const auto &p : poly) {\n            cell->InsertNextId(pts->InsertNextPoint(p.x, p.y, p.z));\n        }\n\n        pd->InsertNextCell(VTK_POLYGON, cell);\n    }\n\n    pd->Squeeze();\n\n    return pd;\n}\n\ndouble GetTriangleQuality (const Poly &poly) {\n    double n[3];\n\n    double l = ComputeNormal(poly, n);\n\n    double d = 0;\n\n    Poly::const_iterator itrA, itrB;\n\n    for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n        itrB = itrA+1;\n\n        if (itrB == poly.end()) {\n            itrB = poly.begin();\n        }\n\n        d += std::sqrt(Point3d::GetDist(*itrA, *itrB));\n    }\n\n    return 10.392304845413264*l/(d*d);\n}\n"
  },
  {
    "path": "Utilities.h",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#ifndef __Utilities_h\n#define __Utilities_h\n\n#include <iostream>\n#include <type_traits>\n#include <functional>\n#include <vector>\n#include <deque>\n#include <map>\n#include <set>\n#include <memory>\n\n#include <vtkPolyData.h>\n#include <vtkKdTreePointLocator.h>\n#include <vtkPoints.h>\n#include <vtkIdList.h>\n#include <vtkMath.h>\n#include <vtkSmartPointer.h>\n\n#define NOTSET -1\n\ndouble GetAngle (const double *vA, const double *vB, const double *n);\n\ndouble ComputeNormal (vtkPoints *pts, double *n, vtkIdType num, const vtkIdType *poly);\n\nvoid FindPoints (vtkKdTreePointLocator *pl, const double *pt, vtkIdList *pts, double tol = 1e-6);\n\n#ifdef DEBUG\nvoid WriteVTK (const char *name, vtkPolyData *pd);\n#endif\n\nclass Point3d {\npublic:\n    const double x, y, z;\n    vtkIdType id, otherId;\n\n    Point3d () = delete;\n    Point3d (const double x, const double y, const double z, vtkIdType id = NOTSET, vtkIdType otherId = NOTSET) : x(x), y(y), z(z), id(id), otherId(otherId) {}\n    bool operator< (const Point3d &other) const {\n        const long x1 = std::lround(x*1e5),\n            y1 = std::lround(y*1e5),\n            z1 = std::lround(z*1e5),\n            x2 = std::lround(other.x*1e5),\n            y2 = std::lround(other.y*1e5),\n            z2 = std::lround(other.z*1e5);\n\n        return std::tie(x1, y1, z1) < std::tie(x2, y2, z2);\n    }\n    bool operator== (const Point3d &other) const {\n        return !(*this < other) && !(other < *this);\n    }\n\n    friend std::ostream& operator<< (std::ostream &out, const Point3d &p) {\n        out << \"Point3d(x=\" << p.x\n            << \", y=\" << p.y\n            << \", z=\" << p.z\n            << \", id=\" << p.id\n            << \", otherId=\" << p.otherId << \")\";\n        return out;\n    }\n\n    static double GetVec (const Point3d &a, const Point3d &b, double *v) {\n        v[0] = b.x-a.x;\n        v[1] = b.y-a.y;\n        v[2] = b.z-a.z;\n\n        return vtkMath::Normalize(v);\n    }\n\n    static double GetDist (const Point3d &a, const Point3d &b) {\n        double dx = b.x-a.x;\n        double dy = b.y-a.y;\n        double dz = b.z-a.z;\n\n        return dx*dx+dy*dy+dz*dz;\n    }\n\n};\n\ntypedef std::vector<vtkIdType> IdsType;\ntypedef std::set<vtkIdType> _IdsType;\n\nclass Pair {\npublic:\n    vtkIdType f, g;\n    Pair () = delete;\n    Pair (vtkIdType f, vtkIdType g) : f(f), g(g) {}\n    bool operator< (const Pair &other) const {\n        return std::tie(f, g) < std::tie(other.f, other.g);\n    }\n    bool operator== (const Pair &other) const {\n        return f == other.f && g == other.g;\n    }\n    vtkIdType operator& (const Pair &other) const {\n        if (f == other.f || f == other.g) {\n            return f;\n        }\n        return g;\n    }\n    friend std::ostream& operator<< (std::ostream &out, const Pair &p) {\n        out << \"(\" << p.f << \", \" << p.g << \")\";\n        return out;\n    }\n};\n\nclass Base {\npublic:\n    Base () {}\n    Base (vtkPoints *pts, vtkIdType num, const vtkIdType *poly);\n    double n[3], ei[3], ej[3], d;\n};\n\nvoid Transform (const double *in, double *out, const Base &base);\n// void BackTransform (const double *in, double *out, const Base &base);\n\nclass Base2 {\npublic:\n    Base2 () {}\n    Base2 (double *_t, double *_ei, double *_ek) {\n        std::copy_n(_t, 3, t);\n        std::copy_n(_ei, 3, ei);\n        std::copy_n(_ek, 3, ek);\n\n        ej[0] = ek[1]*ei[2]-ek[2]*ei[1];\n        ej[1] = -ek[0]*ei[2]+ek[2]*ei[0];\n        ej[2] = ek[0]*ei[1]-ek[1]*ei[0];\n\n        vtkMath::Normalize(ej);\n    }\n    void Transform (const double *in, double *out) const {\n        double R[][3] = {\n            { ei[0], ei[1], ei[2] },\n            { ej[0], ej[1], ej[2] },\n            { ek[0], ek[1], ek[2] }\n        };\n\n        double _t[] = { in[0]-t[0], in[1]-t[1], in[2]-t[2] };\n\n        out[0] = R[0][0]*_t[0]+R[0][1]*_t[1]+R[0][2]*_t[2];\n        out[1] = R[1][0]*_t[0]+R[1][1]*_t[1]+R[1][2]*_t[2];\n        out[2] = R[2][0]*_t[0]+R[2][1]*_t[1]+R[2][2]*_t[2];\n    }\n    void BackTransform (const double *in, double *out) const {\n        double R[][3] = {\n            { ei[0], ej[0], ek[0] },\n            { ei[1], ej[1], ek[1] },\n            { ei[2], ej[2], ek[2] }\n        };\n\n        double _out[] = {\n            R[0][0]*in[0]+R[0][1]*in[1]+R[0][2]*in[2],\n            R[1][0]*in[0]+R[1][1]*in[1]+R[1][2]*in[2],\n            R[2][0]*in[0]+R[2][1]*in[1]+R[2][2]*in[2]\n        };\n\n        out[0] = _out[0]+t[0];\n        out[1] = _out[1]+t[1];\n        out[2] = _out[2]+t[2];\n    }\n    double t[3], ei[3], ej[3], ek[3];\n};\n\ntemplate<typename T>\nstd::ostream& operator<< (typename std::enable_if<std::is_enum<T>::value, std::ostream>::type& stream, const T& e) {\n    return stream << static_cast<typename std::underlying_type<T>::type>(e);\n}\n\ntypedef std::vector<Point3d> Poly, Points;\ntypedef std::vector<Poly> PolysType;\n\ndouble ComputeNormal (const Poly &poly, double *n);\nbool PointInPoly (const Poly &poly, const Point3d &p);\n\n#ifdef DEBUG\nvoid WritePolys (const char *name, const PolysType &polys);\n#endif\n\ntypedef std::deque<vtkIdType> IndexedPoly;\ntypedef std::vector<IndexedPoly> IndexedPolysType;\n\ntypedef std::map<vtkIdType, std::reference_wrapper<const Point3d>> ReferencedPointsType;\n\nvoid GetPolys (const ReferencedPointsType &pts, const IndexedPolysType &indexedPolys, PolysType &polys);\n\nvoid GetPoly (vtkPoints *pts, vtkIdType num, const vtkIdType *poly, Poly &out);\nvoid FlattenPoly (const Poly &poly, Poly &out, const Base &base);\nvoid FlattenPoly2 (const Poly &poly, Poly &out, const Base2 &base);\n\nclass Proj {\npublic:\n    Proj (vtkIdType a, vtkIdType b, const Point3d &proj, double d) : edge(a, b), proj(proj), d(d) {}\n\n    Pair edge;\n    Point3d proj;\n    double d;\n};\n\nstd::shared_ptr<Proj> GetEdgeProj (const Poly &poly, const Point3d &p);\n\nvoid ProjOnLine (const Point3d &a, const Point3d &b, const Point3d &p, double *d, double *t, std::shared_ptr<Point3d> &proj);\nvoid ProjOnLine (vtkPolyData *pd, const Pair &line, const Point3d &p, std::shared_ptr<Point3d> &proj);\n\nvtkSmartPointer<vtkPolyData> CreatePolyData (const PolysType &polys);\n\ndouble GetTriangleQuality (const Poly &poly);\n\n#endif\n"
  },
  {
    "path": "module/CMakeLists.txt",
    "content": "set(srcs\n    ../Utilities.cxx\n    ../Optimize.cxx\n    ../Contact.cxx\n    ../Merger.cxx\n    ../vtkPolyDataBooleanFilter.cxx\n)\n\nset(headers\n    ../vtkPolyDataBooleanFilter.h\n)\n\nvtk_module_add_module(vtkbool\n    SOURCES ${srcs}\n    HEADERS ${headers}\n)\n"
  },
  {
    "path": "module/vtk.module",
    "content": "NAME\n  vtkbool\nDEPENDS\n  VTK::CommonCore\n  VTK::CommonExecutionModel\n  VTK::FiltersPoints\n  VTK::IOLegacy\n  VTK::FiltersFlowPaths\nTEST_DEPENDS\n  VTK::FiltersSources\nDESCRIPTION\n  This module contains a class to do polydata boolean operations.\n"
  },
  {
    "path": "paraview/CMakeLists.txt",
    "content": "paraview_add_plugin(PolyDataBooleanFilter\n  VERSION \"${vtkbool_VERSION}\"\n  MODULES vtkbool\n  MODULE_FILES \"${CMAKE_CURRENT_SOURCE_DIR}/module/vtk.module\")\n"
  },
  {
    "path": "paraview/module/CMakeLists.txt",
    "content": "set(srcs\n    ../../Utilities.cxx\n    ../../Optimize.cxx\n    ../../Contact.cxx\n    ../../Merger.cxx\n    ../../vtkPolyDataBooleanFilter.cxx\n)\n\nset(headers\n    ../../vtkPolyDataBooleanFilter.h\n)\n\nvtk_module_add_module(vtkbool\n    FORCE_STATIC\n    SOURCES ${srcs}\n    HEADERS ${headers}\n)\n\nparaview_add_server_manager_xmls(\n    XMLS vtkPolyDataBooleanFilter.xml\n)\n"
  },
  {
    "path": "paraview/module/vtk.module",
    "content": "NAME\n  vtkbool\nDEPENDS\n  VTK::CommonCore\n  VTK::CommonExecutionModel\n  VTK::FiltersPoints\n  VTK::IOLegacy\n  VTK::FiltersFlowPaths\nTEST_DEPENDS\n  VTK::FiltersSources\n"
  },
  {
    "path": "paraview/module/vtkPolyDataBooleanFilter.xml",
    "content": "<ServerManagerConfiguration>\n    <ProxyGroup name=\"filters\">\n        <SourceProxy name=\"PolyDataBooleanFilter\" class=\"vtkPolyDataBooleanFilter\" label=\"PolyDataBooleanFilter\">\n            <Documentation short_help=\"A boolean filter for polydata inputs.\" long_help=\"\"></Documentation>\n\n            <InputProperty name=\"InputA\" command=\"SetInputConnection\" port_index=\"0\">\n                <ProxyGroupDomain name=\"groups\">\n                    <Group name=\"sources\"/>\n                    <Group name=\"filters\"/>\n                </ProxyGroupDomain>\n                <DataTypeDomain name=\"input_type\">\n                    <DataType value=\"vtkPolyData\"/>\n                </DataTypeDomain>\n                <Documentation>\n                    First polydata.\n                </Documentation>\n            </InputProperty>\n\n            <InputProperty name=\"InputB\" command=\"SetInputConnection\" port_index=\"1\">\n                <ProxyGroupDomain name=\"groups\">\n                    <Group name=\"sources\"/>\n                    <Group name=\"filters\"/>\n                </ProxyGroupDomain>\n                <DataTypeDomain name=\"input_type\">\n                    <DataType value=\"vtkPolyData\"/>\n                </DataTypeDomain>\n                <Documentation>\n                    Second polydata.\n                </Documentation>\n            </InputProperty>\n\n            <IntVectorProperty name=\"OperMode\" command=\"SetOperMode\" number_of_elements=\"1\" default_values=\"1\">\n                <EnumerationDomain name=\"enum\">\n                    <Entry value=\"1\" text=\"Union\"/>\n                    <Entry value=\"2\" text=\"Intersection\"/>\n                    <Entry value=\"3\" text=\"Difference\"/>\n                    <Entry value=\"4\" text=\"Difference2\"/>\n                </EnumerationDomain>\n                <Documentation>\n                    Sets the operation mode.\n                </Documentation>\n            </IntVectorProperty>\n\n            <Hints>\n                <ShowInMenu category=\"Extensions\"/>\n            </Hints>\n\n        </SourceProxy>\n    </ProxyGroup>\n</ServerManagerConfiguration>\n"
  },
  {
    "path": "paraview/paraview.plugin",
    "content": "NAME\n  PolyDataBooleanFilter\nREQUIRES_MODULES\n  VTK::CommonCore\n  VTK::FiltersCore\nDESCRIPTION\n  This module contains a class to do polydata boolean operations.\n"
  },
  {
    "path": "run_some_tests.sh",
    "content": "#!/bin/bash\nexport PYTHONPATH=/home/zippy/vtkbool/build/lib/python3.13/site-packages/vtkbool:$PYTHONPATH\npushd testing\n\n# pytest test_filter.py::test_triangle_strips -s\n\n# pytest test_filter.py::test_equal_capt_pts -s\n# pytest test_filter.py::test_equal_capt_pts_2 -s\n# pytest test_filter.py::test_equal_capt_pts_3 -s\n\n# gdb --args python -m pytest test_filter.py::test_simple -s\n\npytest test_filter.py\n\n# pytest test_filter.py::test_simple -s\n\npopd\n"
  },
  {
    "path": "testing/data/branched.vtk",
    "content": "# vtk DataFile Version 5.1\nvtk output\nASCII\nDATASET POLYDATA\nPOINTS 622 double\n0.082297295332 0 0.86818063259 0.078269377351 0.025431262329 0.86818063259 0 0 0.875 \n0.066579908133 0.048373136669 0.86818063259 0.048373136669 0.066579908133 0.86818063259 0.025431262329 0.078269377351 0.86818063259 \n5.0392558428e-18 0.082297295332 0.86818063259 -0.025431262329 0.078269377351 0.86818063259 -0.048373136669 0.066579908133 0.86818063259 \n-0.066579908133 0.048373136669 0.86818063259 -0.078269377351 0.025431262329 0.86818063259 -0.082297295332 1.0078511686e-17 0.86818063259 \n-0.078269377351 -0.025431262329 0.86818063259 -0.066579908133 -0.048373136669 0.86818063259 -0.048373136669 -0.066579908133 0.86818063259 \n-0.025431262329 -0.078269377351 0.86818063259 -1.5117767942e-17 -0.082297295332 0.86818063259 0.025431262329 -0.078269377351 0.86818063259 \n0.048373136669 -0.066579908133 0.86818063259 0.066579908133 -0.048373136669 0.86818063259 0.078269377351 -0.025431262329 0.86818063259 \n0.16234973073 0 0.84790861607 0.15440377593 0.050168827176 0.84790861607 0.23797369003 0 0.81473690271 \n0.2263264358 0.073537915945 0.81473690271 0.30710634589 0 0.76957023144 0.29207551479 0.0949010849 0.76957023144 \n0.36786195636 0 0.71364080906 0.34985750914 0.11367559433 0.71364080906 0.41858324409 0 0.64847409725 \n0.39809632301 0.12934933603 0.64847409725 0.45788666606 0 0.57584768534 0.43547609448 0.14149476588 0.57584768534 \n0.48470014334 0 0.4977427423 0.4609772265 0.14978057146 0.4977427423 0.49829223752 0 0.41628968716 \n0.47390407324 0.15398077667 0.41628968716 0.49829223752 0 0.33371031284 0.47390407324 0.15398077667 0.33371031284 \n0.48470014334 0 0.2522572577 0.4609772265 0.14978057146 0.2522572577 0.45788666606 0 0.17415228486 \n0.43547609448 0.14149476588 0.17415228486 0.41858324409 0 0.10152591765 0.39809632301 0.12934933603 0.10152591765 \n0.36786195636 0 0.036359213293 0.34985750914 0.11367559433 0.036359213293 0.13134369254 0.095426782966 0.84790861607 \n0.19252476096 0.13987742364 0.81473690271 0.24845425785 0.1805125922 0.76957023144 0.29760658741 0.21622383595 0.71364080906 \n0.33864095807 0.24603705108 0.64847409725 0.37043809891 0.26913902164 0.57584768534 0.39213064313 0.2848995924 0.4977427423 \n0.40312689543 0.29288882017 0.41628968716 0.40312689543 0.29288882017 0.33371031284 0.39213064313 0.2848995924 0.2522572577 \n0.37043809891 0.26913902164 0.17415228486 0.33864095807 0.24603705108 0.10152591765 0.29760658741 0.21622383595 0.036359213293 \n0.095426782966 0.13134369254 0.84790861607 0.13987742364 0.19252476096 0.81473690271 0.1805125922 0.24845425785 0.76957023144 \n0.21622383595 0.29760658741 0.71364080906 0.24603705108 0.33864095807 0.64847409725 0.26913902164 0.37043809891 0.57584768534 \n0.2848995924 0.39213064313 0.4977427423 0.29288882017 0.40312689543 0.41628968716 0.29288882017 0.40312689543 0.33371031284 \n0.2848995924 0.39213064313 0.2522572577 0.26913902164 0.37043809891 0.17415228486 0.24603705108 0.33864095807 0.10152591765 \n0.21622383595 0.29760658741 0.036359213293 0.050168827176 0.15440377593 0.84790861607 0.073537915945 0.2263264358 0.81473690271 \n0.0949010849 0.29207551479 0.76957023144 0.11367559433 0.34985750914 0.71364080906 0.12934933603 0.39809632301 0.64847409725 \n0.14149476588 0.43547609448 0.57584768534 0.14978057146 0.4609772265 0.4977427423 0.15398077667 0.47390407324 0.41628968716 \n0.15398077667 0.47390407324 0.33371031284 0.14978057146 0.4609772265 0.2522572577 0.14149476588 0.43547609448 0.17415228486 \n0.12934933603 0.39809632301 0.10152591765 0.11367559433 0.34985750914 0.036359213293 9.9410541201e-18 0.16234973073 0.84790861607 \n1.4571686463e-17 0.23797369003 0.81473690271 1.880484115e-17 0.30710634589 0.76957023144 2.2525047905e-17 0.36786195636 0.71364080906 \n2.5630831518e-17 0.41858324409 0.64847409725 2.8037472151e-17 0.45788666606 0.57584768534 2.9679323096e-17 0.48470014334 0.4977427423 \n3.0511599142e-17 0.49829223752 0.41628968716 3.0511599142e-17 0.49829223752 0.33371031284 2.9679323096e-17 0.48470014334 0.2522572577 \n2.8037472151e-17 0.45788666606 0.17415228486 2.5630831518e-17 0.41858324409 0.10152591765 2.2525047905e-17 0.36786195636 0.036359213293 \n-0.050168827176 0.15440377593 0.84790861607 -0.073537915945 0.2263264358 0.81473690271 -0.0949010849 0.29207551479 0.76957023144 \n-0.11367559433 0.34985750914 0.71364080906 -0.12934933603 0.39809632301 0.64847409725 -0.14149476588 0.43547609448 0.57584768534 \n-0.14978057146 0.4609772265 0.4977427423 -0.15398077667 0.47390407324 0.41628968716 -0.15398077667 0.47390407324 0.33371031284 \n-0.14978057146 0.4609772265 0.2522572577 -0.14149476588 0.43547609448 0.17415228486 -0.12934933603 0.39809632301 0.10152591765 \n-0.11367559433 0.34985750914 0.036359213293 -0.095426782966 0.13134369254 0.84790861607 -0.13987742364 0.19252476096 0.81473690271 \n-0.1805125922 0.24845425785 0.76957023144 -0.21622383595 0.29760658741 0.71364080906 -0.24603705108 0.33864095807 0.64847409725 \n-0.26913902164 0.37043809891 0.57584768534 -0.2848995924 0.39213064313 0.4977427423 -0.29288882017 0.40312689543 0.41628968716 \n-0.29288882017 0.40312689543 0.33371031284 -0.2848995924 0.39213064313 0.2522572577 -0.26913902164 0.37043809891 0.17415228486 \n-0.24603705108 0.33864095807 0.10152591765 -0.21622383595 0.29760658741 0.036359213293 -0.13134369254 0.095426782966 0.84790861607 \n-0.19252476096 0.13987742364 0.81473690271 -0.24845425785 0.1805125922 0.76957023144 -0.29760658741 0.21622383595 0.71364080906 \n-0.33864095807 0.24603705108 0.64847409725 -0.37043809891 0.26913902164 0.57584768534 -0.39213064313 0.2848995924 0.4977427423 \n-0.40312689543 0.29288882017 0.41628968716 -0.40312689543 0.29288882017 0.33371031284 -0.39213064313 0.2848995924 0.2522572577 \n-0.37043809891 0.26913902164 0.17415228486 -0.33864095807 0.24603705108 0.10152591765 -0.29760658741 0.21622383595 0.036359213293 \n-0.15440377593 0.050168827176 0.84790861607 -0.2263264358 0.073537915945 0.81473690271 -0.29207551479 0.0949010849 0.76957023144 \n-0.34985750914 0.11367559433 0.71364080906 -0.39809632301 0.12934933603 0.64847409725 -0.43547609448 0.14149476588 0.57584768534 \n-0.4609772265 0.14978057146 0.4977427423 -0.47390407324 0.15398077667 0.41628968716 -0.47390407324 0.15398077667 0.33371031284 \n-0.4609772265 0.14978057146 0.2522572577 -0.43547609448 0.14149476588 0.17415228486 -0.39809632301 0.12934933603 0.10152591765 \n-0.34985750914 0.11367559433 0.036359213293 -0.16234973073 1.988210824e-17 0.84790861607 -0.23797369003 2.9143372925e-17 0.81473690271 \n-0.30710634589 3.76096823e-17 0.76957023144 -0.36786195636 4.5050095809e-17 0.71364080906 -0.41858324409 5.1261663035e-17 0.64847409725 \n-0.45788666606 5.6074944302e-17 0.57584768534 -0.48470014334 5.9358646193e-17 0.4977427423 -0.49829223752 6.1023198283e-17 0.41628968716 \n-0.49829223752 6.1023198283e-17 0.33371031284 -0.48470014334 5.9358646193e-17 0.2522572577 -0.45788666606 5.6074944302e-17 0.17415228486 \n-0.41858324409 5.1261663035e-17 0.10152591765 -0.36786195636 4.5050095809e-17 0.036359213293 -0.15440377593 -0.050168827176 0.84790861607 \n-0.2263264358 -0.073537915945 0.81473690271 -0.29207551479 -0.0949010849 0.76957023144 -0.34985750914 -0.11367559433 0.71364080906 \n-0.39809632301 -0.12934933603 0.64847409725 -0.43547609448 -0.14149476588 0.57584768534 -0.4609772265 -0.14978057146 0.4977427423 \n-0.47390407324 -0.15398077667 0.41628968716 -0.47390407324 -0.15398077667 0.33371031284 -0.4609772265 -0.14978057146 0.2522572577 \n-0.43547609448 -0.14149476588 0.17415228486 -0.39809632301 -0.12934933603 0.10152591765 -0.34985750914 -0.11367559433 0.036359213293 \n-0.13134369254 -0.095426782966 0.84790861607 -0.19252476096 -0.13987742364 0.81473690271 -0.24845425785 -0.1805125922 0.76957023144 \n-0.29760658741 -0.21622383595 0.71364080906 -0.33864095807 -0.24603705108 0.64847409725 -0.37043809891 -0.26913902164 0.57584768534 \n-0.39213064313 -0.2848995924 0.4977427423 -0.40312689543 -0.29288882017 0.41628968716 -0.40312689543 -0.29288882017 0.33371031284 \n-0.39213064313 -0.2848995924 0.2522572577 -0.37043809891 -0.26913902164 0.17415228486 -0.33864095807 -0.24603705108 0.10152591765 \n-0.29760658741 -0.21622383595 0.036359213293 -0.095426782966 -0.13134369254 0.84790861607 -0.13987742364 -0.19252476096 0.81473690271 \n-0.1805125922 -0.24845425785 0.76957023144 -0.21622383595 -0.29760658741 0.71364080906 -0.24603705108 -0.33864095807 0.64847409725 \n-0.26913902164 -0.37043809891 0.57584768534 -0.2848995924 -0.39213064313 0.4977427423 -0.29288882017 -0.40312689543 0.41628968716 \n-0.29288882017 -0.40312689543 0.33371031284 -0.2848995924 -0.39213064313 0.2522572577 -0.26913902164 -0.37043809891 0.17415228486 \n-0.24603705108 -0.33864095807 0.10152591765 -0.21622383595 -0.29760658741 0.036359213293 -0.050168827176 -0.15440377593 0.84790861607 \n-0.073537915945 -0.2263264358 0.81473690271 -0.0949010849 -0.29207551479 0.76957023144 -0.11367559433 -0.34985750914 0.71364080906 \n-0.12934933603 -0.39809632301 0.64847409725 -0.14149476588 -0.43547609448 0.57584768534 -0.14978057146 -0.4609772265 0.4977427423 \n-0.15398077667 -0.47390407324 0.41628968716 -0.15398077667 -0.47390407324 0.33371031284 -0.14978057146 -0.4609772265 0.2522572577 \n-0.14149476588 -0.43547609448 0.17415228486 -0.12934933603 -0.39809632301 0.10152591765 -0.11367559433 -0.34985750914 0.036359213293 \n-2.9823163188e-17 -0.16234973073 0.84790861607 -4.3715059388e-17 -0.23797369003 0.81473690271 -5.6414525104e-17 -0.30710634589 0.76957023144 \n-6.7575143714e-17 -0.36786195636 0.71364080906 -7.6892492899e-17 -0.41858324409 0.64847409725 -8.4112416453e-17 -0.45788666606 0.57584768534 \n-8.9037972598e-17 -0.48470014334 0.4977427423 -9.1534800733e-17 -0.49829223752 0.41628968716 -9.1534800733e-17 -0.49829223752 0.33371031284 \n-8.9037972598e-17 -0.48470014334 0.2522572577 -8.4112416453e-17 -0.45788666606 0.17415228486 -7.6892492899e-17 -0.41858324409 0.10152591765 \n-6.7575143714e-17 -0.36786195636 0.036359213293 0.050168827176 -0.15440377593 0.84790861607 0.073537915945 -0.2263264358 0.81473690271 \n0.0949010849 -0.29207551479 0.76957023144 0.11367559433 -0.34985750914 0.71364080906 0.12934933603 -0.39809632301 0.64847409725 \n0.14149476588 -0.43547609448 0.57584768534 0.14978057146 -0.4609772265 0.4977427423 0.15398077667 -0.47390407324 0.41628968716 \n0.15398077667 -0.47390407324 0.33371031284 0.14978057146 -0.4609772265 0.2522572577 0.14149476588 -0.43547609448 0.17415228486 \n0.12934933603 -0.39809632301 0.10152591765 0.11367559433 -0.34985750914 0.036359213293 0.095426782966 -0.13134369254 0.84790861607 \n0.13987742364 -0.19252476096 0.81473690271 0.1805125922 -0.24845425785 0.76957023144 0.21622383595 -0.29760658741 0.71364080906 \n0.24603705108 -0.33864095807 0.64847409725 0.26913902164 -0.37043809891 0.57584768534 0.2848995924 -0.39213064313 0.4977427423 \n0.29288882017 -0.40312689543 0.41628968716 0.29288882017 -0.40312689543 0.33371031284 0.2848995924 -0.39213064313 0.2522572577 \n0.26913902164 -0.37043809891 0.17415228486 0.24603705108 -0.33864095807 0.10152591765 0.21622383595 -0.29760658741 0.036359213293 \n0.13134369254 -0.095426782966 0.84790861607 0.19252476096 -0.13987742364 0.81473690271 0.24845425785 -0.1805125922 0.76957023144 \n0.29760658741 -0.21622383595 0.71364080906 0.33864095807 -0.24603705108 0.64847409725 0.37043809891 -0.26913902164 0.57584768534 \n0.39213064313 -0.2848995924 0.4977427423 0.40312689543 -0.29288882017 0.41628968716 0.40312689543 -0.29288882017 0.33371031284 \n0.39213064313 -0.2848995924 0.2522572577 0.37043809891 -0.26913902164 0.17415228486 0.33864095807 -0.24603705108 0.10152591765 \n0.29760658741 -0.21622383595 0.036359213293 0.15440377593 -0.050168827176 0.84790861607 0.2263264358 -0.073537915945 0.81473690271 \n0.29207551479 -0.0949010849 0.76957023144 0.34985750914 -0.11367559433 0.71364080906 0.39809632301 -0.12934933603 0.64847409725 \n0.43547609448 -0.14149476588 0.57584768534 0.4609772265 -0.14978057146 0.4977427423 0.47390407324 -0.15398077667 0.41628968716 \n0.47390407324 -0.15398077667 0.33371031284 0.4609772265 -0.14978057146 0.2522572577 0.43547609448 -0.14149476588 0.17415228486 \n0.39809632301 -0.12934933603 0.10152591765 0.34985750914 -0.11367559433 0.036359213293 0.32836531327 8.6818331113e-19 -2.8171179001e-17 \n0.3220653893 0.03977618435 -4.9487070846e-09 0.31859390657 0.06169429886 -4.9487070599e-09 0.31229398553 0.10147046475 2.5407916269e-17 \n0.29401088933 0.13735306108 5.1429095066e-09 0.28393623162 0.15712568324 5.1429095066e-09 0.2656531266 0.19300829687 6.9388939039e-18 \n0.23717652592 0.22148489755 0 0.22148489755 0.23717652592 0 0.19300829687 0.2656531266 0 \n0.15712568324 0.28393623162 -5.1429094891e-09 0.13735306108 0.29401088933 -5.1429095118e-09 0.10147046475 0.31229398553 -2.5197041461e-17 \n0.06169429886 0.31859390657 4.9487070318e-09 0.03977618435 0.3220653893 4.948707057e-09 1.8882986284e-17 0.32836531327 2.3493044647e-24 \n-0.03977618435 0.3220653893 -4.9487070858e-09 -0.06169429886 0.31859390657 -4.948707057e-09 -0.10147046475 0.31229398553 -4.4034066554e-18 \n-0.13735306108 0.29401088933 5.1429095118e-09 -0.15712568324 0.28393623162 5.1429095066e-09 -0.19300829687 0.2656531266 2.0768586122e-18 \n-0.22148489755 0.23717652592 0 -0.23717652592 0.22148489755 0 -0.2656531266 0.19300829687 0 \n-0.28393623162 0.15712568324 -5.1429094753e-09 -0.29401088933 0.13735306108 -5.1429095118e-09 -0.31229398553 0.10147046475 -2.5407916269e-17 \n-0.31859390657 0.06169429886 4.9487070561e-09 -0.3220653893 0.03977618435 4.9487070561e-09 -0.32836531327 3.8887509036e-17 4.8381435661e-24 \n-0.3220653893 -0.03977618435 -4.9487070852e-09 -0.31859390657 -0.06169429886 -4.9487070599e-09 -0.31229398553 -0.10147046475 -2.9741361642e-18 \n-0.29401088933 -0.13735306108 5.1429095066e-09 -0.28393623162 -0.15712568324 5.1429095066e-09 -0.2656531266 -0.19300829687 6.9388939039e-18 \n-0.23717652592 -0.22148489755 0 -0.22148489755 -0.23717652592 0 -0.19300829687 -0.2656531266 0 \n-0.15712568324 -0.28393623162 -5.1429094753e-09 -0.13735306108 -0.29401088933 -5.1429094753e-09 -0.10147046475 -0.31229398553 -2.540791296e-17 \n-0.06169429886 -0.31859390657 4.9487070561e-09 -0.03977618435 -0.3220653893 4.9487070565e-09 -5.8492876492e-17 -0.32836531327 -8.5284299912e-18 \n0.03977618435 -0.3220653893 -4.9487070556e-09 0.06169429886 -0.31859390657 -4.9487070591e-09 0.10147046475 -0.31229398553 -1.5448640187e-18 \n0.13735306108 -0.29401088933 5.1429095066e-09 0.15712568324 -0.28393623162 5.1429094891e-09 0.19300829687 -0.2656531266 -0 \n0.22148489755 -0.23717652592 -0 0.23717652592 -0.22148489755 -0 0.2656531266 -0.19300829687 -2.0768619209e-18 \n0.28393623162 -0.15712568324 -5.1429094753e-09 0.29401088933 -0.13735306108 -5.1429095118e-09 0.31229398553 -0.10147046475 2.9741345099e-18 \n0.31859390657 -0.06169429886 4.9487070561e-09 0.3220653893 -0.03977618435 4.9487070565e-09 0.082297295332 0 -0.86818063259 \n0 0 -0.875 0.078269377351 0.025431262329 -0.86818063259 0.066579908133 0.048373136669 -0.86818063259 \n0.048373136669 0.066579908133 -0.86818063259 0.025431262329 0.078269377351 -0.86818063259 5.0392558428e-18 0.082297295332 -0.86818063259 \n-0.025431262329 0.078269377351 -0.86818063259 -0.048373136669 0.066579908133 -0.86818063259 -0.066579908133 0.048373136669 -0.86818063259 \n-0.078269377351 0.025431262329 -0.86818063259 -0.082297295332 1.0078511686e-17 -0.86818063259 -0.078269377351 -0.025431262329 -0.86818063259 \n-0.066579908133 -0.048373136669 -0.86818063259 -0.048373136669 -0.066579908133 -0.86818063259 -0.025431262329 -0.078269377351 -0.86818063259 \n-1.5117767942e-17 -0.082297295332 -0.86818063259 0.025431262329 -0.078269377351 -0.86818063259 0.048373136669 -0.066579908133 -0.86818063259 \n0.066579908133 -0.048373136669 -0.86818063259 0.078269377351 -0.025431262329 -0.86818063259 0.36786195636 0 -0.036359213293 \n0.41858324409 0 -0.10152591765 0.39809632301 0.12934933603 -0.10152591765 0.34985750914 0.11367559433 -0.036359213293 \n0.45788666606 0 -0.17415228486 0.43547609448 0.14149476588 -0.17415228486 0.48470014334 0 -0.2522572577 \n0.4609772265 0.14978057146 -0.2522572577 0.49829223752 0 -0.33371031284 0.47390407324 0.15398077667 -0.33371031284 \n0.49829223752 0 -0.41628968716 0.47390407324 0.15398077667 -0.41628968716 0.48470014334 0 -0.4977427423 \n0.4609772265 0.14978057146 -0.4977427423 0.45788666606 0 -0.57584768534 0.43547609448 0.14149476588 -0.57584768534 \n0.41858324409 0 -0.64847409725 0.39809632301 0.12934933603 -0.64847409725 0.36786195636 0 -0.71364080906 \n0.34985750914 0.11367559433 -0.71364080906 0.30710634589 0 -0.76957023144 0.29207551479 0.0949010849 -0.76957023144 \n0.23797369003 0 -0.81473690271 0.2263264358 0.073537915945 -0.81473690271 0.16234973073 0 -0.84790861607 \n0.15440377593 0.050168827176 -0.84790861607 0.33864095807 0.24603705108 -0.10152591765 0.29760658741 0.21622383595 -0.036359213293 \n0.37043809891 0.26913902164 -0.17415228486 0.39213064313 0.2848995924 -0.2522572577 0.40312689543 0.29288882017 -0.33371031284 \n0.40312689543 0.29288882017 -0.41628968716 0.39213064313 0.2848995924 -0.4977427423 0.37043809891 0.26913902164 -0.57584768534 \n0.33864095807 0.24603705108 -0.64847409725 0.29760658741 0.21622383595 -0.71364080906 0.24845425785 0.1805125922 -0.76957023144 \n0.19252476096 0.13987742364 -0.81473690271 0.13134369254 0.095426782966 -0.84790861607 0.24603705108 0.33864095807 -0.10152591765 \n0.21622383595 0.29760658741 -0.036359213293 0.26913902164 0.37043809891 -0.17415228486 0.2848995924 0.39213064313 -0.2522572577 \n0.29288882017 0.40312689543 -0.33371031284 0.29288882017 0.40312689543 -0.41628968716 0.2848995924 0.39213064313 -0.4977427423 \n0.26913902164 0.37043809891 -0.57584768534 0.24603705108 0.33864095807 -0.64847409725 0.21622383595 0.29760658741 -0.71364080906 \n0.1805125922 0.24845425785 -0.76957023144 0.13987742364 0.19252476096 -0.81473690271 0.095426782966 0.13134369254 -0.84790861607 \n0.12934933603 0.39809632301 -0.10152591765 0.11367559433 0.34985750914 -0.036359213293 0.14149476588 0.43547609448 -0.17415228486 \n0.14978057146 0.4609772265 -0.2522572577 0.15398077667 0.47390407324 -0.33371031284 0.15398077667 0.47390407324 -0.41628968716 \n0.14978057146 0.4609772265 -0.4977427423 0.14149476588 0.43547609448 -0.57584768534 0.12934933603 0.39809632301 -0.64847409725 \n0.11367559433 0.34985750914 -0.71364080906 0.0949010849 0.29207551479 -0.76957023144 0.073537915945 0.2263264358 -0.81473690271 \n0.050168827176 0.15440377593 -0.84790861607 2.5630831518e-17 0.41858324409 -0.10152591765 2.2525047905e-17 0.36786195636 -0.036359213293 \n2.8037472151e-17 0.45788666606 -0.17415228486 2.9679323096e-17 0.48470014334 -0.2522572577 3.0511599142e-17 0.49829223752 -0.33371031284 \n3.0511599142e-17 0.49829223752 -0.41628968716 2.9679323096e-17 0.48470014334 -0.4977427423 2.8037472151e-17 0.45788666606 -0.57584768534 \n2.5630831518e-17 0.41858324409 -0.64847409725 2.2525047905e-17 0.36786195636 -0.71364080906 1.880484115e-17 0.30710634589 -0.76957023144 \n1.4571686463e-17 0.23797369003 -0.81473690271 9.9410541201e-18 0.16234973073 -0.84790861607 -0.12934933603 0.39809632301 -0.10152591765 \n-0.11367559433 0.34985750914 -0.036359213293 -0.14149476588 0.43547609448 -0.17415228486 -0.14978057146 0.4609772265 -0.2522572577 \n-0.15398077667 0.47390407324 -0.33371031284 -0.15398077667 0.47390407324 -0.41628968716 -0.14978057146 0.4609772265 -0.4977427423 \n-0.14149476588 0.43547609448 -0.57584768534 -0.12934933603 0.39809632301 -0.64847409725 -0.11367559433 0.34985750914 -0.71364080906 \n-0.0949010849 0.29207551479 -0.76957023144 -0.073537915945 0.2263264358 -0.81473690271 -0.050168827176 0.15440377593 -0.84790861607 \n-0.24603705108 0.33864095807 -0.10152591765 -0.21622383595 0.29760658741 -0.036359213293 -0.26913902164 0.37043809891 -0.17415228486 \n-0.2848995924 0.39213064313 -0.2522572577 -0.29288882017 0.40312689543 -0.33371031284 -0.29288882017 0.40312689543 -0.41628968716 \n-0.2848995924 0.39213064313 -0.4977427423 -0.26913902164 0.37043809891 -0.57584768534 -0.24603705108 0.33864095807 -0.64847409725 \n-0.21622383595 0.29760658741 -0.71364080906 -0.1805125922 0.24845425785 -0.76957023144 -0.13987742364 0.19252476096 -0.81473690271 \n-0.095426782966 0.13134369254 -0.84790861607 -0.33864095807 0.24603705108 -0.10152591765 -0.29760658741 0.21622383595 -0.036359213293 \n-0.37043809891 0.26913902164 -0.17415228486 -0.39213064313 0.2848995924 -0.2522572577 -0.40312689543 0.29288882017 -0.33371031284 \n-0.40312689543 0.29288882017 -0.41628968716 -0.39213064313 0.2848995924 -0.4977427423 -0.37043809891 0.26913902164 -0.57584768534 \n-0.33864095807 0.24603705108 -0.64847409725 -0.29760658741 0.21622383595 -0.71364080906 -0.24845425785 0.1805125922 -0.76957023144 \n-0.19252476096 0.13987742364 -0.81473690271 -0.13134369254 0.095426782966 -0.84790861607 -0.39809632301 0.12934933603 -0.10152591765 \n-0.34985750914 0.11367559433 -0.036359213293 -0.43547609448 0.14149476588 -0.17415228486 -0.4609772265 0.14978057146 -0.2522572577 \n-0.47390407324 0.15398077667 -0.33371031284 -0.47390407324 0.15398077667 -0.41628968716 -0.4609772265 0.14978057146 -0.4977427423 \n-0.43547609448 0.14149476588 -0.57584768534 -0.39809632301 0.12934933603 -0.64847409725 -0.34985750914 0.11367559433 -0.71364080906 \n-0.29207551479 0.0949010849 -0.76957023144 -0.2263264358 0.073537915945 -0.81473690271 -0.15440377593 0.050168827176 -0.84790861607 \n-0.41858324409 5.1261663035e-17 -0.10152591765 -0.36786195636 4.5050095809e-17 -0.036359213293 -0.45788666606 5.6074944302e-17 -0.17415228486 \n-0.48470014334 5.9358646193e-17 -0.2522572577 -0.49829223752 6.1023198283e-17 -0.33371031284 -0.49829223752 6.1023198283e-17 -0.41628968716 \n-0.48470014334 5.9358646193e-17 -0.4977427423 -0.45788666606 5.6074944302e-17 -0.57584768534 -0.41858324409 5.1261663035e-17 -0.64847409725 \n-0.36786195636 4.5050095809e-17 -0.71364080906 -0.30710634589 3.76096823e-17 -0.76957023144 -0.23797369003 2.9143372925e-17 -0.81473690271 \n-0.16234973073 1.988210824e-17 -0.84790861607 -0.39809632301 -0.12934933603 -0.10152591765 -0.34985750914 -0.11367559433 -0.036359213293 \n-0.43547609448 -0.14149476588 -0.17415228486 -0.4609772265 -0.14978057146 -0.2522572577 -0.47390407324 -0.15398077667 -0.33371031284 \n-0.47390407324 -0.15398077667 -0.41628968716 -0.4609772265 -0.14978057146 -0.4977427423 -0.43547609448 -0.14149476588 -0.57584768534 \n-0.39809632301 -0.12934933603 -0.64847409725 -0.34985750914 -0.11367559433 -0.71364080906 -0.29207551479 -0.0949010849 -0.76957023144 \n-0.2263264358 -0.073537915945 -0.81473690271 -0.15440377593 -0.050168827176 -0.84790861607 -0.33864095807 -0.24603705108 -0.10152591765 \n-0.29760658741 -0.21622383595 -0.036359213293 -0.37043809891 -0.26913902164 -0.17415228486 -0.39213064313 -0.2848995924 -0.2522572577 \n-0.40312689543 -0.29288882017 -0.33371031284 -0.40312689543 -0.29288882017 -0.41628968716 -0.39213064313 -0.2848995924 -0.4977427423 \n-0.37043809891 -0.26913902164 -0.57584768534 -0.33864095807 -0.24603705108 -0.64847409725 -0.29760658741 -0.21622383595 -0.71364080906 \n-0.24845425785 -0.1805125922 -0.76957023144 -0.19252476096 -0.13987742364 -0.81473690271 -0.13134369254 -0.095426782966 -0.84790861607 \n-0.24603705108 -0.33864095807 -0.10152591765 -0.21622383595 -0.29760658741 -0.036359213293 -0.26913902164 -0.37043809891 -0.17415228486 \n-0.2848995924 -0.39213064313 -0.2522572577 -0.29288882017 -0.40312689543 -0.33371031284 -0.29288882017 -0.40312689543 -0.41628968716 \n-0.2848995924 -0.39213064313 -0.4977427423 -0.26913902164 -0.37043809891 -0.57584768534 -0.24603705108 -0.33864095807 -0.64847409725 \n-0.21622383595 -0.29760658741 -0.71364080906 -0.1805125922 -0.24845425785 -0.76957023144 -0.13987742364 -0.19252476096 -0.81473690271 \n-0.095426782966 -0.13134369254 -0.84790861607 -0.12934933603 -0.39809632301 -0.10152591765 -0.11367559433 -0.34985750914 -0.036359213293 \n-0.14149476588 -0.43547609448 -0.17415228486 -0.14978057146 -0.4609772265 -0.2522572577 -0.15398077667 -0.47390407324 -0.33371031284 \n-0.15398077667 -0.47390407324 -0.41628968716 -0.14978057146 -0.4609772265 -0.4977427423 -0.14149476588 -0.43547609448 -0.57584768534 \n-0.12934933603 -0.39809632301 -0.64847409725 -0.11367559433 -0.34985750914 -0.71364080906 -0.0949010849 -0.29207551479 -0.76957023144 \n-0.073537915945 -0.2263264358 -0.81473690271 -0.050168827176 -0.15440377593 -0.84790861607 -7.6892492899e-17 -0.41858324409 -0.10152591765 \n-6.7575143714e-17 -0.36786195636 -0.036359213293 -8.4112416453e-17 -0.45788666606 -0.17415228486 -8.9037972598e-17 -0.48470014334 -0.2522572577 \n-9.1534800733e-17 -0.49829223752 -0.33371031284 -9.1534800733e-17 -0.49829223752 -0.41628968716 -8.9037972598e-17 -0.48470014334 -0.4977427423 \n-8.4112416453e-17 -0.45788666606 -0.57584768534 -7.6892492899e-17 -0.41858324409 -0.64847409725 -6.7575143714e-17 -0.36786195636 -0.71364080906 \n-5.6414525104e-17 -0.30710634589 -0.76957023144 -4.3715059388e-17 -0.23797369003 -0.81473690271 -2.9823163188e-17 -0.16234973073 -0.84790861607 \n0.12934933603 -0.39809632301 -0.10152591765 0.11367559433 -0.34985750914 -0.036359213293 0.14149476588 -0.43547609448 -0.17415228486 \n0.14978057146 -0.4609772265 -0.2522572577 0.15398077667 -0.47390407324 -0.33371031284 0.15398077667 -0.47390407324 -0.41628968716 \n0.14978057146 -0.4609772265 -0.4977427423 0.14149476588 -0.43547609448 -0.57584768534 0.12934933603 -0.39809632301 -0.64847409725 \n0.11367559433 -0.34985750914 -0.71364080906 0.0949010849 -0.29207551479 -0.76957023144 0.073537915945 -0.2263264358 -0.81473690271 \n0.050168827176 -0.15440377593 -0.84790861607 0.24603705108 -0.33864095807 -0.10152591765 0.21622383595 -0.29760658741 -0.036359213293 \n0.26913902164 -0.37043809891 -0.17415228486 0.2848995924 -0.39213064313 -0.2522572577 0.29288882017 -0.40312689543 -0.33371031284 \n0.29288882017 -0.40312689543 -0.41628968716 0.2848995924 -0.39213064313 -0.4977427423 0.26913902164 -0.37043809891 -0.57584768534 \n0.24603705108 -0.33864095807 -0.64847409725 0.21622383595 -0.29760658741 -0.71364080906 0.1805125922 -0.24845425785 -0.76957023144 \n0.13987742364 -0.19252476096 -0.81473690271 0.095426782966 -0.13134369254 -0.84790861607 0.33864095807 -0.24603705108 -0.10152591765 \n0.29760658741 -0.21622383595 -0.036359213293 0.37043809891 -0.26913902164 -0.17415228486 0.39213064313 -0.2848995924 -0.2522572577 \n0.40312689543 -0.29288882017 -0.33371031284 0.40312689543 -0.29288882017 -0.41628968716 0.39213064313 -0.2848995924 -0.4977427423 \n0.37043809891 -0.26913902164 -0.57584768534 0.33864095807 -0.24603705108 -0.64847409725 0.29760658741 -0.21622383595 -0.71364080906 \n0.24845425785 -0.1805125922 -0.76957023144 0.19252476096 -0.13987742364 -0.81473690271 0.13134369254 -0.095426782966 -0.84790861607 \n0.39809632301 -0.12934933603 -0.10152591765 0.34985750914 -0.11367559433 -0.036359213293 0.43547609448 -0.14149476588 -0.17415228486 \n0.4609772265 -0.14978057146 -0.2522572577 0.47390407324 -0.15398077667 -0.33371031284 0.47390407324 -0.15398077667 -0.41628968716 \n0.4609772265 -0.14978057146 -0.4977427423 0.43547609448 -0.14149476588 -0.57584768534 0.39809632301 -0.12934933603 -0.64847409725 \n0.34985750914 -0.11367559433 -0.71364080906 0.29207551479 -0.0949010849 -0.76957023144 0.2263264358 -0.073537915945 -0.81473690271 \n0.15440377593 -0.050168827176 -0.84790861607 \nPOLYGONS 1161 3560\nOFFSETS vtktypeint64\n0 3 6 9 12 15 18 21 24 \n27 30 33 36 39 42 45 48 51 \n54 57 60 63 66 69 72 75 78 \n81 84 87 90 93 96 99 102 105 \n108 111 114 117 120 123 126 129 132 \n135 138 141 144 147 150 153 156 159 \n162 165 168 171 174 177 180 183 186 \n189 192 195 198 201 204 207 210 213 \n216 219 222 225 228 231 234 237 240 \n243 246 249 252 255 258 261 264 267 \n270 273 276 279 282 285 288 291 294 \n297 300 303 306 309 312 315 318 321 \n324 327 330 333 336 339 342 345 348 \n351 354 357 360 363 366 369 372 375 \n378 381 384 387 390 393 396 399 402 \n405 408 411 414 417 420 423 426 429 \n432 435 438 441 444 447 450 453 456 \n459 462 465 468 471 474 477 480 483 \n486 489 492 495 498 501 504 507 510 \n513 516 519 522 525 528 531 534 537 \n540 543 546 549 552 555 558 561 564 \n567 570 573 576 579 582 585 588 591 \n594 597 600 603 606 609 612 615 618 \n621 624 627 630 633 636 639 642 645 \n648 651 654 657 660 663 666 669 672 \n675 678 681 684 687 690 693 696 699 \n702 705 708 711 714 717 720 723 726 \n729 732 735 738 741 744 747 750 753 \n756 759 762 765 768 771 774 777 780 \n783 786 789 792 795 798 801 804 807 \n810 813 816 819 822 825 828 831 834 \n837 840 843 846 849 852 855 858 861 \n864 867 870 873 876 879 882 885 888 \n891 894 897 900 903 906 909 912 915 \n918 921 924 927 930 933 936 939 942 \n945 948 951 954 957 960 963 966 969 \n972 975 978 981 984 987 990 993 996 \n999 1002 1005 1008 1011 1014 1017 1020 1023 \n1026 1029 1032 1035 1038 1041 1044 1047 1050 \n1053 1056 1059 1062 1065 1068 1071 1074 1077 \n1080 1083 1086 1089 1092 1095 1098 1101 1104 \n1107 1110 1113 1116 1119 1122 1125 1128 1131 \n1134 1137 1140 1143 1146 1149 1152 1155 1158 \n1161 1164 1167 1170 1173 1176 1179 1182 1185 \n1188 1191 1194 1197 1200 1203 1206 1209 1212 \n1215 1218 1221 1224 1227 1230 1233 1236 1239 \n1242 1245 1248 1251 1254 1257 1260 1263 1266 \n1269 1272 1275 1278 1281 1284 1287 1290 1293 \n1296 1299 1302 1305 1308 1311 1314 1317 1320 \n1323 1326 1329 1332 1335 1338 1341 1344 1347 \n1350 1353 1356 1359 1362 1365 1368 1371 1374 \n1377 1380 1383 1386 1389 1392 1395 1398 1401 \n1404 1407 1410 1413 1416 1419 1422 1425 1428 \n1431 1434 1437 1440 1443 1446 1449 1452 1455 \n1458 1461 1464 1467 1470 1473 1476 1479 1482 \n1485 1488 1491 1494 1497 1500 1503 1506 1509 \n1512 1515 1518 1521 1524 1527 1530 1533 1536 \n1539 1542 1545 1548 1551 1554 1557 1560 1563 \n1566 1569 1572 1575 1578 1581 1584 1587 1590 \n1593 1596 1599 1602 1605 1608 1611 1614 1617 \n1620 1624 1628 1632 1636 1640 1644 1648 1652 \n1656 1660 1664 1668 1672 1676 1680 1684 1688 \n1692 1696 1700 1704 1708 1712 1716 1720 1724 \n1728 1732 1736 1740 1744 1748 1752 1756 1760 \n1764 1768 1772 1776 1780 1783 1786 1789 1792 \n1795 1798 1801 1804 1807 1810 1813 1816 1819 \n1822 1825 1828 1831 1834 1837 1840 1843 1846 \n1849 1852 1855 1858 1861 1864 1867 1870 1873 \n1876 1879 1882 1885 1888 1891 1894 1897 1900 \n1903 1906 1909 1912 1915 1918 1921 1924 1927 \n1930 1933 1936 1939 1942 1945 1948 1951 1954 \n1957 1960 1963 1966 1969 1972 1975 1978 1981 \n1984 1987 1990 1993 1996 1999 2002 2005 2008 \n2011 2014 2017 2020 2023 2026 2029 2032 2035 \n2038 2041 2044 2047 2050 2053 2056 2059 2062 \n2065 2068 2071 2074 2077 2080 2083 2086 2089 \n2092 2095 2098 2101 2104 2107 2110 2113 2116 \n2119 2122 2125 2128 2131 2134 2137 2140 2143 \n2146 2149 2152 2155 2158 2161 2164 2167 2170 \n2173 2176 2179 2182 2185 2188 2191 2194 2197 \n2200 2203 2206 2209 2212 2215 2218 2221 2224 \n2227 2230 2233 2236 2239 2242 2245 2248 2251 \n2254 2257 2260 2263 2266 2269 2272 2275 2278 \n2281 2284 2287 2290 2293 2296 2299 2302 2305 \n2308 2311 2314 2317 2320 2323 2326 2329 2332 \n2335 2338 2341 2344 2347 2350 2353 2356 2359 \n2362 2365 2368 2371 2374 2377 2380 2383 2386 \n2389 2392 2395 2398 2401 2404 2407 2410 2413 \n2416 2419 2422 2425 2428 2431 2434 2437 2440 \n2443 2446 2449 2452 2455 2458 2461 2464 2467 \n2470 2473 2476 2479 2482 2485 2488 2491 2494 \n2497 2500 2503 2506 2509 2512 2515 2518 2521 \n2524 2527 2530 2533 2536 2539 2542 2545 2548 \n2551 2554 2557 2560 2563 2566 2569 2572 2575 \n2578 2581 2584 2587 2590 2593 2596 2599 2602 \n2605 2608 2611 2614 2617 2620 2623 2626 2629 \n2632 2635 2638 2641 2644 2647 2650 2653 2656 \n2659 2662 2665 2668 2671 2674 2677 2680 2683 \n2686 2689 2692 2695 2698 2701 2704 2707 2710 \n2713 2716 2719 2722 2725 2728 2731 2734 2737 \n2740 2743 2746 2749 2752 2755 2758 2761 2764 \n2767 2770 2773 2776 2779 2782 2785 2788 2791 \n2794 2797 2800 2803 2806 2809 2812 2815 2818 \n2821 2824 2827 2830 2833 2836 2839 2842 2845 \n2848 2851 2854 2857 2860 2863 2866 2869 2872 \n2875 2878 2881 2884 2887 2890 2893 2896 2899 \n2902 2905 2908 2911 2914 2917 2920 2923 2926 \n2929 2932 2935 2938 2941 2944 2947 2950 2953 \n2956 2959 2962 2965 2968 2971 2974 2977 2980 \n2983 2986 2989 2992 2995 2998 3001 3004 3007 \n3010 3013 3016 3019 3022 3025 3028 3031 3034 \n3037 3040 3043 3046 3049 3052 3055 3058 3061 \n3064 3067 3070 3073 3076 3079 3082 3085 3088 \n3091 3094 3097 3100 3103 3106 3109 3112 3115 \n3118 3121 3124 3127 3130 3133 3136 3139 3142 \n3145 3148 3151 3154 3157 3160 3163 3166 3169 \n3172 3175 3178 3181 3184 3187 3190 3193 3196 \n3199 3202 3205 3208 3211 3214 3217 3220 3223 \n3226 3229 3232 3235 3238 3241 3244 3247 3250 \n3253 3256 3259 3262 3265 3268 3271 3274 3277 \n3280 3283 3286 3289 3292 3295 3298 3301 3304 \n3307 3310 3313 3316 3319 3322 3325 3328 3331 \n3334 3337 3340 3343 3346 3349 3352 3355 3358 \n3361 3364 3367 3370 3373 3376 3379 3382 3385 \n3388 3391 3394 3397 3400 3404 3408 3412 3416 \n3420 3424 3428 3432 3436 3440 3444 3448 3452 \n3456 3460 3464 3468 3472 3476 3480 3484 3488 \n3492 3496 3500 3504 3508 3512 3516 3520 3524 \n3528 3532 3536 3540 3544 3548 3552 3556 3560 \n\nCONNECTIVITY vtktypeint64\n0 1 2 1 3 2 3 4 2 \n4 5 2 5 6 2 6 7 2 \n7 8 2 8 9 2 9 10 2 \n10 11 2 11 12 2 12 13 2 \n13 14 2 14 15 2 15 16 2 \n16 17 2 17 18 2 18 19 2 \n19 20 2 20 0 2 0 21 22 \n0 22 1 21 23 24 21 24 22 \n23 25 26 23 26 24 25 27 28 \n25 28 26 27 29 30 27 30 28 \n29 31 32 29 32 30 31 33 34 \n31 34 32 33 35 36 33 36 34 \n35 37 38 35 38 36 37 39 40 \n37 40 38 39 41 42 39 42 40 \n41 43 44 41 44 42 43 45 46 \n43 46 44 1 22 47 1 47 3 \n22 24 48 22 48 47 24 26 49 \n24 49 48 26 28 50 26 50 49 \n28 30 51 28 51 50 30 32 52 \n30 52 51 32 34 53 32 53 52 \n34 36 54 34 54 53 36 38 55 \n36 55 54 38 40 56 38 56 55 \n40 42 57 40 57 56 42 44 58 \n42 58 57 44 46 59 44 59 58 \n3 47 60 3 60 4 47 48 61 \n47 61 60 48 49 62 48 62 61 \n49 50 63 49 63 62 50 51 64 \n50 64 63 51 52 65 51 65 64 \n52 53 66 52 66 65 53 54 67 \n53 67 66 54 55 68 54 68 67 \n55 56 69 55 69 68 56 57 70 \n56 70 69 57 58 71 57 71 70 \n58 59 72 58 72 71 4 60 73 \n4 73 5 60 61 74 60 74 73 \n61 62 75 61 75 74 62 63 76 \n62 76 75 63 64 77 63 77 76 \n64 65 78 64 78 77 65 66 79 \n65 79 78 66 67 80 66 80 79 \n67 68 81 67 81 80 68 69 82 \n68 82 81 69 70 83 69 83 82 \n70 71 84 70 84 83 71 72 85 \n71 85 84 5 73 86 5 86 6 \n73 74 87 73 87 86 74 75 88 \n74 88 87 75 76 89 75 89 88 \n76 77 90 76 90 89 77 78 91 \n77 91 90 78 79 92 78 92 91 \n79 80 93 79 93 92 80 81 94 \n80 94 93 81 82 95 81 95 94 \n82 83 96 82 96 95 83 84 97 \n83 97 96 84 85 98 84 98 97 \n6 86 99 6 99 7 86 87 100 \n86 100 99 87 88 101 87 101 100 \n88 89 102 88 102 101 89 90 103 \n89 103 102 90 91 104 90 104 103 \n91 92 105 91 105 104 92 93 106 \n92 106 105 93 94 107 93 107 106 \n94 95 108 94 108 107 95 96 109 \n95 109 108 96 97 110 96 110 109 \n97 98 111 97 111 110 7 99 112 \n7 112 8 99 100 113 99 113 112 \n100 101 114 100 114 113 101 102 115 \n101 115 114 102 103 116 102 116 115 \n103 104 117 103 117 116 104 105 118 \n104 118 117 105 106 119 105 119 118 \n106 107 120 106 120 119 107 108 121 \n107 121 120 108 109 122 108 122 121 \n109 110 123 109 123 122 110 111 124 \n110 124 123 8 112 125 8 125 9 \n112 113 126 112 126 125 113 114 127 \n113 127 126 114 115 128 114 128 127 \n115 116 129 115 129 128 116 117 130 \n116 130 129 117 118 131 117 131 130 \n118 119 132 118 132 131 119 120 133 \n119 133 132 120 121 134 120 134 133 \n121 122 135 121 135 134 122 123 136 \n122 136 135 123 124 137 123 137 136 \n9 125 138 9 138 10 125 126 139 \n125 139 138 126 127 140 126 140 139 \n127 128 141 127 141 140 128 129 142 \n128 142 141 129 130 143 129 143 142 \n130 131 144 130 144 143 131 132 145 \n131 145 144 132 133 146 132 146 145 \n133 134 147 133 147 146 134 135 148 \n134 148 147 135 136 149 135 149 148 \n136 137 150 136 150 149 10 138 151 \n10 151 11 138 139 152 138 152 151 \n139 140 153 139 153 152 140 141 154 \n140 154 153 141 142 155 141 155 154 \n142 143 156 142 156 155 143 144 157 \n143 157 156 144 145 158 144 158 157 \n145 146 159 145 159 158 146 147 160 \n146 160 159 147 148 161 147 161 160 \n148 149 162 148 162 161 149 150 163 \n149 163 162 11 151 164 11 164 12 \n151 152 165 151 165 164 152 153 166 \n152 166 165 153 154 167 153 167 166 \n154 155 168 154 168 167 155 156 169 \n155 169 168 156 157 170 156 170 169 \n157 158 171 157 171 170 158 159 172 \n158 172 171 159 160 173 159 173 172 \n160 161 174 160 174 173 161 162 175 \n161 175 174 162 163 176 162 176 175 \n12 164 177 12 177 13 164 165 178 \n164 178 177 165 166 179 165 179 178 \n166 167 180 166 180 179 167 168 181 \n167 181 180 168 169 182 168 182 181 \n169 170 183 169 183 182 170 171 184 \n170 184 183 171 172 185 171 185 184 \n172 173 186 172 186 185 173 174 187 \n173 187 186 174 175 188 174 188 187 \n175 176 189 175 189 188 13 177 190 \n13 190 14 177 178 191 177 191 190 \n178 179 192 178 192 191 179 180 193 \n179 193 192 180 181 194 180 194 193 \n181 182 195 181 195 194 182 183 196 \n182 196 195 183 184 197 183 197 196 \n184 185 198 184 198 197 185 186 199 \n185 199 198 186 187 200 186 200 199 \n187 188 201 187 201 200 188 189 202 \n188 202 201 14 190 203 14 203 15 \n190 191 204 190 204 203 191 192 205 \n191 205 204 192 193 206 192 206 205 \n193 194 207 193 207 206 194 195 208 \n194 208 207 195 196 209 195 209 208 \n196 197 210 196 210 209 197 198 211 \n197 211 210 198 199 212 198 212 211 \n199 200 213 199 213 212 200 201 214 \n200 214 213 201 202 215 201 215 214 \n15 203 216 15 216 16 203 204 217 \n203 217 216 204 205 218 204 218 217 \n205 206 219 205 219 218 206 207 220 \n206 220 219 207 208 221 207 221 220 \n208 209 222 208 222 221 209 210 223 \n209 223 222 210 211 224 210 224 223 \n211 212 225 211 225 224 212 213 226 \n212 226 225 213 214 227 213 227 226 \n214 215 228 214 228 227 16 216 229 \n16 229 17 216 217 230 216 230 229 \n217 218 231 217 231 230 218 219 232 \n218 232 231 219 220 233 219 233 232 \n220 221 234 220 234 233 221 222 235 \n221 235 234 222 223 236 222 236 235 \n223 224 237 223 237 236 224 225 238 \n224 238 237 225 226 239 225 239 238 \n226 227 240 226 240 239 227 228 241 \n227 241 240 17 229 242 17 242 18 \n229 230 243 229 243 242 230 231 244 \n230 244 243 231 232 245 231 245 244 \n232 233 246 232 246 245 233 234 247 \n233 247 246 234 235 248 234 248 247 \n235 236 249 235 249 248 236 237 250 \n236 250 249 237 238 251 237 251 250 \n238 239 252 238 252 251 239 240 253 \n239 253 252 240 241 254 240 254 253 \n18 242 255 18 255 19 242 243 256 \n242 256 255 243 244 257 243 257 256 \n244 245 258 244 258 257 245 246 259 \n245 259 258 246 247 260 246 260 259 \n247 248 261 247 261 260 248 249 262 \n248 262 261 249 250 263 249 263 262 \n250 251 264 250 264 263 251 252 265 \n251 265 264 252 253 266 252 266 265 \n253 254 267 253 267 266 19 255 268 \n19 268 20 255 256 269 255 269 268 \n256 257 270 256 270 269 257 258 271 \n257 271 270 258 259 272 258 272 271 \n259 260 273 259 273 272 260 261 274 \n260 274 273 261 262 275 261 275 274 \n262 263 276 262 276 275 263 264 277 \n263 277 276 264 265 278 264 278 277 \n265 266 279 265 279 278 266 267 280 \n266 280 279 20 268 21 20 21 0 \n268 269 23 268 23 21 269 270 25 \n269 25 23 270 271 27 270 27 25 \n271 272 29 271 29 27 272 273 31 \n272 31 29 273 274 33 273 33 31 \n274 275 35 274 35 33 275 276 37 \n275 37 35 276 277 39 276 39 37 \n277 278 41 277 41 39 278 279 43 \n278 43 41 279 280 45 279 45 43 \n45 281 282 283 45 283 284 46 46 \n284 285 286 46 286 287 59 59 287 \n288 289 59 289 290 72 72 290 291 \n292 72 292 293 85 85 293 294 295 \n85 295 296 98 98 296 297 298 98 \n298 299 111 111 299 300 301 111 301 \n302 124 124 302 303 304 124 304 305 \n137 137 305 306 307 137 307 308 150 \n150 308 309 310 150 310 311 163 163 \n311 312 313 163 313 314 176 176 314 \n315 316 176 316 317 189 189 317 318 \n319 189 319 320 202 202 320 321 322 \n202 322 323 215 215 323 324 325 215 \n325 326 228 228 326 327 328 228 328 \n329 241 241 329 330 331 241 331 332 \n254 254 332 333 334 254 334 335 267 \n267 335 336 337 267 337 338 280 280 \n338 339 340 280 340 281 45 341 342 \n343 343 342 344 344 342 345 345 342 \n346 346 342 347 347 342 348 348 342 \n349 349 342 350 350 342 351 351 342 \n352 352 342 353 353 342 354 354 342 \n355 355 342 356 356 342 357 357 342 \n358 358 342 359 359 342 360 360 342 \n361 361 342 341 362 363 364 362 364 \n365 363 366 367 363 367 364 366 368 \n369 366 369 367 368 370 371 368 371 \n369 370 372 373 370 373 371 372 374 \n375 372 375 373 374 376 377 374 377 \n375 376 378 379 376 379 377 378 380 \n381 378 381 379 380 382 383 380 383 \n381 382 384 385 382 385 383 384 386 \n387 384 387 385 386 341 343 386 343 \n387 365 364 388 365 388 389 364 367 \n390 364 390 388 367 369 391 367 391 \n390 369 371 392 369 392 391 371 373 \n393 371 393 392 373 375 394 373 394 \n393 375 377 395 375 395 394 377 379 \n396 377 396 395 379 381 397 379 397 \n396 381 383 398 381 398 397 383 385 \n399 383 399 398 385 387 400 385 400 \n399 387 343 344 387 344 400 389 388 \n401 389 401 402 388 390 403 388 403 \n401 390 391 404 390 404 403 391 392 \n405 391 405 404 392 393 406 392 406 \n405 393 394 407 393 407 406 394 395 \n408 394 408 407 395 396 409 395 409 \n408 396 397 410 396 410 409 397 398 \n411 397 411 410 398 399 412 398 412 \n411 399 400 413 399 413 412 400 344 \n345 400 345 413 402 401 414 402 414 \n415 401 403 416 401 416 414 403 404 \n417 403 417 416 404 405 418 404 418 \n417 405 406 419 405 419 418 406 407 \n420 406 420 419 407 408 421 407 421 \n420 408 409 422 408 422 421 409 410 \n423 409 423 422 410 411 424 410 424 \n423 411 412 425 411 425 424 412 413 \n426 412 426 425 413 345 346 413 346 \n426 415 414 427 415 427 428 414 416 \n429 414 429 427 416 417 430 416 430 \n429 417 418 431 417 431 430 418 419 \n432 418 432 431 419 420 433 419 433 \n432 420 421 434 420 434 433 421 422 \n435 421 435 434 422 423 436 422 436 \n435 423 424 437 423 437 436 424 425 \n438 424 438 437 425 426 439 425 439 \n438 426 346 347 426 347 439 428 427 \n440 428 440 441 427 429 442 427 442 \n440 429 430 443 429 443 442 430 431 \n444 430 444 443 431 432 445 431 445 \n444 432 433 446 432 446 445 433 434 \n447 433 447 446 434 435 448 434 448 \n447 435 436 449 435 449 448 436 437 \n450 436 450 449 437 438 451 437 451 \n450 438 439 452 438 452 451 439 347 \n348 439 348 452 441 440 453 441 453 \n454 440 442 455 440 455 453 442 443 \n456 442 456 455 443 444 457 443 457 \n456 444 445 458 444 458 457 445 446 \n459 445 459 458 446 447 460 446 460 \n459 447 448 461 447 461 460 448 449 \n462 448 462 461 449 450 463 449 463 \n462 450 451 464 450 464 463 451 452 \n465 451 465 464 452 348 349 452 349 \n465 454 453 466 454 466 467 453 455 \n468 453 468 466 455 456 469 455 469 \n468 456 457 470 456 470 469 457 458 \n471 457 471 470 458 459 472 458 472 \n471 459 460 473 459 473 472 460 461 \n474 460 474 473 461 462 475 461 475 \n474 462 463 476 462 476 475 463 464 \n477 463 477 476 464 465 478 464 478 \n477 465 349 350 465 350 478 467 466 \n479 467 479 480 466 468 481 466 481 \n479 468 469 482 468 482 481 469 470 \n483 469 483 482 470 471 484 470 484 \n483 471 472 485 471 485 484 472 473 \n486 472 486 485 473 474 487 473 487 \n486 474 475 488 474 488 487 475 476 \n489 475 489 488 476 477 490 476 490 \n489 477 478 491 477 491 490 478 350 \n351 478 351 491 480 479 492 480 492 \n493 479 481 494 479 494 492 481 482 \n495 481 495 494 482 483 496 482 496 \n495 483 484 497 483 497 496 484 485 \n498 484 498 497 485 486 499 485 499 \n498 486 487 500 486 500 499 487 488 \n501 487 501 500 488 489 502 488 502 \n501 489 490 503 489 503 502 490 491 \n504 490 504 503 491 351 352 491 352 \n504 493 492 505 493 505 506 492 494 \n507 492 507 505 494 495 508 494 508 \n507 495 496 509 495 509 508 496 497 \n510 496 510 509 497 498 511 497 511 \n510 498 499 512 498 512 511 499 500 \n513 499 513 512 500 501 514 500 514 \n513 501 502 515 501 515 514 502 503 \n516 502 516 515 503 504 517 503 517 \n516 504 352 353 504 353 517 506 505 \n518 506 518 519 505 507 520 505 520 \n518 507 508 521 507 521 520 508 509 \n522 508 522 521 509 510 523 509 523 \n522 510 511 524 510 524 523 511 512 \n525 511 525 524 512 513 526 512 526 \n525 513 514 527 513 527 526 514 515 \n528 514 528 527 515 516 529 515 529 \n528 516 517 530 516 530 529 517 353 \n354 517 354 530 519 518 531 519 531 \n532 518 520 533 518 533 531 520 521 \n534 520 534 533 521 522 535 521 535 \n534 522 523 536 522 536 535 523 524 \n537 523 537 536 524 525 538 524 538 \n537 525 526 539 525 539 538 526 527 \n540 526 540 539 527 528 541 527 541 \n540 528 529 542 528 542 541 529 530 \n543 529 543 542 530 354 355 530 355 \n543 532 531 544 532 544 545 531 533 \n546 531 546 544 533 534 547 533 547 \n546 534 535 548 534 548 547 535 536 \n549 535 549 548 536 537 550 536 550 \n549 537 538 551 537 551 550 538 539 \n552 538 552 551 539 540 553 539 553 \n552 540 541 554 540 554 553 541 542 \n555 541 555 554 542 543 556 542 556 \n555 543 355 356 543 356 556 545 544 \n557 545 557 558 544 546 559 544 559 \n557 546 547 560 546 560 559 547 548 \n561 547 561 560 548 549 562 548 562 \n561 549 550 563 549 563 562 550 551 \n564 550 564 563 551 552 565 551 565 \n564 552 553 566 552 566 565 553 554 \n567 553 567 566 554 555 568 554 568 \n567 555 556 569 555 569 568 556 356 \n357 556 357 569 558 557 570 558 570 \n571 557 559 572 557 572 570 559 560 \n573 559 573 572 560 561 574 560 574 \n573 561 562 575 561 575 574 562 563 \n576 562 576 575 563 564 577 563 577 \n576 564 565 578 564 578 577 565 566 \n579 565 579 578 566 567 580 566 580 \n579 567 568 581 567 581 580 568 569 \n582 568 582 581 569 357 358 569 358 \n582 571 570 583 571 583 584 570 572 \n585 570 585 583 572 573 586 572 586 \n585 573 574 587 573 587 586 574 575 \n588 574 588 587 575 576 589 575 589 \n588 576 577 590 576 590 589 577 578 \n591 577 591 590 578 579 592 578 592 \n591 579 580 593 579 593 592 580 581 \n594 580 594 593 581 582 595 581 595 \n594 582 358 359 582 359 595 584 583 \n596 584 596 597 583 585 598 583 598 \n596 585 586 599 585 599 598 586 587 \n600 586 600 599 587 588 601 587 601 \n600 588 589 602 588 602 601 589 590 \n603 589 603 602 590 591 604 590 604 \n603 591 592 605 591 605 604 592 593 \n606 592 606 605 593 594 607 593 607 \n606 594 595 608 594 608 607 595 359 \n360 595 360 608 597 596 609 597 609 \n610 596 598 611 596 611 609 598 599 \n612 598 612 611 599 600 613 599 613 \n612 600 601 614 600 614 613 601 602 \n615 601 615 614 602 603 616 602 616 \n615 603 604 617 603 617 616 604 605 \n618 604 618 617 605 606 619 605 619 \n618 606 607 620 606 620 619 607 608 \n621 607 621 620 608 360 361 608 361 \n621 610 609 363 610 363 362 609 611 \n366 609 366 363 611 612 368 611 368 \n366 612 613 370 612 370 368 613 614 \n372 613 372 370 614 615 374 614 374 \n372 615 616 376 615 376 374 616 617 \n378 616 378 376 617 618 380 617 380 \n378 618 619 382 618 382 380 619 620 \n384 619 384 382 620 621 386 620 386 \n384 621 361 341 621 341 386 362 365 \n282 281 365 284 283 282 365 389 285 \n284 389 287 286 285 389 402 288 287 \n402 290 289 288 402 415 291 290 415 \n293 292 291 415 428 294 293 428 296 \n295 294 428 441 297 296 441 299 298 \n297 441 454 300 299 454 302 301 300 \n454 467 303 302 467 305 304 303 467 \n480 306 305 480 308 307 306 480 493 \n309 308 493 311 310 309 493 506 312 \n311 506 314 313 312 506 519 315 314 \n519 317 316 315 519 532 318 317 532 \n320 319 318 532 545 321 320 545 323 \n322 321 545 558 324 323 558 326 325 \n324 558 571 327 326 571 329 328 327 \n571 584 330 329 584 332 331 330 584 \n597 333 332 597 335 334 333 597 610 \n336 335 610 338 337 336 610 362 339 \n338 362 281 340 339 \n"
  },
  {
    "path": "testing/data/branched3.vtk",
    "content": "# vtk DataFile Version 5.1\nvtk output\nASCII\nDATASET POLYDATA\nPOINTS 882 double\n0.36786195636 0 0.33864077926 0.41858324409 0 0.27347406745 0.39809632301 0.12934933603 0.27347406745 \n0.34985750914 0.11367559433 0.33864077926 0.45788666606 0 0.20084771514 0.43547609448 0.14149476588 0.20084771514 \n0.48470014334 0 0.1227427423 0.4609772265 0.14978057146 0.1227427423 0.49829223752 0 0.041289672256 \n0.47390407324 0.15398077667 0.041289672256 0.49829223752 0 -0.041289672256 0.47390407324 0.15398077667 -0.041289672256 \n0.48470014334 0 -0.1227427423 0.4609772265 0.14978057146 -0.1227427423 0.45788666606 0 -0.20084771514 \n0.43547609448 0.14149476588 -0.20084771514 0.41858324409 0 -0.27347406745 0.39809632301 0.12934933603 -0.27347406745 \n0.36786195636 0 -0.33864077926 0.34985750914 0.11367559433 -0.33864077926 0.33864095807 0.24603705108 0.27347406745 \n0.29760658741 0.21622383595 0.33864077926 0.37043809891 0.26913902164 0.20084771514 0.39213064313 0.2848995924 0.1227427423 \n0.40312689543 0.29288882017 0.041289672256 0.40312689543 0.29288882017 -0.041289672256 0.39213064313 0.2848995924 -0.1227427423 \n0.37043809891 0.26913902164 -0.20084771514 0.33864095807 0.24603705108 -0.27347406745 0.29760658741 0.21622383595 -0.33864077926 \n0.24603705108 0.33864095807 0.27347406745 0.21622383595 0.29760658741 0.33864077926 0.26913902164 0.37043809891 0.20084771514 \n0.2848995924 0.39213064313 0.1227427423 0.29288882017 0.40312689543 0.041289672256 0.29288882017 0.40312689543 -0.041289672256 \n0.2848995924 0.39213064313 -0.1227427423 0.26913902164 0.37043809891 -0.20084771514 0.24603705108 0.33864095807 -0.27347406745 \n0.21622383595 0.29760658741 -0.33864077926 0.12934933603 0.39809632301 0.27347406745 0.11367559433 0.34985750914 0.33864077926 \n0.14149476588 0.43547609448 0.20084771514 0.14978057146 0.4609772265 0.1227427423 0.15398077667 0.47390407324 0.041289672256 \n0.15398077667 0.47390407324 -0.041289672256 0.14978057146 0.4609772265 -0.1227427423 0.14149476588 0.43547609448 -0.20084771514 \n0.12934933603 0.39809632301 -0.27347406745 0.11367559433 0.34985750914 -0.33864077926 2.5630831518e-17 0.41858324409 0.27347406745 \n2.2525047905e-17 0.36786195636 0.33864077926 2.8037472151e-17 0.45788666606 0.20084771514 2.9679323096e-17 0.48470014334 0.1227427423 \n3.0511599142e-17 0.49829223752 0.041289672256 3.0511599142e-17 0.49829223752 -0.041289672256 2.9679323096e-17 0.48470014334 -0.1227427423 \n2.8037472151e-17 0.45788666606 -0.20084771514 2.5630831518e-17 0.41858324409 -0.27347406745 2.2525047905e-17 0.36786195636 -0.33864077926 \n-0.12934933603 0.39809632301 0.27347406745 -0.11367559433 0.34985750914 0.33864077926 -0.14149476588 0.43547609448 0.20084771514 \n-0.14978057146 0.4609772265 0.1227427423 -0.15398077667 0.47390407324 0.041289672256 -0.15398077667 0.47390407324 -0.041289672256 \n-0.14978057146 0.4609772265 -0.1227427423 -0.14149476588 0.43547609448 -0.20084771514 -0.12934933603 0.39809632301 -0.27347406745 \n-0.11367559433 0.34985750914 -0.33864077926 -0.24603705108 0.33864095807 0.27347406745 -0.21622383595 0.29760658741 0.33864077926 \n-0.26913902164 0.37043809891 0.20084771514 -0.2848995924 0.39213064313 0.1227427423 -0.29288882017 0.40312689543 0.041289672256 \n-0.29288882017 0.40312689543 -0.041289672256 -0.2848995924 0.39213064313 -0.1227427423 -0.26913902164 0.37043809891 -0.20084771514 \n-0.24603705108 0.33864095807 -0.27347406745 -0.21622383595 0.29760658741 -0.33864077926 -0.33864095807 0.24603705108 0.27347406745 \n-0.29760658741 0.21622383595 0.33864077926 -0.37043809891 0.26913902164 0.20084771514 -0.39213064313 0.2848995924 0.1227427423 \n-0.40312689543 0.29288882017 0.041289672256 -0.40312689543 0.29288882017 -0.041289672256 -0.39213064313 0.2848995924 -0.1227427423 \n-0.37043809891 0.26913902164 -0.20084771514 -0.33864095807 0.24603705108 -0.27347406745 -0.29760658741 0.21622383595 -0.33864077926 \n-0.39809632301 0.12934933603 0.27347406745 -0.34985750914 0.11367559433 0.33864077926 -0.43547609448 0.14149476588 0.20084771514 \n-0.4609772265 0.14978057146 0.1227427423 -0.47390407324 0.15398077667 0.041289672256 -0.47390407324 0.15398077667 -0.041289672256 \n-0.4609772265 0.14978057146 -0.1227427423 -0.43547609448 0.14149476588 -0.20084771514 -0.39809632301 0.12934933603 -0.27347406745 \n-0.34985750914 0.11367559433 -0.33864077926 -0.41858324409 5.1261663035e-17 0.27347406745 -0.36786195636 4.5050095809e-17 0.33864077926 \n-0.45788666606 5.6074944302e-17 0.20084771514 -0.48470014334 5.9358646193e-17 0.1227427423 -0.49829223752 6.1023198283e-17 0.041289672256 \n-0.49829223752 6.1023198283e-17 -0.041289672256 -0.48470014334 5.9358646193e-17 -0.1227427423 -0.45788666606 5.6074944302e-17 -0.20084771514 \n-0.41858324409 5.1261663035e-17 -0.27347406745 -0.36786195636 4.5050095809e-17 -0.33864077926 -0.39809632301 -0.12934933603 0.27347406745 \n-0.34985750914 -0.11367559433 0.33864077926 -0.43547609448 -0.14149476588 0.20084771514 -0.4609772265 -0.14978057146 0.1227427423 \n-0.47390407324 -0.15398077667 0.041289672256 -0.47390407324 -0.15398077667 -0.041289672256 -0.4609772265 -0.14978057146 -0.1227427423 \n-0.43547609448 -0.14149476588 -0.20084771514 -0.39809632301 -0.12934933603 -0.27347406745 -0.34985750914 -0.11367559433 -0.33864077926 \n-0.33864095807 -0.24603705108 0.27347406745 -0.29760658741 -0.21622383595 0.33864077926 -0.37043809891 -0.26913902164 0.20084771514 \n-0.39213064313 -0.2848995924 0.1227427423 -0.40312689543 -0.29288882017 0.041289672256 -0.40312689543 -0.29288882017 -0.041289672256 \n-0.39213064313 -0.2848995924 -0.1227427423 -0.37043809891 -0.26913902164 -0.20084771514 -0.33864095807 -0.24603705108 -0.27347406745 \n-0.29760658741 -0.21622383595 -0.33864077926 -0.24603705108 -0.33864095807 0.27347406745 -0.21622383595 -0.29760658741 0.33864077926 \n-0.26913902164 -0.37043809891 0.20084771514 -0.2848995924 -0.39213064313 0.1227427423 -0.29288882017 -0.40312689543 0.041289672256 \n-0.29288882017 -0.40312689543 -0.041289672256 -0.2848995924 -0.39213064313 -0.1227427423 -0.26913902164 -0.37043809891 -0.20084771514 \n-0.24603705108 -0.33864095807 -0.27347406745 -0.21622383595 -0.29760658741 -0.33864077926 -0.12934933603 -0.39809632301 0.27347406745 \n-0.11367559433 -0.34985750914 0.33864077926 -0.14149476588 -0.43547609448 0.20084771514 -0.14978057146 -0.4609772265 0.1227427423 \n-0.15398077667 -0.47390407324 0.041289672256 -0.15398077667 -0.47390407324 -0.041289672256 -0.14978057146 -0.4609772265 -0.1227427423 \n-0.14149476588 -0.43547609448 -0.20084771514 -0.12934933603 -0.39809632301 -0.27347406745 -0.11367559433 -0.34985750914 -0.33864077926 \n-7.6892492899e-17 -0.41858324409 0.27347406745 -6.7575143714e-17 -0.36786195636 0.33864077926 -8.4112416453e-17 -0.45788666606 0.20084771514 \n-8.9037972598e-17 -0.48470014334 0.1227427423 -9.1534800733e-17 -0.49829223752 0.041289672256 -9.1534800733e-17 -0.49829223752 -0.041289672256 \n-8.9037972598e-17 -0.48470014334 -0.1227427423 -8.4112416453e-17 -0.45788666606 -0.20084771514 -7.6892492899e-17 -0.41858324409 -0.27347406745 \n-6.7575143714e-17 -0.36786195636 -0.33864077926 0.12934933603 -0.39809632301 0.27347406745 0.11367559433 -0.34985750914 0.33864077926 \n0.14149476588 -0.43547609448 0.20084771514 0.14978057146 -0.4609772265 0.1227427423 0.15398077667 -0.47390407324 0.041289672256 \n0.15398077667 -0.47390407324 -0.041289672256 0.14978057146 -0.4609772265 -0.1227427423 0.14149476588 -0.43547609448 -0.20084771514 \n0.12934933603 -0.39809632301 -0.27347406745 0.11367559433 -0.34985750914 -0.33864077926 0.24603705108 -0.33864095807 0.27347406745 \n0.21622383595 -0.29760658741 0.33864077926 0.26913902164 -0.37043809891 0.20084771514 0.2848995924 -0.39213064313 0.1227427423 \n0.29288882017 -0.40312689543 0.041289672256 0.29288882017 -0.40312689543 -0.041289672256 0.2848995924 -0.39213064313 -0.1227427423 \n0.26913902164 -0.37043809891 -0.20084771514 0.24603705108 -0.33864095807 -0.27347406745 0.21622383595 -0.29760658741 -0.33864077926 \n0.33864095807 -0.24603705108 0.27347406745 0.29760658741 -0.21622383595 0.33864077926 0.37043809891 -0.26913902164 0.20084771514 \n0.39213064313 -0.2848995924 0.1227427423 0.40312689543 -0.29288882017 0.041289672256 0.40312689543 -0.29288882017 -0.041289672256 \n0.39213064313 -0.2848995924 -0.1227427423 0.37043809891 -0.26913902164 -0.20084771514 0.33864095807 -0.24603705108 -0.27347406745 \n0.29760658741 -0.21622383595 -0.33864077926 0.39809632301 -0.12934933603 0.27347406745 0.34985750914 -0.11367559433 0.33864077926 \n0.43547609448 -0.14149476588 0.20084771514 0.4609772265 -0.14978057146 0.1227427423 0.47390407324 -0.15398077667 0.041289672256 \n0.47390407324 -0.15398077667 -0.041289672256 0.4609772265 -0.14978057146 -0.1227427423 0.43547609448 -0.14149476588 -0.20084771514 \n0.39809632301 -0.12934933603 -0.27347406745 0.34985750914 -0.11367559433 -0.33864077926 0.3283653157 -6.2943287406e-18 -0.375 \n0.32206539101 0.039776188896 -0.37500000495 0.3185939096 0.061694295065 -0.37500000495 0.31229398784 0.10147046551 -0.375 \n0.29401088955 0.13735306593 -0.37499999486 0.28393623568 0.15712568057 -0.37499999486 0.26565312857 0.1930082983 -0.375 \n0.23717652463 0.22148490223 -0.375 0.22148490223 0.23717652463 -0.375 0.1930082983 0.26565312857 -0.375 \n0.15712568057 0.28393623568 -0.37500000514 0.13735306593 0.29401088955 -0.37500000514 0.10147046551 0.31229398784 -0.375 \n0.061694295065 0.3185939096 -0.37499999505 0.039776188896 0.32206539101 -0.37499999505 2.5828452418e-17 0.3283653157 -0.375 \n-0.039776188896 0.32206539101 -0.37500000495 -0.061694295065 0.3185939096 -0.37500000495 -0.10147046551 0.31229398784 -0.375 \n-0.13735306593 0.29401088955 -0.37499999486 -0.15712568057 0.28393623568 -0.37499999486 -0.1930082983 0.26565312857 -0.375 \n-0.22148490223 0.23717652463 -0.375 -0.23717652463 0.22148490223 -0.375 -0.26565312857 0.1930082983 -0.375 \n-0.28393623568 0.15712568057 -0.37500000514 -0.29401088955 0.13735306593 -0.37500000514 -0.31229398784 0.10147046551 -0.375 \n-0.3185939096 0.061694295065 -0.37499999505 -0.32206539101 0.039776188896 -0.37499999505 -0.3283653157 4.1448352812e-17 -0.375 \n-0.32206539101 -0.039776188896 -0.37500000495 -0.3185939096 -0.061694295065 -0.37500000495 -0.31229398784 -0.10147046551 -0.375 \n-0.29401088955 -0.13735306593 -0.37499999486 -0.28393623568 -0.15712568057 -0.37499999486 -0.26565312857 -0.1930082983 -0.375 \n-0.23717652463 -0.22148490223 -0.375 -0.22148490223 -0.23717652463 -0.375 -0.1930082983 -0.26565312857 -0.375 \n-0.15712568057 -0.28393623568 -0.37500000514 -0.13735306593 -0.29401088955 -0.37500000514 -0.10147046551 -0.31229398784 -0.375 \n-0.061694295065 -0.3185939096 -0.37499999505 -0.039776188896 -0.32206539101 -0.37499999505 -6.1641014888e-17 -0.3283653157 -0.375 \n0.039776188896 -0.32206539101 -0.37500000495 0.061694295065 -0.3185939096 -0.37500000495 0.10147046551 -0.31229398784 -0.375 \n0.13735306593 -0.29401088955 -0.37499999486 0.15712568057 -0.28393623568 -0.37499999486 0.1930082983 -0.26565312857 -0.375 \n0.22148490223 -0.23717652463 -0.375 0.23717652463 -0.22148490223 -0.375 0.26565312857 -0.1930082983 -0.375 \n0.28393623568 -0.15712568057 -0.37500000514 0.29401088955 -0.13735306593 -0.37500000514 0.31229398784 -0.10147046551 -0.375 \n0.3185939096 -0.061694295065 -0.37499999505 0.32206539101 -0.039776188896 -0.37499999505 0.082297295332 0 -1.2431806326 \n0 0 -1.25 0.078269377351 0.025431262329 -1.2431806326 0.066579908133 0.048373136669 -1.2431806326 \n0.048373136669 0.066579908133 -1.2431806326 0.025431262329 0.078269377351 -1.2431806326 5.0392558428e-18 0.082297295332 -1.2431806326 \n-0.025431262329 0.078269377351 -1.2431806326 -0.048373136669 0.066579908133 -1.2431806326 -0.066579908133 0.048373136669 -1.2431806326 \n-0.078269377351 0.025431262329 -1.2431806326 -0.082297295332 1.0078511686e-17 -1.2431806326 -0.078269377351 -0.025431262329 -1.2431806326 \n-0.066579908133 -0.048373136669 -1.2431806326 -0.048373136669 -0.066579908133 -1.2431806326 -0.025431262329 -0.078269377351 -1.2431806326 \n-1.5117767942e-17 -0.082297295332 -1.2431806326 0.025431262329 -0.078269377351 -1.2431806326 0.048373136669 -0.066579908133 -1.2431806326 \n0.066579908133 -0.048373136669 -1.2431806326 0.078269377351 -0.025431262329 -1.2431806326 0.36786195636 0 -0.41135922074 \n0.41858324409 0 -0.47652593255 0.39809632301 0.12934933603 -0.47652593255 0.34985750914 0.11367559433 -0.41135922074 \n0.45788666606 0 -0.54915231466 0.43547609448 0.14149476588 -0.54915231466 0.48470014334 0 -0.6272572279 \n0.4609772265 0.14978057146 -0.6272572279 0.49829223752 0 -0.70871031284 0.47390407324 0.15398077667 -0.70871031284 \n0.49829223752 0 -0.79128968716 0.47390407324 0.15398077667 -0.79128968716 0.48470014334 0 -0.8727427721 \n0.4609772265 0.14978057146 -0.8727427721 0.45788666606 0 -0.95084768534 0.43547609448 0.14149476588 -0.95084768534 \n0.41858324409 0 -1.0234740973 0.39809632301 0.12934933603 -1.0234740973 0.36786195636 0 -1.0886408091 \n0.34985750914 0.11367559433 -1.0886408091 0.30710634589 0 -1.1445702314 0.29207551479 0.0949010849 -1.1445702314 \n0.23797369003 0 -1.1897368431 0.2263264358 0.073537915945 -1.1897368431 0.16234973073 0 -1.2229086161 \n0.15440377593 0.050168827176 -1.2229086161 0.33864095807 0.24603705108 -0.47652593255 0.29760658741 0.21622383595 -0.41135922074 \n0.37043809891 0.26913902164 -0.54915231466 0.39213064313 0.2848995924 -0.6272572279 0.40312689543 0.29288882017 -0.70871031284 \n0.40312689543 0.29288882017 -0.79128968716 0.39213064313 0.2848995924 -0.8727427721 0.37043809891 0.26913902164 -0.95084768534 \n0.33864095807 0.24603705108 -1.0234740973 0.29760658741 0.21622383595 -1.0886408091 0.24845425785 0.1805125922 -1.1445702314 \n0.19252476096 0.13987742364 -1.1897368431 0.13134369254 0.095426782966 -1.2229086161 0.24603705108 0.33864095807 -0.47652593255 \n0.21622383595 0.29760658741 -0.41135922074 0.26913902164 0.37043809891 -0.54915231466 0.2848995924 0.39213064313 -0.6272572279 \n0.29288882017 0.40312689543 -0.70871031284 0.29288882017 0.40312689543 -0.79128968716 0.2848995924 0.39213064313 -0.8727427721 \n0.26913902164 0.37043809891 -0.95084768534 0.24603705108 0.33864095807 -1.0234740973 0.21622383595 0.29760658741 -1.0886408091 \n0.1805125922 0.24845425785 -1.1445702314 0.13987742364 0.19252476096 -1.1897368431 0.095426782966 0.13134369254 -1.2229086161 \n0.12934933603 0.39809632301 -0.47652593255 0.11367559433 0.34985750914 -0.41135922074 0.14149476588 0.43547609448 -0.54915231466 \n0.14978057146 0.4609772265 -0.6272572279 0.15398077667 0.47390407324 -0.70871031284 0.15398077667 0.47390407324 -0.79128968716 \n0.14978057146 0.4609772265 -0.8727427721 0.14149476588 0.43547609448 -0.95084768534 0.12934933603 0.39809632301 -1.0234740973 \n0.11367559433 0.34985750914 -1.0886408091 0.0949010849 0.29207551479 -1.1445702314 0.073537915945 0.2263264358 -1.1897368431 \n0.050168827176 0.15440377593 -1.2229086161 2.5630831518e-17 0.41858324409 -0.47652593255 2.2525047905e-17 0.36786195636 -0.41135922074 \n2.8037472151e-17 0.45788666606 -0.54915231466 2.9679323096e-17 0.48470014334 -0.6272572279 3.0511599142e-17 0.49829223752 -0.70871031284 \n3.0511599142e-17 0.49829223752 -0.79128968716 2.9679323096e-17 0.48470014334 -0.8727427721 2.8037472151e-17 0.45788666606 -0.95084768534 \n2.5630831518e-17 0.41858324409 -1.0234740973 2.2525047905e-17 0.36786195636 -1.0886408091 1.880484115e-17 0.30710634589 -1.1445702314 \n1.4571686463e-17 0.23797369003 -1.1897368431 9.9410541201e-18 0.16234973073 -1.2229086161 -0.12934933603 0.39809632301 -0.47652593255 \n-0.11367559433 0.34985750914 -0.41135922074 -0.14149476588 0.43547609448 -0.54915231466 -0.14978057146 0.4609772265 -0.6272572279 \n-0.15398077667 0.47390407324 -0.70871031284 -0.15398077667 0.47390407324 -0.79128968716 -0.14978057146 0.4609772265 -0.8727427721 \n-0.14149476588 0.43547609448 -0.95084768534 -0.12934933603 0.39809632301 -1.0234740973 -0.11367559433 0.34985750914 -1.0886408091 \n-0.0949010849 0.29207551479 -1.1445702314 -0.073537915945 0.2263264358 -1.1897368431 -0.050168827176 0.15440377593 -1.2229086161 \n-0.24603705108 0.33864095807 -0.47652593255 -0.21622383595 0.29760658741 -0.41135922074 -0.26913902164 0.37043809891 -0.54915231466 \n-0.2848995924 0.39213064313 -0.6272572279 -0.29288882017 0.40312689543 -0.70871031284 -0.29288882017 0.40312689543 -0.79128968716 \n-0.2848995924 0.39213064313 -0.8727427721 -0.26913902164 0.37043809891 -0.95084768534 -0.24603705108 0.33864095807 -1.0234740973 \n-0.21622383595 0.29760658741 -1.0886408091 -0.1805125922 0.24845425785 -1.1445702314 -0.13987742364 0.19252476096 -1.1897368431 \n-0.095426782966 0.13134369254 -1.2229086161 -0.33864095807 0.24603705108 -0.47652593255 -0.29760658741 0.21622383595 -0.41135922074 \n-0.37043809891 0.26913902164 -0.54915231466 -0.39213064313 0.2848995924 -0.6272572279 -0.40312689543 0.29288882017 -0.70871031284 \n-0.40312689543 0.29288882017 -0.79128968716 -0.39213064313 0.2848995924 -0.8727427721 -0.37043809891 0.26913902164 -0.95084768534 \n-0.33864095807 0.24603705108 -1.0234740973 -0.29760658741 0.21622383595 -1.0886408091 -0.24845425785 0.1805125922 -1.1445702314 \n-0.19252476096 0.13987742364 -1.1897368431 -0.13134369254 0.095426782966 -1.2229086161 -0.39809632301 0.12934933603 -0.47652593255 \n-0.34985750914 0.11367559433 -0.41135922074 -0.43547609448 0.14149476588 -0.54915231466 -0.4609772265 0.14978057146 -0.6272572279 \n-0.47390407324 0.15398077667 -0.70871031284 -0.47390407324 0.15398077667 -0.79128968716 -0.4609772265 0.14978057146 -0.8727427721 \n-0.43547609448 0.14149476588 -0.95084768534 -0.39809632301 0.12934933603 -1.0234740973 -0.34985750914 0.11367559433 -1.0886408091 \n-0.29207551479 0.0949010849 -1.1445702314 -0.2263264358 0.073537915945 -1.1897368431 -0.15440377593 0.050168827176 -1.2229086161 \n-0.41858324409 5.1261663035e-17 -0.47652593255 -0.36786195636 4.5050095809e-17 -0.41135922074 -0.45788666606 5.6074944302e-17 -0.54915231466 \n-0.48470014334 5.9358646193e-17 -0.6272572279 -0.49829223752 6.1023198283e-17 -0.70871031284 -0.49829223752 6.1023198283e-17 -0.79128968716 \n-0.48470014334 5.9358646193e-17 -0.8727427721 -0.45788666606 5.6074944302e-17 -0.95084768534 -0.41858324409 5.1261663035e-17 -1.0234740973 \n-0.36786195636 4.5050095809e-17 -1.0886408091 -0.30710634589 3.76096823e-17 -1.1445702314 -0.23797369003 2.9143372925e-17 -1.1897368431 \n-0.16234973073 1.988210824e-17 -1.2229086161 -0.39809632301 -0.12934933603 -0.47652593255 -0.34985750914 -0.11367559433 -0.41135922074 \n-0.43547609448 -0.14149476588 -0.54915231466 -0.4609772265 -0.14978057146 -0.6272572279 -0.47390407324 -0.15398077667 -0.70871031284 \n-0.47390407324 -0.15398077667 -0.79128968716 -0.4609772265 -0.14978057146 -0.8727427721 -0.43547609448 -0.14149476588 -0.95084768534 \n-0.39809632301 -0.12934933603 -1.0234740973 -0.34985750914 -0.11367559433 -1.0886408091 -0.29207551479 -0.0949010849 -1.1445702314 \n-0.2263264358 -0.073537915945 -1.1897368431 -0.15440377593 -0.050168827176 -1.2229086161 -0.33864095807 -0.24603705108 -0.47652593255 \n-0.29760658741 -0.21622383595 -0.41135922074 -0.37043809891 -0.26913902164 -0.54915231466 -0.39213064313 -0.2848995924 -0.6272572279 \n-0.40312689543 -0.29288882017 -0.70871031284 -0.40312689543 -0.29288882017 -0.79128968716 -0.39213064313 -0.2848995924 -0.8727427721 \n-0.37043809891 -0.26913902164 -0.95084768534 -0.33864095807 -0.24603705108 -1.0234740973 -0.29760658741 -0.21622383595 -1.0886408091 \n-0.24845425785 -0.1805125922 -1.1445702314 -0.19252476096 -0.13987742364 -1.1897368431 -0.13134369254 -0.095426782966 -1.2229086161 \n-0.24603705108 -0.33864095807 -0.47652593255 -0.21622383595 -0.29760658741 -0.41135922074 -0.26913902164 -0.37043809891 -0.54915231466 \n-0.2848995924 -0.39213064313 -0.6272572279 -0.29288882017 -0.40312689543 -0.70871031284 -0.29288882017 -0.40312689543 -0.79128968716 \n-0.2848995924 -0.39213064313 -0.8727427721 -0.26913902164 -0.37043809891 -0.95084768534 -0.24603705108 -0.33864095807 -1.0234740973 \n-0.21622383595 -0.29760658741 -1.0886408091 -0.1805125922 -0.24845425785 -1.1445702314 -0.13987742364 -0.19252476096 -1.1897368431 \n-0.095426782966 -0.13134369254 -1.2229086161 -0.12934933603 -0.39809632301 -0.47652593255 -0.11367559433 -0.34985750914 -0.41135922074 \n-0.14149476588 -0.43547609448 -0.54915231466 -0.14978057146 -0.4609772265 -0.6272572279 -0.15398077667 -0.47390407324 -0.70871031284 \n-0.15398077667 -0.47390407324 -0.79128968716 -0.14978057146 -0.4609772265 -0.8727427721 -0.14149476588 -0.43547609448 -0.95084768534 \n-0.12934933603 -0.39809632301 -1.0234740973 -0.11367559433 -0.34985750914 -1.0886408091 -0.0949010849 -0.29207551479 -1.1445702314 \n-0.073537915945 -0.2263264358 -1.1897368431 -0.050168827176 -0.15440377593 -1.2229086161 -7.6892492899e-17 -0.41858324409 -0.47652593255 \n-6.7575143714e-17 -0.36786195636 -0.41135922074 -8.4112416453e-17 -0.45788666606 -0.54915231466 -8.9037972598e-17 -0.48470014334 -0.6272572279 \n-9.1534800733e-17 -0.49829223752 -0.70871031284 -9.1534800733e-17 -0.49829223752 -0.79128968716 -8.9037972598e-17 -0.48470014334 -0.8727427721 \n-8.4112416453e-17 -0.45788666606 -0.95084768534 -7.6892492899e-17 -0.41858324409 -1.0234740973 -6.7575143714e-17 -0.36786195636 -1.0886408091 \n-5.6414525104e-17 -0.30710634589 -1.1445702314 -4.3715059388e-17 -0.23797369003 -1.1897368431 -2.9823163188e-17 -0.16234973073 -1.2229086161 \n0.12934933603 -0.39809632301 -0.47652593255 0.11367559433 -0.34985750914 -0.41135922074 0.14149476588 -0.43547609448 -0.54915231466 \n0.14978057146 -0.4609772265 -0.6272572279 0.15398077667 -0.47390407324 -0.70871031284 0.15398077667 -0.47390407324 -0.79128968716 \n0.14978057146 -0.4609772265 -0.8727427721 0.14149476588 -0.43547609448 -0.95084768534 0.12934933603 -0.39809632301 -1.0234740973 \n0.11367559433 -0.34985750914 -1.0886408091 0.0949010849 -0.29207551479 -1.1445702314 0.073537915945 -0.2263264358 -1.1897368431 \n0.050168827176 -0.15440377593 -1.2229086161 0.24603705108 -0.33864095807 -0.47652593255 0.21622383595 -0.29760658741 -0.41135922074 \n0.26913902164 -0.37043809891 -0.54915231466 0.2848995924 -0.39213064313 -0.6272572279 0.29288882017 -0.40312689543 -0.70871031284 \n0.29288882017 -0.40312689543 -0.79128968716 0.2848995924 -0.39213064313 -0.8727427721 0.26913902164 -0.37043809891 -0.95084768534 \n0.24603705108 -0.33864095807 -1.0234740973 0.21622383595 -0.29760658741 -1.0886408091 0.1805125922 -0.24845425785 -1.1445702314 \n0.13987742364 -0.19252476096 -1.1897368431 0.095426782966 -0.13134369254 -1.2229086161 0.33864095807 -0.24603705108 -0.47652593255 \n0.29760658741 -0.21622383595 -0.41135922074 0.37043809891 -0.26913902164 -0.54915231466 0.39213064313 -0.2848995924 -0.6272572279 \n0.40312689543 -0.29288882017 -0.70871031284 0.40312689543 -0.29288882017 -0.79128968716 0.39213064313 -0.2848995924 -0.8727427721 \n0.37043809891 -0.26913902164 -0.95084768534 0.33864095807 -0.24603705108 -1.0234740973 0.29760658741 -0.21622383595 -1.0886408091 \n0.24845425785 -0.1805125922 -1.1445702314 0.19252476096 -0.13987742364 -1.1897368431 0.13134369254 -0.095426782966 -1.2229086161 \n0.39809632301 -0.12934933603 -0.47652593255 0.34985750914 -0.11367559433 -0.41135922074 0.43547609448 -0.14149476588 -0.54915231466 \n0.4609772265 -0.14978057146 -0.6272572279 0.47390407324 -0.15398077667 -0.70871031284 0.47390407324 -0.15398077667 -0.79128968716 \n0.4609772265 -0.14978057146 -0.8727427721 0.43547609448 -0.14149476588 -0.95084768534 0.39809632301 -0.12934933603 -1.0234740973 \n0.34985750914 -0.11367559433 -1.0886408091 0.29207551479 -0.0949010849 -1.1445702314 0.2263264358 -0.073537915945 -1.1897368431 \n0.15440377593 -0.050168827176 -1.2229086161 0.32206539101 0.039776188896 0.37499999505 0.3283653157 6.2943287406e-18 0.375 \n0.31229398784 0.10147046551 0.375 0.3185939096 0.061694295065 0.37499999505 0.29401088955 0.13735306593 0.37500000514 \n0.26565312857 0.1930082983 0.375 0.28393623568 0.15712568057 0.37500000514 0.23717652463 0.22148490223 0.375 \n0.1930082983 0.26565312857 0.375 0.22148490223 0.23717652463 0.375 0.15712568057 0.28393623568 0.37499999486 \n0.10147046551 0.31229398784 0.375 0.13735306593 0.29401088955 0.37499999486 0.061694295065 0.3185939096 0.37500000495 \n1.779775782e-17 0.3283653157 0.375 0.039776188896 0.32206539101 0.37500000495 -0.039776188896 0.32206539101 0.37499999505 \n-0.10147046551 0.31229398784 0.375 -0.061694295065 0.3185939096 0.37499999505 -0.13735306593 0.29401088955 0.37500000514 \n-0.1930082983 0.26565312857 0.375 -0.15712568057 0.28393623568 0.37500000514 -0.22148490223 0.23717652463 0.375 \n-0.26565312857 0.1930082983 0.375 -0.23717652463 0.22148490223 0.375 -0.28393623568 0.15712568057 0.37499999486 \n-0.31229398784 0.10147046551 0.375 -0.29401088955 0.13735306593 0.37499999486 -0.3185939096 0.061694295065 0.37500000495 \n-0.3283653157 3.7802275371e-17 0.375 -0.32206539101 0.039776188896 0.37500000495 -0.32206539101 -0.039776188896 0.37499999505 \n-0.31229398784 -0.10147046551 0.375 -0.3185939096 -0.061694295065 0.37499999505 -0.29401088955 -0.13735306593 0.37500000514 \n-0.26565312857 -0.1930082983 0.375 -0.28393623568 -0.15712568057 0.37500000514 -0.23717652463 -0.22148490223 0.375 \n-0.1930082983 -0.26565312857 0.375 -0.22148490223 -0.23717652463 0.375 -0.15712568057 -0.28393623568 0.37499999486 \n-0.10147046551 -0.31229398784 0.375 -0.13735306593 -0.29401088955 0.37499999486 -0.061694295065 -0.3185939096 0.37500000495 \n-5.7734190001e-17 -0.3283653157 0.375 -0.039776188896 -0.32206539101 0.37500000495 0.039776188896 -0.32206539101 0.37499999505 \n0.10147046551 -0.31229398784 0.375 0.061694295065 -0.3185939096 0.37499999505 0.13735306593 -0.29401088955 0.37500000514 \n0.1930082983 -0.26565312857 0.375 0.15712568057 -0.28393623568 0.37500000514 0.22148490223 -0.23717652463 0.375 \n0.26565312857 -0.1930082983 0.375 0.23717652463 -0.22148490223 0.375 0.28393623568 -0.15712568057 0.37499999486 \n0.31229398784 -0.10147046551 0.375 0.29401088955 -0.13735306593 0.37499999486 0.3185939096 -0.061694295065 0.37500000495 \n0.32206539101 -0.039776188896 0.37500000495 0.082297295332 0 1.2431806326 0.078269377351 0.025431262329 1.2431806326 \n0 0 1.25 0.066579908133 0.048373136669 1.2431806326 0.048373136669 0.066579908133 1.2431806326 \n0.025431262329 0.078269377351 1.2431806326 5.0392558428e-18 0.082297295332 1.2431806326 -0.025431262329 0.078269377351 1.2431806326 \n-0.048373136669 0.066579908133 1.2431806326 -0.066579908133 0.048373136669 1.2431806326 -0.078269377351 0.025431262329 1.2431806326 \n-0.082297295332 1.0078511686e-17 1.2431806326 -0.078269377351 -0.025431262329 1.2431806326 -0.066579908133 -0.048373136669 1.2431806326 \n-0.048373136669 -0.066579908133 1.2431806326 -0.025431262329 -0.078269377351 1.2431806326 -1.5117767942e-17 -0.082297295332 1.2431806326 \n0.025431262329 -0.078269377351 1.2431806326 0.048373136669 -0.066579908133 1.2431806326 0.066579908133 -0.048373136669 1.2431806326 \n0.078269377351 -0.025431262329 1.2431806326 0.16234973073 0 1.2229086161 0.15440377593 0.050168827176 1.2229086161 \n0.23797369003 0 1.1897368431 0.2263264358 0.073537915945 1.1897368431 0.30710634589 0 1.1445702314 \n0.29207551479 0.0949010849 1.1445702314 0.36786195636 0 1.0886408091 0.34985750914 0.11367559433 1.0886408091 \n0.41858324409 0 1.0234740973 0.39809632301 0.12934933603 1.0234740973 0.45788666606 0 0.95084768534 \n0.43547609448 0.14149476588 0.95084768534 0.48470014334 0 0.8727427721 0.4609772265 0.14978057146 0.8727427721 \n0.49829223752 0 0.79128968716 0.47390407324 0.15398077667 0.79128968716 0.49829223752 0 0.70871031284 \n0.47390407324 0.15398077667 0.70871031284 0.48470014334 0 0.6272572279 0.4609772265 0.14978057146 0.6272572279 \n0.45788666606 0 0.54915231466 0.43547609448 0.14149476588 0.54915231466 0.41858324409 0 0.47652593255 \n0.39809632301 0.12934933603 0.47652593255 0.36786195636 0 0.41135922074 0.34985750914 0.11367559433 0.41135922074 \n0.13134369254 0.095426782966 1.2229086161 0.19252476096 0.13987742364 1.1897368431 0.24845425785 0.1805125922 1.1445702314 \n0.29760658741 0.21622383595 1.0886408091 0.33864095807 0.24603705108 1.0234740973 0.37043809891 0.26913902164 0.95084768534 \n0.39213064313 0.2848995924 0.8727427721 0.40312689543 0.29288882017 0.79128968716 0.40312689543 0.29288882017 0.70871031284 \n0.39213064313 0.2848995924 0.6272572279 0.37043809891 0.26913902164 0.54915231466 0.33864095807 0.24603705108 0.47652593255 \n0.29760658741 0.21622383595 0.41135922074 0.095426782966 0.13134369254 1.2229086161 0.13987742364 0.19252476096 1.1897368431 \n0.1805125922 0.24845425785 1.1445702314 0.21622383595 0.29760658741 1.0886408091 0.24603705108 0.33864095807 1.0234740973 \n0.26913902164 0.37043809891 0.95084768534 0.2848995924 0.39213064313 0.8727427721 0.29288882017 0.40312689543 0.79128968716 \n0.29288882017 0.40312689543 0.70871031284 0.2848995924 0.39213064313 0.6272572279 0.26913902164 0.37043809891 0.54915231466 \n0.24603705108 0.33864095807 0.47652593255 0.21622383595 0.29760658741 0.41135922074 0.050168827176 0.15440377593 1.2229086161 \n0.073537915945 0.2263264358 1.1897368431 0.0949010849 0.29207551479 1.1445702314 0.11367559433 0.34985750914 1.0886408091 \n0.12934933603 0.39809632301 1.0234740973 0.14149476588 0.43547609448 0.95084768534 0.14978057146 0.4609772265 0.8727427721 \n0.15398077667 0.47390407324 0.79128968716 0.15398077667 0.47390407324 0.70871031284 0.14978057146 0.4609772265 0.6272572279 \n0.14149476588 0.43547609448 0.54915231466 0.12934933603 0.39809632301 0.47652593255 0.11367559433 0.34985750914 0.41135922074 \n9.9410541201e-18 0.16234973073 1.2229086161 1.4571686463e-17 0.23797369003 1.1897368431 1.880484115e-17 0.30710634589 1.1445702314 \n2.2525047905e-17 0.36786195636 1.0886408091 2.5630831518e-17 0.41858324409 1.0234740973 2.8037472151e-17 0.45788666606 0.95084768534 \n2.9679323096e-17 0.48470014334 0.8727427721 3.0511599142e-17 0.49829223752 0.79128968716 3.0511599142e-17 0.49829223752 0.70871031284 \n2.9679323096e-17 0.48470014334 0.6272572279 2.8037472151e-17 0.45788666606 0.54915231466 2.5630831518e-17 0.41858324409 0.47652593255 \n2.2525047905e-17 0.36786195636 0.41135922074 -0.050168827176 0.15440377593 1.2229086161 -0.073537915945 0.2263264358 1.1897368431 \n-0.0949010849 0.29207551479 1.1445702314 -0.11367559433 0.34985750914 1.0886408091 -0.12934933603 0.39809632301 1.0234740973 \n-0.14149476588 0.43547609448 0.95084768534 -0.14978057146 0.4609772265 0.8727427721 -0.15398077667 0.47390407324 0.79128968716 \n-0.15398077667 0.47390407324 0.70871031284 -0.14978057146 0.4609772265 0.6272572279 -0.14149476588 0.43547609448 0.54915231466 \n-0.12934933603 0.39809632301 0.47652593255 -0.11367559433 0.34985750914 0.41135922074 -0.095426782966 0.13134369254 1.2229086161 \n-0.13987742364 0.19252476096 1.1897368431 -0.1805125922 0.24845425785 1.1445702314 -0.21622383595 0.29760658741 1.0886408091 \n-0.24603705108 0.33864095807 1.0234740973 -0.26913902164 0.37043809891 0.95084768534 -0.2848995924 0.39213064313 0.8727427721 \n-0.29288882017 0.40312689543 0.79128968716 -0.29288882017 0.40312689543 0.70871031284 -0.2848995924 0.39213064313 0.6272572279 \n-0.26913902164 0.37043809891 0.54915231466 -0.24603705108 0.33864095807 0.47652593255 -0.21622383595 0.29760658741 0.41135922074 \n-0.13134369254 0.095426782966 1.2229086161 -0.19252476096 0.13987742364 1.1897368431 -0.24845425785 0.1805125922 1.1445702314 \n-0.29760658741 0.21622383595 1.0886408091 -0.33864095807 0.24603705108 1.0234740973 -0.37043809891 0.26913902164 0.95084768534 \n-0.39213064313 0.2848995924 0.8727427721 -0.40312689543 0.29288882017 0.79128968716 -0.40312689543 0.29288882017 0.70871031284 \n-0.39213064313 0.2848995924 0.6272572279 -0.37043809891 0.26913902164 0.54915231466 -0.33864095807 0.24603705108 0.47652593255 \n-0.29760658741 0.21622383595 0.41135922074 -0.15440377593 0.050168827176 1.2229086161 -0.2263264358 0.073537915945 1.1897368431 \n-0.29207551479 0.0949010849 1.1445702314 -0.34985750914 0.11367559433 1.0886408091 -0.39809632301 0.12934933603 1.0234740973 \n-0.43547609448 0.14149476588 0.95084768534 -0.4609772265 0.14978057146 0.8727427721 -0.47390407324 0.15398077667 0.79128968716 \n-0.47390407324 0.15398077667 0.70871031284 -0.4609772265 0.14978057146 0.6272572279 -0.43547609448 0.14149476588 0.54915231466 \n-0.39809632301 0.12934933603 0.47652593255 -0.34985750914 0.11367559433 0.41135922074 -0.16234973073 1.988210824e-17 1.2229086161 \n-0.23797369003 2.9143372925e-17 1.1897368431 -0.30710634589 3.76096823e-17 1.1445702314 -0.36786195636 4.5050095809e-17 1.0886408091 \n-0.41858324409 5.1261663035e-17 1.0234740973 -0.45788666606 5.6074944302e-17 0.95084768534 -0.48470014334 5.9358646193e-17 0.8727427721 \n-0.49829223752 6.1023198283e-17 0.79128968716 -0.49829223752 6.1023198283e-17 0.70871031284 -0.48470014334 5.9358646193e-17 0.6272572279 \n-0.45788666606 5.6074944302e-17 0.54915231466 -0.41858324409 5.1261663035e-17 0.47652593255 -0.36786195636 4.5050095809e-17 0.41135922074 \n-0.15440377593 -0.050168827176 1.2229086161 -0.2263264358 -0.073537915945 1.1897368431 -0.29207551479 -0.0949010849 1.1445702314 \n-0.34985750914 -0.11367559433 1.0886408091 -0.39809632301 -0.12934933603 1.0234740973 -0.43547609448 -0.14149476588 0.95084768534 \n-0.4609772265 -0.14978057146 0.8727427721 -0.47390407324 -0.15398077667 0.79128968716 -0.47390407324 -0.15398077667 0.70871031284 \n-0.4609772265 -0.14978057146 0.6272572279 -0.43547609448 -0.14149476588 0.54915231466 -0.39809632301 -0.12934933603 0.47652593255 \n-0.34985750914 -0.11367559433 0.41135922074 -0.13134369254 -0.095426782966 1.2229086161 -0.19252476096 -0.13987742364 1.1897368431 \n-0.24845425785 -0.1805125922 1.1445702314 -0.29760658741 -0.21622383595 1.0886408091 -0.33864095807 -0.24603705108 1.0234740973 \n-0.37043809891 -0.26913902164 0.95084768534 -0.39213064313 -0.2848995924 0.8727427721 -0.40312689543 -0.29288882017 0.79128968716 \n-0.40312689543 -0.29288882017 0.70871031284 -0.39213064313 -0.2848995924 0.6272572279 -0.37043809891 -0.26913902164 0.54915231466 \n-0.33864095807 -0.24603705108 0.47652593255 -0.29760658741 -0.21622383595 0.41135922074 -0.095426782966 -0.13134369254 1.2229086161 \n-0.13987742364 -0.19252476096 1.1897368431 -0.1805125922 -0.24845425785 1.1445702314 -0.21622383595 -0.29760658741 1.0886408091 \n-0.24603705108 -0.33864095807 1.0234740973 -0.26913902164 -0.37043809891 0.95084768534 -0.2848995924 -0.39213064313 0.8727427721 \n-0.29288882017 -0.40312689543 0.79128968716 -0.29288882017 -0.40312689543 0.70871031284 -0.2848995924 -0.39213064313 0.6272572279 \n-0.26913902164 -0.37043809891 0.54915231466 -0.24603705108 -0.33864095807 0.47652593255 -0.21622383595 -0.29760658741 0.41135922074 \n-0.050168827176 -0.15440377593 1.2229086161 -0.073537915945 -0.2263264358 1.1897368431 -0.0949010849 -0.29207551479 1.1445702314 \n-0.11367559433 -0.34985750914 1.0886408091 -0.12934933603 -0.39809632301 1.0234740973 -0.14149476588 -0.43547609448 0.95084768534 \n-0.14978057146 -0.4609772265 0.8727427721 -0.15398077667 -0.47390407324 0.79128968716 -0.15398077667 -0.47390407324 0.70871031284 \n-0.14978057146 -0.4609772265 0.6272572279 -0.14149476588 -0.43547609448 0.54915231466 -0.12934933603 -0.39809632301 0.47652593255 \n-0.11367559433 -0.34985750914 0.41135922074 -2.9823163188e-17 -0.16234973073 1.2229086161 -4.3715059388e-17 -0.23797369003 1.1897368431 \n-5.6414525104e-17 -0.30710634589 1.1445702314 -6.7575143714e-17 -0.36786195636 1.0886408091 -7.6892492899e-17 -0.41858324409 1.0234740973 \n-8.4112416453e-17 -0.45788666606 0.95084768534 -8.9037972598e-17 -0.48470014334 0.8727427721 -9.1534800733e-17 -0.49829223752 0.79128968716 \n-9.1534800733e-17 -0.49829223752 0.70871031284 -8.9037972598e-17 -0.48470014334 0.6272572279 -8.4112416453e-17 -0.45788666606 0.54915231466 \n-7.6892492899e-17 -0.41858324409 0.47652593255 -6.7575143714e-17 -0.36786195636 0.41135922074 0.050168827176 -0.15440377593 1.2229086161 \n0.073537915945 -0.2263264358 1.1897368431 0.0949010849 -0.29207551479 1.1445702314 0.11367559433 -0.34985750914 1.0886408091 \n0.12934933603 -0.39809632301 1.0234740973 0.14149476588 -0.43547609448 0.95084768534 0.14978057146 -0.4609772265 0.8727427721 \n0.15398077667 -0.47390407324 0.79128968716 0.15398077667 -0.47390407324 0.70871031284 0.14978057146 -0.4609772265 0.6272572279 \n0.14149476588 -0.43547609448 0.54915231466 0.12934933603 -0.39809632301 0.47652593255 0.11367559433 -0.34985750914 0.41135922074 \n0.095426782966 -0.13134369254 1.2229086161 0.13987742364 -0.19252476096 1.1897368431 0.1805125922 -0.24845425785 1.1445702314 \n0.21622383595 -0.29760658741 1.0886408091 0.24603705108 -0.33864095807 1.0234740973 0.26913902164 -0.37043809891 0.95084768534 \n0.2848995924 -0.39213064313 0.8727427721 0.29288882017 -0.40312689543 0.79128968716 0.29288882017 -0.40312689543 0.70871031284 \n0.2848995924 -0.39213064313 0.6272572279 0.26913902164 -0.37043809891 0.54915231466 0.24603705108 -0.33864095807 0.47652593255 \n0.21622383595 -0.29760658741 0.41135922074 0.13134369254 -0.095426782966 1.2229086161 0.19252476096 -0.13987742364 1.1897368431 \n0.24845425785 -0.1805125922 1.1445702314 0.29760658741 -0.21622383595 1.0886408091 0.33864095807 -0.24603705108 1.0234740973 \n0.37043809891 -0.26913902164 0.95084768534 0.39213064313 -0.2848995924 0.8727427721 0.40312689543 -0.29288882017 0.79128968716 \n0.40312689543 -0.29288882017 0.70871031284 0.39213064313 -0.2848995924 0.6272572279 0.37043809891 -0.26913902164 0.54915231466 \n0.33864095807 -0.24603705108 0.47652593255 0.29760658741 -0.21622383595 0.41135922074 0.15440377593 -0.050168827176 1.2229086161 \n0.2263264358 -0.073537915945 1.1897368431 0.29207551479 -0.0949010849 1.1445702314 0.34985750914 -0.11367559433 1.0886408091 \n0.39809632301 -0.12934933603 1.0234740973 0.43547609448 -0.14149476588 0.95084768534 0.4609772265 -0.14978057146 0.8727427721 \n0.47390407324 -0.15398077667 0.79128968716 0.47390407324 -0.15398077667 0.70871031284 0.4609772265 -0.14978057146 0.6272572279 \n0.43547609448 -0.14149476588 0.54915231466 0.39809632301 -0.12934933603 0.47652593255 0.34985750914 -0.11367559433 0.41135922074 \n\nPOLYGONS 1601 4960\nOFFSETS vtktypeint64\n0 3 6 9 12 15 18 21 24 \n27 30 33 36 39 42 45 48 51 \n54 57 60 63 66 69 72 75 78 \n81 84 87 90 93 96 99 102 105 \n108 111 114 117 120 123 126 129 132 \n135 138 141 144 147 150 153 156 159 \n162 165 168 171 174 177 180 183 186 \n189 192 195 198 201 204 207 210 213 \n216 219 222 225 228 231 234 237 240 \n243 246 249 252 255 258 261 264 267 \n270 273 276 279 282 285 288 291 294 \n297 300 303 306 309 312 315 318 321 \n324 327 330 333 336 339 342 345 348 \n351 354 357 360 363 366 369 372 375 \n378 381 384 387 390 393 396 399 402 \n405 408 411 414 417 420 423 426 429 \n432 435 438 441 444 447 450 453 456 \n459 462 465 468 471 474 477 480 483 \n486 489 492 495 498 501 504 507 510 \n513 516 519 522 525 528 531 534 537 \n540 543 546 549 552 555 558 561 564 \n567 570 573 576 579 582 585 588 591 \n594 597 600 603 606 609 612 615 618 \n621 624 627 630 633 636 639 642 645 \n648 651 654 657 660 663 666 669 672 \n675 678 681 684 687 690 693 696 699 \n702 705 708 711 714 717 720 723 726 \n729 732 735 738 741 744 747 750 753 \n756 759 762 765 768 771 774 777 780 \n783 786 789 792 795 798 801 804 807 \n810 813 816 819 822 825 828 831 834 \n837 840 843 846 849 852 855 858 861 \n864 867 870 873 876 879 882 885 888 \n891 894 897 900 903 906 909 912 915 \n918 921 924 927 930 933 936 939 942 \n945 948 951 954 957 960 963 966 969 \n972 975 978 981 984 987 990 993 996 \n999 1002 1005 1008 1011 1014 1017 1020 1023 \n1026 1029 1032 1035 1038 1041 1044 1047 1050 \n1053 1056 1059 1062 1065 1068 1071 1074 1077 \n1080 1084 1088 1092 1096 1100 1104 1108 1112 \n1116 1120 1124 1128 1132 1136 1140 1144 1148 \n1152 1156 1160 1164 1168 1172 1176 1180 1184 \n1188 1192 1196 1200 1204 1208 1212 1216 1220 \n1224 1228 1232 1236 1240 1243 1246 1249 1252 \n1255 1258 1261 1264 1267 1270 1273 1276 1279 \n1282 1285 1288 1291 1294 1297 1300 1303 1306 \n1309 1312 1315 1318 1321 1324 1327 1330 1333 \n1336 1339 1342 1345 1348 1351 1354 1357 1360 \n1363 1366 1369 1372 1375 1378 1381 1384 1387 \n1390 1393 1396 1399 1402 1405 1408 1411 1414 \n1417 1420 1423 1426 1429 1432 1435 1438 1441 \n1444 1447 1450 1453 1456 1459 1462 1465 1468 \n1471 1474 1477 1480 1483 1486 1489 1492 1495 \n1498 1501 1504 1507 1510 1513 1516 1519 1522 \n1525 1528 1531 1534 1537 1540 1543 1546 1549 \n1552 1555 1558 1561 1564 1567 1570 1573 1576 \n1579 1582 1585 1588 1591 1594 1597 1600 1603 \n1606 1609 1612 1615 1618 1621 1624 1627 1630 \n1633 1636 1639 1642 1645 1648 1651 1654 1657 \n1660 1663 1666 1669 1672 1675 1678 1681 1684 \n1687 1690 1693 1696 1699 1702 1705 1708 1711 \n1714 1717 1720 1723 1726 1729 1732 1735 1738 \n1741 1744 1747 1750 1753 1756 1759 1762 1765 \n1768 1771 1774 1777 1780 1783 1786 1789 1792 \n1795 1798 1801 1804 1807 1810 1813 1816 1819 \n1822 1825 1828 1831 1834 1837 1840 1843 1846 \n1849 1852 1855 1858 1861 1864 1867 1870 1873 \n1876 1879 1882 1885 1888 1891 1894 1897 1900 \n1903 1906 1909 1912 1915 1918 1921 1924 1927 \n1930 1933 1936 1939 1942 1945 1948 1951 1954 \n1957 1960 1963 1966 1969 1972 1975 1978 1981 \n1984 1987 1990 1993 1996 1999 2002 2005 2008 \n2011 2014 2017 2020 2023 2026 2029 2032 2035 \n2038 2041 2044 2047 2050 2053 2056 2059 2062 \n2065 2068 2071 2074 2077 2080 2083 2086 2089 \n2092 2095 2098 2101 2104 2107 2110 2113 2116 \n2119 2122 2125 2128 2131 2134 2137 2140 2143 \n2146 2149 2152 2155 2158 2161 2164 2167 2170 \n2173 2176 2179 2182 2185 2188 2191 2194 2197 \n2200 2203 2206 2209 2212 2215 2218 2221 2224 \n2227 2230 2233 2236 2239 2242 2245 2248 2251 \n2254 2257 2260 2263 2266 2269 2272 2275 2278 \n2281 2284 2287 2290 2293 2296 2299 2302 2305 \n2308 2311 2314 2317 2320 2323 2326 2329 2332 \n2335 2338 2341 2344 2347 2350 2353 2356 2359 \n2362 2365 2368 2371 2374 2377 2380 2383 2386 \n2389 2392 2395 2398 2401 2404 2407 2410 2413 \n2416 2419 2422 2425 2428 2431 2434 2437 2440 \n2443 2446 2449 2452 2455 2458 2461 2464 2467 \n2470 2473 2476 2479 2482 2485 2488 2491 2494 \n2497 2500 2503 2506 2509 2512 2515 2518 2521 \n2524 2527 2530 2533 2536 2539 2542 2545 2548 \n2551 2554 2557 2560 2563 2566 2569 2572 2575 \n2578 2581 2584 2587 2590 2593 2596 2599 2602 \n2605 2608 2611 2614 2617 2620 2623 2626 2629 \n2632 2635 2638 2641 2644 2647 2650 2653 2656 \n2659 2662 2665 2668 2671 2674 2677 2680 2683 \n2686 2689 2692 2695 2698 2701 2704 2707 2710 \n2713 2716 2719 2722 2725 2728 2731 2734 2737 \n2740 2743 2746 2749 2752 2755 2758 2761 2764 \n2767 2770 2773 2776 2779 2782 2785 2788 2791 \n2794 2797 2800 2803 2806 2809 2812 2815 2818 \n2821 2824 2827 2830 2833 2836 2839 2842 2845 \n2848 2851 2854 2857 2860 2864 2868 2872 2876 \n2880 2884 2888 2892 2896 2900 2904 2908 2912 \n2916 2920 2924 2928 2932 2936 2940 2944 2948 \n2952 2956 2960 2964 2968 2972 2976 2980 2984 \n2988 2992 2996 3000 3004 3008 3012 3016 3020 \n3024 3028 3032 3036 3040 3044 3048 3052 3056 \n3060 3064 3068 3072 3076 3080 3084 3088 3092 \n3096 3100 3104 3108 3112 3116 3120 3124 3128 \n3132 3136 3140 3144 3148 3152 3156 3160 3164 \n3168 3172 3176 3180 3183 3186 3189 3192 3195 \n3198 3201 3204 3207 3210 3213 3216 3219 3222 \n3225 3228 3231 3234 3237 3240 3243 3246 3249 \n3252 3255 3258 3261 3264 3267 3270 3273 3276 \n3279 3282 3285 3288 3291 3294 3297 3300 3303 \n3306 3309 3312 3315 3318 3321 3324 3327 3330 \n3333 3336 3339 3342 3345 3348 3351 3354 3357 \n3360 3363 3366 3369 3372 3375 3378 3381 3384 \n3387 3390 3393 3396 3399 3402 3405 3408 3411 \n3414 3417 3420 3423 3426 3429 3432 3435 3438 \n3441 3444 3447 3450 3453 3456 3459 3462 3465 \n3468 3471 3474 3477 3480 3483 3486 3489 3492 \n3495 3498 3501 3504 3507 3510 3513 3516 3519 \n3522 3525 3528 3531 3534 3537 3540 3543 3546 \n3549 3552 3555 3558 3561 3564 3567 3570 3573 \n3576 3579 3582 3585 3588 3591 3594 3597 3600 \n3603 3606 3609 3612 3615 3618 3621 3624 3627 \n3630 3633 3636 3639 3642 3645 3648 3651 3654 \n3657 3660 3663 3666 3669 3672 3675 3678 3681 \n3684 3687 3690 3693 3696 3699 3702 3705 3708 \n3711 3714 3717 3720 3723 3726 3729 3732 3735 \n3738 3741 3744 3747 3750 3753 3756 3759 3762 \n3765 3768 3771 3774 3777 3780 3783 3786 3789 \n3792 3795 3798 3801 3804 3807 3810 3813 3816 \n3819 3822 3825 3828 3831 3834 3837 3840 3843 \n3846 3849 3852 3855 3858 3861 3864 3867 3870 \n3873 3876 3879 3882 3885 3888 3891 3894 3897 \n3900 3903 3906 3909 3912 3915 3918 3921 3924 \n3927 3930 3933 3936 3939 3942 3945 3948 3951 \n3954 3957 3960 3963 3966 3969 3972 3975 3978 \n3981 3984 3987 3990 3993 3996 3999 4002 4005 \n4008 4011 4014 4017 4020 4023 4026 4029 4032 \n4035 4038 4041 4044 4047 4050 4053 4056 4059 \n4062 4065 4068 4071 4074 4077 4080 4083 4086 \n4089 4092 4095 4098 4101 4104 4107 4110 4113 \n4116 4119 4122 4125 4128 4131 4134 4137 4140 \n4143 4146 4149 4152 4155 4158 4161 4164 4167 \n4170 4173 4176 4179 4182 4185 4188 4191 4194 \n4197 4200 4203 4206 4209 4212 4215 4218 4221 \n4224 4227 4230 4233 4236 4239 4242 4245 4248 \n4251 4254 4257 4260 4263 4266 4269 4272 4275 \n4278 4281 4284 4287 4290 4293 4296 4299 4302 \n4305 4308 4311 4314 4317 4320 4323 4326 4329 \n4332 4335 4338 4341 4344 4347 4350 4353 4356 \n4359 4362 4365 4368 4371 4374 4377 4380 4383 \n4386 4389 4392 4395 4398 4401 4404 4407 4410 \n4413 4416 4419 4422 4425 4428 4431 4434 4437 \n4440 4443 4446 4449 4452 4455 4458 4461 4464 \n4467 4470 4473 4476 4479 4482 4485 4488 4491 \n4494 4497 4500 4503 4506 4509 4512 4515 4518 \n4521 4524 4527 4530 4533 4536 4539 4542 4545 \n4548 4551 4554 4557 4560 4563 4566 4569 4572 \n4575 4578 4581 4584 4587 4590 4593 4596 4599 \n4602 4605 4608 4611 4614 4617 4620 4623 4626 \n4629 4632 4635 4638 4641 4644 4647 4650 4653 \n4656 4659 4662 4665 4668 4671 4674 4677 4680 \n4683 4686 4689 4692 4695 4698 4701 4704 4707 \n4710 4713 4716 4719 4722 4725 4728 4731 4734 \n4737 4740 4743 4746 4749 4752 4755 4758 4761 \n4764 4767 4770 4773 4776 4779 4782 4785 4788 \n4791 4794 4797 4800 4804 4808 4812 4816 4820 \n4824 4828 4832 4836 4840 4844 4848 4852 4856 \n4860 4864 4868 4872 4876 4880 4884 4888 4892 \n4896 4900 4904 4908 4912 4916 4920 4924 4928 \n4932 4936 4940 4944 4948 4952 4956 4960 \nCONNECTIVITY vtktypeint64\n0 1 2 0 2 3 1 4 5 \n1 5 2 4 6 7 4 7 5 \n6 8 9 6 9 7 8 10 11 \n8 11 9 10 12 13 10 13 11 \n12 14 15 12 15 13 14 16 17 \n14 17 15 16 18 19 16 19 17 \n3 2 20 3 20 21 2 5 22 \n2 22 20 5 7 23 5 23 22 \n7 9 24 7 24 23 9 11 25 \n9 25 24 11 13 26 11 26 25 \n13 15 27 13 27 26 15 17 28 \n15 28 27 17 19 29 17 29 28 \n21 20 30 21 30 31 20 22 32 \n20 32 30 22 23 33 22 33 32 \n23 24 34 23 34 33 24 25 35 \n24 35 34 25 26 36 25 36 35 \n26 27 37 26 37 36 27 28 38 \n27 38 37 28 29 39 28 39 38 \n31 30 40 31 40 41 30 32 42 \n30 42 40 32 33 43 32 43 42 \n33 34 44 33 44 43 34 35 45 \n34 45 44 35 36 46 35 46 45 \n36 37 47 36 47 46 37 38 48 \n37 48 47 38 39 49 38 49 48 \n41 40 50 41 50 51 40 42 52 \n40 52 50 42 43 53 42 53 52 \n43 44 54 43 54 53 44 45 55 \n44 55 54 45 46 56 45 56 55 \n46 47 57 46 57 56 47 48 58 \n47 58 57 48 49 59 48 59 58 \n51 50 60 51 60 61 50 52 62 \n50 62 60 52 53 63 52 63 62 \n53 54 64 53 64 63 54 55 65 \n54 65 64 55 56 66 55 66 65 \n56 57 67 56 67 66 57 58 68 \n57 68 67 58 59 69 58 69 68 \n61 60 70 61 70 71 60 62 72 \n60 72 70 62 63 73 62 73 72 \n63 64 74 63 74 73 64 65 75 \n64 75 74 65 66 76 65 76 75 \n66 67 77 66 77 76 67 68 78 \n67 78 77 68 69 79 68 79 78 \n71 70 80 71 80 81 70 72 82 \n70 82 80 72 73 83 72 83 82 \n73 74 84 73 84 83 74 75 85 \n74 85 84 75 76 86 75 86 85 \n76 77 87 76 87 86 77 78 88 \n77 88 87 78 79 89 78 89 88 \n81 80 90 81 90 91 80 82 92 \n80 92 90 82 83 93 82 93 92 \n83 84 94 83 94 93 84 85 95 \n84 95 94 85 86 96 85 96 95 \n86 87 97 86 97 96 87 88 98 \n87 98 97 88 89 99 88 99 98 \n91 90 100 91 100 101 90 92 102 \n90 102 100 92 93 103 92 103 102 \n93 94 104 93 104 103 94 95 105 \n94 105 104 95 96 106 95 106 105 \n96 97 107 96 107 106 97 98 108 \n97 108 107 98 99 109 98 109 108 \n101 100 110 101 110 111 100 102 112 \n100 112 110 102 103 113 102 113 112 \n103 104 114 103 114 113 104 105 115 \n104 115 114 105 106 116 105 116 115 \n106 107 117 106 117 116 107 108 118 \n107 118 117 108 109 119 108 119 118 \n111 110 120 111 120 121 110 112 122 \n110 122 120 112 113 123 112 123 122 \n113 114 124 113 124 123 114 115 125 \n114 125 124 115 116 126 115 126 125 \n116 117 127 116 127 126 117 118 128 \n117 128 127 118 119 129 118 129 128 \n121 120 130 121 130 131 120 122 132 \n120 132 130 122 123 133 122 133 132 \n123 124 134 123 134 133 124 125 135 \n124 135 134 125 126 136 125 136 135 \n126 127 137 126 137 136 127 128 138 \n127 138 137 128 129 139 128 139 138 \n131 130 140 131 140 141 130 132 142 \n130 142 140 132 133 143 132 143 142 \n133 134 144 133 144 143 134 135 145 \n134 145 144 135 136 146 135 146 145 \n136 137 147 136 147 146 137 138 148 \n137 148 147 138 139 149 138 149 148 \n141 140 150 141 150 151 140 142 152 \n140 152 150 142 143 153 142 153 152 \n143 144 154 143 154 153 144 145 155 \n144 155 154 145 146 156 145 156 155 \n146 147 157 146 157 156 147 148 158 \n147 158 157 148 149 159 148 159 158 \n151 150 160 151 160 161 150 152 162 \n150 162 160 152 153 163 152 163 162 \n153 154 164 153 164 163 154 155 165 \n154 165 164 155 156 166 155 166 165 \n156 157 167 156 167 166 157 158 168 \n157 168 167 158 159 169 158 169 168 \n161 160 170 161 170 171 160 162 172 \n160 172 170 162 163 173 162 173 172 \n163 164 174 163 174 173 164 165 175 \n164 175 174 165 166 176 165 176 175 \n166 167 177 166 177 176 167 168 178 \n167 178 177 168 169 179 168 179 178 \n171 170 180 171 180 181 170 172 182 \n170 182 180 172 173 183 172 183 182 \n173 174 184 173 184 183 174 175 185 \n174 185 184 175 176 186 175 186 185 \n176 177 187 176 187 186 177 178 188 \n177 188 187 178 179 189 178 189 188 \n181 180 190 181 190 191 180 182 192 \n180 192 190 182 183 193 182 193 192 \n183 184 194 183 194 193 184 185 195 \n184 195 194 185 186 196 185 196 195 \n186 187 197 186 197 196 187 188 198 \n187 198 197 188 189 199 188 199 198 \n191 190 1 191 1 0 190 192 4 \n190 4 1 192 193 6 192 6 4 \n193 194 8 193 8 6 194 195 10 \n194 10 8 195 196 12 195 12 10 \n196 197 14 196 14 12 197 198 16 \n197 16 14 198 199 18 198 18 16 \n18 200 201 202 18 202 203 19 19 \n203 204 205 19 205 206 29 29 206 \n207 208 29 208 209 39 39 209 210 \n211 39 211 212 49 49 212 213 214 \n49 214 215 59 59 215 216 217 59 \n217 218 69 69 218 219 220 69 220 \n221 79 79 221 222 223 79 223 224 \n89 89 224 225 226 89 226 227 99 \n99 227 228 229 99 229 230 109 109 \n230 231 232 109 232 233 119 119 233 \n234 235 119 235 236 129 129 236 237 \n238 129 238 239 139 139 239 240 241 \n139 241 242 149 149 242 243 244 149 \n244 245 159 159 245 246 247 159 247 \n248 169 169 248 249 250 169 250 251 \n179 179 251 252 253 179 253 254 189 \n189 254 255 256 189 256 257 199 199 \n257 258 259 199 259 200 18 260 261 \n262 262 261 263 263 261 264 264 261 \n265 265 261 266 266 261 267 267 261 \n268 268 261 269 269 261 270 270 261 \n271 271 261 272 272 261 273 273 261 \n274 274 261 275 275 261 276 276 261 \n277 277 261 278 278 261 279 279 261 \n280 280 261 260 281 282 283 281 283 \n284 282 285 286 282 286 283 285 287 \n288 285 288 286 287 289 290 287 290 \n288 289 291 292 289 292 290 291 293 \n294 291 294 292 293 295 296 293 296 \n294 295 297 298 295 298 296 297 299 \n300 297 300 298 299 301 302 299 302 \n300 301 303 304 301 304 302 303 305 \n306 303 306 304 305 260 262 305 262 \n306 284 283 307 284 307 308 283 286 \n309 283 309 307 286 288 310 286 310 \n309 288 290 311 288 311 310 290 292 \n312 290 312 311 292 294 313 292 313 \n312 294 296 314 294 314 313 296 298 \n315 296 315 314 298 300 316 298 316 \n315 300 302 317 300 317 316 302 304 \n318 302 318 317 304 306 319 304 319 \n318 306 262 263 306 263 319 308 307 \n320 308 320 321 307 309 322 307 322 \n320 309 310 323 309 323 322 310 311 \n324 310 324 323 311 312 325 311 325 \n324 312 313 326 312 326 325 313 314 \n327 313 327 326 314 315 328 314 328 \n327 315 316 329 315 329 328 316 317 \n330 316 330 329 317 318 331 317 331 \n330 318 319 332 318 332 331 319 263 \n264 319 264 332 321 320 333 321 333 \n334 320 322 335 320 335 333 322 323 \n336 322 336 335 323 324 337 323 337 \n336 324 325 338 324 338 337 325 326 \n339 325 339 338 326 327 340 326 340 \n339 327 328 341 327 341 340 328 329 \n342 328 342 341 329 330 343 329 343 \n342 330 331 344 330 344 343 331 332 \n345 331 345 344 332 264 265 332 265 \n345 334 333 346 334 346 347 333 335 \n348 333 348 346 335 336 349 335 349 \n348 336 337 350 336 350 349 337 338 \n351 337 351 350 338 339 352 338 352 \n351 339 340 353 339 353 352 340 341 \n354 340 354 353 341 342 355 341 355 \n354 342 343 356 342 356 355 343 344 \n357 343 357 356 344 345 358 344 358 \n357 345 265 266 345 266 358 347 346 \n359 347 359 360 346 348 361 346 361 \n359 348 349 362 348 362 361 349 350 \n363 349 363 362 350 351 364 350 364 \n363 351 352 365 351 365 364 352 353 \n366 352 366 365 353 354 367 353 367 \n366 354 355 368 354 368 367 355 356 \n369 355 369 368 356 357 370 356 370 \n369 357 358 371 357 371 370 358 266 \n267 358 267 371 360 359 372 360 372 \n373 359 361 374 359 374 372 361 362 \n375 361 375 374 362 363 376 362 376 \n375 363 364 377 363 377 376 364 365 \n378 364 378 377 365 366 379 365 379 \n378 366 367 380 366 380 379 367 368 \n381 367 381 380 368 369 382 368 382 \n381 369 370 383 369 383 382 370 371 \n384 370 384 383 371 267 268 371 268 \n384 373 372 385 373 385 386 372 374 \n387 372 387 385 374 375 388 374 388 \n387 375 376 389 375 389 388 376 377 \n390 376 390 389 377 378 391 377 391 \n390 378 379 392 378 392 391 379 380 \n393 379 393 392 380 381 394 380 394 \n393 381 382 395 381 395 394 382 383 \n396 382 396 395 383 384 397 383 397 \n396 384 268 269 384 269 397 386 385 \n398 386 398 399 385 387 400 385 400 \n398 387 388 401 387 401 400 388 389 \n402 388 402 401 389 390 403 389 403 \n402 390 391 404 390 404 403 391 392 \n405 391 405 404 392 393 406 392 406 \n405 393 394 407 393 407 406 394 395 \n408 394 408 407 395 396 409 395 409 \n408 396 397 410 396 410 409 397 269 \n270 397 270 410 399 398 411 399 411 \n412 398 400 413 398 413 411 400 401 \n414 400 414 413 401 402 415 401 415 \n414 402 403 416 402 416 415 403 404 \n417 403 417 416 404 405 418 404 418 \n417 405 406 419 405 419 418 406 407 \n420 406 420 419 407 408 421 407 421 \n420 408 409 422 408 422 421 409 410 \n423 409 423 422 410 270 271 410 271 \n423 412 411 424 412 424 425 411 413 \n426 411 426 424 413 414 427 413 427 \n426 414 415 428 414 428 427 415 416 \n429 415 429 428 416 417 430 416 430 \n429 417 418 431 417 431 430 418 419 \n432 418 432 431 419 420 433 419 433 \n432 420 421 434 420 434 433 421 422 \n435 421 435 434 422 423 436 422 436 \n435 423 271 272 423 272 436 425 424 \n437 425 437 438 424 426 439 424 439 \n437 426 427 440 426 440 439 427 428 \n441 427 441 440 428 429 442 428 442 \n441 429 430 443 429 443 442 430 431 \n444 430 444 443 431 432 445 431 445 \n444 432 433 446 432 446 445 433 434 \n447 433 447 446 434 435 448 434 448 \n447 435 436 449 435 449 448 436 272 \n273 436 273 449 438 437 450 438 450 \n451 437 439 452 437 452 450 439 440 \n453 439 453 452 440 441 454 440 454 \n453 441 442 455 441 455 454 442 443 \n456 442 456 455 443 444 457 443 457 \n456 444 445 458 444 458 457 445 446 \n459 445 459 458 446 447 460 446 460 \n459 447 448 461 447 461 460 448 449 \n462 448 462 461 449 273 274 449 274 \n462 451 450 463 451 463 464 450 452 \n465 450 465 463 452 453 466 452 466 \n465 453 454 467 453 467 466 454 455 \n468 454 468 467 455 456 469 455 469 \n468 456 457 470 456 470 469 457 458 \n471 457 471 470 458 459 472 458 472 \n471 459 460 473 459 473 472 460 461 \n474 460 474 473 461 462 475 461 475 \n474 462 274 275 462 275 475 464 463 \n476 464 476 477 463 465 478 463 478 \n476 465 466 479 465 479 478 466 467 \n480 466 480 479 467 468 481 467 481 \n480 468 469 482 468 482 481 469 470 \n483 469 483 482 470 471 484 470 484 \n483 471 472 485 471 485 484 472 473 \n486 472 486 485 473 474 487 473 487 \n486 474 475 488 474 488 487 475 275 \n276 475 276 488 477 476 489 477 489 \n490 476 478 491 476 491 489 478 479 \n492 478 492 491 479 480 493 479 493 \n492 480 481 494 480 494 493 481 482 \n495 481 495 494 482 483 496 482 496 \n495 483 484 497 483 497 496 484 485 \n498 484 498 497 485 486 499 485 499 \n498 486 487 500 486 500 499 487 488 \n501 487 501 500 488 276 277 488 277 \n501 490 489 502 490 502 503 489 491 \n504 489 504 502 491 492 505 491 505 \n504 492 493 506 492 506 505 493 494 \n507 493 507 506 494 495 508 494 508 \n507 495 496 509 495 509 508 496 497 \n510 496 510 509 497 498 511 497 511 \n510 498 499 512 498 512 511 499 500 \n513 499 513 512 500 501 514 500 514 \n513 501 277 278 501 278 514 503 502 \n515 503 515 516 502 504 517 502 517 \n515 504 505 518 504 518 517 505 506 \n519 505 519 518 506 507 520 506 520 \n519 507 508 521 507 521 520 508 509 \n522 508 522 521 509 510 523 509 523 \n522 510 511 524 510 524 523 511 512 \n525 511 525 524 512 513 526 512 526 \n525 513 514 527 513 527 526 514 278 \n279 514 279 527 516 515 528 516 528 \n529 515 517 530 515 530 528 517 518 \n531 517 531 530 518 519 532 518 532 \n531 519 520 533 519 533 532 520 521 \n534 520 534 533 521 522 535 521 535 \n534 522 523 536 522 536 535 523 524 \n537 523 537 536 524 525 538 524 538 \n537 525 526 539 525 539 538 526 527 \n540 526 540 539 527 279 280 527 280 \n540 529 528 282 529 282 281 528 530 \n285 528 285 282 530 531 287 530 287 \n285 531 532 289 531 289 287 532 533 \n291 532 291 289 533 534 293 533 293 \n291 534 535 295 534 295 293 535 536 \n297 535 297 295 536 537 299 536 299 \n297 537 538 301 537 301 299 538 539 \n303 538 303 301 539 540 305 539 305 \n303 540 280 260 540 260 305 281 284 \n201 200 284 203 202 201 284 308 204 \n203 308 206 205 204 308 321 207 206 \n321 209 208 207 321 334 210 209 334 \n212 211 210 334 347 213 212 347 215 \n214 213 347 360 216 215 360 218 217 \n216 360 373 219 218 373 221 220 219 \n373 386 222 221 386 224 223 222 386 \n399 225 224 399 227 226 225 399 412 \n228 227 412 230 229 228 412 425 231 \n230 425 233 232 231 425 438 234 233 \n438 236 235 234 438 451 237 236 451 \n239 238 237 451 464 240 239 464 242 \n241 240 464 477 243 242 477 245 244 \n243 477 490 246 245 490 248 247 246 \n490 503 249 248 503 251 250 249 503 \n516 252 251 516 254 253 252 516 529 \n255 254 529 257 256 255 529 281 258 \n257 281 200 259 258 0 3 541 542 \n3 543 544 541 3 21 545 543 21 \n546 547 545 21 31 548 546 31 549 \n550 548 31 41 551 549 41 552 553 \n551 41 51 554 552 51 555 556 554 \n51 61 557 555 61 558 559 557 61 \n71 560 558 71 561 562 560 71 81 \n563 561 81 564 565 563 81 91 566 \n564 91 567 568 566 91 101 569 567 \n101 570 571 569 101 111 572 570 111 \n573 574 572 111 121 575 573 121 576 \n577 575 121 131 578 576 131 579 580 \n578 131 141 581 579 141 582 583 581 \n141 151 584 582 151 585 586 584 151 \n161 587 585 161 588 589 587 161 171 \n590 588 171 591 592 590 171 181 593 \n591 181 594 595 593 181 191 596 594 \n191 597 598 596 191 0 599 597 0 \n542 600 599 601 602 603 602 604 603 \n604 605 603 605 606 603 606 607 603 \n607 608 603 608 609 603 609 610 603 \n610 611 603 611 612 603 612 613 603 \n613 614 603 614 615 603 615 616 603 \n616 617 603 617 618 603 618 619 603 \n619 620 603 620 621 603 621 601 603 \n601 622 623 601 623 602 622 624 625 \n622 625 623 624 626 627 624 627 625 \n626 628 629 626 629 627 628 630 631 \n628 631 629 630 632 633 630 633 631 \n632 634 635 632 635 633 634 636 637 \n634 637 635 636 638 639 636 639 637 \n638 640 641 638 641 639 640 642 643 \n640 643 641 642 644 645 642 645 643 \n644 646 647 644 647 645 602 623 648 \n602 648 604 623 625 649 623 649 648 \n625 627 650 625 650 649 627 629 651 \n627 651 650 629 631 652 629 652 651 \n631 633 653 631 653 652 633 635 654 \n633 654 653 635 637 655 635 655 654 \n637 639 656 637 656 655 639 641 657 \n639 657 656 641 643 658 641 658 657 \n643 645 659 643 659 658 645 647 660 \n645 660 659 604 648 661 604 661 605 \n648 649 662 648 662 661 649 650 663 \n649 663 662 650 651 664 650 664 663 \n651 652 665 651 665 664 652 653 666 \n652 666 665 653 654 667 653 667 666 \n654 655 668 654 668 667 655 656 669 \n655 669 668 656 657 670 656 670 669 \n657 658 671 657 671 670 658 659 672 \n658 672 671 659 660 673 659 673 672 \n605 661 674 605 674 606 661 662 675 \n661 675 674 662 663 676 662 676 675 \n663 664 677 663 677 676 664 665 678 \n664 678 677 665 666 679 665 679 678 \n666 667 680 666 680 679 667 668 681 \n667 681 680 668 669 682 668 682 681 \n669 670 683 669 683 682 670 671 684 \n670 684 683 671 672 685 671 685 684 \n672 673 686 672 686 685 606 674 687 \n606 687 607 674 675 688 674 688 687 \n675 676 689 675 689 688 676 677 690 \n676 690 689 677 678 691 677 691 690 \n678 679 692 678 692 691 679 680 693 \n679 693 692 680 681 694 680 694 693 \n681 682 695 681 695 694 682 683 696 \n682 696 695 683 684 697 683 697 696 \n684 685 698 684 698 697 685 686 699 \n685 699 698 607 687 700 607 700 608 \n687 688 701 687 701 700 688 689 702 \n688 702 701 689 690 703 689 703 702 \n690 691 704 690 704 703 691 692 705 \n691 705 704 692 693 706 692 706 705 \n693 694 707 693 707 706 694 695 708 \n694 708 707 695 696 709 695 709 708 \n696 697 710 696 710 709 697 698 711 \n697 711 710 698 699 712 698 712 711 \n608 700 713 608 713 609 700 701 714 \n700 714 713 701 702 715 701 715 714 \n702 703 716 702 716 715 703 704 717 \n703 717 716 704 705 718 704 718 717 \n705 706 719 705 719 718 706 707 720 \n706 720 719 707 708 721 707 721 720 \n708 709 722 708 722 721 709 710 723 \n709 723 722 710 711 724 710 724 723 \n711 712 725 711 725 724 609 713 726 \n609 726 610 713 714 727 713 727 726 \n714 715 728 714 728 727 715 716 729 \n715 729 728 716 717 730 716 730 729 \n717 718 731 717 731 730 718 719 732 \n718 732 731 719 720 733 719 733 732 \n720 721 734 720 734 733 721 722 735 \n721 735 734 722 723 736 722 736 735 \n723 724 737 723 737 736 724 725 738 \n724 738 737 610 726 739 610 739 611 \n726 727 740 726 740 739 727 728 741 \n727 741 740 728 729 742 728 742 741 \n729 730 743 729 743 742 730 731 744 \n730 744 743 731 732 745 731 745 744 \n732 733 746 732 746 745 733 734 747 \n733 747 746 734 735 748 734 748 747 \n735 736 749 735 749 748 736 737 750 \n736 750 749 737 738 751 737 751 750 \n611 739 752 611 752 612 739 740 753 \n739 753 752 740 741 754 740 754 753 \n741 742 755 741 755 754 742 743 756 \n742 756 755 743 744 757 743 757 756 \n744 745 758 744 758 757 745 746 759 \n745 759 758 746 747 760 746 760 759 \n747 748 761 747 761 760 748 749 762 \n748 762 761 749 750 763 749 763 762 \n750 751 764 750 764 763 612 752 765 \n612 765 613 752 753 766 752 766 765 \n753 754 767 753 767 766 754 755 768 \n754 768 767 755 756 769 755 769 768 \n756 757 770 756 770 769 757 758 771 \n757 771 770 758 759 772 758 772 771 \n759 760 773 759 773 772 760 761 774 \n760 774 773 761 762 775 761 775 774 \n762 763 776 762 776 775 763 764 777 \n763 777 776 613 765 778 613 778 614 \n765 766 779 765 779 778 766 767 780 \n766 780 779 767 768 781 767 781 780 \n768 769 782 768 782 781 769 770 783 \n769 783 782 770 771 784 770 784 783 \n771 772 785 771 785 784 772 773 786 \n772 786 785 773 774 787 773 787 786 \n774 775 788 774 788 787 775 776 789 \n775 789 788 776 777 790 776 790 789 \n614 778 791 614 791 615 778 779 792 \n778 792 791 779 780 793 779 793 792 \n780 781 794 780 794 793 781 782 795 \n781 795 794 782 783 796 782 796 795 \n783 784 797 783 797 796 784 785 798 \n784 798 797 785 786 799 785 799 798 \n786 787 800 786 800 799 787 788 801 \n787 801 800 788 789 802 788 802 801 \n789 790 803 789 803 802 615 791 804 \n615 804 616 791 792 805 791 805 804 \n792 793 806 792 806 805 793 794 807 \n793 807 806 794 795 808 794 808 807 \n795 796 809 795 809 808 796 797 810 \n796 810 809 797 798 811 797 811 810 \n798 799 812 798 812 811 799 800 813 \n799 813 812 800 801 814 800 814 813 \n801 802 815 801 815 814 802 803 816 \n802 816 815 616 804 817 616 817 617 \n804 805 818 804 818 817 805 806 819 \n805 819 818 806 807 820 806 820 819 \n807 808 821 807 821 820 808 809 822 \n808 822 821 809 810 823 809 823 822 \n810 811 824 810 824 823 811 812 825 \n811 825 824 812 813 826 812 826 825 \n813 814 827 813 827 826 814 815 828 \n814 828 827 815 816 829 815 829 828 \n617 817 830 617 830 618 817 818 831 \n817 831 830 818 819 832 818 832 831 \n819 820 833 819 833 832 820 821 834 \n820 834 833 821 822 835 821 835 834 \n822 823 836 822 836 835 823 824 837 \n823 837 836 824 825 838 824 838 837 \n825 826 839 825 839 838 826 827 840 \n826 840 839 827 828 841 827 841 840 \n828 829 842 828 842 841 618 830 843 \n618 843 619 830 831 844 830 844 843 \n831 832 845 831 845 844 832 833 846 \n832 846 845 833 834 847 833 847 846 \n834 835 848 834 848 847 835 836 849 \n835 849 848 836 837 850 836 850 849 \n837 838 851 837 851 850 838 839 852 \n838 852 851 839 840 853 839 853 852 \n840 841 854 840 854 853 841 842 855 \n841 855 854 619 843 856 619 856 620 \n843 844 857 843 857 856 844 845 858 \n844 858 857 845 846 859 845 859 858 \n846 847 860 846 860 859 847 848 861 \n847 861 860 848 849 862 848 862 861 \n849 850 863 849 863 862 850 851 864 \n850 864 863 851 852 865 851 865 864 \n852 853 866 852 866 865 853 854 867 \n853 867 866 854 855 868 854 868 867 \n620 856 869 620 869 621 856 857 870 \n856 870 869 857 858 871 857 871 870 \n858 859 872 858 872 871 859 860 873 \n859 873 872 860 861 874 860 874 873 \n861 862 875 861 875 874 862 863 876 \n862 876 875 863 864 877 863 877 876 \n864 865 878 864 878 877 865 866 879 \n865 879 878 866 867 880 866 880 879 \n867 868 881 867 881 880 621 869 622 \n621 622 601 869 870 624 869 624 622 \n870 871 626 870 626 624 871 872 628 \n871 628 626 872 873 630 872 630 628 \n873 874 632 873 632 630 874 875 634 \n874 634 632 875 876 636 875 636 634 \n876 877 638 876 638 636 877 878 640 \n877 640 638 878 879 642 878 642 640 \n879 880 644 879 644 642 880 881 646 \n880 646 644 646 542 541 544 646 544 \n543 647 647 543 545 547 647 547 546 \n660 660 546 548 550 660 550 549 673 \n673 549 551 553 673 553 552 686 686 \n552 554 556 686 556 555 699 699 555 \n557 559 699 559 558 712 712 558 560 \n562 712 562 561 725 725 561 563 565 \n725 565 564 738 738 564 566 568 738 \n568 567 751 751 567 569 571 751 571 \n570 764 764 570 572 574 764 574 573 \n777 777 573 575 577 777 577 576 790 \n790 576 578 580 790 580 579 803 803 \n579 581 583 803 583 582 816 816 582 \n584 586 816 586 585 829 829 585 587 \n589 829 589 588 842 842 588 590 592 \n842 592 591 855 855 591 593 595 855 \n595 594 868 868 594 596 598 868 598 \n597 881 881 597 599 600 881 600 542 \n646 \n"
  },
  {
    "path": "testing/data/branched4.vtk",
    "content": "# vtk DataFile Version 5.1\nvtk output\nASCII\nDATASET POLYDATA\nPOINTS 1346 double\n0.082297295332 0 -0.86818063259 0 0 -0.875 0.078269377351 0.025431262329 -0.86818063259 \n0.066579908133 0.048373136669 -0.86818063259 0.048373136669 0.066579908133 -0.86818063259 0.025431262329 0.078269377351 -0.86818063259 \n5.0392558428e-18 0.082297295332 -0.86818063259 -0.025431262329 0.078269377351 -0.86818063259 -0.048373136669 0.066579908133 -0.86818063259 \n-0.066579908133 0.048373136669 -0.86818063259 -0.078269377351 0.025431262329 -0.86818063259 -0.082297295332 1.0078511686e-17 -0.86818063259 \n-0.078269377351 -0.025431262329 -0.86818063259 -0.066579908133 -0.048373136669 -0.86818063259 -0.048373136669 -0.066579908133 -0.86818063259 \n-0.025431262329 -0.078269377351 -0.86818063259 -1.5117767942e-17 -0.082297295332 -0.86818063259 0.025431262329 -0.078269377351 -0.86818063259 \n0.048373136669 -0.066579908133 -0.86818063259 0.066579908133 -0.048373136669 -0.86818063259 0.078269377351 -0.025431262329 -0.86818063259 \n0.36786195636 0 -0.036359213293 0.41858324409 0 -0.10152591765 0.39809632301 0.12934933603 -0.10152591765 \n0.34985750914 0.11367559433 -0.036359213293 0.45788666606 0 -0.17415228486 0.43547609448 0.14149476588 -0.17415228486 \n0.48470014334 0 -0.2522572577 0.4609772265 0.14978057146 -0.2522572577 0.49829223752 0 -0.33371031284 \n0.47390407324 0.15398077667 -0.33371031284 0.49829223752 0 -0.41628968716 0.47390407324 0.15398077667 -0.41628968716 \n0.48470014334 0 -0.4977427423 0.4609772265 0.14978057146 -0.4977427423 0.45788666606 0 -0.57584768534 \n0.43547609448 0.14149476588 -0.57584768534 0.41858324409 0 -0.64847409725 0.39809632301 0.12934933603 -0.64847409725 \n0.36786195636 0 -0.71364080906 0.34985750914 0.11367559433 -0.71364080906 0.30710634589 0 -0.76957023144 \n0.29207551479 0.0949010849 -0.76957023144 0.23797369003 0 -0.81473690271 0.2263264358 0.073537915945 -0.81473690271 \n0.16234973073 0 -0.84790861607 0.15440377593 0.050168827176 -0.84790861607 0.33864095807 0.24603705108 -0.10152591765 \n0.29760658741 0.21622383595 -0.036359213293 0.37043809891 0.26913902164 -0.17415228486 0.39213064313 0.2848995924 -0.2522572577 \n0.40312689543 0.29288882017 -0.33371031284 0.40312689543 0.29288882017 -0.41628968716 0.39213064313 0.2848995924 -0.4977427423 \n0.37043809891 0.26913902164 -0.57584768534 0.33864095807 0.24603705108 -0.64847409725 0.29760658741 0.21622383595 -0.71364080906 \n0.24845425785 0.1805125922 -0.76957023144 0.19252476096 0.13987742364 -0.81473690271 0.13134369254 0.095426782966 -0.84790861607 \n0.24603705108 0.33864095807 -0.10152591765 0.21622383595 0.29760658741 -0.036359213293 0.26913902164 0.37043809891 -0.17415228486 \n0.2848995924 0.39213064313 -0.2522572577 0.29288882017 0.40312689543 -0.33371031284 0.29288882017 0.40312689543 -0.41628968716 \n0.2848995924 0.39213064313 -0.4977427423 0.26913902164 0.37043809891 -0.57584768534 0.24603705108 0.33864095807 -0.64847409725 \n0.21622383595 0.29760658741 -0.71364080906 0.1805125922 0.24845425785 -0.76957023144 0.13987742364 0.19252476096 -0.81473690271 \n0.095426782966 0.13134369254 -0.84790861607 0.12934933603 0.39809632301 -0.10152591765 0.11367559433 0.34985750914 -0.036359213293 \n0.14149476588 0.43547609448 -0.17415228486 0.14978057146 0.4609772265 -0.2522572577 0.15398077667 0.47390407324 -0.33371031284 \n0.15398077667 0.47390407324 -0.41628968716 0.14978057146 0.4609772265 -0.4977427423 0.14149476588 0.43547609448 -0.57584768534 \n0.12934933603 0.39809632301 -0.64847409725 0.11367559433 0.34985750914 -0.71364080906 0.0949010849 0.29207551479 -0.76957023144 \n0.073537915945 0.2263264358 -0.81473690271 0.050168827176 0.15440377593 -0.84790861607 2.5630831518e-17 0.41858324409 -0.10152591765 \n2.2525047905e-17 0.36786195636 -0.036359213293 2.8037472151e-17 0.45788666606 -0.17415228486 2.9679323096e-17 0.48470014334 -0.2522572577 \n3.0511599142e-17 0.49829223752 -0.33371031284 3.0511599142e-17 0.49829223752 -0.41628968716 2.9679323096e-17 0.48470014334 -0.4977427423 \n2.8037472151e-17 0.45788666606 -0.57584768534 2.5630831518e-17 0.41858324409 -0.64847409725 2.2525047905e-17 0.36786195636 -0.71364080906 \n1.880484115e-17 0.30710634589 -0.76957023144 1.4571686463e-17 0.23797369003 -0.81473690271 9.9410541201e-18 0.16234973073 -0.84790861607 \n-0.12934933603 0.39809632301 -0.10152591765 -0.11367559433 0.34985750914 -0.036359213293 -0.14149476588 0.43547609448 -0.17415228486 \n-0.14978057146 0.4609772265 -0.2522572577 -0.15398077667 0.47390407324 -0.33371031284 -0.15398077667 0.47390407324 -0.41628968716 \n-0.14978057146 0.4609772265 -0.4977427423 -0.14149476588 0.43547609448 -0.57584768534 -0.12934933603 0.39809632301 -0.64847409725 \n-0.11367559433 0.34985750914 -0.71364080906 -0.0949010849 0.29207551479 -0.76957023144 -0.073537915945 0.2263264358 -0.81473690271 \n-0.050168827176 0.15440377593 -0.84790861607 -0.24603705108 0.33864095807 -0.10152591765 -0.21622383595 0.29760658741 -0.036359213293 \n-0.26913902164 0.37043809891 -0.17415228486 -0.2848995924 0.39213064313 -0.2522572577 -0.29288882017 0.40312689543 -0.33371031284 \n-0.29288882017 0.40312689543 -0.41628968716 -0.2848995924 0.39213064313 -0.4977427423 -0.26913902164 0.37043809891 -0.57584768534 \n-0.24603705108 0.33864095807 -0.64847409725 -0.21622383595 0.29760658741 -0.71364080906 -0.1805125922 0.24845425785 -0.76957023144 \n-0.13987742364 0.19252476096 -0.81473690271 -0.095426782966 0.13134369254 -0.84790861607 -0.33864095807 0.24603705108 -0.10152591765 \n-0.29760658741 0.21622383595 -0.036359213293 -0.37043809891 0.26913902164 -0.17415228486 -0.39213064313 0.2848995924 -0.2522572577 \n-0.40312689543 0.29288882017 -0.33371031284 -0.40312689543 0.29288882017 -0.41628968716 -0.39213064313 0.2848995924 -0.4977427423 \n-0.37043809891 0.26913902164 -0.57584768534 -0.33864095807 0.24603705108 -0.64847409725 -0.29760658741 0.21622383595 -0.71364080906 \n-0.24845425785 0.1805125922 -0.76957023144 -0.19252476096 0.13987742364 -0.81473690271 -0.13134369254 0.095426782966 -0.84790861607 \n-0.39809632301 0.12934933603 -0.10152591765 -0.34985750914 0.11367559433 -0.036359213293 -0.43547609448 0.14149476588 -0.17415228486 \n-0.4609772265 0.14978057146 -0.2522572577 -0.47390407324 0.15398077667 -0.33371031284 -0.47390407324 0.15398077667 -0.41628968716 \n-0.4609772265 0.14978057146 -0.4977427423 -0.43547609448 0.14149476588 -0.57584768534 -0.39809632301 0.12934933603 -0.64847409725 \n-0.34985750914 0.11367559433 -0.71364080906 -0.29207551479 0.0949010849 -0.76957023144 -0.2263264358 0.073537915945 -0.81473690271 \n-0.15440377593 0.050168827176 -0.84790861607 -0.41858324409 5.1261663035e-17 -0.10152591765 -0.36786195636 4.5050095809e-17 -0.036359213293 \n-0.45788666606 5.6074944302e-17 -0.17415228486 -0.48470014334 5.9358646193e-17 -0.2522572577 -0.49829223752 6.1023198283e-17 -0.33371031284 \n-0.49829223752 6.1023198283e-17 -0.41628968716 -0.48470014334 5.9358646193e-17 -0.4977427423 -0.45788666606 5.6074944302e-17 -0.57584768534 \n-0.41858324409 5.1261663035e-17 -0.64847409725 -0.36786195636 4.5050095809e-17 -0.71364080906 -0.30710634589 3.76096823e-17 -0.76957023144 \n-0.23797369003 2.9143372925e-17 -0.81473690271 -0.16234973073 1.988210824e-17 -0.84790861607 -0.39809632301 -0.12934933603 -0.10152591765 \n-0.34985750914 -0.11367559433 -0.036359213293 -0.43547609448 -0.14149476588 -0.17415228486 -0.4609772265 -0.14978057146 -0.2522572577 \n-0.47390407324 -0.15398077667 -0.33371031284 -0.47390407324 -0.15398077667 -0.41628968716 -0.4609772265 -0.14978057146 -0.4977427423 \n-0.43547609448 -0.14149476588 -0.57584768534 -0.39809632301 -0.12934933603 -0.64847409725 -0.34985750914 -0.11367559433 -0.71364080906 \n-0.29207551479 -0.0949010849 -0.76957023144 -0.2263264358 -0.073537915945 -0.81473690271 -0.15440377593 -0.050168827176 -0.84790861607 \n-0.33864095807 -0.24603705108 -0.10152591765 -0.29760658741 -0.21622383595 -0.036359213293 -0.37043809891 -0.26913902164 -0.17415228486 \n-0.39213064313 -0.2848995924 -0.2522572577 -0.40312689543 -0.29288882017 -0.33371031284 -0.40312689543 -0.29288882017 -0.41628968716 \n-0.39213064313 -0.2848995924 -0.4977427423 -0.37043809891 -0.26913902164 -0.57584768534 -0.33864095807 -0.24603705108 -0.64847409725 \n-0.29760658741 -0.21622383595 -0.71364080906 -0.24845425785 -0.1805125922 -0.76957023144 -0.19252476096 -0.13987742364 -0.81473690271 \n-0.13134369254 -0.095426782966 -0.84790861607 -0.24603705108 -0.33864095807 -0.10152591765 -0.21622383595 -0.29760658741 -0.036359213293 \n-0.26913902164 -0.37043809891 -0.17415228486 -0.2848995924 -0.39213064313 -0.2522572577 -0.29288882017 -0.40312689543 -0.33371031284 \n-0.29288882017 -0.40312689543 -0.41628968716 -0.2848995924 -0.39213064313 -0.4977427423 -0.26913902164 -0.37043809891 -0.57584768534 \n-0.24603705108 -0.33864095807 -0.64847409725 -0.21622383595 -0.29760658741 -0.71364080906 -0.1805125922 -0.24845425785 -0.76957023144 \n-0.13987742364 -0.19252476096 -0.81473690271 -0.095426782966 -0.13134369254 -0.84790861607 -0.12934933603 -0.39809632301 -0.10152591765 \n-0.11367559433 -0.34985750914 -0.036359213293 -0.14149476588 -0.43547609448 -0.17415228486 -0.14978057146 -0.4609772265 -0.2522572577 \n-0.15398077667 -0.47390407324 -0.33371031284 -0.15398077667 -0.47390407324 -0.41628968716 -0.14978057146 -0.4609772265 -0.4977427423 \n-0.14149476588 -0.43547609448 -0.57584768534 -0.12934933603 -0.39809632301 -0.64847409725 -0.11367559433 -0.34985750914 -0.71364080906 \n-0.0949010849 -0.29207551479 -0.76957023144 -0.073537915945 -0.2263264358 -0.81473690271 -0.050168827176 -0.15440377593 -0.84790861607 \n-7.6892492899e-17 -0.41858324409 -0.10152591765 -6.7575143714e-17 -0.36786195636 -0.036359213293 -8.4112416453e-17 -0.45788666606 -0.17415228486 \n-8.9037972598e-17 -0.48470014334 -0.2522572577 -9.1534800733e-17 -0.49829223752 -0.33371031284 -9.1534800733e-17 -0.49829223752 -0.41628968716 \n-8.9037972598e-17 -0.48470014334 -0.4977427423 -8.4112416453e-17 -0.45788666606 -0.57584768534 -7.6892492899e-17 -0.41858324409 -0.64847409725 \n-6.7575143714e-17 -0.36786195636 -0.71364080906 -5.6414525104e-17 -0.30710634589 -0.76957023144 -4.3715059388e-17 -0.23797369003 -0.81473690271 \n-2.9823163188e-17 -0.16234973073 -0.84790861607 0.12934933603 -0.39809632301 -0.10152591765 0.11367559433 -0.34985750914 -0.036359213293 \n0.14149476588 -0.43547609448 -0.17415228486 0.14978057146 -0.4609772265 -0.2522572577 0.15398077667 -0.47390407324 -0.33371031284 \n0.15398077667 -0.47390407324 -0.41628968716 0.14978057146 -0.4609772265 -0.4977427423 0.14149476588 -0.43547609448 -0.57584768534 \n0.12934933603 -0.39809632301 -0.64847409725 0.11367559433 -0.34985750914 -0.71364080906 0.0949010849 -0.29207551479 -0.76957023144 \n0.073537915945 -0.2263264358 -0.81473690271 0.050168827176 -0.15440377593 -0.84790861607 0.24603705108 -0.33864095807 -0.10152591765 \n0.21622383595 -0.29760658741 -0.036359213293 0.26913902164 -0.37043809891 -0.17415228486 0.2848995924 -0.39213064313 -0.2522572577 \n0.29288882017 -0.40312689543 -0.33371031284 0.29288882017 -0.40312689543 -0.41628968716 0.2848995924 -0.39213064313 -0.4977427423 \n0.26913902164 -0.37043809891 -0.57584768534 0.24603705108 -0.33864095807 -0.64847409725 0.21622383595 -0.29760658741 -0.71364080906 \n0.1805125922 -0.24845425785 -0.76957023144 0.13987742364 -0.19252476096 -0.81473690271 0.095426782966 -0.13134369254 -0.84790861607 \n0.33864095807 -0.24603705108 -0.10152591765 0.29760658741 -0.21622383595 -0.036359213293 0.37043809891 -0.26913902164 -0.17415228486 \n0.39213064313 -0.2848995924 -0.2522572577 0.40312689543 -0.29288882017 -0.33371031284 0.40312689543 -0.29288882017 -0.41628968716 \n0.39213064313 -0.2848995924 -0.4977427423 0.37043809891 -0.26913902164 -0.57584768534 0.33864095807 -0.24603705108 -0.64847409725 \n0.29760658741 -0.21622383595 -0.71364080906 0.24845425785 -0.1805125922 -0.76957023144 0.19252476096 -0.13987742364 -0.81473690271 \n0.13134369254 -0.095426782966 -0.84790861607 0.39809632301 -0.12934933603 -0.10152591765 0.34985750914 -0.11367559433 -0.036359213293 \n0.43547609448 -0.14149476588 -0.17415228486 0.4609772265 -0.14978057146 -0.2522572577 0.47390407324 -0.15398077667 -0.33371031284 \n0.47390407324 -0.15398077667 -0.41628968716 0.4609772265 -0.14978057146 -0.4977427423 0.43547609448 -0.14149476588 -0.57584768534 \n0.39809632301 -0.12934933603 -0.64847409725 0.34985750914 -0.11367559433 -0.71364080906 0.29207551479 -0.0949010849 -0.76957023144 \n0.2263264358 -0.073537915945 -0.81473690271 0.15440377593 -0.050168827176 -0.84790861607 0.3220653893 0.03977618435 -4.9487070846e-09 \n0.32836531327 8.6818331113e-19 -2.8171179001e-17 0.31229398553 0.10147046475 2.5407916269e-17 0.31859390657 0.06169429886 -4.9487070599e-09 \n0.29401088933 0.13735306108 5.1429095066e-09 0.2656531266 0.19300829687 1.3877787808e-17 0.28393623162 0.15712568324 5.1429095066e-09 \n0.23717652592 0.22148489755 -0 0.19300829687 0.2656531266 -0 0.22148489755 0.23717652592 -0 \n0.15712568324 0.28393623162 -5.1429094891e-09 0.10147046475 0.31229398553 -2.5197041461e-17 0.13735306108 0.29401088933 -5.1429095118e-09 \n0.06169429886 0.31859390657 4.9487070318e-09 1.8882986284e-17 0.32836531327 2.3493044647e-24 0.03977618435 0.3220653893 4.948707057e-09 \n-0.03977618435 0.3220653893 -4.9487070858e-09 -0.10147046475 0.31229398553 -4.4034066554e-18 -0.06169429886 0.31859390657 -4.948707057e-09 \n-0.13735306108 0.29401088933 5.1429095118e-09 -0.19300829687 0.2656531266 2.0768586122e-18 -0.15712568324 0.28393623162 5.1429095066e-09 \n-0.22148489755 0.23717652592 0 -0.2656531266 0.19300829687 0 -0.23717652592 0.22148489755 0 \n-0.28393623162 0.15712568324 -5.1429094753e-09 -0.31229398553 0.10147046475 -2.5407916269e-17 -0.29401088933 0.13735306108 -5.1429095118e-09 \n-0.31859390657 0.06169429886 4.9487070561e-09 -0.32836531327 3.8887509036e-17 4.8381435661e-24 -0.3220653893 0.03977618435 4.9487070561e-09 \n-0.3220653893 -0.03977618435 -4.9487070852e-09 -0.31229398553 -0.10147046475 -2.9741361642e-18 -0.31859390657 -0.06169429886 -4.9487070599e-09 \n-0.29401088933 -0.13735306108 5.1429095066e-09 -0.2656531266 -0.19300829687 1.3877787808e-17 -0.28393623162 -0.15712568324 5.1429095066e-09 \n-0.23717652592 -0.22148489755 0 -0.19300829687 -0.2656531266 0 -0.22148489755 -0.23717652592 0 \n-0.15712568324 -0.28393623162 -5.1429094753e-09 -0.10147046475 -0.31229398553 -2.540791296e-17 -0.13735306108 -0.29401088933 -5.1429094753e-09 \n-0.06169429886 -0.31859390657 4.9487070561e-09 -6.0659279325e-17 -0.32836531327 -8.8442977687e-18 -0.03977618435 -0.3220653893 4.9487070565e-09 \n0.03977618435 -0.3220653893 -4.9487070556e-09 0.10147046475 -0.31229398553 -1.5448640187e-18 0.06169429886 -0.31859390657 -4.9487070591e-09 \n0.13735306108 -0.29401088933 5.1429095066e-09 0.19300829687 -0.2656531266 0 0.15712568324 -0.28393623162 5.1429094891e-09 \n0.22148489755 -0.23717652592 0 0.2656531266 -0.19300829687 -2.0768619209e-18 0.23717652592 -0.22148489755 0 \n0.28393623162 -0.15712568324 -5.1429094753e-09 0.31229398553 -0.10147046475 2.9741345099e-18 0.29401088933 -0.13735306108 -5.1429095118e-09 \n0.31859390657 -0.06169429886 4.9487070561e-09 0.3220653893 -0.03977618435 4.9487070565e-09 0.082297295332 0 0.86818063259 \n0.078269377351 0.025431262329 0.86818063259 0 0 0.875 0.066579908133 0.048373136669 0.86818063259 \n0.048373136669 0.066579908133 0.86818063259 0.025431262329 0.078269377351 0.86818063259 5.0392558428e-18 0.082297295332 0.86818063259 \n-0.025431262329 0.078269377351 0.86818063259 -0.048373136669 0.066579908133 0.86818063259 -0.066579908133 0.048373136669 0.86818063259 \n-0.078269377351 0.025431262329 0.86818063259 -0.082297295332 1.0078511686e-17 0.86818063259 -0.078269377351 -0.025431262329 0.86818063259 \n-0.066579908133 -0.048373136669 0.86818063259 -0.048373136669 -0.066579908133 0.86818063259 -0.025431262329 -0.078269377351 0.86818063259 \n-1.5117767942e-17 -0.082297295332 0.86818063259 0.025431262329 -0.078269377351 0.86818063259 0.048373136669 -0.066579908133 0.86818063259 \n0.066579908133 -0.048373136669 0.86818063259 0.078269377351 -0.025431262329 0.86818063259 0.16234973073 0 0.84790861607 \n0.15440377593 0.050168827176 0.84790861607 0.23797369003 0 0.81473690271 0.2263264358 0.073537915945 0.81473690271 \n0.30710634589 0 0.76957023144 0.29207551479 0.0949010849 0.76957023144 0.36786195636 0 0.71364080906 \n0.34985750914 0.11367559433 0.71364080906 0.41858324409 0 0.64847409725 0.39809632301 0.12934933603 0.64847409725 \n0.45788666606 0 0.57584768534 0.43547609448 0.14149476588 0.57584768534 0.48470014334 0 0.4977427423 \n0.4609772265 0.14978057146 0.4977427423 0.49829223752 0 0.41628968716 0.47390407324 0.15398077667 0.41628968716 \n0.49829223752 0 0.33371031284 0.47390407324 0.15398077667 0.33371031284 0.48470014334 0 0.2522572577 \n0.4609772265 0.14978057146 0.2522572577 0.45788666606 0 0.17415228486 0.43547609448 0.14149476588 0.17415228486 \n0.41858324409 0 0.10152591765 0.39809632301 0.12934933603 0.10152591765 0.36786195636 0 0.036359213293 \n0.34985750914 0.11367559433 0.036359213293 0.13134369254 0.095426782966 0.84790861607 0.19252476096 0.13987742364 0.81473690271 \n0.24845425785 0.1805125922 0.76957023144 0.29760658741 0.21622383595 0.71364080906 0.33864095807 0.24603705108 0.64847409725 \n0.37043809891 0.26913902164 0.57584768534 0.39213064313 0.2848995924 0.4977427423 0.40312689543 0.29288882017 0.41628968716 \n0.40312689543 0.29288882017 0.33371031284 0.39213064313 0.2848995924 0.2522572577 0.37043809891 0.26913902164 0.17415228486 \n0.33864095807 0.24603705108 0.10152591765 0.29760658741 0.21622383595 0.036359213293 0.095426782966 0.13134369254 0.84790861607 \n0.13987742364 0.19252476096 0.81473690271 0.1805125922 0.24845425785 0.76957023144 0.21622383595 0.29760658741 0.71364080906 \n0.24603705108 0.33864095807 0.64847409725 0.26913902164 0.37043809891 0.57584768534 0.2848995924 0.39213064313 0.4977427423 \n0.29288882017 0.40312689543 0.41628968716 0.29288882017 0.40312689543 0.33371031284 0.2848995924 0.39213064313 0.2522572577 \n0.26913902164 0.37043809891 0.17415228486 0.24603705108 0.33864095807 0.10152591765 0.21622383595 0.29760658741 0.036359213293 \n0.050168827176 0.15440377593 0.84790861607 0.073537915945 0.2263264358 0.81473690271 0.0949010849 0.29207551479 0.76957023144 \n0.11367559433 0.34985750914 0.71364080906 0.12934933603 0.39809632301 0.64847409725 0.14149476588 0.43547609448 0.57584768534 \n0.14978057146 0.4609772265 0.4977427423 0.15398077667 0.47390407324 0.41628968716 0.15398077667 0.47390407324 0.33371031284 \n0.14978057146 0.4609772265 0.2522572577 0.14149476588 0.43547609448 0.17415228486 0.12934933603 0.39809632301 0.10152591765 \n0.11367559433 0.34985750914 0.036359213293 9.9410541201e-18 0.16234973073 0.84790861607 1.4571686463e-17 0.23797369003 0.81473690271 \n1.880484115e-17 0.30710634589 0.76957023144 2.2525047905e-17 0.36786195636 0.71364080906 2.5630831518e-17 0.41858324409 0.64847409725 \n2.8037472151e-17 0.45788666606 0.57584768534 2.9679323096e-17 0.48470014334 0.4977427423 3.0511599142e-17 0.49829223752 0.41628968716 \n3.0511599142e-17 0.49829223752 0.33371031284 2.9679323096e-17 0.48470014334 0.2522572577 2.8037472151e-17 0.45788666606 0.17415228486 \n2.5630831518e-17 0.41858324409 0.10152591765 2.2525047905e-17 0.36786195636 0.036359213293 -0.050168827176 0.15440377593 0.84790861607 \n-0.073537915945 0.2263264358 0.81473690271 -0.0949010849 0.29207551479 0.76957023144 -0.11367559433 0.34985750914 0.71364080906 \n-0.12934933603 0.39809632301 0.64847409725 -0.14149476588 0.43547609448 0.57584768534 -0.14978057146 0.4609772265 0.4977427423 \n-0.15398077667 0.47390407324 0.41628968716 -0.15398077667 0.47390407324 0.33371031284 -0.14978057146 0.4609772265 0.2522572577 \n-0.14149476588 0.43547609448 0.17415228486 -0.12934933603 0.39809632301 0.10152591765 -0.11367559433 0.34985750914 0.036359213293 \n-0.095426782966 0.13134369254 0.84790861607 -0.13987742364 0.19252476096 0.81473690271 -0.1805125922 0.24845425785 0.76957023144 \n-0.21622383595 0.29760658741 0.71364080906 -0.24603705108 0.33864095807 0.64847409725 -0.26913902164 0.37043809891 0.57584768534 \n-0.2848995924 0.39213064313 0.4977427423 -0.29288882017 0.40312689543 0.41628968716 -0.29288882017 0.40312689543 0.33371031284 \n-0.2848995924 0.39213064313 0.2522572577 -0.26913902164 0.37043809891 0.17415228486 -0.24603705108 0.33864095807 0.10152591765 \n-0.21622383595 0.29760658741 0.036359213293 -0.13134369254 0.095426782966 0.84790861607 -0.19252476096 0.13987742364 0.81473690271 \n-0.24845425785 0.1805125922 0.76957023144 -0.29760658741 0.21622383595 0.71364080906 -0.33864095807 0.24603705108 0.64847409725 \n-0.37043809891 0.26913902164 0.57584768534 -0.39213064313 0.2848995924 0.4977427423 -0.40312689543 0.29288882017 0.41628968716 \n-0.40312689543 0.29288882017 0.33371031284 -0.39213064313 0.2848995924 0.2522572577 -0.37043809891 0.26913902164 0.17415228486 \n-0.33864095807 0.24603705108 0.10152591765 -0.29760658741 0.21622383595 0.036359213293 -0.15440377593 0.050168827176 0.84790861607 \n-0.2263264358 0.073537915945 0.81473690271 -0.29207551479 0.0949010849 0.76957023144 -0.34985750914 0.11367559433 0.71364080906 \n-0.39809632301 0.12934933603 0.64847409725 -0.43547609448 0.14149476588 0.57584768534 -0.4609772265 0.14978057146 0.4977427423 \n-0.47390407324 0.15398077667 0.41628968716 -0.47390407324 0.15398077667 0.33371031284 -0.4609772265 0.14978057146 0.2522572577 \n-0.43547609448 0.14149476588 0.17415228486 -0.39809632301 0.12934933603 0.10152591765 -0.34985750914 0.11367559433 0.036359213293 \n-0.16234973073 1.988210824e-17 0.84790861607 -0.23797369003 2.9143372925e-17 0.81473690271 -0.30710634589 3.76096823e-17 0.76957023144 \n-0.36786195636 4.5050095809e-17 0.71364080906 -0.41858324409 5.1261663035e-17 0.64847409725 -0.45788666606 5.6074944302e-17 0.57584768534 \n-0.48470014334 5.9358646193e-17 0.4977427423 -0.49829223752 6.1023198283e-17 0.41628968716 -0.49829223752 6.1023198283e-17 0.33371031284 \n-0.48470014334 5.9358646193e-17 0.2522572577 -0.45788666606 5.6074944302e-17 0.17415228486 -0.41858324409 5.1261663035e-17 0.10152591765 \n-0.36786195636 4.5050095809e-17 0.036359213293 -0.15440377593 -0.050168827176 0.84790861607 -0.2263264358 -0.073537915945 0.81473690271 \n-0.29207551479 -0.0949010849 0.76957023144 -0.34985750914 -0.11367559433 0.71364080906 -0.39809632301 -0.12934933603 0.64847409725 \n-0.43547609448 -0.14149476588 0.57584768534 -0.4609772265 -0.14978057146 0.4977427423 -0.47390407324 -0.15398077667 0.41628968716 \n-0.47390407324 -0.15398077667 0.33371031284 -0.4609772265 -0.14978057146 0.2522572577 -0.43547609448 -0.14149476588 0.17415228486 \n-0.39809632301 -0.12934933603 0.10152591765 -0.34985750914 -0.11367559433 0.036359213293 -0.13134369254 -0.095426782966 0.84790861607 \n-0.19252476096 -0.13987742364 0.81473690271 -0.24845425785 -0.1805125922 0.76957023144 -0.29760658741 -0.21622383595 0.71364080906 \n-0.33864095807 -0.24603705108 0.64847409725 -0.37043809891 -0.26913902164 0.57584768534 -0.39213064313 -0.2848995924 0.4977427423 \n-0.40312689543 -0.29288882017 0.41628968716 -0.40312689543 -0.29288882017 0.33371031284 -0.39213064313 -0.2848995924 0.2522572577 \n-0.37043809891 -0.26913902164 0.17415228486 -0.33864095807 -0.24603705108 0.10152591765 -0.29760658741 -0.21622383595 0.036359213293 \n-0.095426782966 -0.13134369254 0.84790861607 -0.13987742364 -0.19252476096 0.81473690271 -0.1805125922 -0.24845425785 0.76957023144 \n-0.21622383595 -0.29760658741 0.71364080906 -0.24603705108 -0.33864095807 0.64847409725 -0.26913902164 -0.37043809891 0.57584768534 \n-0.2848995924 -0.39213064313 0.4977427423 -0.29288882017 -0.40312689543 0.41628968716 -0.29288882017 -0.40312689543 0.33371031284 \n-0.2848995924 -0.39213064313 0.2522572577 -0.26913902164 -0.37043809891 0.17415228486 -0.24603705108 -0.33864095807 0.10152591765 \n-0.21622383595 -0.29760658741 0.036359213293 -0.050168827176 -0.15440377593 0.84790861607 -0.073537915945 -0.2263264358 0.81473690271 \n-0.0949010849 -0.29207551479 0.76957023144 -0.11367559433 -0.34985750914 0.71364080906 -0.12934933603 -0.39809632301 0.64847409725 \n-0.14149476588 -0.43547609448 0.57584768534 -0.14978057146 -0.4609772265 0.4977427423 -0.15398077667 -0.47390407324 0.41628968716 \n-0.15398077667 -0.47390407324 0.33371031284 -0.14978057146 -0.4609772265 0.2522572577 -0.14149476588 -0.43547609448 0.17415228486 \n-0.12934933603 -0.39809632301 0.10152591765 -0.11367559433 -0.34985750914 0.036359213293 -2.9823163188e-17 -0.16234973073 0.84790861607 \n-4.3715059388e-17 -0.23797369003 0.81473690271 -5.6414525104e-17 -0.30710634589 0.76957023144 -6.7575143714e-17 -0.36786195636 0.71364080906 \n-7.6892492899e-17 -0.41858324409 0.64847409725 -8.4112416453e-17 -0.45788666606 0.57584768534 -8.9037972598e-17 -0.48470014334 0.4977427423 \n-9.1534800733e-17 -0.49829223752 0.41628968716 -9.1534800733e-17 -0.49829223752 0.33371031284 -8.9037972598e-17 -0.48470014334 0.2522572577 \n-8.4112416453e-17 -0.45788666606 0.17415228486 -7.6892492899e-17 -0.41858324409 0.10152591765 -6.7575143714e-17 -0.36786195636 0.036359213293 \n0.050168827176 -0.15440377593 0.84790861607 0.073537915945 -0.2263264358 0.81473690271 0.0949010849 -0.29207551479 0.76957023144 \n0.11367559433 -0.34985750914 0.71364080906 0.12934933603 -0.39809632301 0.64847409725 0.14149476588 -0.43547609448 0.57584768534 \n0.14978057146 -0.4609772265 0.4977427423 0.15398077667 -0.47390407324 0.41628968716 0.15398077667 -0.47390407324 0.33371031284 \n0.14978057146 -0.4609772265 0.2522572577 0.14149476588 -0.43547609448 0.17415228486 0.12934933603 -0.39809632301 0.10152591765 \n0.11367559433 -0.34985750914 0.036359213293 0.095426782966 -0.13134369254 0.84790861607 0.13987742364 -0.19252476096 0.81473690271 \n0.1805125922 -0.24845425785 0.76957023144 0.21622383595 -0.29760658741 0.71364080906 0.24603705108 -0.33864095807 0.64847409725 \n0.26913902164 -0.37043809891 0.57584768534 0.2848995924 -0.39213064313 0.4977427423 0.29288882017 -0.40312689543 0.41628968716 \n0.29288882017 -0.40312689543 0.33371031284 0.2848995924 -0.39213064313 0.2522572577 0.26913902164 -0.37043809891 0.17415228486 \n0.24603705108 -0.33864095807 0.10152591765 0.21622383595 -0.29760658741 0.036359213293 0.13134369254 -0.095426782966 0.84790861607 \n0.19252476096 -0.13987742364 0.81473690271 0.24845425785 -0.1805125922 0.76957023144 0.29760658741 -0.21622383595 0.71364080906 \n0.33864095807 -0.24603705108 0.64847409725 0.37043809891 -0.26913902164 0.57584768534 0.39213064313 -0.2848995924 0.4977427423 \n0.40312689543 -0.29288882017 0.41628968716 0.40312689543 -0.29288882017 0.33371031284 0.39213064313 -0.2848995924 0.2522572577 \n0.37043809891 -0.26913902164 0.17415228486 0.33864095807 -0.24603705108 0.10152591765 0.29760658741 -0.21622383595 0.036359213293 \n0.15440377593 -0.050168827176 0.84790861607 0.2263264358 -0.073537915945 0.81473690271 0.29207551479 -0.0949010849 0.76957023144 \n0.34985750914 -0.11367559433 0.71364080906 0.39809632301 -0.12934933603 0.64847409725 0.43547609448 -0.14149476588 0.57584768534 \n0.4609772265 -0.14978057146 0.4977427423 0.47390407324 -0.15398077667 0.41628968716 0.47390407324 -0.15398077667 0.33371031284 \n0.4609772265 -0.14978057146 0.2522572577 0.43547609448 -0.14149476588 0.17415228486 0.39809632301 -0.12934933603 0.10152591765 \n0.34985750914 -0.11367559433 0.036359213293 0 0 0 0 0 -0.75 \n0.061722971499 0 -0.0051145111211 0.12176229805 0 -0.020318534225 0.17848026752 0 -0.045197341591 \n0.23032976687 0 -0.079072311521 0.27589645982 0 -0.12101940811 0.31393742561 0 -0.16989444196 \n0.34341499209 0 -0.2243642211 0.3635250926 0 -0.28294295073 0.37371918559 0 -0.34403273463 \n0.37371918559 0 -0.40596726537 0.3635250926 0 -0.46705704927 0.34341499209 0 -0.5256357789 \n0.31393742561 0 -0.58010554314 0.27589645982 0 -0.62898057699 0.23032976687 0 -0.67092770338 \n0.17848026752 0 -0.70480263233 0.12176229805 0 -0.72968149185 0.061722971499 0 -0.74488550425 \n0.058702033013 0.019073447213 -0.0051145111211 0.11580283195 0.037626620382 -0.020318534225 0.1697448194 0.055153436959 -0.045197341591 \n0.21905662119 0.071175813675 -0.079072311521 0.26239314675 0.085256695747 -0.12101940811 0.29857224226 0.097011998296 -0.16989444196 \n0.32660707831 0.10612107068 -0.2243642211 0.34573292732 0.11233543605 -0.28294295073 0.35542806983 0.11548557878 -0.34403273463 \n0.35542806983 0.11548557878 -0.40596726537 0.34573292732 0.11233543605 -0.46705704927 0.32660707831 0.10612107068 -0.5256357789 \n0.29857224226 0.097011998296 -0.58010554314 0.26239314675 0.085256695747 -0.62898057699 0.21905662119 0.071175813675 -0.67092770338 \n0.1697448194 0.055153436959 -0.70480263233 0.11580283195 0.037626620382 -0.72968149185 0.058702033013 0.019073447213 -0.74488550425 \n0.049934931099 0.036279853433 -0.0051145111211 0.098507769406 0.071570083499 -0.020318534225 0.14439357817 0.10490807146 -0.045197341591 \n0.18634068966 0.13538444042 -0.079072311521 0.22320492566 0.16216787696 -0.12101940811 0.253980726 0.18452778459 -0.16989444196 \n0.27782857418 0.20185427368 -0.2243642211 0.2940979898 0.2136746943 -0.28294295073 0.30234518647 0.21966663003 -0.34403273463 \n0.30234518647 0.21966663003 -0.40596726537 0.2940979898 0.2136746943 -0.46705704927 0.27782857418 0.20185427368 -0.5256357789 \n0.253980726 0.18452778459 -0.58010554314 0.22320492566 0.16216787696 -0.62898057699 0.18634068966 0.13538444042 -0.67092770338 \n0.14439357817 0.10490807146 -0.70480263233 0.098507769406 0.071570083499 -0.72968149185 0.049934931099 0.036279853433 -0.74488550425 \n0.036279853433 0.049934931099 -0.0051145111211 0.071570083499 0.098507769406 -0.020318534225 0.10490807146 0.14439357817 -0.045197341591 \n0.13538444042 0.18634068966 -0.079072311521 0.16216787696 0.22320492566 -0.12101940811 0.18452778459 0.253980726 -0.16989444196 \n0.20185427368 0.27782857418 -0.2243642211 0.2136746943 0.2940979898 -0.28294295073 0.21966663003 0.30234518647 -0.34403273463 \n0.21966663003 0.30234518647 -0.40596726537 0.2136746943 0.2940979898 -0.46705704927 0.20185427368 0.27782857418 -0.5256357789 \n0.18452778459 0.253980726 -0.58010554314 0.16216787696 0.22320492566 -0.62898057699 0.13538444042 0.18634068966 -0.67092770338 \n0.10490807146 0.14439357817 -0.70480263233 0.071570083499 0.098507769406 -0.72968149185 0.036279853433 0.049934931099 -0.74488550425 \n0.019073447213 0.058702033013 -0.0051145111211 0.037626620382 0.11580283195 -0.020318534225 0.055153436959 0.1697448194 -0.045197341591 \n0.071175813675 0.21905662119 -0.079072311521 0.085256695747 0.26239314675 -0.12101940811 0.097011998296 0.29857224226 -0.16989444196 \n0.10612107068 0.32660707831 -0.2243642211 0.11233543605 0.34573292732 -0.28294295073 0.11548557878 0.35542806983 -0.34403273463 \n0.11548557878 0.35542806983 -0.40596726537 0.11233543605 0.34573292732 -0.46705704927 0.10612107068 0.32660707831 -0.5256357789 \n0.097011998296 0.29857224226 -0.58010554314 0.085256695747 0.26239314675 -0.62898057699 0.071175813675 0.21905662119 -0.67092770338 \n0.055153436959 0.1697448194 -0.70480263233 0.037626620382 0.11580283195 -0.72968149185 0.019073447213 0.058702033013 -0.74488550425 \n3.7794419855e-18 0.061722971499 -0.0051145111211 7.4557907969e-18 0.12176229805 -0.020318534225 1.0928764847e-17 0.17848026752 -0.045197341591 \n1.4103631276e-17 0.23032976687 -0.079072311521 1.6893785928e-17 0.27589645982 -0.12101940811 1.9223123225e-17 0.31393742561 -0.16989444196 \n2.1028104113e-17 0.34341499209 -0.2243642211 2.225949315e-17 0.3635250926 -0.28294295073 2.2883700183e-17 0.37371918559 -0.34403273463 \n2.2883700183e-17 0.37371918559 -0.40596726537 2.225949315e-17 0.3635250926 -0.46705704927 2.1028104113e-17 0.34341499209 -0.5256357789 \n1.9223123225e-17 0.31393742561 -0.58010554314 1.6893785928e-17 0.27589645982 -0.62898057699 1.4103631276e-17 0.23032976687 -0.67092770338 \n1.0928764847e-17 0.17848026752 -0.70480263233 7.4557907969e-18 0.12176229805 -0.72968149185 3.7794419855e-18 0.061722971499 -0.74488550425 \n-0.019073447213 0.058702033013 -0.0051145111211 -0.037626620382 0.11580283195 -0.020318534225 -0.055153436959 0.1697448194 -0.045197341591 \n-0.071175813675 0.21905662119 -0.079072311521 -0.085256695747 0.26239314675 -0.12101940811 -0.097011998296 0.29857224226 -0.16989444196 \n-0.10612107068 0.32660707831 -0.2243642211 -0.11233543605 0.34573292732 -0.28294295073 -0.11548557878 0.35542806983 -0.34403273463 \n-0.11548557878 0.35542806983 -0.40596726537 -0.11233543605 0.34573292732 -0.46705704927 -0.10612107068 0.32660707831 -0.5256357789 \n-0.097011998296 0.29857224226 -0.58010554314 -0.085256695747 0.26239314675 -0.62898057699 -0.071175813675 0.21905662119 -0.67092770338 \n-0.055153436959 0.1697448194 -0.70480263233 -0.037626620382 0.11580283195 -0.72968149185 -0.019073447213 0.058702033013 -0.74488550425 \n-0.036279853433 0.049934931099 -0.0051145111211 -0.071570083499 0.098507769406 -0.020318534225 -0.10490807146 0.14439357817 -0.045197341591 \n-0.13538444042 0.18634068966 -0.079072311521 -0.16216787696 0.22320492566 -0.12101940811 -0.18452778459 0.253980726 -0.16989444196 \n-0.20185427368 0.27782857418 -0.2243642211 -0.2136746943 0.2940979898 -0.28294295073 -0.21966663003 0.30234518647 -0.34403273463 \n-0.21966663003 0.30234518647 -0.40596726537 -0.2136746943 0.2940979898 -0.46705704927 -0.20185427368 0.27782857418 -0.5256357789 \n-0.18452778459 0.253980726 -0.58010554314 -0.16216787696 0.22320492566 -0.62898057699 -0.13538444042 0.18634068966 -0.67092770338 \n-0.10490807146 0.14439357817 -0.70480263233 -0.071570083499 0.098507769406 -0.72968149185 -0.036279853433 0.049934931099 -0.74488550425 \n-0.049934931099 0.036279853433 -0.0051145111211 -0.098507769406 0.071570083499 -0.020318534225 -0.14439357817 0.10490807146 -0.045197341591 \n-0.18634068966 0.13538444042 -0.079072311521 -0.22320492566 0.16216787696 -0.12101940811 -0.253980726 0.18452778459 -0.16989444196 \n-0.27782857418 0.20185427368 -0.2243642211 -0.2940979898 0.2136746943 -0.28294295073 -0.30234518647 0.21966663003 -0.34403273463 \n-0.30234518647 0.21966663003 -0.40596726537 -0.2940979898 0.2136746943 -0.46705704927 -0.27782857418 0.20185427368 -0.5256357789 \n-0.253980726 0.18452778459 -0.58010554314 -0.22320492566 0.16216787696 -0.62898057699 -0.18634068966 0.13538444042 -0.67092770338 \n-0.14439357817 0.10490807146 -0.70480263233 -0.098507769406 0.071570083499 -0.72968149185 -0.049934931099 0.036279853433 -0.74488550425 \n-0.058702033013 0.019073447213 -0.0051145111211 -0.11580283195 0.037626620382 -0.020318534225 -0.1697448194 0.055153436959 -0.045197341591 \n-0.21905662119 0.071175813675 -0.079072311521 -0.26239314675 0.085256695747 -0.12101940811 -0.29857224226 0.097011998296 -0.16989444196 \n-0.32660707831 0.10612107068 -0.2243642211 -0.34573292732 0.11233543605 -0.28294295073 -0.35542806983 0.11548557878 -0.34403273463 \n-0.35542806983 0.11548557878 -0.40596726537 -0.34573292732 0.11233543605 -0.46705704927 -0.32660707831 0.10612107068 -0.5256357789 \n-0.29857224226 0.097011998296 -0.58010554314 -0.26239314675 0.085256695747 -0.62898057699 -0.21905662119 0.071175813675 -0.67092770338 \n-0.1697448194 0.055153436959 -0.70480263233 -0.11580283195 0.037626620382 -0.72968149185 -0.058702033013 0.019073447213 -0.74488550425 \n-0.061722971499 7.558883971e-18 -0.0051145111211 -0.12176229805 1.4911581594e-17 -0.020318534225 -0.17848026752 2.1857529694e-17 -0.045197341591 \n-0.23032976687 2.8207262552e-17 -0.079072311521 -0.27589645982 3.3787571857e-17 -0.12101940811 -0.31393742561 3.8446246449e-17 -0.16989444196 \n-0.34341499209 4.2056208226e-17 -0.2243642211 -0.3635250926 4.4518986299e-17 -0.28294295073 -0.37371918559 4.5767400367e-17 -0.34403273463 \n-0.37371918559 4.5767400367e-17 -0.40596726537 -0.3635250926 4.4518986299e-17 -0.46705704927 -0.34341499209 4.2056208226e-17 -0.5256357789 \n-0.31393742561 3.8446246449e-17 -0.58010554314 -0.27589645982 3.3787571857e-17 -0.62898057699 -0.23032976687 2.8207262552e-17 -0.67092770338 \n-0.17848026752 2.1857529694e-17 -0.70480263233 -0.12176229805 1.4911581594e-17 -0.72968149185 -0.061722971499 7.558883971e-18 -0.74488550425 \n-0.058702033013 -0.019073447213 -0.0051145111211 -0.11580283195 -0.037626620382 -0.020318534225 -0.1697448194 -0.055153436959 -0.045197341591 \n-0.21905662119 -0.071175813675 -0.079072311521 -0.26239314675 -0.085256695747 -0.12101940811 -0.29857224226 -0.097011998296 -0.16989444196 \n-0.32660707831 -0.10612107068 -0.2243642211 -0.34573292732 -0.11233543605 -0.28294295073 -0.35542806983 -0.11548557878 -0.34403273463 \n-0.35542806983 -0.11548557878 -0.40596726537 -0.34573292732 -0.11233543605 -0.46705704927 -0.32660707831 -0.10612107068 -0.5256357789 \n-0.29857224226 -0.097011998296 -0.58010554314 -0.26239314675 -0.085256695747 -0.62898057699 -0.21905662119 -0.071175813675 -0.67092770338 \n-0.1697448194 -0.055153436959 -0.70480263233 -0.11580283195 -0.037626620382 -0.72968149185 -0.058702033013 -0.019073447213 -0.74488550425 \n-0.049934931099 -0.036279853433 -0.0051145111211 -0.098507769406 -0.071570083499 -0.020318534225 -0.14439357817 -0.10490807146 -0.045197341591 \n-0.18634068966 -0.13538444042 -0.079072311521 -0.22320492566 -0.16216787696 -0.12101940811 -0.253980726 -0.18452778459 -0.16989444196 \n-0.27782857418 -0.20185427368 -0.2243642211 -0.2940979898 -0.2136746943 -0.28294295073 -0.30234518647 -0.21966663003 -0.34403273463 \n-0.30234518647 -0.21966663003 -0.40596726537 -0.2940979898 -0.2136746943 -0.46705704927 -0.27782857418 -0.20185427368 -0.5256357789 \n-0.253980726 -0.18452778459 -0.58010554314 -0.22320492566 -0.16216787696 -0.62898057699 -0.18634068966 -0.13538444042 -0.67092770338 \n-0.14439357817 -0.10490807146 -0.70480263233 -0.098507769406 -0.071570083499 -0.72968149185 -0.049934931099 -0.036279853433 -0.74488550425 \n-0.036279853433 -0.049934931099 -0.0051145111211 -0.071570083499 -0.098507769406 -0.020318534225 -0.10490807146 -0.14439357817 -0.045197341591 \n-0.13538444042 -0.18634068966 -0.079072311521 -0.16216787696 -0.22320492566 -0.12101940811 -0.18452778459 -0.253980726 -0.16989444196 \n-0.20185427368 -0.27782857418 -0.2243642211 -0.2136746943 -0.2940979898 -0.28294295073 -0.21966663003 -0.30234518647 -0.34403273463 \n-0.21966663003 -0.30234518647 -0.40596726537 -0.2136746943 -0.2940979898 -0.46705704927 -0.20185427368 -0.27782857418 -0.5256357789 \n-0.18452778459 -0.253980726 -0.58010554314 -0.16216787696 -0.22320492566 -0.62898057699 -0.13538444042 -0.18634068966 -0.67092770338 \n-0.10490807146 -0.14439357817 -0.70480263233 -0.071570083499 -0.098507769406 -0.72968149185 -0.036279853433 -0.049934931099 -0.74488550425 \n-0.019073447213 -0.058702033013 -0.0051145111211 -0.037626620382 -0.11580283195 -0.020318534225 -0.055153436959 -0.1697448194 -0.045197341591 \n-0.071175813675 -0.21905662119 -0.079072311521 -0.085256695747 -0.26239314675 -0.12101940811 -0.097011998296 -0.29857224226 -0.16989444196 \n-0.10612107068 -0.32660707831 -0.2243642211 -0.11233543605 -0.34573292732 -0.28294295073 -0.11548557878 -0.35542806983 -0.34403273463 \n-0.11548557878 -0.35542806983 -0.40596726537 -0.11233543605 -0.34573292732 -0.46705704927 -0.10612107068 -0.32660707831 -0.5256357789 \n-0.097011998296 -0.29857224226 -0.58010554314 -0.085256695747 -0.26239314675 -0.62898057699 -0.071175813675 -0.21905662119 -0.67092770338 \n-0.055153436959 -0.1697448194 -0.70480263233 -0.037626620382 -0.11580283195 -0.72968149185 -0.019073447213 -0.058702033013 -0.74488550425 \n-1.1338325956e-17 -0.061722971499 -0.0051145111211 -2.2367372391e-17 -0.12176229805 -0.020318534225 -3.2786292887e-17 -0.17848026752 -0.045197341591 \n-4.231089052e-17 -0.23032976687 -0.079072311521 -5.068135944e-17 -0.27589645982 -0.12101940811 -5.7669371329e-17 -0.31393742561 -0.16989444196 \n-6.3084313994e-17 -0.34341499209 -0.2243642211 -6.677847614e-17 -0.3635250926 -0.28294295073 -6.865110055e-17 -0.37371918559 -0.34403273463 \n-6.865110055e-17 -0.37371918559 -0.40596726537 -6.677847614e-17 -0.3635250926 -0.46705704927 -6.3084313994e-17 -0.34341499209 -0.5256357789 \n-5.7669371329e-17 -0.31393742561 -0.58010554314 -5.068135944e-17 -0.27589645982 -0.62898057699 -4.231089052e-17 -0.23032976687 -0.67092770338 \n-3.2786292887e-17 -0.17848026752 -0.70480263233 -2.2367372391e-17 -0.12176229805 -0.72968149185 -1.1338325956e-17 -0.061722971499 -0.74488550425 \n0.019073447213 -0.058702033013 -0.0051145111211 0.037626620382 -0.11580283195 -0.020318534225 0.055153436959 -0.1697448194 -0.045197341591 \n0.071175813675 -0.21905662119 -0.079072311521 0.085256695747 -0.26239314675 -0.12101940811 0.097011998296 -0.29857224226 -0.16989444196 \n0.10612107068 -0.32660707831 -0.2243642211 0.11233543605 -0.34573292732 -0.28294295073 0.11548557878 -0.35542806983 -0.34403273463 \n0.11548557878 -0.35542806983 -0.40596726537 0.11233543605 -0.34573292732 -0.46705704927 0.10612107068 -0.32660707831 -0.5256357789 \n0.097011998296 -0.29857224226 -0.58010554314 0.085256695747 -0.26239314675 -0.62898057699 0.071175813675 -0.21905662119 -0.67092770338 \n0.055153436959 -0.1697448194 -0.70480263233 0.037626620382 -0.11580283195 -0.72968149185 0.019073447213 -0.058702033013 -0.74488550425 \n0.036279853433 -0.049934931099 -0.0051145111211 0.071570083499 -0.098507769406 -0.020318534225 0.10490807146 -0.14439357817 -0.045197341591 \n0.13538444042 -0.18634068966 -0.079072311521 0.16216787696 -0.22320492566 -0.12101940811 0.18452778459 -0.253980726 -0.16989444196 \n0.20185427368 -0.27782857418 -0.2243642211 0.2136746943 -0.2940979898 -0.28294295073 0.21966663003 -0.30234518647 -0.34403273463 \n0.21966663003 -0.30234518647 -0.40596726537 0.2136746943 -0.2940979898 -0.46705704927 0.20185427368 -0.27782857418 -0.5256357789 \n0.18452778459 -0.253980726 -0.58010554314 0.16216787696 -0.22320492566 -0.62898057699 0.13538444042 -0.18634068966 -0.67092770338 \n0.10490807146 -0.14439357817 -0.70480263233 0.071570083499 -0.098507769406 -0.72968149185 0.036279853433 -0.049934931099 -0.74488550425 \n0.049934931099 -0.036279853433 -0.0051145111211 0.098507769406 -0.071570083499 -0.020318534225 0.14439357817 -0.10490807146 -0.045197341591 \n0.18634068966 -0.13538444042 -0.079072311521 0.22320492566 -0.16216787696 -0.12101940811 0.253980726 -0.18452778459 -0.16989444196 \n0.27782857418 -0.20185427368 -0.2243642211 0.2940979898 -0.2136746943 -0.28294295073 0.30234518647 -0.21966663003 -0.34403273463 \n0.30234518647 -0.21966663003 -0.40596726537 0.2940979898 -0.2136746943 -0.46705704927 0.27782857418 -0.20185427368 -0.5256357789 \n0.253980726 -0.18452778459 -0.58010554314 0.22320492566 -0.16216787696 -0.62898057699 0.18634068966 -0.13538444042 -0.67092770338 \n0.14439357817 -0.10490807146 -0.70480263233 0.098507769406 -0.071570083499 -0.72968149185 0.049934931099 -0.036279853433 -0.74488550425 \n0.058702033013 -0.019073447213 -0.0051145111211 0.11580283195 -0.037626620382 -0.020318534225 0.1697448194 -0.055153436959 -0.045197341591 \n0.21905662119 -0.071175813675 -0.079072311521 0.26239314675 -0.085256695747 -0.12101940811 0.29857224226 -0.097011998296 -0.16989444196 \n0.32660707831 -0.10612107068 -0.2243642211 0.34573292732 -0.11233543605 -0.28294295073 0.35542806983 -0.11548557878 -0.34403273463 \n0.35542806983 -0.11548557878 -0.40596726537 0.34573292732 -0.11233543605 -0.46705704927 0.32660707831 -0.10612107068 -0.5256357789 \n0.29857224226 -0.097011998296 -0.58010554314 0.26239314675 -0.085256695747 -0.62898057699 0.21905662119 -0.071175813675 -0.67092770338 \n0.1697448194 -0.055153436959 -0.70480263233 0.11580283195 -0.037626620382 -0.72968149185 0.058702033013 -0.019073447213 -0.74488550425 \n0 0 0.75 0 0 0 0.061722971499 0 0.74488550425 \n0.12176229805 0 0.72968149185 0.17848026752 0 0.70480263233 0.23032976687 0 0.67092770338 \n0.27589645982 0 0.62898057699 0.31393742561 0 0.58010554314 0.34341499209 0 0.5256357789 \n0.3635250926 0 0.46705704927 0.37371918559 0 0.40596726537 0.37371918559 0 0.34403273463 \n0.3635250926 0 0.28294295073 0.34341499209 0 0.2243642211 0.31393742561 0 0.16989444196 \n0.27589645982 0 0.12101940811 0.23032976687 0 0.079072311521 0.17848026752 0 0.045197341591 \n0.12176229805 0 0.020318534225 0.061722971499 0 0.0051145111211 0.058702033013 0.019073447213 0.74488550425 \n0.11580283195 0.037626620382 0.72968149185 0.1697448194 0.055153436959 0.70480263233 0.21905662119 0.071175813675 0.67092770338 \n0.26239314675 0.085256695747 0.62898057699 0.29857224226 0.097011998296 0.58010554314 0.32660707831 0.10612107068 0.5256357789 \n0.34573292732 0.11233543605 0.46705704927 0.35542806983 0.11548557878 0.40596726537 0.35542806983 0.11548557878 0.34403273463 \n0.34573292732 0.11233543605 0.28294295073 0.32660707831 0.10612107068 0.2243642211 0.29857224226 0.097011998296 0.16989444196 \n0.26239314675 0.085256695747 0.12101940811 0.21905662119 0.071175813675 0.079072311521 0.1697448194 0.055153436959 0.045197341591 \n0.11580283195 0.037626620382 0.020318534225 0.058702033013 0.019073447213 0.0051145111211 0.049934931099 0.036279853433 0.74488550425 \n0.098507769406 0.071570083499 0.72968149185 0.14439357817 0.10490807146 0.70480263233 0.18634068966 0.13538444042 0.67092770338 \n0.22320492566 0.16216787696 0.62898057699 0.253980726 0.18452778459 0.58010554314 0.27782857418 0.20185427368 0.5256357789 \n0.2940979898 0.2136746943 0.46705704927 0.30234518647 0.21966663003 0.40596726537 0.30234518647 0.21966663003 0.34403273463 \n0.2940979898 0.2136746943 0.28294295073 0.27782857418 0.20185427368 0.2243642211 0.253980726 0.18452778459 0.16989444196 \n0.22320492566 0.16216787696 0.12101940811 0.18634068966 0.13538444042 0.079072311521 0.14439357817 0.10490807146 0.045197341591 \n0.098507769406 0.071570083499 0.020318534225 0.049934931099 0.036279853433 0.0051145111211 0.036279853433 0.049934931099 0.74488550425 \n0.071570083499 0.098507769406 0.72968149185 0.10490807146 0.14439357817 0.70480263233 0.13538444042 0.18634068966 0.67092770338 \n0.16216787696 0.22320492566 0.62898057699 0.18452778459 0.253980726 0.58010554314 0.20185427368 0.27782857418 0.5256357789 \n0.2136746943 0.2940979898 0.46705704927 0.21966663003 0.30234518647 0.40596726537 0.21966663003 0.30234518647 0.34403273463 \n0.2136746943 0.2940979898 0.28294295073 0.20185427368 0.27782857418 0.2243642211 0.18452778459 0.253980726 0.16989444196 \n0.16216787696 0.22320492566 0.12101940811 0.13538444042 0.18634068966 0.079072311521 0.10490807146 0.14439357817 0.045197341591 \n0.071570083499 0.098507769406 0.020318534225 0.036279853433 0.049934931099 0.0051145111211 0.019073447213 0.058702033013 0.74488550425 \n0.037626620382 0.11580283195 0.72968149185 0.055153436959 0.1697448194 0.70480263233 0.071175813675 0.21905662119 0.67092770338 \n0.085256695747 0.26239314675 0.62898057699 0.097011998296 0.29857224226 0.58010554314 0.10612107068 0.32660707831 0.5256357789 \n0.11233543605 0.34573292732 0.46705704927 0.11548557878 0.35542806983 0.40596726537 0.11548557878 0.35542806983 0.34403273463 \n0.11233543605 0.34573292732 0.28294295073 0.10612107068 0.32660707831 0.2243642211 0.097011998296 0.29857224226 0.16989444196 \n0.085256695747 0.26239314675 0.12101940811 0.071175813675 0.21905662119 0.079072311521 0.055153436959 0.1697448194 0.045197341591 \n0.037626620382 0.11580283195 0.020318534225 0.019073447213 0.058702033013 0.0051145111211 3.7794419855e-18 0.061722971499 0.74488550425 \n7.4557907969e-18 0.12176229805 0.72968149185 1.0928764847e-17 0.17848026752 0.70480263233 1.4103631276e-17 0.23032976687 0.67092770338 \n1.6893785928e-17 0.27589645982 0.62898057699 1.9223123225e-17 0.31393742561 0.58010554314 2.1028104113e-17 0.34341499209 0.5256357789 \n2.225949315e-17 0.3635250926 0.46705704927 2.2883700183e-17 0.37371918559 0.40596726537 2.2883700183e-17 0.37371918559 0.34403273463 \n2.225949315e-17 0.3635250926 0.28294295073 2.1028104113e-17 0.34341499209 0.2243642211 1.9223123225e-17 0.31393742561 0.16989444196 \n1.6893785928e-17 0.27589645982 0.12101940811 1.4103631276e-17 0.23032976687 0.079072311521 1.0928764847e-17 0.17848026752 0.045197341591 \n7.4557907969e-18 0.12176229805 0.020318534225 3.7794419855e-18 0.061722971499 0.0051145111211 -0.019073447213 0.058702033013 0.74488550425 \n-0.037626620382 0.11580283195 0.72968149185 -0.055153436959 0.1697448194 0.70480263233 -0.071175813675 0.21905662119 0.67092770338 \n-0.085256695747 0.26239314675 0.62898057699 -0.097011998296 0.29857224226 0.58010554314 -0.10612107068 0.32660707831 0.5256357789 \n-0.11233543605 0.34573292732 0.46705704927 -0.11548557878 0.35542806983 0.40596726537 -0.11548557878 0.35542806983 0.34403273463 \n-0.11233543605 0.34573292732 0.28294295073 -0.10612107068 0.32660707831 0.2243642211 -0.097011998296 0.29857224226 0.16989444196 \n-0.085256695747 0.26239314675 0.12101940811 -0.071175813675 0.21905662119 0.079072311521 -0.055153436959 0.1697448194 0.045197341591 \n-0.037626620382 0.11580283195 0.020318534225 -0.019073447213 0.058702033013 0.0051145111211 -0.036279853433 0.049934931099 0.74488550425 \n-0.071570083499 0.098507769406 0.72968149185 -0.10490807146 0.14439357817 0.70480263233 -0.13538444042 0.18634068966 0.67092770338 \n-0.16216787696 0.22320492566 0.62898057699 -0.18452778459 0.253980726 0.58010554314 -0.20185427368 0.27782857418 0.5256357789 \n-0.2136746943 0.2940979898 0.46705704927 -0.21966663003 0.30234518647 0.40596726537 -0.21966663003 0.30234518647 0.34403273463 \n-0.2136746943 0.2940979898 0.28294295073 -0.20185427368 0.27782857418 0.2243642211 -0.18452778459 0.253980726 0.16989444196 \n-0.16216787696 0.22320492566 0.12101940811 -0.13538444042 0.18634068966 0.079072311521 -0.10490807146 0.14439357817 0.045197341591 \n-0.071570083499 0.098507769406 0.020318534225 -0.036279853433 0.049934931099 0.0051145111211 -0.049934931099 0.036279853433 0.74488550425 \n-0.098507769406 0.071570083499 0.72968149185 -0.14439357817 0.10490807146 0.70480263233 -0.18634068966 0.13538444042 0.67092770338 \n-0.22320492566 0.16216787696 0.62898057699 -0.253980726 0.18452778459 0.58010554314 -0.27782857418 0.20185427368 0.5256357789 \n-0.2940979898 0.2136746943 0.46705704927 -0.30234518647 0.21966663003 0.40596726537 -0.30234518647 0.21966663003 0.34403273463 \n-0.2940979898 0.2136746943 0.28294295073 -0.27782857418 0.20185427368 0.2243642211 -0.253980726 0.18452778459 0.16989444196 \n-0.22320492566 0.16216787696 0.12101940811 -0.18634068966 0.13538444042 0.079072311521 -0.14439357817 0.10490807146 0.045197341591 \n-0.098507769406 0.071570083499 0.020318534225 -0.049934931099 0.036279853433 0.0051145111211 -0.058702033013 0.019073447213 0.74488550425 \n-0.11580283195 0.037626620382 0.72968149185 -0.1697448194 0.055153436959 0.70480263233 -0.21905662119 0.071175813675 0.67092770338 \n-0.26239314675 0.085256695747 0.62898057699 -0.29857224226 0.097011998296 0.58010554314 -0.32660707831 0.10612107068 0.5256357789 \n-0.34573292732 0.11233543605 0.46705704927 -0.35542806983 0.11548557878 0.40596726537 -0.35542806983 0.11548557878 0.34403273463 \n-0.34573292732 0.11233543605 0.28294295073 -0.32660707831 0.10612107068 0.2243642211 -0.29857224226 0.097011998296 0.16989444196 \n-0.26239314675 0.085256695747 0.12101940811 -0.21905662119 0.071175813675 0.079072311521 -0.1697448194 0.055153436959 0.045197341591 \n-0.11580283195 0.037626620382 0.020318534225 -0.058702033013 0.019073447213 0.0051145111211 -0.061722971499 7.558883971e-18 0.74488550425 \n-0.12176229805 1.4911581594e-17 0.72968149185 -0.17848026752 2.1857529694e-17 0.70480263233 -0.23032976687 2.8207262552e-17 0.67092770338 \n-0.27589645982 3.3787571857e-17 0.62898057699 -0.31393742561 3.8446246449e-17 0.58010554314 -0.34341499209 4.2056208226e-17 0.5256357789 \n-0.3635250926 4.4518986299e-17 0.46705704927 -0.37371918559 4.5767400367e-17 0.40596726537 -0.37371918559 4.5767400367e-17 0.34403273463 \n-0.3635250926 4.4518986299e-17 0.28294295073 -0.34341499209 4.2056208226e-17 0.2243642211 -0.31393742561 3.8446246449e-17 0.16989444196 \n-0.27589645982 3.3787571857e-17 0.12101940811 -0.23032976687 2.8207262552e-17 0.079072311521 -0.17848026752 2.1857529694e-17 0.045197341591 \n-0.12176229805 1.4911581594e-17 0.020318534225 -0.061722971499 7.558883971e-18 0.0051145111211 -0.058702033013 -0.019073447213 0.74488550425 \n-0.11580283195 -0.037626620382 0.72968149185 -0.1697448194 -0.055153436959 0.70480263233 -0.21905662119 -0.071175813675 0.67092770338 \n-0.26239314675 -0.085256695747 0.62898057699 -0.29857224226 -0.097011998296 0.58010554314 -0.32660707831 -0.10612107068 0.5256357789 \n-0.34573292732 -0.11233543605 0.46705704927 -0.35542806983 -0.11548557878 0.40596726537 -0.35542806983 -0.11548557878 0.34403273463 \n-0.34573292732 -0.11233543605 0.28294295073 -0.32660707831 -0.10612107068 0.2243642211 -0.29857224226 -0.097011998296 0.16989444196 \n-0.26239314675 -0.085256695747 0.12101940811 -0.21905662119 -0.071175813675 0.079072311521 -0.1697448194 -0.055153436959 0.045197341591 \n-0.11580283195 -0.037626620382 0.020318534225 -0.058702033013 -0.019073447213 0.0051145111211 -0.049934931099 -0.036279853433 0.74488550425 \n-0.098507769406 -0.071570083499 0.72968149185 -0.14439357817 -0.10490807146 0.70480263233 -0.18634068966 -0.13538444042 0.67092770338 \n-0.22320492566 -0.16216787696 0.62898057699 -0.253980726 -0.18452778459 0.58010554314 -0.27782857418 -0.20185427368 0.5256357789 \n-0.2940979898 -0.2136746943 0.46705704927 -0.30234518647 -0.21966663003 0.40596726537 -0.30234518647 -0.21966663003 0.34403273463 \n-0.2940979898 -0.2136746943 0.28294295073 -0.27782857418 -0.20185427368 0.2243642211 -0.253980726 -0.18452778459 0.16989444196 \n-0.22320492566 -0.16216787696 0.12101940811 -0.18634068966 -0.13538444042 0.079072311521 -0.14439357817 -0.10490807146 0.045197341591 \n-0.098507769406 -0.071570083499 0.020318534225 -0.049934931099 -0.036279853433 0.0051145111211 -0.036279853433 -0.049934931099 0.74488550425 \n-0.071570083499 -0.098507769406 0.72968149185 -0.10490807146 -0.14439357817 0.70480263233 -0.13538444042 -0.18634068966 0.67092770338 \n-0.16216787696 -0.22320492566 0.62898057699 -0.18452778459 -0.253980726 0.58010554314 -0.20185427368 -0.27782857418 0.5256357789 \n-0.2136746943 -0.2940979898 0.46705704927 -0.21966663003 -0.30234518647 0.40596726537 -0.21966663003 -0.30234518647 0.34403273463 \n-0.2136746943 -0.2940979898 0.28294295073 -0.20185427368 -0.27782857418 0.2243642211 -0.18452778459 -0.253980726 0.16989444196 \n-0.16216787696 -0.22320492566 0.12101940811 -0.13538444042 -0.18634068966 0.079072311521 -0.10490807146 -0.14439357817 0.045197341591 \n-0.071570083499 -0.098507769406 0.020318534225 -0.036279853433 -0.049934931099 0.0051145111211 -0.019073447213 -0.058702033013 0.74488550425 \n-0.037626620382 -0.11580283195 0.72968149185 -0.055153436959 -0.1697448194 0.70480263233 -0.071175813675 -0.21905662119 0.67092770338 \n-0.085256695747 -0.26239314675 0.62898057699 -0.097011998296 -0.29857224226 0.58010554314 -0.10612107068 -0.32660707831 0.5256357789 \n-0.11233543605 -0.34573292732 0.46705704927 -0.11548557878 -0.35542806983 0.40596726537 -0.11548557878 -0.35542806983 0.34403273463 \n-0.11233543605 -0.34573292732 0.28294295073 -0.10612107068 -0.32660707831 0.2243642211 -0.097011998296 -0.29857224226 0.16989444196 \n-0.085256695747 -0.26239314675 0.12101940811 -0.071175813675 -0.21905662119 0.079072311521 -0.055153436959 -0.1697448194 0.045197341591 \n-0.037626620382 -0.11580283195 0.020318534225 -0.019073447213 -0.058702033013 0.0051145111211 -1.1338325956e-17 -0.061722971499 0.74488550425 \n-2.2367372391e-17 -0.12176229805 0.72968149185 -3.2786292887e-17 -0.17848026752 0.70480263233 -4.231089052e-17 -0.23032976687 0.67092770338 \n-5.068135944e-17 -0.27589645982 0.62898057699 -5.7669371329e-17 -0.31393742561 0.58010554314 -6.3084313994e-17 -0.34341499209 0.5256357789 \n-6.677847614e-17 -0.3635250926 0.46705704927 -6.865110055e-17 -0.37371918559 0.40596726537 -6.865110055e-17 -0.37371918559 0.34403273463 \n-6.677847614e-17 -0.3635250926 0.28294295073 -6.3084313994e-17 -0.34341499209 0.2243642211 -5.7669371329e-17 -0.31393742561 0.16989444196 \n-5.068135944e-17 -0.27589645982 0.12101940811 -4.231089052e-17 -0.23032976687 0.079072311521 -3.2786292887e-17 -0.17848026752 0.045197341591 \n-2.2367372391e-17 -0.12176229805 0.020318534225 -1.1338325956e-17 -0.061722971499 0.0051145111211 0.019073447213 -0.058702033013 0.74488550425 \n0.037626620382 -0.11580283195 0.72968149185 0.055153436959 -0.1697448194 0.70480263233 0.071175813675 -0.21905662119 0.67092770338 \n0.085256695747 -0.26239314675 0.62898057699 0.097011998296 -0.29857224226 0.58010554314 0.10612107068 -0.32660707831 0.5256357789 \n0.11233543605 -0.34573292732 0.46705704927 0.11548557878 -0.35542806983 0.40596726537 0.11548557878 -0.35542806983 0.34403273463 \n0.11233543605 -0.34573292732 0.28294295073 0.10612107068 -0.32660707831 0.2243642211 0.097011998296 -0.29857224226 0.16989444196 \n0.085256695747 -0.26239314675 0.12101940811 0.071175813675 -0.21905662119 0.079072311521 0.055153436959 -0.1697448194 0.045197341591 \n0.037626620382 -0.11580283195 0.020318534225 0.019073447213 -0.058702033013 0.0051145111211 0.036279853433 -0.049934931099 0.74488550425 \n0.071570083499 -0.098507769406 0.72968149185 0.10490807146 -0.14439357817 0.70480263233 0.13538444042 -0.18634068966 0.67092770338 \n0.16216787696 -0.22320492566 0.62898057699 0.18452778459 -0.253980726 0.58010554314 0.20185427368 -0.27782857418 0.5256357789 \n0.2136746943 -0.2940979898 0.46705704927 0.21966663003 -0.30234518647 0.40596726537 0.21966663003 -0.30234518647 0.34403273463 \n0.2136746943 -0.2940979898 0.28294295073 0.20185427368 -0.27782857418 0.2243642211 0.18452778459 -0.253980726 0.16989444196 \n0.16216787696 -0.22320492566 0.12101940811 0.13538444042 -0.18634068966 0.079072311521 0.10490807146 -0.14439357817 0.045197341591 \n0.071570083499 -0.098507769406 0.020318534225 0.036279853433 -0.049934931099 0.0051145111211 0.049934931099 -0.036279853433 0.74488550425 \n0.098507769406 -0.071570083499 0.72968149185 0.14439357817 -0.10490807146 0.70480263233 0.18634068966 -0.13538444042 0.67092770338 \n0.22320492566 -0.16216787696 0.62898057699 0.253980726 -0.18452778459 0.58010554314 0.27782857418 -0.20185427368 0.5256357789 \n0.2940979898 -0.2136746943 0.46705704927 0.30234518647 -0.21966663003 0.40596726537 0.30234518647 -0.21966663003 0.34403273463 \n0.2940979898 -0.2136746943 0.28294295073 0.27782857418 -0.20185427368 0.2243642211 0.253980726 -0.18452778459 0.16989444196 \n0.22320492566 -0.16216787696 0.12101940811 0.18634068966 -0.13538444042 0.079072311521 0.14439357817 -0.10490807146 0.045197341591 \n0.098507769406 -0.071570083499 0.020318534225 0.049934931099 -0.036279853433 0.0051145111211 0.058702033013 -0.019073447213 0.74488550425 \n0.11580283195 -0.037626620382 0.72968149185 0.1697448194 -0.055153436959 0.70480263233 0.21905662119 -0.071175813675 0.67092770338 \n0.26239314675 -0.085256695747 0.62898057699 0.29857224226 -0.097011998296 0.58010554314 0.32660707831 -0.10612107068 0.5256357789 \n0.34573292732 -0.11233543605 0.46705704927 0.35542806983 -0.11548557878 0.40596726537 0.35542806983 -0.11548557878 0.34403273463 \n0.34573292732 -0.11233543605 0.28294295073 0.32660707831 -0.10612107068 0.2243642211 0.29857224226 -0.097011998296 0.16989444196 \n0.26239314675 -0.085256695747 0.12101940811 0.21905662119 -0.071175813675 0.079072311521 0.1697448194 -0.055153436959 0.045197341591 \n0.11580283195 -0.037626620382 0.020318534225 0.058702033013 -0.019073447213 0.0051145111211 \nPOLYGONS 2601 7880\nOFFSETS vtktypeint64\n0 3 6 9 12 15 18 21 24 \n27 30 33 36 39 42 45 48 51 \n54 57 60 63 66 69 72 75 78 \n81 84 87 90 93 96 99 102 105 \n108 111 114 117 120 123 126 129 132 \n135 138 141 144 147 150 153 156 159 \n162 165 168 171 174 177 180 183 186 \n189 192 195 198 201 204 207 210 213 \n216 219 222 225 228 231 234 237 240 \n243 246 249 252 255 258 261 264 267 \n270 273 276 279 282 285 288 291 294 \n297 300 303 306 309 312 315 318 321 \n324 327 330 333 336 339 342 345 348 \n351 354 357 360 363 366 369 372 375 \n378 381 384 387 390 393 396 399 402 \n405 408 411 414 417 420 423 426 429 \n432 435 438 441 444 447 450 453 456 \n459 462 465 468 471 474 477 480 483 \n486 489 492 495 498 501 504 507 510 \n513 516 519 522 525 528 531 534 537 \n540 543 546 549 552 555 558 561 564 \n567 570 573 576 579 582 585 588 591 \n594 597 600 603 606 609 612 615 618 \n621 624 627 630 633 636 639 642 645 \n648 651 654 657 660 663 666 669 672 \n675 678 681 684 687 690 693 696 699 \n702 705 708 711 714 717 720 723 726 \n729 732 735 738 741 744 747 750 753 \n756 759 762 765 768 771 774 777 780 \n783 786 789 792 795 798 801 804 807 \n810 813 816 819 822 825 828 831 834 \n837 840 843 846 849 852 855 858 861 \n864 867 870 873 876 879 882 885 888 \n891 894 897 900 903 906 909 912 915 \n918 921 924 927 930 933 936 939 942 \n945 948 951 954 957 960 963 966 969 \n972 975 978 981 984 987 990 993 996 \n999 1002 1005 1008 1011 1014 1017 1020 1023 \n1026 1029 1032 1035 1038 1041 1044 1047 1050 \n1053 1056 1059 1062 1065 1068 1071 1074 1077 \n1080 1083 1086 1089 1092 1095 1098 1101 1104 \n1107 1110 1113 1116 1119 1122 1125 1128 1131 \n1134 1137 1140 1143 1146 1149 1152 1155 1158 \n1161 1164 1167 1170 1173 1176 1179 1182 1185 \n1188 1191 1194 1197 1200 1203 1206 1209 1212 \n1215 1218 1221 1224 1227 1230 1233 1236 1239 \n1242 1245 1248 1251 1254 1257 1260 1263 1266 \n1269 1272 1275 1278 1281 1284 1287 1290 1293 \n1296 1299 1302 1305 1308 1311 1314 1317 1320 \n1323 1326 1329 1332 1335 1338 1341 1344 1347 \n1350 1353 1356 1359 1362 1365 1368 1371 1374 \n1377 1380 1383 1386 1389 1392 1395 1398 1401 \n1404 1407 1410 1413 1416 1419 1422 1425 1428 \n1431 1434 1437 1440 1443 1446 1449 1452 1455 \n1458 1461 1464 1467 1470 1473 1476 1479 1482 \n1485 1488 1491 1494 1497 1500 1503 1506 1509 \n1512 1515 1518 1521 1524 1527 1530 1533 1536 \n1539 1542 1545 1548 1551 1554 1557 1560 1563 \n1566 1569 1572 1575 1578 1581 1584 1587 1590 \n1593 1596 1599 1602 1605 1608 1611 1614 1617 \n1620 1624 1628 1632 1636 1640 1644 1648 1652 \n1656 1660 1664 1668 1672 1676 1680 1684 1688 \n1692 1696 1700 1704 1708 1712 1716 1720 1724 \n1728 1732 1736 1740 1744 1748 1752 1756 1760 \n1764 1768 1772 1776 1780 1783 1786 1789 1792 \n1795 1798 1801 1804 1807 1810 1813 1816 1819 \n1822 1825 1828 1831 1834 1837 1840 1843 1846 \n1849 1852 1855 1858 1861 1864 1867 1870 1873 \n1876 1879 1882 1885 1888 1891 1894 1897 1900 \n1903 1906 1909 1912 1915 1918 1921 1924 1927 \n1930 1933 1936 1939 1942 1945 1948 1951 1954 \n1957 1960 1963 1966 1969 1972 1975 1978 1981 \n1984 1987 1990 1993 1996 1999 2002 2005 2008 \n2011 2014 2017 2020 2023 2026 2029 2032 2035 \n2038 2041 2044 2047 2050 2053 2056 2059 2062 \n2065 2068 2071 2074 2077 2080 2083 2086 2089 \n2092 2095 2098 2101 2104 2107 2110 2113 2116 \n2119 2122 2125 2128 2131 2134 2137 2140 2143 \n2146 2149 2152 2155 2158 2161 2164 2167 2170 \n2173 2176 2179 2182 2185 2188 2191 2194 2197 \n2200 2203 2206 2209 2212 2215 2218 2221 2224 \n2227 2230 2233 2236 2239 2242 2245 2248 2251 \n2254 2257 2260 2263 2266 2269 2272 2275 2278 \n2281 2284 2287 2290 2293 2296 2299 2302 2305 \n2308 2311 2314 2317 2320 2323 2326 2329 2332 \n2335 2338 2341 2344 2347 2350 2353 2356 2359 \n2362 2365 2368 2371 2374 2377 2380 2383 2386 \n2389 2392 2395 2398 2401 2404 2407 2410 2413 \n2416 2419 2422 2425 2428 2431 2434 2437 2440 \n2443 2446 2449 2452 2455 2458 2461 2464 2467 \n2470 2473 2476 2479 2482 2485 2488 2491 2494 \n2497 2500 2503 2506 2509 2512 2515 2518 2521 \n2524 2527 2530 2533 2536 2539 2542 2545 2548 \n2551 2554 2557 2560 2563 2566 2569 2572 2575 \n2578 2581 2584 2587 2590 2593 2596 2599 2602 \n2605 2608 2611 2614 2617 2620 2623 2626 2629 \n2632 2635 2638 2641 2644 2647 2650 2653 2656 \n2659 2662 2665 2668 2671 2674 2677 2680 2683 \n2686 2689 2692 2695 2698 2701 2704 2707 2710 \n2713 2716 2719 2722 2725 2728 2731 2734 2737 \n2740 2743 2746 2749 2752 2755 2758 2761 2764 \n2767 2770 2773 2776 2779 2782 2785 2788 2791 \n2794 2797 2800 2803 2806 2809 2812 2815 2818 \n2821 2824 2827 2830 2833 2836 2839 2842 2845 \n2848 2851 2854 2857 2860 2863 2866 2869 2872 \n2875 2878 2881 2884 2887 2890 2893 2896 2899 \n2902 2905 2908 2911 2914 2917 2920 2923 2926 \n2929 2932 2935 2938 2941 2944 2947 2950 2953 \n2956 2959 2962 2965 2968 2971 2974 2977 2980 \n2983 2986 2989 2992 2995 2998 3001 3004 3007 \n3010 3013 3016 3019 3022 3025 3028 3031 3034 \n3037 3040 3043 3046 3049 3052 3055 3058 3061 \n3064 3067 3070 3073 3076 3079 3082 3085 3088 \n3091 3094 3097 3100 3103 3106 3109 3112 3115 \n3118 3121 3124 3127 3130 3133 3136 3139 3142 \n3145 3148 3151 3154 3157 3160 3163 3166 3169 \n3172 3175 3178 3181 3184 3187 3190 3193 3196 \n3199 3202 3205 3208 3211 3214 3217 3220 3223 \n3226 3229 3232 3235 3238 3241 3244 3247 3250 \n3253 3256 3259 3262 3265 3268 3271 3274 3277 \n3280 3283 3286 3289 3292 3295 3298 3301 3304 \n3307 3310 3313 3316 3319 3322 3325 3328 3331 \n3334 3337 3340 3343 3346 3349 3352 3355 3358 \n3361 3364 3367 3370 3373 3376 3379 3382 3385 \n3388 3391 3394 3397 3400 3404 3408 3412 3416 \n3420 3424 3428 3432 3436 3440 3444 3448 3452 \n3456 3460 3464 3468 3472 3476 3480 3484 3488 \n3492 3496 3500 3504 3508 3512 3516 3520 3524 \n3528 3532 3536 3540 3544 3548 3552 3556 3560 \n3563 3566 3569 3572 3575 3578 3581 3584 3587 \n3590 3593 3596 3599 3602 3605 3608 3611 3614 \n3617 3620 3623 3626 3629 3632 3635 3638 3641 \n3644 3647 3650 3653 3656 3659 3662 3665 3668 \n3671 3674 3677 3680 3683 3686 3689 3692 3695 \n3698 3701 3704 3707 3710 3713 3716 3719 3722 \n3725 3728 3731 3734 3737 3740 3743 3746 3749 \n3752 3755 3758 3761 3764 3767 3770 3773 3776 \n3779 3782 3785 3788 3791 3794 3797 3800 3803 \n3806 3809 3812 3815 3818 3821 3824 3827 3830 \n3833 3836 3839 3842 3845 3848 3851 3854 3857 \n3860 3863 3866 3869 3872 3875 3878 3881 3884 \n3887 3890 3893 3896 3899 3902 3905 3908 3911 \n3914 3917 3920 3923 3926 3929 3932 3935 3938 \n3941 3944 3947 3950 3953 3956 3959 3962 3965 \n3968 3971 3974 3977 3980 3983 3986 3989 3992 \n3995 3998 4001 4004 4007 4010 4013 4016 4019 \n4022 4025 4028 4031 4034 4037 4040 4043 4046 \n4049 4052 4055 4058 4061 4064 4067 4070 4073 \n4076 4079 4082 4085 4088 4091 4094 4097 4100 \n4103 4106 4109 4112 4115 4118 4121 4124 4127 \n4130 4133 4136 4139 4142 4145 4148 4151 4154 \n4157 4160 4163 4166 4169 4172 4175 4178 4181 \n4184 4187 4190 4193 4196 4199 4202 4205 4208 \n4211 4214 4217 4220 4223 4226 4229 4232 4235 \n4238 4241 4244 4247 4250 4253 4256 4259 4262 \n4265 4268 4271 4274 4277 4280 4283 4286 4289 \n4292 4295 4298 4301 4304 4307 4310 4313 4316 \n4319 4322 4325 4328 4331 4334 4337 4340 4343 \n4346 4349 4352 4355 4358 4361 4364 4367 4370 \n4373 4376 4379 4382 4385 4388 4391 4394 4397 \n4400 4403 4406 4409 4412 4415 4418 4421 4424 \n4427 4430 4433 4436 4439 4442 4445 4448 4451 \n4454 4457 4460 4463 4466 4469 4472 4475 4478 \n4481 4484 4487 4490 4493 4496 4499 4502 4505 \n4508 4511 4514 4517 4520 4523 4526 4529 4532 \n4535 4538 4541 4544 4547 4550 4553 4556 4559 \n4562 4565 4568 4571 4574 4577 4580 4583 4586 \n4589 4592 4595 4598 4601 4604 4607 4610 4613 \n4616 4619 4622 4625 4628 4631 4634 4637 4640 \n4643 4646 4649 4652 4655 4658 4661 4664 4667 \n4670 4673 4676 4679 4682 4685 4688 4691 4694 \n4697 4700 4703 4706 4709 4712 4715 4718 4721 \n4724 4727 4730 4733 4736 4739 4742 4745 4748 \n4751 4754 4757 4760 4763 4766 4769 4772 4775 \n4778 4781 4784 4787 4790 4793 4796 4799 4802 \n4805 4808 4811 4814 4817 4820 4823 4826 4829 \n4832 4835 4838 4841 4844 4847 4850 4853 4856 \n4859 4862 4865 4868 4871 4874 4877 4880 4883 \n4886 4889 4892 4895 4898 4901 4904 4907 4910 \n4913 4916 4919 4922 4925 4928 4931 4934 4937 \n4940 4943 4946 4949 4952 4955 4958 4961 4964 \n4967 4970 4973 4976 4979 4982 4985 4988 4991 \n4994 4997 5000 5003 5006 5009 5012 5015 5018 \n5021 5024 5027 5030 5033 5036 5039 5042 5045 \n5048 5051 5054 5057 5060 5063 5066 5069 5072 \n5075 5078 5081 5084 5087 5090 5093 5096 5099 \n5102 5105 5108 5111 5114 5117 5120 5123 5126 \n5129 5132 5135 5138 5141 5144 5147 5150 5153 \n5156 5159 5162 5165 5168 5171 5174 5177 5180 \n5183 5186 5189 5192 5195 5198 5201 5204 5207 \n5210 5213 5216 5219 5222 5225 5228 5231 5234 \n5237 5240 5243 5246 5249 5252 5255 5258 5261 \n5264 5267 5270 5273 5276 5279 5282 5285 5288 \n5291 5294 5297 5300 5303 5306 5309 5312 5315 \n5318 5321 5324 5327 5330 5333 5336 5339 5342 \n5345 5348 5351 5354 5357 5360 5363 5366 5369 \n5372 5375 5378 5381 5384 5387 5390 5393 5396 \n5399 5402 5405 5408 5411 5414 5417 5420 5423 \n5426 5429 5432 5435 5438 5441 5444 5447 5450 \n5453 5456 5459 5462 5465 5468 5471 5474 5477 \n5480 5483 5486 5489 5492 5495 5498 5501 5504 \n5507 5510 5513 5516 5519 5522 5525 5528 5531 \n5534 5537 5540 5543 5546 5549 5552 5555 5558 \n5561 5564 5567 5570 5573 5576 5579 5582 5585 \n5588 5591 5594 5597 5600 5603 5606 5609 5612 \n5615 5618 5621 5624 5627 5630 5633 5636 5639 \n5642 5645 5648 5651 5654 5657 5660 5663 5666 \n5669 5672 5675 5678 5681 5684 5687 5690 5693 \n5696 5699 5702 5705 5708 5711 5714 5717 5720 \n5723 5726 5729 5732 5735 5738 5741 5744 5747 \n5750 5753 5756 5759 5762 5765 5768 5771 5774 \n5777 5780 5783 5786 5789 5792 5795 5798 5801 \n5804 5807 5810 5813 5816 5819 5822 5825 5828 \n5831 5834 5837 5840 5843 5846 5849 5852 5855 \n5858 5861 5864 5867 5870 5873 5876 5879 5882 \n5885 5888 5891 5894 5897 5900 5903 5906 5909 \n5912 5915 5918 5921 5924 5927 5930 5933 5936 \n5939 5942 5945 5948 5951 5954 5957 5960 5963 \n5966 5969 5972 5975 5978 5981 5984 5987 5990 \n5993 5996 5999 6002 6005 6008 6011 6014 6017 \n6020 6023 6026 6029 6032 6035 6038 6041 6044 \n6047 6050 6053 6056 6059 6062 6065 6068 6071 \n6074 6077 6080 6083 6086 6089 6092 6095 6098 \n6101 6104 6107 6110 6113 6116 6119 6122 6125 \n6128 6131 6134 6137 6140 6143 6146 6149 6152 \n6155 6158 6161 6164 6167 6170 6173 6176 6179 \n6182 6185 6188 6191 6194 6197 6200 6203 6206 \n6209 6212 6215 6218 6221 6224 6227 6230 6233 \n6236 6239 6242 6245 6248 6251 6254 6257 6260 \n6263 6266 6269 6272 6275 6278 6281 6284 6287 \n6290 6293 6296 6299 6302 6305 6308 6311 6314 \n6317 6320 6323 6326 6329 6332 6335 6338 6341 \n6344 6347 6350 6353 6356 6359 6362 6365 6368 \n6371 6374 6377 6380 6383 6386 6389 6392 6395 \n6398 6401 6404 6407 6410 6413 6416 6419 6422 \n6425 6428 6431 6434 6437 6440 6443 6446 6449 \n6452 6455 6458 6461 6464 6467 6470 6473 6476 \n6479 6482 6485 6488 6491 6494 6497 6500 6503 \n6506 6509 6512 6515 6518 6521 6524 6527 6530 \n6533 6536 6539 6542 6545 6548 6551 6554 6557 \n6560 6563 6566 6569 6572 6575 6578 6581 6584 \n6587 6590 6593 6596 6599 6602 6605 6608 6611 \n6614 6617 6620 6623 6626 6629 6632 6635 6638 \n6641 6644 6647 6650 6653 6656 6659 6662 6665 \n6668 6671 6674 6677 6680 6683 6686 6689 6692 \n6695 6698 6701 6704 6707 6710 6713 6716 6719 \n6722 6725 6728 6731 6734 6737 6740 6743 6746 \n6749 6752 6755 6758 6761 6764 6767 6770 6773 \n6776 6779 6782 6785 6788 6791 6794 6797 6800 \n6803 6806 6809 6812 6815 6818 6821 6824 6827 \n6830 6833 6836 6839 6842 6845 6848 6851 6854 \n6857 6860 6863 6866 6869 6872 6875 6878 6881 \n6884 6887 6890 6893 6896 6899 6902 6905 6908 \n6911 6914 6917 6920 6923 6926 6929 6932 6935 \n6938 6941 6944 6947 6950 6953 6956 6959 6962 \n6965 6968 6971 6974 6977 6980 6983 6986 6989 \n6992 6995 6998 7001 7004 7007 7010 7013 7016 \n7019 7022 7025 7028 7031 7034 7037 7040 7043 \n7046 7049 7052 7055 7058 7061 7064 7067 7070 \n7073 7076 7079 7082 7085 7088 7091 7094 7097 \n7100 7103 7106 7109 7112 7115 7118 7121 7124 \n7127 7130 7133 7136 7139 7142 7145 7148 7151 \n7154 7157 7160 7163 7166 7169 7172 7175 7178 \n7181 7184 7187 7190 7193 7196 7199 7202 7205 \n7208 7211 7214 7217 7220 7223 7226 7229 7232 \n7235 7238 7241 7244 7247 7250 7253 7256 7259 \n7262 7265 7268 7271 7274 7277 7280 7283 7286 \n7289 7292 7295 7298 7301 7304 7307 7310 7313 \n7316 7319 7322 7325 7328 7331 7334 7337 7340 \n7343 7346 7349 7352 7355 7358 7361 7364 7367 \n7370 7373 7376 7379 7382 7385 7388 7391 7394 \n7397 7400 7403 7406 7409 7412 7415 7418 7421 \n7424 7427 7430 7433 7436 7439 7442 7445 7448 \n7451 7454 7457 7460 7463 7466 7469 7472 7475 \n7478 7481 7484 7487 7490 7493 7496 7499 7502 \n7505 7508 7511 7514 7517 7520 7523 7526 7529 \n7532 7535 7538 7541 7544 7547 7550 7553 7556 \n7559 7562 7565 7568 7571 7574 7577 7580 7583 \n7586 7589 7592 7595 7598 7601 7604 7607 7610 \n7613 7616 7619 7622 7625 7628 7631 7634 7637 \n7640 7643 7646 7649 7652 7655 7658 7661 7664 \n7667 7670 7673 7676 7679 7682 7685 7688 7691 \n7694 7697 7700 7703 7706 7709 7712 7715 7718 \n7721 7724 7727 7730 7733 7736 7739 7742 7745 \n7748 7751 7754 7757 7760 7763 7766 7769 7772 \n7775 7778 7781 7784 7787 7790 7793 7796 7799 \n7802 7805 7808 7811 7814 7817 7820 7823 7826 \n7829 7832 7835 7838 7841 7844 7847 7850 7853 \n7856 7859 7862 7865 7868 7871 7874 7877 7880 \n\nCONNECTIVITY vtktypeint64\n0 1 2 2 1 3 3 1 4 \n4 1 5 5 1 6 6 1 7 \n7 1 8 8 1 9 9 1 10 \n10 1 11 11 1 12 12 1 13 \n13 1 14 14 1 15 15 1 16 \n16 1 17 17 1 18 18 1 19 \n19 1 20 20 1 0 21 22 23 \n21 23 24 22 25 26 22 26 23 \n25 27 28 25 28 26 27 29 30 \n27 30 28 29 31 32 29 32 30 \n31 33 34 31 34 32 33 35 36 \n33 36 34 35 37 38 35 38 36 \n37 39 40 37 40 38 39 41 42 \n39 42 40 41 43 44 41 44 42 \n43 45 46 43 46 44 45 0 2 \n45 2 46 24 23 47 24 47 48 \n23 26 49 23 49 47 26 28 50 \n26 50 49 28 30 51 28 51 50 \n30 32 52 30 52 51 32 34 53 \n32 53 52 34 36 54 34 54 53 \n36 38 55 36 55 54 38 40 56 \n38 56 55 40 42 57 40 57 56 \n42 44 58 42 58 57 44 46 59 \n44 59 58 46 2 3 46 3 59 \n48 47 60 48 60 61 47 49 62 \n47 62 60 49 50 63 49 63 62 \n50 51 64 50 64 63 51 52 65 \n51 65 64 52 53 66 52 66 65 \n53 54 67 53 67 66 54 55 68 \n54 68 67 55 56 69 55 69 68 \n56 57 70 56 70 69 57 58 71 \n57 71 70 58 59 72 58 72 71 \n59 3 4 59 4 72 61 60 73 \n61 73 74 60 62 75 60 75 73 \n62 63 76 62 76 75 63 64 77 \n63 77 76 64 65 78 64 78 77 \n65 66 79 65 79 78 66 67 80 \n66 80 79 67 68 81 67 81 80 \n68 69 82 68 82 81 69 70 83 \n69 83 82 70 71 84 70 84 83 \n71 72 85 71 85 84 72 4 5 \n72 5 85 74 73 86 74 86 87 \n73 75 88 73 88 86 75 76 89 \n75 89 88 76 77 90 76 90 89 \n77 78 91 77 91 90 78 79 92 \n78 92 91 79 80 93 79 93 92 \n80 81 94 80 94 93 81 82 95 \n81 95 94 82 83 96 82 96 95 \n83 84 97 83 97 96 84 85 98 \n84 98 97 85 5 6 85 6 98 \n87 86 99 87 99 100 86 88 101 \n86 101 99 88 89 102 88 102 101 \n89 90 103 89 103 102 90 91 104 \n90 104 103 91 92 105 91 105 104 \n92 93 106 92 106 105 93 94 107 \n93 107 106 94 95 108 94 108 107 \n95 96 109 95 109 108 96 97 110 \n96 110 109 97 98 111 97 111 110 \n98 6 7 98 7 111 100 99 112 \n100 112 113 99 101 114 99 114 112 \n101 102 115 101 115 114 102 103 116 \n102 116 115 103 104 117 103 117 116 \n104 105 118 104 118 117 105 106 119 \n105 119 118 106 107 120 106 120 119 \n107 108 121 107 121 120 108 109 122 \n108 122 121 109 110 123 109 123 122 \n110 111 124 110 124 123 111 7 8 \n111 8 124 113 112 125 113 125 126 \n112 114 127 112 127 125 114 115 128 \n114 128 127 115 116 129 115 129 128 \n116 117 130 116 130 129 117 118 131 \n117 131 130 118 119 132 118 132 131 \n119 120 133 119 133 132 120 121 134 \n120 134 133 121 122 135 121 135 134 \n122 123 136 122 136 135 123 124 137 \n123 137 136 124 8 9 124 9 137 \n126 125 138 126 138 139 125 127 140 \n125 140 138 127 128 141 127 141 140 \n128 129 142 128 142 141 129 130 143 \n129 143 142 130 131 144 130 144 143 \n131 132 145 131 145 144 132 133 146 \n132 146 145 133 134 147 133 147 146 \n134 135 148 134 148 147 135 136 149 \n135 149 148 136 137 150 136 150 149 \n137 9 10 137 10 150 139 138 151 \n139 151 152 138 140 153 138 153 151 \n140 141 154 140 154 153 141 142 155 \n141 155 154 142 143 156 142 156 155 \n143 144 157 143 157 156 144 145 158 \n144 158 157 145 146 159 145 159 158 \n146 147 160 146 160 159 147 148 161 \n147 161 160 148 149 162 148 162 161 \n149 150 163 149 163 162 150 10 11 \n150 11 163 152 151 164 152 164 165 \n151 153 166 151 166 164 153 154 167 \n153 167 166 154 155 168 154 168 167 \n155 156 169 155 169 168 156 157 170 \n156 170 169 157 158 171 157 171 170 \n158 159 172 158 172 171 159 160 173 \n159 173 172 160 161 174 160 174 173 \n161 162 175 161 175 174 162 163 176 \n162 176 175 163 11 12 163 12 176 \n165 164 177 165 177 178 164 166 179 \n164 179 177 166 167 180 166 180 179 \n167 168 181 167 181 180 168 169 182 \n168 182 181 169 170 183 169 183 182 \n170 171 184 170 184 183 171 172 185 \n171 185 184 172 173 186 172 186 185 \n173 174 187 173 187 186 174 175 188 \n174 188 187 175 176 189 175 189 188 \n176 12 13 176 13 189 178 177 190 \n178 190 191 177 179 192 177 192 190 \n179 180 193 179 193 192 180 181 194 \n180 194 193 181 182 195 181 195 194 \n182 183 196 182 196 195 183 184 197 \n183 197 196 184 185 198 184 198 197 \n185 186 199 185 199 198 186 187 200 \n186 200 199 187 188 201 187 201 200 \n188 189 202 188 202 201 189 13 14 \n189 14 202 191 190 203 191 203 204 \n190 192 205 190 205 203 192 193 206 \n192 206 205 193 194 207 193 207 206 \n194 195 208 194 208 207 195 196 209 \n195 209 208 196 197 210 196 210 209 \n197 198 211 197 211 210 198 199 212 \n198 212 211 199 200 213 199 213 212 \n200 201 214 200 214 213 201 202 215 \n201 215 214 202 14 15 202 15 215 \n204 203 216 204 216 217 203 205 218 \n203 218 216 205 206 219 205 219 218 \n206 207 220 206 220 219 207 208 221 \n207 221 220 208 209 222 208 222 221 \n209 210 223 209 223 222 210 211 224 \n210 224 223 211 212 225 211 225 224 \n212 213 226 212 226 225 213 214 227 \n213 227 226 214 215 228 214 228 227 \n215 15 16 215 16 228 217 216 229 \n217 229 230 216 218 231 216 231 229 \n218 219 232 218 232 231 219 220 233 \n219 233 232 220 221 234 220 234 233 \n221 222 235 221 235 234 222 223 236 \n222 236 235 223 224 237 223 237 236 \n224 225 238 224 238 237 225 226 239 \n225 239 238 226 227 240 226 240 239 \n227 228 241 227 241 240 228 16 17 \n228 17 241 230 229 242 230 242 243 \n229 231 244 229 244 242 231 232 245 \n231 245 244 232 233 246 232 246 245 \n233 234 247 233 247 246 234 235 248 \n234 248 247 235 236 249 235 249 248 \n236 237 250 236 250 249 237 238 251 \n237 251 250 238 239 252 238 252 251 \n239 240 253 239 253 252 240 241 254 \n240 254 253 241 17 18 241 18 254 \n243 242 255 243 255 256 242 244 257 \n242 257 255 244 245 258 244 258 257 \n245 246 259 245 259 258 246 247 260 \n246 260 259 247 248 261 247 261 260 \n248 249 262 248 262 261 249 250 263 \n249 263 262 250 251 264 250 264 263 \n251 252 265 251 265 264 252 253 266 \n252 266 265 253 254 267 253 267 266 \n254 18 19 254 19 267 256 255 268 \n256 268 269 255 257 270 255 270 268 \n257 258 271 257 271 270 258 259 272 \n258 272 271 259 260 273 259 273 272 \n260 261 274 260 274 273 261 262 275 \n261 275 274 262 263 276 262 276 275 \n263 264 277 263 277 276 264 265 278 \n264 278 277 265 266 279 265 279 278 \n266 267 280 266 280 279 267 19 20 \n267 20 280 269 268 22 269 22 21 \n268 270 25 268 25 22 270 271 27 \n270 27 25 271 272 29 271 29 27 \n272 273 31 272 31 29 273 274 33 \n273 33 31 274 275 35 274 35 33 \n275 276 37 275 37 35 276 277 39 \n276 39 37 277 278 41 277 41 39 \n278 279 43 278 43 41 279 280 45 \n279 45 43 280 20 0 280 0 45 \n21 24 281 282 24 283 284 281 24 \n48 285 283 48 286 287 285 48 61 \n288 286 61 289 290 288 61 74 291 \n289 74 292 293 291 74 87 294 292 \n87 295 296 294 87 100 297 295 100 \n298 299 297 100 113 300 298 113 301 \n302 300 113 126 303 301 126 304 305 \n303 126 139 306 304 139 307 308 306 \n139 152 309 307 152 310 311 309 152 \n165 312 310 165 313 314 312 165 178 \n315 313 178 316 317 315 178 191 318 \n316 191 319 320 318 191 204 321 319 \n204 322 323 321 204 217 324 322 217 \n325 326 324 217 230 327 325 230 328 \n329 327 230 243 330 328 243 331 332 \n330 243 256 333 331 256 334 335 333 \n256 269 336 334 269 337 338 336 269 \n21 339 337 21 282 340 339 341 342 \n343 342 344 343 344 345 343 345 346 \n343 346 347 343 347 348 343 348 349 \n343 349 350 343 350 351 343 351 352 \n343 352 353 343 353 354 343 354 355 \n343 355 356 343 356 357 343 357 358 \n343 358 359 343 359 360 343 360 361 \n343 361 341 343 341 362 363 341 363 \n342 362 364 365 362 365 363 364 366 \n367 364 367 365 366 368 369 366 369 \n367 368 370 371 368 371 369 370 372 \n373 370 373 371 372 374 375 372 375 \n373 374 376 377 374 377 375 376 378 \n379 376 379 377 378 380 381 378 381 \n379 380 382 383 380 383 381 382 384 \n385 382 385 383 384 386 387 384 387 \n385 342 363 388 342 388 344 363 365 \n389 363 389 388 365 367 390 365 390 \n389 367 369 391 367 391 390 369 371 \n392 369 392 391 371 373 393 371 393 \n392 373 375 394 373 394 393 375 377 \n395 375 395 394 377 379 396 377 396 \n395 379 381 397 379 397 396 381 383 \n398 381 398 397 383 385 399 383 399 \n398 385 387 400 385 400 399 344 388 \n401 344 401 345 388 389 402 388 402 \n401 389 390 403 389 403 402 390 391 \n404 390 404 403 391 392 405 391 405 \n404 392 393 406 392 406 405 393 394 \n407 393 407 406 394 395 408 394 408 \n407 395 396 409 395 409 408 396 397 \n410 396 410 409 397 398 411 397 411 \n410 398 399 412 398 412 411 399 400 \n413 399 413 412 345 401 414 345 414 \n346 401 402 415 401 415 414 402 403 \n416 402 416 415 403 404 417 403 417 \n416 404 405 418 404 418 417 405 406 \n419 405 419 418 406 407 420 406 420 \n419 407 408 421 407 421 420 408 409 \n422 408 422 421 409 410 423 409 423 \n422 410 411 424 410 424 423 411 412 \n425 411 425 424 412 413 426 412 426 \n425 346 414 427 346 427 347 414 415 \n428 414 428 427 415 416 429 415 429 \n428 416 417 430 416 430 429 417 418 \n431 417 431 430 418 419 432 418 432 \n431 419 420 433 419 433 432 420 421 \n434 420 434 433 421 422 435 421 435 \n434 422 423 436 422 436 435 423 424 \n437 423 437 436 424 425 438 424 438 \n437 425 426 439 425 439 438 347 427 \n440 347 440 348 427 428 441 427 441 \n440 428 429 442 428 442 441 429 430 \n443 429 443 442 430 431 444 430 444 \n443 431 432 445 431 445 444 432 433 \n446 432 446 445 433 434 447 433 447 \n446 434 435 448 434 448 447 435 436 \n449 435 449 448 436 437 450 436 450 \n449 437 438 451 437 451 450 438 439 \n452 438 452 451 348 440 453 348 453 \n349 440 441 454 440 454 453 441 442 \n455 441 455 454 442 443 456 442 456 \n455 443 444 457 443 457 456 444 445 \n458 444 458 457 445 446 459 445 459 \n458 446 447 460 446 460 459 447 448 \n461 447 461 460 448 449 462 448 462 \n461 449 450 463 449 463 462 450 451 \n464 450 464 463 451 452 465 451 465 \n464 349 453 466 349 466 350 453 454 \n467 453 467 466 454 455 468 454 468 \n467 455 456 469 455 469 468 456 457 \n470 456 470 469 457 458 471 457 471 \n470 458 459 472 458 472 471 459 460 \n473 459 473 472 460 461 474 460 474 \n473 461 462 475 461 475 474 462 463 \n476 462 476 475 463 464 477 463 477 \n476 464 465 478 464 478 477 350 466 \n479 350 479 351 466 467 480 466 480 \n479 467 468 481 467 481 480 468 469 \n482 468 482 481 469 470 483 469 483 \n482 470 471 484 470 484 483 471 472 \n485 471 485 484 472 473 486 472 486 \n485 473 474 487 473 487 486 474 475 \n488 474 488 487 475 476 489 475 489 \n488 476 477 490 476 490 489 477 478 \n491 477 491 490 351 479 492 351 492 \n352 479 480 493 479 493 492 480 481 \n494 480 494 493 481 482 495 481 495 \n494 482 483 496 482 496 495 483 484 \n497 483 497 496 484 485 498 484 498 \n497 485 486 499 485 499 498 486 487 \n500 486 500 499 487 488 501 487 501 \n500 488 489 502 488 502 501 489 490 \n503 489 503 502 490 491 504 490 504 \n503 352 492 505 352 505 353 492 493 \n506 492 506 505 493 494 507 493 507 \n506 494 495 508 494 508 507 495 496 \n509 495 509 508 496 497 510 496 510 \n509 497 498 511 497 511 510 498 499 \n512 498 512 511 499 500 513 499 513 \n512 500 501 514 500 514 513 501 502 \n515 501 515 514 502 503 516 502 516 \n515 503 504 517 503 517 516 353 505 \n518 353 518 354 505 506 519 505 519 \n518 506 507 520 506 520 519 507 508 \n521 507 521 520 508 509 522 508 522 \n521 509 510 523 509 523 522 510 511 \n524 510 524 523 511 512 525 511 525 \n524 512 513 526 512 526 525 513 514 \n527 513 527 526 514 515 528 514 528 \n527 515 516 529 515 529 528 516 517 \n530 516 530 529 354 518 531 354 531 \n355 518 519 532 518 532 531 519 520 \n533 519 533 532 520 521 534 520 534 \n533 521 522 535 521 535 534 522 523 \n536 522 536 535 523 524 537 523 537 \n536 524 525 538 524 538 537 525 526 \n539 525 539 538 526 527 540 526 540 \n539 527 528 541 527 541 540 528 529 \n542 528 542 541 529 530 543 529 543 \n542 355 531 544 355 544 356 531 532 \n545 531 545 544 532 533 546 532 546 \n545 533 534 547 533 547 546 534 535 \n548 534 548 547 535 536 549 535 549 \n548 536 537 550 536 550 549 537 538 \n551 537 551 550 538 539 552 538 552 \n551 539 540 553 539 553 552 540 541 \n554 540 554 553 541 542 555 541 555 \n554 542 543 556 542 556 555 356 544 \n557 356 557 357 544 545 558 544 558 \n557 545 546 559 545 559 558 546 547 \n560 546 560 559 547 548 561 547 561 \n560 548 549 562 548 562 561 549 550 \n563 549 563 562 550 551 564 550 564 \n563 551 552 565 551 565 564 552 553 \n566 552 566 565 553 554 567 553 567 \n566 554 555 568 554 568 567 555 556 \n569 555 569 568 357 557 570 357 570 \n358 557 558 571 557 571 570 558 559 \n572 558 572 571 559 560 573 559 573 \n572 560 561 574 560 574 573 561 562 \n575 561 575 574 562 563 576 562 576 \n575 563 564 577 563 577 576 564 565 \n578 564 578 577 565 566 579 565 579 \n578 566 567 580 566 580 579 567 568 \n581 567 581 580 568 569 582 568 582 \n581 358 570 583 358 583 359 570 571 \n584 570 584 583 571 572 585 571 585 \n584 572 573 586 572 586 585 573 574 \n587 573 587 586 574 575 588 574 588 \n587 575 576 589 575 589 588 576 577 \n590 576 590 589 577 578 591 577 591 \n590 578 579 592 578 592 591 579 580 \n593 579 593 592 580 581 594 580 594 \n593 581 582 595 581 595 594 359 583 \n596 359 596 360 583 584 597 583 597 \n596 584 585 598 584 598 597 585 586 \n599 585 599 598 586 587 600 586 600 \n599 587 588 601 587 601 600 588 589 \n602 588 602 601 589 590 603 589 603 \n602 590 591 604 590 604 603 591 592 \n605 591 605 604 592 593 606 592 606 \n605 593 594 607 593 607 606 594 595 \n608 594 608 607 360 596 609 360 609 \n361 596 597 610 596 610 609 597 598 \n611 597 611 610 598 599 612 598 612 \n611 599 600 613 599 613 612 600 601 \n614 600 614 613 601 602 615 601 615 \n614 602 603 616 602 616 615 603 604 \n617 603 617 616 604 605 618 604 618 \n617 605 606 619 605 619 618 606 607 \n620 606 620 619 607 608 621 607 621 \n620 361 609 362 361 362 341 609 610 \n364 609 364 362 610 611 366 610 366 \n364 611 612 368 611 368 366 612 613 \n370 612 370 368 613 614 372 613 372 \n370 614 615 374 614 374 372 615 616 \n376 615 376 374 616 617 378 616 378 \n376 617 618 380 617 380 378 618 619 \n382 618 382 380 619 620 384 619 384 \n382 620 621 386 620 386 384 386 282 \n281 284 386 284 283 387 387 283 285 \n287 387 287 286 400 400 286 288 290 \n400 290 289 413 413 289 291 293 413 \n293 292 426 426 292 294 296 426 296 \n295 439 439 295 297 299 439 299 298 \n452 452 298 300 302 452 302 301 465 \n465 301 303 305 465 305 304 478 478 \n304 306 308 478 308 307 491 491 307 \n309 311 491 311 310 504 504 310 312 \n314 504 314 313 517 517 313 315 317 \n517 317 316 530 530 316 318 320 530 \n320 319 543 543 319 321 323 543 323 \n322 556 556 322 324 326 556 326 325 \n569 569 325 327 329 569 329 328 582 \n582 328 330 332 582 332 331 595 595 \n331 333 335 595 335 334 608 608 334 \n336 338 608 338 337 621 621 337 339 \n340 621 340 282 386 622 642 624 622 \n660 642 622 678 660 622 696 678 622 \n714 696 622 732 714 622 750 732 622 \n768 750 622 786 768 622 804 786 622 \n822 804 622 840 822 622 858 840 622 \n876 858 622 894 876 622 912 894 622 \n930 912 622 948 930 622 966 948 622 \n624 966 659 623 641 677 623 659 695 \n623 677 713 623 695 731 623 713 749 \n623 731 767 623 749 785 623 767 803 \n623 785 821 623 803 839 623 821 857 \n623 839 875 623 857 893 623 875 911 \n623 893 929 623 911 947 623 929 965 \n623 947 983 623 965 641 623 983 643 \n625 624 642 643 624 644 626 625 643 \n644 625 645 627 626 644 645 626 646 \n628 627 645 646 627 647 629 628 646 \n647 628 648 630 629 647 648 629 649 \n631 630 648 649 630 650 632 631 649 \n650 631 651 633 632 650 651 632 652 \n634 633 651 652 633 653 635 634 652 \n653 634 654 636 635 653 654 635 655 \n637 636 654 655 636 656 638 637 655 \n656 637 657 639 638 656 657 638 658 \n640 639 657 658 639 659 641 640 658 \n659 640 661 643 642 660 661 642 662 \n644 643 661 662 643 663 645 644 662 \n663 644 664 646 645 663 664 645 665 \n647 646 664 665 646 666 648 647 665 \n666 647 667 649 648 666 667 648 668 \n650 649 667 668 649 669 651 650 668 \n669 650 670 652 651 669 670 651 671 \n653 652 670 671 652 672 654 653 671 \n672 653 673 655 654 672 673 654 674 \n656 655 673 674 655 675 657 656 674 \n675 656 676 658 657 675 676 657 677 \n659 658 676 677 658 679 661 660 678 \n679 660 680 662 661 679 680 661 681 \n663 662 680 681 662 682 664 663 681 \n682 663 683 665 664 682 683 664 684 \n666 665 683 684 665 685 667 666 684 \n685 666 686 668 667 685 686 667 687 \n669 668 686 687 668 688 670 669 687 \n688 669 689 671 670 688 689 670 690 \n672 671 689 690 671 691 673 672 690 \n691 672 692 674 673 691 692 673 693 \n675 674 692 693 674 694 676 675 693 \n694 675 695 677 676 694 695 676 697 \n679 678 696 697 678 698 680 679 697 \n698 679 699 681 680 698 699 680 700 \n682 681 699 700 681 701 683 682 700 \n701 682 702 684 683 701 702 683 703 \n685 684 702 703 684 704 686 685 703 \n704 685 705 687 686 704 705 686 706 \n688 687 705 706 687 707 689 688 706 \n707 688 708 690 689 707 708 689 709 \n691 690 708 709 690 710 692 691 709 \n710 691 711 693 692 710 711 692 712 \n694 693 711 712 693 713 695 694 712 \n713 694 715 697 696 714 715 696 716 \n698 697 715 716 697 717 699 698 716 \n717 698 718 700 699 717 718 699 719 \n701 700 718 719 700 720 702 701 719 \n720 701 721 703 702 720 721 702 722 \n704 703 721 722 703 723 705 704 722 \n723 704 724 706 705 723 724 705 725 \n707 706 724 725 706 726 708 707 725 \n726 707 727 709 708 726 727 708 728 \n710 709 727 728 709 729 711 710 728 \n729 710 730 712 711 729 730 711 731 \n713 712 730 731 712 733 715 714 732 \n733 714 734 716 715 733 734 715 735 \n717 716 734 735 716 736 718 717 735 \n736 717 737 719 718 736 737 718 738 \n720 719 737 738 719 739 721 720 738 \n739 720 740 722 721 739 740 721 741 \n723 722 740 741 722 742 724 723 741 \n742 723 743 725 724 742 743 724 744 \n726 725 743 744 725 745 727 726 744 \n745 726 746 728 727 745 746 727 747 \n729 728 746 747 728 748 730 729 747 \n748 729 749 731 730 748 749 730 751 \n733 732 750 751 732 752 734 733 751 \n752 733 753 735 734 752 753 734 754 \n736 735 753 754 735 755 737 736 754 \n755 736 756 738 737 755 756 737 757 \n739 738 756 757 738 758 740 739 757 \n758 739 759 741 740 758 759 740 760 \n742 741 759 760 741 761 743 742 760 \n761 742 762 744 743 761 762 743 763 \n745 744 762 763 744 764 746 745 763 \n764 745 765 747 746 764 765 746 766 \n748 747 765 766 747 767 749 748 766 \n767 748 769 751 750 768 769 750 770 \n752 751 769 770 751 771 753 752 770 \n771 752 772 754 753 771 772 753 773 \n755 754 772 773 754 774 756 755 773 \n774 755 775 757 756 774 775 756 776 \n758 757 775 776 757 777 759 758 776 \n777 758 778 760 759 777 778 759 779 \n761 760 778 779 760 780 762 761 779 \n780 761 781 763 762 780 781 762 782 \n764 763 781 782 763 783 765 764 782 \n783 764 784 766 765 783 784 765 785 \n767 766 784 785 766 787 769 768 786 \n787 768 788 770 769 787 788 769 789 \n771 770 788 789 770 790 772 771 789 \n790 771 791 773 772 790 791 772 792 \n774 773 791 792 773 793 775 774 792 \n793 774 794 776 775 793 794 775 795 \n777 776 794 795 776 796 778 777 795 \n796 777 797 779 778 796 797 778 798 \n780 779 797 798 779 799 781 780 798 \n799 780 800 782 781 799 800 781 801 \n783 782 800 801 782 802 784 783 801 \n802 783 803 785 784 802 803 784 805 \n787 786 804 805 786 806 788 787 805 \n806 787 807 789 788 806 807 788 808 \n790 789 807 808 789 809 791 790 808 \n809 790 810 792 791 809 810 791 811 \n793 792 810 811 792 812 794 793 811 \n812 793 813 795 794 812 813 794 814 \n796 795 813 814 795 815 797 796 814 \n815 796 816 798 797 815 816 797 817 \n799 798 816 817 798 818 800 799 817 \n818 799 819 801 800 818 819 800 820 \n802 801 819 820 801 821 803 802 820 \n821 802 823 805 804 822 823 804 824 \n806 805 823 824 805 825 807 806 824 \n825 806 826 808 807 825 826 807 827 \n809 808 826 827 808 828 810 809 827 \n828 809 829 811 810 828 829 810 830 \n812 811 829 830 811 831 813 812 830 \n831 812 832 814 813 831 832 813 833 \n815 814 832 833 814 834 816 815 833 \n834 815 835 817 816 834 835 816 836 \n818 817 835 836 817 837 819 818 836 \n837 818 838 820 819 837 838 819 839 \n821 820 838 839 820 841 823 822 840 \n841 822 842 824 823 841 842 823 843 \n825 824 842 843 824 844 826 825 843 \n844 825 845 827 826 844 845 826 846 \n828 827 845 846 827 847 829 828 846 \n847 828 848 830 829 847 848 829 849 \n831 830 848 849 830 850 832 831 849 \n850 831 851 833 832 850 851 832 852 \n834 833 851 852 833 853 835 834 852 \n853 834 854 836 835 853 854 835 855 \n837 836 854 855 836 856 838 837 855 \n856 837 857 839 838 856 857 838 859 \n841 840 858 859 840 860 842 841 859 \n860 841 861 843 842 860 861 842 862 \n844 843 861 862 843 863 845 844 862 \n863 844 864 846 845 863 864 845 865 \n847 846 864 865 846 866 848 847 865 \n866 847 867 849 848 866 867 848 868 \n850 849 867 868 849 869 851 850 868 \n869 850 870 852 851 869 870 851 871 \n853 852 870 871 852 872 854 853 871 \n872 853 873 855 854 872 873 854 874 \n856 855 873 874 855 875 857 856 874 \n875 856 877 859 858 876 877 858 878 \n860 859 877 878 859 879 861 860 878 \n879 860 880 862 861 879 880 861 881 \n863 862 880 881 862 882 864 863 881 \n882 863 883 865 864 882 883 864 884 \n866 865 883 884 865 885 867 866 884 \n885 866 886 868 867 885 886 867 887 \n869 868 886 887 868 888 870 869 887 \n888 869 889 871 870 888 889 870 890 \n872 871 889 890 871 891 873 872 890 \n891 872 892 874 873 891 892 873 893 \n875 874 892 893 874 895 877 876 894 \n895 876 896 878 877 895 896 877 897 \n879 878 896 897 878 898 880 879 897 \n898 879 899 881 880 898 899 880 900 \n882 881 899 900 881 901 883 882 900 \n901 882 902 884 883 901 902 883 903 \n885 884 902 903 884 904 886 885 903 \n904 885 905 887 886 904 905 886 906 \n888 887 905 906 887 907 889 888 906 \n907 888 908 890 889 907 908 889 909 \n891 890 908 909 890 910 892 891 909 \n910 891 911 893 892 910 911 892 913 \n895 894 912 913 894 914 896 895 913 \n914 895 915 897 896 914 915 896 916 \n898 897 915 916 897 917 899 898 916 \n917 898 918 900 899 917 918 899 919 \n901 900 918 919 900 920 902 901 919 \n920 901 921 903 902 920 921 902 922 \n904 903 921 922 903 923 905 904 922 \n923 904 924 906 905 923 924 905 925 \n907 906 924 925 906 926 908 907 925 \n926 907 927 909 908 926 927 908 928 \n910 909 927 928 909 929 911 910 928 \n929 910 931 913 912 930 931 912 932 \n914 913 931 932 913 933 915 914 932 \n933 914 934 916 915 933 934 915 935 \n917 916 934 935 916 936 918 917 935 \n936 917 937 919 918 936 937 918 938 \n920 919 937 938 919 939 921 920 938 \n939 920 940 922 921 939 940 921 941 \n923 922 940 941 922 942 924 923 941 \n942 923 943 925 924 942 943 924 944 \n926 925 943 944 925 945 927 926 944 \n945 926 946 928 927 945 946 927 947 \n929 928 946 947 928 949 931 930 948 \n949 930 950 932 931 949 950 931 951 \n933 932 950 951 932 952 934 933 951 \n952 933 953 935 934 952 953 934 954 \n936 935 953 954 935 955 937 936 954 \n955 936 956 938 937 955 956 937 957 \n939 938 956 957 938 958 940 939 957 \n958 939 959 941 940 958 959 940 960 \n942 941 959 960 941 961 943 942 960 \n961 942 962 944 943 961 962 943 963 \n945 944 962 963 944 964 946 945 963 \n964 945 965 947 946 964 965 946 967 \n949 948 966 967 948 968 950 949 967 \n968 949 969 951 950 968 969 950 970 \n952 951 969 970 951 971 953 952 970 \n971 952 972 954 953 971 972 953 973 \n955 954 972 973 954 974 956 955 973 \n974 955 975 957 956 974 975 956 976 \n958 957 975 976 957 977 959 958 976 \n977 958 978 960 959 977 978 959 979 \n961 960 978 979 960 980 962 961 979 \n980 961 981 963 962 980 981 962 982 \n964 963 981 982 963 983 965 964 982 \n983 964 625 967 966 624 625 966 626 \n968 967 625 626 967 627 969 968 626 \n627 968 628 970 969 627 628 969 629 \n971 970 628 629 970 630 972 971 629 \n630 971 631 973 972 630 631 972 632 \n974 973 631 632 973 633 975 974 632 \n633 974 634 976 975 633 634 975 635 \n977 976 634 635 976 636 978 977 635 \n636 977 637 979 978 636 637 978 638 \n980 979 637 638 979 639 981 980 638 \n639 980 640 982 981 639 640 981 641 \n983 982 640 641 982 984 1004 986 984 \n1022 1004 984 1040 1022 984 1058 1040 984 \n1076 1058 984 1094 1076 984 1112 1094 984 \n1130 1112 984 1148 1130 984 1166 1148 984 \n1184 1166 984 1202 1184 984 1220 1202 984 \n1238 1220 984 1256 1238 984 1274 1256 984 \n1292 1274 984 1310 1292 984 1328 1310 984 \n986 1328 1021 985 1003 1039 985 1021 1057 \n985 1039 1075 985 1057 1093 985 1075 1111 \n985 1093 1129 985 1111 1147 985 1129 1165 \n985 1147 1183 985 1165 1201 985 1183 1219 \n985 1201 1237 985 1219 1255 985 1237 1273 \n985 1255 1291 985 1273 1309 985 1291 1327 \n985 1309 1345 985 1327 1003 985 1345 1005 \n987 986 1004 1005 986 1006 988 987 1005 \n1006 987 1007 989 988 1006 1007 988 1008 \n990 989 1007 1008 989 1009 991 990 1008 \n1009 990 1010 992 991 1009 1010 991 1011 \n993 992 1010 1011 992 1012 994 993 1011 \n1012 993 1013 995 994 1012 1013 994 1014 \n996 995 1013 1014 995 1015 997 996 1014 \n1015 996 1016 998 997 1015 1016 997 1017 \n999 998 1016 1017 998 1018 1000 999 1017 \n1018 999 1019 1001 1000 1018 1019 1000 1020 \n1002 1001 1019 1020 1001 1021 1003 1002 1020 \n1021 1002 1023 1005 1004 1022 1023 1004 1024 \n1006 1005 1023 1024 1005 1025 1007 1006 1024 \n1025 1006 1026 1008 1007 1025 1026 1007 1027 \n1009 1008 1026 1027 1008 1028 1010 1009 1027 \n1028 1009 1029 1011 1010 1028 1029 1010 1030 \n1012 1011 1029 1030 1011 1031 1013 1012 1030 \n1031 1012 1032 1014 1013 1031 1032 1013 1033 \n1015 1014 1032 1033 1014 1034 1016 1015 1033 \n1034 1015 1035 1017 1016 1034 1035 1016 1036 \n1018 1017 1035 1036 1017 1037 1019 1018 1036 \n1037 1018 1038 1020 1019 1037 1038 1019 1039 \n1021 1020 1038 1039 1020 1041 1023 1022 1040 \n1041 1022 1042 1024 1023 1041 1042 1023 1043 \n1025 1024 1042 1043 1024 1044 1026 1025 1043 \n1044 1025 1045 1027 1026 1044 1045 1026 1046 \n1028 1027 1045 1046 1027 1047 1029 1028 1046 \n1047 1028 1048 1030 1029 1047 1048 1029 1049 \n1031 1030 1048 1049 1030 1050 1032 1031 1049 \n1050 1031 1051 1033 1032 1050 1051 1032 1052 \n1034 1033 1051 1052 1033 1053 1035 1034 1052 \n1053 1034 1054 1036 1035 1053 1054 1035 1055 \n1037 1036 1054 1055 1036 1056 1038 1037 1055 \n1056 1037 1057 1039 1038 1056 1057 1038 1059 \n1041 1040 1058 1059 1040 1060 1042 1041 1059 \n1060 1041 1061 1043 1042 1060 1061 1042 1062 \n1044 1043 1061 1062 1043 1063 1045 1044 1062 \n1063 1044 1064 1046 1045 1063 1064 1045 1065 \n1047 1046 1064 1065 1046 1066 1048 1047 1065 \n1066 1047 1067 1049 1048 1066 1067 1048 1068 \n1050 1049 1067 1068 1049 1069 1051 1050 1068 \n1069 1050 1070 1052 1051 1069 1070 1051 1071 \n1053 1052 1070 1071 1052 1072 1054 1053 1071 \n1072 1053 1073 1055 1054 1072 1073 1054 1074 \n1056 1055 1073 1074 1055 1075 1057 1056 1074 \n1075 1056 1077 1059 1058 1076 1077 1058 1078 \n1060 1059 1077 1078 1059 1079 1061 1060 1078 \n1079 1060 1080 1062 1061 1079 1080 1061 1081 \n1063 1062 1080 1081 1062 1082 1064 1063 1081 \n1082 1063 1083 1065 1064 1082 1083 1064 1084 \n1066 1065 1083 1084 1065 1085 1067 1066 1084 \n1085 1066 1086 1068 1067 1085 1086 1067 1087 \n1069 1068 1086 1087 1068 1088 1070 1069 1087 \n1088 1069 1089 1071 1070 1088 1089 1070 1090 \n1072 1071 1089 1090 1071 1091 1073 1072 1090 \n1091 1072 1092 1074 1073 1091 1092 1073 1093 \n1075 1074 1092 1093 1074 1095 1077 1076 1094 \n1095 1076 1096 1078 1077 1095 1096 1077 1097 \n1079 1078 1096 1097 1078 1098 1080 1079 1097 \n1098 1079 1099 1081 1080 1098 1099 1080 1100 \n1082 1081 1099 1100 1081 1101 1083 1082 1100 \n1101 1082 1102 1084 1083 1101 1102 1083 1103 \n1085 1084 1102 1103 1084 1104 1086 1085 1103 \n1104 1085 1105 1087 1086 1104 1105 1086 1106 \n1088 1087 1105 1106 1087 1107 1089 1088 1106 \n1107 1088 1108 1090 1089 1107 1108 1089 1109 \n1091 1090 1108 1109 1090 1110 1092 1091 1109 \n1110 1091 1111 1093 1092 1110 1111 1092 1113 \n1095 1094 1112 1113 1094 1114 1096 1095 1113 \n1114 1095 1115 1097 1096 1114 1115 1096 1116 \n1098 1097 1115 1116 1097 1117 1099 1098 1116 \n1117 1098 1118 1100 1099 1117 1118 1099 1119 \n1101 1100 1118 1119 1100 1120 1102 1101 1119 \n1120 1101 1121 1103 1102 1120 1121 1102 1122 \n1104 1103 1121 1122 1103 1123 1105 1104 1122 \n1123 1104 1124 1106 1105 1123 1124 1105 1125 \n1107 1106 1124 1125 1106 1126 1108 1107 1125 \n1126 1107 1127 1109 1108 1126 1127 1108 1128 \n1110 1109 1127 1128 1109 1129 1111 1110 1128 \n1129 1110 1131 1113 1112 1130 1131 1112 1132 \n1114 1113 1131 1132 1113 1133 1115 1114 1132 \n1133 1114 1134 1116 1115 1133 1134 1115 1135 \n1117 1116 1134 1135 1116 1136 1118 1117 1135 \n1136 1117 1137 1119 1118 1136 1137 1118 1138 \n1120 1119 1137 1138 1119 1139 1121 1120 1138 \n1139 1120 1140 1122 1121 1139 1140 1121 1141 \n1123 1122 1140 1141 1122 1142 1124 1123 1141 \n1142 1123 1143 1125 1124 1142 1143 1124 1144 \n1126 1125 1143 1144 1125 1145 1127 1126 1144 \n1145 1126 1146 1128 1127 1145 1146 1127 1147 \n1129 1128 1146 1147 1128 1149 1131 1130 1148 \n1149 1130 1150 1132 1131 1149 1150 1131 1151 \n1133 1132 1150 1151 1132 1152 1134 1133 1151 \n1152 1133 1153 1135 1134 1152 1153 1134 1154 \n1136 1135 1153 1154 1135 1155 1137 1136 1154 \n1155 1136 1156 1138 1137 1155 1156 1137 1157 \n1139 1138 1156 1157 1138 1158 1140 1139 1157 \n1158 1139 1159 1141 1140 1158 1159 1140 1160 \n1142 1141 1159 1160 1141 1161 1143 1142 1160 \n1161 1142 1162 1144 1143 1161 1162 1143 1163 \n1145 1144 1162 1163 1144 1164 1146 1145 1163 \n1164 1145 1165 1147 1146 1164 1165 1146 1167 \n1149 1148 1166 1167 1148 1168 1150 1149 1167 \n1168 1149 1169 1151 1150 1168 1169 1150 1170 \n1152 1151 1169 1170 1151 1171 1153 1152 1170 \n1171 1152 1172 1154 1153 1171 1172 1153 1173 \n1155 1154 1172 1173 1154 1174 1156 1155 1173 \n1174 1155 1175 1157 1156 1174 1175 1156 1176 \n1158 1157 1175 1176 1157 1177 1159 1158 1176 \n1177 1158 1178 1160 1159 1177 1178 1159 1179 \n1161 1160 1178 1179 1160 1180 1162 1161 1179 \n1180 1161 1181 1163 1162 1180 1181 1162 1182 \n1164 1163 1181 1182 1163 1183 1165 1164 1182 \n1183 1164 1185 1167 1166 1184 1185 1166 1186 \n1168 1167 1185 1186 1167 1187 1169 1168 1186 \n1187 1168 1188 1170 1169 1187 1188 1169 1189 \n1171 1170 1188 1189 1170 1190 1172 1171 1189 \n1190 1171 1191 1173 1172 1190 1191 1172 1192 \n1174 1173 1191 1192 1173 1193 1175 1174 1192 \n1193 1174 1194 1176 1175 1193 1194 1175 1195 \n1177 1176 1194 1195 1176 1196 1178 1177 1195 \n1196 1177 1197 1179 1178 1196 1197 1178 1198 \n1180 1179 1197 1198 1179 1199 1181 1180 1198 \n1199 1180 1200 1182 1181 1199 1200 1181 1201 \n1183 1182 1200 1201 1182 1203 1185 1184 1202 \n1203 1184 1204 1186 1185 1203 1204 1185 1205 \n1187 1186 1204 1205 1186 1206 1188 1187 1205 \n1206 1187 1207 1189 1188 1206 1207 1188 1208 \n1190 1189 1207 1208 1189 1209 1191 1190 1208 \n1209 1190 1210 1192 1191 1209 1210 1191 1211 \n1193 1192 1210 1211 1192 1212 1194 1193 1211 \n1212 1193 1213 1195 1194 1212 1213 1194 1214 \n1196 1195 1213 1214 1195 1215 1197 1196 1214 \n1215 1196 1216 1198 1197 1215 1216 1197 1217 \n1199 1198 1216 1217 1198 1218 1200 1199 1217 \n1218 1199 1219 1201 1200 1218 1219 1200 1221 \n1203 1202 1220 1221 1202 1222 1204 1203 1221 \n1222 1203 1223 1205 1204 1222 1223 1204 1224 \n1206 1205 1223 1224 1205 1225 1207 1206 1224 \n1225 1206 1226 1208 1207 1225 1226 1207 1227 \n1209 1208 1226 1227 1208 1228 1210 1209 1227 \n1228 1209 1229 1211 1210 1228 1229 1210 1230 \n1212 1211 1229 1230 1211 1231 1213 1212 1230 \n1231 1212 1232 1214 1213 1231 1232 1213 1233 \n1215 1214 1232 1233 1214 1234 1216 1215 1233 \n1234 1215 1235 1217 1216 1234 1235 1216 1236 \n1218 1217 1235 1236 1217 1237 1219 1218 1236 \n1237 1218 1239 1221 1220 1238 1239 1220 1240 \n1222 1221 1239 1240 1221 1241 1223 1222 1240 \n1241 1222 1242 1224 1223 1241 1242 1223 1243 \n1225 1224 1242 1243 1224 1244 1226 1225 1243 \n1244 1225 1245 1227 1226 1244 1245 1226 1246 \n1228 1227 1245 1246 1227 1247 1229 1228 1246 \n1247 1228 1248 1230 1229 1247 1248 1229 1249 \n1231 1230 1248 1249 1230 1250 1232 1231 1249 \n1250 1231 1251 1233 1232 1250 1251 1232 1252 \n1234 1233 1251 1252 1233 1253 1235 1234 1252 \n1253 1234 1254 1236 1235 1253 1254 1235 1255 \n1237 1236 1254 1255 1236 1257 1239 1238 1256 \n1257 1238 1258 1240 1239 1257 1258 1239 1259 \n1241 1240 1258 1259 1240 1260 1242 1241 1259 \n1260 1241 1261 1243 1242 1260 1261 1242 1262 \n1244 1243 1261 1262 1243 1263 1245 1244 1262 \n1263 1244 1264 1246 1245 1263 1264 1245 1265 \n1247 1246 1264 1265 1246 1266 1248 1247 1265 \n1266 1247 1267 1249 1248 1266 1267 1248 1268 \n1250 1249 1267 1268 1249 1269 1251 1250 1268 \n1269 1250 1270 1252 1251 1269 1270 1251 1271 \n1253 1252 1270 1271 1252 1272 1254 1253 1271 \n1272 1253 1273 1255 1254 1272 1273 1254 1275 \n1257 1256 1274 1275 1256 1276 1258 1257 1275 \n1276 1257 1277 1259 1258 1276 1277 1258 1278 \n1260 1259 1277 1278 1259 1279 1261 1260 1278 \n1279 1260 1280 1262 1261 1279 1280 1261 1281 \n1263 1262 1280 1281 1262 1282 1264 1263 1281 \n1282 1263 1283 1265 1264 1282 1283 1264 1284 \n1266 1265 1283 1284 1265 1285 1267 1266 1284 \n1285 1266 1286 1268 1267 1285 1286 1267 1287 \n1269 1268 1286 1287 1268 1288 1270 1269 1287 \n1288 1269 1289 1271 1270 1288 1289 1270 1290 \n1272 1271 1289 1290 1271 1291 1273 1272 1290 \n1291 1272 1293 1275 1274 1292 1293 1274 1294 \n1276 1275 1293 1294 1275 1295 1277 1276 1294 \n1295 1276 1296 1278 1277 1295 1296 1277 1297 \n1279 1278 1296 1297 1278 1298 1280 1279 1297 \n1298 1279 1299 1281 1280 1298 1299 1280 1300 \n1282 1281 1299 1300 1281 1301 1283 1282 1300 \n1301 1282 1302 1284 1283 1301 1302 1283 1303 \n1285 1284 1302 1303 1284 1304 1286 1285 1303 \n1304 1285 1305 1287 1286 1304 1305 1286 1306 \n1288 1287 1305 1306 1287 1307 1289 1288 1306 \n1307 1288 1308 1290 1289 1307 1308 1289 1309 \n1291 1290 1308 1309 1290 1311 1293 1292 1310 \n1311 1292 1312 1294 1293 1311 1312 1293 1313 \n1295 1294 1312 1313 1294 1314 1296 1295 1313 \n1314 1295 1315 1297 1296 1314 1315 1296 1316 \n1298 1297 1315 1316 1297 1317 1299 1298 1316 \n1317 1298 1318 1300 1299 1317 1318 1299 1319 \n1301 1300 1318 1319 1300 1320 1302 1301 1319 \n1320 1301 1321 1303 1302 1320 1321 1302 1322 \n1304 1303 1321 1322 1303 1323 1305 1304 1322 \n1323 1304 1324 1306 1305 1323 1324 1305 1325 \n1307 1306 1324 1325 1306 1326 1308 1307 1325 \n1326 1307 1327 1309 1308 1326 1327 1308 1329 \n1311 1310 1328 1329 1310 1330 1312 1311 1329 \n1330 1311 1331 1313 1312 1330 1331 1312 1332 \n1314 1313 1331 1332 1313 1333 1315 1314 1332 \n1333 1314 1334 1316 1315 1333 1334 1315 1335 \n1317 1316 1334 1335 1316 1336 1318 1317 1335 \n1336 1317 1337 1319 1318 1336 1337 1318 1338 \n1320 1319 1337 1338 1319 1339 1321 1320 1338 \n1339 1320 1340 1322 1321 1339 1340 1321 1341 \n1323 1322 1340 1341 1322 1342 1324 1323 1341 \n1342 1323 1343 1325 1324 1342 1343 1324 1344 \n1326 1325 1343 1344 1325 1345 1327 1326 1344 \n1345 1326 987 1329 1328 986 987 1328 988 \n1330 1329 987 988 1329 989 1331 1330 988 \n989 1330 990 1332 1331 989 990 1331 991 \n1333 1332 990 991 1332 992 1334 1333 991 \n992 1333 993 1335 1334 992 993 1334 994 \n1336 1335 993 994 1335 995 1337 1336 994 \n995 1336 996 1338 1337 995 996 1337 997 \n1339 1338 996 997 1338 998 1340 1339 997 \n998 1339 999 1341 1340 998 999 1340 1000 \n1342 1341 999 1000 1341 1001 1343 1342 1000 \n1001 1342 1002 1344 1343 1001 1002 1343 1003 \n1345 1344 1002 1003 1344 \n"
  },
  {
    "path": "testing/data/branched6.vtk",
    "content": "# vtk DataFile Version 5.1\nvtk output\nASCII\nDATASET POLYDATA\nPOINTS 1232 double\n0.082297295332 -0.36765038967 0.86818063259 0.078269377351 -0.34221912734 0.86818063259 0 -0.36765038967 0.875 \n0.066579908133 -0.319277253 0.86818063259 0.048373136669 -0.30107048154 0.86818063259 0.025431262329 -0.28938101232 0.86818063259 \n5.0392558428e-18 -0.28535309434 0.86818063259 -0.025431262329 -0.28938101232 0.86818063259 -0.048373136669 -0.30107048154 0.86818063259 \n-0.066579908133 -0.319277253 0.86818063259 -0.078269377351 -0.34221912734 0.86818063259 -0.082297295332 -0.36765038967 0.86818063259 \n-0.078269377351 -0.393081652 0.86818063259 -0.066579908133 -0.41602352634 0.86818063259 -0.048373136669 -0.4342302978 0.86818063259 \n-0.025431262329 -0.44591976702 0.86818063259 -1.5117767942e-17 -0.449947685 0.86818063259 0.025431262329 -0.44591976702 0.86818063259 \n0.048373136669 -0.4342302978 0.86818063259 0.066579908133 -0.41602352634 0.86818063259 0.078269377351 -0.393081652 0.86818063259 \n0.16234973073 -0.36765038967 0.84790861607 0.15440377593 -0.31748156249 0.84790861607 0.23797369003 -0.36765038967 0.81473690271 \n0.2263264358 -0.29411247372 0.81473690271 0.30710634589 -0.36765038967 0.76957023144 0.29207551479 -0.27274930477 0.76957023144 \n0.36786195636 -0.36765038967 0.71364080906 0.34985750914 -0.25397479534 0.71364080906 0.41858324409 -0.36765038967 0.64847409725 \n0.39809632301 -0.23830105364 0.64847409725 0.45788666606 -0.36765038967 0.57584768534 0.43547609448 -0.22615562379 0.57584768534 \n0.48470014334 -0.36765038967 0.4977427423 0.4609772265 -0.21786981821 0.4977427423 0.49829223752 -0.36765038967 0.41628968716 \n0.47390407324 -0.213669613 0.41628968716 0.49829223752 -0.36765038967 0.33371031284 0.47390407324 -0.213669613 0.33371031284 \n0.48470014334 -0.36765038967 0.2522572577 0.4609772265 -0.21786981821 0.2522572577 0.45788666606 -0.36765038967 0.17415228486 \n0.43547609448 -0.22615562379 0.17415228486 0.41858324409 -0.36765038967 0.10152591765 0.39809632301 -0.23830105364 0.10152591765 \n0.36786195636 -0.36765038967 0.036359213293 0.34985750914 -0.25397479534 0.036359213293 0.13134369254 -0.2722236067 0.84790861607 \n0.19252476096 -0.22777296603 0.81473690271 0.24845425785 -0.18713779747 0.76957023144 0.29760658741 -0.15142655372 0.71364080906 \n0.33864095807 -0.12161333859 0.64847409725 0.37043809891 -0.09851136803 0.57584768534 0.39213064313 -0.08275079727 0.4977427423 \n0.40312689543 -0.0747615695 0.41628968716 0.40312689543 -0.0747615695 0.33371031284 0.39213064313 -0.08275079727 0.2522572577 \n0.37043809891 -0.09851136803 0.17415228486 0.33864095807 -0.12161333859 0.10152591765 0.29760658741 -0.15142655372 0.036359213293 \n0.095426782966 -0.23630669713 0.84790861607 0.13987742364 -0.17512562871 0.81473690271 0.1805125922 -0.11919613182 0.76957023144 \n0.21622383595 -0.07004380226 0.71364080906 0.24603705108 -0.0290094316 0.64847409725 0.24603705108 -0.0290094316 0.10152591765 \n0.21622383595 -0.07004380226 0.036359213293 0.050168827176 -0.21324661374 0.84790861607 0.073537915945 -0.14132395387 0.81473690271 \n0.0949010849 -0.07557487488 0.76957023144 0.11367559433 -0.01779288053 0.71364080906 0.11367559433 -0.01779288053 0.036359213293 \n9.9410541201e-18 -0.20530065894 0.84790861607 1.4571686463e-17 -0.12967669964 0.81473690271 1.880484115e-17 -0.06054404378 0.76957023144 \n-0.050168827176 -0.21324661374 0.84790861607 -0.073537915945 -0.14132395387 0.81473690271 -0.0949010849 -0.07557487488 0.76957023144 \n-0.11367559433 -0.01779288053 0.71364080906 -0.095426782966 -0.23630669713 0.84790861607 -0.13987742364 -0.17512562871 0.81473690271 \n-0.1805125922 -0.11919613182 0.76957023144 -0.21622383595 -0.07004380226 0.71364080906 -0.24603705108 -0.0290094316 0.64847409725 \n-0.13134369254 -0.2722236067 0.84790861607 -0.19252476096 -0.22777296603 0.81473690271 -0.24845425785 -0.18713779747 0.76957023144 \n-0.29760658741 -0.15142655372 0.71364080906 -0.33864095807 -0.12161333859 0.64847409725 -0.37043809891 -0.09851136803 0.57584768534 \n-0.24603705108 -0.0290094316 0.10152591765 -0.21622383595 -0.07004380226 0.036359213293 -0.29760658741 -0.15142655372 0.036359213293 \n-0.33864095807 -0.12161333859 0.10152591765 -0.15440377593 -0.31748156249 0.84790861607 -0.2263264358 -0.29411247372 0.81473690271 \n-0.29207551479 -0.27274930477 0.76957023144 -0.34985750914 -0.25397479534 0.71364080906 -0.39809632301 -0.23830105364 0.64847409725 \n-0.43547609448 -0.22615562379 0.57584768534 -0.39213064313 -0.08275079727 0.4977427423 -0.4609772265 -0.21786981821 0.4977427423 \n-0.40312689543 -0.0747615695 0.41628968716 -0.47390407324 -0.213669613 0.41628968716 -0.40312689543 -0.0747615695 0.33371031284 \n-0.47390407324 -0.213669613 0.33371031284 -0.39213064313 -0.08275079727 0.2522572577 -0.4609772265 -0.21786981821 0.2522572577 \n-0.37043809891 -0.09851136803 0.17415228486 -0.43547609448 -0.22615562379 0.17415228486 -0.39809632301 -0.23830105364 0.10152591765 \n-0.34985750914 -0.25397479534 0.036359213293 -0.16234973073 -0.36765038967 0.84790861607 -0.23797369003 -0.36765038967 0.81473690271 \n-0.30710634589 -0.36765038967 0.76957023144 -0.36786195636 -0.36765038967 0.71364080906 -0.41858324409 -0.36765038967 0.64847409725 \n-0.45788666606 -0.36765038967 0.57584768534 -0.48470014334 -0.36765038967 0.4977427423 -0.49829223752 -0.36765038967 0.41628968716 \n-0.49829223752 -0.36765038967 0.33371031284 -0.48470014334 -0.36765038967 0.2522572577 -0.45788666606 -0.36765038967 0.17415228486 \n-0.41858324409 -0.36765038967 0.10152591765 -0.36786195636 -0.36765038967 0.036359213293 -0.15440377593 -0.41781921685 0.84790861607 \n-0.2263264358 -0.44118830561 0.81473690271 -0.29207551479 -0.46255147457 0.76957023144 -0.34985750914 -0.481325984 0.71364080906 \n-0.39809632301 -0.4969997257 0.64847409725 -0.43547609448 -0.50914515555 0.57584768534 -0.4609772265 -0.51743096113 0.4977427423 \n-0.47390407324 -0.52163116634 0.41628968716 -0.47390407324 -0.52163116634 0.33371031284 -0.4609772265 -0.51743096113 0.2522572577 \n-0.43547609448 -0.50914515555 0.17415228486 -0.39809632301 -0.4969997257 0.10152591765 -0.34985750914 -0.481325984 0.036359213293 \n-0.13134369254 -0.46307717264 0.84790861607 -0.19252476096 -0.50752781331 0.81473690271 -0.24845425785 -0.54816298187 0.76957023144 \n-0.29760658741 -0.58387422562 0.71364080906 -0.33864095807 -0.61368744075 0.64847409725 -0.37043809891 -0.63678941131 0.57584768534 \n-0.39213064313 -0.65254998207 0.4977427423 -0.40312689543 -0.66053920984 0.41628968716 -0.40312689543 -0.66053920984 0.33371031284 \n-0.39213064313 -0.65254998207 0.2522572577 -0.37043809891 -0.63678941131 0.17415228486 -0.33864095807 -0.61368744075 0.10152591765 \n-0.29760658741 -0.58387422562 0.036359213293 -0.095426782966 -0.49899408221 0.84790861607 -0.13987742364 -0.56017515063 0.81473690271 \n-0.1805125922 -0.61610464752 0.76957023144 -0.21622383595 -0.66525697708 0.71364080906 -0.24603705108 -0.70629134774 0.64847409725 \n-0.26913902164 -0.73808848858 0.57584768534 -0.2848995924 -0.7597810328 0.4977427423 -0.29288882017 -0.7707772851 0.41628968716 \n-0.29288882017 -0.7707772851 0.33371031284 -0.2848995924 -0.7597810328 0.2522572577 -0.26913902164 -0.73808848858 0.17415228486 \n-0.24603705108 -0.70629134774 0.10152591765 -0.21622383595 -0.66525697708 0.036359213293 -0.050168827176 -0.5220541656 0.84790861607 \n-0.073537915945 -0.59397682547 0.81473690271 -0.0949010849 -0.65972590446 0.76957023144 -0.11367559433 -0.71750789881 0.71364080906 \n-0.12934933603 -0.76574671268 0.64847409725 -0.14149476588 -0.80312648415 0.57584768534 -0.14978057146 -0.82862761617 0.4977427423 \n-0.15398077667 -0.84155446291 0.41628968716 -0.15398077667 -0.84155446291 0.33371031284 -0.14978057146 -0.82862761617 0.2522572577 \n-0.14149476588 -0.80312648415 0.17415228486 -0.12934933603 -0.76574671268 0.10152591765 -0.11367559433 -0.71750789881 0.036359213293 \n-2.9823163188e-17 -0.5300001204 0.84790861607 -4.3715059388e-17 -0.6056240797 0.81473690271 -5.6414525104e-17 -0.67475673556 0.76957023144 \n-6.7575143714e-17 -0.73551234603 0.71364080906 -7.6892492899e-17 -0.78623363376 0.64847409725 -8.4112416453e-17 -0.82553705573 0.57584768534 \n-8.9037972598e-17 -0.85235053301 0.4977427423 -9.1534800733e-17 -0.86594262719 0.41628968716 -9.1534800733e-17 -0.86594262719 0.33371031284 \n-8.9037972598e-17 -0.85235053301 0.2522572577 -8.4112416453e-17 -0.82553705573 0.17415228486 -7.6892492899e-17 -0.78623363376 0.10152591765 \n-6.7575143714e-17 -0.73551234603 0.036359213293 0.050168827176 -0.5220541656 0.84790861607 0.073537915945 -0.59397682547 0.81473690271 \n0.0949010849 -0.65972590446 0.76957023144 0.11367559433 -0.71750789881 0.71364080906 0.12934933603 -0.76574671268 0.64847409725 \n0.14149476588 -0.80312648415 0.57584768534 0.14978057146 -0.82862761617 0.4977427423 0.15398077667 -0.84155446291 0.41628968716 \n0.15398077667 -0.84155446291 0.33371031284 0.14978057146 -0.82862761617 0.2522572577 0.14149476588 -0.80312648415 0.17415228486 \n0.12934933603 -0.76574671268 0.10152591765 0.11367559433 -0.71750789881 0.036359213293 0.095426782966 -0.49899408221 0.84790861607 \n0.13987742364 -0.56017515063 0.81473690271 0.1805125922 -0.61610464752 0.76957023144 0.21622383595 -0.66525697708 0.71364080906 \n0.24603705108 -0.70629134774 0.64847409725 0.26913902164 -0.73808848858 0.57584768534 0.2848995924 -0.7597810328 0.4977427423 \n0.29288882017 -0.7707772851 0.41628968716 0.29288882017 -0.7707772851 0.33371031284 0.2848995924 -0.7597810328 0.2522572577 \n0.26913902164 -0.73808848858 0.17415228486 0.24603705108 -0.70629134774 0.10152591765 0.21622383595 -0.66525697708 0.036359213293 \n0.13134369254 -0.46307717264 0.84790861607 0.19252476096 -0.50752781331 0.81473690271 0.24845425785 -0.54816298187 0.76957023144 \n0.29760658741 -0.58387422562 0.71364080906 0.33864095807 -0.61368744075 0.64847409725 0.37043809891 -0.63678941131 0.57584768534 \n0.39213064313 -0.65254998207 0.4977427423 0.40312689543 -0.66053920984 0.41628968716 0.40312689543 -0.66053920984 0.33371031284 \n0.39213064313 -0.65254998207 0.2522572577 0.37043809891 -0.63678941131 0.17415228486 0.33864095807 -0.61368744075 0.10152591765 \n0.29760658741 -0.58387422562 0.036359213293 0.15440377593 -0.41781921685 0.84790861607 0.2263264358 -0.44118830561 0.81473690271 \n0.29207551479 -0.46255147457 0.76957023144 0.34985750914 -0.481325984 0.71364080906 0.39809632301 -0.4969997257 0.64847409725 \n0.43547609448 -0.50914515555 0.57584768534 0.4609772265 -0.51743096113 0.4977427423 0.47390407324 -0.52163116634 0.41628968716 \n0.47390407324 -0.52163116634 0.33371031284 0.4609772265 -0.51743096113 0.2522572577 0.43547609448 -0.50914515555 0.17415228486 \n0.39809632301 -0.4969997257 0.10152591765 0.34985750914 -0.481325984 0.036359213293 0.32836531327 -0.36765038967 -2.8171179001e-17 \n0.3220653893 -0.32787420532 -4.9487070846e-09 0.31859390657 -0.30595609081 -4.9487070599e-09 0.31229398553 -0.26617992492 2.5407916269e-17 \n0.29401088933 -0.23029732859 5.1429095066e-09 0.28393623162 -0.21052470643 5.1429095066e-09 0.2656531266 -0.1746420928 6.9388939039e-18 \n0.23717652592 -0.14616549212 0 0.22148489755 -0.13047386375 0 0.19300829687 -0.10199726307 0 \n0.15712568324 -0.08371415805 -5.1429094891e-09 0.13735306108 -0.07363950034 -5.1429095118e-09 0.10147046475 -0.05535640414 -2.5197041461e-17 \n0.06169429886 -0.0490564831 4.9487070318e-09 0.03977618435 -0.04558500037 4.948707057e-09 -0.11367559433 -0.01779288053 0.036359213293 \n-0.10147046475 -0.05535640414 -4.4034066554e-18 -0.13735306108 -0.07363950034 5.1429095118e-09 -0.15712568324 -0.08371415805 5.1429095066e-09 \n-0.19300829687 -0.10199726307 2.0768586122e-18 -0.22148489755 -0.13047386375 0 -0.23717652592 -0.14616549212 0 \n-0.2656531266 -0.1746420928 0 -0.28393623162 -0.21052470643 -5.1429094753e-09 -0.29401088933 -0.23029732859 -5.1429095118e-09 \n-0.31229398553 -0.26617992492 -2.5407916269e-17 -0.31859390657 -0.30595609081 4.9487070561e-09 -0.3220653893 -0.32787420532 4.9487070561e-09 \n-0.32836531327 -0.36765038967 4.8381435661e-24 -0.3220653893 -0.40742657402 -4.9487070852e-09 -0.31859390657 -0.42934468853 -4.9487070599e-09 \n-0.31229398553 -0.46912085442 -2.9741361642e-18 -0.29401088933 -0.50500345075 5.1429095066e-09 -0.28393623162 -0.52477607291 5.1429095066e-09 \n-0.2656531266 -0.56065868654 6.9388939039e-18 -0.23717652592 -0.58913528722 0 -0.22148489755 -0.60482691559 0 \n-0.19300829687 -0.63330351627 0 -0.15712568324 -0.65158662129 -5.1429094753e-09 -0.13735306108 -0.661661279 -5.1429094753e-09 \n-0.10147046475 -0.6799443752 -2.540791296e-17 -0.06169429886 -0.68624429624 4.9487070561e-09 -0.03977618435 -0.68971577897 4.9487070565e-09 \n-5.8492876492e-17 -0.69601570294 -8.5284299912e-18 0.03977618435 -0.68971577897 -4.9487070556e-09 0.06169429886 -0.68624429624 -4.9487070591e-09 \n0.10147046475 -0.6799443752 -1.5448640187e-18 0.13735306108 -0.661661279 5.1429095066e-09 0.15712568324 -0.65158662129 5.1429094891e-09 \n0.19300829687 -0.63330351627 0 0.22148489755 -0.60482691559 0 0.23717652592 -0.58913528722 0 \n0.2656531266 -0.56065868654 -2.0768619209e-18 0.28393623162 -0.52477607291 -5.1429094753e-09 0.29401088933 -0.50500345075 -5.1429095118e-09 \n0.31229398553 -0.46912085442 2.9741345099e-18 0.31859390657 -0.42934468853 4.9487070561e-09 0.3220653893 -0.40742657402 4.9487070565e-09 \n0.082297295332 -0.36765038967 -0.86818063259 0 -0.36765038967 -0.875 0.078269377351 -0.34221912734 -0.86818063259 \n0.066579908133 -0.319277253 -0.86818063259 0.048373136669 -0.30107048154 -0.86818063259 0.025431262329 -0.28938101232 -0.86818063259 \n5.0392558428e-18 -0.28535309434 -0.86818063259 -0.025431262329 -0.28938101232 -0.86818063259 -0.048373136669 -0.30107048154 -0.86818063259 \n-0.066579908133 -0.319277253 -0.86818063259 -0.078269377351 -0.34221912734 -0.86818063259 -0.082297295332 -0.36765038967 -0.86818063259 \n-0.078269377351 -0.393081652 -0.86818063259 -0.066579908133 -0.41602352634 -0.86818063259 -0.048373136669 -0.4342302978 -0.86818063259 \n-0.025431262329 -0.44591976702 -0.86818063259 -1.5117767942e-17 -0.449947685 -0.86818063259 0.025431262329 -0.44591976702 -0.86818063259 \n0.048373136669 -0.4342302978 -0.86818063259 0.066579908133 -0.41602352634 -0.86818063259 0.078269377351 -0.393081652 -0.86818063259 \n0.36786195636 -0.36765038967 -0.036359213293 0.41858324409 -0.36765038967 -0.10152591765 0.39809632301 -0.23830105364 -0.10152591765 \n0.34985750914 -0.25397479534 -0.036359213293 0.45788666606 -0.36765038967 -0.17415228486 0.43547609448 -0.22615562379 -0.17415228486 \n0.48470014334 -0.36765038967 -0.2522572577 0.4609772265 -0.21786981821 -0.2522572577 0.49829223752 -0.36765038967 -0.33371031284 \n0.47390407324 -0.213669613 -0.33371031284 0.49829223752 -0.36765038967 -0.41628968716 0.47390407324 -0.213669613 -0.41628968716 \n0.48470014334 -0.36765038967 -0.4977427423 0.4609772265 -0.21786981821 -0.4977427423 0.45788666606 -0.36765038967 -0.57584768534 \n0.43547609448 -0.22615562379 -0.57584768534 0.41858324409 -0.36765038967 -0.64847409725 0.39809632301 -0.23830105364 -0.64847409725 \n0.36786195636 -0.36765038967 -0.71364080906 0.34985750914 -0.25397479534 -0.71364080906 0.30710634589 -0.36765038967 -0.76957023144 \n0.29207551479 -0.27274930477 -0.76957023144 0.23797369003 -0.36765038967 -0.81473690271 0.2263264358 -0.29411247372 -0.81473690271 \n0.16234973073 -0.36765038967 -0.84790861607 0.15440377593 -0.31748156249 -0.84790861607 0.33864095807 -0.12161333859 -0.10152591765 \n0.29760658741 -0.15142655372 -0.036359213293 0.37043809891 -0.09851136803 -0.17415228486 0.39213064313 -0.08275079727 -0.2522572577 \n0.40312689543 -0.0747615695 -0.33371031284 0.40312689543 -0.0747615695 -0.41628968716 0.39213064313 -0.08275079727 -0.4977427423 \n0.37043809891 -0.09851136803 -0.57584768534 0.33864095807 -0.12161333859 -0.64847409725 0.29760658741 -0.15142655372 -0.71364080906 \n0.24845425785 -0.18713779747 -0.76957023144 0.19252476096 -0.22777296603 -0.81473690271 0.13134369254 -0.2722236067 -0.84790861607 \n0.24603705108 -0.0290094316 -0.10152591765 0.21622383595 -0.07004380226 -0.036359213293 0.24603705108 -0.0290094316 -0.64847409725 \n0.21622383595 -0.07004380226 -0.71364080906 0.1805125922 -0.11919613182 -0.76957023144 0.13987742364 -0.17512562871 -0.81473690271 \n0.095426782966 -0.23630669713 -0.84790861607 0.11367559433 -0.01779288053 -0.71364080906 0.0949010849 -0.07557487488 -0.76957023144 \n0.073537915945 -0.14132395387 -0.81473690271 0.050168827176 -0.21324661374 -0.84790861607 1.880484115e-17 -0.06054404378 -0.76957023144 \n1.4571686463e-17 -0.12967669964 -0.81473690271 9.9410541201e-18 -0.20530065894 -0.84790861607 -0.073537915945 -0.14132395387 -0.81473690271 \n-0.0949010849 -0.07557487488 -0.76957023144 -0.050168827176 -0.21324661374 -0.84790861607 -0.11367559433 -0.01779288053 -0.036359213293 \n-0.24603705108 -0.0290094316 -0.10152591765 -0.21622383595 -0.07004380226 -0.036359213293 -0.11367559433 -0.01779288053 -0.71364080906 \n-0.1805125922 -0.11919613182 -0.76957023144 -0.21622383595 -0.07004380226 -0.71364080906 -0.13987742364 -0.17512562871 -0.81473690271 \n-0.095426782966 -0.23630669713 -0.84790861607 -0.33864095807 -0.12161333859 -0.10152591765 -0.29760658741 -0.15142655372 -0.036359213293 \n-0.37043809891 -0.09851136803 -0.17415228486 -0.24603705108 -0.0290094316 -0.64847409725 -0.29760658741 -0.15142655372 -0.71364080906 \n-0.33864095807 -0.12161333859 -0.64847409725 -0.24845425785 -0.18713779747 -0.76957023144 -0.19252476096 -0.22777296603 -0.81473690271 \n-0.13134369254 -0.2722236067 -0.84790861607 -0.39809632301 -0.23830105364 -0.10152591765 -0.34985750914 -0.25397479534 -0.036359213293 \n-0.43547609448 -0.22615562379 -0.17415228486 -0.39213064313 -0.08275079727 -0.2522572577 -0.4609772265 -0.21786981821 -0.2522572577 \n-0.40312689543 -0.0747615695 -0.33371031284 -0.47390407324 -0.213669613 -0.33371031284 -0.40312689543 -0.0747615695 -0.41628968716 \n-0.47390407324 -0.213669613 -0.41628968716 -0.39213064313 -0.08275079727 -0.4977427423 -0.4609772265 -0.21786981821 -0.4977427423 \n-0.37043809891 -0.09851136803 -0.57584768534 -0.43547609448 -0.22615562379 -0.57584768534 -0.39809632301 -0.23830105364 -0.64847409725 \n-0.34985750914 -0.25397479534 -0.71364080906 -0.29207551479 -0.27274930477 -0.76957023144 -0.2263264358 -0.29411247372 -0.81473690271 \n-0.15440377593 -0.31748156249 -0.84790861607 -0.41858324409 -0.36765038967 -0.10152591765 -0.36786195636 -0.36765038967 -0.036359213293 \n-0.45788666606 -0.36765038967 -0.17415228486 -0.48470014334 -0.36765038967 -0.2522572577 -0.49829223752 -0.36765038967 -0.33371031284 \n-0.49829223752 -0.36765038967 -0.41628968716 -0.48470014334 -0.36765038967 -0.4977427423 -0.45788666606 -0.36765038967 -0.57584768534 \n-0.41858324409 -0.36765038967 -0.64847409725 -0.36786195636 -0.36765038967 -0.71364080906 -0.30710634589 -0.36765038967 -0.76957023144 \n-0.23797369003 -0.36765038967 -0.81473690271 -0.16234973073 -0.36765038967 -0.84790861607 -0.39809632301 -0.4969997257 -0.10152591765 \n-0.34985750914 -0.481325984 -0.036359213293 -0.43547609448 -0.50914515555 -0.17415228486 -0.4609772265 -0.51743096113 -0.2522572577 \n-0.47390407324 -0.52163116634 -0.33371031284 -0.47390407324 -0.52163116634 -0.41628968716 -0.4609772265 -0.51743096113 -0.4977427423 \n-0.43547609448 -0.50914515555 -0.57584768534 -0.39809632301 -0.4969997257 -0.64847409725 -0.34985750914 -0.481325984 -0.71364080906 \n-0.29207551479 -0.46255147457 -0.76957023144 -0.2263264358 -0.44118830561 -0.81473690271 -0.15440377593 -0.41781921685 -0.84790861607 \n-0.33864095807 -0.61368744075 -0.10152591765 -0.29760658741 -0.58387422562 -0.036359213293 -0.37043809891 -0.63678941131 -0.17415228486 \n-0.39213064313 -0.65254998207 -0.2522572577 -0.40312689543 -0.66053920984 -0.33371031284 -0.40312689543 -0.66053920984 -0.41628968716 \n-0.39213064313 -0.65254998207 -0.4977427423 -0.37043809891 -0.63678941131 -0.57584768534 -0.33864095807 -0.61368744075 -0.64847409725 \n-0.29760658741 -0.58387422562 -0.71364080906 -0.24845425785 -0.54816298187 -0.76957023144 -0.19252476096 -0.50752781331 -0.81473690271 \n-0.13134369254 -0.46307717264 -0.84790861607 -0.24603705108 -0.70629134774 -0.10152591765 -0.21622383595 -0.66525697708 -0.036359213293 \n-0.26913902164 -0.73808848858 -0.17415228486 -0.2848995924 -0.7597810328 -0.2522572577 -0.29288882017 -0.7707772851 -0.33371031284 \n-0.29288882017 -0.7707772851 -0.41628968716 -0.2848995924 -0.7597810328 -0.4977427423 -0.26913902164 -0.73808848858 -0.57584768534 \n-0.24603705108 -0.70629134774 -0.64847409725 -0.21622383595 -0.66525697708 -0.71364080906 -0.1805125922 -0.61610464752 -0.76957023144 \n-0.13987742364 -0.56017515063 -0.81473690271 -0.095426782966 -0.49899408221 -0.84790861607 -0.12934933603 -0.76574671268 -0.10152591765 \n-0.11367559433 -0.71750789881 -0.036359213293 -0.14149476588 -0.80312648415 -0.17415228486 -0.14978057146 -0.82862761617 -0.2522572577 \n-0.15398077667 -0.84155446291 -0.33371031284 -0.15398077667 -0.84155446291 -0.41628968716 -0.14978057146 -0.82862761617 -0.4977427423 \n-0.14149476588 -0.80312648415 -0.57584768534 -0.12934933603 -0.76574671268 -0.64847409725 -0.11367559433 -0.71750789881 -0.71364080906 \n-0.0949010849 -0.65972590446 -0.76957023144 -0.073537915945 -0.59397682547 -0.81473690271 -0.050168827176 -0.5220541656 -0.84790861607 \n-7.6892492899e-17 -0.78623363376 -0.10152591765 -6.7575143714e-17 -0.73551234603 -0.036359213293 -8.4112416453e-17 -0.82553705573 -0.17415228486 \n-8.9037972598e-17 -0.85235053301 -0.2522572577 -9.1534800733e-17 -0.86594262719 -0.33371031284 -9.1534800733e-17 -0.86594262719 -0.41628968716 \n-8.9037972598e-17 -0.85235053301 -0.4977427423 -8.4112416453e-17 -0.82553705573 -0.57584768534 -7.6892492899e-17 -0.78623363376 -0.64847409725 \n-6.7575143714e-17 -0.73551234603 -0.71364080906 -5.6414525104e-17 -0.67475673556 -0.76957023144 -4.3715059388e-17 -0.6056240797 -0.81473690271 \n-2.9823163188e-17 -0.5300001204 -0.84790861607 0.12934933603 -0.76574671268 -0.10152591765 0.11367559433 -0.71750789881 -0.036359213293 \n0.14149476588 -0.80312648415 -0.17415228486 0.14978057146 -0.82862761617 -0.2522572577 0.15398077667 -0.84155446291 -0.33371031284 \n0.15398077667 -0.84155446291 -0.41628968716 0.14978057146 -0.82862761617 -0.4977427423 0.14149476588 -0.80312648415 -0.57584768534 \n0.12934933603 -0.76574671268 -0.64847409725 0.11367559433 -0.71750789881 -0.71364080906 0.0949010849 -0.65972590446 -0.76957023144 \n0.073537915945 -0.59397682547 -0.81473690271 0.050168827176 -0.5220541656 -0.84790861607 0.24603705108 -0.70629134774 -0.10152591765 \n0.21622383595 -0.66525697708 -0.036359213293 0.26913902164 -0.73808848858 -0.17415228486 0.2848995924 -0.7597810328 -0.2522572577 \n0.29288882017 -0.7707772851 -0.33371031284 0.29288882017 -0.7707772851 -0.41628968716 0.2848995924 -0.7597810328 -0.4977427423 \n0.26913902164 -0.73808848858 -0.57584768534 0.24603705108 -0.70629134774 -0.64847409725 0.21622383595 -0.66525697708 -0.71364080906 \n0.1805125922 -0.61610464752 -0.76957023144 0.13987742364 -0.56017515063 -0.81473690271 0.095426782966 -0.49899408221 -0.84790861607 \n0.33864095807 -0.61368744075 -0.10152591765 0.29760658741 -0.58387422562 -0.036359213293 0.37043809891 -0.63678941131 -0.17415228486 \n0.39213064313 -0.65254998207 -0.2522572577 0.40312689543 -0.66053920984 -0.33371031284 0.40312689543 -0.66053920984 -0.41628968716 \n0.39213064313 -0.65254998207 -0.4977427423 0.37043809891 -0.63678941131 -0.57584768534 0.33864095807 -0.61368744075 -0.64847409725 \n0.29760658741 -0.58387422562 -0.71364080906 0.24845425785 -0.54816298187 -0.76957023144 0.19252476096 -0.50752781331 -0.81473690271 \n0.13134369254 -0.46307717264 -0.84790861607 0.39809632301 -0.4969997257 -0.10152591765 0.34985750914 -0.481325984 -0.036359213293 \n0.43547609448 -0.50914515555 -0.17415228486 0.4609772265 -0.51743096113 -0.2522572577 0.47390407324 -0.52163116634 -0.33371031284 \n0.47390407324 -0.52163116634 -0.41628968716 0.4609772265 -0.51743096113 -0.4977427423 0.43547609448 -0.50914515555 -0.57584768534 \n0.39809632301 -0.4969997257 -0.64847409725 0.34985750914 -0.481325984 -0.71364080906 0.29207551479 -0.46255147457 -0.76957023144 \n0.2263264358 -0.44118830561 -0.81473690271 0.15440377593 -0.41781921685 -0.84790861607 0.11367559433 -0.01779288053 -0.036359213293 \n-0.06169429886 -0.0490564831 -4.948707057e-09 -0.03977618435 -0.04558500037 -4.9487070858e-09 0.27192673088 -0 0.57584768534 \n0.27069649397 -0 0.5774751742 0.26711363272 4.1553108059e-17 0.58221496599 0.30937984586 -0 0.4977427423 \n0.30192517751 -0 0.51328875087 0.27314733197 -0 0.57330223674 0.32836532593 -0 0.41628968716 \n0.32266834667 -6.2825229394e-18 0.44073133224 0.31406304645 -0 0.47765049313 0.32836532593 -0 0.33371031284 \n0.32836532593 -0 0.36028577365 0.32836532593 -0 0.38971422635 0.30937984586 4.6419995184e-17 0.2522572577 \n0.31406304645 -0 0.27234950687 0.32266834667 -0 0.30926866776 0.27192673088 -0 0.17415228486 \n0.27314733197 4.0020505629e-17 0.17669773443 0.30192517751 4.6419995184e-17 0.2367112432 0.26711363272 -0 0.16778500813 \n0.27069649397 -0 0.172524797 0.18910284015 -1.3877787808e-17 0.64847409725 0.15567018303 3.1982502067e-09 0.66821801581 \n0.11945685202 8.213822419e-18 0.68960407547 0.21471874774 -9.1680539842e-10 0.62671700638 0.18910284015 -8.9702774348e-19 0.10152591765 \n0.21471874774 9.1680532811e-10 0.12328299513 0.11945685202 -7.3396281691e-18 0.060395944136 0.15567018303 -3.1982501979e-09 0.081782001353 \n0.0013357793734 5.8987374447e-17 0.71364080906 0.00026492740121 3.580072667e-11 0.71379694254 -7.2927397544e-17 4.4791795824e-17 0.71383556972 \n0.084245334712 -4.1420256797e-10 0.69676934902 0.0013357793734 2.0321142246e-18 0.036359213293 0.084245334712 4.1420255215e-10 0.053230671401 \n-0.00026492740121 -3.5800670328e-11 0.71379694254 -0.0013357793734 -2.0167190558e-17 0.71364080906 -0.084245334712 4.142025692e-10 0.69676934902 \n-0.11945685202 -8.213822419e-18 0.68960407547 -0.084245334712 -4.142025637e-10 0.053230671401 -0.0013357793721 -2.8086928153e-12 0.03635921329 \n-0.11945685202 0 0.060395944136 -0.15567018303 -3.1982502067e-09 0.66821801581 -0.18910284015 1.9235704642e-17 0.64847409725 \n-0.21471874774 9.1680539842e-10 0.62671700638 -0.26711363272 2.7755575616e-17 0.58221496599 -0.21471874774 -9.1680533409e-10 0.12328299513 \n-0.18910284015 7.1107605285e-18 0.10152591765 -0.26711363272 6.9388939039e-18 0.16778500813 -0.15567018303 3.1982502064e-09 0.081782001353 \n-0.27069649397 0 0.5774751742 -0.27192673088 0 0.57584768534 -0.27314733197 -1.7741792775e-17 0.57330223674 \n-0.30192517751 0 0.51328875087 -0.30937984586 0 0.4977427423 -0.31406304645 6.8087970166e-18 0.47765049313 \n-0.32266834667 6.2825229394e-18 0.44073133224 -0.32836532593 0 0.41628968716 -0.32836532593 0 0.38971422635 \n-0.32836532593 0 0.36028577365 -0.32836532593 0 0.33371031284 -0.32266834667 0 0.30926866776 \n-0.31406304645 0 0.27234950687 -0.30937984586 -4.6419995184e-17 0.2522572577 -0.30192517751 -3.2591634195e-17 0.2367112432 \n-0.27314733197 -4.0020505629e-17 0.17669773443 -0.27192673088 0 0.17415228486 -0.27069649397 0 0.172524797 \n1.8882986284e-17 -0.0392850764 2.3493044647e-24 7.4919300742e-16 1.2570311945e-16 0.036164452478 0.00026492740474 -3.2966321815e-11 0.036203079687 \n-0.00026492740474 3.2964535484e-11 0.036203079687 0.27192673088 -1.734723476e-17 -0.17415228486 0.27069649397 0 -0.172524797 \n0.26711363272 -1.1974942054e-17 -0.16778500813 0.30937984586 0 -0.2522572577 0.30192517751 0 -0.2367112432 \n0.27314733197 0 -0.17669773443 0.32836532593 0 -0.33371031284 0.32266834667 9.8462149666e-18 -0.30926866776 \n0.31406304645 0 -0.27234950687 0.32836532593 0 -0.41628968716 0.32836532593 0 -0.38971422635 \n0.32836532593 0 -0.36028577365 0.30937984586 2.1414328848e-17 -0.4977427423 0.31406304645 2.1700739201e-17 -0.47765049313 \n0.32266834667 0 -0.44073133224 0.27192673088 0 -0.57584768534 0.27314733197 -2.6409746232e-17 -0.57330223674 \n0.30192517751 0 -0.51328875087 0.26711363272 2.981762352e-17 -0.58221496599 0.27069649397 0 -0.5774751742 \n0.18910284015 1.4615867834e-19 -0.10152591765 0.15567018303 3.1982501993e-09 -0.081782001353 0.11945685202 -6.9388939039e-18 -0.060395944136 \n0.21471874774 -9.1680534009e-10 -0.12328299513 0.18910284015 7.6327832943e-17 -0.64847409725 0.21471874774 9.1680538064e-10 -0.62671700638 \n0.11945685202 -4.1246967093e-17 -0.68960407547 0.15567018303 -3.1982501175e-09 -0.66821801581 0.084245334712 -4.1420256382e-10 -0.053230671401 \n0.0013357793732 3.3328232481e-14 -0.036359213293 0.0013357793734 -1.8379180152e-20 -0.71364080906 0.084245334712 4.1420252463e-10 -0.69676934902 \n2.5130272163e-17 5.6342357555e-17 -0.71383556972 0.00026492740121 -3.5800634211e-11 -0.71379694254 -0.001335779373 -5.5709021832e-13 -0.036359213292 \n-0.084245334712 4.1420256259e-10 -0.053230671401 -0.11945685202 -2.8837501387e-19 -0.060395944136 -0.084245334712 -4.1420255572e-10 -0.69676934902 \n-0.0013357793734 -9.0124305588e-19 -0.71364080906 -0.11945685202 1.2064429234e-17 -0.68960407547 -0.00026492740121 3.5800726704e-11 -0.71379694254 \n-0.15567018303 -3.1982501959e-09 -0.081782001353 -0.18910284015 5.863387054e-20 -0.10152591765 -0.21471874774 9.1680533543e-10 -0.12328299513 \n-0.26711363272 1.1974942054e-17 -0.16778500813 -0.21471874774 -9.16805369e-10 -0.62671700638 -0.18910284015 -2.7168574339e-17 -0.64847409725 \n-0.26711363272 -2.981762352e-17 -0.58221496599 -0.15567018303 3.1982502117e-09 -0.66821801581 -0.27069649397 1.2313224346e-17 -0.172524797 \n-0.27192673088 -1.0408340856e-17 -0.17415228486 -0.27314733197 -1.6404615962e-17 -0.17669773443 -0.30192517751 -2.1976269538e-17 -0.2367112432 \n-0.30937984586 0 -0.2522572577 -0.31406304645 2.4627257152e-17 -0.27234950687 -0.32266834667 2.4100983075e-17 -0.30926866776 \n-0.32836532593 0 -0.33371031284 -0.32836532593 0 -0.36028577365 -0.32836532593 0 -0.38971422635 \n-0.32836532593 0 -0.41628968716 -0.32266834667 0 -0.44073133224 -0.31406304645 0 -0.47765049313 \n-0.30937984586 0 -0.4977427423 -0.30192517751 1.5062090412e-17 -0.51328875087 -0.27314733197 2.6409746232e-17 -0.57330223674 \n-0.27192673088 2.6252199938e-17 -0.57584768534 -0.27069649397 -3.0155905928e-17 -0.5774751742 0.00026492740119 3.5800326767e-11 -0.036203079689 \n-7.0437373612e-16 1.0134581512e-14 -0.036164452478 -0.00026492740119 -3.580032686e-11 -0.036203079689 0.082297295332 0.36765038967 0.86818063259 \n0.078269377351 0.393081652 0.86818063259 0 0.36765038967 0.875 0.066579908133 0.41602352634 0.86818063259 \n0.048373136669 0.4342302978 0.86818063259 0.025431262329 0.44591976702 0.86818063259 5.0392558428e-18 0.449947685 0.86818063259 \n-0.025431262329 0.44591976702 0.86818063259 -0.048373136669 0.4342302978 0.86818063259 -0.066579908133 0.41602352634 0.86818063259 \n-0.078269377351 0.393081652 0.86818063259 -0.082297295332 0.36765038967 0.86818063259 -0.078269377351 0.34221912734 0.86818063259 \n-0.066579908133 0.319277253 0.86818063259 -0.048373136669 0.30107048154 0.86818063259 -0.025431262329 0.28938101232 0.86818063259 \n-1.5117767942e-17 0.28535309434 0.86818063259 0.025431262329 0.28938101232 0.86818063259 0.048373136669 0.30107048154 0.86818063259 \n0.066579908133 0.319277253 0.86818063259 0.078269377351 0.34221912734 0.86818063259 0.16234973073 0.36765038967 0.84790861607 \n0.15440377593 0.41781921685 0.84790861607 0.23797369003 0.36765038967 0.81473690271 0.2263264358 0.44118830561 0.81473690271 \n0.30710634589 0.36765038967 0.76957023144 0.29207551479 0.46255147457 0.76957023144 0.36786195636 0.36765038967 0.71364080906 \n0.34985750914 0.481325984 0.71364080906 0.41858324409 0.36765038967 0.64847409725 0.39809632301 0.4969997257 0.64847409725 \n0.45788666606 0.36765038967 0.57584768534 0.43547609448 0.50914515555 0.57584768534 0.48470014334 0.36765038967 0.4977427423 \n0.4609772265 0.51743096113 0.4977427423 0.49829223752 0.36765038967 0.41628968716 0.47390407324 0.52163116634 0.41628968716 \n0.49829223752 0.36765038967 0.33371031284 0.47390407324 0.52163116634 0.33371031284 0.48470014334 0.36765038967 0.2522572577 \n0.4609772265 0.51743096113 0.2522572577 0.45788666606 0.36765038967 0.17415228486 0.43547609448 0.50914515555 0.17415228486 \n0.41858324409 0.36765038967 0.10152591765 0.39809632301 0.4969997257 0.10152591765 0.36786195636 0.36765038967 0.036359213293 \n0.34985750914 0.481325984 0.036359213293 0.13134369254 0.46307717264 0.84790861607 0.19252476096 0.50752781331 0.81473690271 \n0.24845425785 0.54816298187 0.76957023144 0.29760658741 0.58387422562 0.71364080906 0.33864095807 0.61368744075 0.64847409725 \n0.37043809891 0.63678941131 0.57584768534 0.39213064313 0.65254998207 0.4977427423 0.40312689543 0.66053920984 0.41628968716 \n0.40312689543 0.66053920984 0.33371031284 0.39213064313 0.65254998207 0.2522572577 0.37043809891 0.63678941131 0.17415228486 \n0.33864095807 0.61368744075 0.10152591765 0.29760658741 0.58387422562 0.036359213293 0.095426782966 0.49899408221 0.84790861607 \n0.13987742364 0.56017515063 0.81473690271 0.1805125922 0.61610464752 0.76957023144 0.21622383595 0.66525697708 0.71364080906 \n0.24603705108 0.70629134774 0.64847409725 0.26913902164 0.73808848858 0.57584768534 0.2848995924 0.7597810328 0.4977427423 \n0.29288882017 0.7707772851 0.41628968716 0.29288882017 0.7707772851 0.33371031284 0.2848995924 0.7597810328 0.2522572577 \n0.26913902164 0.73808848858 0.17415228486 0.24603705108 0.70629134774 0.10152591765 0.21622383595 0.66525697708 0.036359213293 \n0.050168827176 0.5220541656 0.84790861607 0.073537915945 0.59397682547 0.81473690271 0.0949010849 0.65972590446 0.76957023144 \n0.11367559433 0.71750789881 0.71364080906 0.12934933603 0.76574671268 0.64847409725 0.14149476588 0.80312648415 0.57584768534 \n0.14978057146 0.82862761617 0.4977427423 0.15398077667 0.84155446291 0.41628968716 0.15398077667 0.84155446291 0.33371031284 \n0.14978057146 0.82862761617 0.2522572577 0.14149476588 0.80312648415 0.17415228486 0.12934933603 0.76574671268 0.10152591765 \n0.11367559433 0.71750789881 0.036359213293 9.9410541201e-18 0.5300001204 0.84790861607 1.4571686463e-17 0.6056240797 0.81473690271 \n1.880484115e-17 0.67475673556 0.76957023144 2.2525047905e-17 0.73551234603 0.71364080906 2.5630831518e-17 0.78623363376 0.64847409725 \n2.8037472151e-17 0.82553705573 0.57584768534 2.9679323096e-17 0.85235053301 0.4977427423 3.0511599142e-17 0.86594262719 0.41628968716 \n3.0511599142e-17 0.86594262719 0.33371031284 2.9679323096e-17 0.85235053301 0.2522572577 2.8037472151e-17 0.82553705573 0.17415228486 \n2.5630831518e-17 0.78623363376 0.10152591765 2.2525047905e-17 0.73551234603 0.036359213293 -0.050168827176 0.5220541656 0.84790861607 \n-0.073537915945 0.59397682547 0.81473690271 -0.0949010849 0.65972590446 0.76957023144 -0.11367559433 0.71750789881 0.71364080906 \n-0.12934933603 0.76574671268 0.64847409725 -0.14149476588 0.80312648415 0.57584768534 -0.14978057146 0.82862761617 0.4977427423 \n-0.15398077667 0.84155446291 0.41628968716 -0.15398077667 0.84155446291 0.33371031284 -0.14978057146 0.82862761617 0.2522572577 \n-0.14149476588 0.80312648415 0.17415228486 -0.12934933603 0.76574671268 0.10152591765 -0.11367559433 0.71750789881 0.036359213293 \n-0.095426782966 0.49899408221 0.84790861607 -0.13987742364 0.56017515063 0.81473690271 -0.1805125922 0.61610464752 0.76957023144 \n-0.21622383595 0.66525697708 0.71364080906 -0.24603705108 0.70629134774 0.64847409725 -0.26913902164 0.73808848858 0.57584768534 \n-0.2848995924 0.7597810328 0.4977427423 -0.29288882017 0.7707772851 0.41628968716 -0.29288882017 0.7707772851 0.33371031284 \n-0.2848995924 0.7597810328 0.2522572577 -0.26913902164 0.73808848858 0.17415228486 -0.24603705108 0.70629134774 0.10152591765 \n-0.21622383595 0.66525697708 0.036359213293 -0.13134369254 0.46307717264 0.84790861607 -0.19252476096 0.50752781331 0.81473690271 \n-0.24845425785 0.54816298187 0.76957023144 -0.29760658741 0.58387422562 0.71364080906 -0.33864095807 0.61368744075 0.64847409725 \n-0.37043809891 0.63678941131 0.57584768534 -0.39213064313 0.65254998207 0.4977427423 -0.40312689543 0.66053920984 0.41628968716 \n-0.40312689543 0.66053920984 0.33371031284 -0.39213064313 0.65254998207 0.2522572577 -0.37043809891 0.63678941131 0.17415228486 \n-0.33864095807 0.61368744075 0.10152591765 -0.29760658741 0.58387422562 0.036359213293 -0.15440377593 0.41781921685 0.84790861607 \n-0.2263264358 0.44118830561 0.81473690271 -0.29207551479 0.46255147457 0.76957023144 -0.34985750914 0.481325984 0.71364080906 \n-0.39809632301 0.4969997257 0.64847409725 -0.43547609448 0.50914515555 0.57584768534 -0.4609772265 0.51743096113 0.4977427423 \n-0.47390407324 0.52163116634 0.41628968716 -0.47390407324 0.52163116634 0.33371031284 -0.4609772265 0.51743096113 0.2522572577 \n-0.43547609448 0.50914515555 0.17415228486 -0.39809632301 0.4969997257 0.10152591765 -0.34985750914 0.481325984 0.036359213293 \n-0.16234973073 0.36765038967 0.84790861607 -0.23797369003 0.36765038967 0.81473690271 -0.30710634589 0.36765038967 0.76957023144 \n-0.36786195636 0.36765038967 0.71364080906 -0.41858324409 0.36765038967 0.64847409725 -0.45788666606 0.36765038967 0.57584768534 \n-0.48470014334 0.36765038967 0.4977427423 -0.49829223752 0.36765038967 0.41628968716 -0.49829223752 0.36765038967 0.33371031284 \n-0.48470014334 0.36765038967 0.2522572577 -0.45788666606 0.36765038967 0.17415228486 -0.41858324409 0.36765038967 0.10152591765 \n-0.36786195636 0.36765038967 0.036359213293 -0.15440377593 0.31748156249 0.84790861607 -0.2263264358 0.29411247372 0.81473690271 \n-0.29207551479 0.27274930477 0.76957023144 -0.34985750914 0.25397479534 0.71364080906 -0.39809632301 0.23830105364 0.64847409725 \n-0.43547609448 0.22615562379 0.57584768534 -0.4609772265 0.21786981821 0.4977427423 -0.47390407324 0.213669613 0.41628968716 \n-0.47390407324 0.213669613 0.33371031284 -0.4609772265 0.21786981821 0.2522572577 -0.43547609448 0.22615562379 0.17415228486 \n-0.39809632301 0.23830105364 0.10152591765 -0.34985750914 0.25397479534 0.036359213293 -0.13134369254 0.2722236067 0.84790861607 \n-0.19252476096 0.22777296603 0.81473690271 -0.24845425785 0.18713779747 0.76957023144 -0.29760658741 0.15142655372 0.71364080906 \n-0.33864095807 0.12161333859 0.64847409725 -0.37043809891 0.09851136803 0.57584768534 -0.39213064313 0.08275079727 0.4977427423 \n-0.40312689543 0.0747615695 0.41628968716 -0.40312689543 0.0747615695 0.33371031284 -0.39213064313 0.08275079727 0.2522572577 \n-0.37043809891 0.09851136803 0.17415228486 -0.33864095807 0.12161333859 0.10152591765 -0.29760658741 0.15142655372 0.036359213293 \n-0.095426782966 0.23630669713 0.84790861607 -0.13987742364 0.17512562871 0.81473690271 -0.1805125922 0.11919613182 0.76957023144 \n-0.21622383595 0.07004380226 0.71364080906 -0.24603705108 0.0290094316 0.64847409725 -0.24603705108 0.0290094316 0.10152591765 \n-0.21622383595 0.07004380226 0.036359213293 -0.050168827176 0.21324661374 0.84790861607 -0.073537915945 0.14132395387 0.81473690271 \n-0.0949010849 0.07557487488 0.76957023144 -0.11367559433 0.01779288053 0.71364080906 -0.11367559433 0.01779288053 0.036359213293 \n-2.9823163188e-17 0.20530065894 0.84790861607 -4.3715059388e-17 0.12967669964 0.81473690271 -5.6414525104e-17 0.06054404378 0.76957023144 \n0.050168827176 0.21324661374 0.84790861607 0.073537915945 0.14132395387 0.81473690271 0.0949010849 0.07557487488 0.76957023144 \n0.11367559433 0.01779288053 0.71364080906 0.095426782966 0.23630669713 0.84790861607 0.13987742364 0.17512562871 0.81473690271 \n0.1805125922 0.11919613182 0.76957023144 0.21622383595 0.07004380226 0.71364080906 0.24603705108 0.0290094316 0.64847409725 \n0.13134369254 0.2722236067 0.84790861607 0.19252476096 0.22777296603 0.81473690271 0.24845425785 0.18713779747 0.76957023144 \n0.29760658741 0.15142655372 0.71364080906 0.33864095807 0.12161333859 0.64847409725 0.37043809891 0.09851136803 0.57584768534 \n0.24603705108 0.0290094316 0.10152591765 0.21622383595 0.07004380226 0.036359213293 0.29760658741 0.15142655372 0.036359213293 \n0.33864095807 0.12161333859 0.10152591765 0.15440377593 0.31748156249 0.84790861607 0.2263264358 0.29411247372 0.81473690271 \n0.29207551479 0.27274930477 0.76957023144 0.34985750914 0.25397479534 0.71364080906 0.39809632301 0.23830105364 0.64847409725 \n0.43547609448 0.22615562379 0.57584768534 0.39213064313 0.08275079727 0.4977427423 0.4609772265 0.21786981821 0.4977427423 \n0.40312689543 0.0747615695 0.41628968716 0.47390407324 0.213669613 0.41628968716 0.40312689543 0.0747615695 0.33371031284 \n0.47390407324 0.213669613 0.33371031284 0.39213064313 0.08275079727 0.2522572577 0.4609772265 0.21786981821 0.2522572577 \n0.37043809891 0.09851136803 0.17415228486 0.43547609448 0.22615562379 0.17415228486 0.39809632301 0.23830105364 0.10152591765 \n0.34985750914 0.25397479534 0.036359213293 0.32836531327 0.36765038967 -2.8171179001e-17 0.3220653893 0.40742657402 -4.9487070846e-09 \n0.31859390657 0.42934468853 -4.9487070599e-09 0.31229398553 0.46912085442 2.5407916269e-17 0.29401088933 0.50500345075 5.1429095066e-09 \n0.28393623162 0.52477607291 5.1429095066e-09 0.2656531266 0.56065868654 6.9388939039e-18 0.23717652592 0.58913528722 0 \n0.22148489755 0.60482691559 0 0.19300829687 0.63330351627 0 0.15712568324 0.65158662129 -5.1429094891e-09 \n0.13735306108 0.661661279 -5.1429095118e-09 0.10147046475 0.6799443752 -2.5197041461e-17 0.06169429886 0.68624429624 4.9487070318e-09 \n0.03977618435 0.68971577897 4.948707057e-09 1.8882986284e-17 0.69601570294 2.3493044647e-24 -0.03977618435 0.68971577897 -4.9487070858e-09 \n-0.06169429886 0.68624429624 -4.948707057e-09 -0.10147046475 0.6799443752 -4.4034066554e-18 -0.13735306108 0.661661279 5.1429095118e-09 \n-0.15712568324 0.65158662129 5.1429095066e-09 -0.19300829687 0.63330351627 2.0768586122e-18 -0.22148489755 0.60482691559 0 \n-0.23717652592 0.58913528722 0 -0.2656531266 0.56065868654 0 -0.28393623162 0.52477607291 -5.1429094753e-09 \n-0.29401088933 0.50500345075 -5.1429095118e-09 -0.31229398553 0.46912085442 -2.5407916269e-17 -0.31859390657 0.42934468853 4.9487070561e-09 \n-0.3220653893 0.40742657402 4.9487070561e-09 -0.32836531327 0.36765038967 4.8381435661e-24 -0.3220653893 0.32787420532 -4.9487070852e-09 \n-0.31859390657 0.30595609081 -4.9487070599e-09 -0.31229398553 0.26617992492 -2.9741361642e-18 -0.29401088933 0.23029732859 5.1429095066e-09 \n-0.28393623162 0.21052470643 5.1429095066e-09 -0.2656531266 0.1746420928 6.9388939039e-18 -0.23717652592 0.14616549212 0 \n-0.22148489755 0.13047386375 0 -0.19300829687 0.10199726307 0 -0.15712568324 0.08371415805 -5.1429094753e-09 \n-0.13735306108 0.07363950034 -5.1429094753e-09 -0.10147046475 0.05535640414 -2.540791296e-17 -0.06169429886 0.0490564831 4.9487070561e-09 \n-0.03977618435 0.04558500037 4.9487070565e-09 0.11367559433 0.01779288053 0.036359213293 0.10147046475 0.05535640414 -1.5448640187e-18 \n0.13735306108 0.07363950034 5.1429095066e-09 0.15712568324 0.08371415805 5.1429094891e-09 0.19300829687 0.10199726307 0 \n0.22148489755 0.13047386375 0 0.23717652592 0.14616549212 0 0.2656531266 0.1746420928 -2.0768619209e-18 \n0.28393623162 0.21052470643 -5.1429094753e-09 0.29401088933 0.23029732859 -5.1429095118e-09 0.31229398553 0.26617992492 2.9741345099e-18 \n0.31859390657 0.30595609081 4.9487070561e-09 0.3220653893 0.32787420532 4.9487070565e-09 0.082297295332 0.36765038967 -0.86818063259 \n0 0.36765038967 -0.875 0.078269377351 0.393081652 -0.86818063259 0.066579908133 0.41602352634 -0.86818063259 \n0.048373136669 0.4342302978 -0.86818063259 0.025431262329 0.44591976702 -0.86818063259 5.0392558428e-18 0.449947685 -0.86818063259 \n-0.025431262329 0.44591976702 -0.86818063259 -0.048373136669 0.4342302978 -0.86818063259 -0.066579908133 0.41602352634 -0.86818063259 \n-0.078269377351 0.393081652 -0.86818063259 -0.082297295332 0.36765038967 -0.86818063259 -0.078269377351 0.34221912734 -0.86818063259 \n-0.066579908133 0.319277253 -0.86818063259 -0.048373136669 0.30107048154 -0.86818063259 -0.025431262329 0.28938101232 -0.86818063259 \n-1.5117767942e-17 0.28535309434 -0.86818063259 0.025431262329 0.28938101232 -0.86818063259 0.048373136669 0.30107048154 -0.86818063259 \n0.066579908133 0.319277253 -0.86818063259 0.078269377351 0.34221912734 -0.86818063259 0.36786195636 0.36765038967 -0.036359213293 \n0.41858324409 0.36765038967 -0.10152591765 0.39809632301 0.4969997257 -0.10152591765 0.34985750914 0.481325984 -0.036359213293 \n0.45788666606 0.36765038967 -0.17415228486 0.43547609448 0.50914515555 -0.17415228486 0.48470014334 0.36765038967 -0.2522572577 \n0.4609772265 0.51743096113 -0.2522572577 0.49829223752 0.36765038967 -0.33371031284 0.47390407324 0.52163116634 -0.33371031284 \n0.49829223752 0.36765038967 -0.41628968716 0.47390407324 0.52163116634 -0.41628968716 0.48470014334 0.36765038967 -0.4977427423 \n0.4609772265 0.51743096113 -0.4977427423 0.45788666606 0.36765038967 -0.57584768534 0.43547609448 0.50914515555 -0.57584768534 \n0.41858324409 0.36765038967 -0.64847409725 0.39809632301 0.4969997257 -0.64847409725 0.36786195636 0.36765038967 -0.71364080906 \n0.34985750914 0.481325984 -0.71364080906 0.30710634589 0.36765038967 -0.76957023144 0.29207551479 0.46255147457 -0.76957023144 \n0.23797369003 0.36765038967 -0.81473690271 0.2263264358 0.44118830561 -0.81473690271 0.16234973073 0.36765038967 -0.84790861607 \n0.15440377593 0.41781921685 -0.84790861607 0.33864095807 0.61368744075 -0.10152591765 0.29760658741 0.58387422562 -0.036359213293 \n0.37043809891 0.63678941131 -0.17415228486 0.39213064313 0.65254998207 -0.2522572577 0.40312689543 0.66053920984 -0.33371031284 \n0.40312689543 0.66053920984 -0.41628968716 0.39213064313 0.65254998207 -0.4977427423 0.37043809891 0.63678941131 -0.57584768534 \n0.33864095807 0.61368744075 -0.64847409725 0.29760658741 0.58387422562 -0.71364080906 0.24845425785 0.54816298187 -0.76957023144 \n0.19252476096 0.50752781331 -0.81473690271 0.13134369254 0.46307717264 -0.84790861607 0.24603705108 0.70629134774 -0.10152591765 \n0.21622383595 0.66525697708 -0.036359213293 0.26913902164 0.73808848858 -0.17415228486 0.2848995924 0.7597810328 -0.2522572577 \n0.29288882017 0.7707772851 -0.33371031284 0.29288882017 0.7707772851 -0.41628968716 0.2848995924 0.7597810328 -0.4977427423 \n0.26913902164 0.73808848858 -0.57584768534 0.24603705108 0.70629134774 -0.64847409725 0.21622383595 0.66525697708 -0.71364080906 \n0.1805125922 0.61610464752 -0.76957023144 0.13987742364 0.56017515063 -0.81473690271 0.095426782966 0.49899408221 -0.84790861607 \n0.12934933603 0.76574671268 -0.10152591765 0.11367559433 0.71750789881 -0.036359213293 0.14149476588 0.80312648415 -0.17415228486 \n0.14978057146 0.82862761617 -0.2522572577 0.15398077667 0.84155446291 -0.33371031284 0.15398077667 0.84155446291 -0.41628968716 \n0.14978057146 0.82862761617 -0.4977427423 0.14149476588 0.80312648415 -0.57584768534 0.12934933603 0.76574671268 -0.64847409725 \n0.11367559433 0.71750789881 -0.71364080906 0.0949010849 0.65972590446 -0.76957023144 0.073537915945 0.59397682547 -0.81473690271 \n0.050168827176 0.5220541656 -0.84790861607 2.5630831518e-17 0.78623363376 -0.10152591765 2.2525047905e-17 0.73551234603 -0.036359213293 \n2.8037472151e-17 0.82553705573 -0.17415228486 2.9679323096e-17 0.85235053301 -0.2522572577 3.0511599142e-17 0.86594262719 -0.33371031284 \n3.0511599142e-17 0.86594262719 -0.41628968716 2.9679323096e-17 0.85235053301 -0.4977427423 2.8037472151e-17 0.82553705573 -0.57584768534 \n2.5630831518e-17 0.78623363376 -0.64847409725 2.2525047905e-17 0.73551234603 -0.71364080906 1.880484115e-17 0.67475673556 -0.76957023144 \n1.4571686463e-17 0.6056240797 -0.81473690271 9.9410541201e-18 0.5300001204 -0.84790861607 -0.12934933603 0.76574671268 -0.10152591765 \n-0.11367559433 0.71750789881 -0.036359213293 -0.14149476588 0.80312648415 -0.17415228486 -0.14978057146 0.82862761617 -0.2522572577 \n-0.15398077667 0.84155446291 -0.33371031284 -0.15398077667 0.84155446291 -0.41628968716 -0.14978057146 0.82862761617 -0.4977427423 \n-0.14149476588 0.80312648415 -0.57584768534 -0.12934933603 0.76574671268 -0.64847409725 -0.11367559433 0.71750789881 -0.71364080906 \n-0.0949010849 0.65972590446 -0.76957023144 -0.073537915945 0.59397682547 -0.81473690271 -0.050168827176 0.5220541656 -0.84790861607 \n-0.24603705108 0.70629134774 -0.10152591765 -0.21622383595 0.66525697708 -0.036359213293 -0.26913902164 0.73808848858 -0.17415228486 \n-0.2848995924 0.7597810328 -0.2522572577 -0.29288882017 0.7707772851 -0.33371031284 -0.29288882017 0.7707772851 -0.41628968716 \n-0.2848995924 0.7597810328 -0.4977427423 -0.26913902164 0.73808848858 -0.57584768534 -0.24603705108 0.70629134774 -0.64847409725 \n-0.21622383595 0.66525697708 -0.71364080906 -0.1805125922 0.61610464752 -0.76957023144 -0.13987742364 0.56017515063 -0.81473690271 \n-0.095426782966 0.49899408221 -0.84790861607 -0.33864095807 0.61368744075 -0.10152591765 -0.29760658741 0.58387422562 -0.036359213293 \n-0.37043809891 0.63678941131 -0.17415228486 -0.39213064313 0.65254998207 -0.2522572577 -0.40312689543 0.66053920984 -0.33371031284 \n-0.40312689543 0.66053920984 -0.41628968716 -0.39213064313 0.65254998207 -0.4977427423 -0.37043809891 0.63678941131 -0.57584768534 \n-0.33864095807 0.61368744075 -0.64847409725 -0.29760658741 0.58387422562 -0.71364080906 -0.24845425785 0.54816298187 -0.76957023144 \n-0.19252476096 0.50752781331 -0.81473690271 -0.13134369254 0.46307717264 -0.84790861607 -0.39809632301 0.4969997257 -0.10152591765 \n-0.34985750914 0.481325984 -0.036359213293 -0.43547609448 0.50914515555 -0.17415228486 -0.4609772265 0.51743096113 -0.2522572577 \n-0.47390407324 0.52163116634 -0.33371031284 -0.47390407324 0.52163116634 -0.41628968716 -0.4609772265 0.51743096113 -0.4977427423 \n-0.43547609448 0.50914515555 -0.57584768534 -0.39809632301 0.4969997257 -0.64847409725 -0.34985750914 0.481325984 -0.71364080906 \n-0.29207551479 0.46255147457 -0.76957023144 -0.2263264358 0.44118830561 -0.81473690271 -0.15440377593 0.41781921685 -0.84790861607 \n-0.41858324409 0.36765038967 -0.10152591765 -0.36786195636 0.36765038967 -0.036359213293 -0.45788666606 0.36765038967 -0.17415228486 \n-0.48470014334 0.36765038967 -0.2522572577 -0.49829223752 0.36765038967 -0.33371031284 -0.49829223752 0.36765038967 -0.41628968716 \n-0.48470014334 0.36765038967 -0.4977427423 -0.45788666606 0.36765038967 -0.57584768534 -0.41858324409 0.36765038967 -0.64847409725 \n-0.36786195636 0.36765038967 -0.71364080906 -0.30710634589 0.36765038967 -0.76957023144 -0.23797369003 0.36765038967 -0.81473690271 \n-0.16234973073 0.36765038967 -0.84790861607 -0.39809632301 0.23830105364 -0.10152591765 -0.34985750914 0.25397479534 -0.036359213293 \n-0.43547609448 0.22615562379 -0.17415228486 -0.4609772265 0.21786981821 -0.2522572577 -0.47390407324 0.213669613 -0.33371031284 \n-0.47390407324 0.213669613 -0.41628968716 -0.4609772265 0.21786981821 -0.4977427423 -0.43547609448 0.22615562379 -0.57584768534 \n-0.39809632301 0.23830105364 -0.64847409725 -0.34985750914 0.25397479534 -0.71364080906 -0.29207551479 0.27274930477 -0.76957023144 \n-0.2263264358 0.29411247372 -0.81473690271 -0.15440377593 0.31748156249 -0.84790861607 -0.33864095807 0.12161333859 -0.10152591765 \n-0.29760658741 0.15142655372 -0.036359213293 -0.37043809891 0.09851136803 -0.17415228486 -0.39213064313 0.08275079727 -0.2522572577 \n-0.40312689543 0.0747615695 -0.33371031284 -0.40312689543 0.0747615695 -0.41628968716 -0.39213064313 0.08275079727 -0.4977427423 \n-0.37043809891 0.09851136803 -0.57584768534 -0.33864095807 0.12161333859 -0.64847409725 -0.29760658741 0.15142655372 -0.71364080906 \n-0.24845425785 0.18713779747 -0.76957023144 -0.19252476096 0.22777296603 -0.81473690271 -0.13134369254 0.2722236067 -0.84790861607 \n-0.24603705108 0.0290094316 -0.10152591765 -0.21622383595 0.07004380226 -0.036359213293 -0.24603705108 0.0290094316 -0.64847409725 \n-0.21622383595 0.07004380226 -0.71364080906 -0.1805125922 0.11919613182 -0.76957023144 -0.13987742364 0.17512562871 -0.81473690271 \n-0.095426782966 0.23630669713 -0.84790861607 -0.11367559433 0.01779288053 -0.71364080906 -0.0949010849 0.07557487488 -0.76957023144 \n-0.073537915945 0.14132395387 -0.81473690271 -0.050168827176 0.21324661374 -0.84790861607 -5.6414525104e-17 0.06054404378 -0.76957023144 \n-4.3715059388e-17 0.12967669964 -0.81473690271 -2.9823163188e-17 0.20530065894 -0.84790861607 0.073537915945 0.14132395387 -0.81473690271 \n0.0949010849 0.07557487488 -0.76957023144 0.050168827176 0.21324661374 -0.84790861607 0.11367559433 0.01779288053 -0.036359213293 \n0.24603705108 0.0290094316 -0.10152591765 0.21622383595 0.07004380226 -0.036359213293 0.11367559433 0.01779288053 -0.71364080906 \n0.1805125922 0.11919613182 -0.76957023144 0.21622383595 0.07004380226 -0.71364080906 0.13987742364 0.17512562871 -0.81473690271 \n0.095426782966 0.23630669713 -0.84790861607 0.33864095807 0.12161333859 -0.10152591765 0.29760658741 0.15142655372 -0.036359213293 \n0.37043809891 0.09851136803 -0.17415228486 0.24603705108 0.0290094316 -0.64847409725 0.29760658741 0.15142655372 -0.71364080906 \n0.33864095807 0.12161333859 -0.64847409725 0.24845425785 0.18713779747 -0.76957023144 0.19252476096 0.22777296603 -0.81473690271 \n0.13134369254 0.2722236067 -0.84790861607 0.39809632301 0.23830105364 -0.10152591765 0.34985750914 0.25397479534 -0.036359213293 \n0.43547609448 0.22615562379 -0.17415228486 0.39213064313 0.08275079727 -0.2522572577 0.4609772265 0.21786981821 -0.2522572577 \n0.40312689543 0.0747615695 -0.33371031284 0.47390407324 0.213669613 -0.33371031284 0.40312689543 0.0747615695 -0.41628968716 \n0.47390407324 0.213669613 -0.41628968716 0.39213064313 0.08275079727 -0.4977427423 0.4609772265 0.21786981821 -0.4977427423 \n0.37043809891 0.09851136803 -0.57584768534 0.43547609448 0.22615562379 -0.57584768534 0.39809632301 0.23830105364 -0.64847409725 \n0.34985750914 0.25397479534 -0.71364080906 0.29207551479 0.27274930477 -0.76957023144 0.2263264358 0.29411247372 -0.81473690271 \n0.15440377593 0.31748156249 -0.84790861607 -0.11367559433 0.01779288053 -0.036359213293 0.06169429886 0.0490564831 -4.9487070591e-09 \n0.03977618435 0.04558500037 -4.9487070556e-09 -5.8492876492e-17 0.0392850764 -8.5284299912e-18 \nPOLYGONS 2113 6688\nOFFSETS vtktypeint64\n0 3 6 9 12 15 18 21 24 \n27 30 33 36 39 42 45 48 51 \n54 57 60 63 66 69 72 75 78 \n81 84 87 90 93 96 99 102 105 \n108 111 114 117 120 123 126 129 132 \n135 138 141 144 147 150 153 156 159 \n162 165 168 171 174 177 180 183 186 \n189 192 195 198 201 204 207 210 213 \n216 219 222 225 228 231 234 237 240 \n243 246 249 252 255 258 261 264 267 \n270 273 276 279 282 285 288 291 294 \n297 300 303 306 309 312 315 318 321 \n324 327 330 333 336 339 342 345 348 \n351 354 357 360 363 366 369 372 375 \n378 381 384 387 390 393 396 399 402 \n405 408 411 414 417 420 423 426 429 \n432 435 438 441 444 447 450 453 456 \n459 462 465 468 471 474 477 480 483 \n486 489 492 495 498 501 504 507 510 \n513 516 519 522 525 528 531 534 537 \n540 543 546 549 552 555 558 561 564 \n567 570 573 576 579 582 585 588 591 \n594 597 600 603 606 609 612 615 618 \n621 624 627 630 633 636 639 642 645 \n648 651 654 657 660 663 666 669 672 \n675 678 681 684 687 690 693 696 699 \n702 705 708 711 714 717 720 723 726 \n729 732 735 738 741 744 747 750 753 \n756 759 762 765 768 771 774 777 780 \n783 786 789 792 795 798 801 804 807 \n810 813 816 819 822 825 828 831 834 \n837 840 843 846 849 852 855 858 861 \n864 867 870 873 876 879 882 885 888 \n891 894 897 900 903 906 909 912 915 \n918 921 924 927 930 933 936 939 942 \n945 948 951 954 957 960 963 966 969 \n972 975 978 981 984 987 990 993 996 \n999 1002 1005 1008 1011 1014 1017 1020 1023 \n1026 1029 1032 1035 1038 1041 1044 1047 1050 \n1053 1056 1059 1062 1065 1068 1071 1074 1077 \n1080 1083 1086 1089 1092 1095 1098 1101 1104 \n1107 1110 1113 1116 1119 1122 1125 1128 1131 \n1134 1137 1140 1143 1146 1149 1152 1155 1158 \n1161 1164 1167 1170 1173 1176 1179 1182 1185 \n1188 1191 1194 1197 1200 1203 1206 1209 1212 \n1215 1218 1221 1224 1227 1230 1233 1236 1239 \n1242 1245 1248 1251 1254 1257 1260 1263 1266 \n1269 1272 1275 1278 1281 1284 1287 1290 1293 \n1296 1299 1302 1305 1308 1311 1314 1317 1320 \n1323 1327 1331 1335 1339 1343 1347 1351 1355 \n1359 1363 1367 1371 1375 1379 1383 1387 1391 \n1395 1399 1403 1407 1411 1415 1419 1423 1427 \n1431 1435 1439 1443 1447 1451 1455 1459 1463 \n1467 1471 1474 1477 1480 1483 1486 1489 1492 \n1495 1498 1501 1504 1507 1510 1513 1516 1519 \n1522 1525 1528 1531 1534 1537 1540 1543 1546 \n1549 1552 1555 1558 1561 1564 1567 1570 1573 \n1576 1579 1582 1585 1588 1591 1594 1597 1600 \n1603 1606 1609 1612 1615 1618 1621 1624 1627 \n1630 1633 1636 1639 1642 1645 1648 1651 1654 \n1657 1660 1663 1666 1669 1672 1675 1678 1681 \n1684 1687 1690 1693 1696 1699 1702 1705 1708 \n1711 1714 1717 1720 1723 1726 1729 1732 1735 \n1738 1741 1744 1747 1750 1753 1756 1759 1762 \n1765 1768 1771 1774 1777 1780 1783 1786 1789 \n1792 1795 1798 1801 1804 1807 1810 1813 1816 \n1819 1822 1825 1828 1831 1834 1837 1840 1843 \n1846 1849 1852 1855 1858 1861 1864 1867 1870 \n1873 1876 1879 1882 1885 1888 1891 1894 1897 \n1900 1903 1906 1909 1912 1915 1918 1921 1924 \n1927 1930 1933 1936 1939 1942 1945 1948 1951 \n1954 1957 1960 1963 1966 1969 1972 1975 1978 \n1981 1984 1987 1990 1993 1996 1999 2002 2005 \n2008 2011 2014 2017 2020 2023 2026 2029 2032 \n2035 2038 2041 2044 2047 2050 2053 2056 2059 \n2062 2065 2068 2071 2074 2077 2080 2083 2086 \n2089 2092 2095 2098 2101 2104 2107 2110 2113 \n2116 2119 2122 2125 2128 2131 2134 2137 2140 \n2143 2146 2149 2152 2155 2158 2161 2164 2167 \n2170 2173 2176 2179 2182 2185 2188 2191 2194 \n2197 2200 2203 2206 2209 2212 2215 2218 2221 \n2224 2227 2230 2233 2236 2239 2242 2245 2248 \n2251 2254 2257 2260 2263 2266 2269 2272 2275 \n2278 2281 2284 2287 2290 2293 2296 2299 2302 \n2305 2308 2311 2314 2317 2320 2323 2326 2329 \n2332 2335 2338 2341 2344 2347 2350 2353 2356 \n2359 2362 2365 2368 2371 2374 2377 2380 2383 \n2386 2389 2392 2395 2398 2401 2404 2407 2410 \n2413 2416 2419 2422 2425 2428 2431 2434 2437 \n2440 2443 2446 2449 2452 2455 2458 2461 2464 \n2467 2470 2473 2476 2479 2482 2485 2488 2491 \n2494 2497 2500 2503 2506 2509 2512 2515 2518 \n2521 2524 2527 2530 2533 2536 2539 2542 2545 \n2548 2551 2554 2557 2560 2563 2566 2569 2572 \n2575 2578 2581 2584 2587 2590 2593 2596 2599 \n2602 2605 2608 2611 2614 2617 2620 2623 2626 \n2629 2632 2635 2638 2641 2644 2647 2650 2653 \n2656 2659 2662 2665 2668 2671 2674 2677 2680 \n2683 2686 2689 2692 2695 2698 2701 2704 2707 \n2710 2713 2716 2719 2722 2725 2728 2731 2734 \n2737 2740 2743 2746 2749 2752 2755 2758 2761 \n2764 2767 2770 2773 2776 2779 2782 2785 2788 \n2791 2794 2798 2802 2806 2810 2814 2818 2822 \n2826 2830 2834 2838 2842 2846 2850 2854 2858 \n2862 2866 2870 2874 2878 2882 2886 2890 2894 \n2898 2902 2906 2910 2914 2918 2922 2926 2930 \n2934 2938 2942 2946 2950 2954 2958 2962 2966 \n2970 2974 2978 2982 2986 2990 2995 2999 3003 \n3006 3009 3013 3018 3022 3026 3029 3032 3036 \n3041 3045 3048 3051 3056 3060 3063 3066 3070 \n3074 3079 3083 3087 3091 3095 3099 3103 3107 \n3111 3115 3119 3123 3127 3133 3138 3143 3147 \n3151 3155 3159 3163 3167 3171 3175 3179 3183 \n3187 3191 3196 3200 3204 3207 3210 3214 3219 \n3222 3225 3229 3234 3238 3241 3244 3248 3252 \n3257 3261 3264 3267 3271 3275 3280 3284 3288 \n3292 3296 3300 3304 3308 3312 3316 3320 3324 \n3328 3333 3338 3344 3347 3350 3353 3356 3359 \n3362 3365 3368 3371 3374 3377 3380 3383 3386 \n3389 3392 3395 3398 3401 3404 3407 3410 3413 \n3416 3419 3422 3425 3428 3431 3434 3437 3440 \n3443 3446 3449 3452 3455 3458 3461 3464 3467 \n3470 3473 3476 3479 3482 3485 3488 3491 3494 \n3497 3500 3503 3506 3509 3512 3515 3518 3521 \n3524 3527 3530 3533 3536 3539 3542 3545 3548 \n3551 3554 3557 3560 3563 3566 3569 3572 3575 \n3578 3581 3584 3587 3590 3593 3596 3599 3602 \n3605 3608 3611 3614 3617 3620 3623 3626 3629 \n3632 3635 3638 3641 3644 3647 3650 3653 3656 \n3659 3662 3665 3668 3671 3674 3677 3680 3683 \n3686 3689 3692 3695 3698 3701 3704 3707 3710 \n3713 3716 3719 3722 3725 3728 3731 3734 3737 \n3740 3743 3746 3749 3752 3755 3758 3761 3764 \n3767 3770 3773 3776 3779 3782 3785 3788 3791 \n3794 3797 3800 3803 3806 3809 3812 3815 3818 \n3821 3824 3827 3830 3833 3836 3839 3842 3845 \n3848 3851 3854 3857 3860 3863 3866 3869 3872 \n3875 3878 3881 3884 3887 3890 3893 3896 3899 \n3902 3905 3908 3911 3914 3917 3920 3923 3926 \n3929 3932 3935 3938 3941 3944 3947 3950 3953 \n3956 3959 3962 3965 3968 3971 3974 3977 3980 \n3983 3986 3989 3992 3995 3998 4001 4004 4007 \n4010 4013 4016 4019 4022 4025 4028 4031 4034 \n4037 4040 4043 4046 4049 4052 4055 4058 4061 \n4064 4067 4070 4073 4076 4079 4082 4085 4088 \n4091 4094 4097 4100 4103 4106 4109 4112 4115 \n4118 4121 4124 4127 4130 4133 4136 4139 4142 \n4145 4148 4151 4154 4157 4160 4163 4166 4169 \n4172 4175 4178 4181 4184 4187 4190 4193 4196 \n4199 4202 4205 4208 4211 4214 4217 4220 4223 \n4226 4229 4232 4235 4238 4241 4244 4247 4250 \n4253 4256 4259 4262 4265 4268 4271 4274 4277 \n4280 4283 4286 4289 4292 4295 4298 4301 4304 \n4307 4310 4313 4316 4319 4322 4325 4328 4331 \n4334 4337 4340 4343 4346 4349 4352 4355 4358 \n4361 4364 4367 4370 4373 4376 4379 4382 4385 \n4388 4391 4394 4397 4400 4403 4406 4409 4412 \n4415 4418 4421 4424 4427 4430 4433 4436 4439 \n4442 4445 4448 4451 4454 4457 4460 4463 4466 \n4469 4472 4475 4478 4481 4484 4487 4490 4493 \n4496 4499 4502 4505 4508 4511 4514 4517 4520 \n4523 4526 4529 4532 4535 4538 4541 4544 4547 \n4550 4553 4556 4559 4562 4565 4568 4571 4574 \n4577 4580 4583 4586 4589 4592 4595 4598 4601 \n4604 4607 4610 4613 4616 4619 4622 4625 4628 \n4631 4634 4637 4640 4643 4646 4649 4652 4655 \n4658 4661 4664 4667 4671 4675 4679 4683 4687 \n4691 4695 4699 4703 4707 4711 4715 4719 4723 \n4727 4731 4735 4739 4743 4747 4751 4755 4759 \n4763 4767 4771 4775 4779 4783 4787 4791 4795 \n4799 4803 4807 4811 4815 4818 4821 4824 4827 \n4830 4833 4836 4839 4842 4845 4848 4851 4854 \n4857 4860 4863 4866 4869 4872 4875 4878 4881 \n4884 4887 4890 4893 4896 4899 4902 4905 4908 \n4911 4914 4917 4920 4923 4926 4929 4932 4935 \n4938 4941 4944 4947 4950 4953 4956 4959 4962 \n4965 4968 4971 4974 4977 4980 4983 4986 4989 \n4992 4995 4998 5001 5004 5007 5010 5013 5016 \n5019 5022 5025 5028 5031 5034 5037 5040 5043 \n5046 5049 5052 5055 5058 5061 5064 5067 5070 \n5073 5076 5079 5082 5085 5088 5091 5094 5097 \n5100 5103 5106 5109 5112 5115 5118 5121 5124 \n5127 5130 5133 5136 5139 5142 5145 5148 5151 \n5154 5157 5160 5163 5166 5169 5172 5175 5178 \n5181 5184 5187 5190 5193 5196 5199 5202 5205 \n5208 5211 5214 5217 5220 5223 5226 5229 5232 \n5235 5238 5241 5244 5247 5250 5253 5256 5259 \n5262 5265 5268 5271 5274 5277 5280 5283 5286 \n5289 5292 5295 5298 5301 5304 5307 5310 5313 \n5316 5319 5322 5325 5328 5331 5334 5337 5340 \n5343 5346 5349 5352 5355 5358 5361 5364 5367 \n5370 5373 5376 5379 5382 5385 5388 5391 5394 \n5397 5400 5403 5406 5409 5412 5415 5418 5421 \n5424 5427 5430 5433 5436 5439 5442 5445 5448 \n5451 5454 5457 5460 5463 5466 5469 5472 5475 \n5478 5481 5484 5487 5490 5493 5496 5499 5502 \n5505 5508 5511 5514 5517 5520 5523 5526 5529 \n5532 5535 5538 5541 5544 5547 5550 5553 5556 \n5559 5562 5565 5568 5571 5574 5577 5580 5583 \n5586 5589 5592 5595 5598 5601 5604 5607 5610 \n5613 5616 5619 5622 5625 5628 5631 5634 5637 \n5640 5643 5646 5649 5652 5655 5658 5661 5664 \n5667 5670 5673 5676 5679 5682 5685 5688 5691 \n5694 5697 5700 5703 5706 5709 5712 5715 5718 \n5721 5724 5727 5730 5733 5736 5739 5742 5745 \n5748 5751 5754 5757 5760 5763 5766 5769 5772 \n5775 5778 5781 5784 5787 5790 5793 5796 5799 \n5802 5805 5808 5811 5814 5817 5820 5823 5826 \n5829 5832 5835 5838 5841 5844 5847 5850 5853 \n5856 5859 5862 5865 5868 5871 5874 5877 5880 \n5883 5886 5889 5892 5895 5898 5901 5904 5907 \n5910 5913 5916 5919 5922 5925 5928 5931 5934 \n5937 5940 5943 5946 5949 5952 5955 5958 5961 \n5964 5967 5970 5973 5976 5979 5982 5985 5988 \n5991 5994 5997 6000 6003 6006 6009 6012 6015 \n6018 6021 6024 6027 6030 6033 6036 6039 6042 \n6045 6048 6051 6054 6057 6060 6063 6066 6069 \n6072 6075 6078 6081 6084 6087 6090 6093 6096 \n6099 6102 6105 6108 6111 6114 6117 6120 6123 \n6126 6129 6132 6135 6138 6142 6146 6150 6154 \n6158 6162 6166 6170 6174 6178 6182 6186 6190 \n6194 6198 6202 6206 6210 6214 6218 6222 6226 \n6230 6234 6238 6242 6246 6250 6254 6258 6262 \n6266 6270 6274 6278 6282 6286 6290 6294 6298 \n6302 6306 6310 6314 6318 6322 6326 6330 6334 \n6339 6343 6347 6350 6353 6357 6362 6366 6370 \n6373 6376 6380 6385 6389 6392 6395 6400 6404 \n6407 6410 6414 6418 6423 6427 6431 6435 6439 \n6443 6447 6451 6455 6459 6463 6467 6471 6477 \n6482 6487 6491 6495 6499 6503 6507 6511 6515 \n6519 6523 6527 6531 6535 6540 6544 6548 6551 \n6554 6558 6563 6566 6569 6573 6578 6582 6585 \n6588 6592 6596 6601 6605 6608 6611 6615 6619 \n6624 6628 6632 6636 6640 6644 6648 6652 6656 \n6660 6664 6668 6672 6677 6682 6688 \nCONNECTIVITY vtktypeint64\n0 1 2 1 3 2 3 4 2 \n4 5 2 5 6 2 6 7 2 \n7 8 2 8 9 2 9 10 2 \n10 11 2 11 12 2 12 13 2 \n13 14 2 14 15 2 15 16 2 \n16 17 2 17 18 2 18 19 2 \n19 20 2 20 0 2 0 21 22 \n0 22 1 21 23 24 21 24 22 \n23 25 26 23 26 24 25 27 28 \n25 28 26 27 29 30 27 30 28 \n29 31 32 29 32 30 31 33 34 \n31 34 32 33 35 36 33 36 34 \n35 37 38 35 38 36 37 39 40 \n37 40 38 39 41 42 39 42 40 \n41 43 44 41 44 42 43 45 46 \n43 46 44 1 22 47 1 47 3 \n22 24 48 22 48 47 24 26 49 \n24 49 48 26 28 50 26 50 49 \n28 30 51 28 51 50 30 32 52 \n30 52 51 32 34 53 32 53 52 \n34 36 54 34 54 53 36 38 55 \n36 55 54 38 40 56 38 56 55 \n40 42 57 40 57 56 42 44 58 \n42 58 57 44 46 59 44 59 58 \n3 47 60 3 60 4 47 48 61 \n47 61 60 48 49 62 48 62 61 \n49 50 63 49 63 62 50 51 64 \n50 64 63 57 58 65 58 59 66 \n58 66 65 4 60 67 4 67 5 \n60 61 68 60 68 67 61 62 69 \n61 69 68 62 63 70 62 70 69 \n65 66 71 5 67 72 5 72 6 \n67 68 73 67 73 72 68 69 74 \n68 74 73 6 72 75 6 75 7 \n72 73 76 72 76 75 73 74 77 \n73 77 76 74 78 77 7 75 79 \n7 79 8 75 76 80 75 80 79 \n76 77 81 76 81 80 77 78 82 \n77 82 81 78 83 82 8 79 84 \n8 84 9 79 80 85 79 85 84 \n80 81 86 80 86 85 81 82 87 \n81 87 86 82 83 88 82 88 87 \n83 89 88 90 91 92 90 92 93 \n9 84 94 9 94 10 84 85 95 \n84 95 94 85 86 96 85 96 95 \n86 87 97 86 97 96 87 88 98 \n87 98 97 88 89 99 88 99 98 \n89 100 101 89 101 99 100 102 103 \n100 103 101 102 104 105 102 105 103 \n104 106 107 104 107 105 106 108 109 \n106 109 107 108 93 110 108 110 109 \n93 92 111 93 111 110 10 94 112 \n10 112 11 94 95 113 94 113 112 \n95 96 114 95 114 113 96 97 115 \n96 115 114 97 98 116 97 116 115 \n98 99 117 98 117 116 99 101 118 \n99 118 117 101 103 119 101 119 118 \n103 105 120 103 120 119 105 107 121 \n105 121 120 107 109 122 107 122 121 \n109 110 123 109 123 122 110 111 124 \n110 124 123 11 112 125 11 125 12 \n112 113 126 112 126 125 113 114 127 \n113 127 126 114 115 128 114 128 127 \n115 116 129 115 129 128 116 117 130 \n116 130 129 117 118 131 117 131 130 \n118 119 132 118 132 131 119 120 133 \n119 133 132 120 121 134 120 134 133 \n121 122 135 121 135 134 122 123 136 \n122 136 135 123 124 137 123 137 136 \n12 125 138 12 138 13 125 126 139 \n125 139 138 126 127 140 126 140 139 \n127 128 141 127 141 140 128 129 142 \n128 142 141 129 130 143 129 143 142 \n130 131 144 130 144 143 131 132 145 \n131 145 144 132 133 146 132 146 145 \n133 134 147 133 147 146 134 135 148 \n134 148 147 135 136 149 135 149 148 \n136 137 150 136 150 149 13 138 151 \n13 151 14 138 139 152 138 152 151 \n139 140 153 139 153 152 140 141 154 \n140 154 153 141 142 155 141 155 154 \n142 143 156 142 156 155 143 144 157 \n143 157 156 144 145 158 144 158 157 \n145 146 159 145 159 158 146 147 160 \n146 160 159 147 148 161 147 161 160 \n148 149 162 148 162 161 149 150 163 \n149 163 162 14 151 164 14 164 15 \n151 152 165 151 165 164 152 153 166 \n152 166 165 153 154 167 153 167 166 \n154 155 168 154 168 167 155 156 169 \n155 169 168 156 157 170 156 170 169 \n157 158 171 157 171 170 158 159 172 \n158 172 171 159 160 173 159 173 172 \n160 161 174 160 174 173 161 162 175 \n161 175 174 162 163 176 162 176 175 \n15 164 177 15 177 16 164 165 178 \n164 178 177 165 166 179 165 179 178 \n166 167 180 166 180 179 167 168 181 \n167 181 180 168 169 182 168 182 181 \n169 170 183 169 183 182 170 171 184 \n170 184 183 171 172 185 171 185 184 \n172 173 186 172 186 185 173 174 187 \n173 187 186 174 175 188 174 188 187 \n175 176 189 175 189 188 16 177 190 \n16 190 17 177 178 191 177 191 190 \n178 179 192 178 192 191 179 180 193 \n179 193 192 180 181 194 180 194 193 \n181 182 195 181 195 194 182 183 196 \n182 196 195 183 184 197 183 197 196 \n184 185 198 184 198 197 185 186 199 \n185 199 198 186 187 200 186 200 199 \n187 188 201 187 201 200 188 189 202 \n188 202 201 17 190 203 17 203 18 \n190 191 204 190 204 203 191 192 205 \n191 205 204 192 193 206 192 206 205 \n193 194 207 193 207 206 194 195 208 \n194 208 207 195 196 209 195 209 208 \n196 197 210 196 210 209 197 198 211 \n197 211 210 198 199 212 198 212 211 \n199 200 213 199 213 212 200 201 214 \n200 214 213 201 202 215 201 215 214 \n18 203 216 18 216 19 203 204 217 \n203 217 216 204 205 218 204 218 217 \n205 206 219 205 219 218 206 207 220 \n206 220 219 207 208 221 207 221 220 \n208 209 222 208 222 221 209 210 223 \n209 223 222 210 211 224 210 224 223 \n211 212 225 211 225 224 212 213 226 \n212 226 225 213 214 227 213 227 226 \n214 215 228 214 228 227 19 216 229 \n19 229 20 216 217 230 216 230 229 \n217 218 231 217 231 230 218 219 232 \n218 232 231 219 220 233 219 233 232 \n220 221 234 220 234 233 221 222 235 \n221 235 234 222 223 236 222 236 235 \n223 224 237 223 237 236 224 225 238 \n224 238 237 225 226 239 225 239 238 \n226 227 240 226 240 239 227 228 241 \n227 241 240 20 229 21 20 21 0 \n229 230 23 229 23 21 230 231 25 \n230 25 23 231 232 27 231 27 25 \n232 233 29 232 29 27 233 234 31 \n233 31 29 234 235 33 234 33 31 \n235 236 35 235 35 33 236 237 37 \n236 37 35 237 238 39 237 39 37 \n238 239 41 238 41 39 239 240 43 \n239 43 41 240 241 45 240 45 43 \n45 242 243 244 45 244 245 46 46 \n245 246 247 46 247 248 59 59 248 \n249 250 59 250 251 66 66 251 252 \n253 66 253 254 71 71 254 255 256 \n257 258 259 260 257 260 261 91 91 \n261 262 263 91 263 264 92 92 264 \n265 266 92 266 267 111 111 267 268 \n269 111 269 270 124 124 270 271 272 \n124 272 273 137 137 273 274 275 137 \n275 276 150 150 276 277 278 150 278 \n279 163 163 279 280 281 163 281 282 \n176 176 282 283 284 176 284 285 189 \n189 285 286 287 189 287 288 202 202 \n288 289 290 202 290 291 215 215 291 \n292 293 215 293 294 228 228 294 295 \n296 228 296 297 241 241 297 298 299 \n241 299 242 45 300 301 302 302 301 \n303 303 301 304 304 301 305 305 301 \n306 306 301 307 307 301 308 308 301 \n309 309 301 310 310 301 311 311 301 \n312 312 301 313 313 301 314 314 301 \n315 315 301 316 316 301 317 317 301 \n318 318 301 319 319 301 320 320 301 \n300 321 322 323 321 323 324 322 325 \n326 322 326 323 325 327 328 325 328 \n326 327 329 330 327 330 328 329 331 \n332 329 332 330 331 333 334 331 334 \n332 333 335 336 333 336 334 335 337 \n338 335 338 336 337 339 340 337 340 \n338 339 341 342 339 342 340 341 343 \n344 341 344 342 343 345 346 343 346 \n344 345 300 302 345 302 346 324 323 \n347 324 347 348 323 326 349 323 349 \n347 326 328 350 326 350 349 328 330 \n351 328 351 350 330 332 352 330 352 \n351 332 334 353 332 353 352 334 336 \n354 334 354 353 336 338 355 336 355 \n354 338 340 356 338 356 355 340 342 \n357 340 357 356 342 344 358 342 358 \n357 344 346 359 344 359 358 346 302 \n303 346 303 359 348 347 360 348 360 \n361 354 355 362 355 356 363 355 363 \n362 356 357 364 356 364 363 357 358 \n365 357 365 364 358 359 366 358 366 \n365 359 303 304 359 304 366 362 363 \n367 363 364 368 363 368 367 364 365 \n369 364 369 368 365 366 370 365 370 \n369 366 304 305 366 305 370 367 368 \n371 368 369 372 368 372 371 369 370 \n373 369 373 372 370 305 306 370 306 \n373 371 372 374 371 374 375 372 373 \n376 372 376 374 373 306 307 373 307 \n376 377 378 379 380 375 381 380 381 \n382 375 374 383 375 383 381 374 376 \n384 374 384 383 376 307 308 376 308 \n384 379 378 385 379 385 386 378 387 \n385 388 382 389 388 389 390 382 381 \n391 382 391 389 381 383 392 381 392 \n391 383 384 393 383 393 392 384 308 \n309 384 309 393 386 385 394 386 394 \n395 385 387 396 385 396 394 387 397 \n398 387 398 396 397 399 400 397 400 \n398 399 401 402 399 402 400 401 403 \n404 401 404 402 403 405 406 403 406 \n404 405 390 407 405 407 406 390 389 \n408 390 408 407 389 391 409 389 409 \n408 391 392 410 391 410 409 392 393 \n411 392 411 410 393 309 310 393 310 \n411 395 394 412 395 412 413 394 396 \n414 394 414 412 396 398 415 396 415 \n414 398 400 416 398 416 415 400 402 \n417 400 417 416 402 404 418 402 418 \n417 404 406 419 404 419 418 406 407 \n420 406 420 419 407 408 421 407 421 \n420 408 409 422 408 422 421 409 410 \n423 409 423 422 410 411 424 410 424 \n423 411 310 311 411 311 424 413 412 \n425 413 425 426 412 414 427 412 427 \n425 414 415 428 414 428 427 415 416 \n429 415 429 428 416 417 430 416 430 \n429 417 418 431 417 431 430 418 419 \n432 418 432 431 419 420 433 419 433 \n432 420 421 434 420 434 433 421 422 \n435 421 435 434 422 423 436 422 436 \n435 423 424 437 423 437 436 424 311 \n312 424 312 437 426 425 438 426 438 \n439 425 427 440 425 440 438 427 428 \n441 427 441 440 428 429 442 428 442 \n441 429 430 443 429 443 442 430 431 \n444 430 444 443 431 432 445 431 445 \n444 432 433 446 432 446 445 433 434 \n447 433 447 446 434 435 448 434 448 \n447 435 436 449 435 449 448 436 437 \n450 436 450 449 437 312 313 437 313 \n450 439 438 451 439 451 452 438 440 \n453 438 453 451 440 441 454 440 454 \n453 441 442 455 441 455 454 442 443 \n456 442 456 455 443 444 457 443 457 \n456 444 445 458 444 458 457 445 446 \n459 445 459 458 446 447 460 446 460 \n459 447 448 461 447 461 460 448 449 \n462 448 462 461 449 450 463 449 463 \n462 450 313 314 450 314 463 452 451 \n464 452 464 465 451 453 466 451 466 \n464 453 454 467 453 467 466 454 455 \n468 454 468 467 455 456 469 455 469 \n468 456 457 470 456 470 469 457 458 \n471 457 471 470 458 459 472 458 472 \n471 459 460 473 459 473 472 460 461 \n474 460 474 473 461 462 475 461 475 \n474 462 463 476 462 476 475 463 314 \n315 463 315 476 465 464 477 465 477 \n478 464 466 479 464 479 477 466 467 \n480 466 480 479 467 468 481 467 481 \n480 468 469 482 468 482 481 469 470 \n483 469 483 482 470 471 484 470 484 \n483 471 472 485 471 485 484 472 473 \n486 472 486 485 473 474 487 473 487 \n486 474 475 488 474 488 487 475 476 \n489 475 489 488 476 315 316 476 316 \n489 478 477 490 478 490 491 477 479 \n492 477 492 490 479 480 493 479 493 \n492 480 481 494 480 494 493 481 482 \n495 481 495 494 482 483 496 482 496 \n495 483 484 497 483 497 496 484 485 \n498 484 498 497 485 486 499 485 499 \n498 486 487 500 486 500 499 487 488 \n501 487 501 500 488 489 502 488 502 \n501 489 316 317 489 317 502 491 490 \n503 491 503 504 490 492 505 490 505 \n503 492 493 506 492 506 505 493 494 \n507 493 507 506 494 495 508 494 508 \n507 495 496 509 495 509 508 496 497 \n510 496 510 509 497 498 511 497 511 \n510 498 499 512 498 512 511 499 500 \n513 499 513 512 500 501 514 500 514 \n513 501 502 515 501 515 514 502 317 \n318 502 318 515 504 503 516 504 516 \n517 503 505 518 503 518 516 505 506 \n519 505 519 518 506 507 520 506 520 \n519 507 508 521 507 521 520 508 509 \n522 508 522 521 509 510 523 509 523 \n522 510 511 524 510 524 523 511 512 \n525 511 525 524 512 513 526 512 526 \n525 513 514 527 513 527 526 514 515 \n528 514 528 527 515 318 319 515 319 \n528 517 516 529 517 529 530 516 518 \n531 516 531 529 518 519 532 518 532 \n531 519 520 533 519 533 532 520 521 \n534 520 534 533 521 522 535 521 535 \n534 522 523 536 522 536 535 523 524 \n537 523 537 536 524 525 538 524 538 \n537 525 526 539 525 539 538 526 527 \n540 526 540 539 527 528 541 527 541 \n540 528 319 320 528 320 541 530 529 \n322 530 322 321 529 531 325 529 325 \n322 531 532 327 531 327 325 532 533 \n329 532 329 327 533 534 331 533 331 \n329 534 535 333 534 333 331 535 536 \n335 535 335 333 536 537 337 536 337 \n335 537 538 339 537 339 337 538 539 \n341 538 341 339 539 540 343 539 343 \n341 540 541 345 540 345 343 541 320 \n300 541 300 345 321 324 243 242 324 \n245 244 243 324 348 246 245 348 248 \n247 246 348 361 249 248 361 251 250 \n249 361 542 252 251 542 254 253 252 \n377 258 543 544 377 379 259 258 379 \n261 260 259 379 386 262 261 386 264 \n263 262 386 395 265 264 395 267 266 \n265 395 413 268 267 413 270 269 268 \n413 426 271 270 426 273 272 271 426 \n439 274 273 439 276 275 274 439 452 \n277 276 452 279 278 277 452 465 280 \n279 465 282 281 280 465 478 283 282 \n478 285 284 283 478 491 286 285 491 \n288 287 286 491 504 289 288 504 291 \n290 289 504 517 292 291 517 294 293 \n292 517 530 295 294 530 297 296 295 \n530 321 298 297 321 242 299 298 51 \n52 545 546 51 546 547 64 52 53 \n548 549 52 549 550 545 53 54 551 \n552 53 552 553 548 54 55 554 555 \n54 555 556 551 55 56 557 558 55 \n558 559 554 56 57 560 561 56 561 \n562 557 57 65 563 564 560 63 64 \n565 566 63 566 567 70 64 547 568 \n64 568 565 65 569 570 563 65 71 \n571 572 569 69 70 573 574 69 574 \n575 74 70 567 576 70 576 573 71 \n577 578 571 74 575 579 580 78 78 \n580 581 582 257 583 584 257 585 583 \n78 582 586 587 83 83 587 588 589 \n90 590 591 90 592 590 257 91 593 \n585 91 90 591 593 83 589 594 595 \n89 100 596 597 598 100 89 595 596 \n102 599 600 601 102 100 598 599 104 \n602 603 604 104 102 601 602 106 605 \n606 607 106 104 604 605 108 608 609 \n610 108 106 607 608 90 93 611 592 \n93 108 610 611 71 256 612 613 614 \n577 612 544 543 615 613 543 258 257 \n584 615 347 349 616 617 347 617 618 \n360 349 350 619 620 349 620 621 616 \n350 351 622 623 350 623 624 619 351 \n352 625 626 351 626 627 622 352 353 \n628 629 352 629 630 625 353 354 631 \n632 353 632 633 628 354 362 634 635 \n631 361 360 636 637 361 637 638 542 \n360 618 639 360 639 636 362 640 641 \n634 362 367 642 643 640 542 638 644 \n542 644 645 367 646 647 642 367 371 \n648 649 646 377 650 651 652 380 653 \n654 380 655 653 371 375 656 648 375 \n380 654 656 377 652 657 658 378 378 \n658 659 660 388 661 662 388 663 661 \n380 382 664 655 382 388 662 664 378 \n660 665 666 387 397 667 668 669 397 \n387 666 667 399 670 671 672 399 397 \n669 670 401 673 674 675 401 399 672 \n673 403 676 677 678 403 401 675 676 \n405 679 680 681 405 403 678 679 388 \n390 682 663 390 405 681 682 542 645 \n683 255 254 612 256 255 683 684 377 \n544 612 684 685 650 686 687 688 687 \n689 688 689 690 688 690 691 688 691 \n692 688 692 693 688 693 694 688 694 \n695 688 695 696 688 696 697 688 697 \n698 688 698 699 688 699 700 688 700 \n701 688 701 702 688 702 703 688 703 \n704 688 704 705 688 705 706 688 706 \n686 688 686 707 708 686 708 687 707 \n709 710 707 710 708 709 711 712 709 \n712 710 711 713 714 711 714 712 713 \n715 716 713 716 714 715 717 718 715 \n718 716 717 719 720 717 720 718 719 \n721 722 719 722 720 721 723 724 721 \n724 722 723 725 726 723 726 724 725 \n727 728 725 728 726 727 729 730 727 \n730 728 729 731 732 729 732 730 687 \n708 733 687 733 689 708 710 734 708 \n734 733 710 712 735 710 735 734 712 \n714 736 712 736 735 714 716 737 714 \n737 736 716 718 738 716 738 737 718 \n720 739 718 739 738 720 722 740 720 \n740 739 722 724 741 722 741 740 724 \n726 742 724 742 741 726 728 743 726 \n743 742 728 730 744 728 744 743 730 \n732 745 730 745 744 689 733 746 689 \n746 690 733 734 747 733 747 746 734 \n735 748 734 748 747 735 736 749 735 \n749 748 736 737 750 736 750 749 737 \n738 751 737 751 750 738 739 752 738 \n752 751 739 740 753 739 753 752 740 \n741 754 740 754 753 741 742 755 741 \n755 754 742 743 756 742 756 755 743 \n744 757 743 757 756 744 745 758 744 \n758 757 690 746 759 690 759 691 746 \n747 760 746 760 759 747 748 761 747 \n761 760 748 749 762 748 762 761 749 \n750 763 749 763 762 750 751 764 750 \n764 763 751 752 765 751 765 764 752 \n753 766 752 766 765 753 754 767 753 \n767 766 754 755 768 754 768 767 755 \n756 769 755 769 768 756 757 770 756 \n770 769 757 758 771 757 771 770 691 \n759 772 691 772 692 759 760 773 759 \n773 772 760 761 774 760 774 773 761 \n762 775 761 775 774 762 763 776 762 \n776 775 763 764 777 763 777 776 764 \n765 778 764 778 777 765 766 779 765 \n779 778 766 767 780 766 780 779 767 \n768 781 767 781 780 768 769 782 768 \n782 781 769 770 783 769 783 782 770 \n771 784 770 784 783 692 772 785 692 \n785 693 772 773 786 772 786 785 773 \n774 787 773 787 786 774 775 788 774 \n788 787 775 776 789 775 789 788 776 \n777 790 776 790 789 777 778 791 777 \n791 790 778 779 792 778 792 791 779 \n780 793 779 793 792 780 781 794 780 \n794 793 781 782 795 781 795 794 782 \n783 796 782 796 795 783 784 797 783 \n797 796 693 785 798 693 798 694 785 \n786 799 785 799 798 786 787 800 786 \n800 799 787 788 801 787 801 800 788 \n789 802 788 802 801 789 790 803 789 \n803 802 790 791 804 790 804 803 791 \n792 805 791 805 804 792 793 806 792 \n806 805 793 794 807 793 807 806 794 \n795 808 794 808 807 795 796 809 795 \n809 808 796 797 810 796 810 809 694 \n798 811 694 811 695 798 799 812 798 \n812 811 799 800 813 799 813 812 800 \n801 814 800 814 813 801 802 815 801 \n815 814 802 803 816 802 816 815 803 \n804 817 803 817 816 804 805 818 804 \n818 817 805 806 819 805 819 818 806 \n807 820 806 820 819 807 808 821 807 \n821 820 808 809 822 808 822 821 809 \n810 823 809 823 822 695 811 824 695 \n824 696 811 812 825 811 825 824 812 \n813 826 812 826 825 813 814 827 813 \n827 826 814 815 828 814 828 827 815 \n816 829 815 829 828 816 817 830 816 \n830 829 817 818 831 817 831 830 818 \n819 832 818 832 831 819 820 833 819 \n833 832 820 821 834 820 834 833 821 \n822 835 821 835 834 822 823 836 822 \n836 835 696 824 837 696 837 697 824 \n825 838 824 838 837 825 826 839 825 \n839 838 826 827 840 826 840 839 827 \n828 841 827 841 840 828 829 842 828 \n842 841 829 830 843 829 843 842 830 \n831 844 830 844 843 831 832 845 831 \n845 844 832 833 846 832 846 845 833 \n834 847 833 847 846 834 835 848 834 \n848 847 835 836 849 835 849 848 697 \n837 850 697 850 698 837 838 851 837 \n851 850 838 839 852 838 852 851 839 \n840 853 839 853 852 840 841 854 840 \n854 853 841 842 855 841 855 854 842 \n843 856 842 856 855 843 844 857 843 \n857 856 844 845 858 844 858 857 845 \n846 859 845 859 858 846 847 860 846 \n860 859 847 848 861 847 861 860 848 \n849 862 848 862 861 698 850 863 698 \n863 699 850 851 864 850 864 863 851 \n852 865 851 865 864 852 853 866 852 \n866 865 853 854 867 853 867 866 854 \n855 868 854 868 867 855 856 869 855 \n869 868 856 857 870 856 870 869 857 \n858 871 857 871 870 858 859 872 858 \n872 871 859 860 873 859 873 872 860 \n861 874 860 874 873 861 862 875 861 \n875 874 699 863 876 699 876 700 863 \n864 877 863 877 876 864 865 878 864 \n878 877 865 866 879 865 879 878 866 \n867 880 866 880 879 873 874 881 874 \n875 882 874 882 881 700 876 883 700 \n883 701 876 877 884 876 884 883 877 \n878 885 877 885 884 878 879 886 878 \n886 885 881 882 887 701 883 888 701 \n888 702 883 884 889 883 889 888 884 \n885 890 884 890 889 702 888 891 702 \n891 703 888 889 892 888 892 891 889 \n890 893 889 893 892 890 894 893 703 \n891 895 703 895 704 891 892 896 891 \n896 895 892 893 897 892 897 896 893 \n894 898 893 898 897 894 899 898 704 \n895 900 704 900 705 895 896 901 895 \n901 900 896 897 902 896 902 901 897 \n898 903 897 903 902 898 899 904 898 \n904 903 899 905 904 906 907 908 906 \n908 909 705 900 910 705 910 706 900 \n901 911 900 911 910 901 902 912 901 \n912 911 902 903 913 902 913 912 903 \n904 914 903 914 913 904 905 915 904 \n915 914 905 916 917 905 917 915 916 \n918 919 916 919 917 918 920 921 918 \n921 919 920 922 923 920 923 921 922 \n924 925 922 925 923 924 909 926 924 \n926 925 909 908 927 909 927 926 706 \n910 707 706 707 686 910 911 709 910 \n709 707 911 912 711 911 711 709 912 \n913 713 912 713 711 913 914 715 913 \n715 713 914 915 717 914 717 715 915 \n917 719 915 719 717 917 919 721 917 \n721 719 919 921 723 919 723 721 921 \n923 725 921 725 723 923 925 727 923 \n727 725 925 926 729 925 729 727 926 \n927 731 926 731 729 731 928 929 930 \n731 930 931 732 732 931 932 933 732 \n933 934 745 745 934 935 936 745 936 \n937 758 758 937 938 939 758 939 940 \n771 771 940 941 942 771 942 943 784 \n784 943 944 945 784 945 946 797 797 \n946 947 948 797 948 949 810 810 949 \n950 951 810 951 952 823 823 952 953 \n954 823 954 955 836 836 955 956 957 \n836 957 958 849 849 958 959 960 849 \n960 961 862 862 961 962 963 862 963 \n964 875 875 964 965 966 875 966 967 \n882 882 967 968 969 882 969 970 887 \n887 970 971 972 973 974 975 976 973 \n976 977 907 907 977 978 979 907 979 \n980 908 908 980 981 982 908 982 983 \n927 927 983 984 985 927 985 928 731 \n986 987 988 988 987 989 989 987 990 \n990 987 991 991 987 992 992 987 993 \n993 987 994 994 987 995 995 987 996 \n996 987 997 997 987 998 998 987 999 \n999 987 1000 1000 987 1001 1001 987 1002 \n1002 987 1003 1003 987 1004 1004 987 1005 \n1005 987 1006 1006 987 986 1007 1008 1009 \n1007 1009 1010 1008 1011 1012 1008 1012 1009 \n1011 1013 1014 1011 1014 1012 1013 1015 1016 \n1013 1016 1014 1015 1017 1018 1015 1018 1016 \n1017 1019 1020 1017 1020 1018 1019 1021 1022 \n1019 1022 1020 1021 1023 1024 1021 1024 1022 \n1023 1025 1026 1023 1026 1024 1025 1027 1028 \n1025 1028 1026 1027 1029 1030 1027 1030 1028 \n1029 1031 1032 1029 1032 1030 1031 986 988 \n1031 988 1032 1010 1009 1033 1010 1033 1034 \n1009 1012 1035 1009 1035 1033 1012 1014 1036 \n1012 1036 1035 1014 1016 1037 1014 1037 1036 \n1016 1018 1038 1016 1038 1037 1018 1020 1039 \n1018 1039 1038 1020 1022 1040 1020 1040 1039 \n1022 1024 1041 1022 1041 1040 1024 1026 1042 \n1024 1042 1041 1026 1028 1043 1026 1043 1042 \n1028 1030 1044 1028 1044 1043 1030 1032 1045 \n1030 1045 1044 1032 988 989 1032 989 1045 \n1034 1033 1046 1034 1046 1047 1033 1035 1048 \n1033 1048 1046 1035 1036 1049 1035 1049 1048 \n1036 1037 1050 1036 1050 1049 1037 1038 1051 \n1037 1051 1050 1038 1039 1052 1038 1052 1051 \n1039 1040 1053 1039 1053 1052 1040 1041 1054 \n1040 1054 1053 1041 1042 1055 1041 1055 1054 \n1042 1043 1056 1042 1056 1055 1043 1044 1057 \n1043 1057 1056 1044 1045 1058 1044 1058 1057 \n1045 989 990 1045 990 1058 1047 1046 1059 \n1047 1059 1060 1046 1048 1061 1046 1061 1059 \n1048 1049 1062 1048 1062 1061 1049 1050 1063 \n1049 1063 1062 1050 1051 1064 1050 1064 1063 \n1051 1052 1065 1051 1065 1064 1052 1053 1066 \n1052 1066 1065 1053 1054 1067 1053 1067 1066 \n1054 1055 1068 1054 1068 1067 1055 1056 1069 \n1055 1069 1068 1056 1057 1070 1056 1070 1069 \n1057 1058 1071 1057 1071 1070 1058 990 991 \n1058 991 1071 1060 1059 1072 1060 1072 1073 \n1059 1061 1074 1059 1074 1072 1061 1062 1075 \n1061 1075 1074 1062 1063 1076 1062 1076 1075 \n1063 1064 1077 1063 1077 1076 1064 1065 1078 \n1064 1078 1077 1065 1066 1079 1065 1079 1078 \n1066 1067 1080 1066 1080 1079 1067 1068 1081 \n1067 1081 1080 1068 1069 1082 1068 1082 1081 \n1069 1070 1083 1069 1083 1082 1070 1071 1084 \n1070 1084 1083 1071 991 992 1071 992 1084 \n1073 1072 1085 1073 1085 1086 1072 1074 1087 \n1072 1087 1085 1074 1075 1088 1074 1088 1087 \n1075 1076 1089 1075 1089 1088 1076 1077 1090 \n1076 1090 1089 1077 1078 1091 1077 1091 1090 \n1078 1079 1092 1078 1092 1091 1079 1080 1093 \n1079 1093 1092 1080 1081 1094 1080 1094 1093 \n1081 1082 1095 1081 1095 1094 1082 1083 1096 \n1082 1096 1095 1083 1084 1097 1083 1097 1096 \n1084 992 993 1084 993 1097 1086 1085 1098 \n1086 1098 1099 1085 1087 1100 1085 1100 1098 \n1087 1088 1101 1087 1101 1100 1088 1089 1102 \n1088 1102 1101 1089 1090 1103 1089 1103 1102 \n1090 1091 1104 1090 1104 1103 1091 1092 1105 \n1091 1105 1104 1092 1093 1106 1092 1106 1105 \n1093 1094 1107 1093 1107 1106 1094 1095 1108 \n1094 1108 1107 1095 1096 1109 1095 1109 1108 \n1096 1097 1110 1096 1110 1109 1097 993 994 \n1097 994 1110 1099 1098 1111 1099 1111 1112 \n1098 1100 1113 1098 1113 1111 1100 1101 1114 \n1100 1114 1113 1101 1102 1115 1101 1115 1114 \n1102 1103 1116 1102 1116 1115 1103 1104 1117 \n1103 1117 1116 1104 1105 1118 1104 1118 1117 \n1105 1106 1119 1105 1119 1118 1106 1107 1120 \n1106 1120 1119 1107 1108 1121 1107 1121 1120 \n1108 1109 1122 1108 1122 1121 1109 1110 1123 \n1109 1123 1122 1110 994 995 1110 995 1123 \n1112 1111 1124 1112 1124 1125 1111 1113 1126 \n1111 1126 1124 1113 1114 1127 1113 1127 1126 \n1114 1115 1128 1114 1128 1127 1115 1116 1129 \n1115 1129 1128 1116 1117 1130 1116 1130 1129 \n1117 1118 1131 1117 1131 1130 1118 1119 1132 \n1118 1132 1131 1119 1120 1133 1119 1133 1132 \n1120 1121 1134 1120 1134 1133 1121 1122 1135 \n1121 1135 1134 1122 1123 1136 1122 1136 1135 \n1123 995 996 1123 996 1136 1125 1124 1137 \n1125 1137 1138 1124 1126 1139 1124 1139 1137 \n1126 1127 1140 1126 1140 1139 1127 1128 1141 \n1127 1141 1140 1128 1129 1142 1128 1142 1141 \n1129 1130 1143 1129 1143 1142 1130 1131 1144 \n1130 1144 1143 1131 1132 1145 1131 1145 1144 \n1132 1133 1146 1132 1146 1145 1133 1134 1147 \n1133 1147 1146 1134 1135 1148 1134 1148 1147 \n1135 1136 1149 1135 1149 1148 1136 996 997 \n1136 997 1149 1138 1137 1150 1138 1150 1151 \n1137 1139 1152 1137 1152 1150 1139 1140 1153 \n1139 1153 1152 1140 1141 1154 1140 1154 1153 \n1141 1142 1155 1141 1155 1154 1142 1143 1156 \n1142 1156 1155 1143 1144 1157 1143 1157 1156 \n1144 1145 1158 1144 1158 1157 1145 1146 1159 \n1145 1159 1158 1146 1147 1160 1146 1160 1159 \n1147 1148 1161 1147 1161 1160 1148 1149 1162 \n1148 1162 1161 1149 997 998 1149 998 1162 \n1151 1150 1163 1151 1163 1164 1150 1152 1165 \n1150 1165 1163 1152 1153 1166 1152 1166 1165 \n1153 1154 1167 1153 1167 1166 1154 1155 1168 \n1154 1168 1167 1155 1156 1169 1155 1169 1168 \n1156 1157 1170 1156 1170 1169 1157 1158 1171 \n1157 1171 1170 1158 1159 1172 1158 1172 1171 \n1159 1160 1173 1159 1173 1172 1160 1161 1174 \n1160 1174 1173 1161 1162 1175 1161 1175 1174 \n1162 998 999 1162 999 1175 1164 1163 1176 \n1164 1176 1177 1170 1171 1178 1171 1172 1179 \n1171 1179 1178 1172 1173 1180 1172 1180 1179 \n1173 1174 1181 1173 1181 1180 1174 1175 1182 \n1174 1182 1181 1175 999 1000 1175 1000 1182 \n1178 1179 1183 1179 1180 1184 1179 1184 1183 \n1180 1181 1185 1180 1185 1184 1181 1182 1186 \n1181 1186 1185 1182 1000 1001 1182 1001 1186 \n1183 1184 1187 1184 1185 1188 1184 1188 1187 \n1185 1186 1189 1185 1189 1188 1186 1001 1002 \n1186 1002 1189 1187 1188 1190 1187 1190 1191 \n1188 1189 1192 1188 1192 1190 1189 1002 1003 \n1189 1003 1192 1193 1194 1195 1196 1191 1197 \n1196 1197 1198 1191 1190 1199 1191 1199 1197 \n1190 1192 1200 1190 1200 1199 1192 1003 1004 \n1192 1004 1200 1195 1194 1201 1195 1201 1202 \n1194 1203 1201 1204 1198 1205 1204 1205 1206 \n1198 1197 1207 1198 1207 1205 1197 1199 1208 \n1197 1208 1207 1199 1200 1209 1199 1209 1208 \n1200 1004 1005 1200 1005 1209 1202 1201 1210 \n1202 1210 1211 1201 1203 1212 1201 1212 1210 \n1203 1213 1214 1203 1214 1212 1213 1215 1216 \n1213 1216 1214 1215 1217 1218 1215 1218 1216 \n1217 1219 1220 1217 1220 1218 1219 1221 1222 \n1219 1222 1220 1221 1206 1223 1221 1223 1222 \n1206 1205 1224 1206 1224 1223 1205 1207 1225 \n1205 1225 1224 1207 1208 1226 1207 1226 1225 \n1208 1209 1227 1208 1227 1226 1209 1005 1006 \n1209 1006 1227 1211 1210 1008 1211 1008 1007 \n1210 1212 1011 1210 1011 1008 1212 1214 1013 \n1212 1013 1011 1214 1216 1015 1214 1015 1013 \n1216 1218 1017 1216 1017 1015 1218 1220 1019 \n1218 1019 1017 1220 1222 1021 1220 1021 1019 \n1222 1223 1023 1222 1023 1021 1223 1224 1025 \n1223 1025 1023 1224 1225 1027 1224 1027 1025 \n1225 1226 1029 1225 1029 1027 1226 1227 1031 \n1226 1031 1029 1227 1006 986 1227 986 1031 \n1007 1010 929 928 1010 931 930 929 1010 \n1034 932 931 1034 934 933 932 1034 1047 \n935 934 1047 937 936 935 1047 1060 938 \n937 1060 940 939 938 1060 1073 941 940 \n1073 943 942 941 1073 1086 944 943 1086 \n946 945 944 1086 1099 947 946 1099 949 \n948 947 1099 1112 950 949 1112 952 951 \n950 1112 1125 953 952 1125 955 954 953 \n1125 1138 956 955 1138 958 957 956 1138 \n1151 959 958 1151 961 960 959 1151 1164 \n962 961 1164 964 963 962 1164 1177 965 \n964 1177 967 966 965 1177 1228 968 967 \n1228 970 969 968 1193 974 1229 1230 1193 \n1195 975 974 1195 977 976 975 1195 1202 \n978 977 1202 980 979 978 1202 1211 981 \n980 1211 983 982 981 1211 1007 984 983 \n1007 928 985 984 867 868 595 594 867 \n594 589 880 868 869 598 597 868 597 \n596 595 869 870 601 600 869 600 599 \n598 870 871 604 603 870 603 602 601 \n871 872 607 606 871 606 605 604 872 \n873 610 609 872 609 608 607 873 881 \n592 611 610 879 880 587 586 879 586 \n582 886 880 589 588 880 588 587 881 \n591 590 592 881 887 585 593 591 885 \n886 580 579 885 579 575 890 886 582 \n581 886 581 580 887 584 583 585 890 \n575 574 573 894 894 573 576 567 973 \n578 577 973 571 578 894 567 566 565 \n899 899 565 568 547 906 570 569 906 \n563 570 973 907 572 571 907 906 569 \n572 899 547 546 545 905 916 550 549 \n548 916 905 545 550 918 553 552 551 \n918 916 548 553 920 556 555 554 920 \n918 551 556 922 559 558 557 922 920 \n554 559 924 562 561 560 924 922 557 \n562 906 909 564 563 909 924 560 564 \n887 972 1231 613 615 584 1231 1230 1229 \n614 613 1229 974 973 577 614 1163 1165 \n666 665 1163 665 660 1176 1165 1166 669 \n668 1165 668 667 666 1166 1167 672 671 \n1166 671 670 669 1167 1168 675 674 1167 \n674 673 672 1168 1169 678 677 1168 677 \n676 675 1169 1170 681 680 1169 680 679 \n678 1170 1178 663 682 681 1177 1176 658 \n657 1177 657 652 1228 1176 660 659 1176 \n659 658 1178 662 661 663 1178 1183 655 \n664 662 1228 652 651 1228 651 650 1183 \n654 653 655 1183 1187 648 656 654 1193 \n645 644 638 1196 647 646 1196 642 647 \n1187 1191 649 648 1191 1196 646 649 1193 \n638 637 636 1194 1194 636 639 618 1204 \n641 640 1204 634 641 1196 1198 643 642 \n1198 1204 640 643 1194 618 617 616 1203 \n1213 621 620 619 1213 1203 616 621 1215 \n624 623 622 1215 1213 619 624 1217 627 \n626 625 1217 1215 622 627 1219 630 629 \n628 1219 1217 625 630 1221 633 632 631 \n1221 1219 628 633 1204 1206 635 634 1206 \n1221 631 635 1228 650 685 971 970 1231 \n972 971 685 684 1193 1230 1231 684 683 \n645 \n"
  },
  {
    "path": "testing/data/cross.vtk",
    "content": "# vtk DataFile Version 5.1\nvtk output\nASCII\nDATASET POLYDATA\nPOINTS 70 double\n0.5 1 0 0.43301269412 1 -0.25 0.25 1 -0.43301269412 \n3.0616171315e-17 1 -0.5 -0.25 1 -0.43301269412 -0.43301269412 1 -0.25 \n-0.5 1 -6.1232342629e-17 -0.43301269412 1 0.25 -0.25 1 0.43301269412 \n-9.1848507326e-17 1 0.5 0.25 1 0.43301269412 0.43301269412 1 0.25 \n0.43301269412 -1 0.25 0.25 -1 0.43301269412 -9.1848507326e-17 -1 0.5 \n-0.25 -1 0.43301269412 -0.43301269412 -1 0.25 -0.5 -1 -6.1232342629e-17 \n-0.43301269412 -1 -0.25 -0.25 -1 -0.43301269412 3.0616171315e-17 -1 -0.5 \n0.25 -1 -0.43301269412 0.43301269412 -1 -0.25 0.5 -1 0 \n0.43301269412 -0.43301269412 -0.25 0.5 -0.5 0 0.5 0.5 0 \n0.43301269412 0.43301269412 -0.25 0.25 -0.25 -0.43301269412 0.25 0.25 -0.43301269412 \n4.4290609559e-16 -1.1830696364e-18 -0.5 -0.25 -0.25 -0.43301269412 -0.25 0.25 -0.43301269412 \n-0.43301269412 -0.43301269412 -0.25 -0.43301269412 0.43301269412 -0.25 -0.5 -0.5 -5.7130552552e-17 \n-0.5 0.5 0 -0.43301269412 -0.43301269412 0.25 -0.43301269412 0.43301269412 0.25 \n-0.25 -0.25 0.43301269412 -0.25 0.25 0.43301269412 -8.5695822653e-17 1.3634875996e-16 0.5 \n0.25 -0.25 0.43301269412 0.25 0.25 0.43301269412 0.43301269412 -0.43301269412 0.25 \n0.43301269412 0.43301269412 0.25 -1 0.5 0 -1 0.43301269412 -0.25 \n-1 0.25 -0.43301269412 -1 2.5266076962e-16 -0.5 -1 -0.25 -0.43301269412 \n-1 -0.43301269412 -0.25 -1 -0.5 -6.1232342629e-17 -1 -0.43301269412 0.25 \n-1 -0.25 0.43301269412 -1 1.301960976e-16 0.5 -1 0.25 0.43301269412 \n-1 0.43301269412 0.25 1 0.43301269412 0.25 1 0.25 0.43301269412 \n1 -3.1389309902e-16 0.5 1 -0.25 0.43301269412 1 -0.43301269412 0.25 \n1 -0.5 -6.1232342629e-17 1 -0.43301269412 -0.25 1 -0.25 -0.43301269412 \n1 -1.9142844023e-16 -0.5 1 0.25 -0.43301269412 1 0.43301269412 -0.25 \n1 0.5 0 \nPOLYGONS 53 240\nOFFSETS vtktypeint64\n0 12 24 28 32 36 40 44 48 \n52 56 60 64 68 72 76 80 84 \n88 92 96 100 104 108 112 116 120 \n132 144 148 152 156 160 164 168 172 \n176 180 184 188 192 196 200 204 208 \n212 216 220 224 228 232 236 240 \nCONNECTIVITY vtktypeint64\n0 1 2 3 4 5 6 7 8 \n9 10 11 12 13 14 15 16 17 \n18 19 20 21 22 23 23 22 24 \n25 0 26 27 1 22 21 28 24 \n1 27 29 2 21 20 30 28 2 \n29 30 3 20 19 31 30 3 30 \n32 4 19 18 33 31 4 32 34 \n5 18 17 35 33 5 34 36 6 \n17 16 37 35 6 36 38 7 16 \n15 39 37 7 38 40 8 15 14 \n41 39 8 40 41 9 14 13 42 \n41 9 41 43 10 13 12 44 42 \n10 43 45 11 12 23 25 44 11 \n45 26 0 46 47 48 49 50 51 \n52 53 54 55 56 57 58 59 60 \n61 62 63 64 65 66 67 68 69 \n46 36 34 47 69 68 27 26 47 \n34 32 48 68 67 29 27 48 32 \n30 49 67 66 30 29 49 30 31 \n50 66 65 28 30 50 31 33 51 \n65 64 24 28 51 33 35 52 64 \n63 25 24 52 35 37 53 63 62 \n44 25 53 37 39 54 62 61 42 \n44 54 39 41 55 61 60 41 42 \n55 41 40 56 60 59 43 41 56 \n40 38 57 59 58 45 43 57 38 \n36 46 58 69 26 45 \n"
  },
  {
    "path": "testing/data/merger.vtk",
    "content": "# vtk DataFile Version 5.1\nvtk output\nASCII\nDATASET POLYDATA\nPOINTS 24 double\n-0.4 0 0.5 -0.4 0 -0.5 0 -0.4 0.5 \n0 -0.4 -0.5 0.4 0 0.5 0.4 0 -0.5 \n0 0.4 0.5 0 0.4 -0.5 -0.25 0 0.5 \n-0.25 0 -0.5 -0.15 -0.1 0.5 -0.15 -0.1 -0.5 \n-0.05 0 0.5 -0.05 0 -0.5 -0.15 0.1 0.5 \n-0.15 0.1 -0.5 0.05 0 0.5 0.05 0 -0.5 \n0.15 -0.1 0.5 0.15 -0.1 -0.5 0.25 0 0.5 \n0.25 0 -0.5 0.15 0.1 0.5 0.15 0.1 -0.5 \n\nPOLYGONS 17 84\nOFFSETS vtktypeint64\n0 9 18 27 36 40 44 48 52 \n56 60 64 68 72 76 80 84 \nCONNECTIVITY vtktypeint64\n0 2 4 20 18 16 12 10 8 \n4 6 0 8 14 12 16 22 20 \n5 3 1 9 11 13 17 19 21 \n1 7 5 21 23 17 13 15 9 \n0 1 3 2 2 3 5 4 4 \n5 7 6 6 7 1 0 8 10 \n11 9 10 12 13 11 12 14 15 \n13 14 8 9 15 16 18 19 17 \n18 20 21 19 20 22 23 21 22 \n16 17 23 \n"
  },
  {
    "path": "testing/data/non-manifold.vtk",
    "content": "# vtk DataFile Version 5.1\nvtk output\nASCII\nDATASET POLYDATA\nPOINTS 58 double\n-1 -0.5 -1 -1 0.5 -1 1 0.5 -1 \n1 -0.5 -1 -1 -0.5 1 1 -0.5 1 \n1 0.5 1 -1 0.5 1 1 -0.5 0.6950153131 \n1 0.5 0.6950153131 1 0.5 -0.6950153131 1 -0.5 -0.6950153131 \n0.88023614883 0.5 -0.73860579729 0.88023614883 -0.5 -0.73860579729 0.61976385117 0.5 -0.73860579729 \n0.61976385117 -0.5 -0.73860579729 0.375 0.5 -0.64951902628 0.375 -0.5 -0.64951902628 \n0.17546667159 0.5 -0.48209071159 0.17546667159 -0.5 -0.48209071159 0.045230533928 0.5 -0.2565151155 \n0.045230533928 -0.5 -0.2565151155 0.045230533928 0.5 0.2565151155 0.17546667159 0.5 0.48209071159 \n0.17546667159 -0.5 0.48209071159 0.045230533928 -0.5 0.2565151155 0.375 0.5 0.64951902628 \n0.375 -0.5 0.64951902628 0.61976385117 0.5 0.73860579729 0.61976385117 -0.5 0.73860579729 \n0.88023614883 0.5 0.73860579729 0.88023614883 -0.5 0.73860579729 -1 0.5 0.6950153131 \n-1 -0.5 0.6950153131 -1 -0.5 -0.6950153131 -1 0.5 -0.6950153131 \n-0.88023614883 -0.5 0.73860579729 -0.61976385117 -0.5 0.73860579729 -0.375 -0.5 0.64951902628 \n-0.17546667159 -0.5 0.48209071159 -0.045230533928 -0.5 0.2565151155 0 -0.5 0 \n-0.045230533928 -0.5 -0.2565151155 -0.17546667159 -0.5 -0.48209071159 -0.375 -0.5 -0.64951902628 \n-0.61976385117 -0.5 -0.73860579729 -0.88023614883 -0.5 -0.73860579729 0 0.5 0 \n-0.045230533928 0.5 0.2565151155 -0.17546667159 0.5 0.48209071159 -0.375 0.5 0.64951902628 \n-0.61976385117 0.5 0.73860579729 -0.88023614883 0.5 0.73860579729 -0.88023614883 0.5 -0.73860579729 \n-0.61976385117 0.5 -0.73860579729 -0.375 0.5 -0.64951902628 -0.17546667159 0.5 -0.48209071159 \n-0.045230533928 0.5 -0.2565151155 \nPOLYGONS 35 180\nOFFSETS vtktypeint64\n0 4 8 12 16 20 24 28 32 \n36 40 44 48 52 56 60 64 79 \n94 109 124 128 132 136 140 144 148 \n152 156 160 164 168 172 176 180 \nCONNECTIVITY vtktypeint64\n0 1 2 3 4 5 6 7 6 \n5 8 9 3 2 10 11 10 12 \n13 11 12 14 15 13 14 16 17 \n15 16 18 19 17 18 20 21 19 \n22 23 24 25 23 26 27 24 26 \n28 29 27 28 30 31 29 30 9 \n8 31 4 7 32 33 0 34 35 \n1 25 24 27 29 31 8 5 4 \n33 36 37 38 39 40 41 0 3 \n11 13 15 17 19 21 41 42 43 \n44 45 46 34 7 6 9 30 28 \n26 23 22 47 48 49 50 51 52 \n32 1 35 53 54 55 56 57 47 \n20 18 16 14 12 10 2 20 47 \n41 21 22 25 41 47 47 57 42 \n41 57 56 43 42 56 55 44 43 \n55 54 45 44 54 53 46 45 53 \n35 34 46 36 33 32 52 52 51 \n37 36 51 50 38 37 50 49 39 \n38 49 48 40 39 48 47 41 40 \n"
  },
  {
    "path": "testing/generate_frieze.py",
    "content": "#!/usr/bin/env python\n# *-* coding: UTF-8 *-*\n\n# Copyright 2012-2025 Ronald Römer\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport sys\nsys.path.extend(['/home/zippy/vtkbool/build/lib/python3.11/site-packages/vtkbool'])\n\nfrom vtkmodules.vtkCommonCore import vtkIdList, vtkPoints\nfrom vtkmodules.vtkCommonDataModel import vtkPolyData, VTK_POLYGON\nfrom vtkmodules.vtkCommonTransforms import vtkTransform\nfrom vtkmodules.vtkIOLegacy import vtkPolyDataReader, vtkPolyDataWriter\nfrom vtkmodules.vtkIOGeometry import vtkSTLWriter\nfrom vtkmodules.vtkFiltersCore import vtkAppendPolyData, vtkCleanPolyData, vtkReverseSense, vtkPolyDataNormals\nfrom vtkmodules.vtkFiltersSources import vtkPlaneSource\nfrom vtkmodules.vtkFiltersGeneral import vtkTransformPolyDataFilter\nfrom vtkmodules.vtkFiltersModeling import vtkLinearExtrusionFilter\nfrom vtkmodules.vtkCommonExecutionModel import vtkTrivialProducer\n\nfrom vtkbool import vtkPolyDataBooleanFilter\n\nimport math\nimport os\nimport re\n\nfrom collections import namedtuple\n\nBnds = namedtuple('Bounds', 'x1 x2 y1 y2 z1 z2')\n\ndef extrude(pts, h, z=0):\n    cell = vtkIdList()\n\n    _pts = vtkPoints()\n    _pts.SetDataTypeToDouble()\n\n    for pt in pts:\n        cell.InsertNextId(_pts.InsertNextPoint(pt[0], pt[1], z))\n\n    pd = vtkPolyData()\n    pd.Allocate(1)\n    pd.SetPoints(_pts)\n    pd.InsertNextCell(VTK_POLYGON, cell)\n\n    prod = vtkTrivialProducer()\n    prod.SetOutput(pd)\n\n    extr = vtkLinearExtrusionFilter()\n    extr.SetInputConnection(prod.GetOutputPort())\n    extr.SetVector(0, 0, h)\n\n    pn = vtkPolyDataNormals()\n    pn.SetInputConnection(extr.GetOutputPort())\n    pn.AutoOrientNormalsOn()\n\n    return pn\n\nclass Frieze:\n    def __init__ (self, usr_cfg):\n        self.cfg = { 'w': 39, 'a': 3.25/6, 'b': 1, 'c': .4333333333, 'e': .15/2, 'f': 3.25/3,\n            'q': 1.0833333, 'r': .625, 'end': 'A', 'flip': False, 'ang': 45, 'end_seqs': [(), ()], 'shift': 0, 'sym': False }\n\n        self.cfg.update(usr_cfg)\n\n        if self.cfg['end'] == 'A':\n            self.cfg.update({ 'o_a': self.cfg['a'], 'o_b': 0, 'o_c': 0 })\n\n        elif self.cfg['end'] == 'B':\n            self.cfg.update({ 'o_a': -self.cfg['b'], 'o_b': 0, 'o_c': self.cfg['b'] })\n\n        elif self.cfg['end'] == 'C':\n            self.cfg.update({ 'o_a': 0, 'o_b': self.cfg['a'], 'o_c': 0 })\n\n        elif self.cfg['end'] == 'D':\n            self.cfg.update({ 'o_a': -self.cfg['a'], 'o_b': 2*self.cfg['a'], 'o_c': 0 })\n\n    def draw_bricks(self, seq, end_seq):\n        seq = list(seq)\n\n        pts = []\n\n        if self.cfg['sym']:\n\n            assert self.cfg['end'] == 'D'\n\n            fixed = sum(seq[1:-1])+sum(end_seq)\n\n            print(fixed)\n\n            w = self.cfg['w']+2*self.cfg['a']\n\n            i = 0\n\n            while True:\n                curr = (i*seq[-1]+fixed)*self.cfg['f']\n\n                if (w-curr)/2 < seq[0]*self.cfg['f']:\n                    break\n\n                i += 1\n\n            offs = (w-curr)/2\n\n            seq_ = [0] + seq[1:-1] + [seq[-1]]*i + list(reversed(end_seq))\n\n            for i in range(1, len(seq_)):\n                seq_[i] += seq_[i-1]\n\n            print(seq_)\n\n            for s in seq_:\n                mid = self.cfg['a']-offs-s*self.cfg['f']\n\n                pts.extend([[mid+self.cfg['e'], -self.cfg['a']],\n                    [mid+self.cfg['e'], -self.cfg['a']+2*self.cfg['e']],\n                    [mid-self.cfg['e'], -self.cfg['a']+2*self.cfg['e']],\n                    [mid-self.cfg['e'], -self.cfg['a']]])\n\n        else:\n\n            n, m = divmod(self.cfg['w']+self.cfg['o_b'], self.cfg['f'])\n\n            if abs(m-self.cfg['f']) < 1e-5:\n                n += 1\n                m = 0\n\n            print(n, m)\n\n            n = int(n)\n            n, m_ = divmod(n-sum(seq[:-1]), seq[-1])\n\n            print('->', n, m_)\n\n            seq.extend([seq[-1]]*(n-1))\n\n            print(seq)\n\n            if m_ == 0 and m < 1e-5:\n                del seq[-1]\n\n            if end_seq:\n                seq[-len(end_seq):] = reversed(end_seq)\n\n            # wenn 0, dann löschen\n            seq = [ s for s in seq if s > 0 ]\n\n            for i in range(1, len(seq)):\n                seq[i] += seq[i-1]\n\n            for s in seq:\n                mid = self.cfg['a']-s*self.cfg['f']\n\n                pts.extend([[mid+self.cfg['e'], -self.cfg['a']],\n                    [mid+self.cfg['e'], -self.cfg['a']+2*self.cfg['e']],\n                    [mid-self.cfg['e'], -self.cfg['a']+2*self.cfg['e']],\n                    [mid-self.cfg['e'], -self.cfg['a']]])\n\n        pts.extend([[-self.cfg['w']+self.cfg['o_a'], -self.cfg['a']],\n            [-self.cfg['w']+self.cfg['o_a'], self.cfg['b']],\n            [self.cfg['a'], self.cfg['b']],\n            [self.cfg['a'], -self.cfg['a']]])\n\n        return pts\n\n    def draw_zz_bricks(self):\n        j = int(self.cfg['shift']//self.cfg['c'])+1\n\n        self.cfg['shift'] = self.cfg['shift']%self.cfg['c']\n\n        n, m = divmod(self.cfg['w']+self.cfg['o_c']-self.cfg['shift'], self.cfg['c'])\n\n        n = int(n)\n\n        print(n, m)\n\n        if self.cfg['sym']:\n            self.cfg['shift'] = m/2\n\n        pts = [ [-i*self.cfg['c']-self.cfg['shift'], ((i+j)%2)*self.cfg['c']] for i in range(n+1) ]\n\n        if m > 1e-3:\n            f = -1 if pts[-1][1] > 1e-5 else 1\n\n            pts.append([ pts[-1][0]-m, pts[-1][1]+f*m ])\n\n        pts.extend([ [-self.cfg['w']-self.cfg['o_c'], self.cfg['b']],\n            [0, self.cfg['b']] ])\n\n        if self.cfg['shift'] > 1e-5:\n            y = self.cfg['c']-self.cfg['shift'] if j%2 == 0 else self.cfg['shift']\n\n            pts.append([0, y])\n\n        return pts\n\n    def draw_spacer(self):\n        pts = [[-self.cfg['w']+self.cfg['o_a'], 2*self.cfg['e']],\n            [-self.cfg['w']+self.cfg['o_a'], self.cfg['b']],\n            [self.cfg['a'], self.cfg['b']],\n            [self.cfg['a'], 2*self.cfg['e']]]\n\n        if self.cfg['end'] == 'B':\n            pts[:1] = [[-self.cfg['w']-2*self.cfg['e'], 2*self.cfg['e']],\n                [-self.cfg['w']-2*self.cfg['e'], -self.cfg['a']],\n                [-self.cfg['w']-self.cfg['b'], -self.cfg['a']]]\n\n        return pts\n\n    def export(self, name):\n        extr = extrude(self.draw_bricks(self.cfg['seqs'][0], self.cfg['end_seqs'][0]), self.cfg['r'], self.cfg['q']/2)\n        extr1 = extrude(self.draw_spacer(), 2*self.cfg['e'], self.cfg['q']/2+self.cfg['r'])\n\n        extr2 = extrude(self.draw_bricks(self.cfg['seqs'][1], self.cfg['end_seqs'][1]), -self.cfg['r'], -self.cfg['q']/2)\n        extr3 = extrude(self.draw_spacer(), -2*self.cfg['e'], -self.cfg['q']/2-self.cfg['r'])\n\n        extr4 = extrude(self.draw_zz_bricks(), self.cfg['q'], -self.cfg['q']/2)\n\n        # extr + extr1\n        bf = vtkPolyDataBooleanFilter()\n        bf.SetInputConnection(extr.GetOutputPort())\n        bf.SetInputConnection(1, extr1.GetOutputPort())\n\n        # extr2 + extr3\n        bf1 = vtkPolyDataBooleanFilter()\n        bf1.SetInputConnection(extr2.GetOutputPort())\n        bf1.SetInputConnection(1, extr3.GetOutputPort())\n\n        app = vtkAppendPolyData()\n        app.AddInputConnection(bf.GetOutputPort())\n        app.AddInputConnection(bf1.GetOutputPort())\n\n        bf2 = vtkPolyDataBooleanFilter()\n        bf2.SetInputConnection(app.GetOutputPort())\n        bf2.SetInputConnection(1, extr4.GetOutputPort())\n\n        ang = math.radians(self.cfg['ang'])\n\n        v = [0, 5]\n\n        _v = [math.cos(ang)*v[0]-math.sin(ang)*v[1],\n            math.sin(ang)*v[0]+math.cos(ang)*v[1]]\n\n        plane = vtkPlaneSource()\n        plane.SetOrigin(0, 0, 0)\n        plane.SetPoint1(0, 0, 5)\n        plane.SetPoint2(_v[0], _v[1], 0)\n        plane.SetCenter(0, 0 , 0)\n        plane.SetResolution(2, 2)\n\n        bf3 = vtkPolyDataBooleanFilter()\n        bf3.SetInputConnection(bf2.GetOutputPort())\n        bf3.SetInputConnection(1, plane.GetOutputPort())\n        bf3.SetOperModeToDifference()\n\n        result = bf3\n\n        if self.cfg['end'] == 'D':\n\n            _v = [math.cos(-ang)*v[0]-math.sin(-ang)*v[1],\n                math.sin(-ang)*v[0]+math.cos(-ang)*v[1]]\n\n            plane1 = vtkPlaneSource()\n            plane1.SetOrigin(0, 0, 0)\n            plane1.SetPoint2(0, 0, 5)\n            plane1.SetPoint1(_v[0], _v[1], 0)\n            plane1.SetCenter(-self.cfg['w'], 0 , 0)\n            plane1.SetResolution(2, 2)\n\n            bf4 = vtkPolyDataBooleanFilter()\n            bf4.SetInputConnection(result.GetOutputPort())\n            bf4.SetInputConnection(1, plane1.GetOutputPort())\n            bf4.SetOperModeToDifference()\n\n            result = bf4\n\n        if 'clip' in self.cfg:\n            plane2 = vtkPlaneSource()\n            plane2.SetOrigin(0, 0, 0)\n            plane2.SetPoint1(0, 0, 5)\n            plane2.SetPoint2(v[0], v[1], 0)\n            plane2.SetCenter(-self.cfg['clip'], 0 , 0)\n            plane2.SetResolution(2, 2)\n\n            bf5 = vtkPolyDataBooleanFilter()\n            bf5.SetInputConnection(result.GetOutputPort())\n            bf5.SetInputConnection(1, plane2.GetOutputPort())\n            bf5.SetOperModeToDifference()\n\n            result = bf5\n\n        if 'pins' in self.cfg:\n            app1 = vtkAppendPolyData()\n\n            t = self.cfg.get('clip', 0)\n            fake_w = self.cfg.get('fake_w', self.cfg['w'])\n\n            u = (fake_w-t)/self.cfg['pins']/2\n\n            off = .2 # offset, sodass man die pins leichter hineinstecken kann\n\n            h = self.cfg['q']+2*self.cfg['r']-off\n            half_w = (5-off)/2\n\n            mids = []\n\n            for i in range(self.cfg['pins']):\n                mid = t+u*(1+i*2)\n\n                pin = extrude([ [-mid-half_w, self.cfg['b']], [-mid-half_w, self.cfg['b']+1.5],\n                    [-mid+half_w, self.cfg['b']+1.5], [-mid+half_w, self.cfg['b']] ], h, -h/2)\n\n                app1.AddInputConnection(pin.GetOutputPort())\n\n                mids.append(mid)\n\n            print('mids', mids)\n\n            bf6 = vtkPolyDataBooleanFilter()\n            bf6.SetInputConnection(result.GetOutputPort())\n            bf6.SetInputConnection(1, app1.GetOutputPort())\n\n            result = bf6\n\n        if self.cfg['flip']:\n            tra = vtkTransform()\n            tra.Scale(-1, 1, 1)\n\n            tf = vtkTransformPolyDataFilter()\n            tf.SetInputConnection(result.GetOutputPort())\n            tf.SetTransform(tra)\n\n            rf = vtkReverseSense()\n            rf.SetInputConnection(tf.GetOutputPort())\n\n            rf.Update()\n\n            bnds = Bnds(*rf.GetOutput().GetBounds())\n\n            tra2 = vtkTransform()\n            tra2.Translate(0, 0, -bnds.z1)\n\n            tf2 = vtkTransformPolyDataFilter()\n            tf2.SetInputConnection(rf.GetOutputPort())\n            tf2.SetTransform(tra2)\n\n            clean = vtkCleanPolyData()\n            clean.SetInputConnection(tf2.GetOutputPort())\n\n            writer = vtkPolyDataWriter()\n            writer.SetInputConnection(clean.GetOutputPort())\n            writer.SetFileName(name)\n            writer.Update()\n\n        else:\n            result.Update()\n            bnds = Bnds(*result.GetOutput().GetBounds())\n\n            tra2 = vtkTransform()\n            tra2.Translate(0, 0, -bnds.z1)\n\n            tf2 = vtkTransformPolyDataFilter()\n            tf2.SetInputConnection(result.GetOutputPort())\n            tf2.SetTransform(tra2)\n\n            clean = vtkCleanPolyData()\n            clean.SetInputConnection(tf2.GetOutputPort())\n\n            writer = vtkPolyDataWriter()\n            writer.SetInputConnection(clean.GetOutputPort())\n            writer.SetFileName(name)\n            writer.Update()\n\nif __name__ == '__main__':\n    cfgs = [\n        { 'seqs': [(2, 2), (2, 1, 2)], 'w': 39., 'pins': 2, 'fake_w': 40*3.25/3 }, # 0\n        { 'seqs': [(1, 1), (1, 1)], 'w': 3.25, 'end': 'B', 'flip': True },\n        { 'seqs': [(2, 2), (2, 1, 2)], 'w': 40*3.25/3, 'pins': 2 },\n        { 'seqs': [(1, 1), (1, 1)], 'w': 11.375, 'end': 'C', 'flip': True, 'pins': 1 }, # 3\n        { 'seqs': [(2, 2), (2, 1, 2)], 'w': 91*3.25/3, 'end': 'D', 'end_seqs': [(), (1,)], 'pins': 5 },\n        { 'seqs': [(1, 1), (1, 1)], 'w': 85*3.25/3, 'end': 'C', 'end_seqs': [(0,), (0,)], 'shift': 3*.4333333333/2, 'pins': 5 },\n        { 'seqs': [(2, 1, 2), (2, 2)], 'w': 40*3.25/3, 'end': 'C', 'flip': True, 'end_seqs': [(), (1, 2)], 'pins': 2 }, # 6\n        { 'seqs': [(1, 1), (1, 1)], 'w': 3.25, 'end': 'B' },\n        { 'seqs': [(2, 2), (2, 1, 2)], 'w': 40*3.25/3, 'flip': True, 'clip': 8*3.25/3, 'pins': 2 },\n        { 'seqs': [(1, 1), (1, 1)], 'w': 7*3.25/3, 'end': 'B', 'flip': True, 'ang': 22.5, 'pins': 1, 'fake_w': 7*3.25/3+1 }, # 9\n        { 'seqs': [(1, 1), (1, 1)], 'w': 47*3.25/3, 'ang': 22.5, 'pins': 3 },\n        { 'seqs': [(2, 2), (2, 1, 2)], 'w': 18.3848, 'end': 'D', 'ang': 22.5, 'sym': True, 'end_seqs': [(1,), ()], 'pins': 1 },\n        { 'seqs': [(1,), (1,)], 'w': 3.25/3, 'end': 'B', 'flip': True }, # 12\n        { 'seqs': [(1, 1), (1, 1)], 'w': 11.5*3.25/3, 'end': 'C', 'pins': 1 },\n        { 'seqs': [(1, 1), (1, 1)], 'w': 11.5*3.25/3, 'end': 'C', 'flip': True, 'pins': 1 }\n    ]\n\n    os.makedirs('einzeln', exist_ok=True)\n    os.makedirs('stl', exist_ok=True)\n\n    cell_counts = [524, 98, 576, 264, 1274, 1867, 582, 98, 472, 194, 1048, 272, 56, 284, 284]\n\n    for i, cfg in enumerate(cfgs):\n        print(f'~~ {i} ~~')\n\n        f = f'einzeln/test{i}.vtk'\n        Frieze(cfg).export(f)\n\n        assert os.path.exists(f)\n\n        reader = vtkPolyDataReader()\n        reader.SetFileName(f)\n\n        writer = vtkSTLWriter()\n        writer.SetInputConnection(reader.GetOutputPort())\n        writer.SetFileName(f'stl/test{i}.stl')\n\n        writer.Update()\n\n        assert reader.GetOutput().GetNumberOfCells() == cell_counts[i]\n"
  },
  {
    "path": "testing/pytest.ini",
    "content": "[pytest]\nlog_cli = True\naddopts = --basetemp=out\nxfail_strict = True\n"
  },
  {
    "path": "testing/test_congruence.cxx",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#include \"Contact.h\"\n\nint main() {\n    auto pdA = CreatePolyData({ { {0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0} } });\n\n    double z = std::tan(0.0005/180*M_PI)*.5;\n\n    auto pdB = CreatePolyData({\n        { {0, 0, 0}, {0, .5, 0}, {1, .5, 0}, {1, 0, 0} },\n        { {1, .5, 0}, {0, .5, 0}, {0, 1, z}, {1, 1, z} }\n    });\n\n    auto _pdA = Clean(pdA);\n    auto _pdB = Clean(pdB);\n\n    auto lines = Contact(_pdA, _pdB).GetLines();\n\n    if (lines->GetNumberOfCells() == 0) {\n        return EXIT_FAILURE;\n    }\n\n#ifdef DEBUG\n    WriteVTK(\"lines.vtk\", lines);\n#endif\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "testing/test_filter.py",
    "content": "#!/usr/bin/env python\n# *-* coding: UTF-8 *-*\n\n# Copyright 2012-2025 Ronald Römer\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport sys\nsys.path.extend(['/home/zippy/vtkbool/build/lib/python3.13/site-packages/vtkbool'])\n\nfrom collections import defaultdict\nfrom operator import itemgetter\nimport math\nimport pytest\nfrom functools import reduce\n\nfrom vtkmodules.vtkCommonCore import vtkIdList, vtkIdTypeArray, vtkPoints\nfrom vtkmodules.vtkCommonDataModel import vtkPolyData, VTK_POLYGON\nfrom vtkmodules.vtkFiltersSources import vtkCubeSource, vtkCylinderSource, vtkSphereSource, vtkPolyLineSource\nfrom vtkmodules.vtkCommonDataModel import vtkKdTreePointLocator\nfrom vtkmodules.vtkFiltersCore import vtkAppendPolyData, vtkCleanPolyData, vtkPolyDataNormals\nfrom vtkmodules.vtkIOLegacy import vtkPolyDataWriter, vtkPolyDataReader\nfrom vtkmodules.vtkCommonExecutionModel import vtkTrivialProducer\nfrom vtkmodules.vtkFiltersModeling import vtkRotationalExtrusionFilter\nfrom vtkmodules.vtkFiltersGeneral import vtkTransformPolyDataFilter\nfrom vtkmodules.vtkCommonTransforms import vtkTransform\nfrom vtkmodules.vtkCommonExecutionModel import vtkAlgorithm\nfrom vtkmodules.vtkFiltersModeling import vtkLinearExtrusionFilter\n\nfrom vtkbool import vtkPolyDataBooleanFilter\n\ndef check_result(bf, expected_regs=None):\n    lines = bf.GetOutput(2)\n\n    lines.BuildLinks()\n\n    pdA = bf.GetOutput(0)\n    pdB = bf.GetOutput(1)\n\n    pdA.BuildLinks()\n    pdB.BuildLinks()\n\n    contsA = lines.GetCellData().GetArray('cA')\n    contsB = lines.GetCellData().GetArray('cB')\n\n    assert isinstance(contsA, vtkIdTypeArray)\n    assert isinstance(contsB, vtkIdTypeArray)\n\n    regionsA = pdA.GetPointData().GetArray('RegionId')\n    regionsB = pdB.GetPointData().GetArray('RegionId')\n\n    assert isinstance(regionsA, vtkIdTypeArray)\n    assert isinstance(regionsB, vtkIdTypeArray)\n\n    valuesA = set(regionsA.GetValue(i) for i in range(regionsA.GetNumberOfValues()))\n    valuesB = set(regionsB.GetValue(i) for i in range(regionsB.GetNumberOfValues()))\n\n    if isinstance(expected_regs, list):\n        assert len(valuesA) == expected_regs[0]\n        assert len(valuesB) == expected_regs[1]\n    else:\n        print([len(valuesA), len(valuesB)])\n\n    for name, pd in [('pdA', pdA), ('pdB', pdB)]:\n        print(f'checking {name}')\n\n        loc = vtkKdTreePointLocator()\n        loc.SetDataSet(pd)\n        loc.BuildLocator()\n\n        it = lines.GetLines().NewIterator()\n\n        while not it.IsDoneWithTraversal():\n\n            line = it.GetCurrentCell()\n\n            # print('line', it.GetCurrentCellId())\n\n            idA = line.GetId(0)\n            idB = line.GetId(1)\n\n            linkedA = vtkIdList()\n            linkedB = vtkIdList()\n\n            lines.GetPointCells(idA, linkedA)\n            lines.GetPointCells(idB, linkedB)\n\n            _linkedA = linkedA.GetNumberOfIds()\n            _linkedB = linkedB.GetNumberOfIds()\n\n            ptA = lines.GetPoint(idA)\n            ptB = lines.GetPoint(idB)\n\n            # print(ptA)\n            # print(ptB)\n\n            ptsA = vtkIdList()\n            ptsB = vtkIdList()\n\n            loc.FindPointsWithinRadius(1e-5, ptA, ptsA)\n            loc.FindPointsWithinRadius(1e-5, ptB, ptsB)\n\n            neigs = defaultdict(list)\n\n            for pts in [ptsA, ptsB]:\n                polys = vtkIdList()\n\n                for i in range(pts.GetNumberOfIds()):\n                    pd.GetPointCells(pts.GetId(i), polys)\n\n                    for j in range(polys.GetNumberOfIds()):\n                        neigs[polys.GetId(j)].append(pts.GetId(i))\n\n            direct_neigs = {}\n\n            for poly_id, point_ids in neigs.items():\n                if len(point_ids) > 1:\n                    equal_points = defaultdict(list)\n\n                    for point_id in point_ids:\n                        x, y, z = pd.GetPoint(point_id)\n\n                        equal_points[f'{x:.5f},{y:.5f},{z:.5f}'].append(point_id)\n\n                    groups = list(equal_points.values())\n\n                    if len(groups) == 2:\n                        poly = vtkIdList()\n                        pd.GetCellPoints(poly_id, poly)\n\n                        next_inds = [ i+1 for i in range(poly.GetNumberOfIds()-1) ] + [0]\n\n                        groups_ = [ [ (id_, poly.IsId(id_)) for id_ in group ] for group in groups ]\n\n                        for group in groups_:\n                            if len(group) > 1:\n                                group.sort(key=itemgetter(1))\n\n                                # mehr als 2 punkte an gleicher stelle?\n                                assert len(group) < 3\n\n                                it_a = map(itemgetter(1), group + group[:1])\n                                it_b = iter(it_a)\n                                next(it_b)\n\n                                for a, b in zip(it_a, it_b):\n                                    # benachbart?\n                                    c = next_inds[a]\n                                    assert c != b\n\n                        group_a, group_b = groups_\n\n                        possible_edges = [ [i, j] for i in group_a for j in group_b ]\n\n                        edges = []\n\n                        for a, b in possible_edges:\n                            id_i, i = a\n                            id_j, j = b\n\n                            next_i = next_inds[i]\n                            next_j = next_inds[j]\n\n                            if next_i == j \\\n                                or next_j == i:\n\n                                # reihenfolge ist dann nicht mehr wichtig\n                                edges.append([id_i, id_j])\n\n                        # print(edges)\n\n                        direct_neigs[poly_id] = edges\n\n            # print(direct_neigs)\n\n            match len(direct_neigs):\n                case 2:\n                    a, b = direct_neigs.values()\n\n                    assert len(a) == 1\n                    assert len(b) == 1\n\n                    ids = set(a[0] + b[0])\n\n                    if _linkedA == _linkedB:\n                        assert len(ids) == 4\n\n                    elif _linkedA == 2:\n                        end_ids = set()\n\n                        for i in range(_linkedA):\n                            _line = vtkIdList()\n                            lines.GetCellPoints(linkedA.GetId(i), _line)\n\n                            end_ids.add(_line.GetId(0))\n                            end_ids.add(_line.GetId(1))\n\n                        end_ids.remove(idA)\n\n                        if len(end_ids) == 2:\n                            assert len(ids) == 4\n                        else:\n                            assert len(ids) == 3\n\n                    elif _linkedB == 2:\n                        end_ids = set()\n\n                        for i in range(_linkedB):\n                            _line = vtkIdList()\n                            lines.GetCellPoints(linkedB.GetId(i), _line)\n\n                            end_ids.add(_line.GetId(0))\n                            end_ids.add(_line.GetId(1))\n\n                        end_ids.remove(idB)\n\n                        if len(end_ids) == 2:\n                            assert len(ids) == 4\n                        else:\n                            assert len(ids) == 3\n\n                    else:\n                        # bspw. bei _linkedA == 4, _linkedB == 6\n                        assert len(ids) == 4\n\n                case 1:\n                    a, *_ = direct_neigs.values()\n\n                    assert len(a) == 2\n\n                    ids = set(sum(a, []))\n\n                    if _linkedA == 2 \\\n                        or _linkedB == 2:\n\n                        assert len(ids) == 3\n\n                    else:\n                        assert len(ids) == 4\n\n                case 0:\n                    assert False\n\n            it.GoToNextCell()\n\n        print('-> ok')\n\ndef write_result(bf, d):\n    for i, name in enumerate(['pdA', 'pdB', 'lines']):\n        writer = vtkPolyDataWriter()\n        writer.SetFileName(d / f'{name}.vtk')\n        writer.SetInputConnection(bf.GetOutputPort(i))\n        writer.Update()\n\ndef extrude_polygon(poly, z):\n    cell = vtkIdList()\n\n    pts = vtkPoints()\n    pts.SetDataTypeToDouble()\n\n    for pt in poly:\n        cell.InsertNextId(pts.InsertNextPoint(*pt, 0))\n\n    pd = vtkPolyData()\n    pd.Allocate(1)\n    pd.SetPoints(pts)\n    pd.InsertNextCell(VTK_POLYGON, cell)\n\n    extr = vtkLinearExtrusionFilter()\n    extr.SetInputData(pd)\n    extr.SetVector(0, 0, z)\n\n    normals = vtkPolyDataNormals()\n    normals.SetInputConnection(extr.GetOutputPort())\n    normals.AutoOrientNormalsOn()\n\n    return normals\n\ndef create_polydata(pts, polys):\n    _pts = vtkPoints()\n    _pts.SetDataTypeToDouble()\n\n    for pt in pts:\n        _pts.InsertNextPoint(*pt)\n\n    pd = vtkPolyData()\n    pd.Allocate(1)\n    pd.SetPoints(_pts)\n\n    for poly in polys:\n        cell = vtkIdList()\n        for i in poly:\n            cell.InsertNextId(i)\n        pd.InsertNextCell(VTK_POLYGON, cell)\n\n    prod = vtkTrivialProducer()\n    prod.SetOutput(pd)\n\n    return prod\n\ndef test_simple(tmp_path):\n    cube = vtkCubeSource()\n    cube.SetYLength(.5)\n\n    cyl = vtkCylinderSource()\n    cyl.SetResolution(32)\n    cyl.SetHeight(.5)\n    cyl.SetCenter(0, .5, 0)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, cyl.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [2, 2])\n\ndef test_simple_2(tmp_path):\n    cube = vtkCubeSource()\n    cube.SetYLength(.5)\n\n    cyl = vtkCylinderSource()\n    cyl.SetResolution(32)\n    cyl.SetHeight(.5)\n    cyl.SetCenter(0, .25, 0)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, cyl.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [2, 2])\n\ndef test_simple_3(tmp_path):\n    cube = vtkCubeSource()\n    cube.SetYLength(.5)\n\n    cyl = vtkCylinderSource()\n    cyl.SetResolution(32)\n    cyl.SetHeight(.5)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, cyl.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [6, 6])\n\ndef test_simple_4(tmp_path):\n    cube = vtkCubeSource()\n\n    cyl = vtkPolyData()\n    cyl.Allocate(1)\n\n    pts = vtkPoints()\n    pts.SetDataTypeToDouble()\n\n    bottom = vtkIdList()\n    top = vtkIdList()\n\n    phi = math.pi/16\n\n    for i in range(32):\n        x0 = .5*math.cos(i*phi)\n        z0 = .5*math.sin(i*phi)\n\n        x1 = .5*math.cos((i+1)*phi)\n        z1 = .5*math.sin((i+1)*phi)\n\n        top.InsertNextId(pts.InsertNextPoint(x0, .75, z0))\n        bottom.InsertNextId(pts.InsertNextPoint(x0, -.25, z0))\n\n        for j in range(4):\n            side = vtkIdList()\n\n            side.InsertNextId(pts.InsertNextPoint(x0, -.25+j/4, z0))\n            side.InsertNextId(pts.InsertNextPoint(x0, -.25+(j+1)/4, z0))\n            side.InsertNextId(pts.InsertNextPoint(x1, -.25+(j+1)/4, z1))\n            side.InsertNextId(pts.InsertNextPoint(x1, -.25+j/4, z1))\n\n            cyl.InsertNextCell(VTK_POLYGON, side)\n\n    cyl.SetPoints(pts)\n\n    cyl.ReverseCell(cyl.InsertNextCell(VTK_POLYGON, top))\n    cyl.InsertNextCell(VTK_POLYGON, bottom)\n\n    prod = vtkTrivialProducer()\n    prod.SetOutput(cyl)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, prod.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [2, 2])\n\ndef test_same(tmp_path):\n    sphere = vtkSphereSource()\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, sphere.GetOutputPort())\n    bf.SetInputConnection(1, sphere.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [56, 56])\n\n@pytest.mark.xfail\ndef test_intersecting_strips():\n    cubeA = vtkCubeSource()\n    cubeA.SetBounds(-5, 5, -2.5, 2.5, -1.25, 1.25)\n\n    cubeB = vtkCubeSource()\n    cubeB.SetBounds(-1.25, 1.25, -1.25, 1.25, -1.25, 1.25)\n\n    traA = vtkTransform()\n    traA.Translate(-1.25, 0, 0)\n    traA.RotateZ(45)\n\n    traB = vtkTransform()\n    traB.Translate(1.25, 0, 0)\n    traB.RotateZ(45)\n\n    tfA = vtkTransformPolyDataFilter()\n    tfA.SetTransform(traA)\n    tfA.SetInputConnection(cubeB.GetOutputPort())\n\n    tfB = vtkTransformPolyDataFilter()\n    tfB.SetTransform(traB)\n    tfB.SetInputConnection(cubeB.GetOutputPort())\n\n    app = vtkAppendPolyData()\n    app.AddInputConnection(tfA.GetOutputPort())\n    app.AddInputConnection(tfB.GetOutputPort())\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cubeA.GetOutputPort())\n    bf.SetInputConnection(1, app.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    check_result(bf)\n\n@pytest.mark.xfail\ndef test_intersecting_strips_2():\n    cube = vtkCubeSource()\n    cube.SetBounds(-10, 10, 0, 12, 0, 10)\n\n    poly = [\n        [-5, 0],\n        [3, 8],\n        [-3, 8],\n        [5, 0],\n        [8, 0],\n        [8, 10],\n        [-8, 10],\n        [-8, 0]\n    ]\n\n    pd = extrude_polygon(poly, 10)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, pd.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    check_result(bf)\n\ndef test_touch(tmp_path):\n    cube = vtkCubeSource()\n\n    cylinder = vtkCylinderSource()\n    cylinder.SetResolution(32)\n    cylinder.SetRadius(.25)\n    cylinder.SetCenter(.25, 0, 0)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, cylinder.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [3, 3])\n\ndef test_merger(tmp_path):\n    cube = vtkCubeSource()\n\n    cyl = vtkCylinderSource()\n    cyl.SetRadius(.25)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, cyl.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [3, 3])\n\ndef test_merger_2(tmp_path):\n    cube = vtkCubeSource()\n\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/merger.vtk')\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, reader.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [7, 5])\n\ndef test_quads(tmp_path):\n    sphereA = vtkSphereSource()\n    sphereA.LatLongTessellationOn()\n    sphereA.SetCenter(-.25, 0, 0)\n\n    sphereB = vtkSphereSource()\n    sphereB.LatLongTessellationOn()\n    sphereB.SetCenter(.25, 0, 0)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, sphereA.GetOutputPort())\n    bf.SetInputConnection(1, sphereB.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [2, 2])\n\ndef test_triangle_strips(tmp_path):\n    line = vtkPolyLineSource()\n    line.SetNumberOfPoints(19)\n\n    phi = math.pi/18\n\n    for i in range(19):\n        line.SetPoint(i, 0, math.cos(i*phi), math.sin(i*phi))\n\n    extr = vtkRotationalExtrusionFilter()\n    extr.SetInputConnection(line.GetOutputPort())\n    extr.SetResolution(18)\n    extr.SetRotationAxis(0, 1, 0)\n\n    sphere = vtkSphereSource()\n    sphere.SetRadius(1)\n\n    tra = vtkTransform()\n    tra.RotateX(90)\n\n    tf = vtkTransformPolyDataFilter()\n    tf.SetInputConnection(sphere.GetOutputPort())\n    tf.SetTransform(tra)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, extr.GetOutputPort())\n    bf.SetInputConnection(1, tf.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [49, 49])\n\ndef test_special(tmp_path):\n    cubeA = vtkCubeSource()\n    cubeA.SetBounds(-5, 5, -10, 0, 0, 10)\n\n    poly = [\n        [0, 0],\n        [1, 0],\n        [2, -1],\n        [3, 0],\n        [4, -1],\n        [5, 0],\n        [5, 10],\n        [-5, 10],\n        [-5, 0],\n        [-4, 1],\n        [-3, 0],\n        [-2, 1],\n        [-1, 0]\n    ]\n\n    cubeB = extrude_polygon(poly, 10)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cubeA.GetOutputPort())\n    bf.SetInputConnection(1, cubeB.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    write_result(bf, tmp_path)\n\n    assert bf.GetOutput(2).GetNumberOfCells() == 32\n\n@pytest.mark.xfail\ndef test_non_manifolds():\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/non-manifold.vtk')\n\n    cyl = vtkCylinderSource()\n    cyl.SetCenter(.75, 0, 0)\n    cyl.SetRadius(.75)\n    cyl.SetResolution(18)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, reader.GetOutputPort())\n    bf.SetInputConnection(1, cyl.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.Update()\n\n    check_result(bf)\n\ndef test_branched(tmp_path):\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/branched.vtk')\n\n    cube = vtkCubeSource()\n    cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.375, .375)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, reader.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [4, 4])\n\ndef test_branched_2(tmp_path):\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/branched.vtk')\n\n    cube = vtkCubeSource()\n    cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.75, .75)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, reader.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [8, 8])\n\n@pytest.mark.xfail\ndef test_branched_3():\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/branched3.vtk')\n\n    cube = vtkCubeSource()\n    cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.75, .75)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, reader.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    check_result(bf)\n\ndef test_branched_4(tmp_path):\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/branched4.vtk')\n\n    cube = vtkCubeSource()\n    cube.SetBounds(-.3283653157, .3283653157, -.5, .5, -.375, .375)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, reader.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [6, 7])\n\ndef test_branched_5(tmp_path):\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/branched.vtk')\n\n    traA = vtkTransform()\n    traA.Translate(0, -.5, 0)\n\n    tfA = vtkTransformPolyDataFilter()\n    tfA.SetInputConnection(reader.GetOutputPort())\n    tfA.SetTransform(traA)\n\n    traB = vtkTransform()\n    traB.Translate(0, .5, 0)\n\n    tfB = vtkTransformPolyDataFilter()\n    tfB.SetInputConnection(reader.GetOutputPort())\n    tfB.SetTransform(traB)\n\n    app = vtkAppendPolyData()\n    app.AddInputConnection(tfA.GetOutputPort())\n    app.AddInputConnection(tfB.GetOutputPort())\n\n    cube = vtkCubeSource()\n    cube.SetBounds(-.3283653157, .3283653157, -1, 1, -.375, .375)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, app.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [7, 8])\n\ndef test_branched_6(tmp_path):\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/branched6.vtk')\n\n    cube = vtkCubeSource()\n    cube.SetBounds(-.3283653157, .3283653157, -1, 1, -.33371031284, .33371031284)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cube.GetOutputPort())\n    bf.SetInputConnection(1, reader.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [6, 5])\n\ndef test_bad_shaped(tmp_path):\n    cubeA = vtkCubeSource()\n    cubeA.SetBounds(-2.5, 2.5, 0, 5, 0, 5)\n\n    z = 4.75\n\n    pts = [\n        [2.5, -2.5, 0],\n        [2.5, -2.5, 5],\n        [0, -2.5, z],\n        [-2.5, -2.5, 5],\n        [-2.5, -2.5, 0],\n\n        [-2.5, 2.5, 0],\n        [-2.5, 2.5, 5],\n        [0, 2.5, z],\n        [2.5, 2.5, 5],\n        [2.5, 2.5, 0],\n    ]\n\n    polys = [\n        [0, 1, 2, 3, 4],\n        [5, 6, 7, 8, 9],\n        [9, 8, 1, 0],\n        [4, 3, 6, 5],\n        [9, 0, 4, 5],\n        [1, 8, 7, 6, 3, 2]\n    ]\n\n    cubeB = create_polydata(pts, polys)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cubeA.GetOutputPort())\n    bf.SetInputConnection(1, cubeB.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [5, 5])\n\n@pytest.mark.xfail\ndef test_self_intersecting_polys():\n    cubeA = vtkCubeSource()\n    cubeA.SetCenter(0, 0, 1.375) # 1, 1.25, 1.375\n\n    pts = [\n        [.5, .5, 0],\n        [-.5, .5, 0],\n        [-.5, -.5, 0],\n        [.5 , -.5, 0],\n\n        [.5, 0, .5], # 4\n        [0, .5, .5],\n        [-.5, 0, .5],\n        [0, -.5, .5],\n\n        [.5, 0, .75], # 8\n        [0, .5, .75],\n        [-.5, 0, .75],\n        [0, -.5, .75],\n\n        [.5, 0, 1], # 12\n        [.5, .5, 1],\n        [0, .5, 1],\n        [-.5, .5, 1],\n        [-.5, 0, 1], # 16\n        [-.5, -.5, 1],\n        [0, -.5, 1],\n        [.5, -.5, 1]\n    ]\n\n    polys = [\n        [3, 2, 1, 0],\n        [12, 13, 14, 15, 16, 17, 18, 19],\n        [3, 19, 18, 11, 7, 11, 18, 17, 2],\n        [0, 13, 12, 8, 4, 8, 12, 19, 3],\n        [1, 15, 14, 9, 5, 9, 14, 13, 0],\n        [2, 17, 16, 10, 6, 10, 16, 15, 1]\n    ]\n\n    cubeB = create_polydata(pts, polys)\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cubeA.GetOutputPort())\n    bf.SetInputConnection(1, cubeB.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    check_result(bf)\n\ndef test_equal_capt_pts(tmp_path):\n    cyl = vtkCylinderSource()\n    cyl.SetHeight(2)\n    cyl.SetResolution(12)\n\n    z = .0000025\n    # z = .0000075 # verursacht ein anderes bekanntes problem\n\n    tra = vtkTransform()\n    tra.RotateZ(90)\n    tra.Translate(0, 0, z)\n\n    tf = vtkTransformPolyDataFilter()\n    tf.SetTransform(tra)\n    tf.SetInputConnection(cyl.GetOutputPort())\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cyl.GetOutputPort())\n    bf.SetInputConnection(1, tf.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [4, 4])\n\ndef test_equal_capt_pts_2(tmp_path):\n    reader = vtkPolyDataReader()\n    reader.SetFileName('data/cross.vtk')\n\n    z = .000001\n\n    tra = vtkTransform()\n    tra.RotateZ(45)\n    tra.Translate(0, 0, z)\n\n    tf = vtkTransformPolyDataFilter()\n    tf.SetTransform(tra)\n    tf.SetInputConnection(reader.GetOutputPort())\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, reader.GetOutputPort())\n    bf.SetInputConnection(1, tf.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [24, 24])\n\ndef test_equal_capt_pts_3(tmp_path):\n    z = .000005\n\n    poly = [\n        [0, 0],\n        [3, 3],\n        [6, 0],\n        [9, 3],\n        [12, 0],\n        [15, 3],\n        [18, 0],\n        [21, 3],\n        [24, 0],\n        [24, -8],\n        [0, -8]\n    ]\n\n    rack = extrude_polygon(poly, 20)\n\n    cyl = vtkCylinderSource()\n    cyl.SetHeight(30)\n    cyl.SetRadius(5)\n    cyl.SetResolution(12)\n    cyl.SetOutputPointsPrecision(vtkAlgorithm.DOUBLE_PRECISION)\n\n    tra = vtkTransform()\n    tra.Translate(12, -2-z, 10)\n    tra.RotateZ(90)\n\n    tf = vtkTransformPolyDataFilter()\n    tf.SetTransform(tra)\n    tf.SetInputConnection(cyl.GetOutputPort())\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, rack.GetOutputPort())\n    bf.SetInputConnection(1, tf.GetOutputPort())\n    bf.SetOperModeToNone()\n    bf.Update()\n\n    write_result(bf, tmp_path)\n    check_result(bf, [6, 6])\n\ndef test_transform_matrix(tmp_path):\n    cubeA = vtkCubeSource()\n    cubeA.SetBounds(-1.5, 1.5, -1.5, 1.5, -1.5, 1.5)\n\n    cubeB = vtkCubeSource()\n    cubeB.SetBounds(-3, 3, -.5, .5, -.5, .5)\n\n    transform = vtkTransform()\n    matrix = transform.GetMatrix()\n\n    bf = vtkPolyDataBooleanFilter()\n    bf.SetInputConnection(0, cubeA.GetOutputPort())\n    bf.SetInputConnection(1, cubeB.GetOutputPort())\n    bf.SetOperModeToNone()\n\n    bf.SetMatrix(1, matrix)\n\n    for i in range(18):\n        transform.Identity()\n        transform.RotateY(i*10)\n\n        matrix = transform.GetMatrix()\n\n        # bf.SetMatrix(1, matrix)\n\n        print(bf.GetMatrix(1))\n\n        bf.Update()\n\n        path = tmp_path / f'transformed_{i}'\n        path.mkdir()\n\n        write_result(bf, path)\n        check_result(bf, [3, 3])\n"
  },
  {
    "path": "testing/test_merger.cxx",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#include <string>\n#include <cmath>\n\n#include <vtkCellData.h>\n#include <vtkCellArrayIterator.h>\n#include <vtkIdTypeArray.h>\n\n#include \"Merger.h\"\n\nPoly CreateRegularPoly (double r, vtkIdType step, double x, double y, double rotate = 0) {\n    Poly poly;\n\n    double phi = 2*M_PI/static_cast<double>(step);\n\n    vtkIdType i;\n\n    double x1, y1, x2, y2;\n\n    double alpha = rotate*M_PI/180;\n\n    for (i = 0; i < step; i++) {\n        double _i = static_cast<double>(i);\n\n        x1 = r*std::cos(_i*phi);\n        y1 = r*std::sin(_i*phi);\n\n        x2 = std::cos(alpha)*x1-std::sin(alpha)*y1;\n        y2 = std::sin(alpha)*x1+std::cos(alpha)*y1;\n\n        poly.emplace_back(x2+x, y2+y, 0);\n    }\n\n    return poly;\n}\n\nbool Test (vtkPolyData *pd, PolysType &polys, vtkIdType numCells, [[maybe_unused]] const char *name) {\n\n    auto cellIds = vtkSmartPointer<vtkIdTypeArray>::New();\n    cellIds->SetName(\"OrigCellIds\");\n    cellIds->InsertNextValue(0);\n    pd->GetCellData()->SetScalars(cellIds);\n\n    PStrips pStrips {pd, 0};\n\n    Base &base = pStrips.base;\n\n    base.ei[0] = 1; base.ei[1] = 0; base.ei[2] = 0;\n    base.ej[0] = 0; base.ej[1] = 1; base.ej[2] = 0;\n    base.n[0] = 0; base.n[1] = 0; base.n[2] = 1;\n    base.d = 0;\n\n    StripsType holes;\n\n    vtkIdType ind {0};\n    std::size_t stripId {0};\n\n    for (auto &poly : polys) {\n        StripType strip;\n\n        poly.push_back(poly.front());\n\n        for (const auto &p : poly) {\n            StripPt sp;\n            sp.ind = ind;\n            sp.polyId = 0;\n\n            sp.pt[0] = p.x;\n            sp.pt[1] = p.y;\n            sp.pt[2] = p.z;\n\n            pStrips.pts.emplace(ind, std::move(sp));\n\n            strip.emplace_back(ind, stripId);\n\n            ind++;\n        }\n\n        holes.push_back(strip);\n\n        stripId++;\n    }\n\n    IdsType descIds {0};\n\n    try {\n        Merger(pd, pStrips, holes, descIds, 0).Run();\n    } catch (const std::runtime_error &e) {\n        return false;\n    }\n\n    // dafür ist der Merger nicht zuständig\n    pd->RemoveDeletedCells();\n\n    {\n        // schneiden sich die einzelnen polygone selbst?\n\n        vtkIdType i, num;\n        const vtkIdType *cell;\n\n        double pt[3];\n\n        auto cellItr = vtk::TakeSmartPointer(pd->GetPolys()->NewIterator());\n\n        for (cellItr->GoToFirstCell(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) {\n            cellItr->GetCurrentCell(num, cell);\n\n            std::set<Point3d> poly;\n\n            for (i = 0; i < num; i++) {\n                pd->GetPoint(cell[i], pt);\n                if (!poly.emplace(pt[0], pt[1], pt[2]).second) {\n                    // schlägt fehl, wenn bereits vorhanden\n                    return false;\n                }\n            }\n\n        }\n    }\n\n#ifdef DEBUG\n    WriteVTK(name, pd);\n#endif\n\n    if (pd->GetNumberOfCells() != numCells) {\n        return false;\n    }\n\n    return true;\n}\n\nint main() {\n    auto pdA = CreatePolyData({ CreateRegularPoly(8, 18, 0, 0) });\n\n    PolysType polysA {\n        CreateRegularPoly(.25, 6, 3.5, 0),\n        CreateRegularPoly(.25, 6, -3.5, 0),\n        CreateRegularPoly(.5, 6, 1, 0),\n        CreateRegularPoly(.5, 6, -1, 0),\n        CreateRegularPoly(.5, 6, 0, 1, 30),\n        CreateRegularPoly(.5, 6, 0, -1, 30)\n    };\n\n    if (!Test(pdA, polysA, 10, \"polysA\")) {\n        return EXIT_FAILURE;\n    }\n\n    auto pdB = CreatePolyData({ { {5, 5, 0}, {-5, 5, 0}, {-5, -5, 0}, {5, -5, 0} } });\n\n    Poly polyA = CreateRegularPoly(4, 18, 0, 0, 10);\n    Poly polyB = CreateRegularPoly(3, 18, 0, 0, 10);\n\n    std::copy(polyB.rbegin(), polyB.rend(), std::back_inserter(polyA));\n\n    PolysType polysB {\n        CreateRegularPoly(2, 18, 0, 0, 5),\n        polyA\n    };\n\n    if (!Test(pdB, polysB, 5, \"polysB\")) {\n        return EXIT_FAILURE;\n    }\n\n    const double y = 7.5-1.5/std::cos(M_PI/6)-std::tan(M_PI/6)*4.5;\n\n    auto pdC = CreatePolyData({ { {0, 0, 0}, {25, 0, 0}, {25, 25, 0}, {0, 25, 0} } });\n\n    PolysType polysC {\n        { {2, 5, 0}, {17, 5, 0}, {17, 20, 0}, {2, 20, 0}, {7.5/std::tan(M_PI/6)+2, 12.5, 0} },\n        { {6.5, 12.5-y, 0}, {y/std::tan(M_PI/6)+6.5, 12.5, 0}, {6.5, 12.5+y, 0} }\n    };\n\n    if (!Test(pdC, polysC, 5, \"polysC\")) {\n        return EXIT_FAILURE;\n    }\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "testing/test_python.py",
    "content": "#!/usr/bin/env python\n# *-* coding: UTF-8 *-*\n\n# Copyright 2012-2025 Ronald Römer\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport sys\nsys.path.extend(['/home/zippy/vtkbool/build/lib/python3.13/site-packages/vtkbool'])\n\nfrom vtkmodules.vtkFiltersSources import vtkCubeSource\nfrom vtkmodules.vtkIOLegacy import vtkPolyDataWriter\n\nfrom vtkbool import vtkPolyDataBooleanFilter\n\ncubeA = vtkCubeSource()\ncubeB = vtkCubeSource()\n\nbf = vtkPolyDataBooleanFilter()\nbf.SetInputConnection(0, cubeA.GetOutputPort())\nbf.SetInputConnection(1, cubeB.GetOutputPort())\nbf.Update()\n"
  },
  {
    "path": "vtkPolyDataBooleanFilter.cxx",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#include <map>\n#include <deque>\n#include <vector>\n#include <set>\n#include <algorithm>\n#include <cmath>\n#include <functional>\n#include <queue>\n#include <memory>\n#include <tuple>\n\n#include <chrono>\n#include <numeric>\n#include <iterator>\n\n#include <vtkInformation.h>\n#include <vtkInformationVector.h>\n#include <vtkDemandDrivenPipeline.h>\n#include <vtkObjectFactory.h>\n#include <vtkPolyDataAlgorithm.h>\n#include <vtkCellData.h>\n#include <vtkPointData.h>\n#include <vtkMath.h>\n#include <vtkIdList.h>\n#include <vtkAppendPolyData.h>\n#include <vtkKdTreePointLocator.h>\n#include <vtkCleanPolyData.h>\n#include <vtkPolyDataConnectivityFilter.h>\n#include <vtkSmartPointer.h>\n#include <vtkModifiedBSPTree.h>\n#include <vtkCellArrayIterator.h>\n#include <vtkKdTree.h>\n#include <vtkCellIterator.h>\n#include <vtkTransformPolyDataFilter.h>\n\n#include \"vtkPolyDataBooleanFilter.h\"\n\n#include \"Utilities.h\"\n#include \"Optimize.h\"\n#include \"Contact.h\"\n#include \"Merger.h\"\n\nvtkStandardNewMacro(vtkPolyDataBooleanFilter);\n\nvtkPolyDataBooleanFilter::vtkPolyDataBooleanFilter () {\n\n    SetNumberOfInputPorts(2);\n    SetNumberOfOutputPorts(3);\n\n    timePdA = 0;\n    timePdB = 0;\n\n    contLines = vtkSmartPointer<vtkPolyData>::New();\n\n    modPdA = vtkSmartPointer<vtkPolyData>::New();\n    modPdB = vtkSmartPointer<vtkPolyData>::New();\n\n    cellDataA = vtkSmartPointer<vtkCellData>::New();\n    cellDataB = vtkSmartPointer<vtkCellData>::New();\n\n    cellIdsA = vtkSmartPointer<vtkIdTypeArray>::New();\n    cellIdsB = vtkSmartPointer<vtkIdTypeArray>::New();\n\n    OperMode = OPER_UNION;\n\n    matrices[0] = nullptr;\n    matrices[1] = nullptr;\n\n    transforms[0] = nullptr;\n    transforms[1] = nullptr;\n\n    timeMatrixA = 0;\n    timeMatrixB = 0;\n\n}\n\nvtkPolyDataBooleanFilter::~vtkPolyDataBooleanFilter () {\n    if (matrices[0] != nullptr) {\n        matrices[0]->Delete();\n    }\n\n    if (matrices[1] != nullptr) {\n        matrices[1]->Delete();\n    }\n\n    if (transforms[0] != nullptr) {\n        transforms[0]->Delete();\n    }\n\n    if (transforms[1] != nullptr) {\n        transforms[1]->Delete();\n    }\n}\n\nint vtkPolyDataBooleanFilter::RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) {\n\n    if (request->Has(vtkDemandDrivenPipeline::REQUEST_DATA())) {\n\n        vtkInformation *inInfoA = inputVector[0]->GetInformationObject(0);\n        vtkInformation *inInfoB = inputVector[1]->GetInformationObject(0);\n\n        vtkPolyData *pdA = vtkPolyData::SafeDownCast(inInfoA->Get(vtkDataObject::DATA_OBJECT()));\n        vtkPolyData *pdB = vtkPolyData::SafeDownCast(inInfoB->Get(vtkDataObject::DATA_OBJECT()));\n\n        vtkInformation *outInfoA = outputVector->GetInformationObject(0);\n        vtkInformation *outInfoB = outputVector->GetInformationObject(1);\n        vtkInformation *outInfoC = outputVector->GetInformationObject(2);\n\n        resultA = vtkPolyData::SafeDownCast(outInfoA->Get(vtkDataObject::DATA_OBJECT()));\n        resultB = vtkPolyData::SafeDownCast(outInfoB->Get(vtkDataObject::DATA_OBJECT()));\n        resultC = vtkPolyData::SafeDownCast(outInfoC->Get(vtkDataObject::DATA_OBJECT()));\n\n        using clock = std::chrono::steady_clock;\n        std::vector<clock::duration> times;\n        clock::time_point start;\n\n        vtkMTimeType timeA = pdA->GetMTime();\n        vtkMTimeType timeB = pdB->GetMTime();\n\n        if (timeA > timePdA || timeB > timePdB || (matrices[0] != nullptr && matrices[0]->GetMTime() > timeMatrixA) || (matrices[1] != nullptr && matrices[1]->GetMTime() > timeMatrixB)) {\n\n            if (contact == nullptr || timeA > timePdA || timeB > timePdB) {\n                // CellData sichern\n\n                cellDataA->DeepCopy(pdA->GetCellData());\n                cellDataB->DeepCopy(pdB->GetCellData());\n\n                cleanA = Clean(pdA);\n                cleanB = Clean(pdB);\n\n#ifdef DEBUG\n                WriteVTK(\"modPdA.vtk\", cleanA);\n                WriteVTK(\"modPdB.vtk\", cleanB);\n#endif\n\n                try {\n                    PreventEqualCaptPoints(cleanA, cleanB).Run();\n                } catch (const std::runtime_error &e) {\n                    vtkErrorMacro(\"Cannot prevent equal capture points.\");\n                    return 1;\n                }\n\n                contact = std::make_shared<Contact>(cleanA, cleanB);\n            }\n\n            start = clock::now();\n\n            modPdA = vtkSmartPointer<vtkPolyData>::New();\n            modPdB = vtkSmartPointer<vtkPolyData>::New();\n\n            if (transforms[0] != nullptr) {\n                auto tfA = vtkSmartPointer<vtkTransformPolyDataFilter>::New();\n                tfA->SetInputData(cleanA);\n                tfA->SetTransform(transforms[0]);\n                tfA->Update();\n\n                modPdA->DeepCopy(tfA->GetOutput());\n            } else {\n                modPdA->DeepCopy(cleanA);\n            }\n\n            if (transforms[1] != nullptr) {\n                auto tfB = vtkSmartPointer<vtkTransformPolyDataFilter>::New();\n                tfB->SetInputData(cleanB);\n                tfB->SetTransform(transforms[1]);\n                tfB->Update();\n\n                modPdB->DeepCopy(tfB->GetOutput());\n            } else {\n                modPdB->DeepCopy(cleanB);\n            }\n\n            modPdA->EditableOn();\n            modPdB->EditableOn();\n\n            try {\n                contLines = contact->GetLines(modPdA, transforms[0], modPdB, transforms[1]);\n            } catch (const std::runtime_error &e) {\n                std::stringstream ss;\n                ss << std::quoted(e.what());\n\n                vtkErrorMacro(\"Contact failed with \" << ss.str());\n\n                return 1;\n            }\n\n            times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n            WriteVTK(\"modPdA_1.vtk\", modPdA);\n            WriteVTK(\"modPdB_1.vtk\", modPdB);\n            WriteVTK(\"contLines.vtk\", contLines);\n#endif\n\n            if (contLines->GetNumberOfCells() == 0) {\n                vtkErrorMacro(\"There is no contact.\");\n                return 1;\n            }\n\n            vtkIdType i;\n\n            auto cells = vtkSmartPointer<vtkIdList>::New();\n\n            for (i = 0; i < contLines->GetNumberOfPoints(); i++) {\n                contLines->GetPointCells(i, cells);\n\n                if (cells->GetNumberOfIds() == 1) {\n                    vtkErrorMacro(\"At least one line-end has only one neighbor.\");\n                    return 1;\n                }\n            }\n\n            // in den CellDatas steht drin, welche polygone einander schneiden\n\n            contsA = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars(\"cA\"));\n            contsB = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars(\"cB\"));\n\n            vtkIdTypeArray *sourcesA = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars(\"sourcesA\"));\n            vtkIdTypeArray *sourcesB = vtkIdTypeArray::SafeDownCast(contLines->GetCellData()->GetScalars(\"sourcesB\"));\n\n            // sichert die OrigCellIds\n\n            vtkIdTypeArray *origCellIdsA = vtkIdTypeArray::SafeDownCast(modPdA->GetCellData()->GetScalars(\"OrigCellIds\"));\n            vtkIdTypeArray *origCellIdsB = vtkIdTypeArray::SafeDownCast(modPdB->GetCellData()->GetScalars(\"OrigCellIds\"));\n\n            cellIdsA->DeepCopy(origCellIdsA);\n            cellIdsB->DeepCopy(origCellIdsB);\n\n            vtkIdType numCellsA = modPdA->GetNumberOfCells();\n            vtkIdType numCellsB = modPdB->GetNumberOfCells();\n\n            for (i = 0; i < numCellsA; i++) {\n                origCellIdsA->SetValue(i, i);\n            }\n\n            for (i = 0; i < numCellsB; i++) {\n                origCellIdsB->SetValue(i, i);\n            }\n\n            start = clock::now();\n\n            if (GetPolyStrips(modPdA, contsA, sourcesA, polyStripsA) ||\n                GetPolyStrips(modPdB, contsB, sourcesB, polyStripsB)) {\n\n                vtkErrorMacro(\"Strips are invalid.\");\n                return 1;\n            }\n\n            // löscht bestimmte strips\n\n            if (CleanStrips()) {\n                vtkErrorMacro(\"There is no contact.\");\n                return 1;\n            }\n\n            times.push_back(clock::now()-start);\n\n            // trennt die polygone an den linien\n\n            start = clock::now();\n\n            if (CutCells(modPdA, polyStripsA) ||\n                CutCells(modPdB, polyStripsB)) {\n\n                vtkErrorMacro(\"CutCells failed.\");\n                return 1;\n            }\n\n            times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n            WriteVTK(\"modPdA_2.vtk\", modPdA);\n            WriteVTK(\"modPdB_2.vtk\", modPdB);\n#endif\n\n            start = clock::now();\n\n            RestoreOrigPoints(modPdA, polyStripsA);\n            RestoreOrigPoints(modPdB, polyStripsB);\n\n            times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n            WriteVTK(\"modPdA_3.vtk\", modPdA);\n            WriteVTK(\"modPdB_3.vtk\", modPdB);\n#endif\n\n            start = clock::now();\n\n            ResolveOverlaps(modPdA, polyStripsA);\n            ResolveOverlaps(modPdB, polyStripsB);\n\n            times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n            WriteVTK(\"modPdA_4.vtk\", modPdA);\n            WriteVTK(\"modPdB_4.vtk\", modPdB);\n#endif\n\n            start = clock::now();\n\n            AddAdjacentPoints(modPdA, contsA, polyStripsA);\n            AddAdjacentPoints(modPdB, contsB, polyStripsB);\n\n            times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n            WriteVTK(\"modPdA_5.vtk\", modPdA);\n            WriteVTK(\"modPdB_5.vtk\", modPdB);\n#endif\n\n            start = clock::now();\n\n            DisjoinPolys(modPdA, polyStripsA);\n            DisjoinPolys(modPdB, polyStripsB);\n\n            times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n            WriteVTK(\"modPdA_6.vtk\", modPdA);\n            WriteVTK(\"modPdB_6.vtk\", modPdB);\n#endif\n\n            start = clock::now();\n\n            MergePoints(modPdA, polyStripsA);\n            MergePoints(modPdB, polyStripsB);\n\n            times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n            WriteVTK(\"modPdA_7.vtk\", modPdA);\n            WriteVTK(\"modPdB_7.vtk\", modPdB);\n#endif\n\n            timePdA = pdA->GetMTime();\n            timePdB = pdB->GetMTime();\n\n            if (matrices[0] != nullptr) {\n                timeMatrixA = matrices[0]->GetMTime();\n            }\n\n            if (matrices[1] != nullptr) {\n                timeMatrixB = matrices[1]->GetMTime();\n            }\n\n        }\n\n        start = clock::now();\n\n        if (CombineRegions()) {\n            vtkErrorMacro(\"Boolean operation failed.\");\n            return 1;\n        }\n\n        times.push_back(clock::now()-start);\n\n#ifdef DEBUG\n        double sum = std::chrono::duration_cast<std::chrono::duration<double>>(std::accumulate(times.begin(), times.end(), clock::duration())).count();\n\n        std::vector<clock::duration>::const_iterator itr;\n        for (itr = times.begin(); itr != times.end(); itr++) {\n            double time = std::chrono::duration_cast<std::chrono::duration<double>>(*itr).count();\n\n            std::cout << \"Time \" << (itr-times.begin())\n                << \": \" << time << \"s (\" << (time/sum*100) << \"%)\"\n                << std::endl;\n        }\n#endif\n\n    }\n\n    return 1;\n\n}\n\nvoid vtkPolyDataBooleanFilter::GetStripPoints (vtkPolyData *pd, vtkIdTypeArray *sources, PStrips &pStrips, IdsType &lines) {\n\n#ifdef DEBUG\n    std::cout << \"GetStripPoints()\" << std::endl;\n#endif\n\n    StripPtsType &pts = pStrips.pts;\n    const IdsType &poly = pStrips.poly;\n\n    double a[3], b[3], sA[3], sB[3], u[3], v[3], w[3], n, t, d;\n\n    std::map<vtkIdType, vtkIdType> allPts;\n\n    std::map<vtkIdType, vtkIdType> links;\n\n    auto line = vtkSmartPointer<vtkIdList>::New();\n\n    for (auto lineId : lines) {\n        contLines->GetCellPoints(lineId, line);\n\n        // std::cout << \"? \" << contsA->GetValue(lineId)\n        //     << \", \" << contsB->GetValue(lineId)\n        //     << \", [\" << line->GetId(0)\n        //     << \", \" << line->GetId(1)\n        //     << \"]\"\n        //     << std::endl;\n\n        allPts.emplace(line->GetId(0), sources->GetTypedComponent(lineId, 0));\n        allPts.emplace(line->GetId(1), sources->GetTypedComponent(lineId, 1));\n\n        links[line->GetId(0)]++;\n        links[line->GetId(1)]++;\n    }\n\n    decltype(allPts)::const_iterator itr;\n\n    for (itr = allPts.begin(); itr != allPts.end(); ++itr) {\n        StripPt sp;\n        sp.ind = itr->first;\n\n        // die koordinaten\n        contLines->GetPoint(sp.ind, sp.pt);\n\n        IdsType::const_iterator itrA, itrB;\n\n        for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n            itrB = itrA+1;\n\n            if (itrB == poly.end()) {\n                itrB = poly.begin();\n            }\n\n            if (itr->second != NOTSET && *itrA != itr->second) {\n                continue;\n            }\n\n            pd->GetPoint(*itrA, a);\n            pd->GetPoint(*itrB, b);\n\n            vtkMath::Subtract(a, sp.pt, sA);\n            vtkMath::Subtract(b, sp.pt, sB);\n\n            // richtungsvektor und länge der kante\n\n            vtkMath::Subtract(b, a, u);\n            n = vtkMath::Norm(u);\n\n            // d und t zur kante\n\n            vtkMath::Subtract(sp.pt, a, v);\n            t = vtkMath::Dot(v, u)/(n*n);\n\n            vtkMath::Cross(v, u, w);\n            d = vtkMath::Norm(w)/n;\n\n            if (d < 1e-5 && t > -1e-5 && t < 1+1e-5) {\n                sp.edge[0] = *itrA;\n                sp.edge[1] = *itrB;\n\n                sp.t = std::min(1., std::max(0., t));\n\n                if (vtkMath::Norm(sA) < 1e-5) {\n                    std::copy_n(a, 3, sp.captPt);\n                    sp.capt = Capt::A;\n\n                } else if (vtkMath::Norm(sB) < 1e-5) {\n                    std::copy_n(b, 3, sp.captPt);\n                    sp.capt = Capt::B;\n\n                } else {\n                    // u ist nicht normiert\n                    vtkMath::MultiplyScalar(u, t);\n\n                    double x[3];\n                    vtkMath::Add(a, u, x);\n\n                    // projektion\n                    std::copy_n(x, 3, sp.captPt);\n\n                    sp.capt = Capt::Edge;\n\n                }\n            }\n\n            // std::cout << \"? \"\n            //     << sp.ind\n            //     << \", \" << d\n            //     << \", \" << t\n            //     << \", \" << sp.capt\n            //     << std::endl;\n        }\n\n        if (itr->second != NOTSET && sp.edge[0] == NOTSET) {\n            sp.catched = false;\n        }\n\n        if (sp.capt == Capt::Not && links[sp.ind] > 2) {\n            sp.capt = Capt::Branched;\n        }\n\n        pts.emplace(sp.ind, std::move(sp));\n\n    }\n\n    StripPtsType::iterator itr2;\n\n    for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) {\n        StripPt &sp = itr2->second;\n\n        if (sp.capt & Capt::Boundary) {\n            if (sp.capt == Capt::B) {\n                sp.t = 0;\n\n                sp.edge[0] = sp.edge[1];\n\n                auto itrA = std::find(poly.begin(), poly.end(), sp.edge[0]),\n                    itrB = itrA+1;\n\n                if (itrB == poly.end()) {\n                    itrB = poly.begin();\n                }\n\n                sp.edge[1] = *itrB;\n\n                sp.capt = Capt::A;\n\n            }\n\n            // für den schnitt werden die eingerasteten koordinaten verwendet\n\n            std::copy_n(sp.captPt, 3, sp.cutPt);\n        } else {\n\n            std::copy_n(sp.pt, 3, sp.cutPt);\n        }\n\n    }\n\n#ifdef DEBUG\n    for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) {\n        std::cout << itr2->first << \": \" << itr2->second << std::endl;\n    }\n#endif\n\n}\n\nbool vtkPolyDataBooleanFilter::GetPolyStrips (vtkPolyData *pd, vtkIdTypeArray *conts, vtkIdTypeArray *sources, PolyStripsType &polyStrips) {\n#ifdef DEBUG\n    std::cout << \"GetPolyStrips()\" << std::endl;\n#endif\n\n    polyStrips.clear();\n\n    std::map<vtkIdType, IdsType> polyLines;\n\n    for (vtkIdType i = 0; i < conts->GetNumberOfTuples(); i++) {\n        vtkIdType poly = conts->GetValue(i);\n\n        /*if (poly != 1641) {\n            continue;\n        }*/\n\n        polyLines[poly].push_back(i);\n    }\n\n    std::vector<std::reference_wrapper<StripPt>> notCatched;\n\n    std::map<vtkIdType, IdsType>::iterator itr;\n\n    for (itr = polyLines.begin(); itr != polyLines.end(); ++itr) {\n\n        IdsType &lines = itr->second;\n        RemoveDuplicates(lines);\n\n        polyStrips.emplace(std::piecewise_construct,\n            std::forward_as_tuple(itr->first),\n            std::forward_as_tuple(pd, itr->first));\n\n        PStrips &pStrips = polyStrips.at(itr->first);\n\n        GetStripPoints(pd, sources, pStrips, lines);\n\n        for (auto &sp : pStrips.pts) {\n            sp.second.polyId = itr->first;\n\n            if (!sp.second.catched) {\n                notCatched.push_back(sp.second);\n            }\n        }\n\n    }\n\n    auto Next = [](const IdsType &ids, vtkIdType id) -> vtkIdType {\n        IdsType::const_iterator itr;\n\n        itr = std::find(ids.begin(), ids.end(), id);\n\n        if (++itr == ids.end()) {\n            itr = ids.begin();\n        }\n\n        return *itr;\n    };\n\n    for (StripPt &sp : notCatched) {\n        for (itr = polyLines.begin(); itr != polyLines.end(); ++itr) {\n            const PStrips &pStrips = polyStrips.at(itr->first);\n\n            try {\n                const StripPt &corr = pStrips.pts.at(sp.ind);\n\n                if (&corr != &sp) {\n                    if (corr.capt == Capt::A) {\n                        sp.capt = Capt::A;\n                        sp.edge[0] = corr.edge[0];\n                        sp.edge[1] = Next(polyStrips.at(sp.polyId).poly, sp.edge[0]);\n\n                        sp.t = 0;\n\n                        std::copy_n(corr.captPt, 3, sp.captPt);\n                        std::copy_n(sp.captPt, 3, sp.cutPt);\n\n                        sp.catched = true;\n\n                    }\n                }\n            } catch (...) {}\n\n        }\n\n#ifdef DEBUG\n        if (!sp.catched) {\n            std::cout << sp << std::endl;\n        }\n#endif\n\n        assert(sp.catched);\n\n    }\n\n    // sucht nach gleichen captPts\n\n    {\n        std::map<Point3d, std::set<vtkIdType>> collapsed;\n\n        PolyStripsType::iterator itr;\n        StripPtsType::iterator itr2;\n\n        for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n            PStrips &pStrips = itr->second;\n\n            StripPtsType &pts = pStrips.pts;\n\n            for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) {\n                StripPt &sp = itr2->second;\n\n                if (sp.capt & Capt::Boundary) {\n                    Point3d p(sp.cutPt[0], sp.cutPt[1], sp.cutPt[2]);\n\n                    collapsed[p].emplace(sp.ind);\n\n                    if (collapsed[p].size() == 2) {\n                        return true;\n                    }\n                }\n            }\n        }\n    }\n\n    for (itr = polyLines.begin(); itr != polyLines.end(); ++itr) {\n        PStrips &pStrips = polyStrips.at(itr->first);\n\n        const IdsType &lines = itr->second;\n        const StripPtsType &pts = pStrips.pts;\n\n        StripsType &strips = pStrips.strips;\n\n        // zusammensetzen\n\n        std::deque<Pair> _lines;\n\n        vtkIdList *linePts = vtkIdList::New();\n\n        for (auto &i : lines) {\n            contLines->GetCellPoints(i, linePts);\n            _lines.emplace_back(linePts->GetId(0), linePts->GetId(1));\n        }\n\n        linePts->Delete();\n\n        decltype(_lines)::iterator _itr;\n\n        auto FindRight = [&pts, &_lines, &_itr](StripType &strip, const std::size_t &id) -> bool {\n            auto &right = strip.back();\n\n            if (pts.at(right.ind).capt == Capt::Not) {\n                for (_itr = _lines.begin(); _itr != _lines.end(); ++_itr) {\n                    if (_itr->f == right.ind) {\n                        strip.emplace_back(_itr->g, id);\n\n                        _lines.erase(_itr);\n                        return true;\n                    } else if (_itr->g == right.ind) {\n                        strip.emplace_back(_itr->f, id);\n\n                        _lines.erase(_itr);\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        };\n\n        auto FindLeft = [&pts, &_lines, &_itr](StripType &strip, const std::size_t &id) -> bool {\n            auto &left = strip.front();\n\n            if (pts.at(left.ind).capt == Capt::Not) {\n                for (_itr = _lines.begin(); _itr != _lines.end(); ++_itr) {\n                    if (_itr->f == left.ind) {\n                        strip.emplace_front(_itr->g, id);\n\n                        _lines.erase(_itr);\n                        return true;\n                    } else if (_itr->g == left.ind) {\n                        strip.emplace_front(_itr->f, id);\n\n                        _lines.erase(_itr);\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        };\n\n        std::size_t stripId {0};\n\n        while (!_lines.empty()) {\n            auto &last = _lines.back();\n\n            StripType strip {{last.f, stripId}, {last.g, stripId}};\n            _lines.pop_back();\n\n            while (FindRight(strip, stripId)) {}\n            while (FindLeft(strip, stripId)) {}\n\n            strips.push_back(std::move(strip));\n\n            stripId++;\n\n        }\n\n        CompleteStrips(pStrips);\n\n    }\n\n    // sucht nach schnitten zw. den strips\n\n    {\n\n        PolyStripsType::const_iterator itr;\n        StripType::const_iterator itr2;\n\n        for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n            const PStrips &pStrips = itr->second;\n\n            const StripsType &strips = pStrips.strips;\n            const StripPtsType &pts = pStrips.pts;\n            const Base &base = pStrips.base;\n\n            auto treePts = vtkSmartPointer<vtkPoints>::New();\n            treePts->SetDataTypeToDouble();\n\n            auto treePd = vtkSmartPointer<vtkPolyData>::New();\n            treePd->Allocate(1);\n\n            std::map<vtkIdType, vtkIdType> ptIds;\n\n            double pt[2];\n\n            for (const auto &p : pts) {\n                Transform(p.second.pt, pt, base);\n\n                ptIds.emplace(p.first, treePts->InsertNextPoint(pt[0], pt[1], 0));\n            }\n\n            for (const StripType &strip : strips) {\n                for (itr2 = strip.begin(); itr2 != strip.end()-1; ++itr2) {\n\n                    vtkIdList *line = vtkIdList::New();\n                    line->InsertNextId(ptIds[itr2->ind]);\n                    line->InsertNextId(ptIds[(itr2+1)->ind]);\n\n                    treePd->InsertNextCell(VTK_LINE, line);\n\n                    line->Delete();\n                }\n            }\n\n            treePd->SetPoints(treePts);\n\n            auto tree = vtkSmartPointer<vtkModifiedBSPTree>::New();\n            tree->SetDataSet(treePd);\n            tree->BuildLocator();\n\n            vtkIdType numA, numB;\n            const vtkIdType *lineA, *lineB;\n\n            auto lineItr = vtk::TakeSmartPointer(treePd->GetLines()->NewIterator());\n\n            for (lineItr->GoToFirstCell(); !lineItr->IsDoneWithTraversal(); lineItr->GoToNextCell()) {\n                lineItr->GetCurrentCell(numA, lineA);\n\n                double ptA[3], ptB[3];\n\n                treePts->GetPoint(lineA[0], ptA);\n                treePts->GetPoint(lineA[1], ptB);\n\n                auto lineIds = vtkSmartPointer<vtkIdList>::New();\n\n                tree->IntersectWithLine(ptA, ptB, 1e-5, nullptr, lineIds);\n\n                for (vtkIdType i = 0; i < lineIds->GetNumberOfIds(); i++) {\n                    treePd->GetCellPoints(lineIds->GetId(i), numB, lineB);\n\n                    if (lineB[0] != lineA[0] && lineB[1] != lineA[0] && lineB[0] != lineA[1] && lineB[1] != lineA[1]) {\n                        // schnitt gefunden\n\n                        return true;\n                    }\n                }\n            }\n\n        }\n\n    }\n\n    return false;\n\n}\n\nvoid vtkPolyDataBooleanFilter::RemoveDuplicates (IdsType &lines) {\n\n    typedef std::tuple<vtkIdType, vtkIdType, vtkIdType> LineType;\n\n    std::vector<LineType> _lines;\n    _lines.reserve(lines.size());\n\n    auto line = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType a, b;\n\n    for (const vtkIdType &id : lines) {\n        contLines->GetCellPoints(id, line);\n\n        a = line->GetId(0);\n        b = line->GetId(1);\n\n        if (std::find_if(_lines.begin(), _lines.end(), [&](const LineType &_line) {\n            return (std::get<1>(_line) == a && std::get<2>(_line) == b)\n                || (std::get<1>(_line) == b && std::get<2>(_line) == a);\n        }) == _lines.end()) {\n            _lines.emplace_back(id, a, b);\n        }\n    }\n\n    if (_lines.size() != lines.size()) {\n        lines.clear();\n\n        for (const auto &_line : _lines) {\n            lines.push_back(std::get<0>(_line));\n        }\n\n        lines.shrink_to_fit();\n    }\n\n}\n\nvoid vtkPolyDataBooleanFilter::CompleteStrips (PStrips &pStrips) {\n    StripsType::iterator itr;\n\n    for (itr = pStrips.strips.begin(); itr != pStrips.strips.end(); ++itr) {\n        const StripPt &start = pStrips.pts[itr->front().ind],\n            &end = pStrips.pts[itr->back().ind];\n\n        if (start.ind != end.ind) {\n            if (start.capt == Capt::Not) {\n                StripType s(itr->rbegin(), itr->rend()-1);\n                itr->insert(itr->begin(), s.begin(), s.end());\n\n            } else if (end.capt == Capt::Not) {\n                StripType s(itr->rbegin()+1, itr->rend());\n                itr->insert(itr->end(), s.begin(), s.end());\n\n            }\n        }\n    }\n}\n\nbool vtkPolyDataBooleanFilter::HasArea (const StripType &strip) const {\n    bool area = true;\n\n    std::size_t i, n = strip.size();\n\n    if (n%2 == 1) {\n        for (i = 0; i < (n-1)/2; i++) {\n            area = strip[i].ind != strip[n-i-1].ind;\n        }\n    }\n\n    return area;\n}\n\nbool vtkPolyDataBooleanFilter::CleanStrips () {\n#ifdef DEBUG\n    std::cout << \"CleanStrips()\" << std::endl;\n#endif\n\n    _IdsType inds;\n\n    auto FindHoles = [&](PolyStripsType &polyStrips) {\n        PolyStripsType::iterator itr;\n\n        for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n            PStrips &pStrips = itr->second;\n            StripsType &strips = pStrips.strips;\n            StripPtsType &pts = pStrips.pts;\n\n            strips.erase(std::remove_if(strips.begin(), strips.end(), [&](const StripType &strip) {\n                if (pts.at(strip.front().ind).capt == Capt::Not\n                    && pts.at(strip.back().ind).capt == Capt::Not\n                    && !HasArea(strip)) {\n\n                    for (const StripPtR &p : strip) {\n                        inds.emplace(p.ind);\n                    }\n\n                    return true;\n                }\n\n                return false;\n            }), strips.end());\n        }\n    };\n\n    FindHoles(polyStripsA);\n    FindHoles(polyStripsB);\n\n#ifdef DEBUG\n    std::cout << \"inds: [\";\n    for (auto &ind : inds) {\n        std::cout << ind << \", \";\n    }\n    std::cout << \"]\" << std::endl;\n#endif\n\n    auto CleanOther = [&](PolyStripsType &polyStrips) {\n        PolyStripsType::iterator itr;\n\n        for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n            PStrips &pStrips = itr->second;\n            StripsType &strips = pStrips.strips;\n\n            strips.erase(std::remove_if(strips.begin(), strips.end(), [&](const StripType &strip) {\n                auto found = std::find_if(strip.begin(), strip.end(), [&](const StripPtR &p) {\n                    return inds.find(p.ind) != inds.end();\n                });\n\n                return found != strip.end();\n\n            }), strips.end());\n        }\n    };\n\n    CleanOther(polyStripsA);\n    CleanOther(polyStripsB);\n\n    auto lines = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType i, j, numLines;\n\n    for (vtkIdType ind : inds) {\n        contLines->GetPointCells(ind, lines);\n        numLines = lines->GetNumberOfIds();\n\n        for (i = 0; i < numLines; i++) {\n            contLines->DeleteCell(lines->GetId(i));\n        }\n    }\n\n    j = 0;\n\n    numLines = contLines->GetNumberOfCells();\n\n    for (i = 0; i < numLines; i++) {\n        if (contLines->GetCellType(i) == VTK_EMPTY_CELL) {\n            j++;\n        }\n    }\n\n    if (j == numLines) {\n        return true;\n    }\n\n    return false;\n\n}\n\ntemplate<typename _RefsType>\nvoid ComputeNormal (const StripPtsType &pts, const _RefsType &poly, double *n) {\n    n[0] = 0; n[1] = 0; n[2] = 0;\n\n    typename _RefsType::const_iterator itrA, itrB;\n\n    for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n        itrB = itrA+1;\n\n        if (itrB == poly.end()) {\n            itrB = poly.begin();\n        }\n\n        const StripPtR &spA = *itrA,\n            &spB = *itrB;\n\n        auto pA = pts.find(spA.ind);\n        auto pB = pts.find(spB.ind);\n\n        const double *ptA = pA->second.cutPt,\n            *ptB = pB->second.cutPt;\n\n        n[0] += (ptA[1]-ptB[1])*(ptA[2]+ptB[2]);\n        n[1] += (ptA[2]-ptB[2])*(ptA[0]+ptB[0]);\n        n[2] += (ptA[0]-ptB[0])*(ptA[1]+ptB[1]);\n    }\n\n    vtkMath::Normalize(n);\n}\n\nvoid CleanPoly (vtkPolyData *pd, IdsType &poly) {\n    IdsType newPoly;\n    newPoly.reserve(poly.size());\n\n    double pt[3];\n\n    std::map<vtkIdType, Point3d> _pts;\n\n    for (vtkIdType id : poly) {\n        pd->GetPoint(id, pt);\n\n        _pts.emplace(std::piecewise_construct,\n            std::forward_as_tuple(id),\n            std::forward_as_tuple(pt[0], pt[1], pt[2]));\n    }\n\n    IdsType::const_iterator itrA, itrB;\n\n    for (itrA = poly.begin(); itrA != poly.end(); ++itrA) {\n        itrB = itrA+1;\n        if (itrB == poly.end()) {\n            itrB = poly.begin();\n        }\n\n        auto _a = _pts.find(*itrA);\n        auto _b = _pts.find(*itrB);\n\n        if (_a->second == _b->second) {} else {\n            newPoly.push_back(*itrA);\n        }\n    }\n\n    newPoly.shrink_to_fit();\n\n    poly.swap(newPoly);\n\n}\n\nbool vtkPolyDataBooleanFilter::CutCells (vtkPolyData *pd, PolyStripsType &polyStrips) {\n#ifdef DEBUG\n    std::cout << \"CutCells()\" << std::endl;\n#endif\n\n    vtkPoints *pdPts = pd->GetPoints();\n\n    vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars(\"OrigCellIds\"));\n\n    PolyStripsType::iterator itrA;\n\n    for (itrA = polyStrips.begin(); itrA != polyStrips.end(); ++itrA) {\n        const vtkIdType &polyInd = itrA->first;\n        PStrips &pStrips = itrA->second;\n\n        StripsType &strips = pStrips.strips;\n        StripPtsType &pts = pStrips.pts;\n\n        IdsType &poly = pStrips.poly;\n\n        vtkIdType origId = origCellIds->GetValue(polyInd);\n\n        if (std::all_of(pts.begin(), pts.end(), [](const auto &p) { return p.second.capt & Capt::A || p.second.capt & Capt::B; })) {\n            Poly _poly;\n\n            for (auto &id : poly) {\n                auto pt = pd->GetPoint(id);\n                _poly.emplace_back(pt[0], pt[1], pt[2]);\n            }\n\n            std::set<Point3d> ptsA(_poly.begin(), _poly.end()), ptsB;\n\n            for (const auto& [ind, sp] : pts) {\n                ptsB.emplace(sp.cutPt[0], sp.cutPt[1], sp.cutPt[2]);\n            }\n\n            if (ptsA == ptsB) {\n                vtkIdList *cell = vtkIdList::New();\n\n                for (auto &p : _poly) {\n                    cell->InsertNextId(pdPts->InsertNextPoint(p.x, p.y, p.z));\n                }\n\n                pd->InsertNextCell(VTK_POLYGON, cell);\n                origCellIds->InsertNextValue(origId);\n\n                cell->Delete();\n\n                pd->DeleteCell(polyInd);\n\n                continue;\n            }\n\n        }\n\n        double _t = 0;\n        std::map<vtkIdType, double> absoluteT;\n\n        for (auto &id : poly) {\n            absoluteT.emplace(id, _t++);\n        }\n\n#ifdef DEBUG\n        std::cout << \"polyInd \" << polyInd << \", poly [\";\n        for (auto &id : poly) {\n            std::cout << id << \", \";\n        }\n        std::cout << \"]\" << std::endl;\n#endif\n\n        // alle strips gültig?\n\n        if (std::find_if(strips.begin(), strips.end(), [&](const StripType &s) {\n            return pts[s.front().ind].capt == Capt::Branched && pts[s.back().ind].capt == Capt::Branched;\n        }) != strips.end()) {\n            return true;\n        }\n\n        // holes sichern\n        StripsType holes;\n\n        auto fct = [&](const StripType &s) {\n            return pts[s.front().ind].capt == Capt::Not && pts[s.back().ind].capt == Capt::Not;\n        };\n\n        std::copy_if(strips.begin(), strips.end(), std::back_inserter(holes), fct);\n\n        strips.erase(std::remove_if(strips.begin(), strips.end(), fct), strips.end());\n\n        std::map<std::size_t, std::reference_wrapper<StripType>> stripsM;\n\n        for (auto &strip : strips) {\n            stripsM.emplace(strip.front().strip, strip);\n        }\n\n        // init\n\n        for (auto &strip : strips) {\n#ifdef DEBUG\n            std::cout << \"strip [\";\n            for (auto &p : strip) {\n                std::cout << p.ind << \", \";\n            }\n            std::cout << \"] :: \" << strip.front().strip << std::endl;\n#endif\n\n            // enden auf gleichem edge\n            if (pts[strip.front().ind].edge[0] == pts[strip.back().ind].edge[0]\n                && strip.front().ind != strip.back().ind\n                && pts[strip.front().ind].t > pts[strip.back().ind].t) {\n\n                std::reverse(strip.begin(), strip.end());\n            }\n\n            // branched strip\n            if (pts[strip.front().ind].capt == Capt::Branched\n                && pts[strip.back().ind].capt & Capt::Boundary) {\n\n                std::reverse(strip.begin(), strip.end());\n            }\n\n            StripPt &start = pts[strip.front().ind],\n                &end = pts[strip.back().ind];\n\n            strip.front().side = Side::Start;\n            strip.front().ref = start.edge[0];\n\n            if (end.capt & Capt::Boundary) {\n                strip.back().side = Side::End;\n                strip.back().ref = end.edge[0];\n            }\n\n            for (auto &p : strip) {\n                StripPt &sp = pts[p.ind];\n\n                p.desc[0] = pdPts->InsertNextPoint(sp.cutPt);\n                p.desc[1] = pdPts->InsertNextPoint(sp.cutPt);\n\n#ifdef DEBUG\n                std::cout << sp << \" => \" << p << std::endl;\n#endif\n\n            }\n        }\n\n        std::deque<IdsType> polys;\n        polys.push_back(poly);\n\n        // gruppiert die branched strips\n\n        std::map<vtkIdType, _StripsType> groups;\n\n        for (auto &strip : strips) {\n            if (pts[strip.back().ind].capt == Capt::Branched) {\n                groups[strip.back().ind].emplace_back(strip);\n            }\n        }\n\n        std::vector<std::size_t> assembled;\n\n        double n[3], ang, pt[3], proj[2];\n\n        decltype(groups)::iterator itrB;\n\n        for (itrB = groups.begin(); itrB != groups.end(); ++itrB) {\n            _StripsType &_strips = itrB->second;\n\n            // sortiert die strips\n\n            std::sort(_strips.begin(), _strips.end(), [&](const StripType &a, const StripType &b) {\n                if (a.front().ind == b.front().ind) {\n                    ConstRefsType poly_(b.begin(), b.end());\n                    poly_.insert(poly_.end(), a.rbegin(), a.rend());\n\n                    ComputeNormal(pts, poly_, n);\n\n                    ang = vtkMath::Dot(pStrips.n, n);\n\n                    return ang > .999999;\n\n                } else {\n                    const StripPt &pA = pts[a.front().ind],\n                        &pB = pts[b.front().ind];\n\n                    return absoluteT[pA.edge[0]]+pA.t < absoluteT[pB.edge[0]]+pB.t;\n                }\n            });\n\n            // die klassische sanduhr\n\n            auto next = std::find_if(polys.begin(), polys.end(), [&_strips](const IdsType &p) {\n                return std::find(p.begin(), p.end(), _strips.front().get().front().ref) != p.end();\n            });\n\n            assert(next != polys.end());\n\n            std::for_each(_strips.begin(), _strips.end(), [&assembled](const StripType &s) {\n                assembled.push_back(s.front().strip);\n            });\n\n            std::vector<IdsType> newPolys;\n            newPolys.reserve(_strips.size()+1);\n\n            _StripsType::const_iterator _itrA, _itrB;\n\n            StripType::const_iterator _itrC;\n            StripType::const_reverse_iterator _itrD;\n\n            for (_itrA = _strips.begin(); _itrA != _strips.end(); ++_itrA) {\n                _itrB = _itrA+1;\n\n                if (_itrB == _strips.end()) {\n                    _itrB = _strips.begin();\n                }\n\n                const StripType &stripA = *_itrA,\n                    &stripB = *_itrB;\n\n                IdsType newPoly;\n\n                for (_itrC = stripB.begin(); _itrC != stripB.end(); ++_itrC) {\n                    newPoly.push_back(_itrC->desc[0]);\n                }\n\n                for (_itrD = stripA.rbegin()+1; _itrD != stripA.rend(); ++_itrD) {\n                    newPoly.push_back(_itrD->desc[1]);\n                }\n\n                // punkte zw. den enden einfügen\n\n                if (stripA.front().ref != stripB.front().ref) {\n                    auto posA = std::find(next->begin(), next->end(), stripA.front().ref);\n                    auto posB = std::find(next->begin(), next->end(), stripB.front().ref);\n\n                    for (;;) {\n                        posA++;\n\n                        if (posA == next->end()) {\n                            posA = next->begin();\n                        }\n\n                        newPoly.push_back(*posA);\n\n                        if (posA == posB) {\n                            break;\n                        }\n                    }\n                }\n\n                CleanPoly(pd, newPoly);\n\n                Poly _poly;\n\n                for (vtkIdType &id : newPoly) {\n                    pd->GetPoint(id, pt);\n                    Transform(pt, proj, pStrips.base);\n                    _poly.emplace_back(proj[0], proj[1], 0);\n                }\n\n                // refs aktualisieren\n\n                const StripPt &pA = pts[stripA.front().ind],\n                    &pB = pts[stripB.front().ind];\n\n                for (auto &s : strips) {\n                    if (std::find(assembled.begin(), assembled.end(), s.front().strip) != assembled.end()) {\n                        continue;\n                    }\n\n                    // noch nicht eingebaut\n\n                    const StripPt &endA = pts[s.front().ind],\n                        &endB = pts[s.back().ind];\n\n                    if (endA.capt & Capt::Boundary\n                        && pA.edge[0] == endA.edge[0]\n                        && endA.t > pA.t\n                        && (pA.edge[0] != pB.edge[0] || endA.t < pB.t)) {\n                        s.front().ref = stripA.front().desc[1];\n\n                        if (endB.ind == pA.ind) {\n                            s.back().ref = stripA.front().desc[1];\n                        } else if (endB.ind == pB.ind) {\n                            s.back().ref = stripB.front().desc[0];\n                        }\n                    }\n\n                    if (endB.capt & Capt::Boundary\n                        && pA.edge[0] == endB.edge[0]\n                        && endB.t > pA.t\n                        && (pA.edge[0] != pB.edge[0] || endB.t < pB.t)) {\n                        s.back().ref = stripA.front().desc[1];\n\n                        if (endA.ind == pA.ind) {\n                            s.front().ref = stripA.front().desc[1];\n                        } else if (endA.ind == pB.ind) {\n                            s.front().ref = stripB.front().desc[0];\n                        }\n                    }\n\n                    if (endA.ind == pA.ind && endB.ind == pB.ind) {\n                        s.front().ref = stripA.front().desc[1];\n                        s.back().ref = stripB.front().desc[0];\n                    } else if (endB.ind == pA.ind && endA.ind == pB.ind) {\n                        s.back().ref = stripA.front().desc[1];\n                        s.front().ref = stripB.front().desc[0];\n                    }\n\n                    if (endB.capt == Capt::Branched) {\n                        Transform(endB.pt, proj, pStrips.base);\n\n                        if (PointInPoly(_poly, {proj[0], proj[1], 0})) {\n                            if (endA.ind == pA.ind) {\n                                s.front().ref = stripA.front().desc[1];\n                            } else if (endA.ind == pB.ind) {\n                                s.front().ref = stripB.front().desc[0];\n                            }\n                        }\n                    }\n\n                }\n\n                newPolys.push_back(std::move(newPoly));\n\n            }\n\n            polys.erase(next);\n\n            polys.insert(polys.end(), newPolys.begin(), newPolys.end());\n\n        }\n\n        // restliche strips einbauen\n\n        std::vector<IdsType> newPolys;\n\n        for (auto &next : polys) {\n            _StripsType _strips;\n\n            for (auto &strip : strips) {\n                if (pts[strip.back().ind].capt != Capt::Branched\n                    && std::find(next.begin(), next.end(), strip.front().ref) != next.end()) {\n\n                    _strips.emplace_back(strip);\n                }\n            }\n\n            if (_strips.empty()) {\n                newPolys.push_back(next);\n                continue;\n            }\n\n            std::deque<IdsType> _newPolys {next};\n\n            std::map<vtkIdType, RefsType> edges;\n\n            for (auto &s : _strips) {\n                StripType &strip = s;\n\n                const StripPt &a = pts[strip.front().ind],\n                    &b = pts[strip.back().ind];\n\n                edges[a.edge[0]].push_back(std::ref(strip.front()));\n                edges[b.edge[0]].push_back(std::ref(strip.back()));\n            }\n\n            // sortiert die punkte auf den kanten\n\n            double n[3], ang, r, rA, rB;\n\n            decltype(edges)::iterator itrC;\n\n            for (itrC = edges.begin(); itrC != edges.end(); ++itrC) {\n                const vtkIdType &id = itrC->first;\n                RefsType &edge = itrC->second;\n\n#ifdef DEBUG\n                std::cout << \"edge (\" << id << \", _)\" << std::endl;\n#endif\n\n                std::sort(edge.begin(), edge.end(), [&](const StripPtR &a, const StripPtR &b) {\n                    const StripPt &a_ = pts[a.ind],\n                        &b_ = pts[b.ind];\n\n                    if (a_.ind == b_.ind) {\n                        // strips beginnen im gleichen punkt\n\n                        if (a.strip != b.strip) {\n                            // gehören nicht dem gleichen strip an\n\n                            StripType &stripA = stripsM.at(a.strip),\n                                &stripB = stripsM.at(b.strip);\n\n                            // andere enden ermitteln\n\n                            const vtkIdType eA = a.ind == stripA.front().ind ? stripA.back().ind : stripA.front().ind,\n                                eB = b.ind == stripB.front().ind ? stripB.back().ind : stripB.front().ind;\n\n                            const StripPt &eA_ = pts[eA],\n                                &eB_ = pts[eB];\n\n                            if (eA_.ind != eB_.ind) {\n                                r = absoluteT[id]+a_.t;\n                                rA = absoluteT[eA_.edge[0]]+eA_.t;\n                                rB = absoluteT[eB_.edge[0]]+eB_.t;\n\n                                rA = rA > r ? rA-r : rA+_t-r,\n                                rB = rB > r ? rB-r : rB+_t-r;\n\n                                return rB < rA;\n\n                            } else {\n                                RefsType poly_;\n\n                                if (a.side == Side::Start) {\n                                    poly_.insert(poly_.end(), stripA.begin(), stripA.end());\n                                } else {\n                                    poly_.insert(poly_.end(), stripA.rbegin(), stripA.rend());\n                                }\n\n                                if (b.side == Side::Start) {\n                                    poly_.insert(poly_.end(), stripB.rbegin()+1, stripB.rend()-1);\n                                } else {\n                                    poly_.insert(poly_.end(), stripB.begin()+1, stripB.end()-1);\n                                }\n\n                                ComputeNormal(pts, poly_, n);\n                                ang = vtkMath::Dot(pStrips.n, n);\n\n                                return ang < .999999;\n\n                            }\n                        } else {\n                            // gleicher strip\n\n                            StripType &strip = stripsM.at(a.strip);\n\n                            if (HasArea(strip)) {\n                                RefsType poly_(strip.begin(), strip.end()-1);\n\n                                ComputeNormal(pts, poly_, n);\n                                ang = vtkMath::Dot(pStrips.n, n);\n\n                                if (ang > .999999) {\n                                    std::reverse(strip.begin(), strip.end());\n                                    return true;\n                                } else {\n                                    return false;\n                                }\n\n                            } else {\n                                // reihenfolge von a und b bereits richtig\n                                return false;\n                            }\n                        }\n\n                    } else {\n                        return a_.t < b_.t;\n                    }\n                });\n\n#ifdef DEBUG\n                for (auto& e : edge) {\n                    std::cout << e << \", t \" << pts[e.get().ind].t << std::endl;\n                }\n#endif\n\n            }\n\n            // strips einbauen\n\n            IdsType::iterator _itrA;\n            StripType::reverse_iterator _itrB;\n\n            for (auto &s : _strips) {\n                StripType &strip = s;\n\n                const StripPtR &start = strip.front(),\n                    &end = strip.back();\n\n#ifdef DEBUG\n                std::cout << \"strip \" << start.strip\n                    << \", refs (\" << start.ref << \", \" << end.ref << \")\"\n                    << std::endl;\n#endif\n\n                std::size_t cycle = 0;\n\n                while (true) {\n                    if (cycle == _newPolys.size()) {\n                        break;\n                    }\n\n                    IdsType _next = _newPolys.front();\n                    _newPolys.pop_front();\n\n                    std::vector<IdsType> splitted(2);\n\n                    if (std::find(_next.begin(), _next.end(), start.ref) != _next.end()) {\n                        if (start.ref == end.ref) {\n                            for (_itrA = _next.begin(); _itrA != _next.end(); ++_itrA) {\n                                splitted[0].push_back(*_itrA);\n\n#ifdef DEBUG\n                                std::cout << \"adding \" << *_itrA << \" to 0\" << std::endl;\n#endif\n\n                                if (*_itrA == start.ref) {\n                                    for (auto &p : strip) {\n                                        splitted[0].push_back(p.desc[0]);\n\n#ifdef DEBUG\n                                        std::cout << \"adding \" << p.desc[0] << \" to 0\" << std::endl;\n#endif\n\n                                    }\n                                }\n                            }\n\n                            // strip selbst ist ein polygon\n\n                            for (_itrB = strip.rbegin(); _itrB != strip.rend(); ++_itrB) {\n                                splitted[1].push_back(_itrB->desc[1]);\n\n#ifdef DEBUG\n                                std::cout << \"adding \" << _itrB->desc[1] << \" to 1\" << std::endl;\n#endif\n\n                            }\n\n                        } else {\n                            std::size_t curr = 0;\n\n                            for (_itrA = _next.begin(); _itrA != _next.end(); ++_itrA) {\n                                IdsType &poly = splitted[curr];\n\n                                poly.push_back(*_itrA);\n\n#ifdef DEBUG\n                                std::cout << \"adding \" << *_itrA << \" to \" << curr << std::endl;\n#endif\n\n                                if (*_itrA == start.ref) {\n                                    for (auto &p : strip) {\n                                        poly.push_back(p.desc[0]);\n\n#ifdef DEBUG\n                                        std::cout << \"adding \" << p.desc[0] << \" to \" << curr << std::endl;\n#endif\n\n                                    }\n\n                                    curr = curr == 0 ? 1 : 0;\n\n                                } else if (*_itrA == end.ref) {\n                                    for (_itrB = strip.rbegin(); _itrB != strip.rend(); ++_itrB) {\n                                        poly.push_back(_itrB->desc[1]);\n\n#ifdef DEBUG\n                                        std::cout << \"adding \" << _itrB->desc[1] << \" to \" << curr << std::endl;\n#endif\n\n                                    }\n\n                                    curr = curr == 0 ? 1 : 0;\n                                }\n\n                            }\n                        }\n                    }\n\n                    if (!splitted[1].empty()) {\n                        // refs aktualisieren\n\n                        for (itrC = edges.begin(); itrC != edges.end(); ++itrC) {\n                            RefsType &edge = itrC->second;\n\n                            RefsType::iterator _itrA;\n\n                            for (_itrA = edge.begin()+1; _itrA != edge.end(); ++_itrA) {\n                                StripPtR &sp = *_itrA;\n\n                                if (sp.strip > start.strip) {\n#ifdef DEBUG\n                                    std::cout << \"ind \" << sp.ind << \", strip \" << sp.strip << std::endl;\n#endif\n\n                                    RefsType::const_reverse_iterator _itrB(_itrA);\n\n                                    std::shared_ptr<StripPtR> _p;\n\n                                    for (; _itrB != edge.rend(); ++_itrB) {\n                                        const StripPtR &p = *_itrB;\n\n                                        if (p.strip != sp.strip) {\n                                            if (p.strip <= start.strip) {\n                                                vtkIdType _ref;\n\n                                                if (p.side == Side::End) {\n                                                    _ref = p.desc[0];\n                                                } else {\n                                                    _ref = p.desc[1];\n                                                }\n\n#ifdef DEBUG\n                                                if (sp.ref != _ref) {\n                                                    std::cout << \"*1 ref \" << sp.ref << \" -> \" << _ref << \" (from strip \" << p.strip << \", ind \" << p.ind << \")\" << std::endl;\n                                                }\n#endif\n\n                                                sp.ref = _ref;\n\n                                                _p = std::make_shared<StripPtR>(p);\n\n                                                break;\n\n                                            }\n                                        } else {\n#ifdef DEBUG\n                                            if (sp.ref != p.ref) {\n                                                std::cout << \"*2 ref \" << sp.ref << \" -> \" << p.ref << \" (from strip \" << p.strip << \", ind \" << p.ind << \")\" << std::endl;\n                                            }\n#endif\n\n                                            sp.ref = p.ref;\n                                            break;\n                                        }\n                                    }\n\n                                    RefsType::const_iterator _itrC(_itrA);\n\n                                    ++_itrC;\n\n                                    for (; _itrC != edge.end(); ++_itrC) {\n                                        const StripPtR &p = *_itrC;\n\n                                        if (p.ind != sp.ind) {\n                                            break;\n                                        }\n\n                                        if (p.strip <= start.strip) {\n                                            if (_p && p.ind == _p->ind && p.strip < _p->strip) {\n                                                break;\n                                            }\n\n                                            vtkIdType _ref;\n\n                                            if (p.side == Side::Start) {\n                                                _ref = p.desc[0];\n                                            } else {\n                                                _ref = p.desc[1];\n                                            }\n\n#ifdef DEBUG\n                                            if (sp.ref != _ref) {\n                                                std::cout << \"*3 ref \" << sp.ref << \" -> \" << _ref << \" (from strip \" << p.strip << \", ind \" << p.ind << \")\" << std::endl;\n                                            }\n#endif\n\n                                            sp.ref = _ref;\n\n                                            break;\n                                        }\n\n                                    }\n                                }\n                            }\n\n                            // sonderfall\n                            if (edge.size() > 1) {\n                                StripPtR &a = edge.front(),\n                                    &b = *(edge.begin()+1);\n\n                                if (a.ind == b.ind\n                                    && b.strip == start.strip\n                                    && pts[a.ind].capt == Capt::A) { // sollte weg\n\n                                    vtkIdType _ref;\n\n                                    if (b.side == Side::Start) {\n                                        _ref = b.desc[0];\n                                    } else {\n                                        _ref = b.desc[1];\n                                    }\n\n#ifdef DEBUG\n                                    if (a.ref != _ref) {\n                                        std::cout << \"*4 ref \" << a.ref << \" -> \" << _ref << \" (from strip \" << b.strip << \", ind \" << b.ind << \")\" << std::endl;\n                                    }\n#endif\n\n                                    a.ref = _ref;\n\n                                }\n                            }\n\n                        }\n\n                        // doppelte punkte entfernen\n\n                        for (auto &p : splitted) {\n                            CleanPoly(pd, p);\n                        }\n\n                        // prüft, ob die erstellten _newPolys gültig sind\n\n                        if (splitted[0].size() > 2) {\n                            _newPolys.push_back(splitted[0]);\n                        }\n\n                        if (HasArea(strip) && splitted[1].size() > 2) {\n                            _newPolys.push_back(splitted[1]);\n                        }\n\n                        cycle = 0;\n\n                        break;\n\n                    } else {\n                        _newPolys.push_back(_next);\n\n                        cycle++;\n                    }\n\n                }\n\n            }\n\n            newPolys.insert(newPolys.end(), _newPolys.begin(), _newPolys.end());\n        }\n\n        // erzeugte polys hinzufügen\n\n        IdsType descIds;\n        descIds.reserve(newPolys.size());\n\n        for (auto &p : newPolys) {\n            vtkIdList *cell = vtkIdList::New();\n\n            for (vtkIdType &id : p) {\n                cell->InsertNextId(id);\n            }\n\n            descIds.emplace_back(pd->InsertNextCell(VTK_POLYGON, cell));\n            origCellIds->InsertNextValue(origId);\n\n            cell->Delete();\n        }\n\n        pd->DeleteCell(polyInd);\n\n        // holes einbauen\n        if (!holes.empty()) {\n            try {\n                Merger(pd, pStrips, holes, descIds, origId).Run();\n            } catch (const std::runtime_error &e) {\n                return true;\n            }\n        }\n\n    }\n\n    pd->RemoveDeletedCells();\n    pd->BuildCells();\n\n    return false;\n\n}\n\nvoid vtkPolyDataBooleanFilter::RestoreOrigPoints (vtkPolyData *pd, PolyStripsType &polyStrips) {\n\n#ifdef DEBUG\n    std::cout << \"RestoreOrigPoints()\" << std::endl;\n#endif\n\n    pd->DeleteLinks(); pd->BuildLinks();\n\n    vtkKdTreePointLocator *loc = vtkKdTreePointLocator::New();\n    loc->SetDataSet(pd);\n    loc->BuildLocator();\n\n    PolyStripsType::const_iterator itr;\n    StripPtsType::const_iterator itr2;\n\n    auto pts = vtkSmartPointer<vtkIdList>::New();\n    vtkIdType i, numPts;\n\n    for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n        const PStrips &pStrips = itr->second;\n\n        for (itr2 = pStrips.pts.begin(); itr2 != pStrips.pts.end(); ++itr2) {\n            const StripPt &sp = itr2->second;\n\n            if (sp.capt & Capt::Boundary) {\n                FindPoints(loc, sp.cutPt, pts);\n                numPts = pts->GetNumberOfIds();\n\n                for (i = 0; i < numPts; i++) {\n                    pd->GetPoints()->SetPoint(pts->GetId(i), sp.pt);\n                }\n\n            }\n\n        }\n    }\n\n    loc->FreeSearchStructure();\n    loc->Delete();\n\n}\n\nvoid vtkPolyDataBooleanFilter::DisjoinPolys (vtkPolyData *pd, PolyStripsType &polyStrips) {\n\n#ifdef DEBUG\n    std::cout << \"DisjoinPolys()\" << std::endl;\n#endif\n\n    pd->DeleteLinks(); pd->BuildLinks();\n\n    vtkKdTreePointLocator *loc = vtkKdTreePointLocator::New();\n    loc->SetDataSet(pd);\n\n    struct Cmp {\n        bool operator() (const StripPt &l, const StripPt &r) const {\n            return l.ind < r.ind;\n        }\n    };\n\n    PolyStripsType::const_iterator itr;\n    StripPtsType::const_iterator itr2;\n\n    std::set<std::reference_wrapper<const StripPt>, Cmp> ends;\n\n    for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n        const PStrips &pStrips = itr->second;\n\n        for (itr2 = pStrips.pts.begin(); itr2 != pStrips.pts.end(); ++itr2) {\n            const StripPt &sp = itr2->second;\n\n            if (sp.capt == Capt::A) {\n                ends.emplace(sp);\n            }\n        }\n    }\n\n    vtkIdList *pts = vtkIdList::New();\n    vtkIdList *cells = vtkIdList::New();\n\n    vtkIdType i, j, numPts, numCells;\n\n    for (const StripPt &sp : ends) {\n        FindPoints(loc, sp.pt, pts);\n        numPts = pts->GetNumberOfIds();\n\n        for (i = 0; i < numPts; i++) {\n            pd->GetPointCells(pts->GetId(i), cells);\n            numCells = cells->GetNumberOfIds();\n\n            if (numCells > 1) {\n                for (j = 0; j < numCells; j++) {\n                    pd->ReplaceCellPoint(cells->GetId(j), pts->GetId(i), pd->GetPoints()->InsertNextPoint(sp.pt));\n                }\n            }\n        }\n    }\n\n    cells->Delete();\n    pts->Delete();\n\n    loc->FreeSearchStructure();\n    loc->Delete();\n\n}\n\nvoid vtkPolyDataBooleanFilter::ResolveOverlaps (vtkPolyData *pd, PolyStripsType &polyStrips) {\n\n#ifdef DEBUG\n    std::cout << \"ResolveOverlaps()\" << std::endl;\n#endif\n\n    typedef std::pair<std::reference_wrapper<const StripPtsType>, std::reference_wrapper<const StripPt>> _Type;\n\n    std::map<vtkIdType, std::vector<_Type>> _pts;\n\n    PolyStripsType::const_iterator itr;\n    StripPtsType::const_iterator itr2;\n\n    for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n        const PStrips &pStrips = itr->second;\n\n        const StripPtsType &pts = pStrips.pts;\n\n        for (itr2 = pts.begin(); itr2 != pts.end(); ++itr2) {\n            const StripPt &sp = itr2->second;\n\n            if (sp.capt == Capt::Edge) {\n                _pts[sp.ind].emplace_back(pts, sp);\n            }\n        }\n    }\n\n    decltype(_pts)::iterator itr3;\n\n    StripPtsType::const_iterator itr4;\n\n    for (itr3 = _pts.begin(); itr3 != _pts.end(); ++itr3) {\n        auto &pairs = itr3->second;\n\n        if (pairs.size() == 2) {\n            auto &pairA = pairs[0];\n            auto &pairB = pairs[1];\n\n            if (pairA.second.get().edge[1] != pairB.second.get().edge[0]) {\n                pairA.swap(pairB);\n            }\n\n            auto edgeA = pairA.second.get().edge;\n            auto edgeB = pairB.second.get().edge;\n\n            if (edgeA[1] == edgeB[0] && edgeA[0] != edgeB[1]) {\n\n#ifdef DEBUG\n                std::cout << itr3->first << \": \"\n                    << edgeA[0] << \", \"\n                    << edgeA[1] << \", \"\n                    << edgeB[0] << \", \"\n                    << edgeB[1] << std::endl;\n#endif\n\n                auto &ptsA = pairA.first.get();\n                auto &ptsB = pairB.first.get();\n\n                std::deque<std::reference_wrapper<const StripPt>> _edgeA, _edgeB;\n\n                for (itr4 = ptsA.begin(); itr4 != ptsA.end(); ++itr4) {\n                    auto &sp = itr4->second;\n                    if (sp.edge[0] == edgeA[0] && sp.edge[1] == edgeA[1]) {\n                        _edgeA.emplace_back(sp);\n                    }\n                }\n\n                for (itr4 = ptsB.begin(); itr4 != ptsB.end(); ++itr4) {\n                    auto &sp = itr4->second;\n                    if (sp.edge[0] == edgeB[0] && sp.edge[1] == edgeB[1]) {\n                        _edgeB.emplace_back(sp);\n                    }\n                }\n\n                std::sort(_edgeA.begin(), _edgeA.end(), [](const StripPt &l, const StripPt &r) { return l.t < r.t; });\n                std::sort(_edgeB.begin(), _edgeB.end(), [](const StripPt &l, const StripPt &r) { return l.t < r.t; });\n\n#ifdef DEBUG\n                for (const StripPt &sp : _edgeA) {\n                    std::cout << sp << std::endl;\n                }\n\n                for (const StripPt &sp : _edgeB) {\n                    std::cout << sp << std::endl;\n                }\n#endif\n\n                assert(_edgeA.back().get().ind == itr3->first);\n                assert(_edgeB.front().get().ind == itr3->first);\n\n                _edgeA.pop_back();\n                _edgeB.pop_front();\n\n                double pA[3], pB[3];\n\n                if (_edgeA.empty()) {\n                    pd->GetPoint(edgeA[0], pA);\n                } else {\n                    std::copy_n(_edgeA.back().get().pt, 3, pA);\n                }\n\n                if (_edgeB.empty()) {\n                    pd->GetPoint(edgeB[1], pB);\n                } else {\n                    std::copy_n(_edgeB.front().get().pt, 3, pB);\n                }\n\n                Point3d a {pA[0], pA[1], pA[2]};\n                Point3d b {pB[0], pB[1], pB[2]};\n\n                auto cells = vtkSmartPointer<vtkIdList>::New(),\n                    cell = vtkSmartPointer<vtkIdList>::New();\n\n                pd->GetPointCells(edgeA[1], cells);\n                vtkIdType i, j, numCells = cells->GetNumberOfIds();\n\n                double pt[3];\n\n                vtkIdType id;\n\n                for (i = 0; i < numCells; i++) {\n                    pd->GetCellPoints(cells->GetId(i), cell);\n                    Poly poly;\n                    for (j = 0; j < cell->GetNumberOfIds(); j++) {\n                        pd->GetPoint(cell->GetId(j), pt);\n                        poly.emplace_back(pt[0], pt[1], pt[2]);\n                    }\n                    if (std::find(poly.begin(), poly.end(), a) != poly.end()\n                        && std::find(poly.begin(), poly.end(), b) != poly.end()) {\n\n                        contLines->GetPoint(itr3->first, pt);\n\n                        id = pd->GetPoints()->InsertNextPoint(pt);\n\n#ifdef DEBUG\n                        std::cout << cells->GetId(i)\n                            << \": \" << edgeA[1] << \" -> \" << id\n                            << std::endl;\n#endif\n\n                        pd->ReplaceCellPoint(cells->GetId(i), edgeA[1], id);\n\n                        break;\n\n                    }\n\n                }\n\n            }\n\n        }\n    }\n\n}\n\nvoid vtkPolyDataBooleanFilter::AddAdjacentPoints (vtkPolyData *pd, vtkIdTypeArray *conts, PolyStripsType &polyStrips) {\n\n#ifdef DEBUG\n    std::cout << \"AddAdjacentPoints()\" << std::endl;\n#endif\n\n    pd->DeleteLinks(); pd->BuildLinks();\n\n    vtkIdTypeArray *origCellIds = vtkIdTypeArray::SafeDownCast(pd->GetCellData()->GetScalars(\"OrigCellIds\"));\n\n    struct Cmp {\n        bool operator() (const StripPt &l, const StripPt &r) const {\n            return l.t < r.t;\n        }\n    };\n\n    auto loc = vtkSmartPointer<vtkKdTreePointLocator>::New();\n    loc->SetDataSet(pd);\n    loc->BuildLocator();\n\n    auto lines = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType i, j, numLines;\n\n    auto ptsA = vtkSmartPointer<vtkIdList>::New();\n    auto ptsB = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType numPtsA, numPtsB;\n\n    auto cells = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType numCells;\n\n    auto poly = vtkSmartPointer<vtkIdList>::New();\n    auto newPoly = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType numPts;\n\n    vtkIdType idA, idB;\n\n    PolyStripsType::const_iterator itr;\n    StripPtsType::const_iterator itr2;\n\n    for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n        const PStrips &pStrips = itr->second;\n\n        std::map<Pair, std::set<std::reference_wrapper<const StripPt>, Cmp>> edgePts;\n\n        for (itr2 = pStrips.pts.begin(); itr2 != pStrips.pts.end(); ++itr2) {\n            const StripPt &sp = itr2->second;\n\n            if (sp.capt == Capt::Edge) {\n                edgePts[{sp.edge[0], sp.edge[1]}].emplace(sp);\n            }\n        }\n\n        decltype(edgePts)::iterator itr3;\n\n        for (itr3 = edgePts.begin(); itr3 != edgePts.end(); ++itr3) {\n            const Pair &edge = itr3->first;\n            auto pts = itr3->second;\n\n            StripPt spA, spB;\n\n            pd->GetPoint(edge.f, spA.pt);\n            pd->GetPoint(edge.g, spB.pt);\n\n            spA.t = 0;\n            spB.t = 1;\n\n            pts.emplace(spA);\n            pts.emplace(spB);\n\n            std::vector<decltype(pts)::value_type> _pts(pts.rbegin(), pts.rend());\n\n            decltype(_pts)::const_iterator itrA, itrB, itrC;\n\n            itrA = _pts.begin();\n\n            while (itrA != _pts.end()-1) {\n                itrB = itrA+1;\n\n                while (itrB != _pts.end()-1) {\n                    contLines->GetPointCells(itrB->get().ind, lines);\n                    numLines = lines->GetNumberOfIds();\n\n                    _IdsType involved;\n\n                    for (i = 0; i < numLines; i++) {\n                        involved.emplace(conts->GetValue(lines->GetId(i)));\n                    }\n\n                    if (involved.size() > 1) {\n                        break;\n                    }\n\n                    ++itrB;\n                }\n\n                if (itrA+1 != itrB) {\n                    FindPoints(loc, itrA->get().pt, ptsA);\n                    FindPoints(loc, itrB->get().pt, ptsB);\n\n                    numPtsA = ptsA->GetNumberOfIds();\n                    numPtsB = ptsB->GetNumberOfIds();\n\n                    std::vector<Pair> polysA, polysB;\n\n                    for (i = 0; i < numPtsA; i++) {\n                        pd->GetPointCells(ptsA->GetId(i), cells);\n                        numCells = cells->GetNumberOfIds();\n\n                        for (j = 0; j < numCells; j++) {\n                            polysA.emplace_back(cells->GetId(j), ptsA->GetId(i));\n                        }\n                    }\n\n                    for (i = 0; i < numPtsB; i++) {\n                        pd->GetPointCells(ptsB->GetId(i), cells);\n                        numCells = cells->GetNumberOfIds();\n\n                        for (j = 0; j < numCells; j++) {\n                            polysB.emplace_back(cells->GetId(j), ptsB->GetId(i));\n                        }\n                    }\n\n                    /*for (const Pair &pA : polysA) {\n                        std::cout << \"pA \" << pA << std::endl;\n                    }\n\n                    for (const Pair &pB : polysB) {\n                        std::cout << \"pB \" << pB << std::endl;\n                    }*/\n\n                    for (const Pair &pA : polysA) {\n                        for (const Pair &pB : polysB) {\n                            if (pA.f == pB.f && pd->GetCellType(pA.f) != VTK_EMPTY_CELL) {\n\n                                pd->GetCellPoints(pA.f, poly);\n                                numPts = poly->GetNumberOfIds();\n\n                                newPoly->Reset();\n\n                                for (i = 0; i < numPts; i++) {\n                                    newPoly->InsertNextId(poly->GetId(i));\n\n                                    idA = poly->GetId(i);\n                                    idB = i+1 == numPts ? poly->GetId(0) : poly->GetId(i+1);\n\n                                    if (pA.g == idA\n                                        && pB.g == idB) {\n\n                                        for (itrC = itrA+1; itrC != itrB; ++itrC) {\n                                            // newPoly->InsertNextId(pd->InsertNextLinkedPoint(itrC->get().pt, 1));\n\n                                            pd->InsertNextLinkedPoint(1);\n\n                                            newPoly->InsertNextId(pd->GetPoints()->InsertNextPoint(itrC->get().pt));\n                                        }\n\n                                    }\n\n                                    pd->RemoveReferenceToCell(idA, pA.f);\n                                }\n\n                                pd->DeleteCell(pA.f);\n\n                                pd->InsertNextLinkedCell(VTK_POLYGON, newPoly->GetNumberOfIds(), newPoly->GetPointer(0));\n\n                                origCellIds->InsertNextValue(origCellIds->GetValue(pA.f));\n\n                                break;\n                            }\n                        }\n                    }\n                }\n\n                itrA = itrB;\n            }\n        }\n    }\n\n    loc->FreeSearchStructure();\n\n    pd->RemoveDeletedCells();\n\n}\n\nvoid vtkPolyDataBooleanFilter::MergePoints (vtkPolyData *pd, PolyStripsType &polyStrips) {\n\n#ifdef DEBUG\n    std::cout << \"MergePoints()\" << std::endl;\n#endif\n\n    pd->BuildCells();\n    pd->DeleteLinks(); pd->BuildLinks();\n\n    contLines->DeleteLinks(); contLines->BuildLinks();\n\n    auto loc = vtkSmartPointer<vtkKdTreePointLocator>::New();\n    loc->SetDataSet(pd);\n\n    PolyStripsType::const_iterator itr;\n    StripsType::const_iterator itr2;\n\n    std::map<vtkIdType, _IdsType> neighPts;\n\n    auto pts = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType i, j, numPts;\n\n    for (itr = polyStrips.begin(); itr != polyStrips.end(); ++itr) {\n        const PStrips &pStrips = itr->second;\n\n        for (itr2 = pStrips.strips.begin(); itr2 != pStrips.strips.end(); ++itr2) {\n            const StripType &strip = *itr2;\n\n            const StripPtR &spA = strip.front(),\n                &spB = strip.back();\n\n            const auto beforeA = pStrips.pts.find((strip.begin()+1)->ind),\n                beforeB = pStrips.pts.find((strip.end()-2)->ind);\n\n            FindPoints(loc, beforeA->second.pt, pts);\n            numPts = pts->GetNumberOfIds();\n\n            for (i = 0; i < numPts; i++) {\n                neighPts[spA.ind].insert(pts->GetId(i));\n            }\n\n            FindPoints(loc, beforeB->second.pt, pts);\n            numPts = pts->GetNumberOfIds();\n\n            for (i = 0; i < numPts; i++) {\n                neighPts[spB.ind].insert(pts->GetId(i));\n            }\n        }\n    }\n\n    double pt[3];\n\n    auto polys = vtkSmartPointer<vtkIdList>::New();\n    auto poly = vtkSmartPointer<vtkIdList>::New();\n\n    vtkIdType ind, polyId, _numPts, before, after;\n\n    decltype(neighPts)::const_iterator itr3;\n\n    for (itr3 = neighPts.begin(); itr3 != neighPts.end(); ++itr3) {\n        const auto &inds = itr3->second;\n\n        std::map<Point3d, std::vector<Pair>> pairs;\n\n        contLines->GetPoint(itr3->first, pt);\n\n        FindPoints(loc, pt, pts);\n        numPts = pts->GetNumberOfIds();\n\n        for (i = 0; i < numPts; i++) {\n            ind = pts->GetId(i);\n\n            pd->GetPointCells(ind, polys);\n\n            if (polys->GetNumberOfIds() > 0) {\n                polyId = polys->GetId(0);\n\n                pd->GetCellPoints(polyId, poly);\n                _numPts = poly->GetNumberOfIds();\n\n                for (j = 0; j < _numPts; j++) {\n                    if (poly->GetId(j) == ind) {\n                        break;\n                    }\n                }\n\n                // wieder davor und danach ermitteln\n\n                before = poly->GetId(j == 0 ? _numPts-1 : j-1);\n                after = poly->GetId(j+1 == _numPts ? 0 : j+1);\n\n                if (std::find(inds.begin(), inds.end(), before) == inds.end()) {\n                    pd->GetPoint(before, pt);\n                    pairs[{pt[0], pt[1], pt[2]}].emplace_back(polyId, ind);\n                }\n\n                if (std::find(inds.begin(), inds.end(), after) == inds.end()) {\n                    pd->GetPoint(after, pt);\n                    pairs[{pt[0], pt[1], pt[2]}].emplace_back(polyId, ind);\n                }\n\n            }\n        }\n\n        std::deque<std::deque<std::reference_wrapper<const Pair>>> Pairs;\n\n        decltype(pairs)::const_iterator itr4;\n\n        for (itr4 = pairs.begin(); itr4 != pairs.end(); ++itr4) {\n            const auto &p = itr4->second;\n\n            if (p.size() == 2) {\n                auto _pts = {std::ref(p.front()), std::ref(p.back())}; // std::initializer_list\n                Pairs.emplace_back(_pts);\n            }\n        }\n\n        decltype(Pairs)::iterator itr5;\n\n        /*for (itr5 = Pairs.begin(); itr5 != Pairs.end(); ++itr5) {\n            for (auto &p : *itr5) {\n                std::cout << p.get() << \", \";\n            }\n            std::cout << std::endl;\n        }*/\n\n        decltype(Pairs)::value_type group;\n\n        decltype(group)::const_iterator itr6;\n\n        while (!Pairs.empty()) {\n            if (group.empty()) {\n                group = Pairs.front();\n                Pairs.pop_front();\n            }\n\n            itr5 = Pairs.begin();\n\n            while (itr5 != Pairs.end()) {\n                const auto &next = *itr5;\n\n                if (next.front().get() == group.front().get()) {\n                    group.emplace_front(next.back());\n                    Pairs.erase(itr5);\n                    itr5 = Pairs.begin();\n                } else if (next.front().get() == group.back().get()) {\n                    group.emplace_back(next.back());\n                    Pairs.erase(itr5);\n                    itr5 = Pairs.begin();\n                } else if (next.back().get() == group.front().get()) {\n                    group.emplace_front(next.front());\n                    Pairs.erase(itr5);\n                    itr5 = Pairs.begin();\n                } else if (next.back().get() == group.back().get()) {\n                    group.emplace_back(next.front());\n                    Pairs.erase(itr5);\n                    itr5 = Pairs.begin();\n                } else {\n                    ++itr5;\n                }\n            }\n\n            if (itr5 == Pairs.end()) {\n                for (itr6 = group.begin()+1; itr6 != group.end(); ++itr6) {\n                    pd->ReplaceCellPoint(itr6->get().f, itr6->get().g, group.front().get().g);\n                }\n\n                group.clear();\n            }\n        }\n\n    }\n\n    loc->FreeSearchStructure();\n\n}\n\nenum class Congr {\n    Equal,\n    Opposite,\n    Not\n};\n\nclass PolyAtEdge {\n    vtkPolyData *pd;\n\npublic:\n    PolyAtEdge (vtkPolyData *_pd, vtkIdType _polyId, vtkIdType _ptIdA, vtkIdType _ptIdB) : pd(_pd), polyId(_polyId), ptIdA(_ptIdA), ptIdB(_ptIdB), loc(Loc::None) {\n\n        double ptA[3], ptB[3];\n\n        pd->GetPoint(ptIdA, ptA);\n        pd->GetPoint(ptIdB, ptB);\n\n        vtkMath::Subtract(ptB, ptA, e);\n        vtkMath::Normalize(e);\n\n        const vtkIdType *poly;\n\n        vtkIdType numPts;\n        pd->GetCellPoints(polyId, numPts, poly);\n\n        ComputeNormal(pd->GetPoints(), n, numPts, poly);\n\n        vtkMath::Cross(e, n, r);\n\n    }\n\n    vtkIdType polyId, ptIdA, ptIdB;\n    double n[3], e[3], r[3];\n\n    Loc loc;\n\n    friend std::ostream& operator<< (std::ostream &out, const PolyAtEdge &p) {\n        out << \"polyId \" << p.polyId << \", ptIdA \" << p.ptIdA << \", ptIdB \" << p.ptIdB;\n        return out;\n    }\n\n    static constexpr double eps {.99999999}; // ~.0081deg\n\n    Congr IsCongruent (const PolyAtEdge &p) const {\n        double cong = vtkMath::Dot(n, p.n);\n\n        if (cong > eps || cong < -eps) {\n            double ang = vtkMath::Dot(r, p.r);\n\n            if (ang > eps) {\n                if (cong > eps) {\n                    // normalen sind gleich ausgerichtet\n                    return Congr::Equal;\n                } else {\n                    return Congr::Opposite;\n                }\n            }\n        }\n\n        return Congr::Not;\n    }\n\n};\n\n\nclass PolyPair {\npublic:\n    PolyPair (PolyAtEdge _pA, PolyAtEdge _pB) : pA(_pA), pB(_pB) {}\n\n    PolyAtEdge pA, pB;\n\n    void GetLoc (PolyAtEdge &pT, vtkIdType mode) {\n\n        Congr cA = pA.IsCongruent(pT),\n            cB = pB.IsCongruent(pT);\n\n#ifdef DEBUG\n        std::cout << \"GetLoc() -> polyId \" << pT.polyId\n                  << \", cA \" << cA\n                  << \", cB \" << cB\n                  << std::endl;\n\n        if (cA != Congr::Not || cB != Congr::Not) {\n            assert(cA != cB);\n        }\n\n#endif\n\n        if (cA == Congr::Equal || cA == Congr::Opposite) {\n            if (cA == Congr::Opposite) {\n                // normalen sind entgegengesetzt gerichtet\n\n                if (mode == OPER_INTERSECTION) {\n                    pA.loc = Loc::Outside;\n                    pT.loc = Loc::Outside;\n                } else {\n                    pA.loc = Loc::Inside;\n                    pT.loc = Loc::Inside;\n                }\n            } else if (mode == OPER_UNION || mode == OPER_INTERSECTION) {\n                pA.loc = Loc::Inside;\n                pT.loc = Loc::Outside;\n            }\n\n        } else if (cB == Congr::Equal || cB == Congr::Opposite) {\n            if (cB == Congr::Opposite) {\n                // normalen sind entgegengesetzt gerichtet\n\n                if (mode == OPER_INTERSECTION) {\n                    pB.loc = Loc::Outside;\n                    pT.loc = Loc::Outside;\n                } else {\n                    pB.loc = Loc::Inside;\n                    pT.loc = Loc::Inside;\n                }\n            } else if (mode == OPER_UNION || mode == OPER_INTERSECTION) {\n                pB.loc = Loc::Inside;\n                pT.loc = Loc::Outside;\n            }\n\n        } else {\n            double alpha = GetAngle(pA.r, pB.r, pA.e),\n                beta = GetAngle(pA.r, pT.r, pA.e);\n\n            if (beta > alpha) {\n                pT.loc = Loc::Inside;\n            } else {\n                pT.loc = Loc::Outside;\n            }\n        }\n    }\n\n};\n\n\nstd::shared_ptr<PolyPair> GetEdgePolys (vtkPolyData *pd, vtkIdList *ptsA, vtkIdList *ptsB) {\n\n#ifdef DEBUG\n    std::cout << \"GetEdgePolys()\" << std::endl;\n#endif\n\n    std::vector<Pair> p;\n\n    vtkIdType numPtsA = ptsA->GetNumberOfIds(),\n        numPtsB = ptsB->GetNumberOfIds();\n\n    vtkIdList *polys = vtkIdList::New();\n\n    vtkIdType i, j, numCells;\n\n    for (i = 0; i < numPtsA; i++) {\n        pd->GetPointCells(ptsA->GetId(i), polys);\n        numCells = polys->GetNumberOfIds();\n\n        for (j = 0; j < numCells; j++) {\n            p.emplace_back(ptsA->GetId(i), polys->GetId(j));\n        }\n    }\n\n    for (i = 0; i < numPtsB; i++) {\n        pd->GetPointCells(ptsB->GetId(i), polys);\n        numCells = polys->GetNumberOfIds();\n\n        for (j = 0; j < numCells; j++) {\n            p.emplace_back(ptsB->GetId(i), polys->GetId(j));\n        }\n    }\n\n    polys->Delete();\n\n    std::map<vtkIdType, IdsType> pEdges;\n\n    std::vector<Pair>::const_iterator itr;\n    for (itr = p.begin(); itr != p.end(); ++itr) {\n        pEdges[itr->g].push_back(itr->f);\n    }\n\n    std::vector<PolyAtEdge> opp;\n\n    vtkIdList *poly = vtkIdList::New();\n\n    vtkIdType numPts, a, b;\n\n    std::map<vtkIdType, IdsType>::const_iterator itr2;\n\n    for (itr2 = pEdges.begin(); itr2 != pEdges.end(); ++itr2) {\n        const IdsType &pts = itr2->second;\n\n        if (pts.size() > 1) {\n            pd->GetCellPoints(itr2->first, poly);\n            numPts = poly->GetNumberOfIds();\n\n            for (i = 0; i < numPts; i++) {\n                a = poly->GetId(i);\n                b = i+1 == numPts ? poly->GetId(0) : poly->GetId(i+1);\n\n                if (std::find(pts.begin(), pts.end(), a) != pts.end()\n                    && std::find(pts.begin(), pts.end(), b) != pts.end()) {\n\n                    opp.emplace_back(pd, itr2->first, a, b);\n                }\n            }\n\n        }\n    }\n\n    poly->Delete();\n\n#ifdef DEBUG\n    for (auto &op : opp) {\n        std::cout << op << std::endl;\n    }\n#endif\n\n    if (opp.size() != 2) {\n        return nullptr;\n    }\n\n    return std::make_shared<PolyPair>(opp[0], opp[1]);\n\n}\n\nbool vtkPolyDataBooleanFilter::CombineRegions () {\n\n#ifdef DEBUG\n    std::cout << \"CombineRegions()\" << std::endl;\n#endif\n\n    auto filterdA = vtkSmartPointer<vtkPolyData>::New();\n    filterdA->DeepCopy(modPdA);\n\n    auto filterdB = vtkSmartPointer<vtkPolyData>::New();\n    filterdB->DeepCopy(modPdB);\n\n    // ungenutzte punkte löschen\n    auto cleanA = vtkSmartPointer<vtkCleanPolyData>::New();\n    cleanA->PointMergingOff();\n    cleanA->SetInputData(filterdA);\n\n    auto cleanB = vtkSmartPointer<vtkCleanPolyData>::New();\n    cleanB->PointMergingOff();\n    cleanB->SetInputData(filterdB);\n\n    // regionen mit skalaren ausstatten\n    auto cfA = vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();\n    cfA->SetExtractionModeToAllRegions();\n    cfA->ColorRegionsOn();\n    cfA->SetInputConnection(cleanA->GetOutputPort());\n\n    auto cfB = vtkSmartPointer<vtkPolyDataConnectivityFilter>::New();\n    cfB->SetExtractionModeToAllRegions();\n    cfB->ColorRegionsOn();\n    cfB->SetInputConnection(cleanB->GetOutputPort());\n\n    cfA->Update();\n    cfB->Update();\n\n    vtkPolyData *pdA = cfA->GetOutput();\n    vtkPolyData *pdB = cfB->GetOutput();\n\n#ifdef DEBUG\n    WriteVTK(\"modPdA_8.vtk\", pdA);\n    WriteVTK(\"modPdB_8.vtk\", pdB);\n#endif\n\n    if (OperMode == OPER_NONE) {\n        resultA->ShallowCopy(pdA);\n        resultB->ShallowCopy(pdB);\n\n        contLines->RemoveDeletedCells();\n        resultC->ShallowCopy(contLines);\n\n        return false;\n    }\n\n    auto plA = vtkSmartPointer<vtkKdTreePointLocator>::New();\n    plA->SetDataSet(pdA);\n    plA->BuildLocator();\n\n    auto plB = vtkSmartPointer<vtkKdTreePointLocator>::New();\n    plB->SetDataSet(pdB);\n    plB->BuildLocator();\n\n    pdA->DeleteLinks(); pdA->BuildLinks();\n    pdB->DeleteLinks(); pdB->BuildLinks();\n\n    vtkIdTypeArray *scalarsA = vtkIdTypeArray::SafeDownCast(pdA->GetPointData()->GetScalars());\n    vtkIdTypeArray *scalarsB = vtkIdTypeArray::SafeDownCast(pdB->GetPointData()->GetScalars());\n\n    auto line = vtkSmartPointer<vtkIdList>::New();\n\n    double ptA[3], ptB[3];\n\n    auto fptsA = vtkSmartPointer<vtkIdList>::New();\n    auto lptsA = vtkSmartPointer<vtkIdList>::New();\n\n    auto fptsB = vtkSmartPointer<vtkIdList>::New();\n    auto lptsB = vtkSmartPointer<vtkIdList>::New();\n\n    std::map<vtkIdType, Loc> locsA, locsB;\n\n    vtkIdType i, j, numLines = contLines->GetNumberOfCells();\n\n    IdsType _failed;\n\n    for (i = 0; i < numLines; i++) {\n\n        if (contLines->GetCellType(i) == VTK_EMPTY_CELL) {\n            continue;\n        }\n\n        contLines->GetCellPoints(i, line);\n\n        contLines->GetPoint(line->GetId(0), ptA);\n        contLines->GetPoint(line->GetId(1), ptB);\n\n        FindPoints(plA, ptA, fptsA);\n        FindPoints(plB, ptA, fptsB);\n\n#ifdef DEBUG\n        std::cout << \"line \" << i << std::endl;\n#else\n\n        // bereits behandelte regionen werden nicht noch einmal untersucht\n\n        vtkIdType notLocated = 0;\n\n        for (j = 0; j < fptsA->GetNumberOfIds(); j++) {\n            if (locsA.count(scalarsA->GetValue(fptsA->GetId(j))) == 0) {\n                notLocated++;\n            }\n        }\n\n        for (j = 0; j < fptsB->GetNumberOfIds(); j++) {\n            if (locsB.count(scalarsB->GetValue(fptsB->GetId(j))) == 0) {\n                notLocated++;\n            }\n        }\n\n        if (notLocated == 0) {\n            continue;\n        }\n\n#endif\n\n        FindPoints(plA, ptB, lptsA);\n        FindPoints(plB, ptB, lptsB);\n\n        auto ppA = GetEdgePolys(pdA, fptsA, lptsA);\n        auto ppB = GetEdgePolys(pdB, fptsB, lptsB);\n\n        if (ppA && ppB) {\n\n            ppB->GetLoc(ppA->pA, OperMode);\n            ppB->GetLoc(ppA->pB, OperMode);\n\n            ppA->GetLoc(ppB->pA, OperMode);\n            ppA->GetLoc(ppB->pB, OperMode);\n\n            vtkIdType fsA = scalarsA->GetValue(ppA->pA.ptIdA);\n            vtkIdType lsA = scalarsA->GetValue(ppA->pB.ptIdA);\n\n            vtkIdType fsB = scalarsB->GetValue(ppB->pA.ptIdA);\n            vtkIdType lsB = scalarsB->GetValue(ppB->pB.ptIdA);\n\n#ifdef DEBUG\n            std::cout << \"polyId \" << ppA->pA.polyId << \", sA \" << fsA << \", loc \" << ppA->pA.loc << std::endl;\n            std::cout << \"polyId \" << ppA->pB.polyId << \", sA \" << lsA << \", loc \" << ppA->pB.loc << std::endl;\n            std::cout << \"polyId \" << ppB->pA.polyId << \", sB \" << fsB << \", loc \" << ppB->pA.loc << std::endl;\n            std::cout << \"polyId \" << ppB->pB.polyId << \", sB \" << lsB << \", loc \" << ppB->pB.loc << std::endl;\n\n            if (locsA.count(fsA) > 0 && locsA[fsA] != ppA->pA.loc) {\n                std::cout << \"sA \" << fsA << \": \" << locsA[fsA] << \" -> \" << ppA->pA.loc << std::endl;\n            }\n\n            if (locsA.count(lsA) > 0 && locsA[lsA] != ppA->pB.loc) {\n                std::cout << \"sA \" << lsA << \": \" << locsA[lsA] << \" -> \" << ppA->pB.loc << std::endl;\n            }\n\n            if (locsB.count(fsB) > 0 && locsB[fsB] != ppB->pA.loc) {\n                std::cout << \"sB \" << fsB << \": \" << locsB[fsB] << \" -> \" << ppB->pA.loc << std::endl;\n            }\n\n            if (locsB.count(lsB) > 0 && locsB[lsB] != ppB->pB.loc) {\n                std::cout << \"sB \" << lsB << \": \" << locsB[lsB] << \" -> \" << ppB->pB.loc << std::endl;\n            }\n\n#endif\n\n            locsA.emplace(fsA, ppA->pA.loc);\n            locsA.emplace(lsA, ppA->pB.loc);\n\n            locsB.emplace(fsB, ppB->pA.loc);\n            locsB.emplace(lsB, ppB->pB.loc);\n\n        } else {\n            _failed.push_back(i);\n        }\n\n    }\n\n    if (_failed.size() > 0) {\n#ifdef DEBUG\n        for (auto i : _failed) {\n            std::cout << \"failed at \" << i\n                << std::endl;\n        }\n#endif\n\n        return true;\n    }\n\n    // reale kombination der ermittelten regionen\n\n    Loc comb[] = {Loc::Outside, Loc::Outside};\n\n    if (OperMode == OPER_INTERSECTION) {\n        comb[0] = Loc::Inside;\n        comb[1] = Loc::Inside;\n    } else if (OperMode == OPER_DIFFERENCE) {\n        comb[1] = Loc::Inside;\n    } else if (OperMode == OPER_DIFFERENCE2) {\n        comb[0] = Loc::Inside;\n    }\n\n    vtkIdType numA = cfA->GetNumberOfExtractedRegions(),\n        numB = cfB->GetNumberOfExtractedRegions();\n\n    cfA->SetExtractionModeToSpecifiedRegions();\n    cfB->SetExtractionModeToSpecifiedRegions();\n\n    std::map<vtkIdType, Loc>::const_iterator itr;\n\n    for (itr = locsA.begin(); itr != locsA.end(); itr++) {\n        if (itr->second == comb[0]) {\n            cfA->AddSpecifiedRegion(itr->first);\n        }\n    }\n\n    for (itr = locsB.begin(); itr != locsB.end(); itr++) {\n        if (itr->second == comb[1]) {\n            cfB->AddSpecifiedRegion(itr->first);\n        }\n    }\n\n    // nicht beteiligte regionen hinzufügen\n\n    if (OperMode == OPER_UNION || OperMode == OPER_DIFFERENCE) {\n        for (i = 0; i < numA; i++) {\n            if (locsA.count(i) == 0) {\n                cfA->AddSpecifiedRegion(i);\n            }\n        }\n    }\n\n    if (OperMode == OPER_UNION || OperMode == OPER_DIFFERENCE2) {\n        for (i = 0; i < numB; i++) {\n            if (locsB.count(i) == 0) {\n                cfB->AddSpecifiedRegion(i);\n            }\n        }\n    }\n\n    // nach innen zeigende normalen umkehren\n\n    cfA->Update();\n    cfB->Update();\n\n    vtkPolyData *regsA = cfA->GetOutput();\n    vtkPolyData *regsB = cfB->GetOutput();\n\n    scalarsA = vtkIdTypeArray::SafeDownCast(regsA->GetPointData()->GetScalars());\n    scalarsB = vtkIdTypeArray::SafeDownCast(regsB->GetPointData()->GetScalars());\n\n    if (OperMode != OPER_INTERSECTION) {\n        vtkCellIterator *cellItr;\n\n        vtkIdType cellId;\n        vtkIdList *ptIds;\n\n        if (comb[0] == Loc::Inside) {\n            cellItr = regsA->NewCellIterator();\n\n            for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) {\n                cellId = cellItr->GetCellId();\n                ptIds = cellItr->GetPointIds();\n\n                if (locsA.count(scalarsA->GetValue(ptIds->GetId(0))) == 1) {\n                    regsA->ReverseCell(cellId);\n                }\n            }\n\n            cellItr->Delete();\n        }\n\n        if (comb[1] == Loc::Inside) {\n            cellItr = regsB->NewCellIterator();\n\n            for (cellItr->InitTraversal(); !cellItr->IsDoneWithTraversal(); cellItr->GoToNextCell()) {\n                cellId = cellItr->GetCellId();\n                ptIds = cellItr->GetPointIds();\n\n                if (locsB.count(scalarsB->GetValue(ptIds->GetId(0))) == 1) {\n                    regsB->ReverseCell(cellId);\n                }\n            }\n\n            cellItr->Delete();\n        }\n\n    }\n\n    // OrigCellIds und CellData\n\n    vtkIdTypeArray *origCellIdsA = vtkIdTypeArray::SafeDownCast(regsA->GetCellData()->GetScalars(\"OrigCellIds\"));\n    vtkIdTypeArray *origCellIdsB = vtkIdTypeArray::SafeDownCast(regsB->GetCellData()->GetScalars(\"OrigCellIds\"));\n\n    vtkIdTypeArray *newOrigCellIdsA = vtkIdTypeArray::New();\n    newOrigCellIdsA->SetName(\"OrigCellIdsA\");\n\n    vtkIdTypeArray *newOrigCellIdsB = vtkIdTypeArray::New();\n    newOrigCellIdsB->SetName(\"OrigCellIdsB\");\n\n    vtkCellData *newCellDataA = vtkCellData::New();\n    newCellDataA->CopyAllocate(cellDataA);\n\n    vtkCellData *newCellDataB = vtkCellData::New();\n    newCellDataB->CopyAllocate(cellDataB);\n\n    vtkIdType cellId;\n\n    for (i = 0; i < regsA->GetNumberOfCells(); i++) {\n        cellId = cellIdsA->GetValue(origCellIdsA->GetValue(i));\n\n        newOrigCellIdsA->InsertNextValue(cellId);\n        newOrigCellIdsB->InsertNextValue(-1);\n\n        newCellDataA->CopyData(cellDataA, cellId, i);\n    }\n\n    for (i = 0; i < regsB->GetNumberOfCells(); i++) {\n        cellId = cellIdsB->GetValue(origCellIdsB->GetValue(i));\n\n        newOrigCellIdsB->InsertNextValue(cellId);\n        newOrigCellIdsA->InsertNextValue(-1);\n\n        newCellDataB->CopyData(cellDataB, cellId, i);\n    }\n\n    regsA->GetCellData()->Initialize();\n    regsB->GetCellData()->Initialize();\n\n    regsA->GetCellData()->ShallowCopy(newCellDataA);\n    regsB->GetCellData()->ShallowCopy(newCellDataB);\n\n    newCellDataA->Delete();\n    newCellDataB->Delete();\n\n    // zusammenführung\n\n    vtkAppendPolyData *app = vtkAppendPolyData::New();\n    app->AddInputData(regsA);\n    app->AddInputData(regsB);\n\n    // entfernt ungenutzte punkte\n    vtkCleanPolyData *cleanApp = vtkCleanPolyData::New();\n    cleanApp->PointMergingOff();\n    cleanApp->SetInputConnection(app->GetOutputPort());\n\n    // färbt die regionen nochmal neu ein, damit mehrere regionen nicht die gleiche farbe haben\n\n    vtkPolyDataConnectivityFilter *cfApp = vtkPolyDataConnectivityFilter::New();\n    cfApp->SetExtractionModeToAllRegions();\n    cfApp->ColorRegionsOn();\n    cfApp->SetInputConnection(cleanApp->GetOutputPort());\n\n    cfApp->Update();\n\n    vtkPolyData *cfPd = cfApp->GetOutput();\n\n    // resultB bleibt hier leer\n\n    resultA->ShallowCopy(cfPd);\n\n    resultA->GetCellData()->AddArray(newOrigCellIdsA);\n    resultA->GetCellData()->AddArray(newOrigCellIdsB);\n\n    contLines->RemoveDeletedCells();\n    resultC->ShallowCopy(contLines);\n\n    // aufräumen\n\n    cfApp->Delete();\n    cleanApp->Delete();\n    app->Delete();\n\n    newOrigCellIdsB->Delete();\n    newOrigCellIdsA->Delete();\n\n    plB->FreeSearchStructure();\n    plA->FreeSearchStructure();\n\n    return false;\n\n}\n\nvoid vtkPolyDataBooleanFilter::SetMatrix (int i, vtkMatrix4x4 *matrix) {\n    if (i != 0 && i != 1) {\n        return;\n    }\n\n    if (matrices[i] == matrix) {\n        return;\n    }\n\n    if (transforms[i] != nullptr) {\n        transforms[i]->Delete();\n        transforms[i] = nullptr;\n    }\n\n    if (matrices[i] != nullptr) {\n        matrices[i]->Delete();\n        matrices[i] = nullptr;\n    }\n\n    if (matrix != nullptr) {\n        matrices[i] = matrix;\n        matrix->Register(this);\n\n        auto transform = vtkMatrixToLinearTransform::New();\n\n        transform->Register(this);\n        transform->Delete();\n\n        transform->SetInput(matrix);\n\n        transforms[i] = transform;\n    }\n\n    Modified();\n}\n\nvtkMatrix4x4* vtkPolyDataBooleanFilter::GetMatrix (int i) {\n    if (i != 0 && i != 1) {\n        return nullptr;\n    }\n\n    return matrices[i];\n}\n\nvtkMTimeType vtkPolyDataBooleanFilter::GetMTime () {\n    std::vector<vtkMTimeType> times = { MTime.GetMTime() };\n\n    if (matrices[0] != nullptr) {\n        times.push_back(matrices[0]->GetMTime());\n    }\n\n    if (matrices[1] != nullptr) {\n        times.push_back(matrices[1]->GetMTime());\n    }\n\n    return *std::max_element(times.begin(), times.end());\n}\n"
  },
  {
    "path": "vtkPolyDataBooleanFilter.h",
    "content": "/*\nCopyright 2012-2025 Ronald Römer\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n#ifndef __vtkPolyDataBooleanFilter_h\n#define __vtkPolyDataBooleanFilter_h\n\n#include <vector>\n#include <deque>\n#include <map>\n#include <set>\n#include <utility>\n#include <iostream>\n#include <type_traits>\n\n#include <vtkPolyDataAlgorithm.h>\n#include <vtkKdTree.h>\n#include <vtkModifiedBSPTree.h>\n#include <vtkMatrixToLinearTransform.h>\n#include <vtkMatrix4x4.h>\n\n#include \"Contact.h\"\n\n#include \"Utilities.h\"\n\nenum OperMode {\n    OPER_NONE = 0,\n    OPER_UNION,\n    OPER_INTERSECTION,\n    OPER_DIFFERENCE,\n    OPER_DIFFERENCE2\n};\n\nenum class Capt {\n    Not = 1 << 0,\n    Edge = 1 << 1,\n    A = 1 << 2,\n    B = 1 << 3,\n    Branched = 1 << 4,\n    Boundary = 0xe\n};\n\n// inline std::underlying_type_t<Capt> operator| (Capt lhs, Capt rhs) {\n//     return static_cast<std::underlying_type_t<Capt>>(lhs) |\n//         static_cast<std::underlying_type_t<Capt>>(rhs);\n// }\n\ninline std::underlying_type_t<Capt> operator& (Capt lhs, Capt rhs) {\n    return static_cast<std::underlying_type_t<Capt>>(lhs) &\n        static_cast<std::underlying_type_t<Capt>>(rhs);\n}\n\nenum class Side {\n    None,\n    Start,\n    End\n};\n\nenum class Loc {\n    None,\n    Inside,\n    Outside\n};\n\nclass StripPt {\npublic:\n    StripPt () : t(0), capt(Capt::Not), catched(true) {\n        edge[0] = NOTSET;\n        edge[1] = NOTSET;\n    }\n\n    double t;\n    Capt capt;\n    double captPt[3];\n\n    vtkIdType ind, edge[2];\n\n    double pt[3];\n    double cutPt[3];\n\n    friend std::ostream& operator<< (std::ostream &out, const StripPt &s) {\n        out << \"ind \" << s.ind\n            << \", edge [\" << s.edge[0] << \", \" << s.edge[1] << \"]\"\n            << \", t \" << s.t\n            << \", capt \" << s.capt\n            << \", polyId \" << s.polyId;\n        return out;\n    }\n\n    vtkIdType polyId;\n\n    bool catched;\n};\n\nclass StripPtR {\npublic:\n    StripPtR () = delete;\n\n    StripPtR (vtkIdType ind, std::size_t strip) : ind(ind), strip(strip), ref(NOTSET), side(Side::None) {\n        desc[0] = NOTSET;\n        desc[1] = NOTSET;\n    }\n\n    vtkIdType ind;\n    std::size_t strip;\n    vtkIdType ref, desc[2];\n    Side side;\n\n    friend std::ostream& operator<< (std::ostream &out, const StripPtR &s) {\n        out << \"ind \" << s.ind\n            << \", desc [\" << s.desc[0] << \", \" << s.desc[1] << \"]\"\n            << \", strip \" << s.strip\n            << \", side \" << s.side\n            << \", ref \" << s.ref;\n        return out;\n    }\n};\n\ntypedef std::map<vtkIdType, StripPt> StripPtsType;\ntypedef std::deque<StripPtR> StripType;\ntypedef std::vector<StripType> StripsType;\n\ntypedef std::vector<std::reference_wrapper<StripType>> _StripsType;\n\nclass PStrips {\npublic:\n    PStrips (vtkPolyData *pd, vtkIdType cellId) {\n        const vtkIdType *cell;\n        vtkIdType numPts;\n\n        pd->GetCellPoints(cellId, numPts, cell);\n\n        for (vtkIdType i = 0; i < numPts; i++) {\n            poly.push_back(cell[i]);\n        }\n\n        ComputeNormal(pd->GetPoints(), n, numPts, cell);\n\n        base = Base(pd->GetPoints(), numPts, cell);\n    }\n\n    StripPtsType pts;\n    StripsType strips;\n\n    double n[3];\n    IdsType poly;\n    Base base;\n};\n\ntypedef std::map<vtkIdType, PStrips> PolyStripsType;\n\ntypedef std::vector<std::reference_wrapper<StripPtR>> RefsType;\ntypedef std::vector<std::reference_wrapper<const StripPtR>> ConstRefsType;\n\nclass VTK_EXPORT vtkPolyDataBooleanFilter : public vtkPolyDataAlgorithm {\n    vtkPolyData *resultA, *resultB, *resultC;\n\n    vtkSmartPointer<vtkPolyData> modPdA, modPdB, contLines;\n\n    vtkSmartPointer<vtkCellData> cellDataA, cellDataB;\n    vtkSmartPointer<vtkIdTypeArray> cellIdsA, cellIdsB;\n\n    vtkIdTypeArray *contsA, *contsB;\n\n    vtkMTimeType timePdA, timePdB;\n\n    PolyStripsType polyStripsA, polyStripsB;\n\n    void GetStripPoints (vtkPolyData *pd, vtkIdTypeArray *sources, PStrips &pStrips, IdsType &lines);\n    bool GetPolyStrips (vtkPolyData *pd, vtkIdTypeArray *conts, vtkIdTypeArray *sources, PolyStripsType &polyStrips);\n    bool CleanStrips ();\n    void RemoveDuplicates (IdsType &lines);\n    void CompleteStrips (PStrips &pStrips);\n    bool HasArea (const StripType &strip) const;\n    bool CutCells (vtkPolyData *pd, PolyStripsType &polyStrips);\n    void RestoreOrigPoints (vtkPolyData *pd, PolyStripsType &polyStrips);\n    void DisjoinPolys (vtkPolyData *pd, PolyStripsType &polyStrips);\n    void ResolveOverlaps (vtkPolyData *pd, PolyStripsType &polyStrips);\n    void AddAdjacentPoints (vtkPolyData *pd, vtkIdTypeArray *conts, PolyStripsType &polyStrips);\n    void MergePoints (vtkPolyData *pd, PolyStripsType &polyStrips);\n    bool CombineRegions ();\n\n    int OperMode;\n\n    vtkMatrix4x4 *matrices[2];\n    vtkLinearTransform *transforms[2];\n\n    vtkSmartPointer<vtkPolyData> cleanA, cleanB;\n\n    std::shared_ptr<Contact> contact;\n\n    vtkMTimeType timeMatrixA, timeMatrixB;\n\npublic:\n    vtkTypeMacro(vtkPolyDataBooleanFilter, vtkPolyDataAlgorithm);\n    static vtkPolyDataBooleanFilter* New ();\n\n    vtkSetClampMacro(OperMode, int, OPER_NONE, OPER_DIFFERENCE2);\n    vtkGetMacro(OperMode, int);\n\n    void SetOperModeToNone () { OperMode = OPER_NONE; Modified(); }\n    void SetOperModeToUnion () { OperMode = OPER_UNION; Modified(); }\n    void SetOperModeToIntersection () { OperMode = OPER_INTERSECTION; Modified(); }\n    void SetOperModeToDifference () { OperMode = OPER_DIFFERENCE; Modified(); }\n    void SetOperModeToDifference2 () { OperMode = OPER_DIFFERENCE2; Modified(); }\n\n    void SetMatrix (int i, vtkMatrix4x4 *matrix);\n    vtkMatrix4x4* GetMatrix (int i);\n\n    vtkMTimeType GetMTime () override;\n\nprotected:\n    vtkPolyDataBooleanFilter ();\n    ~vtkPolyDataBooleanFilter ();\n\n    int RequestData (vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override;\n\n    void PrintSelf (ostream&, vtkIndent) override {};\n\nprivate:\n    vtkPolyDataBooleanFilter (const vtkPolyDataBooleanFilter&) = delete;\n    void operator= (const vtkPolyDataBooleanFilter&) = delete;\n\n};\n\n#endif\n"
  }
]