From 8f6b469e437674ec22ea3ee8a7304f5128ab7a05 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 12 Oct 2005 11:17:22 +0000 Subject: [PATCH] This commit was generated by cvs2git to create tag 'BR-D5-38-2003_D2005-12-10'. Sprout from BR-D5-38-2003 2005-10-12 11:17:21 UTC apo 'Adjust to CVS HEAD modifications' Delete: ChangeLog LICENCE adm_local/unix/config_files/check_Geom.m4 adm_local/unix/config_files/check_Med.m4 adm_local/unix/make_conclude.in adm_local/unix/make_omniorb.in cvs-tags doc/Makefile.in doc/salome/AddNetgenInSalome2.pdf doc/salome/AddNetgenInSalome2.ps doc/salome/AddNetgenInSalome2.sxw doc/salome/PluginMeshers.txt doc/salome/gui/Makefile.in doc/salome/gui/SMESH/i_blue.jpg doc/salome/gui/SMESH/image22.gif doc/salome/gui/SMESH/image22.jpg doc/salome/gui/SMESH/image23.jpg doc/salome/gui/SMESH/image24.gif doc/salome/gui/SMESH/image25.gif doc/salome/gui/SMESH/image25.jpg doc/salome/gui/SMESH/image26.jpg doc/salome/gui/SMESH/image27.jpg doc/salome/gui/SMESH/image28.gif doc/salome/gui/SMESH/image30.jpg doc/salome/gui/SMESH/image31.jpg doc/salome/gui/SMESH/image32.gif doc/salome/gui/SMESH/image32.jpg doc/salome/gui/SMESH/image33.gif doc/salome/gui/SMESH/image34.gif doc/salome/gui/SMESH/image35.gif doc/salome/gui/SMESH/image36.gif doc/salome/gui/SMESH/image36.jpg doc/salome/gui/SMESH/image37.gif doc/salome/gui/SMESH/image38.gif doc/salome/gui/SMESH/image38.jpg doc/salome/gui/SMESH/image39.gif doc/salome/gui/SMESH/image40.gif doc/salome/gui/SMESH/image41.gif doc/salome/gui/SMESH/image46.gif doc/salome/gui/SMESH/image51.jpg doc/salome/gui/SMESH/image52.jpg doc/salome/gui/SMESH/image63.gif doc/salome/gui/SMESH/image64.gif doc/salome/gui/SMESH/image67.gif doc/salome/gui/SMESH/image70.gif doc/salome/gui/SMESH/image70.jpg doc/salome/gui/SMESH/image71.gif doc/salome/gui/SMESH/image71.jpg doc/salome/gui/SMESH/image73.gif doc/salome/gui/SMESH/image74.gif doc/salome/gui/SMESH/image76.jpg doc/salome/gui/SMESH/image77.jpg doc/salome/gui/SMESH/image78.jpg doc/salome/gui/SMESH/image79.gif doc/salome/gui/SMESH/image80.gif doc/salome/gui/SMESH/image82.gif doc/salome/gui/SMESH/image83.gif doc/salome/gui/SMESH/image84.gif doc/salome/gui/SMESH/image88.gif doc/salome/gui/SMESH/image91.gif doc/salome/gui/SMESH/image92.gif doc/salome/gui/SMESH/image94.gif doc/salome/gui/SMESH/image95.gif doc/salome/gui/SMESH/image96.gif doc/salome/gui/SMESH/image97.gif doc/salome/gui/SMESH/image98.gif doc/salome/gui/SMESH/note1.gif doc/salome/gui/SMESH/pics/exemple.gif doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg doc/salome/gui/SMESH/whestart.ico doc/salome/gui/SMESH/whgdata/whexpbar.gif doc/salome/gui/SMESH/whrstart.ico doc/salome/gui/SMESH/whstart.ico doc/salome/gui/SMESH/wht_fts_h.gif doc/salome/gui/SMESH/wht_fts_n.gif doc/salome/gui/SMESH/wht_glo_h.gif doc/salome/gui/SMESH/wht_glo_n.gif doc/salome/gui/SMESH/wht_go.gif doc/salome/gui/SMESH/wht_hide.gif doc/salome/gui/SMESH/wht_idx_h.gif doc/salome/gui/SMESH/wht_idx_n.gif doc/salome/gui/SMESH/wht_logo1.gif doc/salome/gui/SMESH/wht_logo2.gif doc/salome/gui/SMESH/wht_next.gif doc/salome/gui/SMESH/wht_next_g.gif doc/salome/gui/SMESH/wht_prev.gif doc/salome/gui/SMESH/wht_prev_g.gif doc/salome/gui/SMESH/wht_spac.gif doc/salome/gui/SMESH/wht_sync.gif doc/salome/gui/SMESH/wht_tab0.gif doc/salome/gui/SMESH/wht_tab1.gif doc/salome/gui/SMESH/wht_tab2.gif doc/salome/gui/SMESH/wht_tab3.gif doc/salome/gui/SMESH/wht_tab4.gif doc/salome/gui/SMESH/wht_tab5.gif doc/salome/gui/SMESH/wht_tab6.gif doc/salome/gui/SMESH/wht_tab7.gif doc/salome/gui/SMESH/wht_tab8.gif doc/salome/gui/SMESH/wht_toc1.gif doc/salome/gui/SMESH/wht_toc2.gif doc/salome/gui/SMESH/wht_toc3.gif doc/salome/gui/SMESH/wht_toc4.gif doc/salome/gui/SMESH/wht_toc_h.gif doc/salome/gui/SMESH/wht_toc_n.gif doc/salome/gui/SMESH/wht_ws.gif doc/salome/gui/SMESH/wht_ws_g.gif doc/salome/tui/Makefile.in doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html doc/salome/tui/SMESH/HTML/SMESH_Gen.html doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html doc/salome/tui/SMESH/HTML/SMESH_Mesh.html doc/salome/tui/SMESH/sources/Application-About.png doc/salome/tui/SMESH/sources/Application-About1.jpg doc/salome/tui/SMESH/sources/application.gif doc/salome/tui/SMESH/sources/application.jpg doc/salome/tui/SMESH/sources/bg_salome.gif doc/salome/tui/SMESH/sources/logocorp.gif doc/salome/tui/SMESH/sources/myheader.html doc/salome/tui/SMESH/sources/myheader_py2.html doc/salome/tui/SMESH/sources/occ.gif doc/salome/tui/SMESH/sources/static/PluginMeshers.html doc/salome/tui/SMESH/sources/static/doxygen.css doc/salome/tui/SMESH/sources/static/page2.html doc/salome/tui/SMESH/sources/static/treeview.js idl/Makefile.in idl/SMESH_Group.idl idl/SMESH_Hypothesis.idl idl/SMESH_Pattern.idl resources/ModuleMesh.png resources/SMESH.config resources/SMESH_en.xml resources/SMESH_fr.xml resources/advanced_mesh_info.png resources/delete.png resources/mesh.png resources/mesh_add.png resources/mesh_add_sub.png resources/mesh_algo_hexa.png resources/mesh_algo_mefisto.png resources/mesh_algo_netgen.png resources/mesh_algo_quad.png resources/mesh_algo_regular.png resources/mesh_algo_tetra.png resources/mesh_angle.png resources/mesh_area.png resources/mesh_aspect.png resources/mesh_aspect_3d.png resources/mesh_compute.png resources/mesh_connectivity.png resources/mesh_cutGroups.png resources/mesh_cutquad.png resources/mesh_deleteGroups.png resources/mesh_diagonal.png resources/mesh_edit.png resources/mesh_edit_group.png resources/mesh_extrusion.png resources/mesh_extrusionpath.png resources/mesh_free_edges.png resources/mesh_free_edges_2d.png resources/mesh_hexa.png resources/mesh_hexa_n.png resources/mesh_hypo_area.png resources/mesh_hypo_edit.png resources/mesh_hypo_length.png resources/mesh_hypo_segment.png resources/mesh_hypo_volume.png resources/mesh_info.png resources/mesh_init.png resources/mesh_intersectGroups.png resources/mesh_length.png resources/mesh_length_2d.png resources/mesh_line.png resources/mesh_line_n.png resources/mesh_make_group.png resources/mesh_merge_elements.png resources/mesh_merge_nodes.png resources/mesh_move_node.png resources/mesh_multi_edges.png resources/mesh_multi_edges_2d.png resources/mesh_orientation.png resources/mesh_pattern.png resources/mesh_points.png resources/mesh_polygon.png resources/mesh_polyhedron.png resources/mesh_pyramid.png resources/mesh_pyramid_n.png resources/mesh_quad.png resources/mesh_quad_n.png resources/mesh_rem_element.png resources/mesh_rem_node.png resources/mesh_remove.png resources/mesh_renumbering_elements.png resources/mesh_renumbering_nodes.png resources/mesh_revolution.png resources/mesh_rotation.png resources/mesh_set_algo.png resources/mesh_set_hypo.png resources/mesh_sew_bordertoside.png resources/mesh_sew_conform_freeborders.png resources/mesh_sew_freeborders.png resources/mesh_sew_sideelements.png resources/mesh_shading.png resources/mesh_shrink.png resources/mesh_skew.png resources/mesh_smoothing.png resources/mesh_symmetry_axis.png resources/mesh_symmetry_plane.png resources/mesh_symmetry_point.png resources/mesh_taper.png resources/mesh_tetra.png resources/mesh_tetra_n.png resources/mesh_translation_points.png resources/mesh_translation_vector.png resources/mesh_tree_algo.png resources/mesh_tree_algo_hexa.png resources/mesh_tree_algo_mefisto.png resources/mesh_tree_algo_netgen.png resources/mesh_tree_algo_quad.png resources/mesh_tree_algo_regular.png resources/mesh_tree_algo_tetra.png resources/mesh_tree_group.png resources/mesh_tree_hypo.png resources/mesh_tree_hypo_area.png resources/mesh_tree_hypo_length.png resources/mesh_tree_hypo_segment.png resources/mesh_tree_hypo_volume.png resources/mesh_tree_importedmesh.png resources/mesh_tree_mesh.png resources/mesh_tree_mesh_warn.png resources/mesh_triangle.png resources/mesh_triangle_n.png resources/mesh_union2tri.png resources/mesh_unionGroups.png resources/mesh_uniontri.png resources/mesh_update.png resources/mesh_vertex.png resources/mesh_vertex_n.png resources/mesh_wireframe.png resources/mesh_wrap.png resources/pattern_sample_2d.png resources/pattern_sample_3D.png resources/select1.png resources/standard_mesh_info.png src/Controls/SMESHControls.cxx src/Controls/SMESH_Controls.hxx src/Controls/SMESH_ControlsDef.hxx src/Driver/Driver_Document.cxx src/Driver/Driver_Document.h src/Driver/Driver_Mesh.cxx src/Driver/Driver_Mesh.h src/Driver/Driver_SMDS_Mesh.cxx src/Driver/Driver_SMDS_Mesh.h src/Driver/Driver_SMESHDS_Mesh.cxx src/Driver/Driver_SMESHDS_Mesh.h src/Driver/Makefile.in src/DriverDAT/DAT_Test.cxx src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx src/DriverDAT/DriverDAT_R_SMDS_Mesh.h src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx src/DriverDAT/DriverDAT_R_SMESHDS_Document.h src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx src/DriverDAT/DriverDAT_W_SMDS_Mesh.h src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx src/DriverDAT/DriverDAT_W_SMESHDS_Document.h src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h src/DriverMED/DriverMED_Family.cxx src/DriverMED/DriverMED_Family.h src/DriverMED/DriverMED_R_SMDS_Mesh.cxx src/DriverMED/DriverMED_R_SMDS_Mesh.h src/DriverMED/DriverMED_R_SMESHDS_Document.cxx src/DriverMED/DriverMED_R_SMESHDS_Document.h src/DriverMED/DriverMED_R_SMESHDS_Mesh.h src/DriverMED/DriverMED_W_SMDS_Mesh.cxx src/DriverMED/DriverMED_W_SMDS_Mesh.h src/DriverMED/DriverMED_W_SMESHDS_Document.cxx src/DriverMED/DriverMED_W_SMESHDS_Document.h src/DriverMED/DriverMED_W_SMESHDS_Mesh.h src/DriverMED/MED_Test.cxx src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx src/DriverSTL/DriverSTL_R_SMDS_Mesh.h src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx src/DriverSTL/DriverSTL_W_SMDS_Mesh.h src/DriverSTL/STL_Test.cxx src/DriverUNV/DriverUNV_R_SMDS_Mesh.h src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx src/DriverUNV/DriverUNV_R_SMESHDS_Document.h src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx src/DriverUNV/DriverUNV_W_SMDS_Mesh.h src/DriverUNV/DriverUNV_W_SMESHDS_Document.cxx src/DriverUNV/DriverUNV_W_SMESHDS_Document.h src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h src/DriverUNV/UNV2411_Structure.cxx src/DriverUNV/UNV2411_Structure.hxx src/DriverUNV/UNV2412_Structure.cxx src/DriverUNV/UNV2412_Structure.hxx src/DriverUNV/UNV_Test.cxx src/DriverUNV/UNV_Utilities.cxx src/DriverUNV/UNV_Utilities.hxx src/MEFISTO2/Rn.h src/MEFISTO2/aptrte.cxx src/MEFISTO2/aptrte.h src/MEFISTO2/areteideale.f src/MEFISTO2/trte.f src/Makefile.in src/NETGEN/Makefile.in src/NETGEN/ReadMeForNgUsers src/NETGEN/netgen43ForSalome.patch src/NETGENPlugin/Makefile.in src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx src/NETGENPlugin/NETGENPlugin_i.cxx src/NETGENPlugin/NETGENPlugin_icons.po src/OBJECT/Makefile.in src/OBJECT/SMESH_Actor.cxx src/OBJECT/SMESH_Actor.h src/OBJECT/SMESH_ActorDef.h src/OBJECT/SMESH_ActorUtils.cxx src/OBJECT/SMESH_ActorUtils.h src/OBJECT/SMESH_DeviceActor.cxx src/OBJECT/SMESH_DeviceActor.h src/OBJECT/SMESH_ExtractGeometry.cxx src/OBJECT/SMESH_ExtractGeometry.h src/OBJECT/SMESH_Object.cxx src/OBJECT/SMESH_Object.h src/OBJECT/SMESH_ObjectDef.h src/SMDS/Makefile.in src/SMDS/SMDSAbs_ElementType.hxx src/SMDS/SMDS_EdgePosition.cxx src/SMDS/SMDS_EdgePosition.hxx src/SMDS/SMDS_ElemIterator.hxx src/SMDS/SMDS_FaceOfEdges.cxx src/SMDS/SMDS_FaceOfEdges.hxx src/SMDS/SMDS_FaceOfNodes.cxx src/SMDS/SMDS_FaceOfNodes.hxx src/SMDS/SMDS_FacePosition.cxx src/SMDS/SMDS_FacePosition.hxx src/SMDS/SMDS_Iterator.hxx src/SMDS/SMDS_IteratorOfElements.cxx src/SMDS/SMDS_IteratorOfElements.hxx src/SMDS/SMDS_Mesh.cxx src/SMDS/SMDS_Mesh.hxx src/SMDS/SMDS_MeshEdge.cxx src/SMDS/SMDS_MeshEdge.hxx src/SMDS/SMDS_MeshElement.cxx src/SMDS/SMDS_MeshElement.hxx src/SMDS/SMDS_MeshElementIDFactory.cxx src/SMDS/SMDS_MeshElementIDFactory.hxx src/SMDS/SMDS_MeshFace.cxx src/SMDS/SMDS_MeshFace.hxx src/SMDS/SMDS_MeshGroup.cxx src/SMDS/SMDS_MeshGroup.hxx src/SMDS/SMDS_MeshIDFactory.cxx src/SMDS/SMDS_MeshIDFactory.hxx src/SMDS/SMDS_MeshNode.cxx src/SMDS/SMDS_MeshNode.hxx src/SMDS/SMDS_MeshObject.cxx src/SMDS/SMDS_MeshObject.hxx src/SMDS/SMDS_MeshVolume.cxx src/SMDS/SMDS_MeshVolume.hxx src/SMDS/SMDS_PolygonalFaceOfNodes.cxx src/SMDS/SMDS_PolygonalFaceOfNodes.hxx src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx src/SMDS/SMDS_Position.cxx src/SMDS/SMDS_Position.hxx src/SMDS/SMDS_SpacePosition.cxx src/SMDS/SMDS_SpacePosition.hxx src/SMDS/SMDS_TypeOfPosition.hxx src/SMDS/SMDS_VertexPosition.cxx src/SMDS/SMDS_VertexPosition.hxx src/SMDS/SMDS_VolumeOfFaces.cxx src/SMDS/SMDS_VolumeOfFaces.hxx src/SMDS/SMDS_VolumeOfNodes.cxx src/SMDS/SMDS_VolumeOfNodes.hxx src/SMDS/SMDS_VolumeTool.hxx src/SMESH/SMESH_1D_Algo.cxx src/SMESH/SMESH_1D_Algo.hxx src/SMESH/SMESH_2D_Algo.cxx src/SMESH/SMESH_2D_Algo.hxx src/SMESH/SMESH_3D_Algo.cxx src/SMESH/SMESH_3D_Algo.hxx src/SMESH/SMESH_Block.cxx src/SMESH/SMESH_Block.hxx src/SMESH/SMESH_Group.cxx src/SMESH/SMESH_Group.hxx src/SMESH/SMESH_HypoFilter.cxx src/SMESH/SMESH_HypoFilter.hxx src/SMESH/SMESH_Hypothesis.cxx src/SMESH/SMESH_Hypothesis.hxx src/SMESH/SMESH_Mesh.cxx src/SMESH/SMESH_Mesh.hxx src/SMESH/SMESH_subMesh.hxx src/SMESHDS/Makefile.in src/SMESHDS/SMESHDS_Command.cxx src/SMESHDS/SMESHDS_Command.hxx src/SMESHDS/SMESHDS_CommandType.hxx src/SMESHDS/SMESHDS_Document.cxx src/SMESHDS/SMESHDS_Document.hxx src/SMESHDS/SMESHDS_Group.cxx src/SMESHDS/SMESHDS_Group.hxx src/SMESHDS/SMESHDS_GroupBase.cxx src/SMESHDS/SMESHDS_GroupBase.hxx src/SMESHDS/SMESHDS_GroupOnGeom.cxx src/SMESHDS/SMESHDS_GroupOnGeom.hxx src/SMESHDS/SMESHDS_Hypothesis.cxx src/SMESHDS/SMESHDS_Hypothesis.hxx src/SMESHDS/SMESHDS_Mesh.cxx src/SMESHDS/SMESHDS_Script.cxx src/SMESHDS/SMESHDS_Script.hxx src/SMESHDS/SMESHDS_SubMesh.cxx src/SMESHDS/SMESHDS_SubMesh.hxx src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx src/SMESHFiltersSelection/SMESH_TypeFilter.ixx src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx src/SMESHGUI/SMESHGUI_Filter.cxx src/SMESHGUI/SMESHGUI_Filter.h src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h src/SMESHGUI/SMESHGUI_FilterUtils.cxx src/SMESHGUI/SMESHGUI_FilterUtils.h src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx src/SMESHGUI/SMESHGUI_GEOMGenUtils.h src/SMESHGUI/SMESHGUI_GroupDlg.cxx src/SMESHGUI/SMESHGUI_GroupUtils.cxx src/SMESHGUI/SMESHGUI_GroupUtils.h src/SMESHGUI/SMESHGUI_IdValidator.h src/SMESHGUI/SMESHGUI_MeshUtils.cxx src/SMESHGUI/SMESHGUI_MeshUtils.h src/SMESHGUI/SMESHGUI_PatternUtils.cxx src/SMESHGUI/SMESHGUI_PatternUtils.h src/SMESHGUI/SMESHGUI_PatternWidget.cxx src/SMESHGUI/SMESHGUI_PatternWidget.h src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx src/SMESHGUI/SMESHGUI_PrecisionDlg.h src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx src/SMESHGUI/SMESHGUI_SMESHGenUtils.h src/SMESHGUI/SMESHGUI_SpinBox.cxx src/SMESHGUI/SMESHGUI_SpinBox.h src/SMESHGUI/SMESHGUI_Swig.cxx src/SMESHGUI/SMESHGUI_Swig.hxx src/SMESHGUI/SMESHGUI_Swig.i src/SMESHGUI/SMESH_icons.po src/SMESH_I/SMESH.hxx src/SMESH_I/SMESHEngine.cxx src/SMESH_I/SMESH_1D_Algo_i.cxx src/SMESH_I/SMESH_1D_Algo_i.hxx src/SMESH_I/SMESH_2D_Algo_i.cxx src/SMESH_I/SMESH_2D_Algo_i.hxx src/SMESH_I/SMESH_3D_Algo_i.cxx src/SMESH_I/SMESH_3D_Algo_i.hxx src/SMESH_I/SMESH_Algo_i.cxx src/SMESH_I/SMESH_Algo_i.hxx src/SMESH_I/SMESH_Gen_i_1.cxx src/SMESH_I/SMESH_Group_i.hxx src/SMESH_I/SMESH_Hypothesis_i.cxx src/SMESH_I/SMESH_Hypothesis_i.hxx src/SMESH_I/SMESH_MEDFamily_i.cxx src/SMESH_I/SMESH_MEDFamily_i.hxx src/SMESH_I/SMESH_MEDMesh_i.cxx src/SMESH_I/SMESH_MEDSupport_i.cxx src/SMESH_I/SMESH_MEDSupport_i.hxx src/SMESH_I/SMESH_Mesh_i.hxx src/SMESH_I/SMESH_Pattern_i.hxx src/SMESH_I/SMESH_subMesh_i.cxx src/SMESH_I/SMESH_subMesh_i.hxx src/SMESH_I/smeshpy.py src/SMESH_SWIG/Makefile.in src/SMESH_SWIG/PAL_MESH_041_mesh.py src/SMESH_SWIG/PAL_MESH_043_2D.py src/SMESH_SWIG/PAL_MESH_043_3D.py src/SMESH_SWIG/SMESH_BelongToGeom.py src/SMESH_SWIG/SMESH_GroupFromGeom.py src/SMESH_SWIG/SMESH_GroupFromGeom2.py src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py src/SMESH_SWIG/SMESH_Partition1_tetra.py src/SMESH_SWIG/SMESH_Sphere.py src/SMESH_SWIG/SMESH_blocks.py src/SMESH_SWIG/SMESH_box.py src/SMESH_SWIG/SMESH_box2_tetra.py src/SMESH_SWIG/SMESH_box3_tetra.py src/SMESH_SWIG/SMESH_box_tetra.py src/SMESH_SWIG/SMESH_controls.py src/SMESH_SWIG/SMESH_demo_hexa2_upd.py src/SMESH_SWIG/SMESH_fixation.py src/SMESH_SWIG/SMESH_fixation_hexa.py src/SMESH_SWIG/SMESH_fixation_tetra.py src/SMESH_SWIG/SMESH_freebord.py src/SMESH_SWIG/SMESH_hexaedre.py src/SMESH_SWIG/SMESH_mechanic.py src/SMESH_SWIG/SMESH_mechanic_editor.py src/SMESH_SWIG/SMESH_mechanic_tetra.py src/SMESH_SWIG/SMESH_shared_modules.py src/SMESH_SWIG/SMESH_test.py src/SMESH_SWIG/SMESH_test0.py src/SMESH_SWIG/SMESH_test1.py src/SMESH_SWIG/SMESH_test2.py src/SMESH_SWIG/SMESH_test3.py src/SMESH_SWIG/SMESH_test4.py src/SMESH_SWIG/batchmode_mefisto.py src/SMESH_SWIG/batchmode_smesh.py src/SMESH_SWIG/ex00_all.py src/SMESH_SWIG/ex01_cube2build.py src/SMESH_SWIG/ex02_cube2primitive.py src/SMESH_SWIG/ex03_cube2partition.py src/SMESH_SWIG/ex04_cube5tetraHexa.py src/SMESH_SWIG/ex05_hole1build.py src/SMESH_SWIG/ex06_hole1boolean.py src/SMESH_SWIG/ex07_hole1partition.py src/SMESH_SWIG/ex08_hole2build.py src/SMESH_SWIG/ex09_grid4build.py src/SMESH_SWIG/ex10_grid4geometry.py src/SMESH_SWIG/ex11_grid3partition.py src/SMESH_SWIG/ex12_grid17partition.py src/SMESH_SWIG/ex13_hole1partial.py src/SMESH_SWIG/ex14_cyl1holed.py src/SMESH_SWIG/ex15_cyl2geometry.py src/SMESH_SWIG/ex16_cyl2complementary.py src/SMESH_SWIG/ex17_dome1.py src/SMESH_SWIG/ex18_dome2.py src/SMESH_SWIG/ex19_sphereINcube.py src/SMESH_SWIG/libSMESH_Swig.i src/StdMeshers/StdMeshers_Arithmetic1D.cxx src/StdMeshers/StdMeshers_Arithmetic1D.hxx src/StdMeshers/StdMeshers_Deflection1D.cxx src/StdMeshers/StdMeshers_Deflection1D.hxx src/StdMeshers/StdMeshers_Hexa_3D.cxx src/StdMeshers/StdMeshers_Hexa_3D.hxx src/StdMeshers/StdMeshers_LengthFromEdges.cxx src/StdMeshers/StdMeshers_LengthFromEdges.hxx src/StdMeshers/StdMeshers_LocalLength.cxx src/StdMeshers/StdMeshers_LocalLength.hxx src/StdMeshers/StdMeshers_MEFISTO_2D.cxx src/StdMeshers/StdMeshers_MEFISTO_2D.hxx src/StdMeshers/StdMeshers_MaxElementArea.cxx src/StdMeshers/StdMeshers_MaxElementArea.hxx src/StdMeshers/StdMeshers_MaxElementVolume.cxx src/StdMeshers/StdMeshers_MaxElementVolume.hxx src/StdMeshers/StdMeshers_NotConformAllowed.cxx src/StdMeshers/StdMeshers_NotConformAllowed.hxx src/StdMeshers/StdMeshers_Penta_3D.cxx src/StdMeshers/StdMeshers_Penta_3D.hxx src/StdMeshers/StdMeshers_Propagation.cxx src/StdMeshers/StdMeshers_Propagation.hxx src/StdMeshers/StdMeshers_StartEndLength.cxx src/StdMeshers/StdMeshers_StartEndLength.hxx src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx src/StdMeshers_I/StdMeshers_LocalLength_i.hxx src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx src/StdMeshers_I/StdMeshers_Propagation_i.cxx src/StdMeshers_I/StdMeshers_Propagation_i.hxx src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx --- ChangeLog | 1811 -- LICENCE | 504 - adm_local/unix/config_files/check_Geom.m4 | 45 - adm_local/unix/config_files/check_Med.m4 | 45 - adm_local/unix/make_conclude.in | 342 - adm_local/unix/make_omniorb.in | 59 - cvs-tags | 35 - doc/Makefile.in | 40 - doc/salome/AddNetgenInSalome2.pdf | Bin 70678 -> 0 bytes doc/salome/AddNetgenInSalome2.ps | 13935 ---------------- doc/salome/AddNetgenInSalome2.sxw | Bin 13363 -> 0 bytes doc/salome/PluginMeshers.txt | 188 - doc/salome/gui/Makefile.in | 33 - doc/salome/gui/SMESH/i_blue.jpg | Bin 1337 -> 0 bytes doc/salome/gui/SMESH/image22.gif | Bin 1287 -> 0 bytes doc/salome/gui/SMESH/image22.jpg | Bin 34642 -> 0 bytes doc/salome/gui/SMESH/image23.jpg | Bin 36428 -> 0 bytes doc/salome/gui/SMESH/image24.gif | Bin 14544 -> 0 bytes doc/salome/gui/SMESH/image25.gif | Bin 6114 -> 0 bytes doc/salome/gui/SMESH/image25.jpg | Bin 1025 -> 0 bytes doc/salome/gui/SMESH/image26.jpg | Bin 6922 -> 0 bytes doc/salome/gui/SMESH/image27.jpg | Bin 15997 -> 0 bytes doc/salome/gui/SMESH/image28.gif | Bin 1137 -> 0 bytes doc/salome/gui/SMESH/image30.jpg | Bin 30000 -> 0 bytes doc/salome/gui/SMESH/image31.jpg | Bin 29277 -> 0 bytes doc/salome/gui/SMESH/image32.gif | Bin 980 -> 0 bytes doc/salome/gui/SMESH/image32.jpg | Bin 14908 -> 0 bytes doc/salome/gui/SMESH/image33.gif | Bin 987 -> 0 bytes doc/salome/gui/SMESH/image34.gif | Bin 974 -> 0 bytes doc/salome/gui/SMESH/image35.gif | Bin 964 -> 0 bytes doc/salome/gui/SMESH/image36.gif | Bin 987 -> 0 bytes doc/salome/gui/SMESH/image36.jpg | Bin 13508 -> 0 bytes doc/salome/gui/SMESH/image37.gif | Bin 1001 -> 0 bytes doc/salome/gui/SMESH/image38.gif | Bin 970 -> 0 bytes doc/salome/gui/SMESH/image38.jpg | Bin 14183 -> 0 bytes doc/salome/gui/SMESH/image39.gif | Bin 997 -> 0 bytes doc/salome/gui/SMESH/image40.gif | Bin 1000 -> 0 bytes doc/salome/gui/SMESH/image41.gif | Bin 2145 -> 0 bytes doc/salome/gui/SMESH/image46.gif | Bin 2274 -> 0 bytes doc/salome/gui/SMESH/image51.jpg | Bin 22124 -> 0 bytes doc/salome/gui/SMESH/image52.jpg | Bin 22197 -> 0 bytes doc/salome/gui/SMESH/image63.gif | Bin 929 -> 0 bytes doc/salome/gui/SMESH/image64.gif | Bin 954 -> 0 bytes doc/salome/gui/SMESH/image67.gif | Bin 945 -> 0 bytes doc/salome/gui/SMESH/image70.gif | Bin 979 -> 0 bytes doc/salome/gui/SMESH/image70.jpg | Bin 12029 -> 0 bytes doc/salome/gui/SMESH/image71.gif | Bin 988 -> 0 bytes doc/salome/gui/SMESH/image71.jpg | Bin 11550 -> 0 bytes doc/salome/gui/SMESH/image73.gif | Bin 2977 -> 0 bytes doc/salome/gui/SMESH/image74.gif | Bin 987 -> 0 bytes doc/salome/gui/SMESH/image76.jpg | Bin 22981 -> 0 bytes doc/salome/gui/SMESH/image77.jpg | Bin 26424 -> 0 bytes doc/salome/gui/SMESH/image78.jpg | Bin 25224 -> 0 bytes doc/salome/gui/SMESH/image79.gif | Bin 956 -> 0 bytes doc/salome/gui/SMESH/image80.gif | Bin 977 -> 0 bytes doc/salome/gui/SMESH/image82.gif | Bin 984 -> 0 bytes doc/salome/gui/SMESH/image83.gif | Bin 4552 -> 0 bytes doc/salome/gui/SMESH/image84.gif | Bin 956 -> 0 bytes doc/salome/gui/SMESH/image88.gif | Bin 942 -> 0 bytes doc/salome/gui/SMESH/image91.gif | Bin 975 -> 0 bytes doc/salome/gui/SMESH/image92.gif | Bin 984 -> 0 bytes doc/salome/gui/SMESH/image94.gif | Bin 5678 -> 0 bytes doc/salome/gui/SMESH/image95.gif | Bin 3941 -> 0 bytes doc/salome/gui/SMESH/image96.gif | Bin 4286 -> 0 bytes doc/salome/gui/SMESH/image97.gif | Bin 6203 -> 0 bytes doc/salome/gui/SMESH/image98.gif | Bin 965 -> 0 bytes doc/salome/gui/SMESH/note1.gif | Bin 1505 -> 0 bytes doc/salome/gui/SMESH/pics/exemple.gif | Bin 1340 -> 0 bytes .../gui/SMESH/texture_horiz_ltbluebubbles.jpg | Bin 1255 -> 0 bytes doc/salome/gui/SMESH/whestart.ico | Bin 10134 -> 0 bytes doc/salome/gui/SMESH/whgdata/whexpbar.gif | Bin 67 -> 0 bytes doc/salome/gui/SMESH/whrstart.ico | Bin 10134 -> 0 bytes doc/salome/gui/SMESH/whstart.ico | Bin 10134 -> 0 bytes doc/salome/gui/SMESH/wht_fts_h.gif | Bin 188 -> 0 bytes doc/salome/gui/SMESH/wht_fts_n.gif | Bin 188 -> 0 bytes doc/salome/gui/SMESH/wht_glo_h.gif | Bin 142 -> 0 bytes doc/salome/gui/SMESH/wht_glo_n.gif | Bin 142 -> 0 bytes doc/salome/gui/SMESH/wht_go.gif | Bin 260 -> 0 bytes doc/salome/gui/SMESH/wht_hide.gif | Bin 842 -> 0 bytes doc/salome/gui/SMESH/wht_idx_h.gif | Bin 168 -> 0 bytes doc/salome/gui/SMESH/wht_idx_n.gif | Bin 168 -> 0 bytes doc/salome/gui/SMESH/wht_logo1.gif | Bin 1405 -> 0 bytes doc/salome/gui/SMESH/wht_logo2.gif | Bin 1393 -> 0 bytes doc/salome/gui/SMESH/wht_next.gif | Bin 73 -> 0 bytes doc/salome/gui/SMESH/wht_next_g.gif | Bin 73 -> 0 bytes doc/salome/gui/SMESH/wht_prev.gif | Bin 73 -> 0 bytes doc/salome/gui/SMESH/wht_prev_g.gif | Bin 73 -> 0 bytes doc/salome/gui/SMESH/wht_spac.gif | Bin 43 -> 0 bytes doc/salome/gui/SMESH/wht_sync.gif | Bin 846 -> 0 bytes doc/salome/gui/SMESH/wht_tab0.gif | Bin 285 -> 0 bytes doc/salome/gui/SMESH/wht_tab1.gif | Bin 237 -> 0 bytes doc/salome/gui/SMESH/wht_tab2.gif | Bin 226 -> 0 bytes doc/salome/gui/SMESH/wht_tab3.gif | Bin 209 -> 0 bytes doc/salome/gui/SMESH/wht_tab4.gif | Bin 198 -> 0 bytes doc/salome/gui/SMESH/wht_tab5.gif | Bin 221 -> 0 bytes doc/salome/gui/SMESH/wht_tab6.gif | Bin 212 -> 0 bytes doc/salome/gui/SMESH/wht_tab7.gif | Bin 236 -> 0 bytes doc/salome/gui/SMESH/wht_tab8.gif | Bin 225 -> 0 bytes doc/salome/gui/SMESH/wht_toc1.gif | Bin 124 -> 0 bytes doc/salome/gui/SMESH/wht_toc2.gif | Bin 922 -> 0 bytes doc/salome/gui/SMESH/wht_toc3.gif | Bin 911 -> 0 bytes doc/salome/gui/SMESH/wht_toc4.gif | Bin 953 -> 0 bytes doc/salome/gui/SMESH/wht_toc_h.gif | Bin 204 -> 0 bytes doc/salome/gui/SMESH/wht_toc_n.gif | Bin 195 -> 0 bytes doc/salome/gui/SMESH/wht_ws.gif | Bin 973 -> 0 bytes doc/salome/gui/SMESH/wht_ws_g.gif | Bin 949 -> 0 bytes doc/salome/tui/Makefile.in | 58 - .../tui/SMESH/HTML/SMESH_BasicHypothesis.html | 186 - doc/salome/tui/SMESH/HTML/SMESH_Gen.html | 58 - .../tui/SMESH/HTML/SMESH_Hypothesis.html | 58 - doc/salome/tui/SMESH/HTML/SMESH_Mesh.html | 306 - .../tui/SMESH/sources/Application-About.png | Bin 19226 -> 0 bytes .../tui/SMESH/sources/Application-About1.jpg | Bin 14327 -> 0 bytes doc/salome/tui/SMESH/sources/application.gif | Bin 2602 -> 0 bytes doc/salome/tui/SMESH/sources/application.jpg | Bin 792 -> 0 bytes doc/salome/tui/SMESH/sources/bg_salome.gif | Bin 17294 -> 0 bytes doc/salome/tui/SMESH/sources/logocorp.gif | Bin 1792 -> 0 bytes doc/salome/tui/SMESH/sources/myheader.html | 24 - .../tui/SMESH/sources/myheader_py2.html | 24 - doc/salome/tui/SMESH/sources/occ.gif | Bin 14790 -> 0 bytes .../SMESH/sources/static/PluginMeshers.html | 344 - .../tui/SMESH/sources/static/doxygen.css | 49 - .../tui/SMESH/sources/static/page2.html | 50 - .../tui/SMESH/sources/static/treeview.js | 505 - idl/Makefile.in | 74 - idl/SMESH_Group.idl | 123 - idl/SMESH_Hypothesis.idl | 102 - idl/SMESH_Pattern.idl | 189 - resources/ModuleMesh.png | Bin 2629 -> 0 bytes resources/SMESH.config | 2 - resources/SMESH_en.xml | 483 - resources/SMESH_fr.xml | 262 - resources/advanced_mesh_info.png | Bin 372 -> 0 bytes resources/delete.png | Bin 943 -> 0 bytes resources/mesh.png | Bin 319 -> 0 bytes resources/mesh_add.png | Bin 459 -> 0 bytes resources/mesh_add_sub.png | Bin 408 -> 0 bytes resources/mesh_algo_hexa.png | Bin 371 -> 0 bytes resources/mesh_algo_mefisto.png | Bin 556 -> 0 bytes resources/mesh_algo_netgen.png | Bin 371 -> 0 bytes resources/mesh_algo_quad.png | Bin 493 -> 0 bytes resources/mesh_algo_regular.png | Bin 581 -> 0 bytes resources/mesh_algo_tetra.png | Bin 616 -> 0 bytes resources/mesh_angle.png | Bin 369 -> 0 bytes resources/mesh_area.png | Bin 340 -> 0 bytes resources/mesh_aspect.png | Bin 419 -> 0 bytes resources/mesh_aspect_3d.png | Bin 482 -> 0 bytes resources/mesh_compute.png | Bin 826 -> 0 bytes resources/mesh_connectivity.png | Bin 346 -> 0 bytes resources/mesh_cutGroups.png | Bin 340 -> 0 bytes resources/mesh_cutquad.png | Bin 417 -> 0 bytes resources/mesh_deleteGroups.png | Bin 212 -> 0 bytes resources/mesh_diagonal.png | Bin 435 -> 0 bytes resources/mesh_edit.png | Bin 547 -> 0 bytes resources/mesh_edit_group.png | Bin 543 -> 0 bytes resources/mesh_extrusion.png | Bin 427 -> 0 bytes resources/mesh_extrusionpath.png | Bin 389 -> 0 bytes resources/mesh_free_edges.png | Bin 489 -> 0 bytes resources/mesh_free_edges_2d.png | Bin 501 -> 0 bytes resources/mesh_hexa.png | Bin 296 -> 0 bytes resources/mesh_hexa_n.png | Bin 681 -> 0 bytes resources/mesh_hypo_area.png | Bin 536 -> 0 bytes resources/mesh_hypo_edit.png | Bin 914 -> 0 bytes resources/mesh_hypo_length.png | Bin 641 -> 0 bytes resources/mesh_hypo_segment.png | Bin 610 -> 0 bytes resources/mesh_hypo_volume.png | Bin 376 -> 0 bytes resources/mesh_info.png | Bin 254 -> 0 bytes resources/mesh_init.png | Bin 420 -> 0 bytes resources/mesh_intersectGroups.png | Bin 324 -> 0 bytes resources/mesh_length.png | Bin 342 -> 0 bytes resources/mesh_length_2d.png | Bin 461 -> 0 bytes resources/mesh_line.png | Bin 164 -> 0 bytes resources/mesh_line_n.png | Bin 363 -> 0 bytes resources/mesh_make_group.png | Bin 432 -> 0 bytes resources/mesh_merge_elements.png | Bin 258 -> 0 bytes resources/mesh_merge_nodes.png | Bin 560 -> 0 bytes resources/mesh_move_node.png | Bin 285 -> 0 bytes resources/mesh_multi_edges.png | Bin 480 -> 0 bytes resources/mesh_multi_edges_2d.png | Bin 508 -> 0 bytes resources/mesh_orientation.png | Bin 351 -> 0 bytes resources/mesh_pattern.png | Bin 292 -> 0 bytes resources/mesh_points.png | Bin 499 -> 0 bytes resources/mesh_polygon.png | Bin 231 -> 0 bytes resources/mesh_polyhedron.png | Bin 400 -> 0 bytes resources/mesh_pyramid.png | Bin 278 -> 0 bytes resources/mesh_pyramid_n.png | Bin 621 -> 0 bytes resources/mesh_quad.png | Bin 214 -> 0 bytes resources/mesh_quad_n.png | Bin 512 -> 0 bytes resources/mesh_rem_element.png | Bin 313 -> 0 bytes resources/mesh_rem_node.png | Bin 225 -> 0 bytes resources/mesh_remove.png | Bin 386 -> 0 bytes resources/mesh_renumbering_elements.png | Bin 346 -> 0 bytes resources/mesh_renumbering_nodes.png | Bin 388 -> 0 bytes resources/mesh_revolution.png | Bin 450 -> 0 bytes resources/mesh_rotation.png | Bin 646 -> 0 bytes resources/mesh_set_algo.png | Bin 263 -> 0 bytes resources/mesh_set_hypo.png | Bin 235 -> 0 bytes resources/mesh_sew_bordertoside.png | Bin 359 -> 0 bytes resources/mesh_sew_conform_freeborders.png | Bin 419 -> 0 bytes resources/mesh_sew_freeborders.png | Bin 412 -> 0 bytes resources/mesh_sew_sideelements.png | Bin 295 -> 0 bytes resources/mesh_shading.png | Bin 352 -> 0 bytes resources/mesh_shrink.png | Bin 483 -> 0 bytes resources/mesh_skew.png | Bin 351 -> 0 bytes resources/mesh_smoothing.png | Bin 416 -> 0 bytes resources/mesh_symmetry_axis.png | Bin 430 -> 0 bytes resources/mesh_symmetry_plane.png | Bin 426 -> 0 bytes resources/mesh_symmetry_point.png | Bin 430 -> 0 bytes resources/mesh_taper.png | Bin 393 -> 0 bytes resources/mesh_tetra.png | Bin 267 -> 0 bytes resources/mesh_tetra_n.png | Bin 585 -> 0 bytes resources/mesh_translation_points.png | Bin 469 -> 0 bytes resources/mesh_translation_vector.png | Bin 458 -> 0 bytes resources/mesh_tree_algo.png | Bin 169 -> 0 bytes resources/mesh_tree_algo_hexa.png | Bin 148 -> 0 bytes resources/mesh_tree_algo_mefisto.png | Bin 182 -> 0 bytes resources/mesh_tree_algo_netgen.png | Bin 148 -> 0 bytes resources/mesh_tree_algo_quad.png | Bin 161 -> 0 bytes resources/mesh_tree_algo_regular.png | Bin 134 -> 0 bytes resources/mesh_tree_algo_tetra.png | Bin 281 -> 0 bytes resources/mesh_tree_group.png | Bin 411 -> 0 bytes resources/mesh_tree_hypo.png | Bin 153 -> 0 bytes resources/mesh_tree_hypo_area.png | Bin 163 -> 0 bytes resources/mesh_tree_hypo_length.png | Bin 153 -> 0 bytes resources/mesh_tree_hypo_segment.png | Bin 142 -> 0 bytes resources/mesh_tree_hypo_volume.png | Bin 159 -> 0 bytes resources/mesh_tree_importedmesh.png | Bin 912 -> 0 bytes resources/mesh_tree_mesh.png | Bin 186 -> 0 bytes resources/mesh_tree_mesh_warn.png | Bin 166 -> 0 bytes resources/mesh_triangle.png | Bin 215 -> 0 bytes resources/mesh_triangle_n.png | Bin 446 -> 0 bytes resources/mesh_union2tri.png | Bin 504 -> 0 bytes resources/mesh_unionGroups.png | Bin 425 -> 0 bytes resources/mesh_uniontri.png | Bin 417 -> 0 bytes resources/mesh_update.png | Bin 554 -> 0 bytes resources/mesh_vertex.png | Bin 104 -> 0 bytes resources/mesh_vertex_n.png | Bin 235 -> 0 bytes resources/mesh_wireframe.png | Bin 322 -> 0 bytes resources/mesh_wrap.png | Bin 454 -> 0 bytes resources/pattern_sample_2d.png | Bin 1180 -> 0 bytes resources/pattern_sample_3D.png | Bin 2160 -> 0 bytes resources/select1.png | Bin 976 -> 0 bytes resources/standard_mesh_info.png | Bin 355 -> 0 bytes src/Controls/SMESHControls.cxx | 45 - src/Controls/SMESH_Controls.hxx | 43 - src/Controls/SMESH_ControlsDef.hxx | 660 - src/Driver/Driver_Document.cxx | 36 - src/Driver/Driver_Document.h | 44 - src/Driver/Driver_Mesh.cxx | 46 - src/Driver/Driver_Mesh.h | 63 - src/Driver/Driver_SMDS_Mesh.cxx | 31 - src/Driver/Driver_SMDS_Mesh.h | 38 - src/Driver/Driver_SMESHDS_Mesh.cxx | 31 - src/Driver/Driver_SMESHDS_Mesh.h | 44 - src/Driver/Makefile.in | 60 - src/DriverDAT/DAT_Test.cxx | 28 - src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx | 170 - src/DriverDAT/DriverDAT_R_SMDS_Mesh.h | 31 - .../DriverDAT_R_SMESHDS_Document.cxx | 20 - src/DriverDAT/DriverDAT_R_SMESHDS_Document.h | 28 - src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx | 20 - src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h | 28 - src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx | 144 - src/DriverDAT/DriverDAT_W_SMDS_Mesh.h | 38 - .../DriverDAT_W_SMESHDS_Document.cxx | 20 - src/DriverDAT/DriverDAT_W_SMESHDS_Document.h | 28 - src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx | 20 - src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h | 35 - src/DriverMED/DriverMED_Family.cxx | 390 - src/DriverMED/DriverMED_Family.h | 120 - src/DriverMED/DriverMED_R_SMDS_Mesh.cxx | 20 - src/DriverMED/DriverMED_R_SMDS_Mesh.h | 28 - .../DriverMED_R_SMESHDS_Document.cxx | 20 - src/DriverMED/DriverMED_R_SMESHDS_Document.h | 28 - src/DriverMED/DriverMED_R_SMESHDS_Mesh.h | 69 - src/DriverMED/DriverMED_W_SMDS_Mesh.cxx | 20 - src/DriverMED/DriverMED_W_SMDS_Mesh.h | 28 - .../DriverMED_W_SMESHDS_Document.cxx | 27 - src/DriverMED/DriverMED_W_SMESHDS_Document.h | 28 - src/DriverMED/DriverMED_W_SMESHDS_Mesh.h | 83 - src/DriverMED/MED_Test.cxx | 28 - src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx | 343 - src/DriverSTL/DriverSTL_R_SMDS_Mesh.h | 45 - src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx | 261 - src/DriverSTL/DriverSTL_W_SMDS_Mesh.h | 51 - src/DriverSTL/STL_Test.cxx | 28 - src/DriverUNV/DriverUNV_R_SMDS_Mesh.h | 33 - .../DriverUNV_R_SMESHDS_Document.cxx | 20 - src/DriverUNV/DriverUNV_R_SMESHDS_Document.h | 28 - src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx | 20 - src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h | 28 - src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx | 186 - src/DriverUNV/DriverUNV_W_SMDS_Mesh.h | 32 - .../DriverUNV_W_SMESHDS_Document.cxx | 20 - src/DriverUNV/DriverUNV_W_SMESHDS_Document.h | 28 - src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx | 20 - src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h | 28 - src/DriverUNV/UNV2411_Structure.cxx | 124 - src/DriverUNV/UNV2411_Structure.hxx | 46 - src/DriverUNV/UNV2412_Structure.cxx | 203 - src/DriverUNV/UNV2412_Structure.hxx | 61 - src/DriverUNV/UNV_Test.cxx | 69 - src/DriverUNV/UNV_Utilities.cxx | 37 - src/DriverUNV/UNV_Utilities.hxx | 104 - src/MEFISTO2/Rn.h | 230 - src/MEFISTO2/aptrte.cxx | 786 - src/MEFISTO2/aptrte.h | 255 - src/MEFISTO2/areteideale.f | 30 - src/MEFISTO2/trte.f | 8332 --------- src/Makefile.in | 39 - src/NETGEN/Makefile.in | 152 - src/NETGEN/ReadMeForNgUsers | 102 - src/NETGEN/netgen43ForSalome.patch | 221 - src/NETGENPlugin/Makefile.in | 67 - src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx | 85 - src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx | 58 - src/NETGENPlugin/NETGENPlugin_i.cxx | 60 - src/NETGENPlugin/NETGENPlugin_icons.po | 20 - src/OBJECT/Makefile.in | 58 - src/OBJECT/SMESH_Actor.cxx | 1627 -- src/OBJECT/SMESH_Actor.h | 121 - src/OBJECT/SMESH_ActorDef.h | 277 - src/OBJECT/SMESH_ActorUtils.cxx | 101 - src/OBJECT/SMESH_ActorUtils.h | 41 - src/OBJECT/SMESH_DeviceActor.cxx | 676 - src/OBJECT/SMESH_DeviceActor.h | 155 - src/OBJECT/SMESH_ExtractGeometry.cxx | 254 - src/OBJECT/SMESH_ExtractGeometry.h | 61 - src/OBJECT/SMESH_Object.cxx | 1270 -- src/OBJECT/SMESH_Object.h | 70 - src/OBJECT/SMESH_ObjectDef.h | 202 - src/SMDS/Makefile.in | 143 - src/SMDS/SMDSAbs_ElementType.hxx | 41 - src/SMDS/SMDS_EdgePosition.cxx | 76 - src/SMDS/SMDS_EdgePosition.hxx | 60 - src/SMDS/SMDS_ElemIterator.hxx | 40 - src/SMDS/SMDS_FaceOfEdges.cxx | 157 - src/SMDS/SMDS_FaceOfEdges.hxx | 59 - src/SMDS/SMDS_FaceOfNodes.cxx | 177 - src/SMDS/SMDS_FaceOfNodes.hxx | 57 - src/SMDS/SMDS_FacePosition.cxx | 98 - src/SMDS/SMDS_FacePosition.hxx | 61 - src/SMDS/SMDS_Iterator.hxx | 46 - src/SMDS/SMDS_IteratorOfElements.cxx | 106 - src/SMDS/SMDS_IteratorOfElements.hxx | 52 - src/SMDS/SMDS_Mesh.cxx | 2203 --- src/SMDS/SMDS_Mesh.hxx | 362 - src/SMDS/SMDS_MeshEdge.cxx | 150 - src/SMDS/SMDS_MeshEdge.hxx | 55 - src/SMDS/SMDS_MeshElement.cxx | 194 - src/SMDS/SMDS_MeshElement.hxx | 87 - src/SMDS/SMDS_MeshElementIDFactory.cxx | 169 - src/SMDS/SMDS_MeshElementIDFactory.hxx | 63 - src/SMDS/SMDS_MeshFace.cxx | 27 - src/SMDS/SMDS_MeshFace.hxx | 38 - src/SMDS/SMDS_MeshGroup.cxx | 163 - src/SMDS/SMDS_MeshGroup.hxx | 87 - src/SMDS/SMDS_MeshIDFactory.cxx | 83 - src/SMDS/SMDS_MeshIDFactory.hxx | 46 - src/SMDS/SMDS_MeshNode.cxx | 246 - src/SMDS/SMDS_MeshNode.hxx | 77 - src/SMDS/SMDS_MeshObject.cxx | 28 - src/SMDS/SMDS_MeshObject.hxx | 48 - src/SMDS/SMDS_MeshVolume.cxx | 38 - src/SMDS/SMDS_MeshVolume.hxx | 38 - src/SMDS/SMDS_PolygonalFaceOfNodes.cxx | 174 - src/SMDS/SMDS_PolygonalFaceOfNodes.hxx | 60 - src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx | 190 - src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx | 77 - src/SMDS/SMDS_Position.cxx | 76 - src/SMDS/SMDS_Position.hxx | 68 - src/SMDS/SMDS_SpacePosition.cxx | 59 - src/SMDS/SMDS_SpacePosition.hxx | 57 - src/SMDS/SMDS_TypeOfPosition.hxx | 39 - src/SMDS/SMDS_VertexPosition.cxx | 60 - src/SMDS/SMDS_VertexPosition.hxx | 53 - src/SMDS/SMDS_VolumeOfFaces.cxx | 138 - src/SMDS/SMDS_VolumeOfFaces.hxx | 66 - src/SMDS/SMDS_VolumeOfNodes.cxx | 212 - src/SMDS/SMDS_VolumeOfNodes.hxx | 79 - src/SMDS/SMDS_VolumeTool.hxx | 265 - src/SMESH/SMESH_1D_Algo.cxx | 57 - src/SMESH/SMESH_1D_Algo.hxx | 42 - src/SMESH/SMESH_2D_Algo.cxx | 92 - src/SMESH/SMESH_2D_Algo.hxx | 46 - src/SMESH/SMESH_3D_Algo.cxx | 58 - src/SMESH/SMESH_3D_Algo.hxx | 42 - src/SMESH/SMESH_Block.cxx | 1391 -- src/SMESH/SMESH_Block.hxx | 275 - src/SMESH/SMESH_Group.cxx | 66 - src/SMESH/SMESH_Group.hxx | 67 - src/SMESH/SMESH_HypoFilter.cxx | 305 - src/SMESH/SMESH_HypoFilter.hxx | 164 - src/SMESH/SMESH_Hypothesis.cxx | 162 - src/SMESH/SMESH_Hypothesis.hxx | 74 - src/SMESH/SMESH_Mesh.cxx | 1430 -- src/SMESH/SMESH_Mesh.hxx | 256 - src/SMESH/SMESH_subMesh.hxx | 182 - src/SMESHDS/Makefile.in | 83 - src/SMESHDS/SMESHDS_Command.cxx | 410 - src/SMESHDS/SMESHDS_Command.hxx | 76 - src/SMESHDS/SMESHDS_CommandType.hxx | 52 - src/SMESHDS/SMESHDS_Document.cxx | 192 - src/SMESHDS/SMESHDS_Document.hxx | 63 - src/SMESHDS/SMESHDS_Group.cxx | 164 - src/SMESHDS/SMESHDS_Group.hxx | 68 - src/SMESHDS/SMESHDS_GroupBase.cxx | 150 - src/SMESHDS/SMESHDS_GroupBase.hxx | 90 - src/SMESHDS/SMESHDS_GroupOnGeom.cxx | 112 - src/SMESHDS/SMESHDS_GroupOnGeom.hxx | 56 - src/SMESHDS/SMESHDS_Hypothesis.cxx | 98 - src/SMESHDS/SMESHDS_Hypothesis.hxx | 56 - src/SMESHDS/SMESHDS_Mesh.cxx | 1065 -- src/SMESHDS/SMESHDS_Script.cxx | 247 - src/SMESHDS/SMESHDS_Script.hxx | 77 - src/SMESHDS/SMESHDS_SubMesh.cxx | 299 - src/SMESHDS/SMESHDS_SubMesh.hxx | 69 - .../Handle_SMESH_TypeFilter.hxx | 89 - .../SMESH_TypeFilter.ixx | 71 - src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h | 94 - src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx | 963 -- src/SMESHGUI/SMESHGUI_Filter.cxx | 497 - src/SMESHGUI/SMESHGUI_Filter.h | 191 - src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx | 1133 -- src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h | 157 - src/SMESHGUI/SMESHGUI_FilterUtils.cxx | 37 - src/SMESHGUI/SMESHGUI_FilterUtils.h | 34 - src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx | 92 - src/SMESHGUI/SMESHGUI_GEOMGenUtils.h | 39 - src/SMESHGUI/SMESHGUI_GroupDlg.cxx | 1448 -- src/SMESHGUI/SMESHGUI_GroupUtils.cxx | 53 - src/SMESHGUI/SMESHGUI_GroupUtils.h | 36 - src/SMESHGUI/SMESHGUI_IdValidator.h | 68 - src/SMESHGUI/SMESHGUI_MeshUtils.cxx | 47 - src/SMESHGUI/SMESHGUI_MeshUtils.h | 36 - src/SMESHGUI/SMESHGUI_PatternUtils.cxx | 31 - src/SMESHGUI/SMESHGUI_PatternUtils.h | 34 - src/SMESHGUI/SMESHGUI_PatternWidget.cxx | 165 - src/SMESHGUI/SMESHGUI_PatternWidget.h | 74 - src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx | 202 - src/SMESHGUI/SMESHGUI_PrecisionDlg.h | 97 - .../SMESHGUI_Preferences_ColorDlg.cxx | 396 - src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h | 105 - .../SMESHGUI_Preferences_SelectionDlg.cxx | 314 - .../SMESHGUI_Preferences_SelectionDlg.h | 99 - src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx | 486 - src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx | 489 - src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx | 43 - src/SMESHGUI/SMESHGUI_SMESHGenUtils.h | 35 - src/SMESHGUI/SMESHGUI_SpinBox.cxx | 101 - src/SMESHGUI/SMESHGUI_SpinBox.h | 58 - src/SMESHGUI/SMESHGUI_Swig.cxx | 485 - src/SMESHGUI/SMESHGUI_Swig.hxx | 94 - src/SMESHGUI/SMESHGUI_Swig.i | 60 - src/SMESHGUI/SMESH_icons.po | 222 - src/SMESH_I/SMESH.hxx | 56 - src/SMESH_I/SMESHEngine.cxx | 23 - src/SMESH_I/SMESH_1D_Algo_i.cxx | 89 - src/SMESH_I/SMESH_1D_Algo_i.hxx | 56 - src/SMESH_I/SMESH_2D_Algo_i.cxx | 75 - src/SMESH_I/SMESH_2D_Algo_i.hxx | 56 - src/SMESH_I/SMESH_3D_Algo_i.cxx | 76 - src/SMESH_I/SMESH_3D_Algo_i.hxx | 56 - src/SMESH_I/SMESH_Algo_i.cxx | 85 - src/SMESH_I/SMESH_Algo_i.hxx | 56 - src/SMESH_I/SMESH_Gen_i_1.cxx | 845 - src/SMESH_I/SMESH_Group_i.hxx | 115 - src/SMESH_I/SMESH_Hypothesis_i.cxx | 181 - src/SMESH_I/SMESH_Hypothesis_i.hxx | 115 - src/SMESH_I/SMESH_MEDFamily_i.cxx | 300 - src/SMESH_I/SMESH_MEDFamily_i.hxx | 90 - src/SMESH_I/SMESH_MEDMesh_i.cxx | 1206 -- src/SMESH_I/SMESH_MEDSupport_i.cxx | 401 - src/SMESH_I/SMESH_MEDSupport_i.hxx | 111 - src/SMESH_I/SMESH_Mesh_i.hxx | 268 - src/SMESH_I/SMESH_Pattern_i.hxx | 103 - src/SMESH_I/SMESH_subMesh_i.cxx | 487 - src/SMESH_I/SMESH_subMesh_i.hxx | 93 - src/SMESH_I/smeshpy.py | 96 - src/SMESH_SWIG/Makefile.in | 120 - src/SMESH_SWIG/PAL_MESH_041_mesh.py | 103 - src/SMESH_SWIG/PAL_MESH_043_2D.py | 102 - src/SMESH_SWIG/PAL_MESH_043_3D.py | 104 - src/SMESH_SWIG/SMESH_BelongToGeom.py | 28 - src/SMESH_SWIG/SMESH_GroupFromGeom.py | 49 - src/SMESH_SWIG/SMESH_GroupFromGeom2.py | 53 - src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py | 23 - src/SMESH_SWIG/SMESH_Partition1_tetra.py | 200 - src/SMESH_SWIG/SMESH_Sphere.py | 111 - src/SMESH_SWIG/SMESH_blocks.py | 43 - src/SMESH_SWIG/SMESH_box.py | 73 - src/SMESH_SWIG/SMESH_box2_tetra.py | 160 - src/SMESH_SWIG/SMESH_box3_tetra.py | 171 - src/SMESH_SWIG/SMESH_box_tetra.py | 132 - src/SMESH_SWIG/SMESH_controls.py | 209 - src/SMESH_SWIG/SMESH_demo_hexa2_upd.py | 210 - src/SMESH_SWIG/SMESH_fixation.py | 294 - src/SMESH_SWIG/SMESH_fixation_hexa.py | 101 - src/SMESH_SWIG/SMESH_fixation_tetra.py | 131 - src/SMESH_SWIG/SMESH_freebord.py | 66 - src/SMESH_SWIG/SMESH_hexaedre.py | 148 - src/SMESH_SWIG/SMESH_mechanic.py | 257 - src/SMESH_SWIG/SMESH_mechanic_editor.py | 308 - src/SMESH_SWIG/SMESH_mechanic_tetra.py | 212 - src/SMESH_SWIG/SMESH_shared_modules.py | 19 - src/SMESH_SWIG/SMESH_test.py | 200 - src/SMESH_SWIG/SMESH_test0.py | 63 - src/SMESH_SWIG/SMESH_test1.py | 157 - src/SMESH_SWIG/SMESH_test2.py | 65 - src/SMESH_SWIG/SMESH_test3.py | 94 - src/SMESH_SWIG/SMESH_test4.py | 52 - src/SMESH_SWIG/batchmode_mefisto.py | 136 - src/SMESH_SWIG/batchmode_smesh.py | 304 - src/SMESH_SWIG/ex00_all.py | 25 - src/SMESH_SWIG/ex01_cube2build.py | 293 - src/SMESH_SWIG/ex02_cube2primitive.py | 95 - src/SMESH_SWIG/ex03_cube2partition.py | 82 - src/SMESH_SWIG/ex04_cube5tetraHexa.py | 87 - src/SMESH_SWIG/ex05_hole1build.py | 122 - src/SMESH_SWIG/ex06_hole1boolean.py | 139 - src/SMESH_SWIG/ex07_hole1partition.py | 79 - src/SMESH_SWIG/ex08_hole2build.py | 112 - src/SMESH_SWIG/ex09_grid4build.py | 115 - src/SMESH_SWIG/ex10_grid4geometry.py | 77 - src/SMESH_SWIG/ex11_grid3partition.py | 98 - src/SMESH_SWIG/ex12_grid17partition.py | 113 - src/SMESH_SWIG/ex13_hole1partial.py | 231 - src/SMESH_SWIG/ex14_cyl1holed.py | 116 - src/SMESH_SWIG/ex15_cyl2geometry.py | 175 - src/SMESH_SWIG/ex16_cyl2complementary.py | 118 - src/SMESH_SWIG/ex17_dome1.py | 78 - src/SMESH_SWIG/ex18_dome2.py | 115 - src/SMESH_SWIG/ex19_sphereINcube.py | 138 - src/SMESH_SWIG/libSMESH_Swig.i | 30 - src/StdMeshers/StdMeshers_Arithmetic1D.cxx | 139 - src/StdMeshers/StdMeshers_Arithmetic1D.hxx | 55 - src/StdMeshers/StdMeshers_Deflection1D.cxx | 136 - src/StdMeshers/StdMeshers_Deflection1D.hxx | 53 - src/StdMeshers/StdMeshers_Hexa_3D.cxx | 1068 -- src/StdMeshers/StdMeshers_Hexa_3D.hxx | 140 - src/StdMeshers/StdMeshers_LengthFromEdges.cxx | 139 - src/StdMeshers/StdMeshers_LengthFromEdges.hxx | 57 - src/StdMeshers/StdMeshers_LocalLength.cxx | 137 - src/StdMeshers/StdMeshers_LocalLength.hxx | 55 - src/StdMeshers/StdMeshers_MEFISTO_2D.cxx | 872 - src/StdMeshers/StdMeshers_MEFISTO_2D.hxx | 100 - src/StdMeshers/StdMeshers_MaxElementArea.cxx | 139 - src/StdMeshers/StdMeshers_MaxElementArea.hxx | 55 - .../StdMeshers_MaxElementVolume.cxx | 141 - .../StdMeshers_MaxElementVolume.hxx | 57 - .../StdMeshers_NotConformAllowed.cxx | 98 - .../StdMeshers_NotConformAllowed.hxx | 48 - src/StdMeshers/StdMeshers_Penta_3D.cxx | 1582 -- src/StdMeshers/StdMeshers_Penta_3D.hxx | 256 - src/StdMeshers/StdMeshers_Propagation.cxx | 102 - src/StdMeshers/StdMeshers_Propagation.hxx | 47 - src/StdMeshers/StdMeshers_StartEndLength.cxx | 143 - src/StdMeshers/StdMeshers_StartEndLength.hxx | 53 - .../StdMeshers_Arithmetic1D_i.hxx | 66 - .../StdMeshers_Deflection1D_i.hxx | 70 - src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx | 84 - src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx | 61 - .../StdMeshers_LengthFromEdges_i.cxx | 135 - .../StdMeshers_LengthFromEdges_i.hxx | 68 - src/StdMeshers_I/StdMeshers_LocalLength_i.hxx | 70 - src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx | 85 - src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx | 61 - .../StdMeshers_MaxElementArea_i.hxx | 67 - .../StdMeshers_MaxElementVolume_i.hxx | 67 - .../StdMeshers_NotConformAllowed_i.cxx | 81 - .../StdMeshers_NotConformAllowed_i.hxx | 57 - src/StdMeshers_I/StdMeshers_Propagation_i.cxx | 91 - src/StdMeshers_I/StdMeshers_Propagation_i.hxx | 60 - .../StdMeshers_Quadrangle_2D_i.cxx | 86 - .../StdMeshers_Quadrangle_2D_i.hxx | 61 - src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx | 85 - src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx | 58 - .../StdMeshers_StartEndLength_i.hxx | 70 - 578 files changed, 82728 deletions(-) delete mode 100644 ChangeLog delete mode 100644 LICENCE delete mode 100644 adm_local/unix/config_files/check_Geom.m4 delete mode 100644 adm_local/unix/config_files/check_Med.m4 delete mode 100644 adm_local/unix/make_conclude.in delete mode 100644 adm_local/unix/make_omniorb.in delete mode 100644 cvs-tags delete mode 100644 doc/Makefile.in delete mode 100644 doc/salome/AddNetgenInSalome2.pdf delete mode 100644 doc/salome/AddNetgenInSalome2.ps delete mode 100644 doc/salome/AddNetgenInSalome2.sxw delete mode 100644 doc/salome/PluginMeshers.txt delete mode 100644 doc/salome/gui/Makefile.in delete mode 100755 doc/salome/gui/SMESH/i_blue.jpg delete mode 100755 doc/salome/gui/SMESH/image22.gif delete mode 100755 doc/salome/gui/SMESH/image22.jpg delete mode 100755 doc/salome/gui/SMESH/image23.jpg delete mode 100755 doc/salome/gui/SMESH/image24.gif delete mode 100755 doc/salome/gui/SMESH/image25.gif delete mode 100755 doc/salome/gui/SMESH/image25.jpg delete mode 100755 doc/salome/gui/SMESH/image26.jpg delete mode 100755 doc/salome/gui/SMESH/image27.jpg delete mode 100755 doc/salome/gui/SMESH/image28.gif delete mode 100755 doc/salome/gui/SMESH/image30.jpg delete mode 100755 doc/salome/gui/SMESH/image31.jpg delete mode 100755 doc/salome/gui/SMESH/image32.gif delete mode 100755 doc/salome/gui/SMESH/image32.jpg delete mode 100755 doc/salome/gui/SMESH/image33.gif delete mode 100755 doc/salome/gui/SMESH/image34.gif delete mode 100755 doc/salome/gui/SMESH/image35.gif delete mode 100755 doc/salome/gui/SMESH/image36.gif delete mode 100755 doc/salome/gui/SMESH/image36.jpg delete mode 100755 doc/salome/gui/SMESH/image37.gif delete mode 100755 doc/salome/gui/SMESH/image38.gif delete mode 100755 doc/salome/gui/SMESH/image38.jpg delete mode 100755 doc/salome/gui/SMESH/image39.gif delete mode 100755 doc/salome/gui/SMESH/image40.gif delete mode 100755 doc/salome/gui/SMESH/image41.gif delete mode 100755 doc/salome/gui/SMESH/image46.gif delete mode 100755 doc/salome/gui/SMESH/image51.jpg delete mode 100755 doc/salome/gui/SMESH/image52.jpg delete mode 100755 doc/salome/gui/SMESH/image63.gif delete mode 100755 doc/salome/gui/SMESH/image64.gif delete mode 100755 doc/salome/gui/SMESH/image67.gif delete mode 100755 doc/salome/gui/SMESH/image70.gif delete mode 100755 doc/salome/gui/SMESH/image70.jpg delete mode 100755 doc/salome/gui/SMESH/image71.gif delete mode 100755 doc/salome/gui/SMESH/image71.jpg delete mode 100755 doc/salome/gui/SMESH/image73.gif delete mode 100755 doc/salome/gui/SMESH/image74.gif delete mode 100755 doc/salome/gui/SMESH/image76.jpg delete mode 100755 doc/salome/gui/SMESH/image77.jpg delete mode 100755 doc/salome/gui/SMESH/image78.jpg delete mode 100755 doc/salome/gui/SMESH/image79.gif delete mode 100755 doc/salome/gui/SMESH/image80.gif delete mode 100755 doc/salome/gui/SMESH/image82.gif delete mode 100755 doc/salome/gui/SMESH/image83.gif delete mode 100755 doc/salome/gui/SMESH/image84.gif delete mode 100755 doc/salome/gui/SMESH/image88.gif delete mode 100755 doc/salome/gui/SMESH/image91.gif delete mode 100755 doc/salome/gui/SMESH/image92.gif delete mode 100755 doc/salome/gui/SMESH/image94.gif delete mode 100755 doc/salome/gui/SMESH/image95.gif delete mode 100755 doc/salome/gui/SMESH/image96.gif delete mode 100755 doc/salome/gui/SMESH/image97.gif delete mode 100755 doc/salome/gui/SMESH/image98.gif delete mode 100755 doc/salome/gui/SMESH/note1.gif delete mode 100755 doc/salome/gui/SMESH/pics/exemple.gif delete mode 100755 doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg delete mode 100755 doc/salome/gui/SMESH/whestart.ico delete mode 100755 doc/salome/gui/SMESH/whgdata/whexpbar.gif delete mode 100755 doc/salome/gui/SMESH/whrstart.ico delete mode 100755 doc/salome/gui/SMESH/whstart.ico delete mode 100755 doc/salome/gui/SMESH/wht_fts_h.gif delete mode 100755 doc/salome/gui/SMESH/wht_fts_n.gif delete mode 100755 doc/salome/gui/SMESH/wht_glo_h.gif delete mode 100755 doc/salome/gui/SMESH/wht_glo_n.gif delete mode 100755 doc/salome/gui/SMESH/wht_go.gif delete mode 100755 doc/salome/gui/SMESH/wht_hide.gif delete mode 100755 doc/salome/gui/SMESH/wht_idx_h.gif delete mode 100755 doc/salome/gui/SMESH/wht_idx_n.gif delete mode 100755 doc/salome/gui/SMESH/wht_logo1.gif delete mode 100755 doc/salome/gui/SMESH/wht_logo2.gif delete mode 100755 doc/salome/gui/SMESH/wht_next.gif delete mode 100755 doc/salome/gui/SMESH/wht_next_g.gif delete mode 100755 doc/salome/gui/SMESH/wht_prev.gif delete mode 100755 doc/salome/gui/SMESH/wht_prev_g.gif delete mode 100755 doc/salome/gui/SMESH/wht_spac.gif delete mode 100755 doc/salome/gui/SMESH/wht_sync.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab0.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab1.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab2.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab3.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab4.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab5.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab6.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab7.gif delete mode 100755 doc/salome/gui/SMESH/wht_tab8.gif delete mode 100755 doc/salome/gui/SMESH/wht_toc1.gif delete mode 100755 doc/salome/gui/SMESH/wht_toc2.gif delete mode 100755 doc/salome/gui/SMESH/wht_toc3.gif delete mode 100755 doc/salome/gui/SMESH/wht_toc4.gif delete mode 100755 doc/salome/gui/SMESH/wht_toc_h.gif delete mode 100755 doc/salome/gui/SMESH/wht_toc_n.gif delete mode 100755 doc/salome/gui/SMESH/wht_ws.gif delete mode 100755 doc/salome/gui/SMESH/wht_ws_g.gif delete mode 100644 doc/salome/tui/Makefile.in delete mode 100644 doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html delete mode 100644 doc/salome/tui/SMESH/HTML/SMESH_Gen.html delete mode 100644 doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html delete mode 100644 doc/salome/tui/SMESH/HTML/SMESH_Mesh.html delete mode 100755 doc/salome/tui/SMESH/sources/Application-About.png delete mode 100755 doc/salome/tui/SMESH/sources/Application-About1.jpg delete mode 100644 doc/salome/tui/SMESH/sources/application.gif delete mode 100755 doc/salome/tui/SMESH/sources/application.jpg delete mode 100755 doc/salome/tui/SMESH/sources/bg_salome.gif delete mode 100755 doc/salome/tui/SMESH/sources/logocorp.gif delete mode 100755 doc/salome/tui/SMESH/sources/myheader.html delete mode 100755 doc/salome/tui/SMESH/sources/myheader_py2.html delete mode 100755 doc/salome/tui/SMESH/sources/occ.gif delete mode 100755 doc/salome/tui/SMESH/sources/static/PluginMeshers.html delete mode 100755 doc/salome/tui/SMESH/sources/static/doxygen.css delete mode 100755 doc/salome/tui/SMESH/sources/static/page2.html delete mode 100644 doc/salome/tui/SMESH/sources/static/treeview.js delete mode 100644 idl/Makefile.in delete mode 100644 idl/SMESH_Group.idl delete mode 100644 idl/SMESH_Hypothesis.idl delete mode 100644 idl/SMESH_Pattern.idl delete mode 100755 resources/ModuleMesh.png delete mode 100644 resources/SMESH.config delete mode 100644 resources/SMESH_en.xml delete mode 100644 resources/SMESH_fr.xml delete mode 100644 resources/advanced_mesh_info.png delete mode 100644 resources/delete.png delete mode 100644 resources/mesh.png delete mode 100755 resources/mesh_add.png delete mode 100644 resources/mesh_add_sub.png delete mode 100644 resources/mesh_algo_hexa.png delete mode 100644 resources/mesh_algo_mefisto.png delete mode 100644 resources/mesh_algo_netgen.png delete mode 100644 resources/mesh_algo_quad.png delete mode 100644 resources/mesh_algo_regular.png delete mode 100644 resources/mesh_algo_tetra.png delete mode 100644 resources/mesh_angle.png delete mode 100644 resources/mesh_area.png delete mode 100644 resources/mesh_aspect.png delete mode 100644 resources/mesh_aspect_3d.png delete mode 100644 resources/mesh_compute.png delete mode 100644 resources/mesh_connectivity.png delete mode 100644 resources/mesh_cutGroups.png delete mode 100644 resources/mesh_cutquad.png delete mode 100644 resources/mesh_deleteGroups.png delete mode 100644 resources/mesh_diagonal.png delete mode 100644 resources/mesh_edit.png delete mode 100644 resources/mesh_edit_group.png delete mode 100644 resources/mesh_extrusion.png delete mode 100644 resources/mesh_extrusionpath.png delete mode 100755 resources/mesh_free_edges.png delete mode 100644 resources/mesh_free_edges_2d.png delete mode 100644 resources/mesh_hexa.png delete mode 100644 resources/mesh_hexa_n.png delete mode 100644 resources/mesh_hypo_area.png delete mode 100644 resources/mesh_hypo_edit.png delete mode 100644 resources/mesh_hypo_length.png delete mode 100644 resources/mesh_hypo_segment.png delete mode 100644 resources/mesh_hypo_volume.png delete mode 100644 resources/mesh_info.png delete mode 100644 resources/mesh_init.png delete mode 100644 resources/mesh_intersectGroups.png delete mode 100644 resources/mesh_length.png delete mode 100644 resources/mesh_length_2d.png delete mode 100644 resources/mesh_line.png delete mode 100644 resources/mesh_line_n.png delete mode 100644 resources/mesh_make_group.png delete mode 100644 resources/mesh_merge_elements.png delete mode 100644 resources/mesh_merge_nodes.png delete mode 100644 resources/mesh_move_node.png delete mode 100755 resources/mesh_multi_edges.png delete mode 100644 resources/mesh_multi_edges_2d.png delete mode 100644 resources/mesh_orientation.png delete mode 100755 resources/mesh_pattern.png delete mode 100644 resources/mesh_points.png delete mode 100644 resources/mesh_polygon.png delete mode 100644 resources/mesh_polyhedron.png delete mode 100644 resources/mesh_pyramid.png delete mode 100644 resources/mesh_pyramid_n.png delete mode 100644 resources/mesh_quad.png delete mode 100644 resources/mesh_quad_n.png delete mode 100644 resources/mesh_rem_element.png delete mode 100644 resources/mesh_rem_node.png delete mode 100755 resources/mesh_remove.png delete mode 100644 resources/mesh_renumbering_elements.png delete mode 100644 resources/mesh_renumbering_nodes.png delete mode 100644 resources/mesh_revolution.png delete mode 100644 resources/mesh_rotation.png delete mode 100644 resources/mesh_set_algo.png delete mode 100644 resources/mesh_set_hypo.png delete mode 100644 resources/mesh_sew_bordertoside.png delete mode 100644 resources/mesh_sew_conform_freeborders.png delete mode 100644 resources/mesh_sew_freeborders.png delete mode 100644 resources/mesh_sew_sideelements.png delete mode 100644 resources/mesh_shading.png delete mode 100644 resources/mesh_shrink.png delete mode 100644 resources/mesh_skew.png delete mode 100644 resources/mesh_smoothing.png delete mode 100644 resources/mesh_symmetry_axis.png delete mode 100644 resources/mesh_symmetry_plane.png delete mode 100644 resources/mesh_symmetry_point.png delete mode 100644 resources/mesh_taper.png delete mode 100644 resources/mesh_tetra.png delete mode 100644 resources/mesh_tetra_n.png delete mode 100644 resources/mesh_translation_points.png delete mode 100644 resources/mesh_translation_vector.png delete mode 100644 resources/mesh_tree_algo.png delete mode 100644 resources/mesh_tree_algo_hexa.png delete mode 100644 resources/mesh_tree_algo_mefisto.png delete mode 100644 resources/mesh_tree_algo_netgen.png delete mode 100644 resources/mesh_tree_algo_quad.png delete mode 100644 resources/mesh_tree_algo_regular.png delete mode 100644 resources/mesh_tree_algo_tetra.png delete mode 100644 resources/mesh_tree_group.png delete mode 100644 resources/mesh_tree_hypo.png delete mode 100644 resources/mesh_tree_hypo_area.png delete mode 100644 resources/mesh_tree_hypo_length.png delete mode 100644 resources/mesh_tree_hypo_segment.png delete mode 100644 resources/mesh_tree_hypo_volume.png delete mode 100644 resources/mesh_tree_importedmesh.png delete mode 100644 resources/mesh_tree_mesh.png delete mode 100644 resources/mesh_tree_mesh_warn.png delete mode 100644 resources/mesh_triangle.png delete mode 100644 resources/mesh_triangle_n.png delete mode 100644 resources/mesh_union2tri.png delete mode 100644 resources/mesh_unionGroups.png delete mode 100644 resources/mesh_uniontri.png delete mode 100644 resources/mesh_update.png delete mode 100644 resources/mesh_vertex.png delete mode 100644 resources/mesh_vertex_n.png delete mode 100644 resources/mesh_wireframe.png delete mode 100644 resources/mesh_wrap.png delete mode 100755 resources/pattern_sample_2d.png delete mode 100755 resources/pattern_sample_3D.png delete mode 100644 resources/select1.png delete mode 100644 resources/standard_mesh_info.png delete mode 100644 src/Controls/SMESHControls.cxx delete mode 100644 src/Controls/SMESH_Controls.hxx delete mode 100644 src/Controls/SMESH_ControlsDef.hxx delete mode 100644 src/Driver/Driver_Document.cxx delete mode 100644 src/Driver/Driver_Document.h delete mode 100644 src/Driver/Driver_Mesh.cxx delete mode 100644 src/Driver/Driver_Mesh.h delete mode 100644 src/Driver/Driver_SMDS_Mesh.cxx delete mode 100644 src/Driver/Driver_SMDS_Mesh.h delete mode 100644 src/Driver/Driver_SMESHDS_Mesh.cxx delete mode 100644 src/Driver/Driver_SMESHDS_Mesh.h delete mode 100644 src/Driver/Makefile.in delete mode 100644 src/DriverDAT/DAT_Test.cxx delete mode 100644 src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx delete mode 100644 src/DriverDAT/DriverDAT_R_SMDS_Mesh.h delete mode 100644 src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx delete mode 100644 src/DriverDAT/DriverDAT_R_SMESHDS_Document.h delete mode 100644 src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx delete mode 100644 src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h delete mode 100644 src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx delete mode 100644 src/DriverDAT/DriverDAT_W_SMDS_Mesh.h delete mode 100644 src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx delete mode 100644 src/DriverDAT/DriverDAT_W_SMESHDS_Document.h delete mode 100644 src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx delete mode 100644 src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h delete mode 100644 src/DriverMED/DriverMED_Family.cxx delete mode 100644 src/DriverMED/DriverMED_Family.h delete mode 100644 src/DriverMED/DriverMED_R_SMDS_Mesh.cxx delete mode 100644 src/DriverMED/DriverMED_R_SMDS_Mesh.h delete mode 100644 src/DriverMED/DriverMED_R_SMESHDS_Document.cxx delete mode 100644 src/DriverMED/DriverMED_R_SMESHDS_Document.h delete mode 100644 src/DriverMED/DriverMED_R_SMESHDS_Mesh.h delete mode 100644 src/DriverMED/DriverMED_W_SMDS_Mesh.cxx delete mode 100644 src/DriverMED/DriverMED_W_SMDS_Mesh.h delete mode 100644 src/DriverMED/DriverMED_W_SMESHDS_Document.cxx delete mode 100644 src/DriverMED/DriverMED_W_SMESHDS_Document.h delete mode 100644 src/DriverMED/DriverMED_W_SMESHDS_Mesh.h delete mode 100644 src/DriverMED/MED_Test.cxx delete mode 100644 src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx delete mode 100644 src/DriverSTL/DriverSTL_R_SMDS_Mesh.h delete mode 100644 src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx delete mode 100644 src/DriverSTL/DriverSTL_W_SMDS_Mesh.h delete mode 100644 src/DriverSTL/STL_Test.cxx delete mode 100644 src/DriverUNV/DriverUNV_R_SMDS_Mesh.h delete mode 100644 src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx delete mode 100644 src/DriverUNV/DriverUNV_R_SMESHDS_Document.h delete mode 100644 src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx delete mode 100644 src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h delete mode 100644 src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx delete mode 100644 src/DriverUNV/DriverUNV_W_SMDS_Mesh.h delete mode 100644 src/DriverUNV/DriverUNV_W_SMESHDS_Document.cxx delete mode 100644 src/DriverUNV/DriverUNV_W_SMESHDS_Document.h delete mode 100644 src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx delete mode 100644 src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h delete mode 100644 src/DriverUNV/UNV2411_Structure.cxx delete mode 100644 src/DriverUNV/UNV2411_Structure.hxx delete mode 100644 src/DriverUNV/UNV2412_Structure.cxx delete mode 100644 src/DriverUNV/UNV2412_Structure.hxx delete mode 100644 src/DriverUNV/UNV_Test.cxx delete mode 100644 src/DriverUNV/UNV_Utilities.cxx delete mode 100644 src/DriverUNV/UNV_Utilities.hxx delete mode 100755 src/MEFISTO2/Rn.h delete mode 100755 src/MEFISTO2/aptrte.cxx delete mode 100755 src/MEFISTO2/aptrte.h delete mode 100755 src/MEFISTO2/areteideale.f delete mode 100755 src/MEFISTO2/trte.f delete mode 100644 src/Makefile.in delete mode 100644 src/NETGEN/Makefile.in delete mode 100644 src/NETGEN/ReadMeForNgUsers delete mode 100644 src/NETGEN/netgen43ForSalome.patch delete mode 100644 src/NETGENPlugin/Makefile.in delete mode 100644 src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx delete mode 100644 src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx delete mode 100644 src/NETGENPlugin/NETGENPlugin_i.cxx delete mode 100644 src/NETGENPlugin/NETGENPlugin_icons.po delete mode 100644 src/OBJECT/Makefile.in delete mode 100644 src/OBJECT/SMESH_Actor.cxx delete mode 100644 src/OBJECT/SMESH_Actor.h delete mode 100644 src/OBJECT/SMESH_ActorDef.h delete mode 100644 src/OBJECT/SMESH_ActorUtils.cxx delete mode 100644 src/OBJECT/SMESH_ActorUtils.h delete mode 100644 src/OBJECT/SMESH_DeviceActor.cxx delete mode 100644 src/OBJECT/SMESH_DeviceActor.h delete mode 100644 src/OBJECT/SMESH_ExtractGeometry.cxx delete mode 100644 src/OBJECT/SMESH_ExtractGeometry.h delete mode 100644 src/OBJECT/SMESH_Object.cxx delete mode 100644 src/OBJECT/SMESH_Object.h delete mode 100644 src/OBJECT/SMESH_ObjectDef.h delete mode 100644 src/SMDS/Makefile.in delete mode 100644 src/SMDS/SMDSAbs_ElementType.hxx delete mode 100644 src/SMDS/SMDS_EdgePosition.cxx delete mode 100644 src/SMDS/SMDS_EdgePosition.hxx delete mode 100755 src/SMDS/SMDS_ElemIterator.hxx delete mode 100644 src/SMDS/SMDS_FaceOfEdges.cxx delete mode 100644 src/SMDS/SMDS_FaceOfEdges.hxx delete mode 100644 src/SMDS/SMDS_FaceOfNodes.cxx delete mode 100644 src/SMDS/SMDS_FaceOfNodes.hxx delete mode 100644 src/SMDS/SMDS_FacePosition.cxx delete mode 100644 src/SMDS/SMDS_FacePosition.hxx delete mode 100644 src/SMDS/SMDS_Iterator.hxx delete mode 100644 src/SMDS/SMDS_IteratorOfElements.cxx delete mode 100644 src/SMDS/SMDS_IteratorOfElements.hxx delete mode 100644 src/SMDS/SMDS_Mesh.cxx delete mode 100644 src/SMDS/SMDS_Mesh.hxx delete mode 100644 src/SMDS/SMDS_MeshEdge.cxx delete mode 100644 src/SMDS/SMDS_MeshEdge.hxx delete mode 100644 src/SMDS/SMDS_MeshElement.cxx delete mode 100644 src/SMDS/SMDS_MeshElement.hxx delete mode 100644 src/SMDS/SMDS_MeshElementIDFactory.cxx delete mode 100644 src/SMDS/SMDS_MeshElementIDFactory.hxx delete mode 100644 src/SMDS/SMDS_MeshFace.cxx delete mode 100644 src/SMDS/SMDS_MeshFace.hxx delete mode 100644 src/SMDS/SMDS_MeshGroup.cxx delete mode 100644 src/SMDS/SMDS_MeshGroup.hxx delete mode 100644 src/SMDS/SMDS_MeshIDFactory.cxx delete mode 100644 src/SMDS/SMDS_MeshIDFactory.hxx delete mode 100644 src/SMDS/SMDS_MeshNode.cxx delete mode 100644 src/SMDS/SMDS_MeshNode.hxx delete mode 100644 src/SMDS/SMDS_MeshObject.cxx delete mode 100644 src/SMDS/SMDS_MeshObject.hxx delete mode 100644 src/SMDS/SMDS_MeshVolume.cxx delete mode 100644 src/SMDS/SMDS_MeshVolume.hxx delete mode 100644 src/SMDS/SMDS_PolygonalFaceOfNodes.cxx delete mode 100644 src/SMDS/SMDS_PolygonalFaceOfNodes.hxx delete mode 100644 src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx delete mode 100644 src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx delete mode 100644 src/SMDS/SMDS_Position.cxx delete mode 100644 src/SMDS/SMDS_Position.hxx delete mode 100644 src/SMDS/SMDS_SpacePosition.cxx delete mode 100644 src/SMDS/SMDS_SpacePosition.hxx delete mode 100644 src/SMDS/SMDS_TypeOfPosition.hxx delete mode 100644 src/SMDS/SMDS_VertexPosition.cxx delete mode 100644 src/SMDS/SMDS_VertexPosition.hxx delete mode 100644 src/SMDS/SMDS_VolumeOfFaces.cxx delete mode 100644 src/SMDS/SMDS_VolumeOfFaces.hxx delete mode 100644 src/SMDS/SMDS_VolumeOfNodes.cxx delete mode 100644 src/SMDS/SMDS_VolumeOfNodes.hxx delete mode 100644 src/SMDS/SMDS_VolumeTool.hxx delete mode 100644 src/SMESH/SMESH_1D_Algo.cxx delete mode 100644 src/SMESH/SMESH_1D_Algo.hxx delete mode 100644 src/SMESH/SMESH_2D_Algo.cxx delete mode 100644 src/SMESH/SMESH_2D_Algo.hxx delete mode 100644 src/SMESH/SMESH_3D_Algo.cxx delete mode 100644 src/SMESH/SMESH_3D_Algo.hxx delete mode 100644 src/SMESH/SMESH_Block.cxx delete mode 100644 src/SMESH/SMESH_Block.hxx delete mode 100644 src/SMESH/SMESH_Group.cxx delete mode 100644 src/SMESH/SMESH_Group.hxx delete mode 100644 src/SMESH/SMESH_HypoFilter.cxx delete mode 100644 src/SMESH/SMESH_HypoFilter.hxx delete mode 100644 src/SMESH/SMESH_Hypothesis.cxx delete mode 100644 src/SMESH/SMESH_Hypothesis.hxx delete mode 100644 src/SMESH/SMESH_Mesh.cxx delete mode 100644 src/SMESH/SMESH_Mesh.hxx delete mode 100644 src/SMESH/SMESH_subMesh.hxx delete mode 100644 src/SMESHDS/Makefile.in delete mode 100644 src/SMESHDS/SMESHDS_Command.cxx delete mode 100644 src/SMESHDS/SMESHDS_Command.hxx delete mode 100644 src/SMESHDS/SMESHDS_CommandType.hxx delete mode 100644 src/SMESHDS/SMESHDS_Document.cxx delete mode 100644 src/SMESHDS/SMESHDS_Document.hxx delete mode 100644 src/SMESHDS/SMESHDS_Group.cxx delete mode 100644 src/SMESHDS/SMESHDS_Group.hxx delete mode 100644 src/SMESHDS/SMESHDS_GroupBase.cxx delete mode 100644 src/SMESHDS/SMESHDS_GroupBase.hxx delete mode 100644 src/SMESHDS/SMESHDS_GroupOnGeom.cxx delete mode 100644 src/SMESHDS/SMESHDS_GroupOnGeom.hxx delete mode 100644 src/SMESHDS/SMESHDS_Hypothesis.cxx delete mode 100644 src/SMESHDS/SMESHDS_Hypothesis.hxx delete mode 100644 src/SMESHDS/SMESHDS_Mesh.cxx delete mode 100644 src/SMESHDS/SMESHDS_Script.cxx delete mode 100644 src/SMESHDS/SMESHDS_Script.hxx delete mode 100644 src/SMESHDS/SMESHDS_SubMesh.cxx delete mode 100644 src/SMESHDS/SMESHDS_SubMesh.hxx delete mode 100644 src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx delete mode 100644 src/SMESHFiltersSelection/SMESH_TypeFilter.ixx delete mode 100644 src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h delete mode 100644 src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx delete mode 100755 src/SMESHGUI/SMESHGUI_Filter.cxx delete mode 100755 src/SMESHGUI/SMESHGUI_Filter.h delete mode 100644 src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h delete mode 100644 src/SMESHGUI/SMESHGUI_FilterUtils.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_FilterUtils.h delete mode 100644 src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_GEOMGenUtils.h delete mode 100644 src/SMESHGUI/SMESHGUI_GroupDlg.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_GroupUtils.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_GroupUtils.h delete mode 100644 src/SMESHGUI/SMESHGUI_IdValidator.h delete mode 100644 src/SMESHGUI/SMESHGUI_MeshUtils.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_MeshUtils.h delete mode 100644 src/SMESHGUI/SMESHGUI_PatternUtils.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_PatternUtils.h delete mode 100644 src/SMESHGUI/SMESHGUI_PatternWidget.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_PatternWidget.h delete mode 100755 src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx delete mode 100755 src/SMESHGUI/SMESHGUI_PrecisionDlg.h delete mode 100644 src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h delete mode 100644 src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h delete mode 100644 src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_SMESHGenUtils.h delete mode 100644 src/SMESHGUI/SMESHGUI_SpinBox.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_SpinBox.h delete mode 100644 src/SMESHGUI/SMESHGUI_Swig.cxx delete mode 100644 src/SMESHGUI/SMESHGUI_Swig.hxx delete mode 100644 src/SMESHGUI/SMESHGUI_Swig.i delete mode 100644 src/SMESHGUI/SMESH_icons.po delete mode 100644 src/SMESH_I/SMESH.hxx delete mode 100644 src/SMESH_I/SMESHEngine.cxx delete mode 100644 src/SMESH_I/SMESH_1D_Algo_i.cxx delete mode 100644 src/SMESH_I/SMESH_1D_Algo_i.hxx delete mode 100644 src/SMESH_I/SMESH_2D_Algo_i.cxx delete mode 100644 src/SMESH_I/SMESH_2D_Algo_i.hxx delete mode 100644 src/SMESH_I/SMESH_3D_Algo_i.cxx delete mode 100644 src/SMESH_I/SMESH_3D_Algo_i.hxx delete mode 100644 src/SMESH_I/SMESH_Algo_i.cxx delete mode 100644 src/SMESH_I/SMESH_Algo_i.hxx delete mode 100644 src/SMESH_I/SMESH_Gen_i_1.cxx delete mode 100644 src/SMESH_I/SMESH_Group_i.hxx delete mode 100644 src/SMESH_I/SMESH_Hypothesis_i.cxx delete mode 100644 src/SMESH_I/SMESH_Hypothesis_i.hxx delete mode 100644 src/SMESH_I/SMESH_MEDFamily_i.cxx delete mode 100644 src/SMESH_I/SMESH_MEDFamily_i.hxx delete mode 100644 src/SMESH_I/SMESH_MEDMesh_i.cxx delete mode 100644 src/SMESH_I/SMESH_MEDSupport_i.cxx delete mode 100644 src/SMESH_I/SMESH_MEDSupport_i.hxx delete mode 100644 src/SMESH_I/SMESH_Mesh_i.hxx delete mode 100644 src/SMESH_I/SMESH_Pattern_i.hxx delete mode 100644 src/SMESH_I/SMESH_subMesh_i.cxx delete mode 100644 src/SMESH_I/SMESH_subMesh_i.hxx delete mode 100644 src/SMESH_I/smeshpy.py delete mode 100644 src/SMESH_SWIG/Makefile.in delete mode 100755 src/SMESH_SWIG/PAL_MESH_041_mesh.py delete mode 100755 src/SMESH_SWIG/PAL_MESH_043_2D.py delete mode 100755 src/SMESH_SWIG/PAL_MESH_043_3D.py delete mode 100644 src/SMESH_SWIG/SMESH_BelongToGeom.py delete mode 100644 src/SMESH_SWIG/SMESH_GroupFromGeom.py delete mode 100755 src/SMESH_SWIG/SMESH_GroupFromGeom2.py delete mode 100644 src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py delete mode 100644 src/SMESH_SWIG/SMESH_Partition1_tetra.py delete mode 100644 src/SMESH_SWIG/SMESH_Sphere.py delete mode 100644 src/SMESH_SWIG/SMESH_blocks.py delete mode 100755 src/SMESH_SWIG/SMESH_box.py delete mode 100644 src/SMESH_SWIG/SMESH_box2_tetra.py delete mode 100644 src/SMESH_SWIG/SMESH_box3_tetra.py delete mode 100644 src/SMESH_SWIG/SMESH_box_tetra.py delete mode 100644 src/SMESH_SWIG/SMESH_controls.py delete mode 100755 src/SMESH_SWIG/SMESH_demo_hexa2_upd.py delete mode 100644 src/SMESH_SWIG/SMESH_fixation.py delete mode 100644 src/SMESH_SWIG/SMESH_fixation_hexa.py delete mode 100644 src/SMESH_SWIG/SMESH_fixation_tetra.py delete mode 100644 src/SMESH_SWIG/SMESH_freebord.py delete mode 100755 src/SMESH_SWIG/SMESH_hexaedre.py delete mode 100644 src/SMESH_SWIG/SMESH_mechanic.py delete mode 100644 src/SMESH_SWIG/SMESH_mechanic_editor.py delete mode 100644 src/SMESH_SWIG/SMESH_mechanic_tetra.py delete mode 100644 src/SMESH_SWIG/SMESH_shared_modules.py delete mode 100644 src/SMESH_SWIG/SMESH_test.py delete mode 100644 src/SMESH_SWIG/SMESH_test0.py delete mode 100644 src/SMESH_SWIG/SMESH_test1.py delete mode 100644 src/SMESH_SWIG/SMESH_test2.py delete mode 100644 src/SMESH_SWIG/SMESH_test3.py delete mode 100755 src/SMESH_SWIG/SMESH_test4.py delete mode 100644 src/SMESH_SWIG/batchmode_mefisto.py delete mode 100644 src/SMESH_SWIG/batchmode_smesh.py delete mode 100644 src/SMESH_SWIG/ex00_all.py delete mode 100644 src/SMESH_SWIG/ex01_cube2build.py delete mode 100644 src/SMESH_SWIG/ex02_cube2primitive.py delete mode 100644 src/SMESH_SWIG/ex03_cube2partition.py delete mode 100644 src/SMESH_SWIG/ex04_cube5tetraHexa.py delete mode 100644 src/SMESH_SWIG/ex05_hole1build.py delete mode 100644 src/SMESH_SWIG/ex06_hole1boolean.py delete mode 100644 src/SMESH_SWIG/ex07_hole1partition.py delete mode 100644 src/SMESH_SWIG/ex08_hole2build.py delete mode 100644 src/SMESH_SWIG/ex09_grid4build.py delete mode 100644 src/SMESH_SWIG/ex10_grid4geometry.py delete mode 100644 src/SMESH_SWIG/ex11_grid3partition.py delete mode 100644 src/SMESH_SWIG/ex12_grid17partition.py delete mode 100644 src/SMESH_SWIG/ex13_hole1partial.py delete mode 100644 src/SMESH_SWIG/ex14_cyl1holed.py delete mode 100644 src/SMESH_SWIG/ex15_cyl2geometry.py delete mode 100644 src/SMESH_SWIG/ex16_cyl2complementary.py delete mode 100644 src/SMESH_SWIG/ex17_dome1.py delete mode 100644 src/SMESH_SWIG/ex18_dome2.py delete mode 100644 src/SMESH_SWIG/ex19_sphereINcube.py delete mode 100644 src/SMESH_SWIG/libSMESH_Swig.i delete mode 100644 src/StdMeshers/StdMeshers_Arithmetic1D.cxx delete mode 100644 src/StdMeshers/StdMeshers_Arithmetic1D.hxx delete mode 100644 src/StdMeshers/StdMeshers_Deflection1D.cxx delete mode 100644 src/StdMeshers/StdMeshers_Deflection1D.hxx delete mode 100644 src/StdMeshers/StdMeshers_Hexa_3D.cxx delete mode 100644 src/StdMeshers/StdMeshers_Hexa_3D.hxx delete mode 100644 src/StdMeshers/StdMeshers_LengthFromEdges.cxx delete mode 100644 src/StdMeshers/StdMeshers_LengthFromEdges.hxx delete mode 100644 src/StdMeshers/StdMeshers_LocalLength.cxx delete mode 100644 src/StdMeshers/StdMeshers_LocalLength.hxx delete mode 100644 src/StdMeshers/StdMeshers_MEFISTO_2D.cxx delete mode 100644 src/StdMeshers/StdMeshers_MEFISTO_2D.hxx delete mode 100644 src/StdMeshers/StdMeshers_MaxElementArea.cxx delete mode 100644 src/StdMeshers/StdMeshers_MaxElementArea.hxx delete mode 100644 src/StdMeshers/StdMeshers_MaxElementVolume.cxx delete mode 100644 src/StdMeshers/StdMeshers_MaxElementVolume.hxx delete mode 100644 src/StdMeshers/StdMeshers_NotConformAllowed.cxx delete mode 100644 src/StdMeshers/StdMeshers_NotConformAllowed.hxx delete mode 100644 src/StdMeshers/StdMeshers_Penta_3D.cxx delete mode 100644 src/StdMeshers/StdMeshers_Penta_3D.hxx delete mode 100644 src/StdMeshers/StdMeshers_Propagation.cxx delete mode 100644 src/StdMeshers/StdMeshers_Propagation.hxx delete mode 100644 src/StdMeshers/StdMeshers_StartEndLength.cxx delete mode 100644 src/StdMeshers/StdMeshers_StartEndLength.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx delete mode 100644 src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx delete mode 100644 src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_LocalLength_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx delete mode 100644 src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx delete mode 100644 src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_Propagation_i.cxx delete mode 100644 src/StdMeshers_I/StdMeshers_Propagation_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx delete mode 100644 src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx delete mode 100644 src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx delete mode 100644 src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 46cf0c992..000000000 --- a/ChangeLog +++ /dev/null @@ -1,1811 +0,0 @@ -############################################################################### -#This is the SMESH change log. Do not modify because it is automatically -#created with : -#cvs2cl.pl -l "-b" -U users.cvs2cl --header header.cvs2cl -T -b --utc -############################################################################### - -2004-01-30 13:18 Nicolas Rejneri - - * doc/html/INPUT/: doxyfile, sources/static/tree.js: NRI : 1.4.0 - version - -2004-01-29 17:52 Jerome Robert - - * INSTALL, bin/VERSION: Upgrade to version 1.4.0. - -2004-01-29 17:33 Jerome Robert - - * src/: SMESHGUI/SMESHGUI_StudyAPI.cxx, SMESHGUI/SMESHGUI_Swig.cxx, - SMESH_I/SMESH_Gen_i.cxx: Merge branch merge_1_2_d - -2004-01-14 09:24 Nicolas Rejneri - - * doc/html/Makefile.in: NRI : bug KERNEL5014 fixed. - -2004-01-06 15:19 Nadir Bouhamou - - * src/SMESH_SWIG/SMESH_flight_skin.py: removing the call to the - tetrahedron generator NETGEN, because I did not yet manage to - make NETGEN running on the flight geometry. - -2004-01-06 15:16 Nadir Bouhamou - - * resources/SMESH_en.xml, resources/SMESH_fr.xml, - src/SMESHGUI/SMESHGUI.cxx: Mounting the hypothesis - LengthFromEdges in th GUI of SMESH. This functionality was only - in the C++ API, and in the CORBA API. - -2004-01-05 16:14 Jerome Robert - - * adm_local/unix/config_files/check_Netgen.m4: Fix a mispelled - environment variable for idl python - -2004-01-05 14:28 tag V1_3_1 - -2004-01-05 13:53 Jerome Robert - - * src/NETGEN/: ReadMeForNgUsers, netgen43ForSalome.patch: Add a - patch to make the build of netgen more user-friendly - -2004-01-05 13:52 Jerome Robert - - * src/NETGEN/Makefile.in: We do not need OCAF in Netgen - -2004-01-05 13:38 Jerome Robert - - * adm_local/unix/config_files/check_Netgen.m4: Fix some quotes - problems. - -2004-01-05 09:05 Jerome Robert - - * src/: SMDS/SMDS_Mesh.cxx, SMESHDS/SMESHDS_Document.cxx: [Bug - SMESH4830] bug in instal with gcc 2.95. Bug fixed. Note: SGI say - that is requiered to use set_intersection (see - http://www.sgi.com/tech/stl/set_intersection.html). - -2003-12-16 15:27 Nadir Bouhamou - - * adm_local/unix/config_files/check_Netgen.m4: Since there is an - idl precompilation directive in SMESH_BasicHypothesis.idl file, a - -DHAVE_NETGEN idl has to be added when compiling SMESH with - netgen to the idl c++ flags as well as to the idl python flags. - -2003-12-15 13:15 Nadir Bouhamou - - * src/SMESHDS/SMESHDS_Script.cxx: correct a small bug found by the - EDF developpement team (PN and AT) : AddVolume in the case of a - Tetrahedron. - -2003-12-11 09:51 Jerome Robert - - * src/SMESHGUI/SMESHGUI.cxx: [Bug SMESH4598] Crash of the session - when compute and update are not done in the same view. Bug fixed. - -2003-12-11 09:49 Jerome Robert - - * src/SMESH/SMESH_HypothesisFactory.cxx: HAVE_NETGEN (#define) to - remove an unresolved symbol when building without netgen - -2003-12-10 17:23 Jerome Robert - - * adm_local/unix/config_files/check_Netgen.m4, - idl/SMESH_BasicHypothesis.idl, - src/SMESH_I/SMESH_HypothesisFactory_i.cxx: Create and use - HAVE_NETGEN (#define) to avoid unresolved symbols in libraries. - -2003-12-10 16:05 Jerome Robert - - * src/SMESHGUI/SMESHGUI.cxx: Cosmetics - -2003-12-09 14:13 Nadir Bouhamou - - * src/SMESH/Makefile.in: Correcting a problem araising when - building the SMESH module whithout Netgen. - -2003-12-09 10:00 Nadir Bouhamou - - * doc/: AddNetgenInSalome2.pdf, AddNetgenInSalome2.ps, - AddNetgenInSalome2.sxw: updating or adding when merging in the - main trunk with the version in the branch nadir_1_2_2 !! Here a - document related to the integration of NETGEN in the SMESH module - has been added for future work in the integration of other - mesher. - -2003-12-08 15:30 Nadir Bouhamou - - * INSTALL, Makefile.in, configure.in.base, - adm_local/unix/make_commence.in, - adm_local/unix/config_files/check_Netgen.m4, bin/VERSION, - idl/SMESH_BasicHypothesis.idl, resources/SMESH_en.xml, - resources/SMESH_fr.xml, resources/flight_solid.brep, - resources/mesh_algo_netgen.png, resources/mesh_algo_tetra.png, - resources/mesh_tree_algo_netgen.png, - resources/mesh_tree_algo_tetra.png, src/Makefile.in, - src/DriverMED/DriverMED_R_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - src/NETGEN/Makefile.in, src/NETGEN/ReadMeForNgUsers, - src/SMESH/Makefile.in, src/SMESH/SMESH_HypothesisFactory.cxx, - src/SMESH/SMESH_MEFISTO_2D.cxx, - src/SMESH/SMESH_MaxElementVolume.cxx, - src/SMESH/SMESH_MaxElementVolume.hxx, - src/SMESH/SMESH_NETGEN_3D.cxx, src/SMESH/SMESH_NETGEN_3D.hxx, - src/SMESH/SMESH_subMesh.cxx, src/SMESHGUI/SMESHGUI.cxx, - src/SMESHGUI/SMESHGUI.h, src/SMESHGUI/SMESHGUI_NbSegmentsDlg.cxx, - src/SMESHGUI/SMESHGUI_icons.po, src/SMESH_I/Makefile.in, - src/SMESH_I/SMESH_Gen_i.cxx, - src/SMESH_I/SMESH_HypothesisFactory_i.cxx, - src/SMESH_I/SMESH_LengthFromEdges_i.cxx, - src/SMESH_I/SMESH_LengthFromEdges_i.hxx, - src/SMESH_I/SMESH_MEDMesh_i.cxx, - src/SMESH_I/SMESH_MEDSupport_i.cxx, - src/SMESH_I/SMESH_MaxElementVolume_i.cxx, - src/SMESH_I/SMESH_MaxElementVolume_i.hxx, - src/SMESH_I/SMESH_NETGEN_3D_i.cxx, - src/SMESH_I/SMESH_NETGEN_3D_i.hxx, src/SMESH_SWIG/Makefile.in, - src/SMESH_SWIG/SMESH_Partition1_tetra.py, - src/SMESH_SWIG/SMESH_box2_tetra.py, - src/SMESH_SWIG/SMESH_box3_tetra.py, - src/SMESH_SWIG/SMESH_box_tetra.py, - src/SMESH_SWIG/SMESH_fixation_hexa.py, - src/SMESH_SWIG/SMESH_fixation_tetra.py, - src/SMESH_SWIG/SMESH_flight_skin.py, - src/SMESH_SWIG/SMESH_mechanic_tetra.py: updating or adding when - merging in the main trunk with the version in the branch - nadir_1_2_2 !! - -2003-12-05 14:49 Jerome Robert - - * src/MEFISTO2/trte.f: Remove "pause" primitive call. - -2003-11-27 11:45 Jerome Robert - - * resources/SMESH_en.xml, resources/SMESH_fr.xml, - src/SMESHGUI/SMESHGUI.cxx: [Bug SMESH839] Spelling: Hypotheses - - Hexa?edron (i,j,k). Bug Fixed. - -2003-11-25 08:52 tag V1_3_0 - -2003-11-25 08:52 Nicolas Rejneri - - * bin/VERSION, INSTALL: NRI: 1.3.0 version. - -2003-11-20 12:45 tag V1_3_0_b3 - -2003-11-20 12:45 Nicolas Rejneri - - * doc/html/INPUT/sources/static/: doxygen.css, page2.html, tree.js, - treeview.js: NRI : Add static documentation. - -2003-11-20 12:45 Nicolas Rejneri - - * doc/html/INPUT/sources/: Application-About.png, - Application-About1.jpg, application.gif, application.jpg, - bg_salome.gif, bg_salomepro.gif, doxygen.css: NRI : Update - images. - -2003-11-20 12:44 Nicolas Rejneri - - * doc/html/INPUT/doxyfile: NRI : Generate TreeView. - -2003-11-20 12:43 Nicolas Rejneri - - * doc/html/Makefile.in: NRI : Add static directory. - -2003-11-18 15:01 tag V1_3_0b2 - -2003-11-18 15:01 Jerome Robert - - * ChangeLog, INSTALL, cvs-tags: update for V1_3_0_b2 - -2003-11-18 09:19 Nadir Bouhamou - - * src/SMESH_I/: SMESH_MEDFamily_i.cxx, SMESH_MEDFamily_i.hxx, - SMESH_MEDMesh_i.cxx, SMESH_MEDMesh_i.hxx, SMESH_MEDSupport_i.cxx, - SMESH_MEDSupport_i.hxx: merge with the branch - nadir_update_MED_v1_3_0 (branch to build the V1_3_0 version of - the module. - -2003-11-12 13:20 tag V1_3_0_b1 - -2003-11-12 13:20 Jerome Robert - - * ChangeLog, INSTALL, cvs-tags, bin/VERSION: Update for V1.3.0b1 - -2003-11-12 11:40 Jerome Robert - - * src/OBJECT/SMESH_Actor.cxx: MergeV1_2c-1 - -2003-11-06 14:43 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI.cxx: NRI : MergeV1_2c-1. - -2003-11-06 14:34 Nicolas Rejneri - - * src/MEFISTO2/: areteideale.f, trte.f: NRI : Add licence header. - -2003-11-06 11:34 Nicolas Rejneri - - * LICENCE: NRI : add LICENCE file - -2003-11-03 15:50 Nicolas Rejneri - - * doc/html/Makefile.in: NRI : Relative path !!!! - -2003-10-22 15:28 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx: Fix/implement - removeNode, removeEdge, removeFace, removeVolume and - removeElement - -2003-10-20 16:26 Jerome Robert - - * src/SMESHGUI/SMESHGUI.cxx: When the main window was maximized - some dialogs were cropped at the bottom of the screen. It's now - fixed. - -2003-10-17 16:31 Jerome Robert - - * src/SMDS/SMDS_Mesh.cxx: Fix a bug. Quadrangles were added as - triangles. - -2003-10-06 10:50 tag MergeV1_2c-1 - -2003-10-06 10:50 Jerome Robert - - * cvs-tags: Update. Created a new branch for user nadir. - -2003-10-02 16:16 Nicolas Rejneri - - * build_configure: NRI : RedHat 9 compatibility (M. Tajchman). - -2003-09-26 15:14 tag V1_2_2 - -2003-09-26 15:14 Jerome Robert - - * INSTALL, cvs-tags: Add a tag file to track branch and tag. Update - INSTALL to prepare V1_2_2 tag. - -2003-09-26 14:21 tag V1_2_1 - -2003-09-26 14:21 Nicolas Rejneri - - * INSTALL: NRI : INSTALL file defined into SALOME2_PRODUCTION_CYCLE - document. - -2003-09-23 14:33 Jerome Robert - - * src/: SMDS/SMDS_FaceOfEdges.hxx, SMESHDS/SMESHDS_Mesh.hxx, - SMDS/SMDS_FaceOfNodes.hxx, SMDS/SMDS_MeshEdge.hxx, - SMDS/SMDS_MeshElement.hxx, SMDS/SMDS_Tria3OfNodes.hxx, - SMDS/SMDS_VolumeOfFaces.hxx: Keep compatible with gcc 2 - -2003-09-23 11:52 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : Display Component - UserName and Icon. - -2003-09-22 12:23 Jerome Robert - - * src/SMDS/SMDS_IteratorOfArray.hxx: Freshly added file - -2003-09-12 15:12 Jerome Robert - - * src/SMDS/: Makefile.in, SMDS_HexahedronOfNodes.cxx, - SMDS_HexahedronOfNodes.hxx, SMDS_Mesh.cxx, SMDS_Tria3OfNodes.cxx, - SMDS_Tria3OfNodes.hxx: Add HexahedronOfNodes and Tria3OfNodes to - improve performance - -2003-09-12 15:11 Jerome Robert - - * src/SMDS/SMDS_VolumeOfNodes.cxx: Fix bug. Was always printing 8 - nodes - -2003-09-08 15:04 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_VolumeOfNodes.cxx, - SMDS_VolumeOfNodes.hxx: Add support for tetra, pyramid and prism - -2003-09-08 13:41 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_MeshElement.cxx: Add some comments - -2003-09-05 12:19 Jerome Robert - - * src/SMDS/SMDS_MeshNode.cxx: Some forgotten return statments - -2003-09-05 11:45 Jerome Robert - - * src/: DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, SMESH/SMESH_Hexa_3D.cxx: - Correct some memory leaks - -2003-09-05 10:31 Jerome Robert - - * src/: DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx, - SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx, - SMESH/SMESH_Quadrangle_2D.cxx, SMESH/SMESH_Quadrangle_2D.hxx, - SMESH/SMESH_Regular_1D.cxx, SMESH/SMESH_subMesh.cxx, - SMESHDS/SMESHDS_Mesh.cxx, SMESHDS/SMESHDS_Mesh.hxx, - SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx, - SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MeshEditor_i.cxx: - Use nodes and elements pointer instead on IDs - -2003-09-05 10:20 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx: Change API to use - pointer on elements and no longer ID of elements - -2003-09-04 15:04 Jerome Robert - - * src/SMESHDS/: Handle_SMESHDS_Command.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - Handle_SMESHDS_Document.hxx, - Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx, - Handle_SMESHDS_ListNodeOfListOfCommand.hxx, - Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - Handle_SMESHDS_Mesh.hxx, Handle_SMESHDS_Script.hxx, - Handle_SMESHDS_SubMesh.hxx, SMESHDS.cdl, SMESHDS_Command.cdl, - SMESHDS_Command.ixx, SMESHDS_Command.jxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx, - SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx, - SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS_DataMapOfIntegerMesh.hxx, - SMESHDS_DataMapOfIntegerMesh_0.cxx, - SMESHDS_DataMapOfIntegerPtrHypothesis.hxx, - SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS_DataMapOfIntegerSubMesh.hxx, - SMESHDS_DataMapOfIntegerSubMesh_0.cxx, - SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS_DataMapOfShapeSubMesh.hxx, - SMESHDS_DataMapOfShapeSubMesh_0.cxx, SMESHDS_Document.cdl, - SMESHDS_Document.ixx, SMESHDS_Document.jxx, - SMESHDS_ListIteratorOfListOfAsciiString.hxx, - SMESHDS_ListIteratorOfListOfAsciiString_0.cxx, - SMESHDS_ListIteratorOfListOfCommand.hxx, - SMESHDS_ListIteratorOfListOfCommand_0.cxx, - SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx, - SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx, - SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS_ListNodeOfListOfAsciiString_0.cxx, - SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS_ListNodeOfListOfCommand_0.cxx, - SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx, - SMESHDS_ListOfAsciiString.hxx, SMESHDS_ListOfAsciiString_0.cxx, - SMESHDS_ListOfCommand.hxx, SMESHDS_ListOfCommand_0.cxx, - SMESHDS_ListOfPtrHypothesis.hxx, - SMESHDS_ListOfPtrHypothesis_0.cxx, SMESHDS_Mesh.cdl, - SMESHDS_Mesh.ixx, SMESHDS_Mesh.jxx, SMESHDS_PtrHypothesis.hxx, - SMESHDS_Script.cdl, SMESHDS_Script.ixx, SMESHDS_Script.jxx, - SMESHDS_SubMesh.cdl, SMESHDS_SubMesh.ixx, SMESHDS_SubMesh.jxx: - Remove no longer needed files - -2003-09-04 14:50 Jerome Robert - - * src/SMDS/: Handle_SMDSControl_BoundaryEdges.hxx, - Handle_SMDSControl_BoundaryFaces.hxx, - Handle_SMDSControl_MeshBoundary.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - Handle_SMDS_EdgePosition.hxx, Handle_SMDS_FacePosition.hxx, - Handle_SMDS_HSequenceOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMeshElement.hxx, - Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, Handle_SMDS_Mesh.hxx, - Handle_SMDS_MeshEdge.hxx, Handle_SMDS_MeshElement.hxx, - Handle_SMDS_MeshElementIDFactory.hxx, Handle_SMDS_MeshFace.hxx, - Handle_SMDS_MeshGroup.hxx, Handle_SMDS_MeshHexahedron.hxx, - Handle_SMDS_MeshIDFactory.hxx, Handle_SMDS_MeshNode.hxx, - Handle_SMDS_MeshNodeIDFactory.hxx, Handle_SMDS_MeshObject.hxx, - Handle_SMDS_MeshPrism.hxx, Handle_SMDS_MeshPyramid.hxx, - Handle_SMDS_MeshQuadrangle.hxx, Handle_SMDS_MeshTetrahedron.hxx, - Handle_SMDS_MeshTriangle.hxx, Handle_SMDS_MeshVolume.hxx, - Handle_SMDS_Position.hxx, - Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx, - Handle_SMDS_SpacePosition.hxx, - Handle_SMDS_StdMapNodeOfExtendedMap.hxx, - Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - Handle_SMDS_VertexPosition.hxx, SMDS.cdl, SMDSAbs.cdl, - SMDSControl.cdl, SMDSControl.ixx, SMDSControl.jxx, - SMDSControl_BoundaryEdges.cdl, SMDSControl_BoundaryEdges.ixx, - SMDSControl_BoundaryEdges.jxx, SMDSControl_BoundaryFaces.cdl, - SMDSControl_BoundaryFaces.ixx, SMDSControl_BoundaryFaces.jxx, - SMDSControl_MeshBoundary.cdl, SMDSControl_MeshBoundary.ixx, - SMDSControl_MeshBoundary.jxx, SMDSEdit.cdl, - SMDSEdit_Transform.cdl, SMDSEdit_Transform.ixx, - SMDSEdit_Transform.jxx, SMDS_BasicMap.lxx, - SMDS_BasicMapIterator.lxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapOfIntegerMeshElement.hxx, - SMDS_DataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapOfPntInteger.hxx, SMDS_DataMapOfPntInteger_0.cxx, - SMDS_EdgePosition.cdl, SMDS_EdgePosition.ixx, - SMDS_EdgePosition.jxx, SMDS_EdgePosition.lxx, - SMDS_ExtendedMap.hxx, SMDS_ExtendedMap_0.cxx, - SMDS_ExtendedOrientedMap.hxx, SMDS_ExtendedOrientedMap_0.cxx, - SMDS_FacePosition.cdl, SMDS_FacePosition.ixx, - SMDS_FacePosition.jxx, SMDS_FacePosition.lxx, - SMDS_HSequenceOfMesh.hxx, SMDS_HSequenceOfMesh_0.cxx, - SMDS_ListIteratorOfListOfMesh.hxx, - SMDS_ListIteratorOfListOfMeshElement.hxx, - SMDS_ListIteratorOfListOfMeshElement_0.cxx, - SMDS_ListIteratorOfListOfMeshGroup.hxx, - SMDS_ListIteratorOfListOfMeshGroup_0.cxx, - SMDS_ListIteratorOfListOfMesh_0.cxx, - SMDS_ListNodeOfListOfMesh.hxx, - SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS_ListNodeOfListOfMeshElement_0.cxx, - SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS_ListNodeOfListOfMeshGroup_0.cxx, - SMDS_ListNodeOfListOfMesh_0.cxx, SMDS_ListOfMesh.hxx, - SMDS_ListOfMeshElement.hxx, SMDS_ListOfMeshElement_0.cxx, - SMDS_ListOfMeshGroup.hxx, SMDS_ListOfMeshGroup_0.cxx, - SMDS_ListOfMesh_0.cxx, SMDS_Map.gxx, SMDS_MapHasher.gxx, - SMDS_MapIterator.gxx, SMDS_MapIteratorOfExtendedMap.hxx, - SMDS_MapIteratorOfExtendedMap_0.cxx, - SMDS_MapIteratorOfExtendedOrientedMap.hxx, - SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, SMDS_MapNode.lxx, - SMDS_MapOfMeshElement.cdl, SMDS_MapOfMeshElement.cxx, - SMDS_MapOfMeshElement.hxx, SMDS_MapOfMeshElement.ixx, - SMDS_MapOfMeshElement.jxx, SMDS_MapOfMeshElement.lxx, - SMDS_MapOfMeshOrientedElement.cdl, - SMDS_MapOfMeshOrientedElement.cxx, - SMDS_MapOfMeshOrientedElement.hxx, - SMDS_MapOfMeshOrientedElement.ixx, - SMDS_MapOfMeshOrientedElement.jxx, - SMDS_MapOfMeshOrientedElement.lxx, SMDS_Mesh.cdl, SMDS_Mesh.ixx, - SMDS_Mesh.jxx, SMDS_Mesh.lxx, SMDS_MeshEdge.cdl, - SMDS_MeshEdge.ixx, SMDS_MeshEdge.jxx, SMDS_MeshEdge.lxx, - SMDS_MeshEdgesIterator.cdl, SMDS_MeshEdgesIterator.cxx, - SMDS_MeshEdgesIterator.hxx, SMDS_MeshEdgesIterator.ixx, - SMDS_MeshEdgesIterator.jxx, SMDS_MeshElement.cdl, - SMDS_MeshElement.ixx, SMDS_MeshElement.jxx, SMDS_MeshElement.lxx, - SMDS_MeshElementIDFactory.cdl, SMDS_MeshElementIDFactory.ixx, - SMDS_MeshElementIDFactory.jxx, SMDS_MeshElementIDFactory.lxx, - SMDS_MeshElementMapHasher.cdl, SMDS_MeshElementMapHasher.cxx, - SMDS_MeshElementMapHasher.hxx, SMDS_MeshElementMapHasher.ixx, - SMDS_MeshElementMapHasher.jxx, SMDS_MeshElementMapHasher.lxx, - SMDS_MeshElementsIterator.cdl, SMDS_MeshElementsIterator.cxx, - SMDS_MeshElementsIterator.hxx, SMDS_MeshElementsIterator.ixx, - SMDS_MeshElementsIterator.jxx, SMDS_MeshElementsIterator.lxx, - SMDS_MeshFace.cdl, SMDS_MeshFace.ixx, SMDS_MeshFace.jxx, - SMDS_MeshFace.lxx, SMDS_MeshFacesIterator.cdl, - SMDS_MeshFacesIterator.cxx, SMDS_MeshFacesIterator.hxx, - SMDS_MeshFacesIterator.ixx, SMDS_MeshFacesIterator.jxx, - SMDS_MeshGroup.cdl, SMDS_MeshGroup.ixx, SMDS_MeshGroup.jxx, - SMDS_MeshGroup.lxx, SMDS_MeshHexahedron.cdl, - SMDS_MeshHexahedron.ixx, SMDS_MeshHexahedron.jxx, - SMDS_MeshHexahedron.lxx, SMDS_MeshIDFactory.cdl, - SMDS_MeshIDFactory.ixx, SMDS_MeshIDFactory.jxx, - SMDS_MeshIDFactory.lxx, SMDS_MeshNode.cdl, SMDS_MeshNode.ixx, - SMDS_MeshNode.jxx, SMDS_MeshNode.lxx, SMDS_MeshNodeIDFactory.cdl, - SMDS_MeshNodeIDFactory.ixx, SMDS_MeshNodeIDFactory.jxx, - SMDS_MeshNodeIDFactory.lxx, SMDS_MeshNodesIterator.cdl, - SMDS_MeshNodesIterator.cxx, SMDS_MeshNodesIterator.hxx, - SMDS_MeshNodesIterator.ixx, SMDS_MeshNodesIterator.jxx, - SMDS_MeshObject.cdl, SMDS_MeshObject.ixx, SMDS_MeshObject.jxx, - SMDS_MeshOrientedElementMapHasher.cdl, - SMDS_MeshOrientedElementMapHasher.cxx, - SMDS_MeshOrientedElementMapHasher.hxx, - SMDS_MeshOrientedElementMapHasher.ixx, - SMDS_MeshOrientedElementMapHasher.jxx, - SMDS_MeshOrientedElementMapHasher.lxx, SMDS_MeshPrism.cdl, - SMDS_MeshPrism.ixx, SMDS_MeshPrism.jxx, SMDS_MeshPrism.lxx, - SMDS_MeshPyramid.cdl, SMDS_MeshPyramid.ixx, SMDS_MeshPyramid.jxx, - SMDS_MeshPyramid.lxx, SMDS_MeshQuadrangle.cdl, - SMDS_MeshQuadrangle.ixx, SMDS_MeshQuadrangle.jxx, - SMDS_MeshQuadrangle.lxx, SMDS_MeshTetrahedron.cdl, - SMDS_MeshTetrahedron.ixx, SMDS_MeshTetrahedron.jxx, - SMDS_MeshTetrahedron.lxx, SMDS_MeshTriangle.cdl, - SMDS_MeshTriangle.ixx, SMDS_MeshTriangle.jxx, - SMDS_MeshTriangle.lxx, SMDS_MeshVolume.cdl, SMDS_MeshVolume.ixx, - SMDS_MeshVolume.jxx, SMDS_MeshVolume.lxx, - SMDS_MeshVolumesIterator.cdl, SMDS_MeshVolumesIterator.cxx, - SMDS_MeshVolumesIterator.hxx, SMDS_MeshVolumesIterator.ixx, - SMDS_MeshVolumesIterator.jxx, SMDS_PntHasher.cdl, - SMDS_PntHasher.cxx, SMDS_PntHasher.hxx, SMDS_PntHasher.ixx, - SMDS_PntHasher.jxx, SMDS_PntHasher.lxx, SMDS_Position.cdl, - SMDS_Position.ixx, SMDS_Position.jxx, SMDS_Position.lxx, - SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, SMDS_SequenceOfMesh.hxx, - SMDS_SequenceOfMesh_0.cxx, SMDS_SpacePosition.cdl, - SMDS_SpacePosition.ixx, SMDS_SpacePosition.jxx, - SMDS_SpacePosition.lxx, SMDS_StdMapNode.gxx, SMDS_StdMapNode.lxx, - SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS_StdMapNodeOfExtendedMap_0.cxx, - SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx, - SMDS_VertexPosition.cdl, SMDS_VertexPosition.ixx, - SMDS_VertexPosition.jxx: Remove no longer needed files - -2003-09-04 13:28 Jerome Robert - - * build_configure: It seems "make_omniorb" and "make_commence" need - to be before and after "envScript" - -2003-09-04 12:57 Jerome Robert - - * build_configure: make_commence and make_omniorb were detected - twice. Only one is requiered in AC_OUTPUT - -2003-09-04 12:03 Jerome Robert - - * src/: DriverDAT/DriverDAT_R_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMDS_Mesh.h, - DriverDAT/DriverDAT_R_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.h, - DriverDAT/DriverDAT_W_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMDS_Mesh.h, - DriverDAT/DriverDAT_W_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.h, - DriverMED/DriverMED_R_SMDS_Mesh.cxx, - DriverMED/DriverMED_R_SMDS_Mesh.h, - DriverMED/DriverMED_R_SMESHDS_Document.cxx, - DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_R_SMESHDS_Mesh.h, - DriverMED/DriverMED_W_SMDS_Mesh.cxx, - DriverMED/DriverMED_W_SMDS_Mesh.h, - DriverMED/DriverMED_W_SMESHDS_Document.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.h, - DriverUNV/DriverUNV_R_SMDS_Mesh.cxx, - DriverUNV/DriverUNV_R_SMDS_Mesh.h, - DriverUNV/DriverUNV_R_SMESHDS_Document.cxx, - DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx, - DriverUNV/DriverUNV_R_SMESHDS_Mesh.h, - DriverUNV/DriverUNV_W_SMDS_Mesh.cxx, - DriverUNV/DriverUNV_W_SMDS_Mesh.h, - DriverUNV/DriverUNV_W_SMESHDS_Document.cxx, - DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx, - DriverUNV/DriverUNV_W_SMESHDS_Mesh.h: Update to match the changes - in SMDS - -2003-09-04 11:03 Jerome Robert - - * src/: DriverDAT/Makefile.in, DriverMED/Makefile.in, - DriverUNV/Makefile.in: Remove OCC_LIBS from LDFLAGS - -2003-09-04 10:56 Jerome Robert - - * src/Driver/: Document_Reader.cxx, Document_Reader.h, - Document_Writer.cxx, Document_Writer.h, Mesh_Reader.h, - Mesh_Writer.h: Update to mach the changes in SMDS - -2003-09-04 10:44 Jerome Robert - - * src/Driver/Makefile.in: Remove OCC_LIBS from LDFLAGS - -2003-09-04 10:41 Jerome Robert - - * src/SMESH_I/: SMESH_Gen_i.cxx, SMESH_MEDMesh_i.cxx, - SMESH_MEDMesh_i.hxx, SMESH_MEDSupport_i.cxx, - SMESH_MEDSupport_i.hxx, SMESH_MeshEditor_i.cxx, - SMESH_MeshEditor_i.hxx, SMESH_Mesh_i.cxx: Update to match the new - implementation of SMDS - -2003-09-04 10:10 Jerome Robert - - * src/SMESH/SMESH_MaxElementArea.cxx: make GetMaxArea const - -2003-09-04 10:10 Jerome Robert - - * src/SMESH/: SMESH_MEFISTO_2D.hxx, SMESH_Regular_1D.hxx: make - hypothesis const - -2003-09-04 09:55 Jerome Robert - - * src/SMESH/SMESH_Hexa_3D.hxx: Update to match the change of SMDS - (new DS). - -2003-09-04 09:51 Jerome Robert - - * src/SMESH_I/sstream: Use the file include in gcc instead of this - one - -2003-09-04 09:21 Jerome Robert - - * src/SMESH/: SMESH_Algo.cxx, SMESH_Algo.hxx, SMESH_Gen.cxx, - SMESH_Gen.hxx, SMESH_Hexa_3D.cxx, SMESH_MEFISTO_2D.cxx, - SMESH_MaxElementArea.hxx, SMESH_Mesh.cxx, SMESH_Mesh.hxx, - SMESH_Quadrangle_2D.cxx, SMESH_Regular_1D.cxx, SMESH_subMesh.cxx, - SMESH_subMesh.hxx: Update to match the change of SMDS (new DS). - -2003-09-04 09:13 Jerome Robert - - * src/SMESH/: SMESH_NumberOfSegments.cxx, - SMESH_NumberOfSegments.hxx: make GetNumberOfSegments and - GetScaleFactor const - -2003-09-04 09:10 Jerome Robert - - * src/SMESH/: SMESH_LocalLength.cxx, SMESH_LocalLength.hxx: make - GetLength const - -2003-09-04 08:09 Jerome Robert - - * src/SMESHFiltersSelection/Makefile.in: Change OCC_LIBS to - OCC_KERNEL_LIBS - -2003-09-04 07:55 Jerome Robert - - * src/SMESHGUI/Makefile.in: Change OCC_LIBS to OCC_KERNEL_LIBS - -2003-09-04 07:39 Jerome Robert - - * src/SMESHGUI/: SMESHGUI.cxx, SMESHGUI.h: Change - Handle(SMESHDS_Document) to SMESHDS_Document* - -2003-09-04 07:21 Jerome Robert - - * src/MEFISTO2/Makefile.in: Remove OCC_LIBS from LDFLAGS - -2003-09-04 07:14 Jerome Robert - - * src/SMESHDS/: Makefile.in, SMESHDS_Command.cxx, - SMESHDS_Command.hxx, SMESHDS_Document.cxx, SMESHDS_Document.hxx, - SMESHDS_Hypothesis.cxx, SMESHDS_Hypothesis.hxx, SMESHDS_Mesh.cxx, - SMESHDS_Mesh.hxx, SMESHDS_Script.cxx, SMESHDS_Script.hxx, - SMESHDS_SubMesh.cxx, SMESHDS_SubMesh.hxx: Remove Opencascade - dependencies. Change to STL. - -2003-09-03 17:31 Jerome Robert - - * src/OBJECT/Makefile.in: Change OCC_LIBS to OCC_KERNEL_LIBS - -2003-09-03 17:30 Jerome Robert - - * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx, SMDS_MeshEdge.cxx, - SMDS_MeshEdge.hxx, SMDS_MeshElement.cxx, SMDS_MeshElement.hxx, - SMDS_MeshNode.cxx, SMDS_MeshNode.hxx, SMDS_MeshVolume.cxx, - SMDS_MeshVolume.hxx, SMDS_MeshFace.cxx, SMDS_MeshFace.hxx: New DS - implementation - -2003-09-03 17:29 Jerome Robert - - * src/SMDS/: SMDS_EdgePosition.cxx, SMDS_EdgePosition.hxx, - SMDS_FacePosition.cxx, SMDS_FacePosition.hxx, - SMDS_MeshElementIDFactory.cxx, SMDS_MeshElementIDFactory.hxx, - SMDS_MeshGroup.cxx, SMDS_MeshGroup.hxx, SMDS_MeshIDFactory.cxx, - SMDS_MeshIDFactory.hxx, SMDS_MeshObject.cxx, SMDS_MeshObject.hxx, - SMDS_Position.cxx, SMDS_Position.hxx, SMDS_SpacePosition.cxx, - SMDS_SpacePosition.hxx, SMDS_TypeOfPosition.hxx, - SMDS_VertexPosition.cxx, SMDS_VertexPosition.hxx: Remove - Opencascade dependencies - -2003-09-03 17:21 Jerome Robert - - * src/SMDS/SMDSAbs_ElementType.hxx: comments - -2003-09-03 17:21 Jerome Robert - - * src/SMDS/: SMDS_Iterator.hxx, SMDS_IteratorOfElements.cxx, - SMDS_IteratorOfElements.hxx: Add iterator classes - -2003-09-03 17:16 Jerome Robert - - * src/SMDS/Makefile.in: Remove wok files. Comment no longer needed - files - -2003-09-03 17:09 Jerome Robert - - * src/SMDS/: SMDS_FaceOfEdges.cxx, SMDS_FaceOfEdges.hxx, - SMDS_FaceOfNodes.cxx, SMDS_FaceOfNodes.hxx, - SMDS_VolumeOfFaces.cxx, SMDS_VolumeOfFaces.hxx, - SMDS_VolumeOfNodes.cxx, SMDS_VolumeOfNodes.hxx: Add needed class - for the new DS - -2003-07-18 12:19 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : correction wrong merge. - -2003-07-11 07:32 Nicolas Rejneri - - * bin/VERSION, doc/html/Makefile.in, doc/html/INPUT/doxyfile: NRI : - Merge from V1_2. - -2003-07-10 17:51 Nicolas Rejneri - - * configure.in.base: NRI : Merge from V1_2. - -2003-07-10 16:31 Nicolas Rejneri - - * src/SMESHGUI/: SMESHGUI_Swig.cxx, SMESHGUI_Swig.i: NRI : Merge - from V1_2. - -2003-07-10 16:06 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_Swig.cxx: NRI : Merge from V1_2. - -2003-07-10 15:36 Nicolas Rejneri - - * src/Driver/Makefile.in: NRI : Merge from V1_2. - -2003-07-10 15:03 Nicolas Rejneri - - * src/SMESH/Makefile.in, src/SMESH_I/Makefile.in, - idl/SMESH_BasicHypothesis.idl, idl/SMESH_Gen.idl, - idl/SMESH_Hypothesis.idl, idl/SMESH_Mesh.idl, - adm_local/unix/make_commence.in: NRI : Merge from V1_2. - -2003-07-10 14:47 Nicolas Rejneri - - * configure.in.base: NRI : Merge from V1_2. - -2003-07-10 14:31 Nicolas Rejneri - - * src/Driver/Makefile.in: NRI : Merge from V1_2. - -2003-07-10 13:35 Yves Fricaud - - * src/: SMESH_I/Makefile.in, SMESH_I/SMESH_1D_Algo_i.cxx, - SMESH_I/SMESH_1D_Algo_i.hxx, SMESH_I/SMESH_2D_Algo_i.cxx, - SMESH_I/SMESH_2D_Algo_i.hxx, SMESH_I/SMESH_3D_Algo_i.cxx, - SMESH_I/SMESH_3D_Algo_i.hxx, SMESH_I/SMESH_Algo_i.cxx, - SMESH_I/SMESH_Algo_i.hxx, SMESH_I/SMESH_Gen_i.cxx, - SMESH_I/SMESH_Gen_i.hxx, SMESH_I/SMESH_Hexa_3D_i.cxx, - SMESH_I/SMESH_Hexa_3D_i.hxx, - SMESH_I/SMESH_HypothesisFactory_i.cxx, - SMESH_I/SMESH_HypothesisFactory_i.hxx, - SMESH_I/SMESH_Hypothesis_i.cxx, SMESH_I/SMESH_Hypothesis_i.hxx, - SMESH_I/SMESH_LocalLength_i.cxx, SMESH_I/SMESH_LocalLength_i.hxx, - SMESH_I/SMESH_MEDFamily_i.cxx, SMESH_I/SMESH_MEDFamily_i.hxx, - SMESH_I/SMESH_MEDMesh_i.cxx, SMESH_I/SMESH_MEDMesh_i.hxx, - SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MEDSupport_i.hxx, - SMESH_I/SMESH_MEFISTO_2D_i.cxx, SMESH_I/SMESH_MEFISTO_2D_i.hxx, - SMESH_I/SMESH_MaxElementArea_i.cxx, - SMESH_I/SMESH_MaxElementArea_i.hxx, - SMESH_I/SMESH_MaxElementVolume_i.cxx, - SMESH_I/SMESH_MaxElementVolume_i.hxx, - SMESH_I/SMESH_MeshEditor_i.cxx, SMESH_I/SMESH_MeshEditor_i.hxx, - SMESH_I/SMESH_Mesh_i.cxx, SMESH_I/SMESH_Mesh_i.hxx, - SMESH_I/SMESH_NumberOfSegments_i.cxx, - SMESH_I/SMESH_NumberOfSegments_i.hxx, - SMESH_I/SMESH_Quadrangle_2D_i.cxx, - SMESH_I/SMESH_Quadrangle_2D_i.hxx, - SMESH_I/SMESH_Regular_1D_i.cxx, SMESH_I/SMESH_Regular_1D_i.hxx, - SMESH_I/SMESH_subMesh_i.cxx, SMESH_I/SMESH_subMesh_i.hxx, - SMESH_I/SMESH_test.py, SMESH_I/SMESH_topo.cxx, - SMESH_I/SMESH_topo.hxx, SMESH_I/smeshpy.py, - SMESH_SWIG/Makefile.in, SMESH_SWIG/SMESH_fixation.py, - SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py, - SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test2.py, - SMESH_SWIG/SMESH_test3.py, SMESH_SWIG/batchmode_smesh.py, - SMESH_SWIG/libSMESH_Swig.i: yfr : merge 1.2 - -2003-07-10 13:18 Yves Fricaud - - * src/SMESHGUI/: SMESHGUI.h, SMESHGUI_AddAlgorithmDlg.cxx, - SMESHGUI_AddAlgorithmDlg.h, SMESHGUI_AddEdgeDlg.cxx, - SMESHGUI_AddEdgeDlg.h, SMESHGUI_AddFaceDlg.cxx, - SMESHGUI_AddFaceDlg.h, SMESHGUI_AddHypothesisDlg.cxx, - SMESHGUI_AddHypothesisDlg.h, SMESHGUI_AddSubMeshDlg.cxx, - SMESHGUI_AddSubMeshDlg.h, SMESHGUI_AddVolumeDlg.cxx, - SMESHGUI_AddVolumeDlg.h, SMESHGUI_ComputeScalarValue.cxx, - SMESHGUI_ComputeScalarValue.h, SMESHGUI_DiagonalInversionDlg.cxx, - SMESHGUI_DiagonalInversionDlg.h, - SMESHGUI_EdgesConnectivityDlg.cxx, - SMESHGUI_EdgesConnectivityDlg.h, SMESHGUI_EditHypothesesDlg.cxx, - SMESHGUI_EditHypothesesDlg.h, SMESHGUI_EditScalarBarDlg.cxx, - SMESHGUI_EditScalarBarDlg.h, SMESHGUI_InitMeshDlg.cxx, - SMESHGUI_InitMeshDlg.h, SMESHGUI_LocalLengthDlg.cxx, - SMESHGUI_LocalLengthDlg.h, SMESHGUI_MaxElementAreaDlg.cxx, - SMESHGUI_MaxElementAreaDlg.h, SMESHGUI_MaxElementVolumeDlg.cxx, - SMESHGUI_MaxElementVolumeDlg.h, SMESHGUI_MeshInfosDlg.cxx, - SMESHGUI_MeshInfosDlg.h, SMESHGUI_MoveNodesDlg.cxx, - SMESHGUI_MoveNodesDlg.h, SMESHGUI_NbSegmentsDlg.cxx, - SMESHGUI_NbSegmentsDlg.h, SMESHGUI_NodesDlg.cxx, - SMESHGUI_NodesDlg.h, SMESHGUI_OrientationElementsDlg.cxx, - SMESHGUI_OrientationElementsDlg.h, - SMESHGUI_Preferences_ColorDlg.cxx, - SMESHGUI_Preferences_ColorDlg.h, - SMESHGUI_Preferences_ScalarBarDlg.cxx, - SMESHGUI_Preferences_ScalarBarDlg.h, - SMESHGUI_RemoveElementsDlg.cxx, SMESHGUI_RemoveElementsDlg.h, - SMESHGUI_RemoveNodesDlg.cxx, SMESHGUI_RemoveNodesDlg.h, - SMESHGUI_SpinBox.cxx, SMESHGUI_SpinBox.h, SMESHGUI_StudyAPI.cxx, - SMESHGUI_StudyAPI.h, SMESHGUI_Swig.cxx, SMESHGUI_Swig.hxx, - SMESHGUI_Swig.i, SMESHGUI_TransparencyDlg.cxx, - SMESHGUI_TransparencyDlg.h, SMESHGUI_aParameterDlg.cxx, - SMESHGUI_aParameterDlg.h: yfr : merge 1.2 - -2003-07-10 12:18 Yves Fricaud - - * src/SMESHGUI/: Makefile.in, SMESHGUI.cxx: yfr : Merge V1.2 - -2003-07-10 11:35 Yves Fricaud - - * src/SMESHFiltersSelection/Makefile.in: yfr : Merge with v1.2 - -2003-07-10 10:04 Yves Fricaud - - * src/: SMESHDS/Handle_SMESHDS_Command.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/Handle_SMESHDS_Document.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_Mesh.hxx, - SMESHDS/Handle_SMESHDS_Script.hxx, - SMESHDS/Handle_SMESHDS_SubMesh.hxx, SMESHDS/Makefile.in, - SMESHDS/SMESHDS.cdl, SMESHDS/SMESHDS_Command.cdl, - SMESHDS/SMESHDS_Command.cxx, SMESHDS/SMESHDS_Command.hxx, - SMESHDS/SMESHDS_Command.ixx, SMESHDS/SMESHDS_Command.jxx, - SMESHDS/SMESHDS_CommandType.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_Document.cdl, SMESHDS/SMESHDS_Document.cxx, - SMESHDS/SMESHDS_Document.hxx, SMESHDS/SMESHDS_Document.ixx, - SMESHDS/SMESHDS_Document.jxx, SMESHDS/SMESHDS_Hypothesis.cxx, - SMESHDS/SMESHDS_Hypothesis.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListOfCommand.hxx, - SMESHDS/SMESHDS_ListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_Mesh.cdl, SMESHDS/SMESHDS_Mesh.cxx, - SMESHDS/SMESHDS_Mesh.hxx, SMESHDS/SMESHDS_Mesh.ixx, - SMESHDS/SMESHDS_Mesh.jxx, SMESHDS/SMESHDS_PtrHypothesis.hxx, - SMESHDS/SMESHDS_Script.cdl, SMESHDS/SMESHDS_Script.cxx, - SMESHDS/SMESHDS_Script.hxx, SMESHDS/SMESHDS_Script.ixx, - SMESHDS/SMESHDS_Script.jxx, SMESHDS/SMESHDS_SubMesh.cdl, - SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx, - SMESHDS/SMESHDS_SubMesh.ixx, SMESHDS/SMESHDS_SubMesh.jxx, - SMESH/Makefile.in, SMESH/SMESH_1D_Algo.cxx, - SMESH/SMESH_1D_Algo.hxx, SMESH/SMESH_2D_Algo.cxx, - SMESH/SMESH_2D_Algo.hxx, SMESH/SMESH_3D_Algo.cxx, - SMESH/SMESH_3D_Algo.hxx, SMESH/SMESH_Algo.cxx, - SMESH/SMESH_Algo.hxx, SMESH/SMESH_Gen.cxx, SMESH/SMESH_Gen.hxx, - SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx, - SMESH/SMESH_Hypothesis.cxx, SMESH/SMESH_Hypothesis.hxx, - SMESH/SMESH_HypothesisCreator.hxx, - SMESH/SMESH_HypothesisFactory.cxx, - SMESH/SMESH_HypothesisFactory.hxx, - SMESH/SMESH_LengthFromEdges.cxx, SMESH/SMESH_LengthFromEdges.hxx, - SMESH/SMESH_LocalLength.cxx, SMESH/SMESH_LocalLength.hxx, - SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx, - SMESH/SMESH_MaxElementArea.cxx, SMESH/SMESH_MaxElementArea.hxx, - SMESH/SMESH_MaxElementVolume.cxx, - SMESH/SMESH_MaxElementVolume.hxx, SMESH/SMESH_Mesh.cxx, - SMESH/SMESH_Mesh.hxx, SMESH/SMESH_NumberOfSegments.cxx, - SMESH/SMESH_NumberOfSegments.hxx, SMESH/SMESH_Quadrangle_2D.cxx, - SMESH/SMESH_Quadrangle_2D.hxx, SMESH/SMESH_Regular_1D.cxx, - SMESH/SMESH_Regular_1D.hxx, SMESH/SMESH_subMesh.cxx, - SMESH/SMESH_subMesh.hxx: yfr : Merge with v1.2 - -2003-07-10 09:49 Yves Fricaud - - * src/SMDS/: Handle_SMDSControl_BoundaryEdges.hxx, - Handle_SMDSControl_BoundaryFaces.hxx, - Handle_SMDSControl_MeshBoundary.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - Handle_SMDS_EdgePosition.hxx, Handle_SMDS_FacePosition.hxx, - Handle_SMDS_HSequenceOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMesh.hxx, - Handle_SMDS_ListNodeOfListOfMeshElement.hxx, - Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, Handle_SMDS_Mesh.hxx, - Handle_SMDS_MeshEdge.hxx, Handle_SMDS_MeshElement.hxx, - Handle_SMDS_MeshElementIDFactory.hxx, Handle_SMDS_MeshFace.hxx, - Handle_SMDS_MeshGroup.hxx, Handle_SMDS_MeshHexahedron.hxx, - Handle_SMDS_MeshIDFactory.hxx, Handle_SMDS_MeshNode.hxx, - Handle_SMDS_MeshNodeIDFactory.hxx, Handle_SMDS_MeshObject.hxx, - Handle_SMDS_MeshPrism.hxx, Handle_SMDS_MeshPyramid.hxx, - Handle_SMDS_MeshQuadrangle.hxx, Handle_SMDS_MeshTetrahedron.hxx, - Handle_SMDS_MeshTriangle.hxx, Handle_SMDS_MeshVolume.hxx, - Handle_SMDS_Position.hxx, - Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx, - Handle_SMDS_SpacePosition.hxx, - Handle_SMDS_StdMapNodeOfExtendedMap.hxx, - Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - Handle_SMDS_VertexPosition.hxx, Makefile.in, SMDS.cdl, - SMDSAbs.cdl, SMDSAbs_ElementType.hxx, SMDSControl.cdl, - SMDSControl.cxx, SMDSControl.hxx, SMDSControl.ixx, - SMDSControl.jxx, SMDSControl_BoundaryEdges.cdl, - SMDSControl_BoundaryEdges.cxx, SMDSControl_BoundaryEdges.hxx, - SMDSControl_BoundaryEdges.ixx, SMDSControl_BoundaryEdges.jxx, - SMDSControl_BoundaryFaces.cdl, SMDSControl_BoundaryFaces.cxx, - SMDSControl_BoundaryFaces.hxx, SMDSControl_BoundaryFaces.ixx, - SMDSControl_BoundaryFaces.jxx, SMDSControl_MeshBoundary.cdl, - SMDSControl_MeshBoundary.cxx, SMDSControl_MeshBoundary.hxx, - SMDSControl_MeshBoundary.ixx, SMDSControl_MeshBoundary.jxx, - SMDSEdit.cdl, SMDSEdit_Transform.cdl, SMDSEdit_Transform.cxx, - SMDSEdit_Transform.hxx, SMDSEdit_Transform.ixx, - SMDSEdit_Transform.jxx, SMDS_BasicMap.lxx, - SMDS_BasicMapIterator.lxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx, - SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx, - SMDS_DataMapOfIntegerMeshElement.hxx, - SMDS_DataMapOfIntegerMeshElement_0.cxx, - SMDS_DataMapOfPntInteger.hxx, SMDS_DataMapOfPntInteger_0.cxx, - SMDS_EdgePosition.cdl, SMDS_EdgePosition.cxx, - SMDS_EdgePosition.hxx, SMDS_EdgePosition.ixx, - SMDS_EdgePosition.jxx, SMDS_EdgePosition.lxx, - SMDS_ExtendedMap.hxx, SMDS_ExtendedMap_0.cxx, - SMDS_ExtendedOrientedMap.hxx, SMDS_ExtendedOrientedMap_0.cxx, - SMDS_FacePosition.cdl, SMDS_FacePosition.cxx, - SMDS_FacePosition.hxx, SMDS_FacePosition.ixx, - SMDS_FacePosition.jxx, SMDS_FacePosition.lxx, - SMDS_HSequenceOfMesh.hxx, SMDS_HSequenceOfMesh_0.cxx, - SMDS_ListIteratorOfListOfMesh.hxx, - SMDS_ListIteratorOfListOfMeshElement.hxx, - SMDS_ListIteratorOfListOfMeshElement_0.cxx, - SMDS_ListIteratorOfListOfMeshGroup.hxx, - SMDS_ListIteratorOfListOfMeshGroup_0.cxx, - SMDS_ListIteratorOfListOfMesh_0.cxx, - SMDS_ListNodeOfListOfMesh.hxx, - SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS_ListNodeOfListOfMeshElement_0.cxx, - SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS_ListNodeOfListOfMeshGroup_0.cxx, - SMDS_ListNodeOfListOfMesh_0.cxx, SMDS_ListOfMesh.hxx, - SMDS_ListOfMeshElement.hxx, SMDS_ListOfMeshElement_0.cxx, - SMDS_ListOfMeshGroup.hxx, SMDS_ListOfMeshGroup_0.cxx, - SMDS_ListOfMesh_0.cxx, SMDS_MapIteratorOfExtendedMap.hxx, - SMDS_MapIteratorOfExtendedMap_0.cxx, - SMDS_MapIteratorOfExtendedOrientedMap.hxx, - SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, SMDS_MapNode.lxx, - SMDS_MapOfMeshElement.cdl, SMDS_MapOfMeshElement.cxx, - SMDS_MapOfMeshElement.hxx, SMDS_MapOfMeshElement.ixx, - SMDS_MapOfMeshElement.jxx, SMDS_MapOfMeshElement.lxx, - SMDS_MapOfMeshOrientedElement.cdl, - SMDS_MapOfMeshOrientedElement.cxx, - SMDS_MapOfMeshOrientedElement.hxx, - SMDS_MapOfMeshOrientedElement.ixx, - SMDS_MapOfMeshOrientedElement.jxx, - SMDS_MapOfMeshOrientedElement.lxx, SMDS_Mesh.cdl, SMDS_Mesh.cxx, - SMDS_Mesh.hxx, SMDS_Mesh.ixx, SMDS_Mesh.jxx, SMDS_Mesh.lxx, - SMDS_MeshEdge.cdl, SMDS_MeshEdge.cxx, SMDS_MeshEdge.hxx, - SMDS_MeshEdge.ixx, SMDS_MeshEdge.jxx, SMDS_MeshEdge.lxx, - SMDS_MeshEdgesIterator.cdl, SMDS_MeshEdgesIterator.cxx, - SMDS_MeshEdgesIterator.hxx, SMDS_MeshEdgesIterator.ixx, - SMDS_MeshEdgesIterator.jxx, SMDS_MeshElement.cdl, - SMDS_MeshElement.cxx, SMDS_MeshElement.hxx, SMDS_MeshElement.ixx, - SMDS_MeshElement.jxx, SMDS_MeshElement.lxx, - SMDS_MeshElementIDFactory.cdl, SMDS_MeshElementIDFactory.cxx, - SMDS_MeshElementIDFactory.hxx, SMDS_MeshElementIDFactory.ixx, - SMDS_MeshElementIDFactory.jxx, SMDS_MeshElementIDFactory.lxx, - SMDS_MeshElementMapHasher.cdl, SMDS_MeshElementMapHasher.cxx, - SMDS_MeshElementMapHasher.hxx, SMDS_MeshElementMapHasher.ixx, - SMDS_MeshElementMapHasher.jxx, SMDS_MeshElementMapHasher.lxx, - SMDS_MeshElementsIterator.cdl, SMDS_MeshElementsIterator.cxx, - SMDS_MeshElementsIterator.hxx, SMDS_MeshElementsIterator.ixx, - SMDS_MeshElementsIterator.jxx, SMDS_MeshElementsIterator.lxx, - SMDS_MeshFace.cdl, SMDS_MeshFace.cxx, SMDS_MeshFace.hxx, - SMDS_MeshFace.ixx, SMDS_MeshFace.jxx, SMDS_MeshFace.lxx, - SMDS_MeshFacesIterator.cdl, SMDS_MeshFacesIterator.cxx, - SMDS_MeshFacesIterator.hxx, SMDS_MeshFacesIterator.ixx, - SMDS_MeshFacesIterator.jxx, SMDS_MeshGroup.cdl, - SMDS_MeshGroup.cxx, SMDS_MeshGroup.hxx, SMDS_MeshGroup.ixx, - SMDS_MeshGroup.jxx, SMDS_MeshGroup.lxx, SMDS_MeshHexahedron.cdl, - SMDS_MeshHexahedron.cxx, SMDS_MeshHexahedron.hxx, - SMDS_MeshHexahedron.ixx, SMDS_MeshHexahedron.jxx, - SMDS_MeshHexahedron.lxx, SMDS_MeshIDFactory.cdl, - SMDS_MeshIDFactory.cxx, SMDS_MeshIDFactory.hxx, - SMDS_MeshIDFactory.ixx, SMDS_MeshIDFactory.jxx, - SMDS_MeshIDFactory.lxx, SMDS_MeshNode.cdl, SMDS_MeshNode.cxx, - SMDS_MeshNode.hxx, SMDS_MeshNode.ixx, SMDS_MeshNode.jxx, - SMDS_MeshNode.lxx, SMDS_MeshNodeIDFactory.cdl, - SMDS_MeshNodeIDFactory.cxx, SMDS_MeshNodeIDFactory.hxx, - SMDS_MeshNodeIDFactory.ixx, SMDS_MeshNodeIDFactory.jxx, - SMDS_MeshNodeIDFactory.lxx, SMDS_MeshNodesIterator.cdl, - SMDS_MeshNodesIterator.cxx, SMDS_MeshNodesIterator.hxx, - SMDS_MeshNodesIterator.ixx, SMDS_MeshNodesIterator.jxx, - SMDS_MeshObject.cdl, SMDS_MeshObject.cxx, SMDS_MeshObject.hxx, - SMDS_MeshObject.ixx, SMDS_MeshObject.jxx, - SMDS_MeshOrientedElementMapHasher.cdl, - SMDS_MeshOrientedElementMapHasher.cxx, - SMDS_MeshOrientedElementMapHasher.hxx, - SMDS_MeshOrientedElementMapHasher.ixx, - SMDS_MeshOrientedElementMapHasher.jxx, - SMDS_MeshOrientedElementMapHasher.lxx, SMDS_MeshPrism.cdl, - SMDS_MeshPrism.cxx, SMDS_MeshPrism.hxx, SMDS_MeshPrism.ixx, - SMDS_MeshPrism.jxx, SMDS_MeshPrism.lxx, SMDS_MeshPyramid.cdl, - SMDS_MeshPyramid.cxx, SMDS_MeshPyramid.hxx, SMDS_MeshPyramid.ixx, - SMDS_MeshPyramid.jxx, SMDS_MeshPyramid.lxx, - SMDS_MeshQuadrangle.cdl, SMDS_MeshQuadrangle.cxx, - SMDS_MeshQuadrangle.hxx, SMDS_MeshQuadrangle.ixx, - SMDS_MeshQuadrangle.jxx, SMDS_MeshQuadrangle.lxx, - SMDS_MeshTetrahedron.cdl, SMDS_MeshTetrahedron.cxx, - SMDS_MeshTetrahedron.hxx, SMDS_MeshTetrahedron.ixx, - SMDS_MeshTetrahedron.jxx, SMDS_MeshTetrahedron.lxx, - SMDS_MeshTriangle.cdl, SMDS_MeshTriangle.cxx, - SMDS_MeshTriangle.hxx, SMDS_MeshTriangle.ixx, - SMDS_MeshTriangle.jxx, SMDS_MeshTriangle.lxx, - SMDS_MeshVolume.cdl, SMDS_MeshVolume.cxx, SMDS_MeshVolume.hxx, - SMDS_MeshVolume.ixx, SMDS_MeshVolume.jxx, SMDS_MeshVolume.lxx, - SMDS_MeshVolumesIterator.cdl, SMDS_MeshVolumesIterator.cxx, - SMDS_MeshVolumesIterator.hxx, SMDS_MeshVolumesIterator.ixx, - SMDS_MeshVolumesIterator.jxx, SMDS_PntHasher.cdl, - SMDS_PntHasher.cxx, SMDS_PntHasher.hxx, SMDS_PntHasher.ixx, - SMDS_PntHasher.jxx, SMDS_PntHasher.lxx, SMDS_Position.cdl, - SMDS_Position.cxx, SMDS_Position.hxx, SMDS_Position.ixx, - SMDS_Position.jxx, SMDS_Position.lxx, - SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, SMDS_SequenceOfMesh.hxx, - SMDS_SequenceOfMesh_0.cxx, SMDS_SpacePosition.cdl, - SMDS_SpacePosition.cxx, SMDS_SpacePosition.hxx, - SMDS_SpacePosition.ixx, SMDS_SpacePosition.jxx, - SMDS_SpacePosition.lxx, SMDS_StdMapNode.lxx, - SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS_StdMapNodeOfExtendedMap_0.cxx, - SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx, - SMDS_TypeOfPosition.hxx, SMDS_VertexPosition.cdl, - SMDS_VertexPosition.cxx, SMDS_VertexPosition.hxx, - SMDS_VertexPosition.ixx, SMDS_VertexPosition.jxx: yfr : Merge - with v1.2 - -2003-07-10 09:32 Yves Fricaud - - * src/: DriverDAT/Makefile.in, DriverUNV/Makefile.in, - MEFISTO2/Makefile.in, OBJECT/Makefile.in, OBJECT/SMESH_Actor.cxx, - OBJECT/SMESH_Actor.h, OBJECT/SMESH_Grid.cxx, OBJECT/SMESH_Grid.h: - yfr : Merge with v1.2 - -2003-07-10 09:14 Yves Fricaud - - * src/Makefile.in: yfr : Merge with v1.2 - -2003-07-10 09:00 Yves Fricaud - - * src/: Driver/Document_Reader.cxx, Driver/Document_Reader.h, - Driver/Document_Writer.cxx, Driver/Document_Writer.h, - Driver/Driver_dl.cxx, Driver/Makefile.in, Driver/Mesh_Reader.cxx, - Driver/Mesh_Reader.h, Driver/Mesh_Writer.cxx, - Driver/Mesh_Writer.h, Driver/SMESHDriver.cxx, - Driver/SMESHDriver.h, DriverDAT/DriverDAT_R_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMDS_Mesh.h, - DriverDAT/DriverDAT_R_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Document.h, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_R_SMESHDS_Mesh.h, - DriverDAT/DriverDAT_W_SMDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMDS_Mesh.h, - DriverDAT/DriverDAT_W_SMESHDS_Document.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Document.h, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - DriverDAT/DriverDAT_W_SMESHDS_Mesh.h, DriverDAT/Makefile.in, - DriverMED/DriverMED_R_SMDS_Mesh.cxx, - DriverMED/DriverMED_R_SMESHDS_Document.cxx, - DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - DriverMED/DriverMED_W_SMDS_Mesh.cxx, - DriverMED/DriverMED_W_SMESHDS_Document.cxx, - DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, DriverMED/Makefile.in, - MEFISTO2/Makefile.in, MEFISTO2/Rn.h, MEFISTO2/aptrte.cxx, - MEFISTO2/aptrte.h: yfr : Merge with v1.2 - -2003-07-10 08:12 Yves Fricaud - - * src/SMESHGUI/SMESHGUI_icons.po: Initial revision - -2003-07-10 08:09 tag V1_2 - -2003-07-10 08:09 Yves Fricaud - - * src/: DriverMED/DriverMED_R_SMESHDS_Document.h, - DriverMED/DriverMED_W_SMESHDS_Document.h, - SMESHGUI/SMESHGUI_msg_en.po: sources v1.2 - -2003-06-29 13:17 Paul Rascle - - * src/SMESH_SWIG/: Makefile.in, SMESH_shared_modules.py: PR: needed - by merge C. CAREMOLI branch CCAR_br1 - -2003-06-12 10:37 Paul Rascle - - * Makefile.in: PR: avoids unnecessary compilation after - regeneration of SALOMEconfig.h, with gcc3.2 - -2003-06-12 10:34 Paul Rascle - - * src/SMESH_SWIG/SMESH_fixation.py: PR: bug on subshapes not sorted - -2003-05-28 16:42 Nicolas Rejneri - - * adm_local/unix/make_commence.in: NRI : Add path fro GEOM and MED - idls. - -2003-05-28 16:26 Nicolas Rejneri - - * idl/Makefile.in, adm_local/unix/make_commence.in, - adm_local/unix/make_omniorb.in, build_configure, - configure.in.base: NRI : Update IDL Dependancies. - -2003-05-28 07:20 Nicolas Rejneri - - * bin/VERSION, Makefile.in: NRI : Add MODULE version info. - -2003-05-28 07:16 Nicolas Rejneri - - * configure.in.base, adm_local/unix/config_files/check_Med.m4: NRI - : Add Check of MED. - -2003-05-26 14:21 Nicolas Rejneri - - * adm_local/unix/config_files/check_Geom.m4, configure.in.base: NRI - : Add GEOM check local. - -2003-05-26 14:00 Nicolas Rejneri - - * build_configure: NRI : updated aclocal. - -2003-05-23 11:40 tag Start-v1_1a - -2003-05-23 11:40 Nicolas Rejneri - - * src/SMESHGUI/: SMESHGUI_AddAlgorithmDlg.cxx, - SMESHGUI_AddEdgeDlg.cxx, SMESHGUI_AddFaceDlg.cxx, - SMESHGUI_AddHypothesisDlg.cxx, SMESHGUI_AddSubMeshDlg.cxx, - SMESHGUI_AddVolumeDlg.cxx, SMESHGUI_DiagonalInversionDlg.cxx, - SMESHGUI_EdgesConnectivityDlg.cxx, - SMESHGUI_EditHypothesesDlg.cxx, SMESHGUI_InitMeshDlg.cxx, - SMESHGUI_LocalLengthDlg.cxx, SMESHGUI_MaxElementAreaDlg.cxx, - SMESHGUI_MaxElementVolumeDlg.cxx, SMESHGUI_MoveNodesDlg.cxx, - SMESHGUI_NbSegmentsDlg.cxx, SMESHGUI_NodesDlg.cxx, - SMESHGUI_OrientationElementsDlg.cxx, - SMESHGUI_RemoveElementsDlg.cxx, SMESHGUI_RemoveNodesDlg.cxx: NRI - : loadPixmap( "SMESH", ...) instead of "SMESHGUI". - -2003-05-22 09:52 Nicolas Rejneri - - * doc/: Makefile.in, html/Makefile.in, html/INPUT/doxyfile, - html/INPUT/sources/Application-About.png, - html/INPUT/sources/Application-About1.jpg, - html/INPUT/sources/application.gif, - html/INPUT/sources/application.jpg, - html/INPUT/sources/bg_salomepro.gif, - html/INPUT/sources/doxygen.css, html/INPUT/sources/logocorp.gif, - html/INPUT/sources/myheader.html, html/INPUT/sources/occ.gif, - html/INPUT/HTML/SMESH_BasicHypothesis.html, - html/INPUT/HTML/SMESH_Gen.html, - html/INPUT/HTML/SMESH_Hypothesis.html, - html/INPUT/HTML/SMESH_Mesh.html: NRI : Add documentation. - -2003-05-22 09:51 Nicolas Rejneri - - * configure.in.base: NRI : Add check HTML generators. - -2003-05-20 07:17 Nicolas Rejneri - - * src/: SMESH_I/SMESH_Gen_i.cxx, SMESH_I/SMESH_test.py, - SMESH_I/smeshpy.py, SMESH_SWIG/SMESH_fixation.py, - SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py, - SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test3.py, - SMESHGUI/SMESHGUI.cxx: NRI : Use GEOM instead of Geometry. - -2003-05-20 07:16 Nicolas Rejneri - - * resources/SMESHCatalog.xml: NRI : Add component-username tag. - -2003-05-20 07:15 Nicolas Rejneri - - * Makefile.in: NRI : Add SMESHCatalog.xml - -2003-05-19 14:50 Nicolas Rejneri - - * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : Add QAD_Desktop.h. - -2003-05-19 14:49 Nicolas Rejneri - - * src/SMESHGUI/Makefile.in: NRI : Add GEOM includes and libs. - -2003-05-19 14:38 Nicolas Rejneri - - * src/SMESHFiltersSelection/Makefile.in: NRI : Add KERNEL includes. - -2003-05-19 14:34 Nicolas Rejneri - - * src/SMESH_I/Makefile.in: NRI : Change lGeometryClient by - lGEOMClient. - -2003-05-19 14:32 Nicolas Rejneri - - * src/SMESH_I/Makefile.in: NRI : Add GEOM includes and libs. - -2003-05-19 14:11 Nicolas Rejneri - - * src/: SMESH/Makefile.in, SMESHDS/Makefile.in: NRI : Add KERNEL - includes and libs. - -2003-05-19 14:09 Nicolas Rejneri - - * src/: DriverDAT/Makefile.in, DriverMED/Makefile.in, - DriverUNV/Makefile.in: NRI : Add KERNEL includes. - -2003-05-19 14:08 Nicolas Rejneri - - * idl/Makefile.in: NRI : Add MED.idl - -2003-05-19 14:01 Nicolas Rejneri - - * src/: SMESH_SWIG/Makefile.in, SMESH_SWIG/SMESH_fixation.py, - SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py, - SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test2.py, - SMESH_SWIG/SMESH_test3.py, SMESH_SWIG/batchmode_smesh.py, - SMESH_SWIG/libSMESH_Swig.i, Makefile.in, - SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx, - SMESHFiltersSelection/Makefile.in, - SMESHFiltersSelection/SMESH_Type.h, - SMESHFiltersSelection/SMESH_TypeFilter.cxx, - SMESHFiltersSelection/SMESH_TypeFilter.hxx, - SMESHFiltersSelection/SMESH_TypeFilter.ixx, - SMESHFiltersSelection/SMESH_TypeFilter.jxx, MEFISTO2/Makefile.in, - MEFISTO2/Rn.h, MEFISTO2/aptrte.cxx, MEFISTO2/aptrte.h, - MEFISTO2/areteideale.f, MEFISTO2/trte.f, OBJECT/Makefile.in, - OBJECT/SMESH_Actor.cxx, OBJECT/SMESH_Actor.h, - OBJECT/SMESH_Grid.cxx, OBJECT/SMESH_Grid.h, - Driver/Document_Reader.cxx, Driver/Document_Reader.h, - Driver/Document_Writer.cxx, Driver/Document_Writer.h, - Driver/Driver_dl.cxx, Driver/Makefile.in, Driver/Mesh_Reader.cxx, - Driver/Mesh_Reader.h, Driver/Mesh_Writer.cxx, - Driver/Mesh_Writer.h, Driver/SMESHDriver.cxx, - Driver/SMESHDriver.h: NRI : First integration. - -2003-05-19 13:48 Nicolas Rejneri - - * src/: SMDS/Handle_SMDSControl_BoundaryEdges.hxx, - SMDS/Handle_SMDSControl_BoundaryFaces.hxx, - SMDS/Handle_SMDSControl_MeshBoundary.hxx, - SMDS/Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS/Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS/Handle_SMDS_EdgePosition.hxx, - SMDS/Handle_SMDS_FacePosition.hxx, - SMDS/Handle_SMDS_HSequenceOfMesh.hxx, - SMDS/Handle_SMDS_ListNodeOfListOfMesh.hxx, - SMDS/Handle_SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS/Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS/Handle_SMDS_Mesh.hxx, SMDS/Handle_SMDS_MeshEdge.hxx, - SMDS/Handle_SMDS_MeshElement.hxx, - SMDS/Handle_SMDS_MeshElementIDFactory.hxx, - SMDS/Handle_SMDS_MeshFace.hxx, SMDS/Handle_SMDS_MeshGroup.hxx, - SMDS/Handle_SMDS_MeshHexahedron.hxx, - SMDS/Handle_SMDS_MeshIDFactory.hxx, - SMDS/Handle_SMDS_MeshNode.hxx, - SMDS/Handle_SMDS_MeshNodeIDFactory.hxx, - SMDS/Handle_SMDS_MeshObject.hxx, SMDS/Handle_SMDS_MeshPrism.hxx, - SMDS/Handle_SMDS_MeshPyramid.hxx, - SMDS/Handle_SMDS_MeshQuadrangle.hxx, - SMDS/Handle_SMDS_MeshTetrahedron.hxx, - SMDS/Handle_SMDS_MeshTriangle.hxx, - SMDS/Handle_SMDS_MeshVolume.hxx, SMDS/Handle_SMDS_Position.hxx, - SMDS/Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS/Handle_SMDS_SpacePosition.hxx, - SMDS/Handle_SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS/Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS/Handle_SMDS_VertexPosition.hxx, SMDS/Makefile.in, - SMDS/SMDS.cdl, SMDS/SMDSAbs.cdl, SMDS/SMDSAbs_ElementType.hxx, - SMDS/SMDSControl.cdl, SMDS/SMDSControl.cxx, SMDS/SMDSControl.hxx, - SMDS/SMDSControl.ixx, SMDS/SMDSControl.jxx, - SMDS/SMDSControl_BoundaryEdges.cdl, - SMDS/SMDSControl_BoundaryEdges.cxx, - SMDS/SMDSControl_BoundaryEdges.hxx, - SMDS/SMDSControl_BoundaryEdges.ixx, - SMDS/SMDSControl_BoundaryEdges.jxx, - SMDS/SMDSControl_BoundaryFaces.cdl, - SMDS/SMDSControl_BoundaryFaces.cxx, - SMDS/SMDSControl_BoundaryFaces.hxx, - SMDS/SMDSControl_BoundaryFaces.ixx, - SMDS/SMDSControl_BoundaryFaces.jxx, - SMDS/SMDSControl_MeshBoundary.cdl, - SMDS/SMDSControl_MeshBoundary.cxx, - SMDS/SMDSControl_MeshBoundary.hxx, - SMDS/SMDSControl_MeshBoundary.ixx, - SMDS/SMDSControl_MeshBoundary.jxx, SMDS/SMDSEdit.cdl, - SMDS/SMDSEdit_Transform.cdl, SMDS/SMDSEdit_Transform.cxx, - SMDS/SMDSEdit_Transform.hxx, SMDS/SMDSEdit_Transform.ixx, - SMDS/SMDSEdit_Transform.jxx, SMDS/SMDS_BasicMap.lxx, - SMDS/SMDS_BasicMapIterator.lxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx, - SMDS/SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx, - SMDS/SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx, - SMDS/SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx, - SMDS/SMDS_DataMapNodeOfDataMapOfPntInteger.hxx, - SMDS/SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx, - SMDS/SMDS_DataMapOfIntegerMeshElement.hxx, - SMDS/SMDS_DataMapOfIntegerMeshElement_0.cxx, - SMDS/SMDS_DataMapOfPntInteger.hxx, - SMDS/SMDS_DataMapOfPntInteger_0.cxx, SMDS/SMDS_EdgePosition.cdl, - SMDS/SMDS_EdgePosition.cxx, SMDS/SMDS_EdgePosition.hxx, - SMDS/SMDS_EdgePosition.ixx, SMDS/SMDS_EdgePosition.jxx, - SMDS/SMDS_EdgePosition.lxx, SMDS/SMDS_ExtendedMap.hxx, - SMDS/SMDS_ExtendedMap_0.cxx, SMDS/SMDS_ExtendedOrientedMap.hxx, - SMDS/SMDS_ExtendedOrientedMap_0.cxx, SMDS/SMDS_FacePosition.cdl, - SMDS/SMDS_FacePosition.cxx, SMDS/SMDS_FacePosition.hxx, - SMDS/SMDS_FacePosition.ixx, SMDS/SMDS_FacePosition.jxx, - SMDS/SMDS_FacePosition.lxx, SMDS/SMDS_HSequenceOfMesh.hxx, - SMDS/SMDS_HSequenceOfMesh_0.cxx, - SMDS/SMDS_ListIteratorOfListOfMesh.hxx, - SMDS/SMDS_ListIteratorOfListOfMeshElement.hxx, - SMDS/SMDS_ListIteratorOfListOfMeshElement_0.cxx, - SMDS/SMDS_ListIteratorOfListOfMeshGroup.hxx, - SMDS/SMDS_ListIteratorOfListOfMeshGroup_0.cxx, - SMDS/SMDS_ListIteratorOfListOfMesh_0.cxx, - SMDS/SMDS_ListNodeOfListOfMesh.hxx, - SMDS/SMDS_ListNodeOfListOfMeshElement.hxx, - SMDS/SMDS_ListNodeOfListOfMeshElement_0.cxx, - SMDS/SMDS_ListNodeOfListOfMeshGroup.hxx, - SMDS/SMDS_ListNodeOfListOfMeshGroup_0.cxx, - SMDS/SMDS_ListNodeOfListOfMesh_0.cxx, SMDS/SMDS_ListOfMesh.hxx, - SMDS/SMDS_ListOfMeshElement.hxx, - SMDS/SMDS_ListOfMeshElement_0.cxx, SMDS/SMDS_ListOfMeshGroup.hxx, - SMDS/SMDS_ListOfMeshGroup_0.cxx, SMDS/SMDS_ListOfMesh_0.cxx, - SMDS/SMDS_Map.gxx, SMDS/SMDS_MapHasher.gxx, - SMDS/SMDS_MapIterator.gxx, - SMDS/SMDS_MapIteratorOfExtendedMap.hxx, - SMDS/SMDS_MapIteratorOfExtendedMap_0.cxx, - SMDS/SMDS_MapIteratorOfExtendedOrientedMap.hxx, - SMDS/SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, - SMDS/SMDS_MapNode.lxx, SMDS/SMDS_MapOfMeshElement.cdl, - SMDS/SMDS_MapOfMeshElement.cxx, SMDS/SMDS_MapOfMeshElement.hxx, - SMDS/SMDS_MapOfMeshElement.ixx, SMDS/SMDS_MapOfMeshElement.jxx, - SMDS/SMDS_MapOfMeshElement.lxx, - SMDS/SMDS_MapOfMeshOrientedElement.cdl, - SMDS/SMDS_MapOfMeshOrientedElement.cxx, - SMDS/SMDS_MapOfMeshOrientedElement.hxx, - SMDS/SMDS_MapOfMeshOrientedElement.ixx, - SMDS/SMDS_MapOfMeshOrientedElement.jxx, - SMDS/SMDS_MapOfMeshOrientedElement.lxx, SMDS/SMDS_Mesh.cdl, - SMDS/SMDS_Mesh.cxx, SMDS/SMDS_Mesh.hxx, SMDS/SMDS_Mesh.ixx, - SMDS/SMDS_Mesh.jxx, SMDS/SMDS_Mesh.lxx, SMDS/SMDS_MeshEdge.cdl, - SMDS/SMDS_MeshEdge.cxx, SMDS/SMDS_MeshEdge.hxx, - SMDS/SMDS_MeshEdge.ixx, SMDS/SMDS_MeshEdge.jxx, - SMDS/SMDS_MeshEdge.lxx, SMDS/SMDS_MeshEdgesIterator.cdl, - SMDS/SMDS_MeshEdgesIterator.cxx, SMDS/SMDS_MeshEdgesIterator.hxx, - SMDS/SMDS_MeshEdgesIterator.ixx, SMDS/SMDS_MeshEdgesIterator.jxx, - SMDS/SMDS_MeshElement.cdl, SMDS/SMDS_MeshElement.cxx, - SMDS/SMDS_MeshElement.hxx, SMDS/SMDS_MeshElement.ixx, - SMDS/SMDS_MeshElement.jxx, SMDS/SMDS_MeshElement.lxx, - SMDS/SMDS_MeshElementIDFactory.cdl, - SMDS/SMDS_MeshElementIDFactory.cxx, - SMDS/SMDS_MeshElementIDFactory.hxx, - SMDS/SMDS_MeshElementIDFactory.ixx, - SMDS/SMDS_MeshElementIDFactory.jxx, - SMDS/SMDS_MeshElementIDFactory.lxx, - SMDS/SMDS_MeshElementMapHasher.cdl, - SMDS/SMDS_MeshElementMapHasher.cxx, - SMDS/SMDS_MeshElementMapHasher.hxx, - SMDS/SMDS_MeshElementMapHasher.ixx, - SMDS/SMDS_MeshElementMapHasher.jxx, - SMDS/SMDS_MeshElementMapHasher.lxx, - SMDS/SMDS_MeshElementsIterator.cdl, - SMDS/SMDS_MeshElementsIterator.cxx, - SMDS/SMDS_MeshElementsIterator.hxx, - SMDS/SMDS_MeshElementsIterator.ixx, - SMDS/SMDS_MeshElementsIterator.jxx, - SMDS/SMDS_MeshElementsIterator.lxx, SMDS/SMDS_MeshFace.cdl, - SMDS/SMDS_MeshFace.cxx, SMDS/SMDS_MeshFace.hxx, - SMDS/SMDS_MeshFace.ixx, SMDS/SMDS_MeshFace.jxx, - SMDS/SMDS_MeshFace.lxx, SMDS/SMDS_MeshFacesIterator.cdl, - SMDS/SMDS_MeshFacesIterator.cxx, SMDS/SMDS_MeshFacesIterator.hxx, - SMDS/SMDS_MeshFacesIterator.ixx, SMDS/SMDS_MeshFacesIterator.jxx, - SMDS/SMDS_MeshGroup.cdl, SMDS/SMDS_MeshGroup.cxx, - SMDS/SMDS_MeshGroup.hxx, SMDS/SMDS_MeshGroup.ixx, - SMDS/SMDS_MeshGroup.jxx, SMDS/SMDS_MeshGroup.lxx, - SMDS/SMDS_MeshHexahedron.cdl, SMDS/SMDS_MeshHexahedron.cxx, - SMDS/SMDS_MeshHexahedron.hxx, SMDS/SMDS_MeshHexahedron.ixx, - SMDS/SMDS_MeshHexahedron.jxx, SMDS/SMDS_MeshHexahedron.lxx, - SMDS/SMDS_MeshIDFactory.cdl, SMDS/SMDS_MeshIDFactory.cxx, - SMDS/SMDS_MeshIDFactory.ixx, SMDS/SMDS_MeshIDFactory.jxx, - SMDS/SMDS_MeshIDFactory.lxx, SMDS/SMDS_MeshNode.cdl, - SMDS/SMDS_MeshNode.cxx, SMDS/SMDS_MeshNode.hxx, - SMDS/SMDS_MeshNode.ixx, SMDS/SMDS_MeshNode.jxx, - SMDS/SMDS_MeshNode.lxx, SMDS/SMDS_MeshNodeIDFactory.cdl, - SMDS/SMDS_MeshNodeIDFactory.cxx, SMDS/SMDS_MeshNodeIDFactory.hxx, - SMDS/SMDS_MeshNodeIDFactory.ixx, SMDS/SMDS_MeshNodeIDFactory.jxx, - SMDS/SMDS_MeshNodeIDFactory.lxx, SMDS/SMDS_MeshNodesIterator.cdl, - SMDS/SMDS_MeshNodesIterator.cxx, SMDS/SMDS_MeshNodesIterator.hxx, - SMDS/SMDS_MeshNodesIterator.ixx, SMDS/SMDS_MeshNodesIterator.jxx, - SMDS/SMDS_MeshObject.cdl, SMDS/SMDS_MeshObject.cxx, - SMDS/SMDS_MeshObject.hxx, SMDS/SMDS_MeshObject.ixx, - SMDS/SMDS_MeshObject.jxx, - SMDS/SMDS_MeshOrientedElementMapHasher.cdl, - SMDS/SMDS_MeshOrientedElementMapHasher.cxx, - SMDS/SMDS_MeshOrientedElementMapHasher.hxx, - SMDS/SMDS_MeshOrientedElementMapHasher.ixx, - SMDS/SMDS_MeshOrientedElementMapHasher.jxx, - SMDS/SMDS_MeshOrientedElementMapHasher.lxx, - SMDS/SMDS_MeshPrism.cdl, SMDS/SMDS_MeshPrism.cxx, - SMDS/SMDS_MeshPrism.hxx, SMDS/SMDS_MeshPrism.ixx, - SMDS/SMDS_MeshPrism.jxx, SMDS/SMDS_MeshPrism.lxx, - SMDS/SMDS_MeshPyramid.cdl, SMDS/SMDS_MeshPyramid.cxx, - SMDS/SMDS_MeshPyramid.hxx, SMDS/SMDS_MeshPyramid.ixx, - SMDS/SMDS_MeshPyramid.jxx, SMDS/SMDS_MeshPyramid.lxx, - SMDS/SMDS_MeshQuadrangle.cdl, SMDS/SMDS_MeshQuadrangle.cxx, - SMDS/SMDS_MeshQuadrangle.hxx, SMDS/SMDS_MeshQuadrangle.ixx, - SMDS/SMDS_MeshQuadrangle.jxx, SMDS/SMDS_MeshQuadrangle.lxx, - SMDS/SMDS_MeshTetrahedron.cdl, SMDS/SMDS_MeshTetrahedron.cxx, - SMDS/SMDS_MeshTetrahedron.hxx, SMDS/SMDS_MeshTetrahedron.ixx, - SMDS/SMDS_MeshTetrahedron.jxx, SMDS/SMDS_MeshTetrahedron.lxx, - SMDS/SMDS_MeshTriangle.cdl, SMDS/SMDS_MeshTriangle.cxx, - SMDS/SMDS_MeshTriangle.hxx, SMDS/SMDS_MeshTriangle.ixx, - SMDS/SMDS_MeshTriangle.jxx, SMDS/SMDS_MeshTriangle.lxx, - SMDS/SMDS_MeshVolume.cdl, SMDS/SMDS_MeshVolume.cxx, - SMDS/SMDS_MeshVolume.hxx, SMDS/SMDS_MeshVolume.ixx, - SMDS/SMDS_MeshVolume.jxx, SMDS/SMDS_MeshVolume.lxx, - SMDS/SMDS_MeshVolumesIterator.cdl, - SMDS/SMDS_MeshVolumesIterator.cxx, - SMDS/SMDS_MeshVolumesIterator.hxx, - SMDS/SMDS_MeshVolumesIterator.ixx, - SMDS/SMDS_MeshVolumesIterator.jxx, SMDS/SMDS_PntHasher.cdl, - SMDS/SMDS_PntHasher.cxx, SMDS/SMDS_PntHasher.hxx, - SMDS/SMDS_PntHasher.ixx, SMDS/SMDS_PntHasher.jxx, - SMDS/SMDS_PntHasher.lxx, SMDS/SMDS_Position.cdl, - SMDS/SMDS_Position.cxx, SMDS/SMDS_Position.hxx, - SMDS/SMDS_Position.ixx, SMDS/SMDS_Position.jxx, - SMDS/SMDS_Position.lxx, - SMDS/SMDS_SequenceNodeOfSequenceOfMesh.hxx, - SMDS/SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, - SMDS/SMDS_SequenceOfMesh.hxx, SMDS/SMDS_SequenceOfMesh_0.cxx, - SMDS/SMDS_SpacePosition.cdl, SMDS/SMDS_SpacePosition.cxx, - SMDS/SMDS_SpacePosition.hxx, SMDS/SMDS_SpacePosition.ixx, - SMDS/SMDS_SpacePosition.jxx, SMDS/SMDS_SpacePosition.lxx, - SMDS/SMDS_StdMapNode.gxx, SMDS/SMDS_StdMapNode.lxx, - SMDS/SMDS_StdMapNodeOfExtendedMap.hxx, - SMDS/SMDS_StdMapNodeOfExtendedMap_0.cxx, - SMDS/SMDS_StdMapNodeOfExtendedOrientedMap.hxx, - SMDS/SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx, - SMDS/SMDS_TypeOfPosition.hxx, SMDS/SMDS_VertexPosition.cdl, - SMDS/SMDS_VertexPosition.cxx, SMDS/SMDS_VertexPosition.hxx, - SMDS/SMDS_VertexPosition.ixx, SMDS/SMDS_VertexPosition.jxx, - SMDS/SMDS_MeshIDFactory.hxx, SMESH_I/Makefile.in, - SMESH_I/SMESH_1D_Algo_i.cxx, SMESH_I/SMESH_1D_Algo_i.hxx, - SMESH_I/SMESH_2D_Algo_i.cxx, SMESH_I/SMESH_2D_Algo_i.hxx, - SMESH_I/SMESH_3D_Algo_i.cxx, SMESH_I/SMESH_3D_Algo_i.hxx, - SMESH_I/SMESH_Algo_i.cxx, SMESH_I/SMESH_Algo_i.hxx, - SMESH_I/SMESH_Gen_i.cxx, SMESH_I/SMESH_Gen_i.hxx, - SMESH_I/SMESH_Hexa_3D_i.cxx, SMESH_I/SMESH_Hexa_3D_i.hxx, - SMESH_I/SMESH_HypothesisFactory_i.cxx, - SMESH_I/SMESH_HypothesisFactory_i.hxx, - SMESH_I/SMESH_Hypothesis_i.cxx, SMESH_I/SMESH_Hypothesis_i.hxx, - SMESH_I/SMESH_LocalLength_i.cxx, SMESH_I/SMESH_LocalLength_i.hxx, - SMESH_I/SMESH_MEDFamily_i.cxx, SMESH_I/SMESH_MEDFamily_i.hxx, - SMESH_I/SMESH_MEDMesh_i.cxx, SMESH_I/SMESH_MEDMesh_i.hxx, - SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MEDSupport_i.hxx, - SMESH_I/SMESH_MEFISTO_2D_i.cxx, SMESH_I/SMESH_MEFISTO_2D_i.hxx, - SMESH_I/SMESH_MaxElementArea_i.cxx, - SMESH_I/SMESH_MaxElementArea_i.hxx, - SMESH_I/SMESH_MaxElementVolume_i.cxx, - SMESH_I/SMESH_MaxElementVolume_i.hxx, - SMESH_I/SMESH_MeshEditor_i.cxx, SMESH_I/SMESH_MeshEditor_i.hxx, - SMESH_I/SMESH_Mesh_i.cxx, SMESH_I/SMESH_Mesh_i.hxx, - SMESH_I/SMESH_NumberOfSegments_i.cxx, - SMESH_I/SMESH_NumberOfSegments_i.hxx, - SMESH_I/SMESH_Quadrangle_2D_i.cxx, - SMESH_I/SMESH_Quadrangle_2D_i.hxx, - SMESH_I/SMESH_Regular_1D_i.cxx, SMESH_I/SMESH_Regular_1D_i.hxx, - SMESH_I/SMESH_subMesh_i.cxx, SMESH_I/SMESH_subMesh_i.hxx, - SMESH_I/SMESH_test.py, SMESH_I/SMESH_topo.cxx, - SMESH_I/SMESH_topo.hxx, SMESH_I/smeshpy.py, SMESH_I/sstream, - SMESHGUI/Makefile.in, SMESHGUI/SMESHGUI.cxx, SMESHGUI/SMESHGUI.h, - SMESHGUI/SMESHGUI_AddAlgorithmDlg.cxx, - SMESHGUI/SMESHGUI_AddAlgorithmDlg.h, - SMESHGUI/SMESHGUI_AddEdgeDlg.cxx, SMESHGUI/SMESHGUI_AddEdgeDlg.h, - SMESHGUI/SMESHGUI_AddFaceDlg.cxx, SMESHGUI/SMESHGUI_AddFaceDlg.h, - SMESHGUI/SMESHGUI_AddHypothesisDlg.cxx, - SMESHGUI/SMESHGUI_AddHypothesisDlg.h, - SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx, - SMESHGUI/SMESHGUI_AddSubMeshDlg.h, - SMESHGUI/SMESHGUI_AddVolumeDlg.cxx, - SMESHGUI/SMESHGUI_AddVolumeDlg.h, - SMESHGUI/SMESHGUI_ComputeScalarValue.cxx, - SMESHGUI/SMESHGUI_ComputeScalarValue.h, - SMESHGUI/SMESHGUI_DiagonalInversionDlg.cxx, - SMESHGUI/SMESHGUI_DiagonalInversionDlg.h, - SMESHGUI/SMESHGUI_EdgesConnectivityDlg.cxx, - SMESHGUI/SMESHGUI_EdgesConnectivityDlg.h, - SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx, - SMESHGUI/SMESHGUI_EditHypothesesDlg.h, - SMESHGUI/SMESHGUI_EditScalarBarDlg.cxx, - SMESHGUI/SMESHGUI_EditScalarBarDlg.h, - SMESHGUI/SMESHGUI_InitMeshDlg.cxx, - SMESHGUI/SMESHGUI_InitMeshDlg.h, - SMESHGUI/SMESHGUI_LocalLengthDlg.cxx, - SMESHGUI/SMESHGUI_LocalLengthDlg.h, - SMESHGUI/SMESHGUI_MaxElementAreaDlg.cxx, - SMESHGUI/SMESHGUI_MaxElementAreaDlg.h, - SMESHGUI/SMESHGUI_MaxElementVolumeDlg.cxx, - SMESHGUI/SMESHGUI_MaxElementVolumeDlg.h, - SMESHGUI/SMESHGUI_MeshInfosDlg.cxx, - SMESHGUI/SMESHGUI_MeshInfosDlg.h, - SMESHGUI/SMESHGUI_MoveNodesDlg.cxx, - SMESHGUI/SMESHGUI_MoveNodesDlg.h, - SMESHGUI/SMESHGUI_NbSegmentsDlg.cxx, - SMESHGUI/SMESHGUI_NbSegmentsDlg.h, - SMESHGUI/SMESHGUI_NodesDlg.cxx, SMESHGUI/SMESHGUI_NodesDlg.h, - SMESHGUI/SMESHGUI_OrientationElementsDlg.cxx, - SMESHGUI/SMESHGUI_OrientationElementsDlg.h, - SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx, - SMESHGUI/SMESHGUI_Preferences_ColorDlg.h, - SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx, - SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h, - SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx, - SMESHGUI/SMESHGUI_RemoveElementsDlg.h, - SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx, - SMESHGUI/SMESHGUI_RemoveNodesDlg.h, - SMESHGUI/SMESHGUI_SpinBox.cxx, SMESHGUI/SMESHGUI_SpinBox.h, - SMESHGUI/SMESHGUI_StudyAPI.cxx, SMESHGUI/SMESHGUI_StudyAPI.h, - SMESHGUI/SMESHGUI_Swig.cxx, SMESHGUI/SMESHGUI_Swig.hxx, - SMESHGUI/SMESHGUI_Swig.i, SMESHGUI/SMESHGUI_TransparencyDlg.cxx, - SMESHGUI/SMESHGUI_TransparencyDlg.h, - SMESHGUI/SMESHGUI_aParameterDlg.cxx, - SMESHGUI/SMESHGUI_aParameterDlg.h, SMESHGUI/SMESH_icons.po, - SMESHGUI/SMESH_msg_en.po: NRI : First integration. - -2003-05-19 13:18 Nicolas Rejneri - - * src/: SMESH/Makefile.in, SMESH/SMESH_1D_Algo.cxx, - SMESH/SMESH_1D_Algo.hxx, SMESH/SMESH_2D_Algo.cxx, - SMESH/SMESH_2D_Algo.hxx, SMESH/SMESH_3D_Algo.cxx, - SMESH/SMESH_3D_Algo.hxx, SMESH/SMESH_Algo.cxx, - SMESH/SMESH_Algo.hxx, SMESH/SMESH_Gen.cxx, SMESH/SMESH_Gen.hxx, - SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx, - SMESH/SMESH_Hypothesis.cxx, SMESH/SMESH_Hypothesis.hxx, - SMESH/SMESH_HypothesisCreator.hxx, - SMESH/SMESH_HypothesisFactory.cxx, - SMESH/SMESH_HypothesisFactory.hxx, - SMESH/SMESH_LengthFromEdges.cxx, SMESH/SMESH_LengthFromEdges.hxx, - SMESH/SMESH_LocalLength.cxx, SMESH/SMESH_LocalLength.hxx, - SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx, - SMESH/SMESH_MaxElementArea.cxx, SMESH/SMESH_MaxElementArea.hxx, - SMESH/SMESH_MaxElementVolume.cxx, - SMESH/SMESH_MaxElementVolume.hxx, SMESH/SMESH_Mesh.cxx, - SMESH/SMESH_Mesh.hxx, SMESH/SMESH_NumberOfSegments.cxx, - SMESH/SMESH_NumberOfSegments.hxx, SMESH/SMESH_Quadrangle_2D.cxx, - SMESH/SMESH_Quadrangle_2D.hxx, SMESH/SMESH_Regular_1D.cxx, - SMESH/SMESH_Regular_1D.hxx, SMESH/SMESH_subMesh.cxx, - SMESH/SMESH_subMesh.hxx, SMESHDS/Handle_SMESHDS_Command.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/Handle_SMESHDS_Mesh.hxx, - SMESHDS/Handle_SMESHDS_Script.hxx, SMESHDS/Makefile.in, - SMESHDS/SMESHDS_Command.cdl, SMESHDS/SMESHDS_Command.cxx, - SMESHDS/SMESHDS_Command.ixx, SMESHDS/SMESHDS_Command.jxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfIntegerSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh.hxx, - SMESHDS/SMESHDS_DataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_Document.cdl, SMESHDS/SMESHDS_Document.hxx, - SMESHDS/SMESHDS_Document.ixx, SMESHDS/SMESHDS_Hypothesis.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfCommand_0.cxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListOfCommand.hxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_Mesh.cdl, SMESHDS/SMESHDS_Mesh.hxx, - SMESHDS/SMESHDS_Script.cdl, SMESHDS/SMESHDS_Script.cxx, - SMESHDS/SMESHDS_Script.hxx, SMESHDS/SMESHDS_Script.ixx, - SMESHDS/SMESHDS_Script.jxx, SMESHDS/SMESHDS_SubMesh.cdl, - SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx, - SMESHDS/SMESHDS_SubMesh.ixx, SMESHDS/SMESHDS_SubMesh.jxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx, - SMESHDS/Handle_SMESHDS_Document.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx, - SMESHDS/Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx, - SMESHDS/Handle_SMESHDS_SubMesh.hxx, SMESHDS/SMESHDS.cdl, - SMESHDS/SMESHDS_Command.hxx, SMESHDS/SMESHDS_CommandType.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx, - SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_Document.cxx, SMESHDS/SMESHDS_Document.jxx, - SMESHDS/SMESHDS_Hypothesis.cxx, - SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx, - SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx, - SMESHDS/SMESHDS_ListOfAsciiString.hxx, - SMESHDS/SMESHDS_ListOfAsciiString_0.cxx, - SMESHDS/SMESHDS_ListOfCommand_0.cxx, SMESHDS/SMESHDS_Mesh.cxx, - SMESHDS/SMESHDS_Mesh.ixx, SMESHDS/SMESHDS_Mesh.jxx, - SMESHDS/SMESHDS_PtrHypothesis.hxx: NRI : First integration. - -2003-05-19 13:03 Nicolas Rejneri - - * Makefile.in, build_configure, configure.in.base, - resources/ModuleMesh.png, resources/SMESHCatalog.xml, - resources/SMESH_en.xml, resources/SMESH_fr.xml, - resources/delete.png, resources/mesh.png, - resources/mesh_add_sub.png, resources/mesh_algo_hexa.png, - resources/mesh_algo_mefisto.png, resources/mesh_algo_quad.png, - resources/mesh_algo_regular.png, resources/mesh_angle.png, - resources/mesh_area.png, resources/mesh_aspect.png, - resources/mesh_compute.png, resources/mesh_connectivity.png, - resources/mesh_diagonal.png, resources/mesh_edit.png, - resources/mesh_hexa.png, resources/mesh_hexa_n.png, - resources/mesh_hypo_area.png, resources/mesh_hypo_length.png, - resources/mesh_hypo_segment.png, resources/mesh_hypo_volume.png, - resources/mesh_info.png, resources/mesh_init.png, - resources/mesh_length.png, resources/mesh_line.png, - resources/mesh_line_n.png, resources/mesh_move_node.png, - resources/mesh_orientation.png, resources/mesh_pyramid.png, - resources/mesh_pyramid_n.png, resources/mesh_quad.png, - resources/mesh_quad_n.png, resources/mesh_rem_element.png, - resources/mesh_rem_node.png, resources/mesh_set_algo.png, - resources/mesh_set_hypo.png, resources/mesh_shading.png, - resources/mesh_shrink.png, resources/mesh_skew.png, - resources/mesh_taper.png, resources/mesh_tetra.png, - resources/mesh_tetra_n.png, resources/mesh_tree_algo.png, - resources/mesh_tree_algo_hexa.png, - resources/mesh_tree_algo_mefisto.png, - resources/mesh_tree_algo_quad.png, - resources/mesh_tree_algo_regular.png, - resources/mesh_tree_hypo.png, resources/mesh_tree_hypo_area.png, - resources/mesh_tree_hypo_length.png, - resources/mesh_tree_hypo_segment.png, - resources/mesh_tree_hypo_volume.png, - resources/mesh_tree_mesh.png, resources/mesh_tree_mesh_warn.png, - resources/mesh_triangle.png, resources/mesh_triangle_n.png, - resources/mesh_update.png, resources/mesh_vertex.png, - resources/mesh_vertex_n.png, resources/mesh_wireframe.png, - resources/mesh_wrap.png, resources/select1.png, idl/Makefile.in, - idl/SMESH_BasicHypothesis.idl, idl/SMESH_Gen.idl, - idl/SMESH_Hypothesis.idl, idl/SMESH_Mesh.idl, - src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx, - src/DriverDAT/DriverDAT_R_SMDS_Mesh.h, - src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx, - src/DriverDAT/DriverDAT_R_SMESHDS_Document.h, - src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx, - src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h, - src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx, - src/DriverDAT/DriverDAT_W_SMDS_Mesh.h, - src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx, - src/DriverDAT/DriverDAT_W_SMESHDS_Document.h, - src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx, - src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h, - src/DriverDAT/Makefile.in, - src/DriverMED/DriverMED_R_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_R_SMESHDS_Document.cxx, - src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMDS_Mesh.cxx, - src/DriverMED/DriverMED_W_SMESHDS_Document.cxx, - src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, - src/DriverMED/Makefile.in, - src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx, - src/DriverUNV/DriverUNV_R_SMDS_Mesh.h, - src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx, - src/DriverUNV/DriverUNV_R_SMESHDS_Document.h, - src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx, - src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h, - src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx, - src/DriverUNV/DriverUNV_W_SMDS_Mesh.h, - src/DriverUNV/DriverUNV_W_SMESHDS_Document.cxx, - src/DriverUNV/DriverUNV_W_SMESHDS_Document.h, - src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx, - src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h, - src/DriverUNV/Makefile.in: NRI : First integration. - -2003-03-07 14:55 tag V1 - -2003-03-07 14:55 cvsadmin - - * src/DriverMED/: DriverMED_R_SMESHDS_Document.h, - DriverMED_W_SMESHDS_Document.h: - Initialisation module SMESH_SRC de la base SMESH - -2003-03-07 14:55 cvsadmin - - * src/DriverMED/: DriverMED_R_SMDS_Mesh.cxx, - DriverMED_R_SMDS_Mesh.h, DriverMED_R_SMESHDS_Document.cxx, - DriverMED_R_SMESHDS_Mesh.cxx, DriverMED_R_SMESHDS_Mesh.h, - DriverMED_W_SMDS_Mesh.cxx, DriverMED_W_SMDS_Mesh.h, - DriverMED_W_SMESHDS_Document.cxx, DriverMED_W_SMESHDS_Mesh.cxx, - DriverMED_W_SMESHDS_Mesh.h, Makefile.in: Initial revision - diff --git a/LICENCE b/LICENCE deleted file mode 100644 index b1e3f5a26..000000000 --- a/LICENCE +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/adm_local/unix/config_files/check_Geom.m4 b/adm_local/unix/config_files/check_Geom.m4 deleted file mode 100644 index 13f3be40c..000000000 --- a/adm_local/unix/config_files/check_Geom.m4 +++ /dev/null @@ -1,45 +0,0 @@ -# Check availability of Geom binary distribution -# -# Author : Nicolas REJNERI (OPEN CASCADE, 2003) -# - -AC_DEFUN([CHECK_GEOM],[ - -AC_CHECKING(for Geom) - -Geom_ok=no - -AC_ARG_WITH(geom, - [ --with-geom=DIR root directory path of GEOM installation ], - GEOM_DIR="$withval",GEOM_DIR="") - -if test "x$GEOM_DIR" == "x" ; then - -# no --with-geom-dir option used - - if test "x$GEOM_ROOT_DIR" != "x" ; then - - # GEOM_ROOT_DIR environment variable defined - GEOM_DIR=$GEOM_ROOT_DIR - - fi -# -fi - -if test -f ${GEOM_DIR}/lib/salome/libGEOMClient.so ; then - Geom_ok=yes - AC_MSG_RESULT(Using Geom module distribution in ${GEOM_DIR}) - - if test "x$GEOM_ROOT_DIR" == "x" ; then - GEOM_ROOT_DIR=${GEOM_DIR} - fi - AC_SUBST(GEOM_ROOT_DIR) - -else - AC_MSG_WARN("Cannot find compiled Geom module distribution") -fi - -AC_MSG_RESULT(for Geom: $Geom_ok) - -])dnl - diff --git a/adm_local/unix/config_files/check_Med.m4 b/adm_local/unix/config_files/check_Med.m4 deleted file mode 100644 index 727bf4381..000000000 --- a/adm_local/unix/config_files/check_Med.m4 +++ /dev/null @@ -1,45 +0,0 @@ -# Check availability of Med binary distribution -# -# Author : Nicolas REJNERI (OPEN CASCADE, 2003) -# - -AC_DEFUN([CHECK_MED],[ - -AC_CHECKING(for Med) - -Med_ok=no - -AC_ARG_WITH(med, - [ --with-med=DIR root directory path of MED installation ], - MED_DIR="$withval",MED_DIR="") - -if test "x$MED_DIR" == "x" ; then - -# no --with-med-dir option used - - if test "x$MED_ROOT_DIR" != "x" ; then - - # MED_ROOT_DIR environment variable defined - MED_DIR=$MED_ROOT_DIR - - fi -# -fi - -if test -f ${MED_DIR}/idl/salome/MED.idl ; then - Med_ok=yes - AC_MSG_RESULT(Using Med module distribution in ${MED_DIR}) - - if test "x$MED_ROOT_DIR" == "x" ; then - MED_ROOT_DIR=${MED_DIR} - fi - AC_SUBST(MED_ROOT_DIR) - -else - AC_MSG_WARN("Cannot find Med module sources") -fi - -AC_MSG_RESULT(for Med: $Med_ok) - -])dnl - diff --git a/adm_local/unix/make_conclude.in b/adm_local/unix/make_conclude.in deleted file mode 100644 index f4827fd31..000000000 --- a/adm_local/unix/make_conclude.in +++ /dev/null @@ -1,342 +0,0 @@ -#======================================================================= -# This section of this makefile comes from the file -# 'adm/unix/make_conclude' which was generated with config.status -# from file adm/unix/make_conclude.in -#======================================================================= -# -* Makefile *- -# -# Authors : Patrick GOLDBRONN (CEA) - Marc Tajchman (CEA) -# Date : 6/07/2001 -# $Header$ -# - -# ORB Specifics rules -@CORBA@ - -# transform idl reference in appropriate obj file -LIB_CLIENT_SRC = $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_CXX)) -LIB_SERVER_SRC = $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_CXX)) -LIB_MOC_SRC = $(LIB_MOC:%.h=%_moc.cxx) -LIB_SRC+=$(LIB_MOC_SRC) -LIB_SWIG_SRC = $(SWIG_DEF:%.i=%_wrap.cxx) -LIB_DEP= $(LIB_SRC) $(LIB_CLIENT_SRC) $(LIB_SERVER_SRC) $(LIB_SWIG_SRC) - -LIB_CLIENT_OBJ = $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_OBJ)) -LIB_SERVER_OBJ = $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_OBJ)) - - -# transform c file in appropriate libtool obj file (.c, .cc and .cxx) -LIB_OBJ_C = $(patsubst %.c, %.lo, $(filter %.c, $(LIB_SRC))) -LIB_OBJ_CC = $(patsubst %.cc, %.lo, $(filter %.cc, $(LIB_SRC))) -LIB_OBJ_CXX = $(patsubst %.cxx, %.lo, $(filter %.cxx, $(LIB_SRC))) -LIB_SWIG_OBJ = $(LIB_SWIG_SRC:%.cxx=%.lo) -LIB_OBJ_F = $(patsubst %.f, %.lo, $(filter %.f, $(LIB_SRC))) - -# all libtool obj file in library -LIB_OBJ = $(LIB_OBJ_CXX) $(LIB_OBJ_CC) $(LIB_OBJ_C) $(LIB_CLIENT_OBJ:%.o=%.lo) $(LIB_SERVER_OBJ:%.o=%.lo) $(LIB_SWIG_OBJ) $(LIB_OBJ_F) - -# LIB_BUILD = $(LIB:%.la=$(top_builddir)/lib/salome/%.la) -LIB_BUILD = $(patsubst %.la, $(top_builddir)/lib/salome/%.la, $(filter %.la, $(LIB))) -LIB_BUILD_A = $(patsubst %.a, $(top_builddir)/lib/salome/%.a, $(filter %.a, $(LIB))) - -ifneq ($(findstring cmodule.la,$(filter %.la, $(LIB))),) -LIB_SWIG = $(patsubst %cmodule.la,%.so, $(filter %.la, $(LIB))) -else -LIB_SWIG = -endif - -lib: $(LIB_BUILD) $(LIB_CLIENT_PY) -# we don't build static library ! - -$(LIB_BUILD): $(top_builddir)/lib/salome/%.la: %.la - -$(RM) $@ - -$(RM) $(patsubst %.la, %.so, $@) - -$(RM) $(patsubst %.la, %.a, $@) - ln -sf $(CURDIR)/$< $@ || true - ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<) \ - $(patsubst %.la, %.so, $@) || true - ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<).0 \ - $(patsubst %.la, %.so, $@).0 || true - - if ! test -z $(LIB_SWIG) ; then \ - ln -sf $(patsubst %.la,%.so, $(CURDIR)/.libs/$<) $(top_builddir)/lib/salome/_$(LIB_SWIG) || true;\ - fi; - -$(LIB_BUILD_A): $(top_builddir)/lib/salome/%.a: %.a - -$(RM) $@ - ln -sf $(CURDIR)/$< $@ || true - -$(LIB): $(LIB_OBJ) - @$(LT) --mode=link $(CXX) -rpath $(libdir) -o $@ $(CXXFLAGS) $(LIB_OBJ) $(LDFLAGS) $(LIBS) - -# transform idl reference in appropriate obj file -BIN_CLIENT_SRC = $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_CXX)) -BIN_SERVER_SRC = $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_CXX)) -BIN_MOC_SRC = $(BIN_MOC:%.h=%_moc.cxx) -BIN_SRC+=$(BIN_MOC_SRC) -BIN_DEP=$(BIN:%=%.cxx) $(BIN_SRC) $(BIN_CLIENT_SRC) $(BIN_SERVER_SRC) - -BIN_CLIENT_OBJ = $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_OBJ)) -BIN_SERVER_OBJ = $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_OBJ)) -# transform c file in appropriate libtool obj file (.c) -BIN_OBJ_C = $(patsubst %.c, %.o, $(filter %.c, $(BIN_SRC))) -# transform c++ file in appropriate libtool obj file (.cc and .cxx) -BIN_OBJ_CC = $(patsubst %.cc, %.o, $(filter %.cc, $(BIN_SRC))) -BIN_OBJ_CXX = $(patsubst %.cxx, %.o, $(filter %.cxx, $(BIN_SRC))) -# all obj file in bin target -BIN_OBJ = $(BIN_OBJ_CC) $(BIN_OBJ_CXX) $(BIN_OBJ_C) $(BIN_CLIENT_OBJ) $(BIN_SERVER_OBJ) - -bin: $(BIN:%=$(top_builddir)/bin/salome/%) $(BIN) $(LIB) pyscripts sharedpyscripts - -BIN_LIB=$(LIB:lib%.la=-l%) - -$(BIN:%=$(top_builddir)/bin/salome/%) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%): $(top_builddir)/bin/salome/%: % - -$(RM) $@ - ln -sf $(CURDIR)/$< $@ - -$(BIN) $(TEST_PROGS): %: %.lo $(BIN_OBJ) - $(CXX) $(CXXFLAGS) -o $@ $^ $(BIN_LIB) $(LDFLAGSFORBIN) $(LIBSFORBIN) - -# copy python scripts in $(top_builddir)/bin/salome -# -DEST_PYSCRIPTS = $(EXPORT_PYSCRIPTS:%=$(top_builddir)/bin/salome/%) -pyscripts: $(DEST_PYSCRIPTS) -$(DEST_PYSCRIPTS): $(top_builddir)/bin/salome/%: % - cp -f $< $@ - -# copy pyqt files in $(PYTHON_SHARED_SITE) -# -PYTHON_SHARED_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/salome/shared_modules - -$(PYTHON_SHARED_SITE): - $(INSTALL) -d $@ - -DEST_SHAREDPYSCRIPTS = $(EXPORT_SHAREDPYSCRIPTS:%=$(PYTHON_SHARED_SITE)/%) -sharedpyscripts: $(PYTHON_SHARED_SITE) $(DEST_SHAREDPYSCRIPTS) -$(DEST_SHAREDPYSCRIPTS): $(PYTHON_SHARED_SITE)/%: % - cp -f $< $@ - -check: test - -tests: test - -test: $(LIB) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%) - - -# copy header file in $(inc_builddir) -# -DEST_HEADERS = $(EXPORT_HEADERS:%=$(inc_builddir)/%) -inc: $(DEST_HEADERS) -$(DEST_HEADERS): $(inc_builddir)/%: % - cp -f $< $@ - -# build resources file (icons and messages) : .qm file from .po file -resources: $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm) - -# Make installation directories if they don't exist. -$(libdir) $(includedir) $(bindir) $(datadir) $(idldir) $(sharedpydir): - $(INSTALL) -d $@ && chmod 755 $@ - -# Install the library, the public header files, and programs. -install: $(LIB) $(BIN) $(TEST_PROGS) $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) install-python install-sharedpyqt install-qm - @for f in X $(LIB); do \ - if test $$f != X; then \ - ($(LT_INSTALL_LIB) $$f $(libdir)/. || exit 1); \ - fi; \ - done - @if ! test -z $(LIB_SWIG) ; then \ - (cd $(libdir); ln -sf $(patsubst %.so, %cmodule.so, $(LIB_SWIG)) _$(LIB_SWIG) || true); \ - fi; - @for f in X $(BIN); do \ - if test $$f != X; then \ - ($(LT_INSTALL_PROG) $$f $(bindir)/. || exit 1); \ - fi; \ - done -# Install tests programmes in bindir - @for f in X $(TEST_PROGS); do \ - if test $$f != X; then \ - ($(LT_INSTALL_PROG) $$f $(bindir)/. || exit 1); \ - fi; \ - done -# Install exported includes in includedir - @for f in X $(EXPORT_HEADERS:%=$(srcdir)/%); do \ - if test $$f != X; then \ - (cp -p -f $$f $(includedir) || exit 1); \ - fi; \ - done - -# Install python script in $(bindir) -install-python: $(bindir) $(EXPORT_PYSCRIPTS:%=install-%) - -$(EXPORT_PYSCRIPTS:%=install-%): install-%: % - $(INSTALL_PROGRAM) $< $(bindir)/. - -#install-python: $(bindir) $(EXPORT_PYSCRIPTS) -# @for f in X $(EXPORT_PYSCRIPTS); do \ -# if test $$f != X; then \ -# ($(INSTALL_PROGRAM) $$f $(bindir)/. || exit 1); \ -# fi; \ -# done - -# Install pyqt script in $(install-sharedpyqt) -install-sharedpyqt: $(sharedpydir) $(EXPORT_SHAREDPYSCRIPTS:%=install-%) - -$(EXPORT_SHAREDPYSCRIPTS:%=install-%): install-%: % - $(INSTALL_PROGRAM) $< $(sharedpydir)/. - - -# generic rule to install .qm files : -install-qm: resources - $(INSTALL) -d $(datadir)/resources - @for f in X $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm); do \ - if test $$f != X; then \ - ($(INSTALL_DATA) $$f $(datadir)/resources/. || exit 1); \ - fi; \ - done - -# Removes those things that `make install' (would have) installed. -uninstall: - @if test "X$(LIB)" != X; then \ - for f in $(LIB); do \ - $(LT_UNINSTALL) $(libdir)/$$f; \ - done; \ - fi - @if test "X$(BIN)" != X; then \ - for f in $(BIN); do \ - $(LT_UNINSTALL) $(bindir)/$$f; \ - done; \ - fi - @for f in X $(TEST_PROGS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(bindir)/$$f; \ - fi; \ - done -# Uninstall exported includes in includedir - @for f in X $(EXPORT_HEADERS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(includedir)/$$f; \ - fi; \ - done -# Uninstall python script in $(bindir) - @for f in X $(EXPORT_PYSCRIPTS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(bindir)/$$f ; \ - fi; \ - done - -# Uninstall pyqt script in $(sharedpydir) - @for f in X $(EXPORT_SHAREDPYSCRIPTS); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(sharedpydir)/$$f ; \ - fi; \ - done - -# Uninstall qm files - @for f in X $(PO_FILES:%.po=%.qm); do \ - if test $$f != X; then \ - $(LT_UNINSTALL) $(datadir)/resources/$$f ; \ - fi; \ - done - -# remove all dependencies files -# -cleandep: - -$(RM) .dep* - -# Removes temporary files without removing the final target files. That is, -# remove things like object files but not libraries or executables. -# -mostlyclean: cleandep - -$(RM) $(LIB_OBJ) $(LIB_OBJ:.lo=.o) - -$(RM) $(BIN_OBJ) $(BIN:%=%.o) - -$(RM) $(TEST_OBJ) $(TEST_OBJ:.lo=.o) - -$(RM) $(PROG_OBJ) $(PROG_OBJ:.lo=.o) $(MOSTLYCLEAN) - -# Like `mostlyclean' except it also removes the final targets: things like -# libraries and executables. This target doesn't remove any file that -# is part of the SALOME distribution. -# -clean: mostlyclean - -$(RM) $(LIB) $(TEST_PROGS) $(BIN) $(CLEAN) - -$(RM) TAGS *~ *# core *.core - -$(RM) -r .libs - -$(RM) $(top_builddir)/lib/salome/$(LIB) - -$(RM) $(patsubst %,$(top_builddir)/bin/salome/%, $(BIN)) - -$(RM) $(patsubst %.la, %.so, $(top_builddir)/lib/salome/$(LIB)) - -$(RM) $(patsubst %.la, %.a, $(top_builddir)/lib/salome/$(LIB)) -# remove idl generated files (sources) - -$(RM) $(LIB_CLIENT_SRC) $(LIB_SERVER_SRC) $(BIN_CLIENT_SRC) $(BIN_SERVER_SRC) -# remove idl generated files (headers) - -$(RM) $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_H)) $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_H)) - -$(RM) $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_H)) $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_H)) - -$(RM) $(LIB_MOC_SRC) $(BIN_MOC_SRC) - -$(RM) $(LIB_SWIG_SRC) - -# Like `clean' except it also removes files that were created by running -# configure. If you've unpacked the source and built without creating -# any other files, then `make distclean' will leave only the files that were -# in the distribution. -# -distclean: clean - #remove qm file ! - -$(RM) $(PO_FILES:%.po=%.qm) $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm) - #remove include files - -$(RM) $(DEST_HEADERS) - -$(RM) $(DISTCLEAN) *.bak *.old *.new .dep* - @if test -f $(srcdir)/Makefile.in; then \ - (@SETX@; $(RM) Makefile); \ - fi - - -#implicits rules -.cc.o: - $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.cc.lo: - $(LT) --mode=compile $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.cxx.o: - $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.cxx.lo: - $(LT) --mode=compile $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< - -.c.o: - $(CC) $(CFLAGS) $(CPPFLAGS) -c $< - -.c.lo: - $(LT_COMPILE) $(CFLAGS) $(CPPFLAGS) -c $< - -.f.o: - $(FC) $(FFLAGS) -c $< -o $@ - -.f.lo: - $(LT) --mode=compile $(FC) $(FFLAGS) -c $< - -.ui.h: - $(UIC) -o $@ $< - -.ui.cxx: - $(UIC) -o $@ -i $*.h $< - -#pattern rules -%_moc.cxx : %.h - $(MOC) $< -o $@ - -%_wrap.cxx : %.i - $(SWIG) $(SWIG_FLAGS) -o $@ $< - -$(top_builddir)/share/salome/resources/%.qm: %.po - $(MSG2QM) $< $@ ; \ - -#------------------------------------------------------------------------------ -# The following section of this makefile contains dependencies between the -# source files and the header files. If GNU make and GCC are being used then -# the dependencies are in the form of rules that cause the information to -# be kept updated automatically. Otherwise the dependencies are listed -# explicitly and come from the `.distdep' files in the various directories. -# These files are part of the distribution and are generated automatically on -# GNU/GCC systems. -#------------------------------------------------------------------------------ - -@DEPEND@ diff --git a/adm_local/unix/make_omniorb.in b/adm_local/unix/make_omniorb.in deleted file mode 100644 index 1299082fa..000000000 --- a/adm_local/unix/make_omniorb.in +++ /dev/null @@ -1,59 +0,0 @@ -#======================================================================= -# Begin specific part to omniorb -# (include from file adm/unix/make_omniorb generated by -# adm/unix/make_omniorb.in) -#======================================================================= -# -* Makefile *- -# -# Author : Patrick GOLDBRONN (CEA) -# Date : 29/06/2001 -# $Header$ -# - -# Client and server object are the same with omniorb -# There are one header file and one source file generate - -#IDLOBJ=$(IDLSRC:%.idl=%$(IDL_CLN_OBJ)) - -# dependancies between idl and it's generated files -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${KERNEL_ROOT_DIR}/idl/salome/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${GEOM_ROOT_DIR}/idl/salome/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${MED_ROOT_DIR}/idl/salome/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${top_srcdir}/idl/%.idl - $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< - -# dependncies between idl files -depend_idl: .depidl - -# we use cpp to generate dependencies between idl files. -# we change cpp output to keep only idl file and transform it to get a suitable rule -.depidl: $(IDL_FILES) - @touch $@ - @for dep in $? dummy; do \ - if [ $$dep != "dummy" ]; then \ - echo Building dependencies for $$dep; \ - basedep=`basename $$dep .idl`; \ - header="$$basedep"$(IDL_CLN_H); \ - sed '\%^'"$$header"':%,\%[^\\]$$%d' <$@ >$@- && mv $@- $@; \ - $(CPP) $(C_DEPEND_FLAG) -I$(srcdir) $$dep 2>/dev/null | \ - sed `echo "s%$$basedep\\.idl%$$header:%g"` | \ - sed 's% $(srcdir)/% %g' | \ - sed 's% $(top_srcdir)/% %g' | \ - sed 's% $(top_builddir)/% %g' | \ - sed 's%^.*:\.o: *%%' | sed 's%^ *\\ *%%'| sed 's%^ *\(.*\):%\1:%' | \ - sed 's/\.idl/$(IDL_CLN_H)/' >>$@; \ - echo '' >>$@; \ - fi; \ - done ; - --include .depidl - -#======================================================================= -# End specific part to omniorb -#======================================================================= diff --git a/cvs-tags b/cvs-tags deleted file mode 100644 index 6991d061f..000000000 --- a/cvs-tags +++ /dev/null @@ -1,35 +0,0 @@ -Start-v1_1a: ? - ? - -V1_2_1: ? - ? - -V1_2_2: 2003-09-26 17:00 - New data structure in SMDS. - -nadir_1_2_2: 2003-10-06 12:50 - Branch after V1_2_2. Developpement branch for user nadir - -merge_1_2_c__1_2_2: 2003-10-17 14:35 - Branch after V1_2_2. Branch to merge Salome 1.2c. Initiated by Paul Rascle. - -MergeV1_2c-1: 2003-10-19 13:49 - End of merge_1_2_c__1_2_2 branch. This branch is ready to be merge with the head. - -V1_3_0b1: 2003-11-12 - First pre-release of 1.3.0. Include the merge of 1.2c branch. - -nadir_update_MED_v1_3_0: 2003-11-17 10:22 - New branch for user nadir. Synchronization of API with MED 1.3. - -V1_3_0b2: 2003-11-18 - Second pre-release of 1.3.0. Synchronization of API with MED 1.3. - -V1_3_0: 2003-11-25 08:52 - Release 1.3.0. - -V1_3_1: 2004-01-05 14:28 - Release 1.3.1. Added Netgen. - -merge_1_2_d: 2003-01-20 11:25 - Branch to merge Release 1.2d of Salome Pro. diff --git a/doc/Makefile.in b/doc/Makefile.in deleted file mode 100644 index 7295ede75..000000000 --- a/doc/Makefile.in +++ /dev/null @@ -1,40 +0,0 @@ - -# -* Makefile *- -# -# Author : Patrick GOLDBRONN (CEA) -# Date : 30/11/2001 -# $Header$ -# -# source path -top_srcdir=@top_srcdir@ -top_builddir=.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -SUBDIRS= salome - -@COMMENCE@ - -docs: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done -clean: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done - -distclean: clean - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done - -install: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done - -uninstall: - @@SETX@; for d in $(SUBDIRS); do \ - (cd $$d && $(MAKE) $@) || exit 1; \ - done diff --git a/doc/salome/AddNetgenInSalome2.pdf b/doc/salome/AddNetgenInSalome2.pdf deleted file mode 100644 index 34fd25204d7f2506a236b2629cfd6157ad7c1936..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70678 zcmdqJRX`rux&;{AfzP4wZ~!C>t&AN^@R;99_T?az}Lw#!lLoP08dj~s1T}x<}^bF-OyA>vc_G7X;BX(qd0>S6}!a7;x ziNPBEVs3~D6Fj6G1pg1PKB2LnM~-(?ZeiVyf%6EL?JVkNeRuR;?^iUBaMTEW5}y?B zSDvCodZkNZG6w&z zz6Dtdy1uISdMRD*KKbeHYjzF$$p)z(M^b zh``o~lX`|A3Z>F%nt!N?4$%=)NfgPT`%jv(L@gU2%-8#Ltfs*C;C`oR$(so{EYfS5 z$0R?{pt;^V0cG|7;1^pNH7tg&;6&7g;#%?1zippKSD(2vzgi&}Hr`7p0ZgSRc zcjqBgY{Vm7S0IP0V2b^K6#wuZ+@I<&0zMzRK{R-;r(K$MI)GO>pP8+6)OEKuec3Q> zL;*#}2BCQ7QnZ(<0^-)@>aUa(;AK=0Q|R%XnEejL&flK+Hhg=>TRNU~}o;0b1k zys=eEXgU;=kHXW$v5Pl?ebw|tt=T4-96YW8*)Y}VS-C2GzPWA4li-BnsNX}cZB zu63zr9@^nuS&tH>~jl2aJggO-=ZLb72-JmO*6YxNbXHDex>zTfeh8bKd)P z>>oJg-;=8yzk6=91mlblI=jvOLXMoSNlHj7iFNe?E%n9Dk|26Yr}5n+3eB#l691V` z&5&`vckP@F)$gllFQv|06o<^F%vLNG?pvz~Yb~uj%-XeS^l-Pf8?6yeGSiqVduYCM z8TyIFo|?a%0Vl2Bj0>RAU^U_8m;A`_4Oz5{F#saL5tgv2b)~7H%8KlvOY2ClAQiv9 z2C0d<2`Kfrs1=zidK| z?s=Qx+7r~v+e_6}7zL+37h^?NBQ;euMP1*`o=P7XrEiSthtludeT42so?F~2#a6TY zSiLSD49n#+@TzwG=@Gy`B_bsYX}84b_NB};(;CD+ie=ce8a(20w`Ql})caQ| zWDECtn4xmD9lH~F9_r&R7WTu{O;Udvxwhu7*5Y=fadkogPm5ruvXeWr7I~XD&)3o^4iFyCZELQIfn%P4auo zo+EpYZ!bqjl2QPNZYtf!&P1W%*!r71d#voWVFOlU54A#>C@jO>`W=ysH(ys}?}Q`@ zoE}S+mS{v%Sm#&2E!NHxduy~-;_RDo)_&v_zXDiwH;Ay`bg~Q4c@V1U-l0u7Y2Fxy zfN3YO-@J-aE&Vk4W}dF-Dc=_iP%2F}l_H6Kx6e4*uTZyfIHq_WP2sHPb~ z4u2_g8p|FxIEH=1r@*a+%#ctE`qIN67(yJDILjD)Y({MtT<*%0Dp3CHWkd5gMQ0)D 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 diff --git a/doc/salome/AddNetgenInSalome2.ps b/doc/salome/AddNetgenInSalome2.ps deleted file mode 100644 index a81aa9658..000000000 --- a/doc/salome/AddNetgenInSalome2.ps +++ /dev/null @@ -1,13935 +0,0 @@ -%!PS-Adobe-3.0 -%%BoundingBox: 0 0 595 842 -%%Creator: OpenOffice.org 1.0.2 -%%For: nadir -%%CreationDate: Tue Dec 9 10:49:18 2003 -%%Title: Proc?dure de rajout de DATA dans le produit SalomePro -%%LanguageLevel: 2 -%%DocumentData: Clean7Bit -%%Pages: (atend) -%%PageOrder: Ascend -%%EndComments -%%BeginProlog -/ISO1252Encoding [ -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle -/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash -/zero /one /two /three /four /five /six /seven -/eight /nine /colon /semicolon /less /equal /greater /question -/at /A /B /C /D /E /F /G -/H /I /J /K /L /M /N /O -/P /Q /R /S /T /U /V /W -/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore -/grave /a /b /c /d /e /f /g -/h /i /j /k /l /m /n /o -/p /q /r /s /t /u /v /w -/x /y /z /braceleft /bar /braceright /asciitilde /unused -/Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl -/circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused -/unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash -/tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis -/space /exclamdown /cent /sterling /currency /yen /brokenbar /section -/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron -/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered -/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown -/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla -/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis -/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply -/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls -/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla -/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis -/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide -/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def - -/psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne -{ def } { pop pop } ifelse } forall /Encoding 3 -1 roll def -currentdict end exch pop definefont pop } def - -/pathdict dup 8 dict def load begin -/rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit } -{ pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1 -add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10 -eq 3 1 roll exch } def -/rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0 -get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3 --1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul } -for 256 div exch pop exch { neg } if } def -/xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add -1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end -/readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def - -systemdict /languagelevel known not { -/xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get -exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1 -roll show moveto 0 rmoveto } for pop pop } def -/rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 -rlineto closepath } def -/rectfill { rectangle fill } def -/rectstroke { rectangle stroke } def } if - -/psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def -/psp_ascii85filter { currentfile /ASCII85Decode filter } def -/psp_lzwstring { psp_lzwfilter 1024 string readstring } def -/psp_ascii85string { psp_ascii85filter 1024 string readstring } def -/psp_imagedict { -/psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def -/psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get } -def 7 dict dup -/ImageType 1 put dup -/Width 7 -1 roll put dup -/Height 5 index put dup -/BitsPerComponent 4 index psp_bitspercomponent put dup -/Decode 5 -1 roll psp_decodearray put dup -/ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup -/DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put -} def -%%EndProlog -%%Page: 0 0 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%BeginFeature: *PageSize A4 -<> setpagedevice -%%EndFeature -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Bold-iso1252 /Times-Bold ISO1252Encoding psp_definefont -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -253 283 moveto -0 0 0 setrgbcolor -/Times-Bold-iso1252 findfont 67 -67 matrix scale makefont setfont -<50726F63E9647572652064652072616A6F75742065742064652074657374206475206D61696C6C -6575722074E974726168E9647269717565204E657467656E> -show -403 361 moveto -<64616E73206C65206D6F64756C6520534D455348206465206C27656E7669726F6E6E656D656E74 -2053616C6F6D652032> -show -220 439 moveto -<202020202020> -show -220 508 moveto -/Times-Bold-iso1252 findfont 58 -58 matrix scale makefont setfont -<20202020205072E9616C61626C65733A> -show -295 566 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4F6E20737570706F736520717565204E657467656E206120E974E920696E7374616C6CE9206461 -6E73206C6120636F6E66696775726174696F6E2073756976616E7465> -show -1647 566 moveto -<20> -show -1659 566 moveto -<3A> -show -312 683 moveto -<6C732020206E657467656E5F696E7374616C6C6174696F6E5F706174682F696E636C756465> -show -312 739 moveto -<6E676C69622E68> -show -312 795 moveto -<6C73206E657467656E5F696E7374616C6C6174696F6E5F706174682F6C69622F4C494E5558> -show -312 851 moveto -<6C69626373672E61202020206C6962677072696D2E61202020206C69626D6573682E6120202020 -202020202020202020206C69626F7074692E61202020202020202020206C69627669732E61> -show -312 907 moveto -<6C696267656E2E61202020206C69626C612E61202020202020202020206C69626E67696E746572 -666163652E61202020206C696273746C67656F6D2E61> -show -312 963 moveto -<6C73206E657467656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E5558> -show -312 1019 moveto -<6469616C6F672E74636C20202020202020206D656E75737461742E74636C202020206E6768656C -702E74636C202020206E672E74636C2020202020202020202020202020706172616D65746572732E -74636C202020207661726961626C65732E74636C> -show -312 1075 moveto -<64726177696E672E74636C202020206E6720202020202020202020202020202020202020206E67 -69636F6E2E74636C202020206E6776697375616C2E74636C20202020737461727475702E74636C> -show -295 1191 moveto -<6FF9206E657467656E5F696E7374616C6C6174696F6E5F7061746820657374206C612064697265 -63746F7279206427696E7374616C6C6174696F6E206465204E657467656E2E204C65732066696368 -69657273> -show -295 1247 moveto -<6E657467656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E55582F2A2E7463 -6C20736F6E74206C657320666963686965727320646520636F6D6D616E642074636C20706F757220 -70696C6F746572206C65> -show -295 1303 moveto -<6D61696C6C657572204E657467656E20E0207472617665727320736F6E2049484D2E206E657467 -656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E55582F6E6720657374> -show -295 1359 moveto -<6C276578E963757461626C65206465204E657467656E206176656320736F6E2049484D20656D62 -61727175E9652E204C6573206C696272616972696573202A2E612064616E73> -show -295 1415 moveto -<6E657467656E5F696E7374616C6C6174696F6E5F706174682F6C69622F4C494E55582F20646F69 -76656E7420EA74726520636F6D70696CE97320656E20656E6C6576616E74206C276F7074696F6E> -show -295 1471 moveto -<2D444F50454E474C20717569206E27657374207574696C652071756520706F7572206C27484D20 -6465204E657467656E2E204C61206C6962726169726965206C69626E67696E746572666163652E61 -20646F6974> -show -295 1528 moveto -<636F6E74656E6972206C276F626A6574206E676C69622E6F206574206E6520646F697420706173 -20636F6E74656E6972206E676E657764656C6574652E6F2E> -show -295 1640 moveto -<4C612070726F63E96475726520E02061646F707465722065737420746F757420642761626F7264 -20646520636F6D70696C6572204E657467656E2028766F6972206C6520524541444D452E494E5354 -414C4C> -show -295 1696 moveto -<76656E616E742061766563206C6120646973747269627574696F6E293B20636520717569207072 -6F6475697261206C276578E963757461626C65206E6720206C696E6BE92073746174697175656D65 -6E742061766563206C6573> -show -295 1752 moveto -<6C696272616972696573202A2E612E205075697320617072E87320696C20666175647261697420 -6D6F646966696572206C657320646966666572656E7473204D616B6566696C6520706F757220656E -6C65766572206C276F7074696F6E20> -show -295 1808 moveto -<2D444F50454E474C2C202072616A6F75746572206C276F626A6574206E676C69622E6F2C206578 -636C757265206C276F626A657420206E676E657764656C6574652E6F20E0206C61206C6962726169 -726965> -show -295 1864 moveto -<6C69626E67696E746572666163652E6120657420656E66696E207265636F6D70696C6572207365 -756C656D656E74206C6573206C6962726169726965732E> -show -343 1984 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -418 1984 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4F6E206120E0206E6F74726520646973706F736974696F6E20286465206C612070617274206465 -204E616469722920756E652061726368697665204E657467656E2E74677A20636F6E74656E616E74 -206C6573> -show -295 2044 moveto -<2020202020202020202020736F757263657320646520534D45534820717569207772617070656E -74206C657320617070656C732061757820726F7574696E6573206465204E657467656E> -show -1779 2044 moveto -<20> -show -1791 2044 moveto -<706F7572206C65> -show -295 2100 moveto -<20202020202020202020206D61696C6C6575722074E974726168E96472697175653A> -show -294 2201 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<63642053414C4F4D45325F524F4F54> -show -294 2245 moveto -<746172207A787666204E657467656E2E74677A> -show -294 2289 moveto -<2E2F534D4553485F5352432F7372632F4E455447454E2F4D616B6566696C652E696E> -show -294 2333 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4E455447454E5F33442E63 -7878> -show -294 2377 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4E455447454E5F33442E68 -7878> -show -294 2421 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4D6178456C656D656E7456 -6F6C756D652E637878> -show -294 2465 moveto -<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4D6178456C656D656E7456 -6F6C756D652E687878> -show -294 2509 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4E455447454E5F3344 -5F692E637878> -show -294 2553 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4E455447454E5F3344 -5F692E687878> -show -294 2597 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4D6178456C656D656E -74566F6C756D655F692E637878> -show -294 2641 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4D6178456C656D656E -74566F6C756D655F692E687878> -show -294 2685 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4C656E67746846726F -6D45646765735F692E637878> -show -294 2729 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4C656E67746846726F -6D45646765735F692E687878> -show -294 2773 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F785F7465 -7472612E7079> -show -294 2816 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F78325F74 -657472612E7079> -show -294 2860 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F78335F74 -657472612E7079> -show -294 2904 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666978617469 -6F6E5F74657472612E7079> -show -294 2948 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666978617469 -6F6E5F686578612E7079> -show -294 2992 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F506172746974 -696F6E315F74657472612E7079> -show -294 3036 moveto -<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666C69676874 -5F736B696E2E7079> -show -294 3080 moveto -<2E2F> -show -344 3080 moveto -<534D4553485F5352432F> -show -596 3080 moveto -<61646D5F6C6F63616C2F756E69782F636F6E6669675F66696C65732F636865636B5F4E65746765 -6E2E6D34> -show -296 634 1 457 rectfill -2109 634 1 457 rectfill -296 634 1814 1 rectfill -296 1090 1814 1 rectfill -280 2167 1 924 rectfill -2125 2167 1 924 rectfill -280 2167 1846 1 rectfill -280 3090 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 1 1 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-ReguObli -%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular Oblique) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle -12.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-ReguObli def -/PaintType 0 def -/WMode 0 def -/FontBBox {-61 -237 774 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020947 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1 -94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211 -9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB -B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466 -AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1 -25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A -C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC -45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246 -D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566 -9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A -E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698 -53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736 -05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66 -5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341 -6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF -4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2 -4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482 -9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D -FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4 -DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3 -CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D -B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28 -7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A -1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68 -1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A -8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4 -16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365 -F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12 -41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22 -5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D -BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080 -65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827 -C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45 -EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559 -872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103 -AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF -8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E -1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A -7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A -DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610 -38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356 -A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F -67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5 -492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1 -5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD -A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551 -D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3 -C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252 -CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097 -60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A -F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA -37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8 -F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E -18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0 -9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118 -73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0 -837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D -9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E -9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC -85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3 -AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F -719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1 -496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88 -EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C -6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7 -37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB -F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C -D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2 -63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15 -565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE -18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E -2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841 -55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44 -58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551 -837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3 -0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE -9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C -155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8 -BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16 -8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879 -1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C -4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA -492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3 -155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704 -1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3 -5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0 -5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC -CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0 -BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E -DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311 -98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E -DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6 -F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C -93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504 -78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9 -F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F -9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4 -3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2 -52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A -A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0 -F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB -1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F -2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8 -D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD -879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319 -1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD -BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122 -007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C -5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F -013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D -BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA -6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338 -670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C -0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13 -C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172 -6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807 -91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600 -8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F -8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D -AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94 -202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E -DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68 -85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315 -70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF -80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581 -217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12 -E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA -9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519 -1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5 -3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED -B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4 -FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC -797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D -2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7 -E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364 -A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71 -8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C -BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0 -9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1 -3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B -E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75 -BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428 -4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B -69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6 -D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8 -FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387 -7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4 -A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF -51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A -DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515 -D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A -FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0 -5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A -96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB -92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF -37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812 -3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726 -62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3 -D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550 -7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752 -4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734 -B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363 -141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303 -86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83 -9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726 -B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B -737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43 -46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7 -0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9 -A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744 -69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8 -222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6 -855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF -F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1 -6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A -8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453 -3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6 -67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A -AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C -30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4 -29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04 -26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1 -3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B -667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177 -D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17 -070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180 -7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8 -C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D -E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD -E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51 -C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E -EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA -11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385 -1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C -FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8 -96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C -0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C -6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120 -835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C -5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC -7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A -78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21 -6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8 -2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099 -9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE -C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0 -DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054 -16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B -D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3 -984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA -B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33 -7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219 -1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26 -DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66 -1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA -4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27 -94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350 -45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915 -E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36 -6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5 -F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538 -B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2 -3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705 -796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8 -40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494 -44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5 -C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59 -6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14 -AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130 -6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68 -6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952 -35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7 -08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217 -4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218 -52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95 -41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C -77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8 -65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB -73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81 -234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F -982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9 -184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885 -A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD -0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34 -7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2 -E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC -AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB -8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09 -1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF -EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED -8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F -A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F -87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B -33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7 -B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559 -2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C -6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC -56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED -884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262 -348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1 -106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B -13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07 -E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30 -41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687 -F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604 -3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1 -467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95 -993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F -7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083 -4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3 -41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941 -2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F -BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F -486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8 -249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325 -D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D -4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4 -AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E -1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D -13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367 -DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020 -749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C -5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39 -0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1 -71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D -FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6 -F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4 -D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2 -182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137 -33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE -48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1 -5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA -5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C -4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173 -A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731 -5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938 -731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C -15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3 -D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E -E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7 -97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC -7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369 -DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171 -CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878 -B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343 -1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4 -7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A -FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93 -12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E -31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28 -8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35 -FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA -AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F -970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1 -837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080 -02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29 -3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E -57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5 -8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765 -EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB -43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE -5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F -7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C -39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2 -A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2 -56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158 -C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951 -23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34 -37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE -BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9 -2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9 -BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594 -6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6 -5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE -CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D -3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65 -77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B -DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7 -63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB -EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69 -B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB -438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D -7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245 -4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B -F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1 -8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2 -F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C -C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B -47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326 -6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1 -564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692 -C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24 -870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81 -1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211 -D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601 -196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0 -CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53 -41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4 -5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47 -B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD -B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947 -1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D -DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6 -A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED -5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3 -E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA -649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B -220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729 -E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7 -5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524 -4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01 -486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195 -CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2 -1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14 -50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6 -B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25 -B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F -58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7 -77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202 -42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2 -79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179 -08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101 -EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A -A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171 -0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC -50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16 -D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938 -A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B -A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476 -63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444 -5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E -4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598 -54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62 -3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C -1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC -1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269 -743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA -94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD -02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F -03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5 -403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006 -54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63 -8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67 -5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108 -DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C -2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB -197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4 -6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918 -0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C -F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D -05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC -E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E -4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC -7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717 -80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9 -4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158 -8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62 -0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF -540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6 -A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957 -270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911 -F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E -4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D -41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967 -6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654 -BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B -7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C -52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB -4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97 -146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B -D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD -52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559 -187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616 -F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174 -CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963 -4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D -0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5 -4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE -A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070 -169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72 -6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092 -402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C -EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B -77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0 -02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9 -73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421 -B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4 -D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806 -E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70 -BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A -79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7 -787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8 -88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F -F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52 -6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D -6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB -C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744 -1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296 -75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391 -26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A -0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379 -928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4 -77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806 -4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E -9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70 -89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E -E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17 -01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506 -FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735 -2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B -3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D -6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C -2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928 -C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA -35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67 -F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F -CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6 -4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714 -54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228 -603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB -2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9 -F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2 -106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC -32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA -60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431 -F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892 -370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950 -78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D -CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE -F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A -75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847 -C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A -41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1 -5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9 -5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441 -DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1 -639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A -3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464 -81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463 -DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6 -DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB -02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84 -E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54 -0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824 -16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D -F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320 -79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0 -F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF -74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8 -5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD -AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02 -DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E -7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC -0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119 -32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438 -DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97 -6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A -4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7 -A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA -ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693 -CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA -683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853 -BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3 -8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499 -907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D -403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49 -A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9 -4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C -EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2 -0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF -885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A -4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC -8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E -0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9 -8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF -E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC -2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09 -5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731 -28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1 -1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA -BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367 -4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD -E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956 -507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13 -24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35 -8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D -8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339 -E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE -0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D -25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1 -10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888 -4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2 -2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678 -9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55 -43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91 -3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E -EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E -D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B -B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2 -86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2 -376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB -76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A -5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490 -D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684 -8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842 -9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839 -0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688 -1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8 -D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674 -F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A -96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D -31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD -63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81 -0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF -DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88 -30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7 -835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E -115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A -9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C -80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63 -6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210 -C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE -CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED -8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37 -CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA -71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209 -8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA -BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E -722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C -4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC -52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2 -802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88 -A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE -43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2 -BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382 -5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3 -F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E -1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821 -4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E -34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44 -400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408 -999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E -8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436 -BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497 -5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09 -6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814 -E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F -D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8 -F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C -E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725 -EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB -009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9 -4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5 -5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5 -86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988 -A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847 -EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E -3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10 -324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E -FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495 -0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E -ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12 -8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD -4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF -CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D -DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD -B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD -D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8 -FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E -B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA -E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551 -98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9 -FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C -D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40 -19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C -2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0 -DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0 -ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B -2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C -4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C -BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C -46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E -690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A -BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399 -270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4 -9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268 -10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65 -95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3 -AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0 -9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B -D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754 -94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1 -67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8 -BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E -07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94 -D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4 -1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4 -95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA -91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D -30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE -C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B -3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7 -AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273 -38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F -9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1 -B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65 -89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B -163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2 -56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B -186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE -19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C -4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5 -03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28 -B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24 -4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34 -8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3 -71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1 -EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5 -083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31 -D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200 -458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0 -11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1 -0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C -397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560 -A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82 -0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591 -EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4 -4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C -1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033 -109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213 -18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2 -C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3 -47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605 -8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB -7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754 -E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D -AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D -5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89 -7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E -AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604 -388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C -540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2 -3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D -E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40 -61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA -73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921 -9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127 -4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A -4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6 -F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1 -BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0 -39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910 -B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314 -54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A -EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734 -EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079 -CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE -718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C -D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA -9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A -53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E -A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7 -7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237 -CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55 -311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357 -F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B -E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643 -15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C -001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0 -0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D -CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55 -AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A -ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E -77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252 -346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD -12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF -2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A -C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427 -AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B -61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0 -BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C -484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82 -94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2 -E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827 -A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE -5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12 -66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2 -B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72 -E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E -168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF -BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999 -4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA -252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B -87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C -0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074 -EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135 -ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912 -999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4 -C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA -4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152 -692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014 -69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F -F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840 -301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624 -B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E -86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1 -1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED -70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D -B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37 -5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803 -35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651 -C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A -D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A -C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528 -4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154 -02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492 -83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C -BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65 -64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738 -9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60 -7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694 -45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F -C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB -55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766 -2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1 -7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419 -5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB -1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E -17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3 -5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217 -F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A -9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120 -2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8 -ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8 -0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1 -1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006 -F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0 -000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9 -9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789 -ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B -02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963 -189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE -EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2 -C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268 -6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C -390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2 -922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8 -D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86 -70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962 -F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB -268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886 -B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9 -6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07 -A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649 -B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663 -AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F -A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA -0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816 -495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7 -E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA -D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE -B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C -0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C -7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B -6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86 -EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6 -08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6 -6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC -1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2 -E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D -3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C -122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2 -F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6 -154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954 -9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182 -B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8 -9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1 -85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47 -B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46 -E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED -839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A -9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5 -E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4 -FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D -D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A -1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278 -AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA -239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062 -3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02 -F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD -7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405 -77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA -BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C -80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09 -9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E -DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9 -703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D -F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F -6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76 -CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6 -EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A -B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306 -23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7 -3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB -01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E -93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80 -3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C -4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB -0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF -AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C -05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396 -06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB -87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA -A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69 -50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03 -AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024 -FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18 -C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777 -3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA -F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E -59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D -A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C -4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677 -206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071 -5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A -4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89 -18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6 -7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096 -84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5 -6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9 -C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9 -684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3 -70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297 -040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345 -7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37 -F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C -1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD -F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA -E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3 -3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8 -580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1 -D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6 -645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3 -7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905 -3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60 -670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0 -BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F -2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381 -1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB -CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5 -E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB -669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C -0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF -6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F -67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2 -5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657 -C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451 -CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6 -CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25 -B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C -76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1 -A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB -5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A -6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5 -AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3 -37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2 -631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639 -567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28 -47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6 -4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD -585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB -39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0 -D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF -4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F -C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B -1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2 -2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206 -CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568 -75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88 -114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B -F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338 -6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63 -9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77 -6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B -D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0 -BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49 -E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E -DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A -7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284 -89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4 -8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46 -BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8 -34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A -3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30 -43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A -D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5 -43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD -BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2 -9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7 -31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3 -5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9 -8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97 -E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1 -1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D -082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E -BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9 -3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0 -FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77 -312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2 -74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5 -B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4 -CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9 -BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1 -4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5 -9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33 -92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B -09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B -8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802 -7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0 -5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83 -4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547 -71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC -01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464 -76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76 -41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD -7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD -C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926 -E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7 -8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC -F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43 -29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5 -243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2 -1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75 -F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC -102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36 -45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20 -352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D -17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6 -6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D -EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7 -50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC -3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0 -011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5 -FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A -7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A -3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF -7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18 -218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6 -0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC -112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB -80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65 -05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5 -A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F -5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A -289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2 -F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315 -A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D -75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244 -C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B -C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B -479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8 -0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD -3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45 -1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401 -CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338 -D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A -AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1 -BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0 -DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37 -178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF -77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F -8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A -27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808 -488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D -A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D -321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A -7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB -F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE -922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526 -75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB -09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2 -BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB -B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373 -6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379 -59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62 -8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9 -21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30 -026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022 -C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E -E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF -44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1 -8A31BE4E82B384 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -295 321 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4C61> -show -362 321 moveto -<6469726563746F7279> -show -556 321 moveto -<53414C4F4D45325F524F4F54> -show -962 321 moveto -<657374> -show -1032 321 moveto -<737570706F73E965> -show -1230 321 moveto - -show -1318 321 moveto -<6C61> -show -1369 321 moveto -<6469726563746F7279> -show -1564 321 moveto -<636F6E74656E616E74> -show -1772 321 moveto -<746F7573> -show -1870 321 moveto -<6C6573> -show -1940 321 moveto -<6D6F64756C6573> -show -295 377 moveto -<6465> -show -358 377 moveto -<6C61> -show -411 377 moveto -<706C617465666F726D65> -show -644 377 moveto -<53414C4F4D45> -show -866 377 moveto -<322E> -show -920 377 moveto -<4C6573> -show -1009 377 moveto -<6669636869657273> -show -1175 377 moveto -<2A4D6178456C656D656E74566F6C756D652A> -show -1661 377 moveto -<736F6E74> -show -1761 377 moveto -<64E96AE0> -show -1861 377 moveto -<64616E73> -show -1969 377 moveto -<6C61> -show -2021 377 moveto -<62617365> -show -295 433 moveto -<6D616973206E6520636F6E7469656E6E656E74207269656E206465207369676E696669616E742E> -show -295 551 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 551 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -659 551 moveto -<6475> -show -738 551 moveto -<66696368696572> -show -896 551 moveto -1 0 0 setrgbcolor -/NimbusMonL-ReguObli-iso1252 findfont 50 -50 matrix scale makefont setfont -<636F6E6669677572652E696E2E62617365> -show -1434 551 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1553 551 moveto -<72616A6F75746572> -show -1737 551 moveto -<6C61> -show -1801 551 moveto -<76E972696669636174696F6E> -show -2060 551 moveto -<6475> -show -370 611 moveto -<66696368696572> -show -535 611 moveto -<696E636C756465> -show -716 611 moveto -<6E676C69622E68> -show -891 611 moveto -<6574> -show -962 611 moveto -<646573> -show -1063 611 moveto -<64696666E972656E746573> -show -1310 611 moveto -<6C696272616972696573> -show -1522 611 moveto -<4E657467656E2C> -show -1714 611 moveto -<766961> -show -1809 611 moveto -<6C65> -show -1880 611 moveto -<66696368696572> -show -2045 611 moveto -<6D34> -show -370 668 moveto -<636865636B5F4E657467656E2E6D342E> -show -309 769 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<6563686F2074657374696E67206E657467656E> -show -309 813 moveto -<6563686F202D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D -2D2D2D2D2D2D2D2D2D> -show -309 857 moveto -<6563686F> -show -309 901 moveto -<434845434B5F4E455447454E> -show -309 945 moveto -<6563686F> -show -309 989 moveto -<6563686F202D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D -2D2D2D2D2D2D2D2D2D> -show -295 1106 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1106 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E206475206669636869657220> -show -849 1106 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E20> -show -1087 1106 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<20> -show -1099 1106 moveto -0 0 0 setrgbcolor -<706F757220706F75766F6972207574696C69736572206C652064657373696E> -show -370 1166 moveto -<6D6573685F747265655F616C676F5F74657472612E706E672064616E73206C2749484D20646520 -534D4553482028766F6972206C61206D6F64696620E020666169726520737572> -show -370 1222 moveto -<20534D45534847554929206574206C61204272657020666C696768745F736F6C69642E62726570 -206461616E73206C65207465737420534D4553485F666C696768745F736B696E2E70792E> -show -294 1323 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<5245534F55524345535F46494C4553203D205C> -show -294 1367 moveto -<20202020202E> -show -294 1411 moveto -<20202020202E> -show -294 1455 moveto -<20202020202E> -show -294 1499 moveto -<6D6573685F747265655F616C676F5F74657472612E706E67205C> -show -294 1543 moveto -<666C696768745F736F6C69642E62726570> -show -295 1660 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1660 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4C65206669636869657220> -show -578 1660 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<61646D> -show -664 1660 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -677 1660 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<756E69782F6D616B655F636F6D6D656E63652E696E202020> -show -1207 1660 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<646F697420617573736920EA747265206D6F64696669E920E02063657474652066696E> -show -1862 1660 moveto -<20> -show -1874 1660 moveto -<3A> -show -309 1765 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -309 1809 moveto -<202041434C4F43414C5F535243202B3D20636865636B5F6E657467656E2E6D34> -show -309 1853 moveto -<656E646966> -show -295 1971 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1971 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -662 1971 moveto -<6475> -show -744 1971 moveto -<66696368696572> -show -905 1971 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1178 1971 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1190 1971 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1251 1971 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1264 1971 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E> -show -1552 1971 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1675 1971 moveto -<72616A6F75746572> -show -1861 1971 moveto -<6C61> -show -1928 1971 moveto -<6469726563746F7279> -show -370 2031 moveto -<4E455447454E> -show -592 2031 moveto -<6FF9> -show -664 2031 moveto -<6C61> -show -723 2031 moveto -<6C6962726169726965> -show -904 2031 moveto -<64796E616D69717565> -show -1149 2031 moveto -<6C69624E455447454E2E736F> -show -1481 2031 moveto -<7661> -show -1550 2031 moveto - -show -1648 2031 moveto -<636F6E73747275697465> -show -1868 2031 moveto - -show -1912 2031 moveto -<706172746972> -show -2043 2031 moveto -<646573> -show -370 2087 moveto -<6C69627261697269657320737461746963206465204E657467656E2E> -show -294 2188 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -294 2232 moveto -<2020534244495253203D204F424A45435420534D445320534D4553484453204472697665722044 -72697665724D45442044726976657244415420447269766572554E56205C> -show -294 2276 moveto -<20202020202020202020204D45464953544F204E455447454E20534D45534820534D4553485F49 -20534D45534846696C7465727353656C656374696F6E20534D455348475549205C> -show -294 2320 moveto -<2020202020202020202020534D4553485F53574947> -show -294 2364 moveto -<656E646966> -show -295 2481 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -665 2481 moveto -<6475> -show -750 2481 moveto -<66696368696572> -show -915 2481 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1187 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1200 2481 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1261 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1274 2481 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D455348> -show -1432 2481 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1445 2481 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E> -show -1738 2481 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1864 2481 moveto -<72616A6F75746572> -show -2054 2481 moveto -<6C6573> -show -370 2541 moveto -<6669636869657273> -show -541 2541 moveto -<717569> -show -626 2541 moveto -<7772617070656E74> -show -834 2541 moveto -<6C6573> -show -910 2541 moveto -<617070656C73> -show -1059 2541 moveto -<6175> -show -1128 2541 moveto -<6D61696C6C657572> -show -1315 2541 moveto -<74E974726168E9647269717565> -show -1600 2541 moveto -<6465> -show -1669 2541 moveto -<4E657467656E> -show -1835 2541 moveto -<6574> -show -1893 2541 moveto -<6C6573> -show -1969 2541 moveto -<626F6E6E6573> -show -370 2597 moveto -<6F7074696F6E7320646520636F6D70696C6174696F6E2F6C696E6B6167652E> -show -294 2698 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -294 2742 moveto -<20204558504F52545F48454144455253202B3D20534D4553485F4E455447454E5F33442E687878> -show -294 2786 moveto -<20204C49425F535243202B3D20534D4553485F4E455447454E5F33442E637878> -show -294 2830 moveto -<20204E455447454E5F494E434C554445533D404E455447454E5F494E434C5544455340> -show -294 2874 moveto -<2020435050464C414753202B3D2024284E455447454E5F494E434C5544455329> -show -294 2918 moveto -<2020435858464C414753202B3D2024284E455447454E5F494E434C5544455329> -show -294 2962 moveto -<20204C44464C414753202B3D202D6C4E455447454E> -show -294 3006 moveto -<656E646966> -show -295 735 1 264 rectfill -2125 735 1 264 rectfill -295 735 1831 1 rectfill -295 998 1831 1 rectfill -280 1289 1 265 rectfill -2125 1289 1 265 rectfill -280 1289 1846 1 rectfill -280 1553 1846 1 rectfill -295 1732 1 132 rectfill -2125 1732 1 132 rectfill -295 1732 1831 1 rectfill -295 1863 1831 1 rectfill -280 2154 1 220 rectfill -2125 2154 1 220 rectfill -280 2154 1846 1 rectfill -280 2373 1846 1 rectfill -280 2665 1 352 rectfill -2125 2665 1 352 rectfill -280 2665 1846 1 rectfill -280 3016 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 2 2 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -295 271 moveto -0 0 0 setrgbcolor -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -653 271 moveto -<6475> -show -725 271 moveto -<66696368696572> -show -877 271 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1149 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1162 271 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1223 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1236 271 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F49> -show -1435 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1448 271 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E2C> -show -1708 271 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont - -show -1938 271 moveto -<434F524241> -show -370 331 moveto -<6465206C61207072E963E964656E7465206D6F64696669636174696F6E2E> -show -294 433 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<69666571202840574954484E455447454E402C79657329> -show -294 476 moveto -<20204C49425F535243202B3D20534D4553485F4E455447454E5F33445F692E637878> -show -294 520 moveto -<2020> -show -344 520 moveto -<4C44464C414753202B3D202D6C4E455447454E> -show -294 564 moveto -<656E646966> -show -295 682 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 682 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -657 682 moveto -<6475> -show -733 682 moveto -<66696368696572> -show -890 682 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<69646C2F534D4553485F42617369634879706F7468657369732E69646C> -show -1563 682 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1681 682 moveto -<72616A6F75746572> -show -1863 682 moveto -<6C92616C676F726974686D65> -show -370 742 moveto -<4E455447454E5F33442071756920636F72726573706F6E64206175206D61696C6C6575722074E9 -74726168E9647269717565206465204E657467656E2E> -show -294 887 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<2020> -show -344 887 moveto -<696E7465726661636520534D4553485F4E455447454E5F3344> -show -974 887 moveto -<20> -show -999 887 moveto -<3A20534D4553485F33445F416C676F> -show -294 931 moveto -<20207B> -show -294 975 moveto -<20207D3B> -show -295 1092 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1092 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -667 1092 moveto -<6475> -show -754 1092 moveto -<66696368696572> -show -921 1092 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553484755492F534D4553484755495F69636F6E732E70 -6F> -show -2019 1092 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -370 1152 moveto -<72616A6F75746572> -show -556 1152 moveto -<6C92616C676F726974686D65> -show -832 1152 moveto -<4E455447454E5F3344> -show -1149 1152 moveto -<717569> -show -1242 1152 moveto -<636F72726573706F6E64> -show -1495 1152 moveto -<6175> -show -1572 1152 moveto -<6D61696C6C657572> -show -1769 1152 moveto -<74E974726168E9647269717565> -show -2062 1152 moveto -<6465> -show -370 1208 moveto -<4E657467656E2064616E73206C612047554920646520534D4553482028626F75746F6E20646520 -73E96C656374696F6E292E> -show -294 1309 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<236D6573685F747265655F616C676F5F7465747261> -show -294 1353 moveto -<6D736769642049434F4E5F534D4553485F545245455F414C474F5F54657472615F3344> -show -294 1397 moveto -<6D7367737472206D6573685F747265655F616C676F5F74657472612E706E67> -show -295 1515 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1515 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -651 1515 moveto -<646573> -show -739 1515 moveto -<6669636869657273> -show -910 1515 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F726573736F75726365732F534D4553485F5B656E2C66725D2E786D6C> -show -1843 1515 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1955 1515 moveto -<72616A6F75746572> -show -370 1575 moveto -<6C6573> -show -445 1575 moveto -<636F6D6D656E746169726573> -show -744 1575 moveto -<737572> -show -824 1575 moveto -<6C6573> -show -898 1575 moveto -<626F75746F6E73> -show -1075 1575 moveto -<6465> -show -1142 1575 moveto -<6C61> -show -1196 1575 moveto -<475549> -show -1305 1575 moveto -<6465> -show -1370 1575 moveto -<534D4553482E> -show -1569 1575 moveto -<436573> -show -1663 1575 moveto -<626F75746F6E73> -show -1840 1575 moveto -<7065726D657474656E74> -show -2073 1575 moveto -<6C65> -show -370 1631 moveto -<63686F6978206475206D61696C6C6575722074E974726168E9647269717565206465204E657467 -656E206574206465206C61207461696C6C652064657320E96CE96D656E747320766F6C756D697175 -65732E> -show -294 1732 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<20202020> -show -394 1732 moveto -<3C> -show -419 1732 moveto -<706F7075702D6974656D206974656D2D69643D93353033339420706F732D69643D9494206C6162 -656C2D69643D944D61782E2048657861686564726F6E206F72> -show -294 1776 moveto -<5465747261686564726F6E20566F6C756D65942069636F6E2D69643D946D6573685F6879706F5F -766F6C756D652E706E679420746F6F6C7469702D69643D949420616363656C2D> -show -294 1820 moveto -<69643D949420746F67676C652D69643D949420657865637574652D616374696F6E3D9494202F> -show -1251 1820 moveto -<3E> -show -294 1864 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1908 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1952 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1996 moveto -<202020203C> -show -420 1996 moveto -<706F7075702D6974656D206974656D2D69643D93353032309420706F732D69643D9494206C6162 -656C2D69643D9448657861686564726F6E2028692C6A2C6B2994> -show -294 2040 moveto -<69636F6E2D69643D946D6573685F616C676F5F686578612E706E679420746F6F6C7469702D6964 -3D949420616363656C2D69643D949420746F67676C652D69643D9494> -show -294 2084 moveto -<657865637574652D616374696F6E3D9494202F> -show -772 2084 moveto -<3E> -show -294 2128 moveto -<202020203C> -show -420 2128 moveto -<706F7075702D6974656D206974656D2D69643D93353032319420706F732D69643D9494206C6162 -656C2D69643D945465747261686564726F6E20284E657467656E2994> -show -294 2171 moveto -<69636F6E2D69643D946D6573685F616C676F5F686578612E706E679420746F6F6C7469702D6964 -3D949420616363656C2D69643D949420746F67676C652D69643D9494> -show -294 2215 moveto -<657865637574652D616374696F6E3D9494202F> -show -772 2215 moveto -<3E> -show -294 2259 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2303 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2347 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2391 moveto -<202020203C746F6F6C627574746F6E> -show -672 2391 moveto -<2D6974656D206974656D2D69643D933530333394206C6162656C2D69643D944D61782E20486578 -61686564726F6E206F72> -show -294 2435 moveto -<5465747261686564726F6E20566F6C756D65942069636F6E2D69643D946D6573685F6879706F5F -766F6C756D652E706E679420746F6F6C7469702D69643D94204D61782E> -show -294 2479 moveto -<48657861686564726F6E206F72205465747261686564726F6E20566F6C756D65204879706F7468 -657369739420616363656C2D69643D949420746F67676C652D69643D9494> -show -294 2523 moveto -<657865637574652D616374696F6E3D9494202F> -show -772 2523 moveto -<3E> -show -294 2567 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2611 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2655 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2699 moveto -<202020203C> -show -420 2699 moveto -<746F6F6C627574746F6E2D6974656D206974656D2D69643D93353032309420706F732D69643D94 -94206C6162656C2D69643D9448657861686564726F6E> -show -294 2743 moveto -<28692C6A2C6B29942069636F6E2D69643D946D6573685F616C676F5F686578612E706E67942074 -6F6F6C7469702D69643D942048657861686564726F6E2028692C6A2C6B29> -show -294 2787 moveto -<416C676F726974686D9420616363656C2D69643D949420746F67676C652D69643D949420657865 -637574652D616374696F6E3D9494202F> -show -1680 2787 moveto -<3E> -show -294 2831 moveto -<202020203C746F6F6C627574746F6E> -show -672 2831 moveto -<2D6974656D206974656D2D69643D93353032319420706F732D69643D9494206C6162656C2D6964 -3D945465747261686564726F6E> -show -294 2875 moveto -<284E657467656E29942069636F6E2D69643D946D6573685F616C676F5F686578612E706E679420 -746F6F6C7469702D69643D94205465747261686564726F6E20284E657467656E29> -show -294 2919 moveto -<416C676F726974686D9420616363656C2D69643D949420746F67676C652D69643D949420657865 -637574652D616374696F6E3D9494202F> -show -1680 2919 moveto -<3E> -show -220 3030 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<417474656E74696F6E> -show -220 3035 188 3 rectfill -408 3030 moveto -<3A20756E2066696368696572202E706E6720206D6573685F616C676F5F74657472612E706E6720 -646F697420EA7472652070726F6475697420706F75722064697374696E67756572206C276963F46E -65206475> -show -220 3086 moveto -<6D61696C6C657572206865786168E96472697175652064652063656C7569206475206D61696C6C -6575722074E974726168E9647269717565202861637475656C6C656D656E7420632765737420756E -652073696D706C65> -show -280 399 1 176 rectfill -2125 399 1 176 rectfill -280 399 1846 1 rectfill -280 574 1846 1 rectfill -280 809 1 176 rectfill -2125 809 1 176 rectfill -280 809 1846 1 rectfill -280 984 1846 1 rectfill -280 1276 1 132 rectfill -2125 1276 1 132 rectfill -280 1276 1846 1 rectfill -280 1407 1846 1 rectfill -280 1698 1 1231 rectfill -2125 1698 1 1231 rectfill -280 1698 1846 1 rectfill -280 2928 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 3 3 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -%%BeginResource: font NimbusMonL-ReguObli -%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular Oblique) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle -12.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-ReguObli def -/PaintType 0 def -/WMode 0 def -/FontBBox {-61 -237 774 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020947 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1 -94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211 -9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB -B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466 -AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1 -25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A -C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC -45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246 -D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566 -9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A -E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698 -53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736 -05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66 -5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341 -6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF -4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2 -4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482 -9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D -FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4 -DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3 -CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D -B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28 -7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A -1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68 -1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A -8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4 -16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365 -F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12 -41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22 -5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D -BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080 -65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827 -C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45 -EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559 -872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103 -AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF -8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E -1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A -7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A -DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610 -38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356 -A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F -67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5 -492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1 -5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD -A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551 -D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3 -C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252 -CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097 -60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A -F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA -37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8 -F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E -18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0 -9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118 -73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0 -837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D -9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E -9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC -85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3 -AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F -719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1 -496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88 -EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C -6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7 -37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB -F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C -D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2 -63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15 -565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE -18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E -2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841 -55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44 -58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551 -837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3 -0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE -9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C -155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8 -BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16 -8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879 -1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C -4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA -492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3 -155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704 -1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3 -5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0 -5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC -CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0 -BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E -DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311 -98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E -DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6 -F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C -93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504 -78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9 -F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F -9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4 -3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2 -52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A -A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0 -F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB -1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F -2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8 -D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD -879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319 -1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD -BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122 -007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C -5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F -013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D -BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA -6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338 -670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C -0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13 -C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172 -6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807 -91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600 -8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F -8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D -AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94 -202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E -DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68 -85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315 -70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF -80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581 -217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12 -E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA -9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519 -1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5 -3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED -B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4 -FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC -797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D -2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7 -E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364 -A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71 -8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C -BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0 -9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1 -3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B -E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75 -BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428 -4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B -69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6 -D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8 -FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387 -7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4 -A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF -51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A -DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515 -D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A -FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0 -5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A -96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB -92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF -37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812 -3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726 -62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3 -D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550 -7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752 -4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734 -B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363 -141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303 -86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83 -9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726 -B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B -737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43 -46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7 -0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9 -A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744 -69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8 -222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6 -855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF -F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1 -6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A -8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453 -3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6 -67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A -AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C -30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4 -29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04 -26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1 -3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B -667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177 -D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17 -070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180 -7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8 -C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D -E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD -E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51 -C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E -EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA -11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385 -1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C -FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8 -96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C -0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C -6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120 -835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C -5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC -7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A -78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21 -6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8 -2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099 -9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE -C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0 -DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054 -16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B -D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3 -984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA -B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33 -7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219 -1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26 -DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66 -1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA -4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27 -94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350 -45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915 -E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36 -6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5 -F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538 -B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2 -3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705 -796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8 -40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494 -44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5 -C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59 -6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14 -AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130 -6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68 -6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952 -35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7 -08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217 -4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218 -52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95 -41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C -77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8 -65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB -73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81 -234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F -982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9 -184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885 -A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD -0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34 -7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2 -E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC -AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB -8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09 -1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF -EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED -8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F -A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F -87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B -33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7 -B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559 -2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C -6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC -56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED -884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262 -348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1 -106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B -13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07 -E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30 -41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687 -F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604 -3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1 -467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95 -993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F -7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083 -4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3 -41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941 -2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F -BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F -486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8 -249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325 -D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D -4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4 -AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E -1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D -13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367 -DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020 -749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C -5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39 -0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1 -71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D -FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6 -F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4 -D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2 -182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137 -33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE -48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1 -5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA -5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C -4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173 -A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731 -5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938 -731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C -15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3 -D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E -E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7 -97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC -7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369 -DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171 -CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878 -B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343 -1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4 -7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A -FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93 -12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E -31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28 -8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35 -FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA -AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F -970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1 -837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080 -02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29 -3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E -57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5 -8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765 -EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB -43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE -5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F -7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C -39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2 -A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2 -56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158 -C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951 -23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34 -37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE -BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9 -2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9 -BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594 -6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6 -5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE -CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D -3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65 -77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B -DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7 -63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB -EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69 -B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB -438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D -7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245 -4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B -F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1 -8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2 -F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C -C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B -47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326 -6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1 -564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692 -C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24 -870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81 -1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211 -D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601 -196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0 -CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53 -41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4 -5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47 -B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD -B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947 -1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D -DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6 -A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED -5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3 -E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA -649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B -220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729 -E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7 -5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524 -4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01 -486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195 -CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2 -1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14 -50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6 -B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25 -B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F -58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7 -77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202 -42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2 -79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179 -08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101 -EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A -A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171 -0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC -50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16 -D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938 -A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B -A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476 -63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444 -5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E -4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598 -54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62 -3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C -1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC -1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269 -743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA -94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD -02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F -03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5 -403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006 -54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63 -8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67 -5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108 -DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C -2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB -197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4 -6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918 -0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C -F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D -05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC -E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E -4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC -7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717 -80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9 -4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158 -8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62 -0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF -540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6 -A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957 -270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911 -F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E -4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D -41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967 -6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654 -BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B -7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C -52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB -4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97 -146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B -D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD -52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559 -187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616 -F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174 -CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963 -4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D -0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5 -4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE -A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070 -169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72 -6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092 -402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C -EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B -77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0 -02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9 -73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421 -B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4 -D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806 -E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70 -BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A -79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7 -787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8 -88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F -F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52 -6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D -6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB -C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744 -1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296 -75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391 -26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A -0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379 -928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4 -77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806 -4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E -9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70 -89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E -E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17 -01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506 -FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735 -2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B -3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D -6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C -2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928 -C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA -35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67 -F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F -CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6 -4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714 -54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228 -603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB -2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9 -F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2 -106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC -32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA -60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431 -F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892 -370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950 -78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D -CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE -F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A -75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847 -C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A -41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1 -5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9 -5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441 -DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1 -639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A -3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464 -81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463 -DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6 -DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB -02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84 -E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54 -0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824 -16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D -F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320 -79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0 -F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF -74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8 -5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD -AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02 -DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E -7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC -0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119 -32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438 -DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97 -6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A -4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7 -A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA -ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693 -CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA -683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853 -BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3 -8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499 -907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D -403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49 -A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9 -4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C -EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2 -0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF -885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A -4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC -8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E -0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9 -8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF -E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC -2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09 -5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731 -28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1 -1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA -BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367 -4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD -E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956 -507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13 -24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35 -8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D -8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339 -E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE -0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D -25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1 -10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888 -4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2 -2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678 -9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55 -43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91 -3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E -EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E -D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B -B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2 -86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2 -376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB -76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A -5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490 -D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684 -8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842 -9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839 -0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688 -1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8 -D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674 -F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A -96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D -31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD -63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81 -0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF -DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88 -30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7 -835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E -115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A -9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C -80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63 -6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210 -C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE -CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED -8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37 -CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA -71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209 -8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA -BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E -722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C -4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC -52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2 -802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88 -A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE -43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2 -BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382 -5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3 -F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E -1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821 -4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E -34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44 -400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408 -999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E -8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436 -BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497 -5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09 -6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814 -E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F -D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8 -F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C -E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725 -EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB -009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9 -4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5 -5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5 -86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988 -A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847 -EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E -3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10 -324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E -FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495 -0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E -ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12 -8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD -4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF -CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D -DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD -B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD -D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8 -FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E -B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA -E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551 -98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9 -FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C -D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40 -19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C -2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0 -DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0 -ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B -2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C -4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C -BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C -46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E -690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A -BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399 -270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4 -9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268 -10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65 -95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3 -AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0 -9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B -D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754 -94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1 -67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8 -BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E -07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94 -D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4 -1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4 -95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA -91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D -30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE -C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B -3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7 -AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273 -38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F -9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1 -B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65 -89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B -163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2 -56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B -186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE -19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C -4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5 -03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28 -B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24 -4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34 -8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3 -71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1 -EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5 -083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31 -D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200 -458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0 -11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1 -0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C -397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560 -A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82 -0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591 -EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4 -4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C -1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033 -109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213 -18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2 -C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3 -47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605 -8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB -7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754 -E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D -AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D -5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89 -7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E -AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604 -388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C -540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2 -3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D -E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40 -61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA -73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921 -9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127 -4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A -4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6 -F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1 -BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0 -39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910 -B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314 -54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A -EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734 -EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079 -CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE -718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C -D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA -9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A -53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E -A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7 -7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237 -CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55 -311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357 -F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B -E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643 -15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C -001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0 -0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D -CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55 -AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A -ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E -77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252 -346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD -12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF -2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A -C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427 -AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B -61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0 -BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C -484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82 -94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2 -E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827 -A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE -5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12 -66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2 -B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72 -E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E -168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF -BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999 -4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA -252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B -87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C -0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074 -EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135 -ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912 -999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4 -C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA -4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152 -692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014 -69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F -F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840 -301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624 -B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E -86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1 -1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED -70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D -B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37 -5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803 -35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651 -C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A -D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A -C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528 -4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154 -02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492 -83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C -BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65 -64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738 -9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60 -7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694 -45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F -C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB -55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766 -2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1 -7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419 -5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB -1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E -17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3 -5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217 -F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A -9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120 -2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8 -ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8 -0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1 -1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006 -F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0 -000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9 -9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789 -ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B -02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963 -189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE -EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2 -C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268 -6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C -390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2 -922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8 -D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86 -70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962 -F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB -268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886 -B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9 -6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07 -A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649 -B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663 -AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F -A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA -0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816 -495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7 -E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA -D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE -B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C -0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C -7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B -6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86 -EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6 -08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6 -6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC -1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2 -E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D -3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C -122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2 -F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6 -154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954 -9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182 -B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8 -9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1 -85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47 -B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46 -E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED -839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A -9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5 -E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4 -FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D -D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A -1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278 -AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA -239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062 -3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02 -F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD -7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405 -77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA -BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C -80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09 -9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E -DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9 -703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D -F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F -6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76 -CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6 -EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A -B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306 -23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7 -3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB -01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E -93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80 -3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C -4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB -0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF -AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C -05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396 -06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB -87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA -A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69 -50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03 -AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024 -FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18 -C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777 -3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA -F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E -59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D -A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C -4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677 -206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071 -5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A -4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89 -18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6 -7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096 -84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5 -6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9 -C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9 -684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3 -70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297 -040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345 -7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37 -F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C -1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD -F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA -E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3 -3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8 -580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1 -D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6 -645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3 -7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905 -3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60 -670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0 -BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F -2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381 -1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB -CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5 -E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB -669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C -0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF -6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F -67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2 -5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657 -C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451 -CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6 -CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25 -B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C -76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1 -A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB -5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A -6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5 -AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3 -37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2 -631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639 -567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28 -47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6 -4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD -585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB -39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0 -D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF -4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F -C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B -1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2 -2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206 -CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568 -75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88 -114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B -F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338 -6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63 -9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77 -6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B -D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0 -BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49 -E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E -DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A -7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284 -89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4 -8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46 -BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8 -34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A -3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30 -43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A -D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5 -43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD -BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2 -9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7 -31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3 -5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9 -8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97 -E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1 -1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D -082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E -BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9 -3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0 -FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77 -312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2 -74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5 -B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4 -CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9 -BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1 -4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5 -9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33 -92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B -09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B -8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802 -7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0 -5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83 -4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547 -71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC -01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464 -76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76 -41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD -7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD -C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926 -E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7 -8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC -F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43 -29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5 -243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2 -1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75 -F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC -102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36 -45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20 -352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D -17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6 -6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D -EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7 -50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC -3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0 -011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5 -FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A -7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A -3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF -7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18 -218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6 -0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC -112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB -80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65 -05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5 -A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F -5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A -289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2 -F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315 -A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D -75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244 -C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B -C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B -479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8 -0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD -3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45 -1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401 -CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338 -D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A -AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1 -BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0 -DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37 -178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF -77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F -8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A -27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808 -488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D -A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D -321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A -7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB -F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE -922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526 -75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB -09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2 -BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB -B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373 -6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379 -59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62 -8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9 -21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30 -026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022 -C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E -E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF -44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1 -8A31BE4E82B384 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont -220 265 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<636F706965292E> -show -295 383 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 383 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -671 383 moveto -<6475> -show -763 383 moveto -<66696368696572> -show -934 383 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553482F534D4553485F4879706F746865736973466163 -746F72792E637878> -show -370 443 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -479 443 moveto -<72616A6F75746572> -show -653 443 moveto -<6C6573> -show -726 443 moveto -<6E6F7576656C6C6573> -show -935 443 moveto -<6879706F7468E8736573> -show -1175 443 moveto -<636F6E6365726E616E74> -show -1411 443 moveto -<6C65> -show -1466 443 moveto -<63686F6978> -show -1595 443 moveto -<6475> -show -1662 443 moveto -<6D61696C6C657572> -show -1846 443 moveto -<74E974726168E9647269717565> -show -370 499 moveto -<6465204E657467656E206574206465206C61207461696C6C652064657320E96CE96D656E747320 -766F6C756D69717565732E> -show -294 601 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<23696E636C75646520> -show -520 601 moveto -<94534D4553485F4D6178456C656D656E74566F6C756D652E68787894> -show -294 645 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 689 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 733 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 776 moveto -<23696E636C7564652094534D4553485F4E455447454E5F332E68787894> -show -294 820 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 864 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 908 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 952 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944D6178456C656D656E74566F6C756D65945D203D> -show -294 996 moveto -<20202020202020206E657720534D4553485F> -show -747 996 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F72> -show -1175 996 moveto -<3C534D4553485F4D6178456C656D656E74566F6C756D653E3B> -show -294 1040 moveto -<2020202020202020202020202020202020> -show -722 1040 moveto -<2E20202020202020202020202020202020202020202020202020202020202020202020202E> -show -294 1084 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1128 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1172 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944E455447454E5F3344945D203D206E657720534D4553485F> -show -1201 1172 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F72> -show -1629 1172 moveto -<3C534D4553485F4E455447454E5F33443E3B> -show -295 1289 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1289 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E2064752066696368696572> -show -370 1349 moveto -<20> -show -382 1349 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553485F492F534D4553485F4879706F74686573697346 -6163746F72795F692E6378782C> -show -1651 1349 moveto -0 0 0 setrgbcolor -<20E971756976616C656E7420434F524241206465> -show -370 1405 moveto -<6C61206D6F64696669636174696F6E207072E963E964656E7465> -show -906 1405 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2E> -show -294 1507 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<23696E636C7564652094534D4553485F4D6178456C656D656E74566F6C756D655F692E68787894> -show -294 1551 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1595 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1639 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1683 moveto -<23696E636C7564652094534D4553485F4E455447454E5F335F692E68787894> -show -294 1726 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1770 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1814 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1858 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944D6178456C656D656E74566F6C756D65945D203D> -show -294 1902 moveto -<20202020202020206E657720534D4553485F> -show -747 1902 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F725F69> -show -1225 1902 moveto -<3C534D4553485F4D6178456C656D656E74566F6C756D655F693E3B> -show -294 1946 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1990 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2034 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2078 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<63726561746F724D61705B944E455447454E5F3344945D203D> -show -294 2122 moveto -<20202020202020206E657720534D4553485F> -show -747 2122 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4879706F74686573697343726561746F725F69> -show -1225 2122 moveto -<3C534D4553485F4E455447454E5F33445F693E3B> -show -295 2239 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2239 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -651 2239 moveto -<6475> -show -723 2239 moveto -<66696368696572> -show -874 2239 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553484755492F534D4553484755492E637878> -show -1843 2239 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1955 2239 moveto -<72616A6F75746572> -show -370 2299 moveto -<6C6573> -show -443 2299 moveto -<6E6F7576656C6C6573> -show -653 2299 moveto -<6879706F7468E8736573> -show -892 2299 moveto -<636F6E6365726E616E74> -show -1129 2299 moveto -<6C65> -show -1183 2299 moveto -<63686F6978> -show -1311 2299 moveto -<6475> -show -1380 2299 moveto -<6D61696C6C657572> -show -1564 2299 moveto -<74E974726168E9647269717565> -show -1845 2299 moveto -<6465> -show -1910 2299 moveto -<4E657467656E> -show -2073 2299 moveto -<6574> -show -370 2355 moveto -<6465206C61207461696C6C652064657320E96CE96D656E747320766F6C756D6971756573206461 -6E73206C612047554920646520534D4553482E> -show -294 2457 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<656C736520696620282054797065416C676F2E636F6D7061726528944E455447454E5F33449420 -3D3D203029> -show -294 2501 moveto -<2020487970203D206D79436F6D706F6E656E744D6573682D> -show -898 2501 moveto -<3E4372656174654879706F74686573697328> -show -1351 2501 moveto -<54797065416C676F2C206D795374756479496420293B> -show -294 2545 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2589 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2633 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2676 moveto -<20202020202020202020202020202020202020202020202020202020202074722894534D455348 -5F4D41585F454C454D454E545F564F4C554D455F4859504F54484553495394292C> -show -294 2720 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2764 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2808 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 2852 moveto -<2020627265616B3B> -show -294 2896 moveto -<20207D> -show -294 2940 moveto -<6361736520353032313A> -show -294 2984 moveto -<20207B> -show -294 3028 moveto -<2020736D6573684755492D> -show -571 3028 moveto -<3E437265617465416C676F726974686D28> -show -999 3028 moveto -<944E455447454E5F3344942C94546574726168656472616C20284E657467656E2994> -show -1855 3028 moveto -<293B> -show -280 567 1 616 rectfill -2125 567 1 616 rectfill -280 567 1846 1 rectfill -280 1182 1846 1 rectfill -280 1473 1 660 rectfill -2125 1473 1 660 rectfill -280 1473 1846 1 rectfill -280 2132 1846 1 rectfill -280 2423 1 616 rectfill -2125 2423 1 616 rectfill -280 2423 1846 1 rectfill -280 3038 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 4 4 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -%%BeginResource: font NimbusMonL-ReguObli -%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular Oblique) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle -12.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-ReguObli def -/PaintType 0 def -/WMode 0 def -/FontBBox {-61 -237 774 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020947 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1 -94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211 -9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB -B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466 -AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1 -25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A -C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC -45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246 -D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566 -9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A -E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698 -53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736 -05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66 -5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341 -6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF -4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2 -4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482 -9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D -FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4 -DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3 -CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D -B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28 -7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A -1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68 -1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A -8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4 -16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365 -F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12 -41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22 -5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D -BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080 -65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827 -C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45 -EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559 -872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103 -AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF -8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E -1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A -7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A -DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610 -38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356 -A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F -67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5 -492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1 -5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD -A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551 -D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3 -C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252 -CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097 -60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A -F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA -37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8 -F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E -18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0 -9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118 -73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0 -837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D -9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E -9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC -85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3 -AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F -719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1 -496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88 -EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C -6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7 -37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB -F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C -D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2 -63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15 -565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE -18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E -2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841 -55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44 -58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551 -837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3 -0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE -9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C -155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8 -BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16 -8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879 -1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C -4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA -492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3 -155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704 -1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3 -5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0 -5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC -CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0 -BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E -DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311 -98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E -DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6 -F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C -93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504 -78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9 -F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F -9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4 -3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2 -52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A -A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0 -F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB -1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F -2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8 -D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD -879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319 -1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD -BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122 -007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C -5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F -013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D -BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA -6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338 -670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C -0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13 -C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172 -6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807 -91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600 -8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F -8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D -AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94 -202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E -DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68 -85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315 -70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF -80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581 -217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12 -E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA -9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519 -1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5 -3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED -B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4 -FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC -797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D -2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7 -E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364 -A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71 -8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C -BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0 -9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1 -3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B -E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75 -BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428 -4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B -69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6 -D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8 -FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387 -7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4 -A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF -51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A -DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515 -D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A -FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0 -5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A -96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB -92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF -37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812 -3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726 -62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3 -D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550 -7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752 -4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734 -B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363 -141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303 -86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83 -9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726 -B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B -737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43 -46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7 -0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9 -A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744 -69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8 -222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6 -855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF -F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1 -6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A -8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453 -3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6 -67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A -AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C -30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4 -29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04 -26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1 -3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B -667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177 -D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17 -070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180 -7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8 -C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D -E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD -E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51 -C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E -EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA -11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385 -1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C -FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8 -96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C -0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C -6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120 -835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C -5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC -7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A -78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21 -6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8 -2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099 -9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE -C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0 -DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054 -16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B -D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3 -984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA -B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33 -7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219 -1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26 -DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66 -1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA -4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27 -94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350 -45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915 -E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36 -6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5 -F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538 -B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2 -3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705 -796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8 -40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494 -44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5 -C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59 -6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14 -AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130 -6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68 -6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952 -35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7 -08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217 -4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218 -52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95 -41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C -77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8 -65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB -73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81 -234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F -982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9 -184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885 -A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD -0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34 -7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2 -E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC -AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB -8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09 -1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF -EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED -8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F -A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F -87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B -33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7 -B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559 -2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C -6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC -56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED -884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262 -348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1 -106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B -13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07 -E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30 -41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687 -F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604 -3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1 -467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95 -993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F -7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083 -4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3 -41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941 -2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F -BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F -486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8 -249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325 -D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D -4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4 -AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E -1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D -13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367 -DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020 -749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C -5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39 -0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1 -71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D -FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6 -F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4 -D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2 -182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137 -33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE -48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1 -5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA -5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C -4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173 -A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731 -5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938 -731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C -15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3 -D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E -E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7 -97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC -7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369 -DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171 -CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878 -B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343 -1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4 -7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A -FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93 -12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E -31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28 -8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35 -FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA -AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F -970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1 -837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080 -02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29 -3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E -57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5 -8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765 -EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB -43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE -5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F -7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C -39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2 -A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2 -56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158 -C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951 -23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34 -37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE -BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9 -2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9 -BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594 -6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6 -5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE -CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D -3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65 -77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B -DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7 -63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB -EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69 -B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB -438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D -7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245 -4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B -F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1 -8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2 -F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C -C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B -47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326 -6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1 -564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692 -C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24 -870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81 -1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211 -D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601 -196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0 -CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53 -41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4 -5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47 -B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD -B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947 -1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D -DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6 -A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED -5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3 -E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA -649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B -220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729 -E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7 -5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524 -4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01 -486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195 -CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2 -1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14 -50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6 -B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25 -B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F -58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7 -77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202 -42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2 -79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179 -08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101 -EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A -A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171 -0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC -50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16 -D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938 -A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B -A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476 -63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444 -5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E -4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598 -54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62 -3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C -1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC -1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269 -743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA -94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD -02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F -03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5 -403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006 -54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63 -8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67 -5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108 -DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C -2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB -197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4 -6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918 -0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C -F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D -05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC -E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E -4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC -7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717 -80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9 -4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158 -8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62 -0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF -540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6 -A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957 -270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911 -F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E -4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D -41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967 -6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654 -BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B -7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C -52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB -4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97 -146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B -D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD -52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559 -187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616 -F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174 -CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963 -4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D -0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5 -4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE -A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070 -169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72 -6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092 -402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C -EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B -77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0 -02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9 -73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421 -B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4 -D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806 -E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70 -BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A -79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7 -787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8 -88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F -F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52 -6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D -6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB -C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744 -1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296 -75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391 -26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A -0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379 -928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4 -77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806 -4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E -9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70 -89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E -E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17 -01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506 -FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735 -2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B -3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D -6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C -2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928 -C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA -35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67 -F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F -CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6 -4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714 -54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228 -603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB -2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9 -F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2 -106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC -32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA -60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431 -F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892 -370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950 -78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D -CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE -F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A -75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847 -C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A -41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1 -5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9 -5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441 -DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1 -639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A -3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464 -81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463 -DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6 -DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB -02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84 -E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54 -0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824 -16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D -F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320 -79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0 -F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF -74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8 -5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD -AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02 -DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E -7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC -0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119 -32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438 -DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97 -6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A -4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7 -A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA -ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693 -CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA -683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853 -BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3 -8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499 -907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D -403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49 -A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9 -4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C -EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2 -0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF -885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A -4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC -8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E -0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9 -8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF -E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC -2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09 -5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731 -28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1 -1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA -BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367 -4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD -E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956 -507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13 -24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35 -8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D -8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339 -E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE -0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D -25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1 -10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888 -4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2 -2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678 -9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55 -43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91 -3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E -EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E -D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B -B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2 -86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2 -376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB -76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A -5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490 -D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684 -8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842 -9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839 -0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688 -1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8 -D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674 -F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A -96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D -31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD -63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81 -0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF -DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88 -30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7 -835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E -115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A -9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C -80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63 -6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210 -C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE -CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED -8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37 -CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA -71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209 -8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA -BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E -722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C -4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC -52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2 -802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88 -A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE -43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2 -BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382 -5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3 -F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E -1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821 -4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E -34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44 -400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408 -999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E -8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436 -BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497 -5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09 -6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814 -E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F -D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8 -F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C -E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725 -EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB -009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9 -4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5 -5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5 -86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988 -A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847 -EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E -3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10 -324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E -FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495 -0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E -ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12 -8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD -4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF -CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D -DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD -B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD -D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8 -FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E -B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA -E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551 -98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9 -FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C -D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40 -19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C -2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0 -DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0 -ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B -2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C -4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C -BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C -46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E -690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A -BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399 -270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4 -9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268 -10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65 -95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3 -AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0 -9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B -D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754 -94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1 -67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8 -BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E -07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94 -D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4 -1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4 -95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA -91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D -30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE -C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B -3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7 -AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273 -38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F -9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1 -B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65 -89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B -163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2 -56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B -186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE -19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C -4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5 -03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28 -B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24 -4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34 -8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3 -71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1 -EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5 -083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31 -D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200 -458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0 -11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1 -0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C -397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560 -A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82 -0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591 -EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4 -4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C -1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033 -109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213 -18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2 -C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3 -47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605 -8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB -7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754 -E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D -AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D -5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89 -7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E -AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604 -388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C -540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2 -3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D -E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40 -61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA -73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921 -9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127 -4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A -4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6 -F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1 -BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0 -39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910 -B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314 -54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A -EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734 -EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079 -CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE -718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C -D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA -9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A -53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E -A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7 -7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237 -CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55 -311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357 -F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B -E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643 -15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C -001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0 -0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D -CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55 -AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A -ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E -77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252 -346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD -12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF -2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A -C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427 -AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B -61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0 -BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C -484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82 -94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2 -E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827 -A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE -5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12 -66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2 -B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72 -E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E -168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF -BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999 -4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA -252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B -87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C -0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074 -EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135 -ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912 -999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4 -C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA -4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152 -692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014 -69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F -F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840 -301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624 -B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E -86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1 -1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED -70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D -B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37 -5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803 -35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651 -C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A -D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A -C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528 -4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154 -02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492 -83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C -BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65 -64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738 -9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60 -7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694 -45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F -C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB -55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766 -2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1 -7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419 -5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB -1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E -17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3 -5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217 -F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A -9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120 -2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8 -ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8 -0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1 -1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006 -F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0 -000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9 -9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789 -ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B -02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963 -189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE -EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2 -C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268 -6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C -390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2 -922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8 -D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86 -70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962 -F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB -268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886 -B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9 -6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07 -A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649 -B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663 -AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F -A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA -0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816 -495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7 -E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA -D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE -B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C -0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C -7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B -6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86 -EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6 -08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6 -6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC -1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2 -E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D -3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C -122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2 -F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6 -154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954 -9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182 -B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8 -9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1 -85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47 -B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46 -E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED -839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A -9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5 -E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4 -FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D -D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A -1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278 -AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA -239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062 -3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02 -F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD -7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405 -77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA -BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C -80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09 -9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E -DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9 -703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D -F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F -6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76 -CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6 -EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A -B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306 -23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7 -3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB -01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E -93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80 -3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C -4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB -0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF -AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C -05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396 -06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB -87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA -A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69 -50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03 -AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024 -FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18 -C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777 -3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA -F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E -59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D -A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C -4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677 -206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071 -5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A -4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89 -18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6 -7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096 -84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5 -6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9 -C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9 -684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3 -70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297 -040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345 -7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37 -F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C -1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD -F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA -E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3 -3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8 -580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1 -D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6 -645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3 -7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905 -3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60 -670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0 -BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F -2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381 -1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB -CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5 -E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB -669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C -0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF -6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F -67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2 -5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657 -C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451 -CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6 -CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25 -B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C -76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1 -A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB -5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A -6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5 -AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3 -37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2 -631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639 -567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28 -47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6 -4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD -585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB -39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0 -D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF -4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F -C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B -1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2 -2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206 -CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568 -75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88 -114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B -F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338 -6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63 -9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77 -6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B -D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0 -BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49 -E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E -DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A -7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284 -89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4 -8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46 -BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8 -34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A -3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30 -43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A -D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5 -43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD -BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2 -9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7 -31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3 -5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9 -8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97 -E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1 -1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D -082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E -BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9 -3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0 -FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77 -312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2 -74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5 -B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4 -CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9 -BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1 -4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5 -9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33 -92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B -09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B -8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802 -7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0 -5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83 -4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547 -71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC -01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464 -76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76 -41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD -7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD -C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926 -E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7 -8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC -F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43 -29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5 -243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2 -1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75 -F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC -102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36 -45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20 -352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D -17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6 -6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D -EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7 -50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC -3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0 -011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5 -FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A -7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A -3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF -7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18 -218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6 -0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC -112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB -80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65 -05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5 -A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F -5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A -289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2 -F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315 -A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D -75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244 -C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B -C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B -479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8 -0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD -3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45 -1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401 -CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338 -D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A -AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1 -BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0 -DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37 -178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF -77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F -8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A -27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808 -488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D -A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D -321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A -7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB -F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE -922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526 -75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB -09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2 -BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB -B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373 -6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379 -59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62 -8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9 -21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30 -026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022 -C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E -E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF -44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1 -8A31BE4E82B384 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont -295 271 moveto -0 0 0 setrgbcolor -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 271 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -659 271 moveto -<6475> -show -738 271 moveto -<66696368696572> -show -897 271 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F534D4553485F492F534D4553485F47656E5F692E6378782C> -show -1898 271 moveto -0 0 0 setrgbcolor - -show -370 331 moveto -<434F52424120> -show -543 331 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572206C652067E96EE97261746575722E> -show -294 433 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<23696E636C7564652094534D4553485F4D6178456C656D656E74566F6C756D655F692E68787894> -show -294 476 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 520 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 564 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 608 moveto -<202020202020646F75626C65206C656E6774682C6D6178456C656D656E7473417265612C6D6178 -456C656D656E7473566F6C756D653B> -show -294 652 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 696 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 740 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 784 moveto -<2020202020202020656C73652069662028737472636D70286D794879702D> -show -1050 784 moveto -<3E4765744E616D652C> -show -1276 784 moveto -<944D6178456C656D656E74566F6C756D659429203D3D203029207B> -show -294 828 moveto -<20202020202020202020534D4553483A3A534D4553485F4D6178456C656D656E74566F6C756D65 -5F766172204D4556203D> -show -294 872 moveto -<202020202020202020202020202020202020534D4553483A3A534D4553485F4D6178456C656D65 -6E74566F6C756D653A3A5F6E6172726F7728206D7948797020293B> -show -294 916 moveto -<202020202020202020206D6178456C656D656E74566F6C756D65203D204D45562D> -show -1125 916 moveto -<3E4765744D6178456C656D656E74566F6C756D6528293B> -show -294 960 moveto -<20202020202020202020667072696E7466286465737446696C652C> -show -974 960 moveto -<9425665C6E942C6D6178456C656D656E74566F6C756D65> -show -1553 960 moveto -<293B> -show -294 1004 moveto -<20202020202020207D> -show -294 1048 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1092 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1136 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1180 moveto -<202020202020646F75626C65206C656E6774682C6D6178456C656D656E7473417265612C6D6178 -456C656D656E7473566F6C756D653B> -show -294 1224 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1268 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1312 moveto -<20202020202020202020202020202020202E202020202020202020202020202020202020202020 -20202020202020202020202020202E> -show -294 1356 moveto -<2020202020202020202020656C73652069662028737472636D7028614C696E65> -show -1100 1356 moveto -<2C> -show -1125 1356 moveto -<944D6178456C656D656E74566F6C756D659429203D3D203029207B> -show -294 1400 moveto -<2020202020202020534D4553483A3A534D4553485F4879706F7468657369735F766172206D7948 -7970203D> -show -294 1444 moveto -<2020202020202020202020202020202020746869732D> -show -848 1444 moveto -<3E4372656174654879706F74686573697328614C696E652C73747564794964293B> -show -294 1488 moveto -<2020202020202020534D4553483A3A534D4553485F4D6178456C656D656E74566F6C756D655F76 -6172204D4556203D> -show -294 1531 moveto -<202020202020202020202020202020202020534D4553483A3A534D4553485F4D6178456C656D65 -6E74566F6C756D653A3A5F6E6172726F7728206D7948797020293B> -show -294 1575 moveto -<2020202020202020667363616E66286C6F616446696C652C942573942C614C696E65293B> -show -294 1619 moveto -<20202020202020206D6178456C656D656E74566F6C756D65203D2061746F6628614C696E65293B> -show -294 1663 moveto -<20202020202020204D45562D> -show -596 1663 moveto -<3E5365744D6178456C656D656E74566F6C756D6528> -show -1125 1663 moveto -<6D6178456C656D656E74566F6C756D65> -show -1528 1663 moveto -<293B> -show -294 1707 moveto -<2020202020202020737472696E6720696F72537472696E67203D20> -show -974 1707 moveto -/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont -<6F7262> -show -1049 1707 moveto -<2D> -show -1074 1707 moveto -<3E6F626A656374> -show -1250 1707 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<746F5F737472696E67284D4556293B> -show -294 1751 moveto -<2020202020202020737072696E7466286F626A65637449642C> -show -924 1751 moveto -<942564942C4D45562D> -show -1150 1751 moveto -<3E47657449642829293B> -show -294 1795 moveto -<2020202020202020534D455348436F7262614F626A5B737472696E6728> -show -1024 1795 moveto -<944879706F5F94> -show -1200 1795 moveto -<292B737472696E67286F626A6563744964295D203D20696F72537472696E673B> -show -294 1839 moveto -<2020202020202020> -show -495 1839 moveto -<7D> -show -295 1956 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 1956 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E20646573206669636869657273> -show -370 2015 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F575F534D44 -535F4D6573682E63787820> -show -1672 2015 moveto -0 0 0 setrgbcolor -<6574> -show -370 2070 moveto -1 0 0 setrgbcolor -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F575F534D45 -534844535F4D6573682E63787820> -show -1764 2070 moveto -0 0 0 setrgbcolor -<706F7572206C27E96372697475726520E0> -show -370 2125 moveto -<74726176657273> -show -551 2125 moveto -<6C65> -show -627 2125 moveto -<647269766572> -show -789 2125 moveto -<4D4544> -show -937 2125 moveto -<64616E73> -show -1072 2125 moveto -<6C61> -show -1150 2125 moveto -<737472756374757265> -show -1370 2125 moveto -<6465> -show -1458 2125 moveto -<646F6E6EE965> -show -1642 2125 moveto -<534D4453> -show -1809 2125 moveto -<6574> -show -1885 2125 moveto -<534D4553484453> -show -370 2180 moveto -<726573706563746976656D656E742028636573207374727563747572657320736F6E7420696E74 -65726E6573206175206D6F64756C6520534D455348292E> -show -294 2282 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<202020202020636173652034> -show -596 2282 moveto -<20> -show -621 2282 moveto -<3A> -show -294 2326 moveto -<2020202020202020656C656D5F49645B375D2E707573685F6261636B28656C656D2D> -show -1150 2326 moveto -<3E47657449442829293B> -show -294 2370 moveto -<20202020202020206E6D61696C6C65735B375D2B2B3B> -show -294 2414 moveto -<2020202020202020627265616B3B> -show -294 2458 moveto -<2020202020207D> -show -295 2575 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2575 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E2064752066696368696572> -show -370 2634 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F525F534D44 -535F4D6573682E637878> -show -1712 2634 moveto -0 0 0 setrgbcolor -<706F7572> -show -1838 2634 moveto -<6C61> -show -1909 2634 moveto -<6C656374757265> -show -2080 2634 moveto - -show -370 2689 moveto -<74726176657273206C6520647269766572204D454420737572206C612073747275637475726520 -646520646F6E6EE965206475206D61696C6C61676520534D44532E> -show -280 399 1 1451 rectfill -2125 399 1 1451 rectfill -280 399 1846 1 rectfill -280 1849 1846 1 rectfill -280 2248 1 220 rectfill -2125 2248 1 220 rectfill -280 2248 1846 1 rectfill -280 2467 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 5 5 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont -294 254 moveto -0 0 0 setrgbcolor -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<202020202020> -show -445 254 moveto -<63617365204D45445F544554524134> -show -823 254 moveto -<20> -show -848 254 moveto -<3A207B> -show -294 298 moveto -<202020202020202069662028696E75656C6529207B> -show -294 342 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 342 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 386 moveto -<202020202020202020202020656C656D5F69643D2A286E756D656C652B6A293B> -show -294 430 moveto -<2020202020202020202020206F6B203D206D794D657368> -show -873 430 moveto -<2D> -show -898 430 moveto -<3E416464566F6C756D65576974684944282A28636F6E6E65637469766974652B6A2A287461696C -6C6529292C> -show -294 474 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B31292C> -show -294 518 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B32292C> -show -294 562 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B33292C> -show -294 606 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -2020656C656D5F6964293B> -show -294 650 moveto -<202020202020202020207D> -show -294 694 moveto -<2020202020202020> -show -495 694 moveto -<7D> -show -294 738 moveto -<2020202020202020656C7365207B> -show -294 782 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 782 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 826 moveto -<202020202020202020202020> -show -596 826 moveto -<636D70743B> -show -294 870 moveto -<202020202020202020202020> -show -596 870 moveto -<6F6B203D206D794D657368> -show -874 870 moveto -<2D> -show -899 870 moveto -<3E416464566F6C756D65576974684944282A28636F6E6E65637469766974652B6A2A287461696C -6C6529292C> -show -294 914 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -2020> -show -1327 914 moveto -<2A28636F6E6E65637469766974652B6A2A287461696C6C65292B31292C> -show -294 958 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B32292C> -show -294 1002 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B33292C> -show -294 1046 moveto -<202020202020202020202020202020202020202020202020202020202020202020202020202020 -2020636D7074293B> -show -294 1090 moveto -<20202020202020207D> -show -294 1134 moveto -<2020202020202020627265616B3B> -show -294 1178 moveto -<2020202020207D> -show -220 1289 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -507 1289 moveto -<6475> -show -583 1289 moveto -<66696368696572> -show -740 1289 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F525F534D45 -534844535F4D6573682E637878> -show -220 1344 moveto -0 0 0 setrgbcolor -<706F7572206C61206C65637475726520E02074726176657273206C6520647269766572204D4544 -20737572206C612073747275637475726520646520646F6E6EE965206475206D61696C6C61676520 -534D45534844532E> -show -294 1445 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<202020202020> -show -445 1445 moveto -<63617365204D45445F544554524134> -show -823 1445 moveto -<20> -show -848 1445 moveto -<3A207B> -show -294 1489 moveto -<202020202020202069662028696E75656C6529207B> -show -294 1533 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 1533 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 1577 moveto -<202020202020202020202020> -show -596 1577 moveto -<656C656D5F69643D2A286E756D656C652B6A293B> -show -294 1621 moveto -<2020202020202020202020206F6B203D206D79534D45534844534D657368> -show -1050 1621 moveto -<2D> -show -1075 1621 moveto -<3E416464566F6C756D6557697468494428> -show -294 1665 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E73757029292C> -show -294 1709 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E737570292B31292C> -show -294 1753 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E737570292B32292C> -show -294 1797 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C652D6E737570292B33292C> -show -294 1841 moveto -<2020202020202020202020202020202020202020202020202020202020202020> -show -1100 1841 moveto -<656C656D5F6964293B> -show -294 1885 moveto -<202020202020202020207D> -show -294 1929 moveto -<20202020202020207D> -show -294 1973 moveto -<2020202020202020656C7365207B> -show -294 2016 moveto -<20202020202020202020666F7220286A3D303B6A> -show -798 2016 moveto -<3C6E6D61696C6C65735B695D3B6A2B2B29207B> -show -294 2060 moveto -<202020202020202020202020636D70743B> -show -294 2104 moveto -<2020202020202020202020206F6B203D206D79534D45534844534D657368> -show -1050 2104 moveto -<2D> -show -1075 2104 moveto -<3E416464566F6C756D6557697468494428> -show -294 2148 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C6529292C> -show -294 2192 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C65292B31292C> -show -294 2236 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C65292B32292C> -show -294 2280 moveto -<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65 -637469766974652B6A2A287461696C6C65292B33292C> -show -294 2324 moveto -<2020202020202020202020202020202020202020202020202020202020202020636D7074293B> -show -294 2368 moveto -<20202020202020207D> -show -294 2412 moveto -<2020202020202020627265616B3B> -show -294 2456 moveto -<2020202020207D> -show -295 2573 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D6F64696669636174696F6E> -show -656 2573 moveto -<6475> -show -733 2573 moveto -<66696368696572> -show -889 2573 moveto -1 0 0 setrgbcolor -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F535243> -show -1161 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1174 2573 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<737263> -show -1235 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1248 2573 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<534D4553485F53574947> -show -1550 2573 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<2F> -show -1563 2573 moveto -/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont -<4D616B6566696C652E696E2C> -show -1826 2573 moveto -0 0 0 setrgbcolor -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<706F7572> -show -1943 2573 moveto -<6578706F72746572> -show -370 2633 moveto -<6C6573> -show -465 2633 moveto -<73637269707473> -show -635 2633 moveto -<707974686F6E> -show -813 2633 moveto -<6465> -show -900 2633 moveto -<7465737465> -show -1031 2633 moveto -<6475> -show -1119 2633 moveto -<6D61696C6C657572> -show -1326 2633 moveto -<74E974726168E9647269717565> -show -1589 2633 moveto -<20> -show -1601 2633 moveto -<3A> -show -1654 2633 moveto -<534D4553485F626F785F74657472612E70792C> -show -370 2689 moveto -<534D4553485F626F78325F74657472612E70792C20534D4553485F626F78335F74657472612E70 -792C20534D4553485F6D656368616E69635F74657472612E70792C> -show -370 2745 moveto -<534D4553485F6669786174696F6E5F74657472612E7079> -show -912 2745 moveto -<6574> -show -966 2745 moveto -<534D4553485F506172746974696F6E315F74657472612E70792E> -show -1581 2745 moveto -<534D4553485F6669786174696F6E5F686578612E7079> -show -370 2801 moveto -<657374> -show -468 2801 moveto -<756E> -show -560 2801 moveto -<6175747265> -show -703 2801 moveto -<736372697074> -show -856 2801 moveto -<707974686F6E> -show -1038 2801 moveto -<6465> -show -1127 2801 moveto -<7465737465> -show -1261 2801 moveto -<6475> -show -1354 2801 moveto -<6D61696C6C657572> -show -1563 2801 moveto -<6865786168E9647269717565> -show -1875 2801 moveto -<74616E646973> -show -2037 2801 moveto -<717565> -show -370 2858 moveto -<534D4553485F666C696768745F736B696E2E7079> -show -859 2858 moveto -<657374> -show -933 2858 moveto -<756E> -show -1001 2858 moveto -<6175747265> -show -1120 2858 moveto -<736372697074> -show -1249 2858 moveto -<707974686F6E> -show -1406 2858 moveto -<6465> -show -1472 2858 moveto -<7465737465> -show -1582 2858 moveto -<6475> -show -1650 2858 moveto -<6D61696C6C657572> -show -1835 2858 moveto -<73757266616369717565> -show -2061 2858 moveto -<656E> -show -370 2914 moveto -<747269616E676C65> -show -621 2914 moveto -<7574696C6973616E74> -show -880 2914 moveto -<4D45464953544F5F3244> -show -1279 2914 moveto -<61766563> -show -1469 2914 moveto -<6C276879706F7468E87365> -show -1792 2914 moveto -<6465> -show -1938 2914 moveto -<6D61696C6C616765> -show -370 2970 moveto -<534D4553485F4C656E67746846726F6D45646765732E> -show -1028 2970 moveto -<4427617574726573> -show -1275 2970 moveto -<6669636869657273> -show -1508 2970 moveto -<6465> -show -1637 2970 moveto -<7465737465> -show -1811 2970 moveto -<736F6E74> -show -1977 2970 moveto -<7072E9767573> -show -370 3026 moveto -<534D4553485F506172746974696F6E5B322C332C342C355D2E7079> -show -1000 3026 moveto -<6D616973> -show -1110 3026 moveto -<636575782D6369> -show -1273 3026 moveto -<6EE9636573736974656E74> -show -1509 3026 moveto -<756E> -show -1576 3026 moveto -<616A757374656D656E74> -show -1809 3026 moveto -<646573> -show -1891 3026 moveto -<706172616DE874726573> -show -370 3082 moveto -<6465206D61696C6C6167652E> -show -280 221 1 967 rectfill -2125 221 1 967 rectfill -280 221 1846 1 rectfill -280 1187 1846 1 rectfill -280 1411 1 1056 rectfill -2125 1411 1 1056 rectfill -280 1411 1846 1 rectfill -280 2466 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Page: 6 6 -%%PageBoundingBox: 18 18 577 824 -%%BeginSetup -% -%%EndSetup -%%BeginPageSetup -% -gsave -[0.24 0 0 -0.24 18 824] concat -gsave -%%EndPageSetup -%%BeginResource: font NimbusMonL-Regu -%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05 -%%CreationDate: Wed Dec 22 1999 -% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development -% (URW)++,Copyright 1999 by (URW)++ Design & Development -% See the file PUBLIC (Aladdin Free Public License) for license conditions. -% As a special exception, permission is granted to include this font -% program in a Postscript or PDF file that consists of a document that -% contains text to be displayed or printed using this font, regardless -% of the conditions or license applying to the document itself. -12 dict begin -/FontInfo 10 dict dup begin -/version (1.05) readonly def -/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def -/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def -/FullName (Nimbus Mono L Regular) readonly def -/FamilyName (Nimbus Mono L) readonly def -/Weight (Regular) readonly def -/ItalicAngle 0.0 def -/isFixedPitch false def -/UnderlinePosition -100 def -/UnderlineThickness 50 def -end readonly def -/FontName /NimbusMonL-Regu def -/PaintType 0 def -/WMode 0 def -/FontBBox {-12 -237 650 811} readonly def -/FontType 1 def -/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def -/Encoding StandardEncoding def -/UniqueID 5020945 def -currentdict end -currentfile eexec -E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89 -699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641 -2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2 -5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF -9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4 -5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E -6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0 -87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B -A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98 -643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096 -C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99 -F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2 -FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E -61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55 -4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C -CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62 -2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA -A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC -0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4 -4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701 -FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200 -61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745 -3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8 -1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565 -72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B -B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A -36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC -40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A -4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65 -46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137 -D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB -B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F -8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2 -4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C -F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C -BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB -C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53 -966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9 -998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279 -CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E -C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2 -D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272 -1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF -1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220 -A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086 -583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4 -7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01 -9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91 -77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076 -7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362 -45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810 -C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277 -EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879 -077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935 -E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B -1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123 -27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4 -F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213 -FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B -6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5 -2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652 -FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272 -A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8 -23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70 -56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4 -5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF -13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F -FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C -3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73 -2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414 -C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F -1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5 -88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199 -8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE -FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA -D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC -2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C -9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F -D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A -EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286 -F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5 -67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7 -A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668 -9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D -183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3 -BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398 -4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3 -556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22 -1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63 -F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920 -2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C -FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F -ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988 -2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC -ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481 -2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652 -298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0 -BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461 -47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE -48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C -BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27 -5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9 -55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184 -2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091 -4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D -8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D -69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A -AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE -61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B -834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047 -E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D -E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F -46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3 -A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760 -F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E -185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14 -7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883 -6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8 -B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C -D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757 -606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F -AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E -064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C -FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE -874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD -060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C -AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D -D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0 -A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE -528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A -302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377 -934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288 -57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627 -71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277 -D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22 -B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5 -48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1 -21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7 -B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190 -CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED -DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870 -718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1 -5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F -E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC -41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1 -5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211 -7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1 -D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02 -D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8 -4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC -1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165 -374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8 -E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF -4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671 -AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E -4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7 -858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB -EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6 -BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F -45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E -050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED -199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926 -7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE -B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC -91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1 -905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067 -E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2 -81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926 -B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369 -9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B -470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864 -627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8 -2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E -BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664 -9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669 -8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329 -1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4 -4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E -06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42 -65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8 -C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52 -52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE -64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3 -C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371 -17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0 -C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE -2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF -1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6 -03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6 -88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1 -37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42 -F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548 -6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967 -59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238 -EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E -2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0 -24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C -F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE -400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421 -1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418 -9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59 -DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB -7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543 -F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F -E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B -727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE -58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82 -840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90 -EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15 -CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A -622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84 -D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C -91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5 -7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C -5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83 -FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E -DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59 -54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A -E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD -F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074 -A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A -623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA -891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091 -7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384 -FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B -92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F -01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09 -B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8 -4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05 -F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB -45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561 -31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5 -FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE -537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E -7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218 -9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52 -E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D -CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB -9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15 -3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F -B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA -A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0 -6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159 -97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42 -4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1 -39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40 -BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A -C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79 -1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403 -2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4 -8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38 -9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926 -351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0 -3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB -7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295 -5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898 -3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF -F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335 -B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316 -7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5 -801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6 -AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704 -9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91 -B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1 -8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352 -014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C -46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C -CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90 -6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666 -55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1 -1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4 -141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828 -F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383 -F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44 -F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A -E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6 -53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B -31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE -C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D -B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74 -723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4 -04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252 -FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F -2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405 -03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A -065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04 -6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7 -C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E -AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB -E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15 -98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C -35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE -A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32 -E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2 -5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0 -B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597 -79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142 -67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91 -8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179 -5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70 -FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1 -9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876 -ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3 -56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB -384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2 -6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0 -0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664 -12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7 -40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5 -148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C -AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16 -DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8 -2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A -457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E -5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A -955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF -F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759 -4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A -0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C -44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86 -289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451 -247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7 -CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C -2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05 -1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86 -F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468 -BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4 -51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF -28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F -AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32 -2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56 -2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981 -070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D -9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E -3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC -FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7 -1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F -C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6 -EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D -DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8 -0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8 -B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C -5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887 -7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429 -9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533 -F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB -AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158 -6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB -78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE -F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D -92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3 -9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35 -E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0 -68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE -FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA -304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE -2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21 -3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575 -02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A -7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B -94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A -1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0 -81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D -83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6 -01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D -C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8 -26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57 -860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298 -C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079 -18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30 -2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42 -CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976 -E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF -2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70 -2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E -67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E -E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0 -8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA -774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A -53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576 -1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7 -5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658 -389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F -5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6 -B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE -7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1 -703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4 -5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB -250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF -6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2 -782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031 -FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839 -6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62 -39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60 -3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775 -36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567 -0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6 -5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4 -1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83 -AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D -EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF -E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7 -03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF -4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB -D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B -E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4 -71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08 -1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18 -1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3 -84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561 -6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2 -0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43 -2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698 -9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD -02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9 -F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9 -5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC -7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12 -F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14 -9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C -C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB -85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823 -048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED -22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB -41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3 -27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51 -DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB -388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26 -4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16 -7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259 -343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95 -C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08 -BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8 -5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F -5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2 -25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8 -AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735 -9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5 -66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1 -29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287 -39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D -F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A -279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D -A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848 -09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F -2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363 -AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738 -F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9 -1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6 -FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF -5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6 -961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A -BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA -40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43 -08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B -472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9 -3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C -87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4 -0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D -5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2 -FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA -2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662 -2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846 -15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8 -A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C -250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C -8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7 -C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE -F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C -9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57 -B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0 -56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF -A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0 -BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36 -CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212 -175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1 -7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A -FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554 -E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259 -6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60 -AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303 -4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7 -08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B -F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6 -958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF -EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0 -15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688 -CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F -B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0 -2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4 -8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2 -1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04 -7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0 -D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883 -9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E -84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24 -C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E -8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC -3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5 -AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC -806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194 -64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C -ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D -1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E -565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD -540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD -093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B -FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68 -2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D -BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0 -EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C -C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A -2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277 -C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70 -F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0 -89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B -169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609 -ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D -20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352 -B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D -E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE -6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC -31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398 -33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B -7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C -B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895 -4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC -1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5 -89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C -212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA -34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138 -D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27 -38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00 -DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364 -8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980 -212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2 -3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148 -F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09 -1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0 -12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650 -9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4 -B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198 -5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5 -564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321 -5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D -867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55 -53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005 -3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B -451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C -B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15 -CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664 -C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634 -E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF -64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795 -8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7 -AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690 -BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33 -A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939 -990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D -B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8 -4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884 -84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C -F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5 -D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05 -37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918 -D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34 -EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1 -FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A -DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3 -62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153 -54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB -AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62 -0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39 -4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6 -2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C -2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC -F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3 -BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40 -D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978 -C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF -46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36 -50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED -49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D -20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F -BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A -977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86 -EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF -56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6 -CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF -3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76 -B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8 -062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3 -D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE -3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017 -940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD -6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F -E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04 -F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53 -DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F -5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D -7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6 -695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9 -C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856 -8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843 -39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73 -3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD -2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372 -6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130 -5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C -5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF -B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298 -06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346 -1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135 -6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59 -4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5 -0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8 -B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6 -E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A -1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24 -354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504 -9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632 -BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387 -F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410 -9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250 -54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D -092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29 -741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658 -57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035 -C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073 -7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846 -3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196 -82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364 -C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4 -615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593 -B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8 -A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7 -9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6 -FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1 -EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F -818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C -715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371 -8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2 -1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13 -707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2 -4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D -54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765 -2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946 -15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8 -63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B -81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34 -CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83 -E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB -2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243 -E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2 -B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08 -AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87 -3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A -04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81 -151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98 -E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8 -26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453 -3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8 -772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF -27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E -DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9 -898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2 -AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F -C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237 -CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D -59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214 -4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7 -3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781 -FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29 -90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC -167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0 -573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F -C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E -96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283 -2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6 -7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC -B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E -E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19 -51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F -025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416 -2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF -C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F -E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87 -EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F -DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7 -E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25 -E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF -C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D -84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C -61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9 -33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2 -C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054 -1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D -CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C -984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873 -8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538 -596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3 -A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087 -015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC -0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF -27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500 -0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03 -46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5 -1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4 -33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A -77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0 -75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9 -749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD -77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF -2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2 -1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746 -703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D -A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099 -907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB -9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679 -782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4 -B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A -A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8 -4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66 -1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE -2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B -50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611 -CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC -39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748 -FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE -9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66 -E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863 -533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D -CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4 -8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA -AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27 -0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007 -8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619 -1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E -98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72 -F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E -5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072 -A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA -3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA -5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40 -04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB -84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C -C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB -76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0 -27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9 -01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE -7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9 -6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A -3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F -C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A -9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C -53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387 -D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6 -92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118 -1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604 -7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846 -009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE -B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F -F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4 -789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7 -50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF -76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20 -AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1 -897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02 -9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947 -5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F -86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39 -A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731 -F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F -FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52 -DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD -77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10 -1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F -518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2 -47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270 -7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A -CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A -B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656 -DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831 -B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C -33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9 -1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30 -904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE -17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A -79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF -00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E -BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF -B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878 -0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B -E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F -1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E -0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695 -0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049 -5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15 -3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7 -81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB -1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75 -963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9 -4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6 -86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476 -7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253 -2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882 -6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B -37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464 -84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098 -B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705 -402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36 -C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332 -B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889 -88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065 -49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B -B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6 -ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629 -5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB -6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78 -D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F -E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3 -D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB -CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4 -5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254 -D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D -605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8 -3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66 -5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A -807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449 -FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A -4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025 -B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A -CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0 -205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5 -38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3 -F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE -263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24 -E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF -207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA -D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC -3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2 -66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D -B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E -6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982 -EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF -9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC -D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810 -860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980 -B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963 -A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D -9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7 -FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8 -584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4 -6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005 -EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3 -5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9 -4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656 -D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E -933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9 -7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458 -CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF -F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A -DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035 -611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16 -DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4 -40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F -AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE -8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B -C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0 -AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5 -1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8 -C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18 -749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13 -B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C -CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14 -83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B -35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E -A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F -A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62 -4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A -B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0 -58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D -F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A -69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5 -7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3 -748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E -5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155 -81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78 -236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A -9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF -CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7 -ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA -26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB -17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8 -ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525 -60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6 -6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005 -9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6 -4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC -B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0 -7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA -00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501 -5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB -625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8 -38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE -2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2 -3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588 -79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7 -799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A -80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37 -411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139 -BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10 -D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664 -D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2 -42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124 -70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214 -B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96 -00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428 -E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B -A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78 -44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D -ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753 -3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A -3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530 -E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C -9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36 -238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402 -EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398 -7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D -324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247 -B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D -B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE -F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD -99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5 -A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51 -7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A -CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C -A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601 -2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4 -A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6 -B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC -7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349 -D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D -057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE -D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28 -6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6 -8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A -CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24 -41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F -01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49 -31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2 -3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624 -696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93 -36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB -D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD -0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882 -CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB -012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837 -006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687 -B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573 -9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942 -85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3 -024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3 -75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681 -CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155 -6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A -83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95 -4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9 -1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A -A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802 -E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F -26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7 -C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5 -9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA -98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460 -EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C -2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC -B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9 -2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60 -10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460 -DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642 -E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4 -7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217 -73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E -9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4 -EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C -0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0 -363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523 -6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72 -EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6 -E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896 -09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9 -1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016 -0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B -195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219 -AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773 -D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6 -05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4 -FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A -BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E -2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F -2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B -913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B -C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3 -BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F -9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA -112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776 -4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6 -D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1 -292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA -8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217 -6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA -F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0 -FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4 -A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35 -1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D -09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7 -39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A -6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B -E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8 -4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D -8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6 -C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C -31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E -0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC -9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410 -B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387 -BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8 -3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74 -1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD -F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52 -A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09 -B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F -FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E -81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7 -5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62 -1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2 -B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C -29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97 -8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24 -97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A -D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657 -3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899 -D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE -41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB -44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24 -B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A -69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6 -84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E -749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401 -9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6 -D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67 -86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5 -70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC -151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96 -3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE -4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741 -CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840 -347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E -D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B -BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF -FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E -C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E -D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF -C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE -1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8 -859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD -BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA -D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1 -1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987 -4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D -430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0 -A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC -089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64 -BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9 -143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18 -2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647 -12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945 -331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0 -07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3 -5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B -1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60 -24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0 -1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0 -FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9 -8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056 -5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9 -FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512 -E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3 -9F08ABD4F4B0889283E55500702185A841E328 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -cleartomark -%%EndResource -/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont -/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont -294 310 moveto -0 0 0 setrgbcolor -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<4558504F52545F505953435249505453202B3D20534D4553485F6669786174696F6E5F68657861 -2E70792C20534D4553485F666C696768745F736B696E2E7079> -show -294 398 moveto -<69666571202840574954484E455447454E402C79657329> -show -294 442 moveto -<20204558504F52545F505953435249505453202B3D20534D4553485F626F785F74657472612E70 -792C20534D4553485F626F78325F74657472612E70792C205C202020> -show -294 486 moveto -<20202020202020202020202020202020202020202020534D4553485F626F78335F74657472612E -70792C20534D4553485F6669786174696F6E5F74657472612E70792C205C> -show -294 530 moveto -<20202020202020202020202020202020202020202020534D4553485F506172746974696F6E315F -74657472612E7079> -show -294 574 moveto -<656E646966> -show -295 691 moveto -/Symbol findfont 50 -50 matrix scale makefont setfont - -show -370 691 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<46696E616C656D656E74> -show -595 691 moveto -<20> -show -607 691 moveto -<3A> -show -294 797 moveto -/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont -<2E2F6275696C645F636F6E666967757265> -show -294 841 moveto -<636420534D4553485F4255494C44> -show -294 885 moveto -<726D20636F6E6669672E2A> -show -294 929 moveto -<53414C4F4D45325F524F4F542F534D4553485F5352432F636F6E6669677572652096776974682D -6E657467656E3D6E657467656E5F696E7374616C6C6174696F6E5F70617468205C> -show -294 973 moveto -<967072656669783D736D6573685F696E7374616C6C5F70617468> -show -294 1016 moveto -<6D616B65> -show -220 1128 moveto -/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont -<6FF920736D6573685F696E7374616C6C5F7061746820657374206C61206469726563746F727920 -6427696E7374616C6C6174696F6E206475206D6F64756C6520534D4553482E> -show -280 277 1 308 rectfill -2125 277 1 308 rectfill -280 277 1846 1 rectfill -280 584 1846 1 rectfill -280 763 1 264 rectfill -2125 763 1 264 rectfill -280 763 1846 1 rectfill -280 1026 1846 1 rectfill -showpage -grestore grestore -%%PageTrailer - -%%Trailer -%%Pages: 7 -%%EOF diff --git a/doc/salome/AddNetgenInSalome2.sxw b/doc/salome/AddNetgenInSalome2.sxw deleted file mode 100644 index 15381905dbdc2d5bd91fb9f039013a733fea0b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13363 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 diff --git a/doc/salome/PluginMeshers.txt b/doc/salome/PluginMeshers.txt deleted file mode 100644 index 61bb0842b..000000000 --- a/doc/salome/PluginMeshers.txt +++ /dev/null @@ -1,188 +0,0 @@ -####################################################################################### -# File : PluginMeshers.txt -# Author : Julia DOROVSKIKH -# Module : SMESH -# $Header$ -####################################################################################### -# -# How to add your own mesher (as a set of hypotheses and algorithms) to the application -# -####################################################################################### - -1. Create mesher plugin package, e.g. MyMesher. - -2. Create XML file to describe all algorithms and hypotheses, provided by plugin package - (see SMESH_SRC/resources/SMESH_Meshers.xml for example). - - - - - - - - - - - Attributes of tag: - - - value of attribute is used to collect hypotheses/algoritms in groups; - you can also use this attribute for short description of your mesher plugin - - - value of attribute (MyResourceKey) is used to access resources - (messages and icons) from GUI (see paragraphs 4.2 and 5); - currently it should coincide with the name of plugin package; this limitation - will be eliminated in the further development. - - - value of attribute describes the name of your mesher's - server plugin library (See paragraph 3) - - - value of attribute describes the name of your mesher's - client plugin library (See paragraph 4) - - Attributes of tag: - - - value of attribute is an unique name of the hypothesis/algorithm - - * It is a value of _name field of your hypothesis class - (see paragraph 3, implementation of constructor of - StdMeshers_LocalLength class: _name = "LocalLength") - - * It is a key to each certain hypothesis class - (see paragraph 3, implementation of "GetHypothesisCreator()" method in StdMeshers_i.cxx) - - * It is a key to each certain hypothesis GUI - (see paragraph 4, implementation of "StdMeshersGUI_HypothesisCreator::CreateHypothesis()" - and "StdMeshersGUI_HypothesisCreator::EditHypothesis()" methods in StdMeshersGUI.cxx) - - * It is a key to each certain hypothesis icon in Object Browser - (see paragraph 4.2.1) - - - value of attribute is displayed in the GUI in the list - of available hypotheses/algorithms ("Create Hypothesis/Algorithm" dialog) - - - value of attribute is a name of icon file, which is displayed in GUI - in the list of available hypotheses/algorithms ("Create Hypothesis/Algorithm" dialog) - - Note: All attributes values are accessible in your GUI via HypothesisData class - (see paragraph 4.1) - - Note: The environment variable SMESH_MeshersList contains the list of plugins names, - separated by colon (":") symbol, e.g.: - - setenv SMESH_MeshersList StdMeshers:NETGENPlugin - - Please, pay attention that StdMeshers should also be included into this environment variable, - if you want to use standard hypotheses/algorithms, provided with SMESH module. - - The SALOME automatically locates XML files, searching them in the following directories: - - ${_ROOT_DIR}/share/salome/resources - ${SALOME_Resources} - ${HOME}/.salome/resources - ${KERNEL_ROOT_DIR}/share/salome/resources - - where is a name of each mesher plugin package - -3. Build server plugin library . - - 3.1. Define interface to your hypotheses and algorithms. - - Example: SMESH_SRC/idl/SMESH_BasicHypothesis.idl - NETGENPLUGIN_SRC/src/NETGENPlugin_Algorithm.idl - - 3.2. Implement functionality of your hypotheses and algorithms. - Inherit corresponding classes from SMESH. - - Example: SMESH_SRC/src/StdMeshers/StdMeshers_* - NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D - - 3.3. Implement interface to your hypotheses and algorithms. - Inherit corresponding classes from SMESH_I. - - Example: SMESH_SRC/src/StdMeshers_I/SMESH_*_i - NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D_i - - 3.4. Implement being exported method. - - GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypType) - - is a value of attribute in the XML-description file - - Example: SMESH_SRC/src/StdMeshers_I/StdMeshers_i.cxx - NETGENPLUGIN_SRC/src/NETGENPlugin_i.cxx - -4. Build client (GUI) plugin library . - This step is required only if your hypotheses/algorithms need specific GUI for their construction. - - 4.1. Implement the required GUI (e.g. construction dialog boxes). - - Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI_*Dlg - - Note: all data from XML-description files is accessible in your GUI via HypothesisData class - (mySMESHGUI->GetHypothesisData (aHypType), - see SMESHGUI_Hypotheses.h for HypothesisData definition) - - 4.2. Provide icons and messages for your GUI. - - 4.2.1. Implement resource files - MyResourceKey_icons.po and MyResourceKey_msg_en.po - - Example: SMESH_SRC/src/StdMeshersGUI/StdMeshers_*.po - NETGENPLUGIN_SRC/src/NETGENPlugin_icons.po - - Note: ICON_SMESH_TREE_HYPO_MyHypType1 is ID of icon for Object Browser - for hypothesis with type="MyHypType1". - - ICON_SMESH_TREE_ALGO_MyAlgType1 is ID of icon for Object Browser - for algorithm with type="MyAlgType1". - - See paragraph 2 for definition of MyResourceKey, MyHypType1, MyAlgType1. - - 4.2.2. Define environment variable SALOME_Resources to point to the - directory where resources are situated. - - Example: setenv SALOME_StdMeshersResources ${SMESH_ROOT_DIR}/share/salome/resources - - 4.3. Implement your Hypothesis Creator and being exported method - - SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator - (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI) - - is to pass a value of attribute in XML-description file; - is to pass a value of attribute in XML-description file. - - Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI.cxx - -5. If your hypotheses/algorithms do not need specific GUI, - but you want to provide icons for object browser, see 4.2 paragrath - -6. Setup your SALOME environment. - - 6.1. Add your plugin to the LD_LIBRARY_PATH, PYTHONPATH (and maybe PATH) environment variables, e.g.: - - setenv PATH /bin/salome:${PATH} - setenv LD_LIBRARY_PATH /lib/salome:${LD_LIBRARY_PATH} - setenv PYTHONPATH /lib/python2.2/site-packages/salome:${PYTHONPATH} - - 6.2. Set mesher plugin resources environment variable (see 4.2.2 paragraph) - -Note: If you use runSalome.py script from KERNEL package to launch SALOME, you may not to set - environment variables, because this script sets them itself. All what you should do is - to add section to your ${HOME}/.salome/salome.launch file for SMESH module section: - - ... - - ... - - - - ... - - ... \ No newline at end of file diff --git a/doc/salome/gui/Makefile.in b/doc/salome/gui/Makefile.in deleted file mode 100644 index 883a053da..000000000 --- a/doc/salome/gui/Makefile.in +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) 2003 CEA/DEN, EDF R&D -# -# -# -# File : Makefile.in -# Author : Vasily Rusyaev (Open Cascade NN) -# Module : doc -# $Header: - -top_srcdir=@top_srcdir@ -top_builddir=../../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -@COMMENCE@ - -docs: - cp -fr $(srcdir)/SMESH ./ - -find $(PWD) -name CVS -exec rm -rf {} \; - -clean: - rm -fr `ls | grep -v "Makefile"` - -distclean: clean - rm -fr SMESH - -install: - mkdir -p $(docdir)/gui - cp -rf SMESH $(docdir)/gui - -find $(PWD) -name CVS -exec rm -rf {} \; - -uninstall: - rm -rf $(docdir)/gui/SMESH diff --git a/doc/salome/gui/SMESH/i_blue.jpg b/doc/salome/gui/SMESH/i_blue.jpg deleted file mode 100755 index ed3acfac2eb212d536dbbfc2b4d47c959747109a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1337 zcmaKodo-CSk zj7%T`3dul2X$#ZEkV8G0ltU*gehncg)*}8p1R}!#K@GMrDHws1q(OBN+#sIJxo6n( z+Tur7x+dNaR1`B|GC~GFfD$j;xSwmXa&I3Wuz00I>AhjwxFIb&zn(SSKEKIz_U5hH z$Z8yPI%={7Pu$)ZVh%U(mWG|M_AHNH7VT6BnZFpx9E=en$p|1APcm z@qG9k8ejTuRDy$@gTLl!%EfX*57!`EA{i8FuwdQ7bAzGlO+2{O2S_&UyWRqzJlW_y z(LgXxaC~pwk$R^J(#W`8ENwQNuVeAZr+({bMA7W3 zMoHR6xTnO((?!{>B>ZwBtiNq@@b-o7S8p%L-JGpk;?JrR4kj8|OsC<@=$eg9dP z6*;$Q=>`9?L)+lS>yA~n9j|-um>8NG<(NG#R}Kz1ZD0IHMP5Mq5gGAb$;iCPxDso~ z>wTj!Xen&T(rU<+II%C%=Zkh+$StVT$q~m*SZ5o`&rfP*9dbx7H8M6$e@CGToG%MK zSD$VZZ3|JWvk!H(5lI$a2BA#e*e9RJZfT&IU&pJxSjU5-ArHi(gpp%4ygr1wYwusu z(y-sJv6_)ylu>Zlvf_eUM?`E#P3!boUw$jK*OxYtEEHtcaM6Sz-$T87b@FRJS2w-6 zG^KX1GwOripJ`*nGX1#X=+XQ(>-Le`=8-9us$DaI4KJnUOrkUD{8H35Fw3Sj7h5h! z>HVyE^NZrNr10uKjw+{d0(PEwuJ!vef zuvoWW#$hPkwQ?;;nvEB3Vpm-|p6$i;@5tD08b~YAA&{RxEVXPUZ-JG+QPUr|V_F$@I zXS;1p=(tK8FGE-@oN>#YkwF_a1tYA7egj zW^n6ief`ATK1SFn+ag+w|Mfht$g_4nx(AM=>_}YPPhzXae;aiDO3h>4b)9F{f3T?% zo#IdMPb9KtvZ9;I)c()C6Dqm=1DdZu@k`x^exwvg}d zoC|z$oF{fzlv{Tlz2o%x$(;6>oL)xZGz)qR2<7%s?>*6}l!k_=7}1b~)FhaZe!Mi* ntsV1Q$ocz}1}2fD+RUKR+?970I}4cV<-EX|YKN=(__MzOO5YZJ diff --git a/doc/salome/gui/SMESH/image22.gif b/doc/salome/gui/SMESH/image22.gif deleted file mode 100755 index 18b53bf4df7bf7efa602abe4871046d88dbdb334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1287 zcmX9-3rw3u96w`O*d#j8R8X2gryIpbG-srs!37hbECi;a3`W>6JvSm|6BHT4HO?@> zEU*+AH(uran6Obc_KFG;*`NpNR6wLb!O*qh7#bDA=K1^1OPYKBf3N@71WUX*YVSOW zC;t#_*woLaCL4A(+aSj5VEfoDolfWP?;j8l5EvM!*Xu(=LybnG$z)1POG{2pj*E+n zj*gaxZ89}=lGw$PT%H{9cqV(gDk&k15Kf2yI3<)4MhT}xP$JbGWrQ)p84-*~^^|hL zIN_WKPNb@&f-ph2AVLs{wIo~;AvHumGJ*;`p;8f0N*Se`QbDOyeAqKaIirG6spxUd zIOUuQPNhqfEp-*S1l1x!36Mt0cmQ90xme0DlC`* zG4?`msj`DNaN}A?E>)Ds9!VowWQo`i5>i17@C~mp2R9InGRTBF#jij$RKRFGz;oQ= z07I&lATl@vEA|rcsb->kXbYNv)DbgsMV4qD(n3Or1T}DvUcw?gY4w^+t+kK?eh>l? zkSN7-Tw;e}0Q^5;#;T2kXJ=;@78aJ4mR46+yId}((>XOY<#xLl78ZOy-^$9$>guXo zzvXbW+H5xM!;wU)2{Tq0kK>SN{{`ZYlZ~N?XB|UF{qK+5eeG=1@UhKXlIjxsn!oxu znC8x2>ub4M5%ywvsKwbjYL9rid-tfb&2{pr*T?EC{q5tm=6v7mXn)7ojoXiIG9;br z{I(_09+@?EuIsyw)Rv_Br1RZBoKEl0bsySnn>w>+xZJQ~;L{)b*(IOOQPq=C_tuG# zlFav*jrbJm&iTkNKXANgtSLdo*Y zyhCdTX2w2QINlReSa7NJi>(t+#9V%3@aHofOB-Tii~hcTU)Qj;_x*$U-p-C~x{6cl z>+U~Z7`U)&HhRSM4d2#Ka&s*zAS)XXlFVSj}Mx_g??L z@g045r{SYUgSq+0Qn)9p{PfO(^kdXAonsC8tS02Rv8iw_%e;6oyzKB_!9hh4dcT%R zKmEpEQxlA)u*&2wA8508k0*v#ywd(m+m1{&ntJlXqOzcx$4;0Q52QC(f->G5@GjQg z({1w96-@5;)W5gb@Y9j!{sSySgmeG^ diff --git a/doc/salome/gui/SMESH/image22.jpg b/doc/salome/gui/SMESH/image22.jpg deleted file mode 100755 index b6a5e8db654848954022923ee9f8e0c08e4a6626..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34642 zcmeFZWmH^Wm+o5x2oQlla7}P`Cr|+b1PD}chXi+bs{{fBw*bN2ElA-KAUMIbaCdjB zIy?XO?e4ej-tInkjB`HRVgQ4&tM-2OT5GR0=Wjj>#^h{1#RvLr?d{KZ1K_Dao zMD4?3pMN|0 z4+o!t9-yG2K0rf72krtmjSp}PgocZb_mWHe;d7;r7}O5<+@GT}F=-?!+6a_Kj%axd z9sRH#5fTxTkkZjJFfuXo^6?7@3JFWTk&>2qD=Vj>s-~`?sikdXY+`C=Zei)<(1X7^^MJ~?VaP3)3fu7%d6`fTtM;zG&EE+j6af59=HMDsJLk8FS#D#i7R1z zba+n9{TUNqB09684U2|H`G~;KapVypE$=ej@gLQHiT0;tDDLB&Nu!a+|^QGh>CaY10vP79OoMC(zhw_D+r3gX$}KGhEogKaQeU;X}= zHr=hy+Q?Tp?HfuTw8IGrnh-;R`nr)I^9)o3SvsQd5}^*hl>$*6%^^YOkk*q5BnZw3 zLV^M}k)R?UBq%NtG4dMYP5^wba(Gt)y$At;m+O(Bopk8B5fW7W9t8<{I)ntN-XcLP zRQFk*aIS2jH~EX#nn=(-J}CR*UrsZoz|sg3*#8X+L4w*_w;Yh5myw7uZT0-UA~}j= z1N+#9=l`I{nDhTD4gUvj`~R{_xBn?*M}X=KB%}8Yb(2UOfdPL6m=n+5h1;Y23raUb0k% zlXbXbP#y38QB``(JHb4bPZ4W%V5qpW0`0K8lSG0t1OkzuBT^_rRP)LIjW_cDYx)ny z7xvWB(7yO8$JcbcYUtyg2Gd~lxXaWHSu3>S7c-CR+AK6(lxFkHQFs0f?NcP^A{z;c z*E8lqL}O36PeP8`f(x>M}JAMUkd>EN{? z|0-80*rqIk``(=U&!hIQPYKGvQM*q7uQj@xAr@NC;j6#cq1 zsT>+wB@mWP_nXLBt?=Jo=8tAkjSJmB&Agm`>j^ZomO1L#pEmxl--!F-Wl{RyZ)EKs zu7J^oR;xn$?9EBvrlkyNys6kH>}r&0EpN7omhPvBQdVu7lAHpxV0ttc71ES!qZA?C zHD3znA90qAbapC%EyCdhu7_K8+c$*4*~_KQXZ7Ep{Z>nKcTwT#-x(H~Ewx+(twbT% zEmrEDlJf?^zFvt3DX>Sx`O={)!S6DwpO`QkUzFWs*}oaWnDS$6M^wVY9Vai$5g$ zSoc}rT^$7`g6s3}8LFR98M!((fd=o3$F{=C3!PTq8lZN=Q(z>#@Ln0}`~&s*19%`VSxbbCPT5q`+h&SL-3qIlais zxUTpAa#q5#edb$@^qwEp@f(UOd<^F23>lQ0Ar}05U*I8)!~4#Q0gwxVmhp4Jue#SY z>KMP1$e}(hJB6zo%1h7vP*xfXKUgZp<2-4i5eb_x;G z|C%ZTXm1Q4Y}uDVg6L*{Ene&*K{*xgG2;HEz5Y7OpLJ3j2|6U*>xMR~AwkdYdL!Ed zHAuw&)@2Weg1o89+>4e!j9R~I3|3-|sE}%;avN~Oe?DzSd&HcLCBLjetr8~2V3b#R z<&!@xaHmjCd1CUa&GL!4Xy}hYr)iGW?H%QQGd9yb_w!S889B>MaqAI_qiRx@YW`<+ z@P6Amc2SbZfyH1^NMX5pJYgJ1fTep}1+3VD$znQY^umgP?Xi6ab{Kb=DCU-wGjC!) ziQt|kd<&;c+Lm{#vkv1a`5}yFD`Jid2{JmQY%69^iIpYoN~qR|NS`{-TUQT#_rtKV zx^|4IP4yvT+f8)cJ!h+SaqsnWa~U6K`ECXN4eZwsSd%6H1$X|A1VAht}h z#Ij@%uwuh~kI&V_-AR7*mWx)oZ2cob?2Drau8R6M=I(g&BEEcS-Ci1fu>(Epm?@EUaoC|5q4{OgJYYZ9MM}#)H7))+XeB>G_D`lhF+(yV?=`!T} zMg?^8bLeb2BBt{-rP{xFtZ)+UjeM-C$PlMsWur&s(j#8Bd@c_$=qQh2q%^{+tl)PTl6tUX*%XAbHpJKCPMHckzvALhPZS#wO2QTh0 zR1Q4K)l*5G<1$LzVOA3*hXM{S(&R1FHFa~oIug5>u=xC*4bA80pw(!*QesT8(2*^~^_efPsF{@&BoOh-Ss3WtOhE^Lf zMoXRKb*6**F|71}NyDH}c~_;eS)6=~ib+wO7KKJ-ulN&~ITyc%UL|%Us)IF3Z0mdR zhX@h>HZ(Vk(O@ZAZFzACW&e%PD(>^ez*acnVSyGVZ*h2TK+YnyZu*U>5Oen!is;lQ zZ*s*)gJ&*!k$LT=0&;w3K0tzC;IMH?IHom3*Zd3eWTa*)yz5cA1WUhYmhit>&CU&G zoDlN0fzW;6*^@QNz#0CpE#8bMC-+FuPpZ*IuJq1U7ot-K1q5yP$3Jr&YIgX#O9Zc( ztDu@v3}p0^@GdyuX1UrA2~xqea8-#R$o(*y;$pz&sMcVA>lEb_VU-t8SgK*39Z|y_ zPT&EqTNrB+$h08l(n`MWzN={lmHE6eTBnj`(}%Iv;7;0Z1{?4fvN5svnxX^fX;)CONmgl~wf7CaJCC%3^tU4b*#7|T1)pdZhdmo z3HdGe!0XMUK}Khg1~A2AH}yi6 zGmcmZ>c%w<(gGM?4`{-w(#=p0al8p{&I+s&RJFZtM0;)T1aIV-CfGAS6PuvXzB>^8 zB#1H2r7X(RNvD#$EE&fR2}k5m!TD=aG_^i;Aav$dWNto(7hmIvTAb7#b9=;GDJicU ztnAncdo0L;n+9Yl<1A=Pf*oz<6XE57Y)u;Mg#1COzIg6Nb9CUd5gCU2W}LTz88E<-BXfZXF^M**z`<%O(TG@ zu90V(hOt+lwLj+{RyA~xXZaqGtJ2MOfG^I0NxX6xW9zR6`@c55-*()O+!a@m+({vb zfi;!!`yO{)-y=|3SNoxIy}S;Yg{>L15uZ^ja)~L|=UK9>UTSVodvfcKyv!oYXOfuU z<{Fro^Rd$>a-Z=*86ohyFbxw{0UXx)9>CZ8({bR_QWuFXybYho391aZ zzFlBD!JKv;`wAASk&Uo;CJ8HrG`i_af%hG(PPS`y&B2?6FE_+)d#<5NFMUqcdZD4p zLizR;;m30X=F3tCqMfv?ZUfwl9z%m+yB)z5&fuler50Z%TJm3#El? zUDofRi7K}SdyDL;w(&*?Pn>iiWuB;)QXTTWiw>w z-;@aId|Q*CKB_=#b)x$VBk@tB%5b?N+2`r7sq~O`m7@9@vwZ(`n3rYD`3FDqmzrzr0GS z;eDRHM{VUQl@_tRk6(JJr*q{_%%p91v<`pnQ>Nn9dJ2N1S&O$S@>PC6as5Uf7>m`r z(zQNWg*R(!3ai584hN1|R(B^y8rgf&CU30x4Zm=M@ucrc{D&iupfQ+pU7kaiB7Jy` z-wnJP{?5zwuhE*LIrsp?DLd0V>N&NpaAqVb!=^Qh!?u6hYP0DM zqXmtc>~DQ^1D1D{NRST8q8!+dDh3E;9?&psfiA>g9-`IM!x1;(37U0W-)$yE1RM+{k*h1=TVpb$p^)xh)T0om8rp)NazoeJ{J9(u$v;iDdHehy4bOivvoGhb? z+T}>}s-dmv;EBHKQqy`=?GmVBDWhGvSvXv++jZ)G~6}}e;wYWDxoopc{2VR z#z{jWmURo0){v!dekzEzwaxqJ^p0HP&E7mDD6t`bu)KCnEsl4eTRM0->0%k1Sni2Z z;aT?rI4RvS_csSM6)W%j{o>S;xI?kt+?x*zFKb0V1W3F*qs7jjTRWai^3#slq%R%z zo7}My^6nweHo_PQvX`;o!TxghAhaK6pL4jpJ;$2UVydNsju4az27)juzNc1niW3Sg?g4r-)W`j7#HVx^$k)WYx z9?`EiMWsd3T1CFL3oF!Fw$khz)oo46LS(LQD1F7z{5WMSmqlOv3z_+!5d{#oJtJyS z)s~|Oapoq2J_*py>G`V(}MqEFtCtb?RFSlEd;y_c^OU}F& z5p-x6Qc1y1TUg`;k57Z_4U#gMRY_0hRu>tt?oXWbbW1aeF)nhAfd@4zZN z9*PtHqQxn|d}{661^Vl2NZsnROQBm}^JDeoT4njgr@ymxVJ)y%uH1Q80h;nJ(TqPZ zb#F*9j;m+{X2&sLSZs;kXWN){1|$(uoh+=siSP~aRr*`d+sKe8vuxm@tsrq?_1TGT zd`LJ9i=_91D9^T9FPY=4xKn>}(#?0_TE7p+Pd=X&tX7Zfe6|h#nlCne8-8W;%4g2_ zs;&fsqgDPu%pW81RGXmo5MlPXc$=t!Fq=QMplwa>^=s!jGIC=_EDV2mQ($Sf=-QZu zl(6LALE?Y%g#5olPukj=v;z}AI0=2+AOVf?fbXaG7)EACRVugm8aKHE{Dgy@T11ys znG`7EpK{KxzdNLu<+_Zvs}<~9d8Y7HjGGrPAObfMax6$Sep?wNeEq@JZ<>S_ zV>seLy6KA>(_Gb!5$ar-Xnlx8{zVFZip7OPm&{#l3Kp%{Dwr98N;6p;*BTrto5srXl;4H;RrR$=Tc5wKeX)(_+KyZ?FuKD1Eveg3 z`jq;*d9wUE-tLtEWqh#cLH2WT222~G-_|#jA^GEkLp1&XcZAcb7BX5fVozV7T!DOc>UFLXUu}CccQWP2Z%D^`=xY(LRaMX;_$=tMcx;-rvdw5L z_i7S2Ax@0MvY8Sm1r%QqFGO!VFAA(;RV|2yvNh7+VoPr(#+I_bv>E(sH?UfO?}Zf zPwtC|PskSD3rAiA(WD$~>#MV%VtEaZq)k5NN)hc#D(|F(u0WnHUg;?F6Rq&u6m9e3 zv@oH7)-~;?w;YE3ghP(jNyOoD12=CKd2~nIq}60U{w;{dC_?n7pXfF5AVGEpH}Y&C zVBG&dvLaGaqM&mK-ePHBwCSZAoxHX3L(q<_AnI{mtmjMqm_}h6@ba9JjgOHM=$wC2 z)Afb~r%x=~$CJ16rfO1~rmr+0gq7Zo>+dH)+>(rat*sT8#A4@@D~TN>ygH+IB2MKp zuNruz?P!}~-wfcl*T0GvMDs$#mC}foVT zQ3IlnV>BbJSK;Z@y9LeJ+AdgA-5oNxWSOocdGU;BvfB9n;Y(V@)s3~q};GKA3_}hX@*-DXr@!VRMzxdh^oB+5jsc^ zJ-BM<(VWinbhbKXuQtM0>lQZnx?UC#wFCB zOxzl;Z$6Ne#k=fy>sQS0tJtt(AYpPVNR_c-d)99wX)Q6i|FpAUE3rf7;ER8x!|*U5 zf{u;#g1tPD{h(w~slqrJBK>Fzui@7-AjkHnY!=27-SH`c#2r}d8Bg)L-i9Fb6HG4G zy{<8iI=_Ya$dW}aVN8wO4)rAeNm(Y@wfX&?#z%2>NZIlSQigff-eIO8s>cZrm4qXJ zu`KewvTCw4epcmcUjY|>|7TXQzWJ&9*lvc*jrt1Wx9S=*mm-{XJKx=GR;O3IC71Mc zUjHDih}n?vbLr=yTaw$Rc;^6Jt~FZwQ$4ig14t*CQrPW9=FktN)tbO^yBQskxWHd5dNi*5d%dy z8%xKid!SI>*aTaj2$Ad@E%c3}2YBy%J8WXblG&D7FM4DzRlz9#{NDWa$1zqctu&pP zgd&;Sy0%NBQ-L}ZpKv1}pXIKmX~}Wgx#WH`ELk%;U&lG?SG0KO28iMP(>H%o%CBr3 z^p%c=A7OzM#3s6)xC_Z4#$Adcq!+&Av3fucc(N62at*F4Me0g-A3_^r=EcrUcN{Hf z%tu}L0PGJrnak67S3%1agD~0SA%6|Tb&Ihd9e2KUs5FbEKsGP(7S5|Xv6_EARxd-Umf*pMC6j0LmFgZV=>EvE zc@scFdOepko7YeS2ZF9*7YE$Wn&LJ9b9hOna!fH)-z%cp4-?dXwkTb zMptI7)n{j&B4CUMqkAnoEt!l6gi+`T6_2mg*?GCgHSU4T&7lD}lgM-sv9;fc`p(H%m& z0xiM7iH93HweTf3mhMAPTdz_V_Un>)HKM*tK2_ZWUe|w;up(O^C(?Uc7qld1N_lON zUkZSQNJlYf!ujR1dCLR=rEAs|L6n|AI!yl~3P^qLWs%aKt{BTyR`olWC@KFy#2?{k zXefsn zaxd(-)9EnQEm0S}p`!LxixqyA}Lw##rQbhbJI z37E@M&Mp@)eY?b0e?OcB=?UZ^*?M{24XA~DiU)fXLuLZ@mkbXJyBq5H#UYG-Qgc}kL0 ztJtE-%2sLf%(m0u49=}l1yC#VrHPT@OL3jnP+pW)a9R%C7mBj9LHBDoRAJ2w#r_na zTR~3wx>K&0#9R2=Rv(z~3)ph3yyYsHxrYNd%AJ$~_`GvuJ9~6#ykZ#Yl8vzsU zwh0051pxm%9=Y!fCl=U*K4Dl#kPLbdtMzWrEqRTq;U_c}tV_RlP5T128r!?7h6!MU z*J0DdchAUuO^0r! z=pF{tg>ROHEFDUHVHx|Pm}0X=W}T_&Nvk zi%rLaQ;yfsVKRX~#kVkCiv|(sM$1hyq-iwwuKH1!N=3}05gpi56XW(lXAs*LTRwFU zZI@d*Y4fw@Vs<;Kwu$h>OZq9(S!HmrMAnBKV4hT$A@>%{A#z9KjyX$!2;W6Bi_W;1 zM(B`L1~~%jQf4&?D8F?6CIDjKuRE6;Yr4(j<&1juu01UGqd0c9ak|m463DA^ulNs@ zk$Opj)-<>VJ#FgKJ~Q7hB!SXtB@}g7wYI06EksF;BD+4J__xV&?|SWIxe=@`AVjpp zJ^n*S0dxK%nOhTRnh^8qR)?8WLxh%o-fo;nN+}ZbOG7s=GGEFTyxBZSA9ar(?l1P8 z)^jROgG$|#4R?Q}pHXE}J`t$=MfdHHrd||-;T(qyjmgA|ya5rSLi@T;Yl}sBW7MTA z|CUw$x4T_&NA&uc1c$N6Xo6U?|?kR&^2L@sl24CIr4 zx^=`9Y9knvf2>}7sno4QA{}y>K4-U$ARn$y;pI25`3^WUhKX@p`%G_^9jo;BJFWMit|JAnvo=RUnloA;Aq{{wYu-&UihZ|t-m&eHJ zdb8JiH*#0cC;y!-^P6p0u}8$htPHb*e;{01 z+H+jGD4{(RfDYlaH;7thpN7GqP%^&g?z`GXl%b_`x6`NRMeBC1GQ37WPiNB2T{_8~ z_MJSNvwek)0dl2mZ`h&DRGe>Be;#XLa5FyQw`5rsKlSxQago&xH*cF~niIiw6EV}p z5?!YEer$8}&1D*?4{aAbb-xL>N8m+3)6~Zls&77Hi2k@&qv48n0Z@Y}!(5rz73kFY zLZ{vSV;x0S>!=^V0z4&03vgK!FymeDz!#g5y6-Fty%`IYoDl+czl!g(tt>jj!#t3nw5iu}-G~PO33+~~_6Nr} z134%Xq|OZSaB|^HTUpV{rJ$5yT}&*Nr8Aa{wcSrxawwDgp%_Cpxy%qOK!gPO$S_RV zZ{F|epAyRbQIBIs0M5dej0n;OtC&l(3QSqh3_iQ;$ zmeR&WV=FY)7W&SyH!}Y`j%$H7vc7#Ag#^_U2_KK+lzEPW9Skz9E+gh;VN_4WK0AJx zETgH70<|*|zZ=A{SKYt&abL;f6Pj33Ew~l1X!NBs*nex|KDL+rB_dWK*!ZpoF8cMo zOsU2{iJ&~$kdJn}#Do2O`K4s-2TkUXb|YQ>P z^PECKy5dx7Ufzd9abwa-=$%TJk;5R4!*t|(AImX_5r2waA^{gph}Mf}<6yXeepo)5 zFK?29Rs>t;ya>;8og<(4s)m(c-5c1SP z8LLhfva_Ro()&b`Rie-o{0R+#|F9ca{e`0KZw50703TZ#;dGjTb(91UK0cs@x{bBO zKPWl(r0FkB9L~*g@s*L!*R*J$$4>YV)gwgo9GCUyEfmk~(tgaYQ*uE~sdh{`-N8{4TRrYs zNshF^Qn8XLVw=5k-Bs5z8_Bk+GnAw)jBc5iQNI596LGXUh4Gm^D0x5Tv!7T$7h^xi4sT-YcFGrI?X!_s#>Uu^=3YI!kA(omy~xHY z2cS|L&z~w5DESir6@mDN41XF3sO|xdzU5!SzoH7|F_k;H{6>s>I_8JK@fa{MsS6m6 z`BXXy-H z&+v?wA*+!RmOdpa>+xZ^Ku{#3c5f?rp(i$!T%7Inmy%|&fFY{Oo)11i+H4E~C`N1k z^;h`72$MYVXeU=#N9vyFV&P@iKggJNd3GG?wPy8IW?tmSF%r}O&Fs0MGTpuJ75=qJHp_HxnfXp5P({L-IqL_XUvhXc z+@023s~o$M4E<0Ry{A~aP^bTkXH0GJD;U~`6J*I4J%7Ue6O--SP@XE!VILChGA^1u zV~%V2_?6Ye3`+B#?Q+=0q1$QM_p#R@LN+DhayM^%y8K^s_;C)TzML{ zPxlo*y$97E)C>V;UL(zqmg5N02BB2RE@8stxPWyaM$UN172^pvLh-VgBSy$arCWF~EBuKHd%E?{z`!9!Vox43Cmh4K~=KXl?gxumJ%c7c}^KBqOgEKQzqo>$Aek z)KMR-@Ez@GwkZjc+%o?7Nv86L7;JmAzerxIk*23SSvm0A#Nu2;Os`G#_W@6}9Q8-i zBw4-DL5(T3OPG`syUJ~&xs{EluY|8|&Z}+vE9tA7<9|wd<=pqi)bu5nN?> zuH4<>MoFzjKk@-s6?s^>`|ufV%cjvh+1l_07*TU|yQwMmiY^bz%OV*YZ;TA|x?ORem zIly6NFeQGn`}{kc%zULXAdrM@3Oy*(C?0@j8p3|_JCX(aKy^JYlP#-SQ!B$M!B6R% z9n|Q6(`UOb@2~Q@YZ_t0Wa&oJ$m%KEvfdc$39IQ##OX6)AEEOHRW7O&IaZ|XR!L;| zcctt@_tu9{hRYA=G{6M>-Rx-gYC<1kgZXz{7E2~+i#Pa?*nGchzGEa({Z2M7qt-Kc z+_iEzWE3H9VxIVB^1$(^Rq{X-r!H^RL0Z9Lc&zpaHd$;UmYbVtMdnQcUy+i;*^oXy z$lgIW1vr3~t$9IxXCE1L+HdCm!(RH#7yE=pU!gz0&Mm&f#jsrTkI{3jV{<0;>Dk8q08mw~-EX%=$#fkhrmQKBSl9JK^Fu8-1nDp(@5;FmrEl3o6s_gE5_$9N z{f8nuc-Xz)SMG)ee7_r%{~ZJv13*YcV)8hyrq-_c394c3RHLsDfI~7i;FTj!VXY@d z{HMQa34d+&+dfKHvn_&3evWcb=q{R5ii=C@DC0d|Crg$&-49ymUJRWHI^Xhf>ZD^2 zBX@3cWm1d6M{%5eKl7}nA#6^^Rd+f2Qqn(i%~IF1v|o92=tKRF8QgkU)SUJvdizqB z7Y0S-iuj(ppqw7%(rWHxLFis2`Gbx1)#{p8!DVEI(Tlbo)}D+E@Y;Muz-q_mwtnwx zTK(hP@{X~u@mN3BB(AD9R_Pm*d?w_D&o_zz(UW|5a}f#e0xZ{#u5}R!!Uk+ES8S#S zM((S>8q&YM63WOu>l=m-IsbSQUBvqO`pxIhce`uup-&-CL&GeJ+0`!R(=JGvIoBh4 zR*E+UqyA%qJs8*#VhO%xU!VuZw!uAJ$fs8gkAq9;0V}GziDaDnbTLjQKFX}QuVCP% zNllG+;SJjn$x|dq52O56@)(15sxYv-FEv|5)qT3Dl8-}J8{C#!WyQ0`uE z1Hf$%0Jrr-=o#KfWSVhik(bz`kQSb!*z+7tCVf$2&uNVDh=-^5Glq=rR%h5mKukg2 z`Ew3C7;N&I`$fz_93P~%)-uB6j?J%-EI zO}7jc_Vd4Ut(6KCW>qG~t{0RjBc(&+VD5Q>NK+>aEP0s z9p+vcAME$rh98aY?LO11?bJ8R(nM)@PLLQ;e>kM>n4+dgCawm4-nyQ~MV^13;?wRU z?9xX5NV|L3Rb^IM)@ix;p5HA)ka>Co(^p zfj(e;X8G%}n!Ht2ca#p+OC;z+TF`Wwmn(kRYD-6D8l3BrlDugw&)vnQ!KllAWNz&( zcnOv5Dhi|dQC7^Q3t28>BLuQrK?UDqy{fLhedCYN(K|so$Bn=k34O%I(8!R)H3RIz z1AHXdyt_%Cqj+?y7>Q55QtFHH`^q_P3aL8yN!IcX{4^WwTe#uoU|X|m0HT8Uv+DS=@eb&w2M-!hG~n<#;_Y{t{NCZ<-B$vepAZZ~OKta!-WH7$M|^ik(J zDf1!o6}8&?;mr}4YoXzNcwn&M)K}$&tG76BQ0JAnpxnf0)E@a-7-f%T$3iJz`qj6U zm=jK$<{lO$yxrClb_XCW3H6&3~4^9(3*54OCDky&nNiGabC9+Jyy)TATu1t>4 z1LZ2%)chR{1sHGUZ1ce%)R(&Y*SIWoDbUletUl$jz6}vny+QeT2be9UgXk~W*an0X zvAk{@W83GlHi4q6wcAaEPq+fW85;||buL*KuM}^k-2=;M39(oWH80;%q~ZX`)1z$% zqlMW>o%_m#S(Og(Ta?eTT3=OFodW5RRcrDwrkK*1&4g~HSEWZbRlwiJrAFO&IeU&Q zU43*C_}twZ6A79}4frEugqnP9ewH@yt&2`D;r4)rO?VYLnJ$oIg9ag&^_S!uH3caa z60??;@Fb17M(DE6Z@iC`)yJB6ne7R9B84RAYO?olZ;q^z_*AFr3*^EI8zB<4v)0yE zl~t#@fS@LUm1o}BTW-)$0Q<%MCca}i1j5WK$0m5(`mcW81n$J=2NcsYXJ>!J{M~}` z_Q(pGCJv3L#J)1)+C(g@Ir3IAQfYjA_h}7>?A9g2_$xNIOg+AudRlGguP9tZcyBw( zAALdO;CLz(<&{5`iz88SEzH!}zi>^_oM93C!(ZH^?j?Li&R$mRLgJcdUX4Vyx12OJ z#O+OCIbJ%EWZy!Vcjt}`>(jp-5qu=$i7rHVh! z*t9*Zd&`@69J2I8YifC2xx2%Mi?NK?{=tKiD;Ju#uOiWU5s;ft$p4`Z5O68zdJ}L9 zw1d$kV8;1d&#XNyT!8h>lNG+}zcg^@q2LsKDA=8=!D?gm{11V>s+j<9rsghY=vBx; zW2kze^W8ip-Xq$O-ak>D;kRK~8x|>UUfXbr8urMUDF(c8>jM`7EX=yG8N7tR zaA8H41vZkT+Z+RC2FaF)!;YF`O;w9dE!4nTEDpJ;mij?3^&%DT7K=znvk5ZMh?7>t6Pt*Ok;8sj0{ zmG;HCLs3Bg|)zlvKkIT(`P0pQx^3ZKO#Y_Y!x(AhKtU=#*q;HG*bk= zgCpHBCt^|uaGhxGJB*rMuZsmaEJGRscmZT#v{~C;3b0>&e--tZkL#9X<2}5;?5~w6%)%b;2VT74h$A8TG#rAMHSkOZT z_3AhpV3nQD69L;D$$C^9eNL6S4Zg;~MPzX&FfjK4csZ*6lo|ZEHp@NV%SvcrY^_g?UN$W{6rhNk($d9ekNmt&sZqv<}IQP6p~XyFOKazt}m2tGbn zA!4Q;_t(uo`klVeea2950S@Fz60$i85(V0%c)3*CU4N(VxrgzWhYg|kx*pq2Db`!Q z7hrZkK)%@@LQveTwsV}2ea0FOJ-xuDraI*MX<+XVlBoWLU~Ny=Ts66x;Qk3v{3I|J*4Nm_ zvsA&kHnTX%xasM*Mm;YVE;Av><#U?M{-&_2Hod_|MP)_wIjh?ItPV%D3SIMF7eGsa z4*R|3^kwv=2El3bY>gabrb44|$A_f>Wxb`GbqptR2#_jp`b=5N@72q_537suNrXqZcG1{j? zYU12_8iARk=MNg#a!Iw>Kl6F?lzVVYR?>JK-p3Xre|s%6#K1nsxRhcq`cSN#qxa~$ z79?K4;^5qi25UT4DCBa$@6S%!2YOBjsb&^L%K`L^*y>b_1whJ?R~j3Ga4M`Jjb5^V z|Mp%G(i@`S^0S9bSX!mJ8}eF?O7~Z5R1W@E4%(x|!pcn)VOH<+wO>_fh%$8e8id6g zW!{apJ%)%@pD@2-Z1o7HeW(=ObN9O3H&8fL%EEl;`>%DFd1JRG;8aiW?aiM#b#t{P zhxU^xrc1tD@UzLNPJu{^L#S!shTZV5D-u07Hxc zcKVbfnV$HPBwF?m%qbxt5~>DnU-%n#RIAHoF~8u@xiZ~VudQnu8J^SDVYC;MH4P!V*(P~K8rp8@)02V^R9b+WDluZ?2Klzgh=Df zv$6_alO;uxwudFEQ+VM?Dq-E@S{6b@6#UX{86w72%zt*Seh~CUwlug3|}aQSc`3; zVT8`hlH;gtIqmvkP!>BdSy))}@BHi_uJeObYsY?OROU}V_^}7&+EUrjggnpFP zM5V~hRA``>_2(23BC`6Z_OpgHDuHS0Sj1wS9gjex zqj?eTYoiCon#*+`M&52dAdx`{-pd!Xv!-+nX)m%Uik|mnxtT>^P8og~?zQ2KQXrFI zwN@Gld=%Y=rrw)ZR)b3q8wzk9aH_o7bOi@7J>)ruLus}R(i|*(7m`n)iBpoMPI1RF zZ~qfM_@C?mMKObnm-8k^I~h6ARc9DE+k{0*?g(zV=Ors{DbSY;o=P6OL{!y09wP`i zUiIR9OD9(UN*a2+m@ju>KNB=l4Ai(1Pp_KFJw|R@dv?~2HgZj;$88qh>7q8Ald}48 zb7IcT;a-aG>Q@#MHcvq%e>s~GSrmJQE#_+7_pFW6QmhX+_`W^>>z0p3dR#w0kQo5i zo)fIFL{@bI&Xy1FqtlBb$c8tC4k0t$1zuXtt~k`QDjO5(@Xh9WyBNqN))sVzVawyE zhQs2A%6K?8?TBr5U6elhkM|+n`wT`#3{kBf4XzIxOnA4X;X6o>#C`I*F5ENby1^s? zSK@Lsay6NW_=Zsk983jKw35BXb(gV`qI@|%#hgGd__nP!3_TzyQ~V_Q9N$auf(n)n zJ-PjI%h!^7sukzA*<3}=0a-i|qlmuc`{n{Oi|@oD zvuF>VBS9ckyB3F()2SriLF$XjYhNmRp9l(>&9ScDn`8+Opb+u=vUUD;QNLQRdj(sK zBj|w1fK^y4KUQnA?2tM4P>f>ceF%(2Zs@zl{dMC>EETJj+A*=5437c1TMHCapM< z;sYgK$aD#?8m+7N$)GlSRHoz|GB{0sp+WB_Fg6~KXGDtv(WU`g%V9WQ4&P&p=Y+~Z zu-}KEn?dl0m&WBaR z4V!_EbVdbE@WPtDd-(M`zL9%uZd^yKMfBwzII}%#y4kijrn#>IBL&@XPvi!5zlM*1bfYgXc zm)?8tJwPCp`{Gyj-e>IZoPGAbKkkqFi@|^qSnpcvDRa(ezQgvdWNOA2Zv&uBBA_be>1%c8C-0O`Dt8{DKA}KN0np|$aFVELF7~WA^>c5R z?p}?YJ>J%ffOx$8PCeJdI}ob_s6U{c?($z`WvfRVf&k#E5KQ)@3`rv5cp`9*RVPU; zCk7w)D&x%`>Ipj?cVTeSmHFUYQx948)RvPoaqojgX>bcF32G_$_x?(q>8U0MjaaE4 z?bi@4#vl3kJfGhNGY;f97ZAC2r>?kgX7HHZzBqA_rspUZ$S34c_e^N6xsNK$MKNq# z@BCd}Oyx54q zDwMU9?0pnpFNjm>E0FI39)ujq??Jpf%Whx}-%GAQN+g+|f^6J25nr6ja)20b z@j**N+kUhA5h;VRiZxnEevO7rge8sz6SvET)oJv6P-0M=ps}y2!!fEXl5rsA97v*c zAUX~FE{ufvkO>h z=0EOFZ`D5NeeSCz;ntob${w_O+)Q_N7PRt4aJ}t}qwSHY!#gklu>+yS6Z^?Q`dHu; zIP8N`=Fve@`yhfVpf`uFW+;KPTJ>uZ75-I%{g;gH!0p4`NDLvGTVia_W0h=o6~%kQ z>J7ZGVf_%LZ#v{~S*!cxrt9YwjA^3e7izPS z76`M1{*JC6-6+mFq=+${9w5ODh7b0YB#e)rcO*~U{ekY){%(=Q0s8bGKeQ*8MQH1%K=d)7pBl2C3Z zhWAU)xY>{T3RK7@YU9DyHsIS@r6xcp7udo^)>@EPlr zu}#^);)5nP$o)u9n54326lJ(N4?0fW+g*Ze9ObIS9(Q&1g?pWgQylVLWQ#fZjP*F& zy|kxbQaNwMqFTV+oY_nEaH_PdBCMmXM@~7}mfaAovGW}mZaN|Mk!GO_(B$aDyDEug zp;C)SU3-(GdSWo#u~V+Ga3)D-@scp5u*{n9)%Nw5+&>dtscW69W*R1@Mio_z&)yyj z00-EQCe)3N*6sB4d%DW)o-Kx4qw0Ekm4FiQZKcW6%5R@ zsB4qTWs+`-ZE0nX;{A=@S8#0FaJa|H#C(3n$L+9k)yd~=6ghP%xrSV{y(iCB*VkA2 zwR(3K9)B&`CO0flx9@0DcyeB-xqUi%(DcbyObFeK`SlGPW$N~d)O6-FTSK2E;WFbX zX*0Q2Nz}F}s;fA(2=k=@$p)9d_#d3O`H}z>WR$zQ$xb zGsKq6!qYaFYJo+1&_A_v0NjoM-?$+J;PdbvyV?)m$#SGS=UwvW`0ZxPO(;E*1V5JJMM$%j#il3Bw6m1!*eYW z#~6tVGW`8gauW$0M0%-mcirxy6<>_+DLbYjebW~B*8pS<{~)j+)6k3Y7cu~70bFZq9~5{7^Xaip%(Y8F7VN#n}HZ%iZq?aL*u zZ$5d0Ehv3>XiJ=(es^X%3uZw#`@Fzmvgf8reZJj=8QnuVZgVQ%7NkkF1JeURVS1SN zDG}Z(Z`bP8Z=tI$1yE-?6HxH`eh7)4yn87fjSj#7mg4;a{;?RP$~yv`mdZ{n|(PeQrm$N5#1i&Ucf+XxIwD|cK3qHy{^%lWMHuZ~Z= z9xA7kw4VRoCpB-mQ@;Xd(BZOP#uRMJN4JBgTRQ!p=DpQ*V*-x+(cBw*i@WNA3Rmu) zi@E5;cc)it4=)8l$$Xd(E#c_EkDQ4RLE3JRh_mH1dtXB2l4H z-|UT5wz!j>_UIWYC1>Y|a%=Y#dpr;C3Fh*6(>qnET<;kv*C8ZwMtJ=RS2H{(n4N@? zux@>fYkE+*XjkEWW2!T6P;M~V0idgrN@*XFY4ym5(8`HVF>=wG##P7Oc0bM2{IH@Px%V1QoDuS#G~D?4y?UIM#G)N9y$0I!&!+6I$@#So_^_n3{Ez%y z7)&V7@@BfE#ZYS0ZJAzA=_**gH@?)8g7nF3>^lsTGEzF?gqr4jB|sy!-dEYw_P{f; zY~?`)y?P9NV_l{MJ!qh0BQKfHUUC4TQEDE3X>!28JKJRi(sRb_?OBmJ3-H>bq4n-{ zz@W)fO!3(JjD1iRCRQhw>TTw~c5OS9!FA09VMpQu)8CfIU-rZq17yg?nRWo9ZWb9s zdHHbEN({VY&^z9v%!IrjbQtkXzu!Fnx$hM(n;K=}+M}7VS+ym;-b$d#aJ&ap8NrBI zX4l%iu5DPB>B;N`zF(vJlF#5XdfnJ%A^-^8dQ~<}_VN~MQ*;wYef|K1Nr{vWQ8FfO zHKlv10UCCmrIz@R)@8zw*;eCg&$jnvq<3yt{bd; z^W)F}UojRL#K2ZswOGeevV-R3YOa4TP#=CFw#b3c`rL@KjomV02N~+!AXtLt?a@l? zD+=eP`B~lWrKFWTDVD8b{L#lj9RNGTq&&xcq^?;|Yp7?bO=P+@;gMP^IugczYu?$* zICNfFcbFXZVc}-X{LLkaS#JN{D8SgJ5`M@GS*$hLvso1tTbGeVhtw=A16#isEBSt6 z~_Wf$;pTgU(C4S0YO~0OzHp!jBL{yVY()V= zb@v3`KoS~Pr^gwFPe-)wgG`#1sf*IvZO`?cN2DKCbCclVNzILQ>}rJxr6a=_3rQYoHl$&{XC_yxY96h{rzYH4xSp zlI@GVc6`};{+Gne@6KLFLDJl*?rxV1H5Ir+L7q3DOwS~JB77gnl|E>M&+zW10X*gF zy}++E;8iE#j#>*#<k>2xm7f)Z1Ah#ygT6+mV{B?>E>2 z8wW;zipF6ks?P4RpDx8HwaD_M#ZAjL3LI{I8}F0VIx{fT>Uy4Cn2BWwqAA1ZomsEr z5mZ5ACU$Db$am;VIvdbyiQ)}DwHNrVuS-Vi7rQjv6G}}vn zGf<3`G#@FBcrHpe{N2!_UuEPxIoQaW;yc3FB{UznnZAJ4DQDO1Q2FJmXEy?G%*`Od zfMc|98bB)$Vv2;uynqw3oG8K@mKfZKYRF3H2`=x=p^~VB`MnDUSW2w5MO%h%MFZ5T z=%Su{UCmG#v4Fe50)a^Yt`j)Edt)58!=3vT{!9efl5SXM85UW(&QDyI6WqO3?8DnP;cflHxaCvO zUX0g{$b9@FSJih?5ziBzpDv(pyy>3in~|ws7PbnW(?3Ue9Ym`+H$YkA5#-}FRaP3# z(3JcXyFSL5M3AVL^2si;H;DEXwP!%3nS@^W*1f z%i)yII~E;`u5~)SgU_TMM2)88JuL6tcDOoaU*rYYGsoyXIW1oZj-?Vt$(u{}n>U%= zBWBHfDC6@Mo$0Yn%i04D>pwDjS9Mx*AE-Dd4uyUYbLBU2^pNJIrL{E)D?{sqX=yQv zy03dds$mF006!; z3<(>UFzG=*=L&FbR3JNX)v=NI`&lde<0!Ihw@jM5mfziSn1P8tFG5^n)ZUpmeNa)h zrAbeJS$2diZ*X+vaIw&=F&O3ho#+DQsr|X_R~@rD5~2Zp4@%M!^xjT^&@hHE@o~i?{m)ow-qp3lgm99pDet4AJS8p`c5GAC)KT}K z^T}7gLGm+v82y^I(de3uFI{z7GuWT=(ePPr*KCuK?;^Ml!!+TJhmTLUXX(}-j6I^! z-ydBakhHt1-i{tGdy_U>rc?3m&&&5eWV?=%4o9n(qLvSfG0xFn%N#}6JcW~B3!mfa zbw4A8dhxJ69S}4hj@=DMTZ1R($O<@NFCG*;NP5ZHT{r!T;AS(bcu?4rk#8Dpy4Qk&phnG zE-#G})M2c3*tKm6{LYuRD|5nIsX704umOrhNjK=}@dX|WBNYyQ%Pogl&eRVlcfdW5 z!hYzxvo|O4xP~F(piv=qT>-jHl5U!gHt{hTa1#wIgrtMih|1wFjLYCJP%I9;RE8+UFrbiyH8!QOJ@H zh$6>~v7K$)$WG=XbH>ndoRou>Sq~-@<>l7O#FZwDt4Atw(G!i>j3k(|>c^2|9`)CP zigkmSJFb2{aYH7$F9FsVd8X+{_|;|=2)j2&o7*&`J~0?+SSq->1K;HW zs6_WFsmGea^0wW3JEr@fR)5qQd!oeILCsFBb00L=3E@2`K_X9dp`F_DL*6?NX|zjC zA79(5cv_)N7T;mqcB0z{J--QhT#&v7eL^)uZa{^-LU);gq8(18f{BMxsW3A3{%@tw zQIO5>!p(@=vDe=e0tYN|5B|0ovo9I5y9 z6?MEZLigJDPlmfE53|Q+u@ARP%>+$G%XHN#sp7sQ60t=%t##4ms9Cf-YI#AiGV*B& zty5{hU1yqQ%z;j{>bUkB?ymmo_4SLhLOln@w5FJS&<9a0paD_c2c@6xZ`y>BLf}8J zm)-8~g&ASRW&acJ=I6kB0LIrDmra35DtF{wDnSKV3|J=0>XsGcZ{Xj%ez84mJlb?J z*wyELSd(POT7V>zL@lTI6@GwiCiEW&l_CfyJHAvFxc?y0tzV&XO!XP(nW8RT>6p7iGY@6T3~f%ns*~ zM{K<#{#gYXMYXDDwX+BbF`}B(M@JBvsN7t;D=zI(3le>I=Gf=lzhiIc4 zxsnvE1zm^4Mk9tx$0^rVWQcV+62kG1zbh~kA1jjbayieLuY6+?ylva~uIfh?o=K)494y!58mJ;(Q+>dn~Az2-m&AXIk{YeR$fVUHeb*_6k+Bw_W-DHp( z+*sWcQy^085rfSzu4;9yJ!p8#ikRng0qa zw!lDrA29a^)7u9TPh#4|rjlW3psBJr&dPpgVfB?kyGehHh>)Rzc&{6 z!=;xHKJ*t=)_?0X1pMWLt>KU{LppjncwX7v9R7HF^-W0A4Xq7^L%btln3UX=MGd3X zbjK=a^Yp{{2WlSJyQApYB5Gwl=Rz)>vASYt;4#&2;ehNLhxlea_LY*5ku!@k65Ap> z%(#@Feb$>sVL@)dIlVZ8oh94ftUO85k8VqLkMZC`jt=ii618aSuO@3N8k+hm>6)_{ zUDdnG!s4>TT7q|4-Lek1&}g9Ho3N_xbG;uNImmv|?-@>bRMX30_k^yzX?cE)LF^k~ zJP(Y>)nJoS5OnPC&xABfX8uxY9kfCc+qtq231X|R_Dm5+d-8Y@koxHwqU&~!P*28& zy8f_-#HW6fWsW0b$I8{?;j5>V#)ua2&y9vItE)e#DJ_ACsH|{uRYMFSo8}|U5^QSZtx;?Hpj>&qi*tTY z58MSM-Qa{{_Q;(%BvD>y9<>RCT6T4-U+Bfb_WNi7>CywpnP&X^ASGqk%^!e@JT{x$ znn|`6hDCGN{IA)&KNFTzv=ygy+gcZc3X$07n+IhaanCM5r8|&z2)pF|q=vhv(E-I{ z3Ww(=T^MQKweK(!ZywhT$?SbKD!GT=qfHD+6>_*)G`KCOKb&ykw@gTr`hM1#OQmf- zC9_Ea@FRYiK?%TXy4!zUxdwm_&U2dZ37TZQ3ns8+j>>_Z0OB~VOm7W5srD24B)P%@Au(PIRElqa${rcW2U(l|sF7LU#mAA(CHIi+Vm*u>-9|UD^`>I}0 zesCY~Ny0Dy0@}e+UqUR!rW-n`&fq&j<#fNw?^DK50t@CUbbfAx8qqJe4+;fh+Mi^q zn{#E}fonhmeYUu2+K}4Hsexj_m14#-lH>v-wJYb+i$gyp1iw=~N-Nv|y#Y=14LsWu zdXH(QS5U3#S=;l%Tp7HNTp0rb|%&#nQ zp}n7Mb%Y|`e0>dKFL+RqZ2#THnS!YbDhffh*|@e)v4_TYE)a+m%iw;LQM`^r6vCD~I7J}h>fEB!EMZ7D?ZEr>B=MS-rhE5O8l=<439 zR^veBdOMDjLl;o@ChT!r#edP`{C5oD;lJT3iz~>Mjl^*J40lT7`7mt7tLo_hoBEU- zynRfoV?VK|<9%PWtVs7L1dEomp1Wmn^2A-&uxxL{Cb~4#RspA{w?c&C{IzBVLo(~_ zlY+7Cz3{j#n8dr~%o%!6sYROE5`Fs-+GZ{6^$!IZy$BlYtf6Mkg;Z}U)Tv9vFJ2`d zknY5PlBDzY(hGddm=nU_|I&-P%he!hNET{oCu1kbfu9HE6x>eNJqfq%NXoLIk6bZ{ znDJq`7?;dBX0`>ed?MIGCO>n30MX%CE}9(75litKhA&*#m;06f|GX;#H2O*h5eb+> zHUlKCKmiYdg(1<@p=Q&20BwM=NH??N3@w(vOTtwg35AYXT~MB~m+pNd&rk6_b#Z)9 z!Uw!Zs*E6NZW{Uq$rnm3Z|gATTDR)K=u6QAu`L3lLgDjQtJ=v02HOKFHR=kOkDe#V z6~Lr0{!6CPF0zsg5aEvB^e=W}rw^p8Xh0+1(N!sb3E(l@s`TgVm8YeR$Z2c;7Ulc* z8(O@3ZBOSgNE#b;TA6m&S%26mSD?ooooZ5I?~dIWE=yQei_XpV$ta>$td+B3Y+9?L zV-ndwDJQbd@u;h1*Dk*qfQ0#HtO)c)S&cg0CE9+eN?e~UsX89b)??D+@4Sp#!-7S> zK)kI_-#^+S!b7B-{BX-Rn$)dQ!wW;*0IiP~!yCayfHCkH0PO6^^Tz%NM3F!JUD83N0CL>0QecaD_d&{aCOg$a z{@7GOcOYy;^oB)yWv<=mU;%cxfQ|!Rxf%d|pEIv_dJjpU)T)%?H7?i2SJYPnx>ZhS zwESBoZuqDkZGY1BgMZZ!=r>~tm<7n`{>`I3HXQ>(wjEc6^ajiafHC5^_GBsix!&Vr zTf0ak;VJ9NbpTL9pwJ{*AZRVhMbBCTL0$xfBX_!0OSrfb&W!y<#Qj&y^$*HBx01W+ zlLEJ0@%9AYc1Lk3yubegs@YWa)|)42BZwPC(}+U9{PpT!;@~v5{n{*BljJ2g*LqD6 zHPKd%)nxV4Z74n?ip@%R-FvqbomPvLqe zF)s-uN)6za0x<}GIX9^_siZHg`|fvWx3`E;c{3{o*W&DW zLAytQNzn0&p^~40cfZ_rE-hedq=gfF`e#+qyI{s0$1Q8>p!1}we}!K6*`X~M<>J{N z7IQl@FQk@h&@vded9A@b2XBXs>I(n#^whFQ{HjnxFegg|pbsQ{hP(^a1O^0OFPh3l z^KVvoi2)Hr_{80Z)xBcw+$nRDiD%c85L?+9oKY;{u1N@qlQ~ zyF5%a-==@R0#_u6!@g0ipvimm?VlW>`TpxZz_^*h`qD@Jdm zn6=QUC}{3z>)$mRJ&|K|b;P>tbQ8kYJBTFDifUR-slFVIWhSO36%M5Oc!?&%B}ZP+ zS$}A}?RF$#!pB>GK|6!3=1z+A!#GdlxKqh3Ol!UA2#u$R7}yRVr3{0g4ch9NRi})) zDwjGc6YXa$ijtU%QE3&sJFslRh;n83c5O*>ZF?-HZjEyR7#>8VI&wp~7fVfH@tQ4K zk=5AncAcoq3RSpizmhiK(j>{ESMk-$V-%sq<}}ko$>a8GVF-mS+f@RON~7f zhliNy*?r5L)Dxx?LLT)GY@mzrz2`(qmt6ZX;q05I>b?qoQRMlUc++@BMLGEcdHn4y z{Dl4j&v&uCq}{x6j|LGEyL*Sqb|j5O-puxz{M)i6?TY!=#aP;_`QoN zze#?L87FSSC<4GI9~3e8zF$?0s#U|i${xdj^rGg|mII72*Opp4mCL^6%T^JihLM+{1h1h?kc|1rpV|zkdDuo;T??UH?l9s0MU6;bR1n5evpwex0^)hbl zxqkX5Z>JUL%#;LY1=zbpA>KU`sUH;=*v3$IO6~?OUudxymcpYuDQ{q#kag4Q)i8BD zFew+lc)1f3CGO2LuBA4grTl5DZs-6$b%zBlbatwh3ITiN1CLzT2hpZ?=S#o@pSR7f zFJX=Dqt{&?>cvh_pe^v9SslB6>HN>B!u@1CVL`lH^Zswq<1Y&wI<$nst2pDE#Vt9V}A2>>-0+2fbzz#pA!hKs?P8ay@7DS5}1wc+)zu>5s~3e{}Q zwYpC^c}Ihten82`7{R`2Y~)I~~l-fRQwP@|AKp zlQaj}X8YgM{rnkE84ya)O?A8T9@VAoQ<3lhKO~*T6-AXDdmMa2)0=dWp29W_MBGE# zgKXjn9PhhBRd7wF91pUDT;^UE@qJg{bwVr-P$0tbap{b~V+em#fBBXX0n(Oa9 zn3h8|+nW~WN-qA=M=dehErmoyM45Ir2{fOoS8F}0eXvA#dGN+gQ`b(DnAPih?*;_* zDj(ukr?1P7DJ){tHyn{> zrz&42vgh2cEMiF3Y-s_?$O+%N6rpju{_;Yw$j=6ZM*5t_ny87esT8MQd%;TAoDlVSrIWu&?4A-8`5pcpU_IYbx8clG zI5Ml(&KTyg_QNlC1bVt2TD*S56Tj7Is~iqksYYLi)+K-yysgiGP-<95pDh+x1UjCgF z?ReI@KK=dI9yFs%u0DZtw%?{kIsMNmZ6-HOQmoW0oh8WNVEUKjaS=yveR=dAD z=khZzTQ)-b1#%`F+5yy572t-JqOueac)MPPB)B2oZQrh^}yJE^rh z2oIn-Uqx?(>n{fWk*O~>vK@_LqE+GsuBK6$rP6)hZ8txCWvW*D`n}~)n^pn6Uf_EI zTC6O^*x|+!UYj{h%t@sYSMMYnxrp#~{!yzd=AMTj_RlD)F$Ki+LgD~=CKg(B<*8Q> zx;FtRTIEz42Cx8B5<0NG0xM3S9w(0>-vae@R%k^aetqzOwv|2U7EgK7Kt1LSc0Zw< zKS$*SK$io_LH;U_;pJe%2z^_wfrKKiNK)gXuBz0f@$Ea-GJ7Bsbf4-!&2;i5k#tz>Ncu!zV_wuTY_@-Myy3&RG5hjG? zfcz(K6+Jlkfwe&0f4CRWdcP)A`N8P-L0ISpwv|nPPX)C-{YU*9{^aOwwG)Rr!cbH{ z;h2Xe#);fuT_CsjwLaWBREDDjj)n6CNWmQP=~02bFQB z?BH2X8IsF&qdcB3UPs<=J$U;M%~E!yKVMQ^%U&4OSge9Pd;$;t+%8g|?tY~UFlY(w zGaZP4J5gGNHnm@=YgiCID?!{Megj;q0qpieIRIn<)ZX@ketF(KxFjJZX70D@?$9kx z`I99{>viQ4H##c2I2WA4v-rr<`FU4-w7>UYaoEO8vdT1H=wx_GxS9-8PMXW{CE?BM zU7Y_mN(dO|-uVo^d8>D|`xBF~PYh3Z-Znp#7<~*vK`rg+sY%Tt4X~}yj_=s-im(hW zg##S$P_kpPnL546Pp0PHdOe@i0t0x_C>G!u#dH7U8Glq;g_=|I1SM6KH#I&c15OwZ z*Px~?+tZ(Z#f34T&EK%-csp-WT@DjWGniP!Ki9ShF4et%NRB~Ej^TM$3{w=wUbjDc z8~&xfc)2aMwrJGNA4S9odD)-;X~MHeClB`{ShO$5$e8PzCh8}$%rZ3Vm(D^-^juj zrlvb!WyK!GbxHQQJ;+-U*QS&$I*( zE%2_&tbGtYa&n$>+@EtFRC5nZ)&PMwvZy@pj=)JQ`CJX))7x?A|NY-lWd*kE(C~W} z@R2?5YZq6X;!J3q8l|9OyywB0%(+6n0xfX~2{5;n%aJ3{N&V+1sBaLA@QFM|>Sf?X z2nELuo z))i(R5>#y0B)0kMw*XKrz;r^4$Rr2Z2fg|V-HSu7UU4K-W2r~>K|iH=2mZ@a5dZj7 z+VAU!7?O@}Z0v)+9;}4_sQBl*S61p@C#+URuAE}g->Xa>za6K z;s5whk@%RKRJb~j;@k$x*m--+VG{`hTIf~m}& zFR%+L8@p8ciG9$N-QS%s;8V;yeXnmwR%Tt12mafL8z;l!o}AC(J}&!QBK@NUU!41s zZYq#j4*nc?@8Ld(5xQ_^W1LD4_%Tk|zxfQTLTh7-`UVQDXW|QReqV?z!hvg^JYJV+ zYsS4iW diff --git a/doc/salome/gui/SMESH/image23.jpg b/doc/salome/gui/SMESH/image23.jpg deleted file mode 100755 index 74f899b00c055072e7941983f7a2e1a2864ab0b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36428 zcmeFZ1yoyI*De|gg;Ie+aSK{pi(5)5P@oW`Sdg^16n9Mv1qww96e#XqptzH^xVyW% z2MZ**dB6Xh^Z)O?|2g;j&OP^xamTouLH2-^>^1jZbFKNzXFe;KY0NUb zLl2+;05E6(@U?>6OU5@AX4Vdl?;WjdEL<6t9nAO`bp`nZ1Ob>iz$XAc9^PF%Jp8+N z?-JnS6A(VWPk8Sh;S(aF2ahSqsHiB&C@84uSb@~E%(N5~jNFXOPuV#+IjIPv$MT}$ zH@VixG3zr^mq5b%6qHodG;B}VIXJn5MMTBKB_!ovDkv(wQdZG^qob>*ZvZhfx3ILb zwy||}bNBG{^7aY(6dV%zIV?Oj?pu69;`gNF?3~=Z{DQ)w;>xP(n%cVhhQ>c_?H!$6 z-95ddW8)K(Q`0lEE30ek8=G6(JG&>RXNdEQ%d2Z73D)F0czC#Y1b>-~bH@|=i%Wuc zmq`$xR8EuNo%0iBp^x{-Uc_Wo{3c|1rgcni>N0Ylf>n5h?c^`3|6%k$XLI2Hl+pjq z=Kp3g<`;nE9$@p1IW7*?dJ-I55**Ad;2|y!_77YV00^+x%8j1T^b&YFPq zun2)sS?jlhA5ZFf9X^IiWD?1vX*1A8muOwkjRF98JdXjKgW;zY7{DwC00Riw!T^f> zF@X4J^vH99TQLwy`{?!u>>?ZhT4}%lb~9ibW*9)V1`Y=BXb1y%bAthJ15w!@h_4)A z$bzM7eGK4$3;=6$#Q-K`F@WAK48S^*fOsyE3w+Cs&N!#Swu@BTxN3hps)3V04Illz zOZ|xd2i@TQ@4vJE&vuDl_Xz`dUw)+`t&?L7Iu7zryirHef0-R4eiB zp;CZ9_j90#SJg!?2Ji{m0T~R!0Pcy+!YYsQtIjZh8V~Pu!*2_9J>rAUB2s;Z@xlL# zT;^YRutcCb{%%?{IR>DmbQ=P?QG34w`DP3Cm|Ac=BR~JS^dCHv{Bzs??<4>3%<;bs zm^j@9HpRAa05bo23-&}%j;uq5@8_Y9v?oDD{BA<^z5lWKzr5?e zd)h@m!2o)+j~!8=JaB}M2EmRFAi(w(yIjQchgJ-w1Eyxg#?Ft406azW&{4VjWZ>XuZkH3cUzNBtQVDzivnN9;(DRWi6nVI*jnq zPYtl#de*O7ry)X5!2hykn@ zU5TOF5}-&K4qQa>2arer53EP~BoP(L4@3A46L9|RTDWs4NPx(U;T0Jgmc;GxFFxaQ z=!`2`wJrp9u!jLCTVxUsV@C*g*>ScUts2sV0T`9S5ic|dVut^A11IfD3n3uLe$;mZ z=#ThT6}{W3MeywZj(a_1yZ{Y0aoZ@yo;seu)>RfF%7g;{<^ccWA(qj*Fv9xJ!Ai!B z4+b!5V2z9T>jPJ`7bVz#uasc`Q{0ZI$KP<)-TpRc(%29Sy^Kbb^}rgtZo#KvAZrWf zZ~y$jlHp9;vj63{%S$&z2C!{JCh=%7;CA8)8^qbbozM%q77SqI=s8{9-@Jtw)&#tP zk55^$T)DyjU;v0B(mJ#M75Pr{mt|K<`VxG52uIzfn9S2V8O!AjYM>`3IN5GNjw1k0z7?lYk>j0>svxG zAaHvB{<&-MSs5}|q=#wsdZ=}I*W&Gr;O_qxk3K^e!4^TIP3-7B;uF==Fz(fV@i7yX zuYhjjLHHQJv`Zfbpp*v)h}R(4EboZMJ_Mn^9>Nhi+6S=l?+eXee&?5_bdz(fXUV@7 zePwpdZ2Gr*#TksGZY$FM;G`(d!iatYnEek+>wn_qxDzmop=-WHY7C&R9L1LK0rVW( z8SzKBE&Q5~<_P6di}f(V=L|}J8${ft!!GpExya0CG&%n<9L4prbh>wq;~!><3Lo9u zYs|Idtxe(h*t&ma$`O70s2e(2CcGiTTxKQtHNTwQtY9>NYF7QzqTPwI6LFuF6)nYA z9|EUL;9J@`8SYAPnhd*_PGG^@>X7n7VczN%T9x;Z?cpT7z{@4LW0o#0=wxXu9KpHF zsiar5sncJg`fA%KVG;aNurKPGSQf3?X+uv9GQ`8E28~vh5Fryv1 z5{ixui)#C~=?Q!&Wb~>+o>rNKj*EFcZl41;tNIF7+AG%_#mft7@wvH&0ek>JF#vj$ zosXAKjVzh#n-0yqlUF;4rBDdrM-PFv4B%_|i*(XRnRpbKt4y**jkYe!)Sm`M zVHi_1r{+!?OL4tq_W}&sqgsxL^@xjVksLP_Kos-!k39%4RlbByX@5Ks3*wiSV(Fnf zu@wb;;5(?)aUC&o*FD&NC8bJa*IuOPmX;fxonw+_;q@&2huWY2!3zAJ$J77Y_2)k< ze2JH^iyiE`2Vnhx4}QxXk&`{vjI&C6&7xN!O2~v`4u1z=yu|sb4{Lm6cVC44IEQ+w z0K6I>S?Gt8zjIpcQ+htoU+6Rp=~@q#4NiTMVV@CQ;4a+?HjrYlHyR}wy^jHWY|4{O z$?j*Z7~W@IduRYrlKmtVs}Yr%zvMUN<|J%3d{*#%D$$Uie|Iy*da7~rWBW;W zfii5K*+&?ZP3JnQ6$2iP1>%~~SEx(Fh0M3=z)WAQFDKR6>XYfEa5pJQ0n0%BPNN|7 z;XT=JV$|G_6{=pM%ewQ+)T1zI>Rj8`Y$JT1#JZm9=SC_MFFsRam?Mhfc2}qh2!1oHd3}+JKPL#nxeW; zz{SdtyzxkzcF0diy4#7nt&N!bB_-Q&JO&VV(XD46C1hF8%+F($_Pb$?<#3&D+57~; zRpOAZ9#QIE@kTCp=Bq_Z!bumCJy|veu;d^_e2X{MoZj0$`@jJrmHU&1l^oeh2Ud(f z_t}p+Z_14cx@f1I z{@`;uwZ=+Lj7nw3i$~rCKmHy>{v#5=*@ahb-6lFd!~o`|(6N2bftgsCMDS~=26~(L z$P?XQ2;2UYNzC%^>nLkoZThKO;4C$J(jck$c$FXm;GRhowY0KWR}ZuP0Z~~7B06WU zSQxM0Qf^gr${?o{q(vYZ_a$ssw@0sX?Pk1GU(~S9w@l`4JC(GPAW!i(-yyi{W{MIQ zg|C-pc6Nt^@@*Vfx{f3Z8S6qs6Wc^b^zHGQ9~VB!>|#~EOf?%uo{T4gAE_klZ8}YK zO#Y}&>@LTTEL>3J3mDwNb*oSPye89n^VWT>)Lo*(+PP49*QOn*(pigK%)BfNB1xgT zRAvB$`Yw}StP@Rd2_8A#b<|eqsa`-55;pWs`tC-KDJrxhPD(Z*AZftms*HJQ?#Q(AKQWktvM3EpIQTf8Q%w4j@pB! z7F9j=CZ)`$3()xU(KpM8t`?p33ti@6Lu?uWoqAFG6Y0=m!I0sZpX;Q6E_QR7BEbND zr36Z_76KT280?a3Nk!ZpwX2Au;vbP-s^c0T#~((7>z;uYqR4o<-~iX>G$&VzyTBCf zhPtumdvrsMjs*z~j7W!BV!E~D3xNhcDe@mo77N=E8(M<9swGz@4|qwJbSs(@Ru?v6 zIa$+59?xeBkw3Sb5AeHKb|ddedb^RR7sZgHt_B5XTvPMBq#LI=Lc+5Kr$|Qs)ilo9 zMiw|xGb3t~?02cp_)Ia>)aqtnM5%#MTe;3$H8#A-Ly}6C4s6e)W~Uj_F}#xb$@?_A z?4BG3;BPgT@5{MdJY;A2@oRs9aopm6=@2-JUOYw0daRYLzT;ga&Fw~us)p+kP}A`>msxnL$vix|#MsuSl} zup|W1^++Y2+pd4TO@lAwGx&a#oi7{YJEIcv$t|?uhAl z>qKF14#|8b$@{M73$MTIT^f#*NP+jaZ3e(LcBlYW%EYNg%g)O1#a_Z^8$*`4N9XO4 zi3ItIiZT+#$};C{y_#2U2yUATWJ^2Tq2?^4t$IPqUSTaq%1Lq!@3PCMNW7F6=wLG4gEd!THcwfF3B-r0MWd;IY5n)2!?Aa z;Z)|DX>w(_CyaUQ3OsPV)}Z@{p3>Wh0w0S=*EdvrvS#|go2gr)y8y+L~y++V@o7Bk%?Z>SKzQ9`FK|=p3|ip zDXEjCD?MzUNI&qE$j6xI4Or^`*^^6PqH-E*98PK2ILLw31b5T1|SLw{BQoJ#(c;XHr@#KTI|)^{#k7nB#? zMbyd+N)r3nh-E*q;jY4hXm8&(ThGaa2jkiG$yze;LO2(eCh-$s0*F8FuJfC&;ettY zsA|3!OWR0W>#RhLVMmX^B9Mb*x|r#@HKj$IMP%+Fo+$?4HAuMW5{nwGE3)V3V~Q-b z*OC&Se{XHitS^5fpdkhGi%X~L;EZe>| zND#Qc992)fnPQ7RTvgGnzF?HJjI(jLjF~sKbqX_34iO|R!u!||#%c}-IFkP0CB9S6 z>8eO;z~2Eqr(3&QJRT;p^L_!URvY;H>jqn-r%J9H(;O>9YMD%hz6<+_tN)k4M!JHx(kB9Jc7w6nEk11+;?b z@%cd&Nujro$5;rZTFp4}JvHpsqa;nHhGnM54?>YSE}X(~x3s%{VnzES^&RqvtvK4- zfuJEO>TXu&@I-1c_bgkD@T#d}dS`EGjhe|YIt>WFULfPs(3$VCYr8~5&ggDZLscjH zJTLpJq~V>$^jyfnyJQ8+KBI1@hI77ot6kgq9Qudj7QAX2$!bG=WxFL8QGvc3{bjW1 zP-m{*qP==CU@`v|WeQEN%9eO-M z`p&r@>FL4U>kPKil>f{z_6K|?iB6;v?-Y#Uh!=+p;MtCAsqSse8^cw{VEwx}Dq=dkWhJK=083JNs$|r^!kLI5 z;P>qy&8BvSloac02c$7{(95~E0X0qqoJ|TwgYHafCJvqF1s{0dw%I2Cbdfma(WsE^ zn8OLk6hoBFdfkt`s+QhuNTc$jNs~zoskW1HPkA|(-5CGG4Q|iic9QDyA|vLTYqwEU z0iB+OG&u(d2JK!c`L0_C_bk{H7tQ<8{gpq%qnD`rE5&`uRGhKNrtx=b)<3*s<5kLa z=R`;sL9FuS3v#5)D-2?!^NIw=2S!`K1yi`DvMs9ZWx^P2Q`gR3O0_!Bx^zifNwaoU zk(0=|_Zu{YWg*00aLP~qTgf2O76TASjxZi=Aiesc^?7yF*%Z`d9msP-TF-kGr+*`U zK0Y+7Y+sP&WMf}E=byj2;5KuQ%>hUvC${VyG1|)y{txv#7=-QvJ{@&eroT{cqW&}2%J>)6HQhRhk5JQHUqvI2yMB=1} z-z8}4=&TlA#LSVUNge*y*|^d)yOG2II>wI1XpS@*bgoNTpDL3mU4j)&{67!9emJ@r zDRN}3$5RaV)YU|HhtH*;UMxOzkD_?;D&V8~(m*Jpcys^ry6P&d$c5fYr8Zp3fQN0| zG~zaPzFsS7XhC78XInogYNp63;j+Tk2?AO72_DRzY@eME8OvpIwxbGj9p}d8Pn7g$ zV?`a}g-gaA?A+D}?yf9oN3G$9+WQj3E@%UW??5j!U~DU@PfJIF7a`odL^OX=2o}Cf z!@C&yob9^1z8-V z#mcIlE_A6Lx=eMFouxdZ9O*Yc!KwYy?H2n$PpV~i1X;m-2kA-(xw`wChUJApt9BSs z4gj2OY}g}Z-kMzHh^0Bp94`&weW?gscdweCE}<=tG!f!{ZtT|M9##ab;D?c9g(Kac zO1K}AvlKGd6ThhrkzC&hVRfBI z=5bU8eul{T;m@b~Y*C^ioy>Dz2pApxGhrnT&)=IndE;&i%s=~5#70y40(t3USXb^! z3E_Slb@8VwQtDN$JO&`+2xxFUe<&L83KZ|JOBo{YMrYT=aY*5k|4h(5_hK0SV`%}p zP4gyEkM#8)gK^6D%a2lt<$7-S=Grv!6mzpwxVY6?E!Apk1WM{-p)?Dxr!Hz06-6f} zbq5|o{{$~bW&m|rGhDzvw@~qL^k}JU>D=M;L7qCv<>;+ZzZYk*)o%lug?YJ&9x@i+=cT4yZ$+c(3CG=qAD9`3Zr)}SmKK3#g& z0ZBUVnt7&MlQ#fREX1LE;#sXZ{-5kfxVQ9@!+LySW0YGMPINtrS%#ZM=7p z@#dZY@v@T3BllvBf*(3jl#o2Nr-z0ae@Hu?82i^Qa+_}|#D~r@U3ls7$=1(x_fU6; z=-4~%jjMlAxg0yW3Fm$qV=foT=V)OPvHlW^r7D1*LF(})XQwRlCKe~FiOrA5vSlQO z9=O{u&^R8K50)Hm6Rt`SQHqDH3`Ksrd0(FO_gR(3a8Yk05$Hb-L-T{%zF+S-qM(3g}W zPO&b?x&P$q`OtImQc6~xk(8~tDn5hRmQR+C)ORO%sWwW}P4{WXxy*BjwWHymX=*Fa@a_9jk z-WMyNT5TcA+Hg!Cagprp#3^5{ud>_laA4<|W-xxK!?2>#;n5Z|%f3)MAweDQwsVKP zEr@s?@+I~%aR@mdvh`}Lx;@J9OOIpDS4+{V*NW)5xvz^k4vIEKDiF4J;);@Wf6*+= zp-@TRqtX54%CC1?o$(Fs?F1S!`o`m)uBHT|*`2vk;rA=7C}jn{e`WW7N%U%dqz40N z2lfQSOKO=Y*y&uy=MTfG);Wt!ep|Q2kpe|uNFGyuyo#ADQpW)9vyE+BrG+t0RHG!t z0vCH#yK`CkReN4Vo-CQZExMd{j#KUg>+auojtYa0r?2iFX$ObIyYxoL`clQ1x?VAA zG6G*mdEq82bKEM3uD48K<73EtXML6EgC@=NC3S%Lmxh;)(Hfy!@1_omc0LZgJP|HB zV%}Na8^1DjML#_u2yuTTt7>(lnB({5i*NOpUXqNw09Qlu3q@SK#HTGohhsXNgvHz6iS)_1OPGEgA6r$pgd*Jsqev0DX-{4I&zT7IpXn31n)gg9S8Nj9^28K@>R2g+>2-Y zB8Gbi{X;(EZ251W{3;4=3dQM>MCa#j0@VV$<8O1eBj{4*>vB(W?LIjL3{c%lZx12J zbkJ-dy=wu(XHOen+5zXibbL`|S8J#YPJ*+uP}JFx(cBaQnu4X-Wkb~5KF4*yP7X55 z-N&Mo3Xm_`13m#e;T)^F>1Ny>(3l0KWeMbUm08IZ_^*20Z}2Isou z#0;&H5dq(q@WlXf7C%U+0CsPgRt}y(!XgJ2#;3Yngtxyb8Y`V}r_EK&1Bgv#Sh9n~ z-z4(nnI%5ab$d5(Z+@3&tzz^9m6UG?5!exg3TgPux2j}ZI^XWi76j%HC7#O$l)W>_ zA6yKXNS#8?UhDldvVGhs`X$iinD}xC$9r(pIc_?2@<0(t6w2jNbYd&J*Ct?d;$OU` z6X^SXO%&Sd&Yt<6zBr(CdQCj*jpNIZ9gdQ^f`q(R=iIae20T23N%y!##+yE~GUq{2Xl0-DD;RFHOo^~HP`!k>mR>W``PWYu_kv}HMmT8PEZPF4k>K))K)_I zg-@AKjtg&EjJHFa=nq+`K?>An=eXp#TnaUPMSS0~Q3trMTgMQeC*rr@R?k^K6}|#a zZ?Szqat<*@=zfpq)Xh+XZt4lYU4nMkH-2b(F3e#%##a$t)t=kE1yAJcI~(eY*%q@R zAL?_A);xnQk6-|X&jj5Lw6#6!t@GnD(!Ha|Jg(E~>7~*q{6?^ObyY&%jjNdz!Ay-I zqWOdQ1797!6EXiXr%bCNtzRd|1Ln7E*rk^dXGev$O& zXUbf3RQB2Li|FMkA4LBW(TekBrZWSE#Tj0OKVa48Mbw+j%dRHAwq#wS-r682VDcrJ z*K%^y?bRV2;l#gcO)Mwd6Nb)-w1&Gd`a)E5zqlaBtemCW;rs_e6nu-GrMq>kjZ8#|EyPV zYn@mEP*eTqIJyk^=^Hwr?FpB5yjUNb*>;gmu>P6c0(D^|OEGhTrTG0E*5v;2#W6pU zQd?5Ray$=i#`#iT#xE??-P&gYml`m6<7xr%Ce|#XKb= zf{JH}pMrkRQ-CgiAur1d+MLq7_e^YMRrS!&q%UQSv=Eu|W>Lwu=^YQE7bc*r`DD;1ryhBo29I&S_@@}t{)8W}p zqvC7WIuBZQVn7uV7x3j6zAIKKWS1+q_6!4f@=Gc&En5J=yeOcw`6z%tMOl?zr+m{Y z2fU(4?;V`}&$1_yZmS=pfRDVc3@YWyX8CgNlyz^uPhv(a3mxGOXLQxLk94RfBo42% zzb%@)EVcB|w$n?bD4t9l5&1OFS&75)-fV*r;36*mE?rK>)ntKsthgcD@4(01y47Ik zn$*ySCM_ke?PI~m?%0h_-VDD^m!1yfI!gwU&JeG)8QrqO8W5!bS*OvJXapeVkhCw+TyBFwI3$G02v0MYQ-z2QDKKQetjnKg!PONVV+pA2T8FMR;EAjC2_}N2GIZ3c>DI zEP=TKuQpss_qvd`?OzPD^1Ehu^m4_Qg9JV+4e)$-iVy&IJ&o1RP>V0CJPc{&YNF`uXn3=JB{Mh z*Dq?H*tlHR(FErub&dvq>R&9@^bAmoO0S;N8et|ga(C#+Y^AR^b-VHOEgLpb-gtp- za%vCSADSy-#gRoWIqo5+;S2C!yDd~ezJF&$;at_6BB&}}eKG{^^z((;WeOTk4f4rz zeqc~lEwsz7SU$hMPBhbi%o17)ZQ(L*Japxt5P<_sD99!fH;WRSq!%l2HuB_(%%F7wiUl~H8|SPN?9d@HKiG){%4^uD@|a6-0; zm)Q;f`$S}X_8c79z-vy)@b+R_C1`BJv>=&W-9B-fD3QM%tAyqDR|Sve8~m`hOt#oz z>(5hKE|dd)AsLj}sqcjdaw_tjC?rk-^+WehjGiV6QVIOQ(*WJ?A;&Ud!UU{*E zy85X(S-q91k8S3%IOpEj{HBxK&t@X2gF8f$KB0r_;Bxt#itqedAD3zyo`CqcVCv`&b-FwRi*T3F3e?lM_C8+4e23!I>6D27oym_P%M6>Ba3S|)DN$!P1( z_|ahhirb}xjoZBxG!)4{g$5w0MMhZ+u}S+^2duc;1S_)3d!i=-j4CKc&ylpmU{?s* zHU4X=L-;~82B1(Hz!Zf6_?DpAud7C*|3pC6IQ}Kwr=6E)hh$x_!@yv?$1x>UtblqC zK@M^IsRZ?McwtY+!V?b8l2?bqYPx+LuB^HawT%&>n>7vJ09zBRrZ`B^d)+{>r!B=) z+dVErihdXDe5pVY8O_oQdeJGgYz@EkMbw}W?9Na%ap8jTW!wyd6_4)GA-~~O^5{L? z;ho1lcbw_!2nLh+FFpOfA4S#=`dH?T`Oeqqu-OIViq#@(e~>KK*H4uGzQ*(Y-VQd+ z_yv=XBJ2=eqeqZ^+o)>L8dJ7r4!0}0vEz$^H!rc5-%sN5@jrkMHdbh%5V3~Vq`~QB zof#J)K_0)13 zhy4QZV*pr(RN2c3DmPpXYl8wqvQ7q|wfmzJevk6J^uU!(E%k{y$(zb7rz@!bR~k(0 z>^#dyYoDY8$PosPM9r_0OQj%l-b=U5{e_lfCnPTU)eu{&uF?Uk&Ln%syr==|Pp?1+ zIiyz?3%9}k36#vg-ql3#-L$}#1MW6f`h!(}rW>XaC?$I{7?_M#NmcN4^#>@+*!8t5 zC^nBmpa`YT&7~v$5#k?U)-yP5lURgEJp1Qz)-eBgs^aMG`^X=ps*ltc64#25WTX*V z#`l`pyTT9!2lV4E!0ex9$otKD$4{G+oag_F;*0cHY7NU9m|*Lw+xQI?v`P~JX8!;I zSUqNpwk8Hpegj2OIvb6mrTy8i+y9X{)UoAtYzF7fK@9t(BZUuH!X5~+_fh{s;uwW% zMjG_0&+?C#eS#iG%fKZg&(l7m_xd)K5z{H3K}V(~a|Oo=@ZbK2OTiruo3JQ_W=LLM z-j7&S@|FmIG8dlZVj#4Uuv5C$-Opy4fPAm52ynBg#aYtrRNUFrjYfn@RLITxggt%eke*>dB9RE) zvd<=lzO_tixMlOWn>f2U(xh+n>f~u@l0_{24q5oq_#AWP;X9--KBYBn*2DQ_PL$ONxkp17LBM?iE~CkxDSj_dxk;y564seMjMeKZm}C z`cRZPCAi6RQlt-e+eyZCG0tZHjprmeB;lF+T69gha%P=qW)AAVi@n{>i+91a9pqISmYht2n zhiTJTt^<5Vz_RU~)m2QIsQjpLEJDyfe^JiWR$Y36ip!r0Mu?Ij%+DJMij1G^c(v}8 zW*#|1Po(p0IcS$NrXuGe#b0})#k{uRz^&-C8@7`PL_VfICy*eqqL1XuYmG47mQ0!V zCNWTbcCh$RwMAu%_9Goh`m@mtX@wrX&iu5j1)D>YP4wcp!0d7K5+y^h-o`BQ_< z^lH#a7@UOi!9gq&e@1d3$tCuKFK#+$T5c^Vo2*NRZhzL@;XqZEM4;5w{OKPOF@*l6 z_dP_PjYOE;wJu@E!(wHi8Uom@*PHPq603$N+U?q5q}T0c2*D!y;o#S33ab$1sX+g! zO|Rxy;Y#5smqS&-^QWyVtno3IAqAlzED_-3t^b}+NGk2*d)MwVntbTb{I=p>@f;{v8u1qw;EDk-=VQ}h=oA#mx7d(#>+Pd-_VpiuJZoI| z3rbN&++encM`OCH;lm%L`ikrC#|>=J?349H6TxD9Rwa%I&ips%uF9G%4QweL1CZXI zIv@f)eqn~bi*$wf8uTrPE*0DYf9VSOIbgYKLWfc^xlc|;!Vl_CU&0vK_v%2A0i2&x ziXg83hOn?5HVZSNpVa@7Ru4yxOO61~jim8!h(aLxJI9RKx+pmU?xR#QPtlhtxu*jp^FVvQmXcL{cSI>82(;`)plF|}S@37MST;w*Gg-0H8+6-`F{sU3#e zYziUIk3?#tB_fqoXa4X6(FsL2Hy~K(e{XZYH&!=NP;Z3yPrhkL+1b@iUQ!*iur4s{ zD;mD-*6Y^rCvs^IxF3*aN49?P%vNw@@9N3yRpn;SONz$z{FuHDOObmO7CXI`H-&IDu3;zSBD?|OL1GxS&mAZo52iThD&_fLA92d8G5 z@!J#uhnf~#_3n%}H?O};a&z>jA|1t{?N6={Wy+gmQ-8`lwR?Brk<)_{vK#|0pA&p^ z8k>#S7PgKyyWlV1O5yANT9e@(N)Ro%a+7&wfzWBF39#ZX^7^7Ti9dJn!aL`H#7`0a z63B6T*F{BL{UB{5!nBm!v?eOew`gEpe-`Y?_iW=gwMW;m7FIl_+4OGNu4q=y-{0ol z#>>&__h|Ea%>>#fQu;m;(BZYIw)Ohi3tI|s$r!ACU_5+RQp*2M7s@!VGamz3YF+UDeC<1x@>R`rTTUw|Sxc zZ67bg*y&>J%E=Sn2{_!3;B9ScO&fY3UIKbsvxj_U`BPSUQ#F>%8HGDltq9NhjkQTIRD5VY&2jly^F?$AXqr((n3fKor3^&DE{^X1Unb zwG9#oOjfzdZ!$b(1#AJ#C)pFcha$RV1*TNK%8j!#VlhUuEwUMSQv*6K??yd(|Ljl3 zsQ@;|fTJGivR?^tNhSRSqhGGJ89BG{ewb}5>_0B*8Yh+gG$rB~m3)Sxn$k*(O7t&! z_CQM6YUZ++i7RL#T7ixMoM$KbwcteRj*=Wjw4KF@Z%mMDcgN^<*8EV8~4!VdX$P$lk9y{ZJ;K=q_|D|Kz}4hU8I1u+|KqK z<~#Ls&O@U3h*jDO17NDg;t5(1>S;KfY5=~p2MbG&1O-#MZzTNlVI81>_Z7_hqeq&w zS*uf?C5POCrJf}Z;3>;+Qij#dw5`60rR<_i$mDRHepN4yj&q43Au(YbA@^*($kss&8J&Kk5M?PuD6Q&OlAx5clg<;1~0mA4cP6V+CyWGcho0 zJF(3dPaB%AJsP_^rW{;DhNzAXCL51O0!tVIKNWC#ihx#VsvEB-(Tjrtr3F9I-Ab{0 z(=Lv|H$1&dCN*6LG&?Y%mRNuL4fs4(Ka*(Q!92E6A5ZkaM0R56=1ZX9VHZ|QYa^TQ z8Q}r-mJZ-<6+N(!9W!0Cle_anoDRVybF(FLraDuy;Gk8)?a~siC+Wc~ChFp!KkY8w z*0sMkx7U4n@Fs8M>ssDqhlr)(!`u?iZpP*C%16YtbGsnE?EB!^Q;~J7l2-xEe;GP3 zo;H8~i}>x+)Ltm%qE2%~LeDqZNhRv2mlApmnHYe2PCeP!>qJV@&NQMN3WrjioG-Kx z<$LR${;*--26udjN9${nttS019#8diA2w>8JVgeo$89t^aT{O67Y&!_76`9!Gy6ui`63B`HiM8N(*YKlTA zn2Rb3;#}7V7xiiwj3TrzvTTUX5YGsE2wPz#S>KNuoM*l;>ipq+Zppr@=1-vupBX!Y zC0$aHCD2gpyG-oTht}9ud>7&VPS_J7Pc7TzHM9dICKw>++xla=F<|025EA>sHX*A0 zu5$eM^l+RW_Gz4C_T%c%Ptb$M=g_3pnoEKOnpt9GnjyNG76Xu1*(`0Afhh``PrZt? zGm+*ljQM@z{_|E8jK0&5ck6`&4YF*@+hyA7X?pj)Hw_X$E2B~Xq7duElf^na9ka*_ z2)yBLQjNbwuD%ycHGEIYu4NP~Zpbl66&o(+Iai0$U*~q0o!R)bJNRSX%sv4wRtXQ- zE+xfo0T&ZMjyBj+MaU3bJe8P(we9qb#Z7H z8q&!UX3kq(8L}puS+tt-K>e|nlWr3%Bq&aR`)5o#mi>=uGsf-@`-A}?1xt>@Gic9c zL@FW;BL1Zm{U6Ftnq=VTayLT#xo-)C_s;C|sH0xHb?*|_GfsZnRY_?!jwl`t);}FE zLZpE@uaJB4#N!v);vdhaGx=cHEK!u;QLt_f z9vlRBC3t#ikwzH_GJb~*G`|m@Ni(89MYm7Jw@TU#Axw>5V-e!gtxUwzprTjALdGw0 zee4ZDSLLIvFcDaD;3+I?WlN}rqiYCxI~dp;w=rnADv!eul|U&C5o^`A8g7@e>ND5X$MCVz zG84r}P+R``_4e7&WJ85}Q72vGo_m2YWLrF66FoRu3R*kUIh%LgFn9^YYVZL5&)@qZ zO8xT;`~>UDues5Il_J7vkioInlZ$Q2A&k756n0fx4QA3-cyvrux**p&$X1DpODfsM zRDK$8=!8>-I>`Trtz>MmiOGNv`+Q{T0XQ2$FQsSBsa(>ob~1FjrNHV+Mi1AW zA!DVI-~~%^>lc;PBlA70EUT(_E|McE=dx(`r-KE|Kcas)N5q_QbiNuS?C|F^{9K@w zA3mxKZxHoEvp>-N(&QO^J{(db-KOlA*{aD<(AC;3lr!CGzS*whPabY&?#wBb(bU>Bk1?Z>GpD=XoEJd0!fP_8d}s zsT{K#_8WDeOjfk&_aeW+MI-GGLj5031ti3~yDk;)O1kYT&k|PUldxo^W8$nCnFQV61TFWPB#_juoQHF0pJ}JgcjU2Z#|1?9WQs6@SEFf zILzH2d!-*e*fQ%@G-~uST(x_;$q}1PVIcqthTTo{WYPsoodCB;5ZHREQh}GQpyLX? zqzG$RZt_Oe%$Iw|G8Lp~)~P4&Tp#jYN$T>09c=zeeYi}Zk$w(&JKY8=tl*Jwo>KD#XpFu6S3P*SY>nh12Bp`s^RAn?s+2mTW7D&8)eZVE3$BE1~*;p zc?xRsQr&UZskesTXUEHBD_}f7AWHQyNzq!Wbji1DO-)r}oLc`=dz81)NR)!xJ9sp) z&UM(n6-Q^GQ80dD1ImWv)r}$Og|7>)VR8(Wf?$ zwRG}QQUTcPv-V#BDogRMSQ(VaCI-NcHv5MX%7+r0SzJ>b!S+r-2wbRCGK@wx`b?T` zZ#lF?%&t$?d|j3e)^!+z0ldY|pK=l38Srrdntudnm4N+fgRSeTXh1B0T4XOh>`=(s zQ!}sLYjP5=Hdv>Oj=h&fLx7n5<22oBD}zq<24C5cqxM?G_!iIWxiOPQ(j6?9<`ewG z(Uo^R--7C+2NP@bssrp~aVgSDOpMY3TguyY9SIiG5^R~X8#}`4vb=dO!#=jur@S6J zcptz1e^mFDQBk&i-zWwb79c2~APka9s)Y222t$Y{NXLi>2qPd$$BaR@q>|DgF*K5+ zG}1Zr(A~_ywEM*Ce(wF=@3Z%Q*K>W_A6zVfHOw665&!?M4qM|3@E4havQvbKX<0L? zYlh=0jN93|+SK#g24tN&)UyF`M<-lpXlPxqBfm7;vrgf7@ZJvhwM60jw{n0c#p5^4 znmX$;r)%`z5Dc)}M^gP@iMe~02kc{i2vv}{zsT)25-EI)D#9nzH}n>6^9P6#?^Rhn zE+rk@k6zndblrc&mS*0&4^P^|8%ohHlTe-fMEc{+Ma2i$=Xj-#%EhT4gm=kKq#m6; za5pw{Hz+<4Birdo;j-BIa?U@ma0Y*2r;XAqO4?y%L`nKx~Ett|)K#CMuc^EG~Z%Hff z98LrbLu!dn3=AWwvElK{qOQ!amt;Gy1x5l^6<8K~pf$4*M6eDT`}dTF32yt`l%^^T z!BY)U2^>2_s~(-ciJH{Pky=4~rBi3*@o}#RX-?Z0S_9#J=}}(7GgCPnF|CpOlKYdJN!Z?Mn-`NF7J+(ceDpsOUDg9%KlrUBaJ_S`bj3)dJ9 zX{faDHN=%pCbT8B{1mP}devwfeK*)?K-1V$&c&lmWPzzl@jT@KQ^56o4f?EPcgBRc zfp@@zEZyYQZRFhQw>741LcgaLI$oC{&R)W^>l>o9#eUO}V6^3TgtOEtfH5%zx>78P zC?>ZIZHI>*Sp7ZKZNnv$PrW}B07p&;tYATL|5YL7IlVYu3Qm{FwNw3v)#_V6aZGJ_ zj0@FLJpoi^-)-uVbHlF*Zb6e0niol*cj-t?#pRl@Nt-_%-x9yj=bJ|<|7FV^K~5y! z!2TNkpPPY!ObqCT9%atlgM~VxjqrrO=$fyvu2kvhsIc?;hFDaT#S1&!Fbg2xqkco`(%V)Zw=Z#nMp<;ccBd zsR~8_3`d9lrjaVPCpC}I9~0OnT}N>C5x$Mu`I&28FVx3>)3k$4mQyRg)+dn@*8hx> zR54ZO{94eIg!xnl-M2V@W%5YioY??XAuXDM=>Ef%)qES9UT0(Xk#;LL>pDCW(P1Sv z*8a6vPA}|oa!TB|_Ql^cO-c@^MScYA8Db>~{6)a~LvVDKJAGvLbL1oj@9eY-^{%8E zvebQ^k+`xKPM46 zIF`pj)qFJ+I(`WP@DRGqFBJt4pM9TN2QFFIR)^v*!PAyEQI{ACf$p4M)=O0B$Qqx* z7W|>Oc#h*uQ2NidI||vz$u}^-yElN^&rEe+9(D?N7O~Qj`1BIDM|OQMr_O7$lftNr zQ!jgp1`$#5OIKH-mpui)gm&?=xhZza3RH$Y)z$hME>7=LU46$*iz8L3r1m$>=12hV zoK`P5k^N7R5%ZgdJKTxdkO?BN%Pkj>HQ~tpe{IBO!0w!%3y@uCYG`%wOJHlY_(Wd( zqp!wc7>v!#@wO^jF!$I{h~V=T5Go;N4Tp?u(|}yk-T6lTwErc`T0}bonIVZN=lz&8 zId;9>Xx>SxuV1_i&&tx-i)lisbRXJ-FI6u9`3!q9V2*VYZBz*E#@t}yytgs@mvvpz zjW%xHDW-dEZnm_aePL@QlHckj#f1fs89T+>K)#aFcJ$-iE5*U$HJ8cq$aQy%>w`tQ zPCU~)mh?_A_Lj(lh;Q#46=h`=7&RxE?kB(O)ixhr$E_{fXXj6YF<=wI$Ag?Z2>dQk z>Nl+b!AK1-2)+adO;i*?Qntb1&Qw+CbKl@1JD~k&%LT|BHw^K@NRRkJ`vCRhpMBMi z3O#3Rh2L4}s~Vg8O*3C`EZfQ;kNvIKFe8Xc8gT^kln~HEE@g65`*j5Sa^{})5h7aa zK;_SL9)Q(Kr{{YF>UwKwSceP9XPx(hJ}jMek!rqQDd+M$i+Fjc=5ByXk`|cRPHjj3 zUAH*TB<XI&+c1INr0@3tk!=SY1Wqx#hWz9fzxIKX?J*gH}+x%&e8nOF(q0W zAqlmgQE}F?r`;rnU{7g-1=xx$Y$oMh-*{NvZXwok*&14sok zTFQ5BJs^bD?XHR6j4ELIXI_x!x!=y&$5~+4d&@AUj3pvsNX1l~!CpJho^>?4*kR#? z!9ns#{^!y;ug9M>GhrHD_f|{2+*fS?B{))~R?RE!P)9NVbxnJN-_fABhB)6?_|8%; zFO>uytd)gn&Brx>djQ-{j>~^e@j0O$bS^;aLG=Ff(n;=cO^2WhTN}ShR`?c@(Y?!; zzm_U)#uIV2y(?1euS49XQfnBKWst$3{afw8S@9aNda^N8_&1F^0o6_Np(9l&G8iEvBQxE*ULVAP3}!rV5;xj?C?*(ovbKxP{rB# zZVsJ}Y5A$N5{8}xy@tJnim=xQZfA$uPKt$q4On_iJ;cES;eWQ>Nvf(ggo@fiV9i_K zYT@^=2|({GWMs!4kXt`)to@p|?J)f8+0-wJbSmheQ{* zW}nh}QDrN)kBEhy#H;F55%e8G+h;Gww*gm0Q|cO zpMsE8HFMk=?G=ZwbZFk`MUbq zom`>5@ui2zAvQ>z%ewAZx={PZI}#2RNjU|8)p?`_Hc>K62jXWQMiDKge4tU=C}Wq)LjHYh1%g8;<(_{2LrsaFXM20E%76p*V=Yfo}$ham8qM$&6sQ|A)AGgSv_ z=IdMpYxl=7d(W7j07#H-SR%ANGLu5r|EDno|352jS*inZ@_7cXRr_C^>ZFda)28Z=_6Z#ck?BJ4Wi=X#42l!$p(GXG^+bDZ?Eq4hyuT8q-F?zVZ(K3;& zH`OKb+T!6S-Wnb$hI{82mEZkE_ci}#)9rLR7Fafc!8DG1%clX}HcOc_RvMgj6$bVG z@Sc05xN)u5{)!NQjR}+Wk9Yn^WUJ1D8~+G+0b*4+1M7eZl1?kQgT(DADuJs| zalf@XEodsz6@8$li?rQb7jECPh|FE=J`6qIz_5thR;t84-5^cHv1H@H5DJ)AC{~oq z%PA2Yf`jgEbPw)1k;A?ECo0M zB#PC%r=R|p+$ZA&p(e@X7e_;V=5&|0pHe$YD*({L$dBn~K+nT%Mzml1_qSN7+{)y} zGrmN`PcrQb`(^yimRJ#Q&;@%=OZZHXTKKSH9U?u?ERi zOcFUn`$|IMcD66$_)2}uCZVHRCz{*$)9cJ#7WBExv)l0vL<%X!P3J$CUIs9SvQRRC zDuC|83*iqmm%2lU82~_2kvbOK9)0nN{M?HO1?h|=vb12Ry zB*Z|q;iW-&CuDx0f0zgtX7 zxaQpi-Dwp#lPxAF6%fJjH;dH-6YvV{3G+#4TH4T|00ublt-I7lz$@PGZ;qJL8u&1^yn|XeT%gug zA0V3|AAWfE4~_&NmxKY`s{3(1+|rukU1Jj6cR~-m{lnLVfLuATzBs#qwGsCNsQjiS z&R_gZS*@v3!NB1@LfDb(N>DM%=Et^n`vvecIL^tSHbqu>O$@U%?TPFT?tfh|zr*#L zW@VfJ?r1|kSdv39;=OfEId%87tX`%)qYR?~$AeR}q>Si0xS?a}$O;;%lgRXlxLN5X zK=jNQv~eGo)Kan?7C>44rV-g(xB-MOE$~wDibQuzVnySXNi;cu5R;zIP!$hntCIs{ zFLsSY7RZZ(tY`URT5KKk2jW5nn6L9S(`-T;soJaL+G0$BHB_6y?cj0!FyDc=Sk8CE zj^8jM)%8Y{8pRq#x?IMcDOwTo|YeO_hvA*PLRO$9xCQ@ z!qEI#BQv_}UQfj{+ZxgX2q>Lgkoy;EBAhukzu-O=V z9)K{1j>dOF(9kY&XaDd>CBeaE`l8)oe7w+T#CQbvHe=e24)>`adt;GHX4t%&k8Fw#b%~SpUe3!7FDyMPq50?6@jO5e~)g9(3Rrh&CgLyi}%hl1fw^o0dMZrWA z%w9H$yCf{${ocq49N9ptjV?MSC1!gOi%`S&^{oH^+;$AA}U0S zY(^GSjkApo$M3s^MajCiBdxiC7?EC=>A4KFA;FY9q>?ME7dMZiq6(PT8@VeJ3{c;P zumz^Z*5BQk&6ekaL>@7ai+vAQrWl0dQC89tIbjlh!15{2n4C25ec~N^5j&r^*u1zpTvnB=)Np)7E{8orTd_WfWt#8pg}Bjoi1CgllO& z=-yxoJTkVtr+jq!A|wx))0IGygd>uajxH44KYIxMlr*Rs%&kxs^O}{K&oMipd#aXy~ z|BYwwbI_Ok*J1YenG7^{bhO}^tCnbEfeMtkzr))$(pu?`UnIEO@P8RQ7!15m-;db% ziNa>s15NPo@sL0NV~SL(4h1h-5C5jw02;rPx0ZB>9l6BbDo`WpUMT{QNfB8?FDy!rrG2`kThVmL;*)Mhc)r#K|Gih~s2|)v98rV~!m1r}CZXBY$)O z5%-)ZHxg^|$gYZr!?Ezq<1S-U`$_4c~`nM=5zR(x?Y_g>MML$(&ezWu@)01a4WcpBS2IA>ob9ZLz2 zyUSMv_Z%u-w++e$%+jiM3U+!eb|)Iy-CZJNrd>?Rl&k}HVAD1|c>rxfSC9y5JTBOY zw4}_tce2rNLU6YrjcL;ap9n>Ng0#G`lWt@i?g;SS6tO)DUlJ#_{@{KA&{`+Cl3k0t zne#;+xK>ep!Nq}9mz*U&fw6y zlehlH>$gVZ8`S7qVX`%4MBx)@Xt7x^G&JMpC7f#N5eXq3kCodmkd1ta=N=UkOpT_u% zQsj&&a>STiA%AmTtVUQk`v?gk$|E89v3o2WvD-R33>c{9dak*qS&Tt~)BZLpM^%&I z_R7b4@82|OwiMw+FZXR1P7BwitbK#tUTn0*R!N zu{|*!u?g11M9kQbDuBbrs90^ub2d|HzLt;+LML)}*F95Pk-Zk-D_Eyw>d`&L-r5CvW51#mc3(t@KoABJU1tB_;!NBs$;V^Gig1NMPI2xXX zmIlo^^-!&j9cWW~wBaMaX+kSaVe)p40;c(D9Z{w7Mju|wJDbG{Ua_3JDKE^EI9xr~ zaCWm^B}dEG+xFG-+VF0R*U^uzFrRt2*~Z{*bw##Vp{>?Ku09{-X0lmz0ATGx=Vu_P zh6}bp3dujf)=%7H!=9Nj_tuV(64`NO{}!=Wk`v?DL2s@+s(pWH;G?i+tNQjG*pZig zzecL1cQbgOIf+^?2EZt(n(dc%#f^@cVkUrtk#<>A=sB-{pz&k>&5yT7kt-JFn#|b- z3;{{2hXgl*-QxH(``))2SOKAkis(5&_lRCd2y6d1qNB!1?>1P(o?t3f>y6x~@i$@4 zwXL`4c?B?wZON$G-Rxov!3iP#n+AW{dFz-;AU-XEq4-d&z(Z>PTbzW7?|TqLS>2Qc zGL-{RyX zcL0x1)m5Q)C!O0K>F6k1xLK)POm`{XuJmdkmB(-hlnhl{VzOw}ubp_EmDLyY)IgZZU}h)|=_HB6W6k0q6WX&p2OYY+Gd?IV91Yf|y3E)_E;Q z?k%l>{)>rsqAFl@h`YcQM}uf7PzW5A!SM%QcVgX}PqBokHpD&kqFFqFJy}!o2S5lE zZQ1?W7mSS>5|rNEM(n*>SS9-!cYI3vA59U}I; zgr3e|#?UAg7OvUf#g+E<^E1R<$5nGRbNIcp&;Giyf3Hmkq}akzQ??$gIzDNbs}J}E z*at0$GD76M?SBTR14>Og%lSycl}d3U9sYQhUs>E^w zS<%mHoyCR)$Z3lY-PNpW+-)5JCC#+3@R^a_o$Z{)TJW2hCf^^f^8GEhfm833#v$FB z89w}})im-a2FreDU_v5JhFY1e`8c1;SbU>aGS|Q*yN8bA23Kpy8TXORKYhQ@QS_i= zau9leH%z

;ICZZDotpuiC&t-SrBhQ(Q?XH}hIBgb0pVwH;rpuJy|i)-twrUHWic z9+HpcT5g~-NVe);EOeIXl$XlypL$t3frsj_r>4{9Om0M51qEk;`L5CAzEp6rfi9Uj z7cN;?^op+5$M5eD1?27W6Al|#yFz`HOb&dE)_Kk&Vg}TUFU3nWB`wSiz&k!y%;1@mGWl`sTEvZhT z9zat-n&1UXtm=wohB% zV&DNw4|qY@^DaSr7-l6V%dW5x<@K?DWF+%kRpW;3h!?^HCzWmDg6t}vc7YcVt5q!K z6fo!4=K0&i9Ul#Pr9|0+a#zfl3WTH<3mmMGy{3n_$sw!s0e@>Rpb`=%xMMNsH`%Fy zc^K6d75k>CYaGGq5&TO2WB#DvVuC>~oegfQjufBE@};JDt=2Vf2vs4aP&?M9P;i61 zfWZf!|G0kMYOv!dcWCWFlD1r$Tl+Wuhb zeSc%>8IHAFHAswEU%t6AU$WLgIezI)VfF*S{L6Vqgmm^t`-<4L^8#(d;gM0ww=S2KlR>!Vb zA&IrlQ|qdpp1Gukdi1ih)r659k+aBWZSOCgaMa?%1Zop-h7rZQuy-&=X(U&wvr-`c z3_^VPz@BKe+5^K7SOHU-K=nKSf1; zW$6hV(KMeVbE1^Xgu#sVhNW4Z4ojw}^UklEZhR)vy*Z)uW98$Tz8vpc(JkTh)!HymG+kc;M}XJ6kLwqi+7;iFN@lHU_ZkjtW&EZAxA5TlS9U73DC+qQ z^{ER^=lG(cGW!{t#|&THyr1@?PUawz7TROViCHr&9S zmc|RYSpx)yO*VrMfm1E3tec4NrIxfm-Y23Jk zIDE9fBZ=#Kv^ea(O0A za^(ft|Hq^0GmZ^jR;f={g!WbvAXO<=XhcUr!Aq+d*by=I{`tv-mu%auTuhf%L;Wc? zjBfNND1jg&ifMhW>y36PS{J{GnGgv@XaZ7j|7F5cX!)v_YQ5*nDXllq(>|M|GhAc- zI>U*DQr5bKJ6UmY_0_0(9L3Sr;A1Wef1yQRZf?vzMWj1qM>f*@y|Lt$l+m+L4!Bb3 zO=LvjP=P!kJ=v>C(qR$ygsZ#0@XSr}sHUnF*-}wC0Q%eG>&S+`hy|!5k!ouc4WeTN zsG-dO(tbePXc@FUNPxdwX+fNXNAAn76F$y{z_~wV0--R~_^;tQL%oq?VI;t(Hm?vQ zCOYR++(_ahT*goX-zS4(t8!tf%-^FXuUOVL_%%yz@`U?2ch)UGrz2NBeB1j-;$y_w z(VWt=7F&Ye_BdDu7BQsCxA~a#*C*Sa(Ql5Qfq0r5!7KfBvy6H46qut|8Q#hXx^GAU z7z=x1Yh_MS1}9jnI*9V=u=9;l|E%Z!UI2&ULABE7Vy~y!H-}eZFgYn~fGEC!CG7l` z>Eq$5(8=-blfJFd_w^Out9lE<~1%&syu98l?0aQt;fJSa%KTy=tKub8TOD#p&jqL{D}N4jSv=P8qJ{ z3csg3nVeCfiD$=M->hVenIl$%>2OGpVq$=~e&Z-BDscInSfRRz^~CAhr`|}+bUS@Sw_2{T!t<27Ttl{BcxBufE(!IdV5L9E8vn2 z+P8)PMw5B0UV-RXeuaYlkS`LY$^*2zY&9IG9u!OK{MufsJ?!y3K+*<PN&}?R2!0Qu4YC_eGRG`KY^ea1g1!qZ33{kLAjmRfBy}r3S&%wxpW+N` zhTw&}Ikn156P8{|LpQ|4D%n1T$v99}VwIWT^??41Q#-CJN-{1lPQv}1<%I``OTtHFA0PbmZw ztbKTkcB$tu{qm7J^OWYG*o(NX+l%f}Vc-8_pf91&Km%QvB_m5U-1&} z;96{CBe*(AzTP!8)459B$P!ye{Ph@dE?H-HYdZU=;xpte!17sC%1es+{HF05lmw#d zgCeP2(3`CiPk!VbMN^C$Xm_p^!7beU|M9u-WcV@NSA1kMF}ytp2aBPpuJT?BnF2fy z(v$@kn;%x__c1@Q$jMu{wYD%`?>bRdq!VwC-Be7on~8ROrr?AWYkjQow2iQ2({Gx* z7~bwz&q)53kucQOcL$jv$u93#E{T>aUHEto zQJD69H>>V9&C)hOq26sj(_tL2*mg#?)l?T34Zs~t_y3lhh8w6wYWG*A(#I@v1yXqI z=bl;`yj@wS~XXR`Fp^zo{y%?iCc|BOP;Uzxy6MS_bww$LDW!xNt{IA%0J-%9O|$ zyyw-J)?3dOUa-*09kc3$w66+jKiCOS z7^obXzGu+}n;$~oPYALabf~}m?Mu%0hL$JW>NG*1ncVARm(U|HB<&U#k8~Nv*GnmF zR|h8eSU=m=7pzZt<(W(769?Qa+#4M7rzrSLaX|`pDG0nh-+R^1e9acG-T74VaI!M_Z;%Dl4O~2xz0duf&aN6cz1RWiVhY!9+O|0Hb`0 zqg=!s^A<3Vf<<(3Q7t9XA!ldDQ>l-Q!Y|4WAhmRyDu2`LjL`x&r+p{4!n<%m z;Eyv{Aj%qbskgKsvpCo~7xvjZTw}CVW!CdH2pa@nTMFvS)7vt``BvoWyxdr)vh9<9 z84Py;rEtVLCS3Z8Wb5W=elU1vu8VrLy;^gXSPyL@G`Nwf$Y)WO2Yn)`>~`64i}4$e z1#CZsO2q2KMk6*dsqo><%LT@w%tOHJoV|{{T>vCH=@TSu&Ebop;yqc3Rb#jxeIJ4qZ5^H&iAnMkFSGsBV6gO5y#sDgM;`OKUYPrW1e(A7hr z7bcISeSxZlLk&xBznGu96PQN`T+z(7)BP9@pTrUl5ncy%rMacyI$nX(BVO*%xBF!^ z>(!V&5>Sqta}dzoDszx!3H%q7Z8o?nfd=+7rlA^%;;RIif%;HjdzD!CdczwYlTqS z@QcWjJBe#h>Tdk0*zLUC=C=JzBC@TxqUNTic?@k0L%RDR<^J+!Zogt=@E3{^_Nb z>buNUYy5Ft5+Ge20hEUy@0q+-W8N-F1&OwF2{%)YLI5}l1daavcK;POH~8& zA6p|@nRHcL;6pcmlY~f_&%y;pp&H&j8UrUL_LA6VDO=UJ-08O|&x8hw7;FkB${(#! z^9hoP>z@|9u^dWPAqP+3Gj80fM1K)erS1krJgLAi{xEWZ3XM@hsbu3l=Q&V#jcEC& zADX~rQ_oBuFn#y$prsNxC}X`XqVOU5QWZ)RT<-j3(pFS6J7=kJl_tN$r* zC|V0iw&t_urPvrl!v|0C zMuQr%f&wTTg#}YBN^fY^7tyX4!beIxkfZZIr7Q01-E*%*W zXmziQQpze&U&JXl#d}~gi~D1y6Lu4^)knL{>|?!GpYhmoWLk4F%oP50o}qFeplHip zWn8$f2)p6ygq(G;yybce|NUG1MtQCMWKMC~j3;E$1qR0BhPVJG0OfsiLMiAo#VFDV zTDn*u9%29-U3U>3L|+Ef54k1EQdQ}t?$XvJ2&v8^{xbNk>%9|5kVNL0HiWf zxFijV=`u>szCLrI_wBqm`F({G5f5Mx{gz1RO~B&}!6_98QcvM1Oh3_$-fC41`zl#2 zN}F!ytEs2AS8!Hl!*`PoD9jwkELwF)qd9zA;wWACQly&dx#nH&0l+nYTkDX(eEqjFHKfW*DIIY&eqzwj{}GqN_i*sc+x@&F zz9&!?6$Ye%y;9+2(=jPoQJ02u+nr8D%cz<}evhrm?z7C>Hni;>8csLJS*d4a77bUX zRFfXJHC@h=&)UY4>PaascHh@~EgEHj+gtyMe*N-^(&I337PsIn#0jP5?#uH@cHDf( znMje*T?`p+jzEX^0Wz8879Zge_{*2a4DKjqU&tN|AUeQakg+X%EENT0et&FcfFT8X z!7fCOqac9n)&l-o{1U-s5sCxd506jr%B^y6rqznWC;|7*oRMVlop- zpC$LyBtF*x#>Xn$cqOSXYTMm8{ELPDaCo;I#kp0jJSHiZb(_N4=?WCVcM`X)Ddno= z^OM@Z&5?UEzw~v;CvE}vY{4?4kAd+4IFcOPkE7TcG%akA@jA+9&uyf#TVYJHV-m-D5}AU}gr2Xn37X4KxG7=H9v4)D7T36x# zAT)bSU*wGP^JR%u;{ish93a14>ft!N=?=po5)~9$EB%u!po#KAgoF98NRE#D*~2i( z%J6mJ-!vy804vGr{f29$;6h9VbQ#q_6p0r5=(K%NI|S~)nVbQPFgqL= z;lJzFB;jHts~7ARpS%$~8Z24SrUj9A%)f`z`F49e+13_O z6N=yx9Z8HVU=Q_X^HHHh0bIS}cICAIt$a{diB84sE@p;Jzn|B3+qu5XH=6k9_@zI( zm6e>R)#(7_LCmyiuiL23*J%s6B&iP$>sLVNc@nJU%`hUf6eZx;FXolM@$jFg)n{6Z|;>ab$foLCRQ~Jl&(K zWu;VlgNoLvtu5*x^MvOFDvi@AF_Y4P00eQd;>zO@` zYS!tbk1KRBS9ucD=VaeDZ3=s|$ftRHd4wycj#tfSE}fmCw=1do^q0E%aCz;jJ=P4T z%6q-#CAW;*UOZF&NgHwb?G)=yyH#gEzV1`2POhW|@GMnTvRGqwT1V$&EAg5eyXMIW zzf-;SQQaG))>RsPP)N*zoiNK}d>r^OJYef?I|p1jT2t}QMgqZ0{PZh#Ju zNiDAM7hT_qX?xnCdh92{H>&=!P0xXz1uB=2b~jl%kAHd&HihD0Zd2ZRDk44lCI;owLA zLoU4xboM8?Liev#TO-e}xxcn|lZ$IXyeNYlux>B;Jvk}y;c5vZZ?)Ha_ieoWh7WQCgi`p0%8IWc={>g^@_>f z%;G=5Ckh!IC4*WX{n|`@>cOu}Lz$UOI*>$FI-^mQ?l?wUt`@{@Um7E7^(-TWcsvxj z6eRE^ZIIMF-d@VNPkeP@20 zz#D{0wW}KIBRsri4tas`^}+iBgp;)~7Kmtu4Bzw6p44gU|8P0sU{UU@HB>0nN+NGMFmx zj`9Dz0?(U3e?VzgCsJ~Z*TAB=H}()6&M&89v&VS7nhuzoSvSZm6esBpI=f^QdLz| zUtfRW!iCPx&hGB+yLayn4-ZdHPCkGBd}(RvE!{QvF$SK$BA3h4ds zUjOR_fLj9_a0;9@K~E-5QYUzzt-9|hSt5b9V)nQr*agJ10E}}SK8+K z_>#JZa;~tEC|RrPNAm0tC>(_q{SKakPNpMysvG-hmKuFSqej%F{JkbL% z%r+r{z#!MK6&M15lC%Z@DfP8;zQo%%fQvHm9p8SCz$^ehIJQU5*sC0Wz+BN&o3yC4nk-6j)?*Gdqg4*s`?T|V+{ z0V)es;;P!q(cx_!tFO-QwkM-Jgw7}wndhby&3%29&iQ!()A0W7N*`H%{5{6Y9QYlW z-7o*?uEO4UZzN@E07jV;#?K&?8d^RNNhiJqC`zdRB>}n7+~mH+(u1V*qdE^pFh{dn zzKl2~>q!pLcn6Y4-Pdhu#)?NDDDWUaPoRm-J1%_7-5s`R1j^C*dJ$macYdEn$HKxS zTgejUVPc|at~UC~&L45~0&TmeFWlAy`u2NAQ+|lDijP21dQK|=Q%BZ)uyEgL%SzaI z%{*b{WyOxru^OcN3i$;&AOS3&EZ_CZUJfVVJ;CoJ3&$iP8Q@*RlhEI2!g$?Qgm`$C z9Rjl)`Fo{)qe$VU_|8CTgGAcqKVMF)dkwF+2CRT@BRh6q!Fq)ZkE8jy&Ht?iq$fa7 zhY8cqO^(cl&oA8D(1BhH^tSs?MC&!6-^Y)Fiw?9ierEbDGLjGL`km`tH$UR%&0 zz-|al`h{P@2WIPdLL|qfhqO5cNfT~_?vL>bkBww%eI;RMGr^>19a2+o(A$*UN1I`p zi$}BF7~JX_763LktI2EKmtowW3#$Lwvpu;SNS*X4=h8G>K2l#K?l0ofIAAPrjHfqA z&gFW$VVE)y$t?m&=5T7iZif<^>X4MxN9bP8y-N{fb{!!)Ne*5tj=MT^~TClv7Fm#(w;p{GY<5yP;Oas*`=8dUodb ziwc|zWNvayeR?5$+Lu$$6?{(JN+Xl}*$BzyXC^tm(0z-KstO50NO8S zC?Cl(BYP_?#NwKSRR%)c`|931Wa+TF<|SV6_d;!@wsPA$zHoY^H?TDu=+G1L6bMBo zG9zs4%`r&apAm%3fj4eoyT;rq3763VjuTh6)}=9^k11OI8@EG(O9n`BI#|I0cPD6z zC6>WHm%A09XbcFU|C+4|>d!Y55m+v4qc{ek;7vwy1zuqir=+k7!b0g$EfY8l1G9i!d3D0%TU5%FY3#ti^bgv=9a=+{{lo!e~R00x_D6T#7mOR4W1) zb^EH{rXAlP);t`h*uhkQVaPFtBEeyFQkwMqjp5nps8>fW*{EC{@~0dNj7Q+ku_NkK zJF#2>5>?@cb{1<<4|!!Y#vDc~3E;LfPna@fDq4p0}&u!K1nI3WWrC;?fYrVV9CzJ z$;*Q?J_u*|26X=e=!Z5RwO^e~5H>#6yapGIREiv(xY@_c{MNl_fL0zh+se-f>6SqS zfq{%cwJ^X_G;T6bThzSyRwv=MSW#Ted8E+T6ktTRvTwH{MPe->PlxpTNHHA-22>=K z(K_jI4>)8{8hUIBWp-Y<_G|4g8-GEc?CL34C$@Y)ES%rrxuJPjuF*c!>tud8}I zz2Lx)rN0U8C}Ds3;hJ;j^=%@4YVm91xGrdV=>{YG4n*E~8r|(1g+kI+G)CW^4!}FY zZxEW-j#WPOJkjftD-Q74hwxD0ijIlh^#_rJ#Zq5G;Z+KmJutS}M4XU-AWwbqADNo- z`pX0p!2>ty)QU44hfH!CA_Xrqhy9|25N3sNeut$@=h5^hp?Qy`mqPV!Xo8RUl?Rce zH&UT7?NEZRutjm~jHTW9x_Pq)D6Y+R>eX@tfDdf_Y^-y~PVvmraWH=>{#QNxGd9Qf zCqj;)F5CSFf)vWvAbX5zVOQEYd0X0P1gmL4qW`j&$pD6`dumNe^!LYM_Mp{@_Tt$( zB!+B)mNcPyxT^V4MpFH({0>e&F&LawN$K&Mw~tU<2O(JWu9x8_Cw&u`ad75tN_!k3 z5r8%)%q6+Or9&gkc%#e%t$nc8XH}?RqbUbCJ1SzydKh->r%1o#nhpJ73L(b2b$vD) zo{;55wqG*H$<-+r+ogJ69oFrM9qaM?(y)WYXY5Gb9UKj%_QbyLSHW*(DJD5lxWLMf zCB=fMtW<|oDCGObA9vRYsfRVaG(8(L)Cyf>$T|Uynn`m~3T%kPmXU|`uzfOflh*il zN#8Xm289iJ%QEybr0(^49_Hv6L@^)#0Gn6I(roCkeOyvDqsSu1D~y%Z&k)Ei=5kwJ{#)5 zU4K&E?ZSIgcTcH^FEq??jop2XC^FKB^uf^_B+gh(F1&+`0Y2MkUvI&r!DS05` zxMH~M&S=ScdS=@4@zGW4FRjpZ)kbxrCsxyRcrQczmh{ffAMcee(6{4{HcCA=HCbX7 z;;(7W76VGs1|&NT_gRuGTj)}_9`EV@Ype0uQunV{3l*;EB1BS8(srl@FvQk8iZrfK z7PZX(N}JVZ?PoPFgK+d63Q(maid`H7( zP;pa0(QPyotL{ysn&@_{Bl7f0QIt2vR#+%n=UyVNvb5dP`>%A!LbSRJ%*AN{QH39w zkz?oW_4TC=ovrkRX?bgpGwyqwudIDvWVzE4XyRKntC*(SgTSnv>#xZaYQ!J;dFbU; zC?w04$kUXbJ0O(emf+=Q9lSfwfwLCI&Qa>KChiCor<;;qG%_f*IEfqu6W{jD6&6)u zDdmYyiINemKjmEMVQXQOb5R+(H4p&no96Q%VSYKrcNgUKZEey~lahlM9KCUE-=i35 zg?466iRKi3z2r*%|aFfR{{GQA%S=KTT9xsv~rs{v@Kw_@C*Mr<*cU} z_}WBXf)w$dipARIbRer#2#JR$AWzcNy@N(4w3i3T4_=00<^^b@3X%U=RFAHBB)KRV zRvYCU*3`GLuT^$qkw;{XehJr1+^vNOJ=3_efnJR-gdA1Rw)#`knVwXmeK+uR>rZ-m z`;pi6#IeF+P)QrgTp$>Kyr;Oxz0CbaWtH~mQG}b}1HXFB!W~M{#(~xKEF&qrm2_yJ z*8sLq%Zh9;8M3R-k5dR?3m`Wi3ebXIES}R`>w$!W0zIBuNbUyj`r?DvPqjKLqY53| zMj?1#)7`rn`M=0GHaM6I9cez}*lz#4NpasVXeP4h>1Q{Tr{mrk;|tCWbd~bjH)N$G z6KOcot-bVFq1;qT-2piYJ)v47(M5{~5!k1?XLia>Gd*;q(@{-FJmcH#Gt{Tch&|g< z>+Fs=Q$S*-2C?hHL8S=>^K&}Up6}B8&gc|E@Wmw?qNkg9)vI3bUw9Kje z;p6QlEw%zQI;rBqL#&_bUmVMp*0fs<+@w8CbYwliMcOv48)WQC>ye(rNLH!#D6|(- ze6fRkhQer9k#wV8(iy#kErkAFweKz4N9&}^i!|1WNghYEi+tg?LxyB-o70ZeBmQ*X zy!wb5?dK?~p62s;kjtS-Ds~V)P=7&Qm@R5n^lNI@{d5J%Yc>Dw67gFuKj+-sWQAcQ zYuorHEDR*m=?X9uyPg)k7&axnUK}*%rz@Naq7KX#mFL-uF+jlt`R`~mYC8|jJ;^mX z_um{>qR0RFsH3+o#eQ(3tX&$MQk+*vd7sSN7Ip*asTcF)Mp&Zl@LP(%E9ZH38%3pE zcfNFRqfP4*^6eDWS8IKVJAPA>rXeL)mp^8=@Sh|#P-j#9X+ysulj~%gdGO|`qDsmI zmqMMPS&)?*hYh4fd1%8~$xgOa~v8${1O4fCy$pg?| za;g%`@a>IIw7=Z$E9<`Z7Va)g!BXKTr^%BmI-QgWs?CwNqyFC?!}Y#F4*l z$kw)(^Jzahy{^zF$zr(B!lL@_qvVUG?&O*Qru=1>ZPpZNHu&xj%17nOdR#`vWY3J= zmK1gMBQM-rYueOxuW!%gdkDyG)M|UBv|OBlkjRvh&)jA4q&ftf1nrPO07 zpJWWzP8T(5K(aRsz088ot8F02%fvh}?EYhocG~cr{(#T}M1L-gBIxeV$chZVPmlF4 zctR)-P$**tZ5$T`8#(%ka8dO$-ySV z=;D!tRAcScOSE|BMrEY~|LHpj3KU_0RANTaK&J7CQbeHC8W@3AOlbYC71NG5s5?@r(e3Z3jy#MsI z>*%Q>x@9~aY=xJ+iSm0jC=KM|K4Gd1=e*6??ya-6KHF5MqQkSo3)Xqx%Zra5Z;mQ=K;G=RN7S#Yw#fWi`=`;S zlyZRSszK^LZ8ihNcm5GagU#BPayH_O5TqMg1oOHcG<>&Xpt1`;#A!R>Fc@Jht zPgvz8?duC>H;NQ;74^^BH_51EDADLC4~^gcdEC-2Fxs~_Ms&Lqv7mU;8smI+` zw1=JS}xkLHP%X^jI8D5=E zQE#m@U6?p_-hZRsgcb0!Th-F*`%RZIo$wZYUUHQ^^9V`**Yzyy**d+}q+8WYpVq^P zi6LlQ0M&o%gbIPz-}^}ZT&h7` zaEL~D=26MvwAOU9CuJjM3Mfy7lS9yW=PEi$(clj?*zKRPyzT5c>W|eo$bPSLKt5+z zMxP%z~jJ>C}OOo=gV``HZ^}Go~+(Kyp+vV`Ma@mxO8EwWyQSn{iRLc-NGW-P=n* z24+XfC%*DPN*yHw5!FHX>j4&jIK(A{;BkN&RVq&{ZjC`uLy(>@vDGd(J9@JNt_ zJ(0q&ND%ZO5G8;dAsuALLy{=c9PYuYun2rRB{VJJ@r}I_avyYVvaD*3epen$RbJaW z_s=3}c#Qzuh6T4f z(~1ovekqJ`9X}}{^bumymrqpVNge=64Ag7tlgLC8gi2Cm*sg>KsH);*Is?MSAl~Io|QUnusC`Ge{{nlQ!2e$uLYa{K~ac zh3E`-K3h^?@^L2r6Jt$+wo;%XL286I>nYN?FwR`-)BRD?5ylmgIqR7Fg|VkJV~oa5 z_Cwi?FWEdu0siX4XGFu9)`q5nN6RRSOVwgH4*`r{aD0bAf@2$9Nbji9lNW2OVV~djADF#%*ztRLxUL(OA7)X_Stx04(mueUHw%0;pGZrVH zwT3;1{EZWo1>ZK#l9%<77-`(-+eb`BaV9qOC7em1!t8rx6Ep$in6;>}uc~|KY3wbV zU)P|{tSkKJqvjQio0&SR?{D_lCodzEet!^~Z&C7q5u{sLa=dHSX1JeJpil?Ct1(4)irl!ij`%5O-7N^Y+fMaQ!S9_hO7rXr=7d=K1&q6G6r~q z&5Y_tPY(&76ETgVj3(O3^WSa(dn>CWume{nj|$`j-Fr>!xBWb;LZuEF#Ur_B`w0*?A?1>5)7Q4 z^0Wv-aIGt7@HVvj0OI+iEobKlk|Oj0?A+;soJ;Q*|3->&~kERr+BBSlTboU zrTc}sH!*$2xeKteKmFY}&Q9CaT@xE9MA~AT#Z1}I-^vGs4ct5I>WdKcc76_=yO9$t z*s-rgDE_5_Ocapze0eIr(^LrK>HP?G$*o8&_}-R`tUxba%D$w2I~<*gNT?Ad*?)mI z?Ey(Q_Oaj7>>)8hy9y$8{GK4~!%8GlIH`~&?|5f-v zul5#wrgrUh0-8!@h3-comZ(I%ZQpP0lP!c6Q#PV5W&c1wbpv|CDaEb#rw0$I1g4QBdP2LB<4 zf3Ss3&=BB$bdw(meuQ|DGH};^zyI36W??!}z(!-zl|M$d)O=X4R%e`LKVVNB9*DZQ_*#XFjGl$ zEQf%jdc>=nNIMbK4m*M**q;#9n&7$}HoKkMh$Ro*k%J>|jRdGE4!F*x3`9xo5o-TZxVQXe zT^grtp=(E7f)bqf+^!Ri>0KZjvM0SFK+L9{TnU8_kk2n%7E@Sgy*Cme!8dPVdca5# z8rdRezLO*qrM^Y>_jw?@km!;so(7|a9!OO!eu5B!7muYGu=gAH#9xU6MGybm zP58bmeXTwfhb9Z##1`-qcMV)`+BVf63}Mex*)U*$<$GL)tun}eT|{(qLj*4 zy2XQVz^T0&1_U^nz5E87O`;OBAO zdvB?f4zK;}3QUkmFV3@uumUgJq7;j*fBN(uZ8_;D4WhLHE0%)hDVy|-7~LO9B}Lk0BTUze9QzA1xc0a96aFzG__~YkqIiRk7u|T3ucI)QL~MFqT1Xi!m_IuSWq} zaev_vvem}d059mDxZd|g#9+p1>@l|8WLf~=!t>`%ZDRpqpjF_NBhFIf!6cTe9Fhy8 z*kI3AoYf8b{CP*legG=27qEL4sCVq~fVAS2&8UbH1LzUmHMp3twJeZna-;qB=Zw?s zDg|_T`$rU+?JegvtI!cEeOb}}R24w5;PLYsQ44LTHdd2I7Lq~6)UD*I;oguhR3p%@1 zNP5A1i(JJcps_aAl?K_Sk81C|ZzvsMhv!t1_c_SFa}DYf;054}HNP!Mo#v`rcOc(q z=+wJY^g@2^n!o%F_uPF{f&>iT$5&&1+uvUvIyIi#8%tHQA2>JU(ypf^SxDA4ku;mB zAq>E65!F|!nu&Ztp4AvU3f^yVc(8-9t7D=iStbB(4(0nUPQu2;hNBpy%M zbU(jpk_m5#X#9)~=x zS6B^qw*lMV@E?K1-e&iPj*X~2j3v0yO_#9cr;f2@?&c==jpPYKM~^$!TPhmckkOUO zb#fguAo4&?;JBe`vBhI;6Ej4c<2$ER_g3u##Nh(Rj{WBSx_G|@i)RCcFObI-CPr>8 z!%wPUvm}q30;#sd+mA$NH;+=t5gw%Z`tx1pZoUTn-pj}R&9oLS>tzRUcDbqW#lCN&q zof{!`v)i)g+-&YbpG0#t$5b7!;zTFvQwVL8P-{a)8;ek4v+i5NoPC-a;qq!a{p{&F zan=nIv+H3kAIYw$XN}XJiN)H%UYQarr^frJUbUYkxScfhK)80K<~7BtXTJ8o2e4yC zlUSgloSjb{AAD(1H7&e$f(2jenKZWYJ~v?N>_Gd(+7Nm~PemR6h2*T5SbVWie_`77 zU{%&22hQ&=bfjL%Ud`1HCs|rv$CKd=)os|5H>^KT-thpFe4`^;5BKRkv2OMzjL>rQ zC)W<5PHQk(=uu1|%Qcbia3GVPj8i7eH4io&U#VmroN{9luQF#}E3&pjlB? z_xpeL%r46kqR;P01`jh`Z_Nc>)fvoUYm|m*JYoiAQpZlBeAiaD&T{D_ZTK}_`OpT=DGbkHNZjLRO}E=Kl-Kg1+LT2)Dv^oj^s?B zrta)Xg!OwF2ClZ~wnBtO>0SHEv%*Ie1toGQ8q2x~8j(YmitmriTPSu}FtM0j)PFYn zFlPuBREX7szB-Y#nCl6p%bLd%au+g(&uE)|mwSY$D1R?5=2t8kdt`b=zv+c_MNEuV zpHs;R+;ik#UvtD34+j%IgP?PM3NhWG^Vn3qJGVO|c!>a^YRmvX9f*S>UN=Z&h(1k%ayg088SHStn5Bc}hM z2P|=Ge#${!-!~uQ|NKk>O)uG=KKQ&`1TPNBOtH7u?`qorrUYczMgH+XA z*xett{o;V$xni-Iw*GqGgoRaXqGbQ$cz|;&6g@fGrf^4T=NmWb+T*{>5Hv|45k~Tteh3TE7U1UO zJ2WPzP+#u)W@e7~E{EEZdg2cKnpP`@1;=%Z zrf(Lf7K)z}3qSDTQ)ue|F7EDv3|jl#H)+PUab`o>maLup&-U;9F7AFFcq;fq(~ma> z_^C&o?F}wLrz!@<9y#Mwo^9c}7b>e?nj9wZofGtU!)^wR3dZK2#Nek376f?s2Pp_s zASo-)js3DZ|+K$$szy8w!26AY}phjbpteo)~uZX=R4ZHL<@7(EU{lFlMrp|4K2CH5zb6; zxO2hcl7EgcPUnem7i(|Dv6!UHA+lCJv70(idaQdza_p_jO0d0JP4lHEU9_&!%I@CB zuVfqgLa%i^)m6iq5u9j;_kCi26hr7HUNkNb3&w@c)_?okn7>fTC$9ur`shE>9!zL( zIh#y^>90KCXS!lx4I8XA34`3@D8`$!{xY!T%GRa4%z(t_8DN{I;R!B4cnH08FA?t& zVoNW4s8NW0Xu7SnklD+?X~Qns3A9ntHO>~aaQ9qaS@i82fr^%Yf<9&zfDNM*8>wl` zMyZ#*a{D%QUCW_nd{t9yqdn&-4GnBon5K%D;Jo8su;OgHt{nI3Q~#N5PME;eN1iqK{i|B{Tg61Z!uk^z zn|4*N70~j|s!$YUO_=f(Tk%neCx!Z3|t35vpjukdHU!^^J&1+E2lSx3;u?hmvtH9ch+yLyw!VSR%u{P2}*YT%AW$S7EhfWF=5l?-qLt;TVqB5>RAp))g2Yj84Ykb-l2j(u-6#1pwBE4 za8cR}A<{m(gN@Q_{;5%w8I}Mc#5^=cs$?8t7_loi3qnY(T8{C(5p6>B_kez0&7BYc zAuxc|6C#h&iF8a?h1vW>s}3RR(LO7kCVzFpNfgzzE%vb5zJK8KbZ$gXGm&=fERt$! z<&P1^F`z_6cToeT$xXyYYLyMyA*uX8osLoISG-(tYX&b`wX>A%-Enb72=0luy}7Iq zLVm%KJAf|=dJ?rhHi*R0*6;pS<^!FT4)*xqOt&bA^1)l1vx`-nR)iOidJ31&th-Im zj(vBtHuC*90B1KUJV^IM6K}3B6&m7MK&ZBXl-Z z^vG<0N$F^4u{`o_%s(?VqQjXQ{knPBTA8tcATth{O!!mSyt%i5rk{v^Z7}jSgQ%>(@#%Yhs zF#-VaeAQ+JVe>c6uS_qg}-LLt$wQj>R7+_hb=~C3tirDmgN>TCaklwf{W81Y%r1roo=n zPEFJ;Dok`7tJXLe-DmKxbr+1yl^Ua2iQ_Cx{2Q0~$}N2isdfnq04-T*d+dyY@N7}g zK#M<8mHar1SZZ|Msv*o+G;TVq-RRpH(CRA%;p0nG6+zk7dGzLtc=ma!AR@k^bZy+b zd!>2Tg(pa|2re=AL>ABZ&CJf1oEet7;Qh(f{bgW7w$0}Y*+;fI21QA(o9SNI<`&mA(u^@rQ!9(AG2k;n4{pV+`kxG$DSLOH`!1&+C=Ze=WSvm63AKk>C=tt zG!=!BF~-+IQ34|b`CkG!A#U4ODR#D?#8o1B7d2pUHOZ01|}z@$I9+uR3i!`S7gkkJ@2>?z`=rH-x*ZK7b29 zxlWXi)s>zWq@m2G3+Mq1j?(=i%_|%PypOrM>9oE1vfr`|xA>RQvX{bk2RyRDAI%1Z zTjHLoX<9z`u6hhf@`x%FT}@Qv3rliVw>ezvZ@>qz2m3EW1P?A$=F5uy{%+Cs_caR| zIhbeJ%OmKS#VISLa0sV^99w_xlWJ2DlRXU+HjA=JpM^c~ILJD+?!NNsrK10clquI& z6<+(srrI25jLwV={tVeub6G1=%PR;P*qO87+Y9?Xy1RxT_yaVjn?hm>5PJvNaHis` zdx>-;(H~B2M@dPP=dnu;RkCCAVhb7rRa$N>?bFaoaFk_?cX)aoT9f&>c`2e0fMl!| z8PsRj)#k|2uq<~?+R}|_W{>dle~LSc1KEcY0y|V>H`D)6MJBRl>|TQvILcfyLG~Zy zrzOBq;UYk-6gIDVhZ*;}d;iK#bg3?4?%B2yAtrM|bzK7Q^&X!^?|-Kmz>X zL9k>^2kyb^gs-w2;gqXhXys>bWbDMQsx0tk%^1+l)b&0jMS!Ar=a#7Auvubfd&+gM zzx^YI`J1E~Z1UtjHu|D{R{oD%a_5`cwV7)1O530B;xB`#8dKErs@}@%@8|p50g_ta zt@3EcCkmH+c)#t_hucs*TCFFftkoA57kQ}ohmilvgB9G-Jnn}IbVU1?jgE2=`==2D z6K?fKuy2&tE}$Kmr!1=1LM1SRyA<4p&KALdJ$Fpbu45L}jDDGAlo5xs3 z$Ef_74;KoN9`Gy6N9U&nS{H`=EUL4}6IV;-UUd)mKkI*sgMWX^(#$zJ$#JCGf^)}) zq>Y6e=|aZw(W~!HE;@+R@fcEmg?z$7vh-Gjm_JnV#jt2VOJnJ z7+HX zu3mQeaUuMfcPIPufSM0cG6yAO&eWota!o(0anhu7>J-?49>^3gJ7+Xjp%$giTpL$r zSur_nqlppKjwiQZ;Snb*^l9t6I=h%0ovq99H5-LnIA-jYT_m$%%acUMEwJGr;HlzS9%51}!enY+1c zu48VKOYWD1%(Ze!mwmsV?_cr#;d6dCzn=4Wp2xXx(NbT}1I1Gc>;eA~A0HnAfsmAx zR8&+{Q&ZE?(K&bSoVmF<27_^MaBy;R`sbg2uvqNl$B%=9gCip&H-w zO!;K3D0z$sKCu%nOiF&+3xpCT+p40VBTn+P=M=NzUDr#6zhY%CQVY9Zt6nK}>82L3 z-e~{RlYOzWxGzip@#<7}<@#eK!)Rm-UooiE1{me=~jh*SOuUsC;`zucVQf4_^Kr+QMn(hR7(TCDd{j80D5-C*l zSZg;a9~V(5rz|9Cn-~6~S5{nEKWsQ63epC*SjnR`cnH8CzkFus;PXwCqy?8A58`p3 zt&V9>w&WrrV8bNV9w#5d3xm|i>?q{7(na{ReaE2)T{|G?!Zii(@ey5LI`-Rn!Wayu zkIoOHKcbjHByDTxenJZADR5ceIW%PZBH@-R%B?O1E+UJg^UApF=ED_FrO$wHi#$dw zxz@kEA zz;(17JqzFLuu*q}}gGH@;T}d9;%xcM}4y@K8B4jQZXKMdaVd=rWDj(r5evO zdus4@%~}m-gSOSFzS;PFsEEP4zeL<@{2pP|*~NgBqi}zq74og-)|h>XBYQMmRE4;7B7hSdsDw4W?Ym5yV3u8EDqnFi)Mq z101)sC0@HGgWXA;)TZI_2hKJAlm4xwr`FPF?&_@Fo~@m)*^H(3{%uK%yc6bdLql<> zu+`kwOv)Q^5UlG~13QG3#XaxnsSE=hVv*}&Fdl8!AFGP4xq)`_Ms|hJ*J9t#-N{!f z#6uW7#=e}ub*4^O|o`1)(>_!eEXmx0#jPaquAaaH_m5uC$Km=P+zvLw#vj%h0>r%w z<5E^{#mW}8L?vk@c&5&twoB$b5C3_vd7d4ECg)OSA?01764OH!T?B?WGq0W z(V&1ATM-p~L-*Pn{9O|Oa#zDD{?DH@T0E!OU_#x?_tUh3^Mp5Hyf2lZBKo5| zD~Q!l~<$jDuWKZvUAo?uH3OuSk`|{^-0!01DMnb0O|5L;{Nc6xiapu zVOnHt)OMkjB@95GTFiCdDY(kfb@&U@RodQGYA($`)I9M%B9x?dnV$+KL7o)6bBK5P z>lK)!vZG+Rqi!|w7w&yS4>hw<-AxU}>QX68gW0dZEq+!JuH})#bW~2=Idv(*9e1U7 z4SV4@6%XU4JgN-(cHA88j9|a=KQ6{cKMg9ev#Qd3b%NKgyYeN!TJZO3FlNGJoszy3 zGaF3#H+;DcE?IWpD`t!C-!z__YBc`ai`^9Kf9Qj2x&B_`C2K97DAo*MwWYoprPXe= z!boxa-<|3nP7$0WtsYdVhyh#vW)Mr*zFo^sIIv{501BZ2x=&6FT+}eVqgk2pUCGmG zkZ(Ti;yy(oro{0Mb>0Zl*`|Y3##p)B3X&4fC+tLv+RMHcRP~{lJK^U4eT9cUE96lO zMJHlq)de)SG&sk|q3l;TRVrEC_hU{yeIJr`!dc4M@%gFHB8|C{y=`!85;;NsJLKP zhl6MPo60T;#s`Nl!sFTf8Lpaz)mP^)_!SNt^=jMSTE^*dq6$QCXa{9_o8sekf+TZ^ zKzfa~_p#_We6@$Sp$f%U8e}S;v|S>H1AI1|&U^GTYb5Bnx3AiHE@(1EyCiL%B%ae+ zua1UEqpz+c7cvCtOP2k=y!g-mJQ^j;h8#2|i^$Fm{-=^pVLw&_QI9^YY$QafDmWvW%O_5-1cn0SCXMijrJ|KuZX z{n2KqXB4giy!NL4zH(@?fClID(PSK;t*|>xC%9;o?OHlzzqxcF66B-XPYFZz2!cU3 z4(0MCRG(BNo3b~=j|7iHMc4QdfERY)U)L#-hKw!sR1DSQ1u55roc# zBlZ1ZW_UmW(2tHdQtKDHEFqi+42}i#Dp@2UeA6`%#o;m+i03Rr>5UiXJ z?);4iRRW#rqC^#L8Liy%-d2=F%E0lU$?fO*`DbkIS=y{bzGcWDv>ysHK;gVdS5Rrj zENUWL?ecYrq=Ng>dBEAv&vPn3zP#H~d;t#g;PYktO|A#XV`p#==_RbF(PtT5HKrEC z4t-GZEO0)=EIKA(8|S|gdfNQqtw&mN1XQtjYym-1bTB;DNKRjIJ! z{t#UB<9s|eIl)g+Lx1J^%zi>58@zTp>Im@CZYauMCushaMA6qX{$~Dqx^mz2L7Vq4 zHa?!FB%D7f1)Ir~&4)npP9EoGNFo5h=o~;`%cG@I%+IA*+(@wuOtH#H z!PKXm4+PayK~4U{a(41?ddl^{RL6`|rw6I`+Fk>Lk>`G(48Np85OQ||)9z=adDf?S zji>qiNb{9?<9$wtcP`q2?I*7ECaC^R$oQMEk~fgK)SFUiFLab^9;HWTq{r5$$B(Bc z{zy-f%6N4yqv&eF^+(TAGBPsjGqT4sG9EmRl*%kPmsxltvp6u5kdawhpIJ7ZNmla~ z9ZU{L21V?$4!LLi&9<4kmh}gfT7FJKdeD(~@I}a@XE5JvxUai=1t^sS8V#f5^T0#C z*|0o-yqo1$p-6xL?IkGvqt-GM5YLT{yFL%_q5&`o2u%i!MRPwq0g9q??z6$fMSy28 zC(t8NJ_&Fq9DWA})vI&WJ|=#ZLUHb)x>c~>qQNhg5-aH_X}SZ1Va^AHK^r9Co+w$w zk%r?h|Jlw9tjLFeAU_Ul4$SW=h`}o+A#qvP!Ga(LXmSCpj4p6V&iB_zO?@7}n&ISj zFaK<*guW9>E~vmBd>4QOk9iiF1-&~lfztU>;D|4LqWBJ>5OXOr=W+u|2Bs>#RU~Z} zf7Pt$UwrsHq?rDy$VaEpufhZL&Gn6a>tnZC?!vntiLL)lP1dGOIxMO!oQRfN)a8g z2v!4;d7_jaTUK34WE&v5J&7Y2VrxTLvyzMMLiSj%Q1^kJCs3ZEM%R3B6f@WlBFlE4? zq9>Cgz@pS)Dh{(sC0S*&tK}UK3c?yWVnCHruMkF-AEHrIoynTC3fZ4jB#o+rrK)g) zE6%V;tEClsg4B9@D#?J_en3XYQHY-92wFKOh}7C%Wu=Fvel8!*t$Gy z**)vJeCN6^1`XKBIs;bStE}p4)(vT#>TlBZFX9^Vf-CC;t4{|v7}9ET1nWhd8%Ugr zDjKcDnYJ2RpDIK9y4?V>8km!`lAkrcL>lF1<1Jc!7m+lm-q^-!8s}mgXVn|Jd+MIC z8iP4?m$GUjI8B`3W<+v*epYQgws8&H(5znZRlRvEu5yXkwBjsXzS{UBu4aQn=3T4b zQm_1OSe+W&vhUoG!l@AvssrL{M`h?)I-~?5vLl#W<=n`_Y5K{jR0R};J5$5uZyD*Nul_}96DI7tt*>GI>oca^SoeUf3ulrf*JF~f=U zz>6wdX$`Bj6eznd| zRbZ!j4MGNvf_;-V4LgGLFy~Hq0z-({UcA;a>C$%*TeU0ObA{G5r@_uLYL?u@!&UZugdPga+5++k9<$KlJw32(h-fQ-iz-O;R}n17-be+3HBIA!KsjDa{YE z)9gwO>a0<(X73Ozdk~Y;BgGlE>ua_m)jN;|FS`!QB+%8@2P8sA&~jbJFEyGbjQqA9 zHtQR{?Am{pF)|!7cuRBOi)=HBG(rw$F0e*Jod<4s4}b7te;2A&TOX149u1QlTM`;^ zlVkH6eYm3e5vD#AYCIU@U3)EubyaR$Pi`!V^zr2U=vSd`6QLezcDZ@qaDr>^z2E(< zf}_!)v{l3Yi|gYmITK9>%sp1^EANl{S>rLZhOV_qaoS{K(^%5)$>W9}JA@~nxsD5v zrcQwqLhF=wO|928Ya0^Axbai3g(sT0UXzUY@vgpUUEwL5_jp#*$Ij3h8mF(!c)a)b zgaT>!K%@Sq;B=qd?5gqXOU*$IJma?YSe)>Trt5GIZTjcrIB;@i)ToKoJG+xJwv;eA z8a(GQJpk3167BE$?)pLG&m6;eMkZ`bsDH*Vdlcc*t2;lKyEdz-UJWs+zz`eNd;5)Z zIz8iOf5_G8B!0M)(2W#nKKEy4%e$^{{nN?jnf}nlCQ?5!WU28SIClQ?^ql_2 zkiFZ~jO(JRV)-=j6G*Nz-l#fl%lOxL;9D?L=j2i(srk0XqN(ltRkvxpH{-0=wDZiA zE1BKlvV_SU>6cmdOPnWZE-Z4frT5D|M&vBl(3V3?=Cw(pdbV>s&2*^AsLAw z;7`R)Y&6`_$eMLG_o8}Cs#wRowS$$&;CZBg*mZ&D2V(Y2Z>1EdM z&%S+}W3HX?8hy%%gPGH_#L(4{?1^R{4y%ciCeP5$U1PYd(l=JSr@vr-_g^qv{kp!~ zE5FcIHdbX!Uud3P{4;gJMC`b2y?WMCo5%u_++t+RK9E~YC$A105^0H_*F|O~!-mfM z*$DMo=gnEw+E{cnW}N)J^xS4kuWw77yB?poWp3LlXu1r~o}o@`el^+FlxIU3U3}1KRY12Jt%ECD4RVXa}Ov- QeimwVR%smuLBQ~T0IcS182|tP diff --git a/doc/salome/gui/SMESH/image25.jpg b/doc/salome/gui/SMESH/image25.jpg deleted file mode 100755 index 4b2d4dfe47d70a0b36e26ba345664836fcdcc6fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmex=wkpZH5*GHWn6E78W*ER#tX4Hg-+{E=~>(PGLSiZUJ!-2?;R~F)>LQ6?sW%C227+ z1#JZ-HFZr*O$j+&104+m6%9>wMmBbKP7Y2XE-oQ;DKRN^lEMEYjEfi;7+D#?fB^~^ znV4Bv+1NQaxwsh_m?3gN5+aKvDZs$Q$jr>d!psWv1<;sUpd15>Aghp~p(C4cU?RIx zp@>oA#DyHnP8$!323`E1Vw_ae#K|QlE+HwUs-~`?sbyknW^Q3==I-I?6&w;8 z79J59m7J2AmY$KBRa{b9R$ftA)!fqB*51+CHEHscsne#9glAUcUPH>GPMb-@gC&`AZP! zWF{6CW)^mklNp)HftXp4g;mjzO~^5jJ+V+&$*7S-#A)KfjR!fEje|ajCKX-e5>qjG zsQMA)YOte;b8{0}j)uD#?&SXm7z8;OWEf1^(5((%# z+U9=7?f&kG^8>>ck5_(vO5~w3+tl_DR91cbkt&DwthX)?}Dqse4lSWkg8(u4OKZmm6OFx$o<_lwvv6 z%j-?qw#~ZXUNC`8DDu=(v6xK)2ix5kJtW!NZMCC<1Ija2oSr)8=&{z?!h9+F_Vua} z+gpWR39>u*?6}?J_@5zS&y(6)SFicrURd+$>0ML3_oXT`Zog7CI`Q804!8IzXN|l4 zdk%U$zr5Git8=xYSNKKQ?XzQ^rR9HPz5bWSYWm-g`TrS?tzh_fVAp?!h3!HA8TRS^ sXZUfILH>q#{1<~)@!yZ`|IZ+`fcZDm>wj&s-v54V|IhF^gz^7P0Hh~}fB*mh diff --git a/doc/salome/gui/SMESH/image26.jpg b/doc/salome/gui/SMESH/image26.jpg deleted file mode 100755 index 3a02cb9972e4dfa7fb4c24b663f1cea1c8b1edd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6922 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 S&Ie%0{^wHvxAX{yhW`uK(B>Ne diff --git a/doc/salome/gui/SMESH/image27.jpg b/doc/salome/gui/SMESH/image27.jpg deleted file mode 100755 index d2f32b1848125e95728d52dc90dc6dc6c38981a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15997 zcmeHt2|Seh{{J%uV+q;!C6qnc_pKP)5h=2jBr&$J8^oY2$zCYLltc=VB_hjMLb677 zM)oXY9ox)*&N=toTb*<7Jhf6&p==DXlv@8k}5g*(C=y!rIq?N9QVOPxF=1rSDnTL3vJDH$m#IT;xlgq$2g zd6bHhf`XEfmX`V`D-#a>jFZ5PnZ4>9C|n6auG98kkLc)&ym)dWBO` zv9PkSa~wY*BrGB-D<`j@sHA*GTL-GEr*Clnf|>b63rj2eYYx{PonX%1KE8hbh=9PG zw<02=qHo6}-@TWTns)y|`s17@xli-*pB0q8Dl4z3d|g%Dh;C|bX?@q$-rLvzabWP% z(C`#y`t!`}-2B2Kc70=WYkLQ`yGKtvG6^Xum=yBkkwGN>#9uHyDcLb8at5t)5Iavs ze(5j@rqfA}N*X8yWK7qXuX^=Ru?Wge9moE7>Yon%`_3Hxrw;x1Gyna_gnEFU0+a!2 z27`#Frw4)QL4;x82pB|s0Mi2+z+OQp6(9_tNd7n9L?&F6uct1i4aXJcD7L@Y5M@v+ zbs{M~IG)8r08rZ*1R%_l0K@^jYpIAJ{LNuFo~#uw3m_XUr&jmqV0AcFUR*bb08lzc z)y=CtB>%PJ@un@PI~YIfp*lww`evIMd24`BHZjgqa!te-GaEBZ~62|Zn53yWpc z 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 gL*SSmJBUk3{$)q<^(aUjbhlF&2TK6 z<5;o4v0{m1)r!ZeHP5veo@=o@*V59`<8-da>s(Jy&lIn7Q-aP-i8?oB%9J@#=jJ2> z(X~0**XGQbvo!nK(&B4NtFJ9xx^!*zwY4qR)~;Q{#$IczQckbM|Ysc7l4=YqG6D;ejdEU(23X+F;R(?OGML0hN0jgQ)ib}$fkr>S6VuS zZ2$ePl|y-Ywr;e>(Hk#@EaN0C&C#d$|2WN^EbBpiC%vRmsF*FKNM%Y#`MGy-P) zT$7?5r!E#=8w2V)C>+BIqi7()sZF1D<)_%edQ3= zugbcRaL^&?=*H+d6FL{QaBQDzn$q#%_o22MhJO1r1Q%7cUlUVGsSudn@<8mt(*Cd+ zw-TJ%&hJwWiEt=N{_%mKC8&4C0mp_T3{K1we*ddI!kx?;a4?`NR^VcU$`|o_IiZaX q4IBl%tW2B=AyXGLJ>U%w3S-jP#>lCaks;KkGA-j#rvw`dgEasMFyEU1 diff --git a/doc/salome/gui/SMESH/image30.jpg b/doc/salome/gui/SMESH/image30.jpg deleted file mode 100755 index 997a36e35922db8daad357a84fbecc83e0a76a45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30000 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≺+p#rU#-(8ou6cR_>G!4M(NVnMu#%&@9HPZVlwq}Hd+r?Ejxa8UgKMG!I&MdvQI0@^@%ho>gP|+8Z z>hhR(o3Y7PLcZ*VQU|(5IZn{3KHhHWZ3&=%O0E6;jbWR+mTY%T;+~B=?{$hL z+plox$VabyKO3u&1b!blP7)BK^}e=QcFP@6m#o)O;6!jQzRfX+ep}>bw@KZ^hQV&2{p>za#w=Uxlj`f-{s5uA&O5-*r2pWK{8Ec#6G3!Sq4iZTQ)J*%zP zkk7u)FRcALdX^u?NFT|AWVM_+Sk^4y6_2ty-@U|g$LyRW$ulZbm z8-pk}&dGg9YM^==s1@fz1oAmJk*h<$b16)}ocJQmuKB2x3@{JZTGeNjcu8oG1&~95 zuorZrVXxI@?fMy^=rX7($2#6iyr-r#zCD^&?l#ZI{pTKxBmH5?2E9C?QRQ(#g{R`5 z%7&VvMQ*?H5K}Pu82O*=4ichr3w%`w|yn{)@(?YzO@L7_G@JUiD*S zfxaDF;Wa%Q4|fC1QxJF9xFE57YdFA&`AH~Yh9=kL2Rxrq=5 zKmSx!)z3L16sJh+chp zvbPrBO8o0?&xbc(8@}qC%3Vy)ui*r^2vE%?8(eZO7@JBcz@gX~ZNpSXNwywCJz&!o zi(pB~LzKyA?v4#$0|~Ys{#=B?oy5qq10p_Vrqlyuh_~cV(EG_$al4x^fpeurr@~&e z&+zQNDi15T&+6R{3AQin41Co*GOeG+M&litWZ%Dme&FBMo;pgvmhE?-aeask;mh-) zX9zmWxvmtXft8k`s}*a6^xVLiNRhe_ytyV@do&hf~>GeAf&5oNzCVFQjGL^9}#tR2~zuTI@6AAi!EIU?`P ze0o%eVFW)`i#}kNh*?|Wzn6W_zJqI&h{Z-%YgZR&Aw)oQcLHlr$k3B#kwtseda}EZ zN$evXcsD&!6xr6X28)}%L~OV6igg|3nhL{TzXCIF1H~z%jQkLMq{6+*^EV?5K+(&U z+!2ao?61%Pg-B|1gziyhl+cwPZfb=&es?q8;fO99nf`7}uF*-)% zd710EWB?`L5G2$h5!m3Rsv6!qGxY9l;ZcwKTWvVmiX*&^|0^&*n>8a-nKXTe!zHn( z%(e91;T{Cr89$?VtmR&5`TMIEDubtgf~p}H`w*mvaMN8*Ow!2#PI-i96gj;j?tKp)m)y2oIqrCCbm1_tlx;0Yj*QA3V~X-ytSna z;;XcP_&a)kR$CACoEwPnrgJ_N;vju%%dWmPUwMMX6Z4gjtf$J)8d2I9a@0}keqZ~+ zLu&E_6lpaT)M$!-hY z=Y)!Dse+Uzyy=9J*$TD*2h(?YA$JD1NLkN+#B{uP?-F^b?c>4u=Wn(QJD9R>^-in5 zd;3ENIbG^E;ZcLp?fk+}%_h4_a06}XqBIf6T^XYrXUviRHEP1e*dWa2QD7=%UXhpA>%0+0xv`>!~=^mHi8(3VoS!ZS| zPT?EZ5>C--!qfMb7P+~yHlLQ1+(z}Z`KcT{8=N2RVtu5bu(d7TAt0seHRMyUWkH{R zsyet?#t={ErEZYOSZi|dejgy=1zjWTMUR3lsfOIp8#Y!B15iSlTUy#SpeF)>T;pDCE&5Y~U@5`0B3U|Eq{z-D- z8;?fTt(H>~;>gg$m^mTm$C#t1>Z>fR^y;gmp5!v17oby{6_b)(9?h3`tKyzF3AM9b z>zIh~iU!)iY9jA*P=clgB5L`V=fxclw3;S?@kDv!(g9d3PJoGLsi(zH1)(vqkD~eH zs6eBt1#=QV6?pXPn8N0rQ*R$n&4wF}vKN}d<;vxTZdd+jQD>p6SrUU?hs;3CMs$yB z=Gdf!Tc-@PTER9CCBDX3epxOTqFzc|wMg|e)G>Y0%@n5dAvG&{VA%7q%fGYn6NBYT zbZ}#bODk8k+w8=%q|HK@4g|B1@WlIwyy$zcT4XO@ z8IN*~6<1hdLOqqIVopu`W7s)5_MsQQz8KDE%!-t^acE_FLe0dWxO;J}<@DlGq~Qj2 zlT%m*7S(|%lonPCo8t#KXCvp|gId>#d~fb%>4q;vge4s)p4c$(kZN@V_0Q{9&4p~CWXAvZ0kM%}&W+=_NI`>r-;Sam|&sy~6ApU7mv{j}kB!rKK)i~S98ms(_~o}5BdD4|ktwEi-E3^N)EB*r zNED!_=j{z7E@>ipA&{-9p3)m&eY1#GysQ5klw$qbMB_4zVrk1ll#-q|@4W}2j7itxjX#ck6*=-kul3B&M=nHWMUGB{ zuy;7gAMk(kBDDOqr2lgq`cr}^1FslF4PT*ki9wUo`X0iZ|I=3a=T7kd`dEUMBOnjC zV?);)0ayWbtc8yyHC+Dl>iNHL?fc{X`Hy<@|IF&yJOaQDOm{u#r0`4+2Fzr7Y||eH zGyDZI=70C|f4U|C1sK?FbzF7oMia1f&a}2Umfr{c?_0q9>*)O#pNLV|Du(G{vj+|b zq+67`gMPN8M~@(3X}>3)ziwmqON9F`o^p20$H)VyMNFHpg-ed_Hg{P}L+P#sIq|K9cg`$zzKEp)IX7k+emiV?iC2Swo= zi&oU1y`9DPRm~!n?^lxHsS0MnxC=gl0D#L2FyInD1Kshf8apKTHxjgfNHyUn=(rO& z{_DHZ4Z!!FcLsfW3GovY)k# zqOriAlf~Zx!M@&`nZkms5XYCm$7hF*{qNWRM-AQeq~9ivZ)}7Rf0Oe%(0?NYBG_j@ z*7f!M|MTh9F6r4X;!)#|NU*SCHOQX!R|#GV^Y8b^JR@5D9k%;D-TXI!{D1x}gg;0B E1Ng%vrj0>Dskxx3*l{x^?T`y?c)xJ9h5exog+1 z{Rb->B}PMF_=SKD$V;HSz`(JSL7YRzW5a@jtXx7`F()=GJlrmz$iyHJxQLN~oljxK z4uOWoZWa!i2Qw}_c4uH>6H$0sxX63DsPC*l6`LB|S~-i`*EYhY9=ef8$&CzS>U zt=4x-Dko;1?(}T8O3nJB)WGBv@3&>u)W*=I>>L~%7cMni-<-Dp6_0g-gZGw#{Yo>c z7c|^mTe#P6>#%8P^JbWqRRVk=MwW%*;^{wWE-cDVK9cj?d0@XZKDq&c3(Da`E%? L3!Kw=I2fz}z(;Bf diff --git a/doc/salome/gui/SMESH/image32.jpg b/doc/salome/gui/SMESH/image32.jpg deleted file mode 100755 index 77d595dce9e3c117004d9e9adf3f84a3933acc30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14908 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 XE#4W#oBfZX{(le_|1M2{&{O{nD8c#0 diff --git a/doc/salome/gui/SMESH/image33.gif b/doc/salome/gui/SMESH/image33.gif deleted file mode 100755 index ecdd47b0b21fe3da820144e77bd64cd5ec3f1499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 987 zcmZ?wbh9u|lxC1*_|5g%vrj0>Dskxx3*l{x^?T`y?c)xJ9h5exog+1 z{Rb->B}PMF_=SKD$V;HSz`${UL7YRzW5a@j%^bpNAqO@rJlrmz>@~+@qY?vysIeA9 z0>gnuW)2g#CpRWCG%_p6PkN(~;LtdQ*D`L7rLfw`scc0|8Vo{7P4gYXxt3N6tq5Ff zky(^-;o{Sai#>~9rJQ1DxV+qcaoL>A22I~JoKx<-@tT(9zJZfZKtSNZvYXo(F07I@ zNO%*ysjye+#_sP9jr)yuR?R)ReZ#|jUMs6?&g>{?WXzdfmg7^I&&X7o8Mf}t^ykmc TFL3Vu=do+c%gZa6nHa1AkP>g| diff --git a/doc/salome/gui/SMESH/image34.gif b/doc/salome/gui/SMESH/image34.gif deleted file mode 100755 index 963095fe8fef78d4e2a430a54382d9c042004cc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmZ?wbh9u|lxC1%_|50B3k)2a86-JmJT@#i*vuiU7IR?3!o%$X%2qiFg-J)- zcs1f;CVWgf*012)^kv1wCvJV}-c>$31shIJ)?;)CaWGzXcD4oYg*!WqpEb^RX#UsZ z*|0p2S+7-#)xg1lVX=*%h{q}sjRpoLHix@29ki}44QCg*amtwS()uuF7KH_qb;6lh zF39cBTEM`xnDf)CtJw)!4675l-^lvxSbcwC)=javGuPF^cK0aH=at!6bY?4?R`$I! JJBu6`tO3k#Xbu1X diff --git a/doc/salome/gui/SMESH/image35.gif b/doc/salome/gui/SMESH/image35.gif deleted file mode 100755 index 0e3b30fd0fa616ed45221bc5f9bddbbf6f7ceda2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 964 zcmZ?wbh9u|6k`x)_|5 zmZO$ao-;DDuyOp@X`+6SnUy2sZ{-3lrWrbn33pFj)V{nSnN#FNmRb5mrpT+CVyhP9 s-R-g4x^C;~?e80Vm}-i?c<;z-Wc2thrp6Qc;n7jH47+(gmI@5k0K17_rvLx| diff --git a/doc/salome/gui/SMESH/image36.gif b/doc/salome/gui/SMESH/image36.gif deleted file mode 100755 index 7236ef8b94e2871b893c0ef743b10f85da672e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 987 zcmZ?wbh9u|lwc5N_|50B3k)0w7$iAlJT@#i*vKuU6?0<4!o%$X%3gDJFf_Qf zi!pkfIk8chfmzVlETdpS%E=xUr&%hQpBNe#nV1~5?3lFFn}LyqCt$^b<^Bx1{5>k2 z#s?ah>?Uh1kPKOIbPlV4#^0M)QZ6p$T&Bkw^>t;#im2&fwvq=j8rMYaENj&&%{sQu zf1{S~gaeE3GO+MmxVzh2`OKyU<40FdPhZc-WXUcNvFAtry+bvEA_@Tu8X8Ye*A8}L Yu-wFWZh~OVJD*)!US3|t%*0>~07}SiSpWb4 diff --git a/doc/salome/gui/SMESH/image36.jpg b/doc/salome/gui/SMESH/image36.jpg deleted file mode 100755 index 9b44dc7276ae5f68a06cd5cf07640c5ebb18976b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13508 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 lr%Ga;54@@Dtgg3T*uJwTYr{{x9B<=FrL diff --git a/doc/salome/gui/SMESH/image37.gif b/doc/salome/gui/SMESH/image37.gif deleted file mode 100755 index edd5263d85a207447082330eed7c63e2e33d233d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1001 zcmZ?wbh9u|lw^=#_|5ILrGiT1yrAybYUAwjA+SaXG_wL<$?AWn$=gwWbcJ2Rv zu%c07Gz5lY2+ZY=NsJfsRFwv1Ha3n32hlYVGc3-^DHtR$ zL@&*od+4vl_H}oe6V_T?t(^9bfr3(mn58gjFJwKMl g$Z{j*lws3WIQ%3IM~b~%olQC!@|Su0?J-S!oGR)CJr_>4(=U1+*`MBNpIiA zze7nzMMXhIK|xK&%1BLnmzIKpiHGSfI|mmR7Zn5FJzmaxtejjN7}z*CxVLag@bE}D zXeekn{;yxCR*WjnJz!nlEnbrT!s7A_t>27vkd9QytD*?*n91KhyC#Jqup zc@sSf^lkjm=Kw6?n@beFH-y3rj0&n-{irF0O9w9-dy_f$xHX-+%ZR z5*-s87oYIyb7ES0MrKy_x18M4vhs?`s_L5B=9bpB_Kwc3?%|QqvGIw?sp+L3%PXsE z>l>R}heyXJr)TFEmsiASlW$;QVPfI@G#TTD2l^kA80#jpAU27tCXTri>0P0>x5yqv zrIs||vfS4?Ab;*Wgh#t{~0U2P`{v`0|-q#y%@BmKW*CD0*YFWLSbVgJk2&|Fg!5k%L3XuBH z_GB?Dzb8mp+jmH~K9tb$%hSpS9Z1tj4(R+sSI}hImmw>MBE%N zK5fP)R>3PwjAngGi#j3uQ4unA`z9xdu38A_3dvy#p4SdHtCNXec)wzyFWX55JjHl; z6EGavu^e?+t_%yB^|x`X4V{ZD{+2Y#;%=*cJ0n(8y26isuDj(W-jq>J@RY{WFCV+4 zx_FhZ4&Sz^af;?O%&(4r%j8kCN;|o~t^IrMjs9AMzwE=*TF?vmfmJpZue`fV^>LX= znP@Po^GqhwocoouowrQyX1Fd}m%dKr9;~oKHp^3e*sEQ!s?vuhtgzr{xd>++09z1RXkw$uIacc11!-YcPiC;ytW)8eflq~cWo<@n z2%61kyms)&6^#WVRHA1T!Le_M3YSa;bF`Re7IJ#&BLbY3a?Ez@NnOh%Dg-g%1{VV2ydsx z#quUL#ho*yD-hmk{q4q>=CB`X>A8^?SEK1&C?M-~U{70Dspxe?FXxS43;O4}l3}=aD2#%bYlnxGNkxwZ-{FinErXJ_ni)w&vK2Bl zf+%H*cXp*;$>~=<6+7B3<4JO(drdSEGBDi@#sUw>fz5BhUBG;DyVLXuaBtgEu#8Qk zU*5^&`_s7#%`QDKS-~dK5gwTGPMT_A0-kW0DDL>N!dR8-^iyVtaK&f7m9l_&(d85| zt*3Ikj3PIZ>jIx8A$;j3Zn7`y-~N*1aPFNk4h^69d{!@zIHZz=&oG>-H`EZfIPD%i zQmbM*zW->qBfPNuvXG^^qHL7Uu`5}CVp=pS8JF2uLJ3D~peJcPg{KUkMzs50fr1+U zgu7z+=N8J?W$wkp*Ct)tX>~jM))foSEeCF+7^UPw#-$$G36r7aKf2B zPQ*KMD^aG1cUra}YvE}Rg`y7@%83&?AIV9O0)kNrHqAzNVxBoww(qFklbMrOl3SBet3&zq=#i;$VD%qh1PrfLg1Ju z`kgeFi}#Dhb0qj4az3CZoJX~)f+geF{|amozhvP3%}6RV;gAi|1Tm{3a-@Rbae3{b zfTG7C`qS;HIdt=8sxpB2m&oq&AWpd@J;7wVIOzw@$uBI)FiK^H;7lsVXFYIf$ouYx z`ix+)vJ>)w28jG6>;ebe5?i(BwP!2(Zv`%% zbg;wT>mr7aPERhOK8zP#LWW|HdUHL5jYeN%$&`JS8o_*$Yf-k$1A4kh()Zz0)ZRi# z#L5{b7HZk9w#F9;S^>-i(V4R>QRK7Fb#W#Lh@_FHp{dw=anShpkDWjyWgceUNK4o> z4cq#I#3%7b9zN8SIUIRp&sq+&(ku8?N-nG*x>tGr4|t}ZCUoF?%M2|X6hq7>(cshh zz@#GT%bu)f*0kJqw9B16uNY`f8^gHM#Uj$E=opSU`3T⪼YRCR73&na919%Cq#Ed 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 Zco3NvX!>aC3!}@OUHi9^NQ9dD{{U)n)eisw diff --git a/doc/salome/gui/SMESH/image39.gif b/doc/salome/gui/SMESH/image39.gif deleted file mode 100755 index b206af116287fe081c5dd6ae8c13e302db6a655a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 997 zcmZ?wbh9u|6lV};_|5KX?6jP1R+%hHU=>U0f7XElWls2MmIQ%8_zH@aa0^x`C0Y+ zJR?Sdh*JWMmwT;ym8MoEWHK&~5cDvWy1d+n*_$_|R?BqNnI&GWeXa!ya>BP{@~^pi z>hs#u3zDuEwceh_aF#Lr>n@vw1qXtbdVQ9Q*i-S?>#(0B3k)1*86-JmJT@#i*vKuU6?0<4!o%$X%3eJ;6cSw- zBxI9VE^KIY@0WJ&Vo7L7JjyC=C>L?^(*ZXoHF2g4PvHX$jEqTYA)dvm#~7H{bOIbg z9Ge#zSO4M>NN{Led51Mp}V$ZGH#68 zxv7*>B>T?F)X2ON?r_JZ{hV%Gd=3W~9vp5oyq9vSB0up+JFftPRYODS>27)Ff87fh i8ktymI>dN?88@A65R|asjWo@^vLX5OytxVr4Aua(&umKo diff --git a/doc/salome/gui/SMESH/image41.gif b/doc/salome/gui/SMESH/image41.gif deleted file mode 100755 index 2e132c239c6ea1c8a539f2b60918526065a75f88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2145 zcmeH``9Bm00L90qD7nexigis$jSfx__NM2;A%f zDTXvrCo5eV0_W*XmD4p|uaFAX%~fw30w$;)L(SE*EnzG4V(S*#e0vmobAG6$W}!Ro zh>+r~*4iZ+KqP`c+huRG9|bl=b>xEm1`7~2jN!K%YYb82g!~5xm>HAkiMJ^ZyS$Z0 z^Bn4Ojc#VqTV(nfhT+_gGaU}Uh}yVE?yX#i9a2QOt41u-vCxd~m^N7YR83F~Iu^!d ziIocQcp~qV5sc*_Tj$XyK8JJbvnm-+4?4f5an7!H8;=?Bc*j`l=s2Eu6#Chx1Fl@$ z7WhM1h^V>#LZo0b$tzO2z5til5d@XR~uv7u`2a$lz6 z1(?zL{-%d!xnG7YoTKLI*PQQ<3@teY&2f)zRL4rTA^hW984r9*BNZEGOD5*ipf_|G z(=M=O@j_7I8g7mJGy@{5RDpA){@b$$T8YR_3S1-bBM#4&J#9AMG$GP3P%2WFH?2wh zmZ`Z#q%7@IV%z(tf+*iuRBUZCjjB~gEpgKhd!vc1sw^`MvunZDnS zZkaey%WCOPzD9ezXkV$BJlnjr-M-tewbQ|w3fk%152>V;HALPGdBVa7Z4*}x(;wpA z$!b^o9?d#%YZ!}8(|&EFb62j9UnB$klCdrKG1x>WhS{@}4+Q@qloAt;rcvGZ8n6g$ zolwgz`7P*W=*eJ)yxi-HZ7t)4SUNm#2Fqk93s;O2Bs3x{Y$K#Tn>z%Vog+PRWNAR$ z1ZM29F3@w^#U8l__HR!`K4AOtg(2ZLLmi~JW-iHwG625SYVNxjE|0}sh!fD+Urdw< z*?V1i0!Z2jBEH-o=C?|?<)vmFGj+%gB1Yw^xPd7t?JliU>#$9r*rc< z@6V=Bc6u))NE>;tJa+8zT93&4o;Jbj>T=roB5mx%W;=E}a<}q~9lxwhcK^<6um<3C zP1>Z!E;6;mIoaHooby{FrAA+^vU+~*y1JAX4caS>bDw||MIX=9dn!nkwoE^S@ zIHyiEvQb6OO2T4qq)sn(kZ`yQ>Nbuy%g$~mV8jXs45`OslVPJ?z(Q&M&vl3#`P2Kl z8?{#9x)yU^R#&f3Ob_o!I9G7S+4gC~;UfF=YFGtG`f|Igj$MA$Up~-#Y2B(7$pwyk zBWmBE)?NnC{Qm3yI_D>qZPatK3S-nS6+K{_S3V~wIRM> zCx5s_GMFA@z}wixyBVbG>sF)DGwhQ6VUiJd(0ugCA-fbHOg0gKjK#}x$^>tdO=aj~ z$p##pSSHy_1HweQaqz$qvbi3eiHhbBl!Pgk7Lf7h7*09pHU;8Lw@>Bg2VDCHxxURB diff --git a/doc/salome/gui/SMESH/image46.gif b/doc/salome/gui/SMESH/image46.gif deleted file mode 100755 index 0f00ea7cfb6cc0db49698e5ca9568e0438a9c72f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2274 zcmeH``8yK~0LP^WQA{~=HODA&y;`YEhq2kvfgD-o7?ra(Qp{0|h&CEImN{k{Hbm#7euV+h&%^!^)f-ygou_t($odA?952k?&klw=GVA|PW2VM0&vu~kKOfT0TGfcrv+=M>@9V~oA`1YD1Btt zQdkk}Idy>MSsyaOeNGe7QSIqkaAws|J-UzT+rz9LW`$31i{Px9k(QXHZzDY{`sk~K z?Yp#{8yTP4vC0Q8ziq6Y;A8`>q;>NRCAhgIm-&a3t%AtKb}jOzUdGe!D(6CxFBh$^ zlWP33d`w$Fa~}+@O{`GvvchUvnB-a0{YDGpYFR+mi+hcWU(J(G6GKHu|4tpGv-mZ> zdaK`!UL}j|K=GS5mZk_Wm#m_=pjCjd9cqj@$zELfYg{0(yN5~H_yu)~lay0LB`Rsj zXeY`)7Q!l=4~pQUU^bd}g^$Ab>ot3N_tJ*{`nV?1qFHP|m5$nGMg zSlW01Q_a}Xz)YR5U?A3Z%M+D-O3v|f*hv**SKPFgYze;A{%BbatQi_`)8lHM!F6Yq zCIiC7P_?glkQK+kq!aPMeuR7}^RZavW_98%f-z{akUWszTck1=txHs;OshUq!Ksq- z^lxL8O7?uAOr6ajow65v+OrtE=@jIT=1G>>GSXE1Qwo5_ifyZru0VXu_~OXe8LSb!|)qz6qYte2rLoBV`FYIx2l9eyxL4a3*?MzbF)) zJoaui6fSDrYdcFnpD{LJHAKUGZ<)w3fAE65chjj|dH!xkRh0Mn1p|xG%>^`6t!=Wy zjEG+XB3y0NDKdR)eU>%9wef=!V<-sZj}~KxO9_~OjVvL? zUp#}9(6MTp*~_rlS%{QWt%qoK3*vEXogF~WSF(n?p(;LVS(Y)T@{!?Q`!-Px$3bkR zP{w_xt)5)2Dtn(zI2e6LFVcTXS7SZsK^Kkhbpxwk?MgR3o^j4yoRkMR08=>VP_}1x z)LM>CNMPEb92nrDWry%Wtw&VT)sTjm!%g9})_(f#zU;MpbDUe6>*lz6Z{r!$V-Z-_ zjAFMz#||)ZA=A60)E`&L8GIk{C~oY*BU%jpZ;vfJFN{`m=U)0(I5)m;ptg?nz1e@fYV)&fy>EjNHgk-gtafzb9;>goZXvFUm^h#nEtY+!;*0J zAsXSWQ@L59`dgb&Kt_}Ghzfq%+FbU0zPo?mXNEqaZ7wA*QN2i!m~Zn5rEG4$ZWu-l ze(bw)wlJQebPQ96Y;Ef*!~{=XKBw<;8)xM!{lZA*e-&Fw2*UnWBosIIB7ev*c$(h)&DN8t8X91~GoGpQHIumP%< zi0a9sy0f?gHL)TZN`dCdfeqF@6;+`TG%q1{kl8G%4$q|dOu~fCA4D}VJlf?|uCR4o aL{CttLhXdVXKSo5u!yRwaR5aL+kXM*SpQrA diff --git a/doc/salome/gui/SMESH/image51.jpg b/doc/salome/gui/SMESH/image51.jpg deleted file mode 100755 index dfe3bc606fa8991b0dc34448a9121f7365572a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22124 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 WgaTd!Kh&S^f8NLcusv)L5B?K=CI+Se diff --git a/doc/salome/gui/SMESH/image52.jpg b/doc/salome/gui/SMESH/image52.jpg deleted file mode 100755 index 1c83b35f8b193d82e1da7a65b505b6e22287c113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22197 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 diff --git a/doc/salome/gui/SMESH/image63.gif b/doc/salome/gui/SMESH/image63.gif deleted file mode 100755 index 6a9c2c86db0e435040a2f15dc7357a2b9e5e4dfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 929 zcmZ?wbh9u|lw}ZS_|51jNoRGXxQ@V%9=oCfrwS6PeV6kTwWD>+H7sZ_JYT!=6Z)aI51cP03=XP AApigX diff --git a/doc/salome/gui/SMESH/image64.gif b/doc/salome/gui/SMESH/image64.gif deleted file mode 100755 index 1d92c81f13b912730d129f3223924a854a948292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 954 zcmZ?wbh9u|lwy!%_|54`M%i(eIlEaZ{2EprcP8u%roobSPuV-a&>iM~rfl(~Gik}87GSilFI1u>!{1nzj zVjUWyjvI=3;%XthWzSahVBk&8nk;Nm0KMoCk?Hyjri9`EIrma_0z zklHYfh2?+>!^DQhnHHRTS~NE+pP6l$_%26tL6YAB$M#oKDos|Lp6fRAoXf0`=K(8q zS3X+PDZJWu4)Y-=5r;5`8;oq17KK)S(>by&^|BO)_4c)QcbD9Jbocc3_4oHTFmu~U I3ouv%06iQ~761SM diff --git a/doc/salome/gui/SMESH/image70.gif b/doc/salome/gui/SMESH/image70.gif deleted file mode 100755 index 120b8e8efa7465138b8b2838c457bc4a28edc7cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979 zcmZ?wbh9u|lwc5J_|5CTHK~GLFGI2Qg?A(-kdMYpH3!NDXkDKOmM_glRa7b@t@tFK= z3#ZA73(Qvh8op7V)h_f{3HrEpDLnCAug92jw@c(rK(FD_Nnck9FmZi7z{;?=baJHiaRxfQ+~pnotvMZUm(cB H!e9*mkceTL diff --git a/doc/salome/gui/SMESH/image70.jpg b/doc/salome/gui/SMESH/image70.jpg deleted file mode 100755 index 0df360f68fa811aac5f539c305a0273182cf7e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12029 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 MKSUA$zlZ7n1FcAkLI3~& diff --git a/doc/salome/gui/SMESH/image71.gif b/doc/salome/gui/SMESH/image71.gif deleted file mode 100755 index 0008354f62adc0d8164ccd123af93e4bae2c2700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 988 zcmZ?wbh9u|6lV};_|5pT?UPA zvy5wh`E({^G_nLNUgR=sidqA+Gr!AJtF6l$7dRE?wRSCdeSIa537@NhSXTHv^}?)N zYg09*H9G7zORGQSH7;~^Kd0KgV9f=ldPeJ~5jzT#do4tb%Y1egHZn36_^mthQ;+fB UTxW5+4Ut=3US8qP&ca{~07G(Oc>n+a diff --git a/doc/salome/gui/SMESH/image71.jpg b/doc/salome/gui/SMESH/image71.jpg deleted file mode 100755 index cb1223d3895bfeb700592dfd27b64d20f6ef772b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11550 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 YUS_Tuf6PJ76D`(048Qt2@S!vR2mK@({Qv*} diff --git a/doc/salome/gui/SMESH/image73.gif b/doc/salome/gui/SMESH/image73.gif deleted file mode 100755 index 504816a3c0859db0b50534d136b416f4eff42f70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2977 zcmeH``9IT-1IOQ+*%oVtX(q>%BSJQ&lxmy%sFs{VDYK9x)~9Ir48!DT&gQCNliWvh zguWBGiWEXgha&MsQ`FK7aFI#(?LkG_n103Kx@GEdQ z9ECzDD=TYiYU=6f;qiELb8`xX;^5%m?CeaV(fs`UE?v6BWHMPS7Kg)0OH0ei$tfx- z5{X1LH8o<+OR-qo+1c6K+xx%0f9qcZ|2GB0y8p%7eu}uqhJSnKJ@;(r| z8v+fM>9kXv1pt}IpTY1e6{B4114tY|ikI9zo^b5Vpm7is@YO_KCizMd5gsN~V*m%l zH(~Wv;UxFZG!S?u;!TyA=A;M-vk_heP%6NYY zB(ro^k5Z(7*1ty1-)1O5p%t5Il_+v+C7G*poy__Jgc_3usglTG&|i8QF@L`QS!#Jm z-Rfd-)~-l_n>-vKfo=3FLK=o2u2b);*ynYD?j|`dww@2MB129wuHAXic32za3Zz*d zNZpFB@cU0I=u4eM{U67ADpbQ;(SA<^2r8gFU4V~3lR zwD_W{jZT=;NFUg9+L%ne0i8byIls&<#E8=L`wZmP8_5d|!ZnfchQY`)Y3UPG0D%&a z2I+V^CVkt~${eUqUbbZxaf5H{? z>f8gvr0vee=Q6p5s8R4vpL2j#ckx&S#03VFWfoX01&h^|u03JHkdyC_=(Da+Idr`$ zkaA{c;B4KDn!Bq=r|>jQ23E#tf2Y<^O3T5ctQb7I@U=}&%o)U>`G)IM>1_~h0? zGs~z;h~~EdAMaiyRX6m1FeLxJHhwTH-T3d^%~k3Aj4e6l!#aW+&blF$EF*j-$oB19zrceYr3rjfdB4 zhwu_)!t-IC1jS5x+G%WKRv(n`kf@0RmK@m?MvdAx5knL;`L~lj&8Qt{N3ar?1lk7k z>QzGLl9UGD!?(*(2!sGIWjzHNUF7!$K~iKbUMYCCqTY0d;7acSPyhhU!nJ}Pmrn6N z5n9W&rPE=2+IVfASV~~e3c>?tA41i$?$;+ykxNLvO-Bg@r=5eDuZutM?{@6~Lb$`ZLRg-3Q$YoFH)wiO_6}7NK#se; z?uId_;hz$G3tZT$y;e;x4)dI;Dt{Jj^^EgFF)4&x5&(I}E*G4N`BIe^hZ^hX!{K5+ zOOdu>Ct5!Rqse5V^oh4omLlj1DK+KV12Uu(NJRgWu~9{>s4aqw&+jR`vC)47IbPg_+(iA zO1ae4h~}@=C$hp)Ur*~d4Ui0-30j6m7tq~&sNO_Y;pshCO#oEpI@SWo_ZDU3c|*~2 zmqn@mvprsIt}0_48STTKV8KjExIA-uzScr5t3LlQ z&w0F|akqc$n(m>xJi>3&p%M zIKgvrq>myz4P01xi**M6W4EAnHq=g(E2i4NENy?S9OYC0Kgr_j^7GOzvbN?kSH&#O z6O|`pHZLx;H8WjmQaoRN^0`T)e+&%O)%DAh+DXU+X67O^%D%p%BxOF25h^P-@q4Ke z)1$*1LR&+D#9=URR;*5vGVbmZD&&p()rCyIw)s)a=vk`?>*%h!pfdK!48e4x-n>YAp;q^DW|9Dk=$9muO-Pl3FR8Zyz;|JEFQ47u`C$vJu&@ z5sj~(o5*pbL{%p+X1NqbE5sOpq7ENbSu1A^4X$K3zVh4fxFs4|nYH>@%*)xob0Fiq z#B9eXTPOL-6JHIXxRmAJOvldZ9J?Y8?_9LF6!WdNw*5`Zu{pG?cqC$Y3kiC*_ff*g K@;4bcaOA&RKKPIT diff --git a/doc/salome/gui/SMESH/image74.gif b/doc/salome/gui/SMESH/image74.gif deleted file mode 100755 index c66029e7484cd22dcbdfddd29e9592812a56b299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 987 zcmZ?wbh9u|6lD-&_|5?|7&Feo;0vnqQmnW3oI&@W+_lQLo9B1Z-$MiT~u#1u~^cKaj-2F50DHWoICJqpEY zt&ECR0cTcjRyaRZT#qNg%e#nXk(?1?(?N;XQ@Y%WP e>CwsB)=T~v6t|w8?%XZsyKBqK%Tt+|7_0%7QG*Wv diff --git a/doc/salome/gui/SMESH/image76.jpg b/doc/salome/gui/SMESH/image76.jpg deleted file mode 100755 index 88ec89ffe27dd1b1edba4796662917ce9dfb21f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22981 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 OfYMw4%Q6bS82>*(sV_bN diff --git a/doc/salome/gui/SMESH/image78.jpg b/doc/salome/gui/SMESH/image78.jpg deleted file mode 100755 index 80c2a1633ae8bdc324ea4eca6f2a2564eb9320dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25224 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 gvy#Rt^YvHv)&6G^V!Z diff --git a/doc/salome/gui/SMESH/image80.gif b/doc/salome/gui/SMESH/image80.gif deleted file mode 100755 index 399af0a9ab3812795b91dd8b64fb5a04331a6e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 977 zcmZ?wbh9u|6laiN_|5U919jYuyFI5u>?Fg(AdGG?kD50 zpuwq^fv1HILrGiT1yrAybYUAwjA+SaXG_wL<$?AWn$=gz%XR0Jy- zB}PMFc!q!u$XlSiz`(JWL6}3vW5WW+Mh-qLmIDC~8XGx9rBXN=8W@=cRQZ;81Rh{u zlH@O932<;^WMI^2lR3Ge;q)XmMvj2a0EMH|EkuvV%oIH6J4erVUQMS^lSnEJy~!dcrm-jzAK(vR2!JX)~oSaO?~XioVY&gYUVcWhAsY)TDFm2UpDTx zk9CukeDIEurEas^($j_o2?rWE&&Xu%FihH?p=mbn&-RUsC#Ue*pF8vO-LrFZ^}FPJ LcbU9wV6X-NXGCLC diff --git a/doc/salome/gui/SMESH/image83.gif b/doc/salome/gui/SMESH/image83.gif deleted file mode 100755 index 331b64a10537807dcf77897706890dc33cd87c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4552 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 CHmX+u diff --git a/doc/salome/gui/SMESH/image84.gif b/doc/salome/gui/SMESH/image84.gif deleted file mode 100755 index ea8ec56bcf814d203b7aa9180cee6d2874eb510c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 956 zcmZ?wbh9u|lwgo#_|5YAAMl=Ol6`AWr?DEtY|G|%HJL$A{pT4M z@|~R-k{&qOJJrlqD&(c#GLx0xzDSm?4x1mwFJTaM<-m=pI%ikKp5B(r$jo%>)LifF l>+bHZ`26bb>TM18_ct(e|C3&@;o;#9VePmxHwqjWtO43SUbX-L diff --git a/doc/salome/gui/SMESH/image88.gif b/doc/salome/gui/SMESH/image88.gif deleted file mode 100755 index b2d4b73fc7c75b43c65a0a4b9cfade54baec1d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmZ?wbh9u|lxC1*_|5#`h0bjZ90DB{9~U0&=3sDH!lA%$ ztY1=8F1c4W4`5ZJZSJ);N&P5 zajGOUaEb3?uijM~UtL}qF+1$+si~`utxGuECF{NI4I^{LvfPcGm!J90uxV!VT`9Eu6suG7FOyY9 zn*I!CGxJwu&?E5ob8z%8y_EUXZM)rvvX7GX-1>$duMhQKW|{L1^~zy BXOaK_ diff --git a/doc/salome/gui/SMESH/image92.gif b/doc/salome/gui/SMESH/image92.gif deleted file mode 100755 index 9e0517f5d8f910a85d5db18ad02d038f6e576b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 984 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 diff --git a/doc/salome/gui/SMESH/image97.gif b/doc/salome/gui/SMESH/image97.gif deleted file mode 100755 index 480b584edf24fbfa9b4dd0bf52502c71ab3d362b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6203 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 yPAU#zDeSNT0RTJoi#Lw| diff --git a/doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg b/doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg deleted file mode 100755 index a10d494a5b6870a17ca18b9fd45de5bf80da5de5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1255 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 UFMH1!hGZ~$el#mfpYA#HU*7IM9RL6T diff --git a/doc/salome/gui/SMESH/whstart.ico b/doc/salome/gui/SMESH/whstart.ico deleted file mode 100755 index 365eceac87e1f84509afe98f098b13c5012ebef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10134 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 Cw@GdQ diff --git a/doc/salome/gui/SMESH/wht_fts_h.gif b/doc/salome/gui/SMESH/wht_fts_h.gif deleted file mode 100755 index feb79ae82af9eee69c53f26bb0259032aa075e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmZ?wbhEHb6k-ry*vtR||BZo|;r~pAw6rq}GyfZ(`9E{!|Cwk00|8hbg;4y-!pXqE z#h?Qc1)0IXk;x#+A>*+@!I6POSS!RrfT58|K-tSA;Q<3fBLi2!k`9H&MbLd(38!(I_bg5(mI)e{m-^3EslCSX>cVorP8PRGb9PR6=s1mS VaaxGfR)s^WLRThtQ&FfcSSumvosU}!wfETS0aGr@3? zdxspSh(KrHq9aoT-KUjs8mD>B;@}XNpmBMr|7?}oYb>uWEcfeVa+@?~=Y)rj)7TcL Tg-C5xIJ7EsWs<0b0E0CE)e1Lr diff --git a/doc/salome/gui/SMESH/wht_glo_h.gif b/doc/salome/gui/SMESH/wht_glo_h.gif deleted file mode 100755 index 12223e5cc1fce0341697756352f9b0c62a8bda9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZ?wbhEHb;*%)rSZ<1s;@p_xON zNrEGx;cz=YBa6U|fCh#RKGmQj9D&M>U1H90Uv5lDKGrGE-oazpu;k=q>F}tW&P_`^ cr|TEqTeC7i(Tj<(iA(m^<^_R`jEoG{0RC$x-v9sr diff --git a/doc/salome/gui/SMESH/wht_glo_n.gif b/doc/salome/gui/SMESH/wht_glo_n.gif deleted file mode 100755 index 32803ebd9c781fc4af17f14b9adb90110ad849a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmZ?wbhEHb@X1N5r3sx&Z zBLV=4v;qQ96f125gAlJ(vTB>)VTcF>e1HjSQzA4<9|pnMWEc<%-et>uWHyKA(+U!g z4uJt+@c?WLQ_}Q_eFTV@14JlfC4%*0>~0PKD^E&u=k diff --git a/doc/salome/gui/SMESH/wht_idx_h.gif b/doc/salome/gui/SMESH/wht_idx_h.gif deleted file mode 100755 index 2df1b16a21c18de76f78db446889be1049f15b00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmZ?wbhEHbHIyb7gPvHyQ kB=ho<%9&Y;?rBphgO@tBstIyPcx}nJ(B#3&#=>9?0DB23GXMYp diff --git a/doc/salome/gui/SMESH/wht_idx_n.gif b/doc/salome/gui/SMESH/wht_idx_n.gif deleted file mode 100755 index fd193a0f7e3769bce176e5d3218e2da3c9be2047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmZ?wbhEHbHIyb7gPvHyQ kB=ho<%9&Y;?rBphgO@tBstIyPcx}nJ(B#3&#=>9?0JH-snE(I) diff --git a/doc/salome/gui/SMESH/wht_logo1.gif b/doc/salome/gui/SMESH/wht_logo1.gif deleted file mode 100755 index 2ef5700f23ab96a8894ca981f6dd4e03d49f15da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1405 zcma)5|4$WE6hEw{WP@2sq*B9~s6A-aMR*TnGR<$WUK)=_0wxAtNI`_D1ml-yB@+dP zsBc$OLBW;418aN}T?NWeuY}?Bfsicx`ks)f$(obf=f1z7^V``u=W{-v&$)NSs^v!0 zhCK42aU!KdDkYTSN-?EKXHqIDl;lb>B}o^BR6;1hm0(Jc?&VT(p*UBZDNcHnNyUU> zTrs8?0ZEZmBouK)Oc4@b0~%NuMmOm_I)s#5N+u=gwaA2!f=j`qAk6|rE+prYGs#Jl zLN61Namkou1dbS$BqVW3OcJ(&HNZd`EI|u3ECx29frVkxf^?4HLNFmn>%&@PoD0qb zCoLB&P-I*%CKy3INTF8{7sLcX9{d1JOv4W72MH(yYk+|?SfUj?uo&2Y1{P`ObQw8< zaZcJu=)+oMjB!Tr6>`A>MNW(pe1y|50KCu+qoEd7!Vl2IH0%H;2!=wi1{g?V612br zi-8Sj(kIg0C?iJ@E(Rl^4{MPz(vL&?>bbWrdQPZq_FP5xdW_btd%V-59y|0AJPI|E zhqS(lhld9CK;t>!N-z(auxesr;>C*>&!0aZA0L1G__5378Xg|*>+9?2=xAtYa5x-x zyS==;+-9>C6cl7Ir5@_O*4oZ-Tq?);~Jw)@?`Uhkdf_@b?ChvDevnOl;F z{O)wEUF3fwWN`b)p`hmZ74ZqyTirWDCr?jHsG7Z?C^Xjcp&@tK+MJ-tiMM~t9y(JK zd-+uTg%MTgfphNkTBpS5^mmrr#| z=1}8IkeVGn}pQ zHCVpPI1rxNZ#=ktLsVCB(fa0eo*wA+OG$X#zE39BrDL!$%heFLP(bmTWMLtsXdezCQX!b?w-hht2M>_D5ZYzs^3rKC2$Fu?!mp%pGtM0mD$)S0T6oZ8-Q*iUS3+ zDzgE-%n30xlNRs;5XMTtl6*OipdgX0;uj$63{EkQgRk@UFX;Yu=iYnnIp@B&EOx2M zye^*tXpBhdkV*-qxKd0h(wUS>3MILcOi9v3A(aqHa3z=$qJXNr>^Wl}Mr z7*~ubMnF;|6$wRL5mST&*nkEWhS5!Wj}9Rvmy$_IdMz>`q~KC8DM+(GkqgPWP8G$24B?(Df5|f0jU=1*k220RF4U2&dXkcNOv>=@$xDZST()zF#8RvpC z!AZ*n3ltd_j0r|i4^rqA#04=ykOx0N6VtE*`auE;!5Uy74VGvH4=e^Ypn*l&IbBAM zV4RaS68f+f8DpFge1%-FK#>#U1Rvov3;-{*!)U05mGA>JF%3Jw34);ztN{knm;^2G zz+zwnn)HcuH_FHngp0vQ=)+oMjP&EszWVO1i@ppt)FsLu|41fN2U zU1*M@NT-hCCimS65eCTU%XSo!jlM ztgI|6E8DSSM?pb>-EL1$PftxvO-xL*SS)dIanaGyixw?1o6Sa}apA&+c+rD zNfU@hDNHx(KS7ff-Rhk3c74^E!pVWJynC+xKzs4DS^mMz)zxQ9XR^%xa|s(llR}r2 z1jioxuG2Md`IFVX4K?R0XT4bz{IaFL*)`ZvlVS57ip{xpY2?KG(bTHa`@JWp_&u}KZK_yd+ndw= zha=RHKc}R0(C=zQuhW#Y?VB9y!1iTl`Lj_SC#@D!ZPmbq>`6%{de#gqZfY|Hy5kS* zG1S*QW3W1sFK?qS&-rgzkUFDp_5M{o$?vcK`l*4^%p04(jTpGu;s5EX)ajO}X-VCl zH9x;KvnO}N6T7;qHLas$XMA{ZS+O(QdeCt#tFSu$N=k(#^7`qoc+K9Fl0jZx{`q?w z^8W4ZKJsc%c#T4}) D2$`RH diff --git a/doc/salome/gui/SMESH/wht_next.gif b/doc/salome/gui/SMESH/wht_next.gif deleted file mode 100755 index 8ea834d5e7032dbe1ad10ea4cddaf55ac91156cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmZ?wbhEHbu&t4cF*@n~ Vey2jt%i6i7QHe!nS-}hp)&O=i6J!7Y diff --git a/doc/salome/gui/SMESH/wht_next_g.gif b/doc/salome/gui/SMESH/wht_next_g.gif deleted file mode 100755 index c0e9758468e31a83aea3f3d353e5d88920ca011b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmZ?wbhEHb0c=>&3LIf YBPcn4pOU*-tpa=3)XoK`gBTdB0bkn^WB>pF diff --git a/doc/salome/gui/SMESH/wht_prev_g.gif b/doc/salome/gui/SMESH/wht_prev_g.gif deleted file mode 100755 index 86479091649ebee62ce8a95f7880d3aa95305ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmZ?wbhEHbutpmhBaYhCPCMFj~25SJyItL8^ diff --git a/doc/salome/gui/SMESH/wht_sync.gif b/doc/salome/gui/SMESH/wht_sync.gif deleted file mode 100755 index 0ef174735ff57f43ff709fc824f326c8f7d9a772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 zcmZ?wbhEHb1(%oXCs~51m>$<%ME692A|p#B_yPer#Ci)*`POB%^7dz+epkpkfn) diff --git a/doc/salome/gui/SMESH/wht_tab0.gif b/doc/salome/gui/SMESH/wht_tab0.gif deleted file mode 100755 index 955c42f47a076d635e5f28250996e98e7cd7c076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 285 zcmV+&0pk8gNk%w1VeSDK0HXf@|NsBx<>kP@z`wu00002Mz`y_i00000A^8LW000F5 zEC2ui0PX=806+ucIJ(^aFv>}*y*TU5yZ>M)j$~<`XsWJk>%MR-&vb3yc&_h!@BhG{ za7Zi~kI1BQ$!z`v(5Q4uty-_xtai)odcWYXcuX#v&*-#z&0ag-@VIs;jK6uCK7M zvayD>wzs&sy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=%($mz{*4NnC+S}aS*#O|-;^XAy j=I7|?>g(+7?(gvN^7Hid_V@Vt`uqI*-v0piBme+AZ&j?@ diff --git a/doc/salome/gui/SMESH/wht_tab1.gif b/doc/salome/gui/SMESH/wht_tab1.gif deleted file mode 100755 index b3ec41d6d8a6a3f2d06b41f8ea70572610acbfdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmZ?wbhEHbbYl=@*vtR|4Pe{=rW$~}1`s%K;J|;N_$ATn&sXV7$()z5O37izzJfJ!?b`Q$c;Bvk-@SYO2XPn1zT*pp zB8-__JR?GW^@#djjxO6e*VI2&EU2lc@8~ll%UIi3@4F^ZKI_$wf6tQps&@3Ne^E|F zLup%Hd_-awznW-Ok)e6q?^?=|z+uGd_>VZ)}) RYqxIm-m%k}fnAWn8USudW4QnT diff --git a/doc/salome/gui/SMESH/wht_tab2.gif b/doc/salome/gui/SMESH/wht_tab2.gif deleted file mode 100755 index 08fb0ce4fe630b4dd33f1f8d099945ff48531b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmZ?wbhEHbv||uu*vtR|4Pe{=rW$~}1`s%K;J|;N_amdW@3l){E)f@i$$g^S+H!mvz_+Zb?dcPZQ>AQ Gum%87{9UmC diff --git a/doc/salome/gui/SMESH/wht_tab3.gif b/doc/salome/gui/SMESH/wht_tab3.gif deleted file mode 100755 index 1819c8e8f786ed0b62007b198cb69dca982c49f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmZ?wbhEHbG-eQG*vtR|4Pe{=rW$~}1`s%K;J|;N_tQPIo@N&L#vFwFx*~w?0Zi@IVyZ?G?SxwgB2Sq=oM{i31m{lp1 o6|Yd&+>jp=)lsO@?iOr5ams`##?z)-O`hdDXRZYUyC8!#0CKBV4FCWD diff --git a/doc/salome/gui/SMESH/wht_tab4.gif b/doc/salome/gui/SMESH/wht_tab4.gif deleted file mode 100755 index 1a6fc4f4aa68d1b8fdd35c21c002f4a117133639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmZ?wbhEHb)MF53*vtR|4Pe{=rW$~}1`s%K;J|;N_j1LiMqShUz?=`!;bD@_^L1sSXX;;C5C diff --git a/doc/salome/gui/SMESH/wht_tab6.gif b/doc/salome/gui/SMESH/wht_tab6.gif deleted file mode 100755 index fe312d238ad98026d9171f20077f95e372a82752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmZ?wbhEHbG-D8D*vtR|4Pe{=rW$~}1`s%K;J|;N_*vtR|4Pe{=rW$~}1`s%K;J|;N_$5v+f;9S4GUsJ*HDtct_r7pLLGEFr+V_8Ee0O;8o<&2<`FKKp zgqPAJzo)&PT}q5Wa-}I#9eTspT+b9~?!S8>tcA^f&bH2eyZmdZ{r>)&Ny+JT znL<_d9VJB_oh^Np#xCXkwNtyg@*7p#oATmQ7Br?-^r+2=G;7V8xWXY%WBJ+@8#e`Q P+3L7`hb;rUAcHjkosMI* diff --git a/doc/salome/gui/SMESH/wht_tab8.gif b/doc/salome/gui/SMESH/wht_tab8.gif deleted file mode 100755 index c80acc8d57852a246362d981ae89d4148f157987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmZ?wbhEHbv|$is*vtR|4Pe{=rW$~}1`s%K;J|;N_WX{W2)us4ipV)^3U#ew_*Or&hV{|y+vg7j?6Bkay z$U8Fi;%Ua8k9bV=dSI~ftX`|PkLjzUMS>3vSbJQ%3r}pVys>U^^SeKxMtvvmrk72WmQa=UOuH{qFu0FTg{|-^09LkFYj1xWvjh*-FnScs{|RW E0hmEvxBvhE diff --git a/doc/salome/gui/SMESH/wht_toc1.gif b/doc/salome/gui/SMESH/wht_toc1.gif deleted file mode 100755 index 515c352de2fa5d8ae7def9c3590b6ea3c49d26e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmZ?wbhEHb6krfwSoEI(2>$>7&oJ-*fddDQ9Xr<2(gG4Ur-`p57buiKh)yOmArD}p8*#ut zAm9+x5Cb$Q@e~{w3~fk5%OknCMvY^t9znt%#-cJ)bL0xUpunZNsUt@ujR3%f=Li~Z z5hd~fCb|&^m|z$VK@BlLqZ3%*z+h-Y+G9oW8rP_C92-NB@Q1Oe%sm#E)*lpUqp{Dl zq<~7f$9hwg!I;vCZ70KloIJ$x6IM7#lOT=H0b4?N@RUYTp-?E5N|j2bTCHYTR;$(O z^?IJ?jYgx{Y_{9&PN&oDc6+^EzuzAW2E*ZSG#YL8{`-*s|L4HQ)^VbDbR=5iKSA5> z((Uox<+lqT@Bdicb>eezWjfzpXg#^L_I)XzC||u&Svz?0;oilWEwu3S(*s(qx8IM} zr)T%SSzP{b;pv&V@{O0*XGVu#&vCYXZ-alGozL#f?`WMr^yS&ko98b6{`%Zr9DVh8 Xd1Wd8HoIr4wQu54=hEe|F`E1fN0FWD diff --git a/doc/salome/gui/SMESH/wht_toc3.gif b/doc/salome/gui/SMESH/wht_toc3.gif deleted file mode 100755 index 330f3691c32e371e8af44c6d5780747737d30ed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 911 zcmb7@J!_Ov5QWDmm;@qe-9i*h41P3@iC=}qMkQM<*oi4b9MBbPV;2y%2x5`NVi3gz z8w(eMTCI&lj4LCeMf3-3XSJ1Bjn94KAMiHIaPORX&Y5>FFI_rw_WHC;%Wv5^Dqosn6`5s$)%puXwb8QAYDopE%Dt?&in1_P z>6C3(h6{4#p)9|`Dh{eiNb@-GBm{$McJ-rgP#hojMGr}y87{Qp0P{_L3$c_YV5Yxz&e_#L@5@qDKD z?EU@Sd)N9Oo3+i>_sQAA3oOHR&S`}AscYi!@wT|dXa-58AhSX_T+>obil1R^jjNr4Mc#bG=`Z##K4d?lL5$1V*qMm z0P}&YQ7{?;LplT$f3h$#FfcLbfP4YU6Yd<-7+5)EJT@#iz|5@VQZYdRD8a|bv%nyr z(WQ+;DCLYt;e!TFE@6k77X?ZO8M#FSIu0CYJjBQ%=+&cO^oW6hn}@@PL-EOpiE7+_ zOB}Xn1U57CJc(fte#zL$Am!4aQ0f%SsF82x@IfFcXc?2JjfX{pcEfa6R=o+UF047k gA!N-p;ls7Hhjyr|dn8ybc;CR}$jc=rA;4e_0PdJkt^fc4 diff --git a/doc/salome/gui/SMESH/wht_toc_h.gif b/doc/salome/gui/SMESH/wht_toc_h.gif deleted file mode 100755 index fe20f686099a401a1ea951e81eae565b4efc9f2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ?wbhEHb6l4%!*v!Ci;J|^jnP(Vg{{L^x@c;k+GiS~);0205SvVOOI2d$5sz7Ei za8xn~DsU)lSa7hJnOnf6<3a-i6BjQVhrxpd&P*&~ekukF79H#sFi(<6IB>v;MS)X7 zqoGiRk&%sMS2{-t%PGMb54ie#tQ3VkTE>M8b>n fP2%BUxjRKxH>^)M>~=J2)0&$bc`mcDFjxZsWfwhm diff --git a/doc/salome/gui/SMESH/wht_toc_n.gif b/doc/salome/gui/SMESH/wht_toc_n.gif deleted file mode 100755 index ce283101f4204c55c042012228385fb6fefef830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmZ?wbhEHb6l4%!*v!Ci;J^U}oR0_I6278?~j`dAG5&b;`T z(lAAtd4tFcA+_V}BAIqFnUf#;u$YFH{qdZ%{K6E=QoEX&fedGsSmj%V{=EF;$m)oN Sv)-K8y4t-hft8Jg!5RR!bUSIM3=H~ zN)dJACBnOLG2yCKg3_iIgCMkYRX44^=D7ne&-cwcGiS~@&%6J?t1s?4K7}d#g%MhM zv~;NdN!jsxUi#%e4Q`Mj3~49>2qQ>1AtHz*ih#o$bhtx~aHOLgJ}X>_BEVN7Eg zySCFEPKpdN$?5@4^O1F@oZ(DoIh&+ul)5M}#1u3M2>&BvDR zk}F*4D({iq-G!YS5mHJewG$RJ+o3X_iiplDN9wt zxED>Y-R`3HuM)Pip z&1NhV%2Xqdn_)5Z^%z@5WJXprc;ocQ?(V|Q<>cZ0h>MaYeOV@$EFFFJua3=suUH2B zi|zfgzlbSd)m1!P{p98E;;|FUH#~7C4$f`g_{fi&XD|OWxA)BYnfI1|Hvj$2Gk?7D z{@#UCv2)qF{b!%~`O|myoS58NJ!R{@{o>r=={0v(-9CTg>%-GqrnyG@K6&o*{~mvE zZQIO+=^a<+zsf5we}FgtJaT;IOKf}N*S7SGk;rHSbOjF#b2@K=7*bBJpJ0@wSy~PcO&VR2YQMZ#sDTX=cCZ{OXWotfu7aB%eW~9-LGKMjY zW$fBccQ`3B$Rw)=IL$}aopOdVo#kwjrcvsm#1K;~v6)+peh(@b!3J*i|Q zGg-;j$cl~RMHQo%#VTT`+vDUz9>pN7f?74Rf$b)l!jz^mVXzqs`BHu{^)(+` zx=XHbrK`M0c6S$cZbV2amDEmHsQGxOLJ`VPh1woVHA(NfRHQOhsrJlD&D^`W6s0Ux z3FBTgy>`2c+QYW1of$5g4K3Wp#IQ`uvNorE7y>y5ObmHiiQ%{TP|bZ{hi7`0w;0X4 zDK?w2P$*N4JZ^@?(AQ&Z8Ic)T(cq2KBfGl`JD1Dvmm+RUTJFoTjOCT1&;Hf1>D^=s z_z&CqWq%QK!0a`=Up;>&YHISq`gNaP-*j%Iq4yyztld;} ./doxyfile1; \ - mv -f doxyfile1 doxyfile; \ - $(doxygen) ./doxyfile; \ - mkdir py1; mkdir py2; \ - cd .. - for file in $(PYTHON_SCRIPTS) dummy; do \ - if [ $$file != "dummy" ]; then \ - cp $(root_srcdir)/src/SMESH_SWIG/$$file INPUT/py1/; \ - fi ; \ - done - cd INPUT; \ - python $(KERNEL_ROOT_DIR)/doc/salome/tui/KERNEL/pythfilter.py ./py1 ./py2; \ - sed 's|list_py_files_to_process|$(PYTHON_SCRIPTS)|' ./doxyfile_py > py2/doxyfile_py; \ - cd py2; \ - $(doxygen) ./doxyfile_py; \ - cd ../..; \ - cp -fr $(srcdir)/SMESH/sources/static/*.* ./SMESH/ - cp -fr $(srcdir)/SMESH/sources/ SMESH/ - cp -fr $(srcdir)/SMESH/HTML/ SMESH/ - rm -fr INPUT - -clean: - rm -fr SMESH - -distclean: clean - rm -fr INPUT - -install: - $(INSTALL) -d $(docdir); \ - mkdir -p $(docdir)/tui - cp -fr SMESH $(docdir)/tui - -uninstall: - rm -fr $(docdir)/tui/SMESH diff --git a/doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html b/doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html deleted file mode 100644 index 8007326bb..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - -
interface StdMeshers_LocalLength
IDL file
Python
void SetLength ( in double length )
SetLength ( length )
double GetLength ( )
return_value = GetLength ( )

- - - - - - - - - - - - - - - - - - - - - - - -
interface StdMeshers_NumberOfSegments
IDL file
Python
void SetNumberOfSegments ( in long segmentsNumber )
SetNumberOfSegments ( segmentsNumber )
long GetNumberOfSegments ( )
return_value = GetNumberOfSegments ( )
void SetScaleFactor ( in double scaleFactor )
SetScaleFactor ( scaleFactor )
double GetScaleFactor ( )
return_value = GetScaleFactor ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_Arithmetic1D
IDL file
Python
void SetLength ( in double length, in boolean isStartLength )
SetLength ( length, isStartLength )
double GetLength ( in boolean isStartLength )
return_value = GetLength ( isStartLength )

- - - - - - - - - - - - - - - -
interface StdMeshers_MaxElementArea
IDL file
Python
void SetMaxElementArea ( in double area )
SetMaxElementArea ( area )
double GetMaxElementArea ( )
return_value = GetMaxElementArea ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_LengthFromEdges
IDL file
Python
void SetMode ( in long mode )
SetMode ( mode )
long GetMode ( )
return_value = GetMode ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_StartEndLength
IDL file
Python
void SetLength ( in double length, in boolean isStartLength )
SetLength ( length, isStartLength )
double GetLength ( in boolean isStartLength )
return_value = GetLength ( isStartLength )

- - - - - - - - - - - - - - - -
interface StdMeshers_Deflection1D
IDL file
Python
void SetDeflection ( in double deflection )
SetDeflection ( deflection )
double GetDeflection ( )
return_value = GetDeflection ( )

- - - - - - - - - - - - - - - -
interface StdMeshers_MaxElementVolume
IDL file
Python
void SetMaxElementVolume ( in double volume )
SetMaxElementVolume ( volume )
double GetMaxElementVolume ( )
return_value = GetMaxElementVolume ( )

- - - - - - - -
interface StdMeshers_NotConformAllowed
IDL file
Python

- - - - - - - -
interface StdMeshers_Propagation
IDL file
Python

- - - - - - - -
interface StdMeshers_Regular_1D
IDL file
Python

- - - - - - - -
interface StdMeshers_MEFISTO_2D
IDL file
Python

- - - - - - - -
interface StdMeshers_Quadrangle_2D
IDL file
Python

- - - - - - - -
interface StdMeshers_Hexa_3D
IDL file
Python

-
diff --git a/doc/salome/tui/SMESH/HTML/SMESH_Gen.html b/doc/salome/tui/SMESH/HTML/SMESH_Gen.html deleted file mode 100644 index 8fdf3b2a6..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_Gen.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_Gen
IDL file
Python
FilterManager CreateFilterManager ( )
return_value = CreateFilterManager ( )
SMESH_Pattern GetPattern ( )
return_value = GetPattern ( )
void SetCurrentStudy ( in Study theStudy )
SetCurrentStudy ( theStudy )
Study GetCurrentStudy ( )
return_value = GetCurrentStudy ( )
SMESH_Hypothesis CreateHypothesis ( in string theHypName, in string theLibName )
return_value = CreateHypothesis ( theHypName, theLibName )
SMESH_Mesh CreateMesh ( in GEOM_Object theObject )
return_value = CreateMesh ( theObject )
SMESH_Mesh CreateMeshesFromUNV ( in string theFileName )
return_value = CreateMeshesFromUNV ( theFileName )
mesh_array CreateMeshesFromMED ( in string theFileName, out DriverMED_ReadStatus theStatus )
[ return_value, theStatus ] = CreateMeshesFromMED ( theFileName )
SMESH_Mesh CreateMeshesFromSTL ( in string theFileName )
return_value = CreateMeshesFromSTL ( theFileName )
boolean Compute ( in SMESH_Mesh theMesh, in GEOM_Object theSubObject )
return_value = Compute ( theMesh, theSubObject )
boolean IsReadyToCompute ( in SMESH_Mesh theMesh, in GEOM_Object theSubObject )
return_value = IsReadyToCompute ( theMesh, theSubObject )
long_array GetSubShapesId ( in GEOM_Object theMainObject, in object_array theListOfSubObjects )
return_value = GetSubShapesId ( theMainObject, theListOfSubObjects )

-
diff --git a/doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html b/doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html deleted file mode 100644 index ff9d3d619..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
interface SMESH_Hypothesis
IDL file
Python
string GetName ( )
return_value = GetName ( )
string GetLibName ( )
return_value = GetLibName ( )
long GetId ( )
return_value = GetId ( )

- - - - - - - - - - - -
interface SMESH_Algo
IDL file
Python
ListOfHypothesisName GetCompatibleHypothesis ( )
return_value = GetCompatibleHypothesis ( )

- - - - - - - -
interface SMESH_1D_Algo
IDL file
Python

- - - - - - - -
interface SMESH_2D_Algo
IDL file
Python

- - - - - - - -
interface SMESH_3D_Algo
IDL file
Python

-
diff --git a/doc/salome/tui/SMESH/HTML/SMESH_Mesh.html b/doc/salome/tui/SMESH/HTML/SMESH_Mesh.html deleted file mode 100644 index 527298f54..000000000 --- a/doc/salome/tui/SMESH/HTML/SMESH_Mesh.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_Mesh
IDL file
Python
SMESH_subMesh GetSubMesh ( in GEOM_Object aSubObject, in string name )
return_value = GetSubMesh ( aSubObject, name )
void RemoveSubMesh ( in SMESH_subMesh aSubMesh )
RemoveSubMesh ( aSubMesh )
SMESH_Group CreateGroup ( in ElementType elem_type, in string name )
return_value = CreateGroup ( elem_type, name )
SMESH_Group CreateGroupFromGEOM ( in ElementType elem_type, in string name, in GEOM_Object theGEOMGroup )
return_value = CreateGroupFromGEOM ( elem_type, name, theGEOMGroup )
void RemoveGroup ( in SMESH_Group aGroup )
RemoveGroup ( aGroup )
void RemoveGroupWithContents ( in SMESH_Group aGroup )
RemoveGroupWithContents ( aGroup )
SMESH_Group UnionGroups ( in SMESH_Group aGroup1, in SMESH_Group aGroup2, in string name )
return_value = UnionGroups ( aGroup1, aGroup2, name )
SMESH_Group IntersectGroups ( in SMESH_Group aGroup1, in SMESH_Group aGroup2, in string name )
return_value = IntersectGroups ( aGroup1, aGroup2, name )
SMESH_Group CutGroups ( in SMESH_Group aMainGroup, in SMESH_Group aToolGroup, in string name )
return_value = CutGroups ( aMainGroup, aToolGroup, name )
Hypothesis_Status AddHypothesis ( in GEOM_Object aSubObject, in SMESH_Hypothesis anHyp )
return_value = AddHypothesis ( aSubObject, anHyp )
Hypothesis_Status RemoveHypothesis ( in GEOM_Object aSubObject, in SMESH_Hypothesis anHyp )
return_value = RemoveHypothesis ( aSubObject, anHyp )
ListOfHypothesis GetHypothesisList ( in GEOM_Object aSubObject )
return_value = GetHypothesisList ( aSubObject )
log_array GetLog ( in boolean clearAfterGet )
return_value = GetLog ( clearAfterGet )
void ClearLog ( )
ClearLog ( )
long GetId ( )
return_value = GetId ( )
long GetStudyId ( )
return_value = GetStudyId ( )
SMESH_MeshEditor GetMeshEditor ( )
return_value = GetMeshEditor ( )
void ExportDAT ( in string file )
ExportDAT ( file )
void ExportMED ( in string file, in boolean auto_groups )
ExportMED ( file, auto_groups )
void ExportUNV ( in string file )
ExportUNV ( file )
void ExportSTL ( in string file, in boolean isascii )
ExportSTL ( file, isascii )
MESH GetMEDMesh ( )
return_value = GetMEDMesh ( )
long NbNodes ( )
return_value = NbNodes ( )
long NbEdges ( )
return_value = NbEdges ( )
long NbFaces ( )
return_value = NbFaces ( )
long NbTriangles ( )
return_value = NbTriangles ( )
long NbQuadrangles ( )
return_value = NbQuadrangles ( )
long NbVolumes ( )
return_value = NbVolumes ( )
long NbTetras ( )
return_value = NbTetras ( )
long NbHexas ( )
return_value = NbHexas ( )
long NbPyramids ( )
return_value = NbPyramids ( )
long NbPrisms ( )
return_value = NbPrisms ( )
long NbSubMesh ( )
return_value = NbSubMesh ( )
string Dump ( )
return_value = Dump ( )

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_subMesh
IDL file
Python
long GetNumberOfElements ( )
return_value = GetNumberOfElements ( )
long GetNumberOfNodes ( in boolean all )
return_value = GetNumberOfNodes ( all )
long_array GetElementsId ( )
return_value = GetElementsId ( )
long_array GetElementsByType ( in ElementType theType )
return_value = GetElementsByType ( theType )
long_array GetNodesId ( )
return_value = GetNodesId ( )
SMESH_Mesh GetFather ( )
return_value = GetFather ( )
long GetId ( )
return_value = GetId ( )
FAMILY GetFamily ( )
return_value = GetFamily ( )

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
interface SMESH_MeshEditor
IDL file
Python
boolean RemoveElements ( in long_array IDsOfElements )
return_value = RemoveElements ( IDsOfElements )
boolean RemoveNodes ( in long_array IDsOfNodes )
return_value = RemoveNodes ( IDsOfNodes )
boolean AddNode ( in double x, in double y, in double z )
return_value = AddNode ( x, y, z )
boolean AddEdge ( in long_array IDsOfNodes )
return_value = AddEdge ( IDsOfNodes )
boolean AddFace ( in long_array IDsOfNodes )
return_value = AddFace ( IDsOfNodes )
boolean AddVolume ( in long_array IDsOfNodes )
return_value = AddVolume ( IDsOfNodes )
boolean MoveNode ( in long NodeID, in double x, in double y, in double z )
return_value = MoveNode ( NodeID, x, y, z )
boolean InverseDiag ( in long NodeID1, in long NodeID2 )
return_value = InverseDiag ( NodeID1, NodeID2 )
boolean DeleteDiag ( in long NodeID1, in long NodeID2 )
return_value = DeleteDiag ( NodeID1, NodeID2 )
boolean Reorient ( in long_array IDsOfElements )
return_value = Reorient ( IDsOfElements )
boolean TriToQuad ( in long_array IDsOfElements, in NumericalFunctor Criterion, in double MaxAngle )
return_value = TriToQuad ( IDsOfElements, Criterion, MaxAngle )
boolean QuadToTri ( in long_array IDsOfElements, in NumericalFunctor Criterion )
return_value = QuadToTri ( IDsOfElements, Criterion )
boolean SplitQuad ( in long_array IDsOfElements, in boolean Diag13 )
return_value = SplitQuad ( IDsOfElements, Diag13 )
boolean Smooth ( in long_array IDsOfElements, in long_array IDsOfFixedNodes, in long MaxNbOfIterations, in double MaxAspectRatio, in Smooth_Method Method )
return_value = Smooth ( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method )
void RenumberNodes ( )
RenumberNodes ( )
void RenumberElements ( )
RenumberElements ( )
void RotationSweep ( in long_array IDsOfElements, in AxisStruct Axix, in double AngleInRadians, in long NbOfSteps, in double Tolerance )
RotationSweep ( IDsOfElements, Axix, AngleInRadians, NbOfSteps, Tolerance )
void ExtrusionSweep ( in long_array IDsOfElements, in DirStruct StepVector, in long NbOfSteps )
ExtrusionSweep ( IDsOfElements, StepVector, NbOfSteps )
void Mirror ( in long_array IDsOfElements, in AxisStruct Mirror, in MirrorType theMirrorType, in boolean Copy )
Mirror ( IDsOfElements, Mirror, theMirrorType, Copy )
void Translate ( in long_array IDsOfElements, in DirStruct Vector, in boolean Copy )
Translate ( IDsOfElements, Vector, Copy )
void Rotate ( in long_array IDsOfElements, in AxisStruct Axis, in double AngleInRadians, in boolean Copy )
Rotate ( IDsOfElements, Axis, AngleInRadians, Copy )
void FindCoincidentNodes ( in double Tolerance, out array_of_long_array GroupsOfNodes )
GroupsOfNodes = FindCoincidentNodes ( Tolerance )
void MergeNodes ( in array_of_long_array GroupsOfNodes )
MergeNodes ( GroupsOfNodes )
void MergeEqualElements ( )
MergeEqualElements ( )
boolean SewFreeBorders ( in long FirstNodeID1, in long SecondNodeID1, in long LastNodeID1, in long FirstNodeID2, in long SecondNodeID2, in long LastNodeID2 )
return_value = SewFreeBorders ( FirstNodeID1, SecondNodeID1, LastNodeID1, FirstNodeID2, SecondNodeID2, LastNodeID2 )
boolean SewConformFreeBorders ( in long FirstNodeID1, in long SecondNodeID1, in long LastNodeID1, in long FirstNodeID2, in long SecondNodeID2 )
return_value = SewConformFreeBorders ( FirstNodeID1, SecondNodeID1, LastNodeID1, FirstNodeID2, SecondNodeID2 )
boolean SewBorderToSide ( in long FirstNodeIDOnFreeBorder, in long SecondNodeIDOnFreeBorder, in long LastNodeIDOnFreeBorder, in long FirstNodeIDOnSide, in long LastNodeIDOnSide )
return_value = SewBorderToSide ( FirstNodeIDOnFreeBorder, SecondNodeIDOnFreeBorder, LastNodeIDOnFreeBorder, FirstNodeIDOnSide, LastNodeIDOnSide )
boolean SewSideElements ( in long_array IDsOfSide1Elements, in long_array IDsOfSide2Elements, in long NodeID1OfSide1ToMerge, in long NodeID1OfSide2ToMerge, in long NodeID2OfSide1ToMerge, in long NodeID2OfSide2ToMerge )
return_value = SewSideElements ( IDsOfSide1Elements, IDsOfSide2Elements, NodeID1OfSide1ToMerge, NodeID1OfSide2ToMerge, NodeID2OfSide1ToMerge, NodeID2OfSide2ToMerge )

-
diff --git a/doc/salome/tui/SMESH/sources/Application-About.png b/doc/salome/tui/SMESH/sources/Application-About.png deleted file mode 100755 index 7b58330d50856e28562e8f9ed80dae72d6e6dda3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19226 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

5r3>=?gKv-6#gF2kVYm^Euk4pDx%bDo{L~m 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 Ao&W#< diff --git a/doc/salome/tui/SMESH/sources/application.gif b/doc/salome/tui/SMESH/sources/application.gif deleted file mode 100644 index 0b05d5c18ee88779d283508781836e2b151f606f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2602 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 diff --git a/doc/salome/tui/SMESH/sources/bg_salome.gif b/doc/salome/tui/SMESH/sources/bg_salome.gif deleted file mode 100755 index 677b70468f798fe4fbc20fac3d706e61179ff12b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17294 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 diff --git a/doc/salome/tui/SMESH/sources/myheader.html b/doc/salome/tui/SMESH/sources/myheader.html deleted file mode 100755 index 83ca543cd..000000000 --- a/doc/salome/tui/SMESH/sources/myheader.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Main Page - - - -  -
- - - - - - -
-
-
- - - - diff --git a/doc/salome/tui/SMESH/sources/myheader_py2.html b/doc/salome/tui/SMESH/sources/myheader_py2.html deleted file mode 100755 index 372b2247f..000000000 --- a/doc/salome/tui/SMESH/sources/myheader_py2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Main Page - - - -  -
- - - - - - -
-
-
- - - - diff --git a/doc/salome/tui/SMESH/sources/occ.gif b/doc/salome/tui/SMESH/sources/occ.gif deleted file mode 100755 index ce017c8ae11236ef5c52eee1723657cb8b08989f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14790 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⁣iMxf-qnJ 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 diff --git a/doc/salome/tui/SMESH/sources/static/PluginMeshers.html b/doc/salome/tui/SMESH/sources/static/PluginMeshers.html deleted file mode 100755 index f860aef7b..000000000 --- a/doc/salome/tui/SMESH/sources/static/PluginMeshers.html +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - - Main Page - - - - -   -
- - - - - - - - -
-

-

-
- -
-
- -
- -
-

(as a set of hypotheses and algorithms)

-
- -
-

to the application.

-
- -

Table of contents

- - - -

1. Introduction

- All hypotheses and algorithms are available in SMESH module via plugin mechanism. -Such approach allows easily to introduce new hypotheses and algorithms types -to the application. Also, it makes possible the customization of available -hypotheses and algorithms list for different users without recompilation -of sources.
-The goal of this document is to describe the process of creation external -mesher plugins. -

Back to the contents

-

2. Implementation steps

- -

-

2.1. Mesher plugin package

-
-

How to add your own mesher

-

-Create your mesher plugin package which will contain the sources files, e.g. - MyMesherPlugin.
-
-Back -to the contents
-

2.2. List of available hypotheses and algorithms

-Create XML file to describe all algorithms and hypotheses, provided by your -plugin package (see SMESH_SRC/resources/SMESH_Meshers.xml for example).
-
<meshers-group name="MyName"
-               resources="MyResourceKey"
-               -server-lib="libMyServerLib.so"
-               gui-lib="libMyClientLib.so">
-     <hypotheses>
-          <hypothesis type="MyHypType1"
-                  -    label-id="My beautiful hypothesis name"
-                   -   icon-id="my_hypo_1_icon.png"/>
-          </hypotheses>
-     <algorithms>
-          <algorithm type="MyAlgType1"
-                -     label-id="My beautiful algorithm name"
-                 -    icon-id="my_algo_1_icon.png"/>
-          </algorithms>
-</meshers-group>
-

- -
    -
  • Attributes of <meshers-group> tag:
  • -
-
-
    -
  • value of <name> attribute is used to collect hypotheses/algoritms -in groups; you can also use this attribute for short description of your -mesher plugin.
  • -
  • value of <resources> attribute (MyResourceKey) is used to -access resources (messages and icons) from GUI (see paragraphs 2.4.2 and 2.5); in the current implementation -it should coincide with the name of plugin package; this limitation will -be eliminated in the further development.
  • -
  • value of <server-lib> attribute describes the name of your -mesher's server plugin library (See paragraph 2.3)
  • -
  • value of <gui-lib> attribute describes the name of your mesher's -client plugin library (See paragraph 2.4)
  • -
-
-
    -
  • Attributes of <hypothesis/algorithm> tag:
  • -
-
-
    -
  • value of <type> attribute is an unique name of the hypothesis/algorithm
  • -
-
    -
      -
    • It is a value of _name field of your hypothesis class (see paragraph - 2.3, implementation of constructor of StdMeshers_LocalLength -class: _name = "LocalLength")
    • -
    • It is a key to each certain hypothesis class (see paragraph 2.3, implementation of "GetHypothesisCreator()" method in -StdMeshers_i.cxx)
    • -
    • It is a key to each certain hypothesis GUI (see paragraph 2.4, implementation of "StdMeshersGUI_HypothesisCreator::CreateHypothesis()" -and "StdMeshersGUI_HypothesisCreator::EditHypothesis()" methods in StdMeshersGUI.cxx)
    • -
    • It is a key to each certain hypothesis icon in Object Browser -(see paragraph 2.4.2.1)
    • -
    -
-
-
-
    -
  • value of <label-id> attribute is displayed in the GUI in -the list of available hypotheses/algorithms ("Create Hypothesis/Algorithm" -dialog)
  • -
  • value of <icon-id> attribute is a name of icon file, which -is displayed in GUI in the list of available hypotheses/algorithms ("Create -Hypothesis/Algorithm" dialog)
  • -
-
-Note: All attributes values are accessible in your GUI via HypothesisData -class (see paragraph 2.4.1)
-
-Note: The environment variable SMESH_MeshersList contains the list of plugins -names, separated by colon (":") symbol, e.g.:
-
-     setenv SMESH_MeshersList StdMeshers:NETGENPlugin
-
-Please, pay attention that StdMeshers should also be included into this environment -variable, if you want to use standard hypotheses/algorithms, provided with -SMESH module.
-
-The SALOME automatically locates XML files, searching them in the following -directories:
-
-    ${<PLUGINNAME>_ROOT_DIR}/share/salome/resources
-    ${SALOME_<PluginName>Resources}
-    ${HOME}/.salome/resources
-    ${KERNEL_ROOT_DIR}/share/salome/resources

-
-where <PluginName> is a name of each mesher plugin package
-
-Back to the contents -

2.3. Build server plugin library <libMyServerLib.so>.

- -

2.3.1. Define interface to your hypotheses and algorithms.

- -
Example: SMESH_SRC/idl/SMESH_BasicHypothesis.idl
-         NETGENPLUGIN_SRC/src/NETGENPlugin_Algorithm.idl
-
- -

2.3.2. Implement functionality of your hypotheses -and algorithms.

- -
Inherit corresponding classes from SMESH. -

Example: SMESH_SRC/src/StdMeshers/StdMeshers_*
-         NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D
-

-
- -

2.3.3.Implement interface to your hypotheses and -algorithms.

- -
Inherit corresponding classes from SMESH_I. -

Example: SMESH_SRC/src/StdMeshers_I/SMESH_*_i
-         NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D_i
-

-
- -

2.3.4. Implement being exported method.

- -
GenericHypothesisCreator_i* GetHypothesisCreator (const char* -aHypType) -

<aHypType> is a value of <type> attribute in the XML-description -file

-
- -
Example: SMESH_SRC/src/StdMeshers_I/StdMeshers_i.cxx
-         NETGENPLUGIN_SRC/src/NETGENPlugin_i.cxx
-
- Back to the contents -

2.4. Build client (GUI) plugin library <libMyClientLib.so>.

- -
This step is required only if your hypotheses/algorithms need -specific GUI for their construction.
- -

2.4.1. Implement the required GUI (e.g. construction -dialog boxes).

- -
Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI_*Dlg -

Note: all data from XML-description files is accessible in your GUI -via HypothesisData class  (mySMESHGUI->GetHypothesisData (aHypType), -see SMESHGUI_Hypotheses.h for HypothesisData definition)

-
- -

2.4.2. Provide icons and messages for your GUI.

- -
2.4.2.1. Implement resource files
- -
MyResourceKey_icons.po and MyResourceKey_msg_en.po -

Example: SMESH_SRC/src/StdMeshersGUI/StdMeshers_*.po
-         NETGENPLUGIN_SRC/src/NETGENPlugin_icons.po
-

-Note: ICON_SMESH_TREE_HYPO_MyHypType1 is ID of icon for Object Browser for -hypothesis with type="MyHypType1"; ICON_SMESH_TREE_ALGO_MyAlgType1 is ID -of icon for Object Browser for algorithm with type="MyAlgType1".
-See paragraph 2 for definition of MyResourceKey, MyHypType1, MyAlgType1.
-

-
- -
2.4.2.2. Define environment variable SALOME_<MyResourceKey>Resources
-
It should point to the directory where resources are situated.
- -
Example: setenv SALOME_StdMeshersResources ${SMESH_ROOT_DIR}/share/salome/resources
- -

2.4.3. Implement your Hypothesis Creator and being -exported method

- -
SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator -
-   (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI) -

<aHypType> is to pass a value of <type> attribute in XML-description -file;
-<aServerLibName> is to pass a value of <server-lib> attribute -in XML-description file.

-

Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI.cxx

-
- Back to the contents -

2.5. Provide icons for object browser.

- -
If your hypotheses/algorithms do not need specific GUI, but you -want to provide icons for object browser, see 2.4.2 paragrath.
-
- - -

2.6. Setup your SALOME environment.

- -

2.6.1.  Add your plugin to the LD_LIBRARY_PATH, -PYTHONPATH (and maybe PATH) environment variables.
-

-
setenv PATH <path-to-my-plugin>/bin/salome:${PATH}
-setenv LD_LIBRARY_PATH <path-to-my-plugin>/lib/salome:${LD_LIBRARY_PATH}
-Setenv PYTHONPATH <path-to-my-plugin>/lib/python2.2/site-packages/salome:${PYTHONPATH}
-
  
-
-

2.6.2.  Set mesher plugin resources environment -variable

-
 This enviroment variable is used to set meshers plugins -which should be loaded by SMESH module (see 2.4.2.2 -paragraph). Add your plugin to this variable. All plugins are separated by -colon (":") symbol.
-
-Note: If you use runSalome.py script from KERNEL package to launch SALOME, -you may not to set environment variables, because this script sets them itself. -All what you should do is to add <plugin> section to your ${HOME}/.salome/salome.launch -file for SMESH module section:
-
-...
-<modules-list>
-    ...
-    <module name="SMESH">
-        <plugin name="MyMesher"/>
-    </module>
-    ...
-</modules-list>
-...

-
-Back to the contents

- - diff --git a/doc/salome/tui/SMESH/sources/static/doxygen.css b/doc/salome/tui/SMESH/sources/static/doxygen.css deleted file mode 100755 index 0a8e93d50..000000000 --- a/doc/salome/tui/SMESH/sources/static/doxygen.css +++ /dev/null @@ -1,49 +0,0 @@ -H1 { text-align: center; } -CAPTION { font-weight: bold } -A.qindex {} -A.qindexRef {} -A.el { text-decoration: none; font-weight: bold } -A.elRef { font-weight: bold } -A.code { text-decoration: none; font-weight: normal; color: #4444ee } -A.codeRef { font-weight: normal; color: #4444ee } -A:hover { text-decoration: none; background-color: lightblue } -DL.el { margin-left: -1cm } -DIV.fragment { width: 100%; border: none; background-color: #CCCCCC } -DIV.ah { background-color: #CCCCCC; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } -TD.md { background-color: lightblue; font-weight: bold; } -TD.mdname1 { background-color: lightblue; font-weight: bold; color: #602020; } -TD.mdname { background-color: lightblue; font-weight: bold; color: #602020; width: 600px; } -DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold } -DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller } -BODY { background: url(sources/bg_salome.gif) } -TD.indexkey { - background-color: #CCCCCC; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -TD.indexvalue { - background-color: #CCCCCC; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} -span.keyword { color: #008000 } -span.keywordtype { color: #604020 } -span.keywordflow { color: #e08000 } -span.comment { color: #800000 } -span.preprocessor { color: #806020 } -span.stringliteral { color: #002080 } -span.charliteral { color: #008080 } diff --git a/doc/salome/tui/SMESH/sources/static/page2.html b/doc/salome/tui/SMESH/sources/static/page2.html deleted file mode 100755 index 0e5c0ad5e..000000000 --- a/doc/salome/tui/SMESH/sources/static/page2.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - Main Page - - - - -   -
- - - - - - - - -
- - -
-
- - -
- - diff --git a/doc/salome/tui/SMESH/sources/static/treeview.js b/doc/salome/tui/SMESH/sources/static/treeview.js deleted file mode 100644 index 55eb43d07..000000000 --- a/doc/salome/tui/SMESH/sources/static/treeview.js +++ /dev/null @@ -1,505 +0,0 @@ -//**************************************************************** -// You are free to copy the "Folder-Tree" script as long as you -// keep this copyright notice: -// Script found in: http://www.geocities.com/Paris/LeftBank/2178/ -// Author: Marcelino Alves Martins (martins@hks.com) December '97. -//**************************************************************** - -//Log of changes: -// 17 Feb 98 - Fix initialization flashing problem with Netscape -// -// 27 Jan 98 - Root folder starts open; support for USETEXTLINKS; -// make the ftien4 a js file -// -// DvH: Dec 2000 - Made some minor changes to support external -// references - -// Definition of class Folder -// ***************************************************************** - -function Folder(folderDescription, tagName, hreference) //constructor -{ - //constant data - this.desc = folderDescription - this.tagName = tagName - this.hreference = hreference - this.id = -1 - this.navObj = 0 - this.iconImg = 0 - this.nodeImg = 0 - this.isLastNode = 0 - - //dynamic data - this.isOpen = true - this.iconSrc = "ftv2folderopen.png" - this.children = new Array - this.nChildren = 0 - - //methods - this.initialize = initializeFolder - this.setState = setStateFolder - this.addChild = addChild - this.createIndex = createEntryIndex - this.hide = hideFolder - this.display = display - this.renderOb = drawFolder - this.totalHeight = totalHeight - this.subEntries = folderSubEntries - this.outputLink = outputFolderLink -} - -function setStateFolder(isOpen) -{ - var subEntries - var totalHeight - var fIt = 0 - var i=0 - - if (isOpen == this.isOpen) - return - - if (browserVersion == 2) - { - totalHeight = 0 - for (i=0; i < this.nChildren; i++) - totalHeight = totalHeight + this.children[i].navObj.clip.height - subEntries = this.subEntries() - if (this.isOpen) - totalHeight = 0 - totalHeight - for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) - indexOfEntries[fIt].navObj.moveBy(0, totalHeight) - } - this.isOpen = isOpen - propagateChangesInState(this) -} - -function propagateChangesInState(folder) -{ - var i=0 - - if (folder.isOpen) - { - if (folder.nodeImg) - if (folder.isLastNode) - folder.nodeImg.src = "ftv2mlastnode.png" - else - folder.nodeImg.src = "ftv2mnode.png" - folder.iconImg.src = "ftv2folderopen.png" - for (i=0; i 0) - auxEv = "" - else - auxEv = "" - - if (level>0) - if (lastNode) //the last 'brother' in the children array - { - this.renderOb(leftSide + auxEv + "") -// leftSide = leftSide + "" - this.isLastNode = 1 - } - else - { - this.renderOb(leftSide + auxEv + "") - leftSide = leftSide + "" - this.isLastNode = 0 - } - else - this.renderOb("") - - if (nc > 0) - { - level = level + 1 - for (i=0 ; i < this.nChildren; i++) - { - if (i == this.nChildren-1) - this.children[i].initialize(level, 1, leftSide) - else - this.children[i].initialize(level, 0, leftSide) - } - } -} - -function drawFolder(leftSide) -{ - if (browserVersion == 2) { - if (!doc.yPos) - doc.yPos=8 - doc.write("") - } - if (browserVersion == 3) - { - doc.write("
") - } - - doc.write("\n") - doc.write("\n\n") - doc.write("\n
") - doc.write(leftSide) - this.outputLink() - doc.write("") - doc.write("") - if (USETEXTLINKS) - { - this.outputLink() - doc.write(this.desc + "") - } - else - doc.write(this.desc) - -/*! - if (this.tagName!="") - { - doc.write(" [external]") - } -*/ - doc.write("
\n") - - if (browserVersion == 2) { - doc.write("") - } - if (browserVersion == 3) { - doc.write("
") - } - - if (browserVersion == 1) { - this.navObj = doc.all["folder"+this.id] - this.iconImg = doc.all["folderIcon"+this.id] - this.nodeImg = doc.all["nodeIcon"+this.id] - } else if (browserVersion == 2) { - this.navObj = doc.layers["folder"+this.id] - this.iconImg = this.navObj.document.images["folderIcon"+this.id] - this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] - doc.yPos=doc.yPos+this.navObj.clip.height - } else if (browserVersion == 3) { - this.navObj = doc.getElementById("folder"+this.id) - this.iconImg = doc.images.namedItem("folderIcon"+this.id) - this.nodeImg = doc.images.namedItem("nodeIcon"+this.id) - } -} - -function outputFolderLink() -{ - if (this.hreference) - { - doc.write(" 0) - doc.write("onClick='javascript:clickOnFolder("+this.id+")'") - doc.write(">") - } - else - doc.write("") -} - -function addChild(childNode) -{ - this.children[this.nChildren] = childNode - this.nChildren++ - return childNode -} - -function folderSubEntries() -{ - var i = 0 - var se = this.nChildren - - for (i=0; i < this.nChildren; i++){ - if (this.children[i].children) //is a folder - se = se + this.children[i].subEntries() - } - - return se -} - - -// Definition of class Item (a document or link inside a Folder) -// ************************************************************* - -function Item(itemDescription, tagName, itemLink) // Constructor -{ - // constant data - this.desc = itemDescription - this.tagName = tagName - this.link = itemLink - this.id = -1 //initialized in initalize() - this.navObj = 0 //initialized in render() - this.iconImg = 0 //initialized in render() - this.iconSrc = "ftv2doc.png" - - // methods - this.initialize = initializeItem - this.createIndex = createEntryIndex - this.hide = hideItem - this.display = display - this.renderOb = drawItem - this.totalHeight = totalHeight -} - -function hideItem() -{ - if (browserVersion == 1 || browserVersion == 3) { - if (this.navObj.style.display == "none") - return - this.navObj.style.display = "none" - } else { - if (this.navObj.visibility == "hidden") - return - this.navObj.visibility = "hidden" - } -} - -function initializeItem(level, lastNode, leftSide) -{ - this.createIndex() - - if (level>0) - if (lastNode) //the last 'brother' in the children array - { - this.renderOb(leftSide + "") - leftSide = leftSide + "" - } - else - { - this.renderOb(leftSide + "") - leftSide = leftSide + "" - } - else - this.renderOb("") -} - -function drawItem(leftSide) -{ - if (browserVersion == 2) - doc.write("") - if (browserVersion == 3) - doc.write("
") - - doc.write("\n\n") - doc.write("\n
") - doc.write(leftSide) - if (this.link!="") - { - doc.write("") - } - doc.write("") - if (this.link!="") - { - doc.write("") - } - doc.write("") - if (USETEXTLINKS && this.link!="") - doc.write("" + this.desc + "") - else - doc.write(this.desc) -/*! - if (this.tagName!="") - { - doc.write(" [external]"); - } -*/ - doc.write("\n
\n") - - if (browserVersion == 2) - doc.write("") - if (browserVersion == 3) - doc.write("
") - - if (browserVersion == 1) { - this.navObj = doc.all["item"+this.id] - this.iconImg = doc.all["itemIcon"+this.id] - } else if (browserVersion == 2) { - this.navObj = doc.layers["item"+this.id] - this.iconImg = this.navObj.document.images["itemIcon"+this.id] - doc.yPos=doc.yPos+this.navObj.clip.height - } else if (browserVersion == 3) { - this.navObj = doc.getElementById("item"+this.id) - this.iconImg = doc.images.namedItem("itemIcon"+this.id) - } -} - - -// Methods common to both objects (pseudo-inheritance) -// ******************************************************** - -function display() -{ - if (browserVersion == 1 || browserVersion == 3) - this.navObj.style.display = "block" - else - this.navObj.visibility = "show" -} - -function createEntryIndex() -{ - this.id = nEntries - indexOfEntries[nEntries] = this - nEntries++ -} - -// total height of subEntries open -function totalHeight() //used with browserVersion == 2 -{ - var h = this.navObj.clip.height - var i = 0 - - if (this.isOpen) //is a folder and _is_ open - for (i=0 ; i < this.nChildren; i++) - h = h + this.children[i].totalHeight() - - return h -} - - -// Events -// ********************************************************* - -function clickOnFolder(folderId) -{ - var clicked = indexOfEntries[folderId] - - if (!clicked.isOpen) - clickOnNode(folderId) - - return - - if (clicked.isSelected) - return -} - -function clickOnNode(folderId) -{ - var clickedFolder = 0 - var state = 0 - - clickedFolder = indexOfEntries[folderId] - state = clickedFolder.isOpen - - clickedFolder.setState(!state) //open<->close -} - -function initializeDocument() -{ - doc = document; - if (doc.all) - browserVersion = 1 //IE4 - else - if (doc.layers) - browserVersion = 2 //NS4 - else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1) - browserVersion = 3 //mozilla - else - browserVersion = 0 //other - - foldersTree.initialize(0, 1, "") - foldersTree.display() - - if (browserVersion > 0) - { - if(browserVersion != 3) - doc.write(" ") - - // close the whole tree - clickOnNode(0) - // open the root folder - clickOnNode(0) - } -} - -// Auxiliary Functions for Folder-Treee backward compatibility -// ********************************************************* - -function gFld(description, tagName, hreference) -{ - folder = new Folder(description, tagName, hreference) - return folder -} - -function gLnk(description, tagName, linkData) -{ - fullLink = "" - - if (linkData!="") - { - fullLink = "'"+linkData+"' target=\"basefrm\"" - } - - linkItem = new Item(description, tagName, fullLink) - return linkItem -} - -function insFld(parentFolder, childFolder) -{ - return parentFolder.addChild(childFolder) -} - -function insDoc(parentFolder, document) -{ - parentFolder.addChild(document) -} - -// Global variables -// **************** - -USETEXTLINKS = 1 -indexOfEntries = new Array -nEntries = 0 -doc = document -browserVersion = 0 -selectedFolder=0 diff --git a/idl/Makefile.in b/idl/Makefile.in deleted file mode 100644 index 8bc4e84d3..000000000 --- a/idl/Makefile.in +++ /dev/null @@ -1,74 +0,0 @@ -# -# generate dependencies for idl file : -# - -# source path -top_srcdir=@top_srcdir@ -top_builddir=.. -srcdir=@srcdir@ -VPATH=.:${KERNEL_ROOT_DIR}/idl/salome:${GEOM_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome - -@COMMENCE@ - -IDL_FILES = \ - SMESH_Gen.idl \ - SMESH_Mesh.idl \ - SMESH_Hypothesis.idl \ - SMESH_BasicHypothesis.idl \ - SMESH_Filter.idl \ - SMESH_Group.idl \ - SMESH_Pattern.idl - -PY_CLIENT_IDL = $(IDL_FILES) - -# we copy all idl file in $(top_builddir)/idl -inc: $(top_builddir)/idl/salome $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - -$(top_builddir)/idl/salome: - mkdir $@ - -$(IDL_FILES:%=$(top_builddir)/idl/salome/%):$(IDL_FILES:%=$(top_srcdir)/idl/%) -# $(CP) $< $@ - cp -f $^ $(top_builddir)/idl/salome - - -lib: pyidl - -PYTHON_BUILD_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/@PACKAGE@ - -pyidl: $(PYTHON_BUILD_SITE) $(IDL_FILES:%.idl=$(PYTHON_BUILD_SITE)/%_idl.py) - -$(PYTHON_BUILD_SITE): - $(INSTALL) -d $@ - -$(PYTHON_BUILD_SITE)/%_idl.py: $(top_builddir)/idl/salome/%.idl - $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_BUILD_SITE) $< - - -# install python client (generated from idl file -install: install-pyidl install-idl - -# create directory $(idldir) and copy idl files into it -install-idl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - $(INSTALL) -d $(idldir) - $(INSTALL_DATA) $^ $(idldir) - - -install-pyidl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - $(INSTALL) -d $(PYTHON_SITE_INSTALL) - @for file in $^ dummy; do \ - if [ $$file != "dummy" ]; then \ - $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_SITE_INSTALL) $$file ; \ - fi ; \ - done ; - -#@ CONCLUDE @ - -cleandep: - -$(RM) .dep* - -distclean: - -$(RM) *.py - -$(RM) $(IDL_FILES:%=$(top_builddir)/idl/salome/%) - -$(RM) Makefile - diff --git a/idl/SMESH_Group.idl b/idl/SMESH_Group.idl deleted file mode 100644 index 37657674b..000000000 --- a/idl/SMESH_Group.idl +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group.idl -// Author : Sergey ANIKIN, OCC -// $Header$ - - -#ifndef _SMESH_GROUP_IDL_ -#define _SMESH_GROUP_IDL_ - -#include "SALOME_Exception.idl" -#include "SALOME_GenericObj.idl" - -#include "SMESH_Mesh.idl" - -module SMESH -{ - interface Predicate; - - /*! - * SMESH_Group: base interface of group object - */ - interface SMESH_GroupBase : SALOME::GenericObj, SMESH_IDSource - { - /*! - * Sets group name - */ - void SetName( in string name ); - - /*! - * Returns group name - */ - string GetName(); - - /*! - * Returns group type (type of elements in the group) - */ - ElementType GetType(); - - /*! - * Returns the number of elements in the group - */ - long Size(); - - /*! - * Returns true if the group does not contain any elements - */ - boolean IsEmpty(); - - /*! - * returns true if the group contains an element with ID == - */ - boolean Contains( in long elem_id ); - - /*! - * Returns ID of an element at position - */ - long GetID( in long elem_index ); - - /*! - * Returns a sequence of all element IDs in the group - */ - long_array GetListOfID(); - - /*! - * Returns the mesh object this group belongs to - */ - SMESH_Mesh GetMesh(); - }; - - /*! - * SMESH_Group: interface of group object - */ - interface SMESH_Group : SMESH_GroupBase - { - /*! - * Clears the group's contents - */ - void Clear(); - - /*! - * Adds elements to the group - */ - long Add( in long_array elem_ids ); - long AddByPredicate( in Predicate thePredicate ); - - /*! - * Removes elements from the group - */ - long Remove( in long_array elem_ids ); - long RemoveByPredicate( in Predicate thePredicate ); - - }; - /*! - * SMESH_Group: interface of group object linked to geometry - */ - interface SMESH_GroupOnGeom : SMESH_GroupBase - { - GEOM::GEOM_Object GetShape(); - }; - -}; - - -#endif diff --git a/idl/SMESH_Hypothesis.idl b/idl/SMESH_Hypothesis.idl deleted file mode 100644 index 69832b9ed..000000000 --- a/idl/SMESH_Hypothesis.idl +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Hypothesis.idl -// Author : Paul RASCLE, EDF -// $Header$ - -#ifndef _SMESH_HYPOTHESIS_IDL_ -#define _SMESH_HYPOTHESIS_IDL_ - -#include "SALOME_Exception.idl" -#include "SALOME_GenericObj.idl" - -module SMESH -{ - enum Dimension - { - DIM_1D, - DIM_2D, - DIM_3D - }; - - interface SMESH_Hypothesis : SALOME::GenericObj - { - /*! - * Get the Hypothesis typeName - */ - string GetName(); - - /*! - * Get the Hypothesis plugin library Name - */ - string GetLibName(); - - /*! - * Get the internal Id - */ - long GetId(); - - /*! - * Verify whether hypothesis supports given entity type - */ - boolean IsDimSupported( in Dimension type ); - }; - - typedef sequence ListOfHypothesisName; - - interface SMESH_Algo : SMESH_Hypothesis - { - /*! - * Get list of hypothesis that can be used with this algorithm - */ - ListOfHypothesisName GetCompatibleHypothesis(); - - }; - - interface SMESH_1D_Algo : SMESH_Algo - { - /*! - * - */ - }; - - interface SMESH_2D_Algo : SMESH_Algo - { - /*! - * - */ - }; - - interface SMESH_3D_Algo : SMESH_Algo - { - /*! - * - */ - }; -}; - - // ----------------------------------------------------------------- - // Specific Algorithms in separate idl file - // ----------------------------------------------------------------- - - -#endif diff --git a/idl/SMESH_Pattern.idl b/idl/SMESH_Pattern.idl deleted file mode 100644 index d2324a0b2..000000000 --- a/idl/SMESH_Pattern.idl +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Pattern.idl -// Created : Mon Aug 2 10:48:36 2004 -// Author : Edward AGAPOV (eap) -// $Header: - -#ifndef _SMESH_PATTERN_IDL_ -#define _SMESH_PATTERN_IDL_ - -#include "SMESH_Mesh.idl" - -module SMESH -{ - - typedef sequence point_array; - - /*! - * SMESH_Pattern: interface of mesh pattern - */ - interface SMESH_Pattern { - - /*! - * Load a pattern from the string - */ - boolean LoadFromFile(in string theFileContents); - - /*! - * Create a pattern from the mesh built on . - * ==true makes override nodes positions - * on computed by mesher - */ - boolean LoadFromFace(in SMESH_Mesh theMesh, - in GEOM::GEOM_Object theFace, - in boolean theProject); - - /*! - * Create a pattern from the mesh built on - */ - boolean LoadFrom3DBlock(in SMESH_Mesh theMesh, - in GEOM::GEOM_Object theBlock); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to . The first key-point - * will be mapped into , which must - * be in the outer wire of theFace - */ - point_array ApplyToFace(in GEOM::GEOM_Object theFace, - in GEOM::GEOM_Object theVertexOnKeyPoint1, - in boolean theReverse); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to . The (0,0,0) key-point - * will be mapped into . The (0,0,1) - * key-point will be mapped into . - */ - point_array ApplyTo3DBlock(in GEOM::GEOM_Object theBlock, - in GEOM::GEOM_Object theVertex000, - in GEOM::GEOM_Object theVertex001); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to mesh faces. The first key-point - * will be mapped into -th node of each face - */ - point_array ApplyToMeshFaces(in SMESH_Mesh theMesh, - in long_array theFacesIDs, - in long theNodeIndexOnKeyPoint1, - in boolean theReverse); - - /*! - * Compute nodes coordinates applying - * the loaded pattern to hexahedrons. The (0,0,0) key-point - * will be mapped into -th node of each volume. - * The (0,0,1) key-point will be mapped into -th - * node of each volume. - */ - point_array ApplyToHexahedrons(in SMESH_Mesh theMesh, - in long_array theVolumesIDs, - in long theNode000Index, - in long theNode001Index); - - /*! - * Create nodes and elements in using nodes - * coordinates computed by either of Apply...() methods. - * If CreatePolygons is TRUE, replace adjacent faces by polygons - * to keep mesh conformity. - * If CreatePolyedrs is TRUE, replace adjacent volumes by polyedrs - * to keep mesh conformity. - */ - boolean MakeMesh (in SMESH_Mesh theMesh, - in boolean CreatePolygons, - in boolean CreatePolyedrs); - - /*! - * Return the loaded pattern in the string form to be saved in file - */ - string GetString(); - - /*! - * error code of the last of one of above operations - */ - enum ErrorCode { - ERR_OK, - // Load(file) - ERR_READ_NB_POINTS, // couldn't read nb of points - ERR_READ_POINT_COORDS, // invalid nb of point coordinates - ERR_READ_TOO_FEW_POINTS, // too few points in a pattern - ERR_READ_3D_COORD, // coordinate of 3D point out of [0,1] range - ERR_READ_NO_KEYPOINT, // no key-points in 2D pattern - ERR_READ_BAD_INDEX, // invalid point index - ERR_READ_ELEM_POINTS, // invalid nb of points in element - ERR_READ_NO_ELEMS, // no elements in a pattern - ERR_READ_BAD_KEY_POINT, // a key-point not on a boundary - // Save(file) - ERR_SAVE_NOT_LOADED, // pattern was not loaded - // Load(shape) - ERR_LOAD_EMPTY_SUBMESH, // no elements to load - // Load(face) - ERR_LOADF_NARROW_FACE, // too narrow face - ERR_LOADF_CLOSED_FACE, // closed face - // Load(volume) - ERR_LOADV_BAD_SHAPE, // volume is not a brick of 6 faces - ERR_LOADV_COMPUTE_PARAMS, // cant compute point parameters - // Apply(shape) - ERR_APPL_NOT_LOADED, // pattern was not loaded - ERR_APPL_BAD_DIMENTION, // wrong shape dimention - ERR_APPL_BAD_NB_VERTICES, // keypoints - vertices mismatch - // Apply(face) - ERR_APPLF_BAD_TOPOLOGY, // bad pattern topology - ERR_APPLF_BAD_VERTEX, // first vertex not on an outer face boundary - ERR_APPLF_INTERNAL_EEROR, // program error - // Apply(volume) - ERR_APPLV_BAD_SHAPE, // volume is not a brick of 6 faces - // MakeMesh - ERR_MAKEM_NOT_COMPUTED // mapping failed - }; - - /*! - * Return error code of the last operation - */ - ErrorCode GetErrorCode(); - - /*! - * Return true if the loaded pattern is a 2D one - */ - boolean Is2D(); - - /*! - * Return coordinates of pattern points - */ - point_array GetPoints(); - - /*! - * Return indices of key-points within the arrays returned by - * GetPoints() - */ - long_array GetKeyPoints(); - - /*! - * Return nodal connectivity of the elements of the pattern - * or of all elements to be crated - */ - array_of_long_array GetElementPoints(in boolean all); - }; -}; - -#endif diff --git a/resources/ModuleMesh.png b/resources/ModuleMesh.png deleted file mode 100755 index 5e781ac34ae9fb5c72ad6337e1fb71a085c6b4a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2629 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/SMESH_fr.xml b/resources/SMESH_fr.xml deleted file mode 100644 index d5dbf4640..000000000 --- a/resources/SMESH_fr.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/advanced_mesh_info.png b/resources/advanced_mesh_info.png deleted file mode 100644 index 01eaea2678cc032f562a6ff949634bb47f9a07e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVfk$L9 z0|U1p2s75F#7_hYvX^-Jy0Ty4mgA6DsPdY1ih+TV(bL5-q+-t6DZ6=F3{)eU_hKe5!w`vrw$iCz zH+{OaAX9o-hl9(BeKW1twF<%`pDc~!-&NG@^O!|8TgAhMFFjq)rO2{}IcSN368{G# zfkl_)cJWpAxmmuQ-ZhVDJNp^cBUjyT{SjrW&AoVCZ2uvT`KJ!-F}XKIo^ki7b$gSK zz0y0f^#4+Z7q4^g%Q1hx)X@F7boy3z&F`icLaUD--@5n6l-T17A9mQrlsx|`(@rg-Ah&~qbJAIlNn3bsxYn=!7I{qkM#2JM P_%L|7`njxgN@xNA(p-;G diff --git a/resources/delete.png b/resources/delete.png deleted file mode 100644 index 8ae8475270846e746507f5bdd7752821fb1e88c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3-pCt=%unz`)E9;1l8sL#cK@(5tK^L4Lu&#Q&e+_cp#@pg^Rji(^Q|E#GsETnvgF%oh@G z|NsBVa=JU~LVs1qNz3`)HwMdQavt~mEVPW{xMI6d(A$KBu1e__8@xUpahmz;vqPyE v!~ecD?K;;U{BCHMV=yw=saPV-wD17?vMOc`V~)i0paAxC^>bP0l+XkK1JFi| diff --git a/resources/mesh.png b/resources/mesh.png deleted file mode 100644 index f8147b3f816c16894c554918d12c9f09147c4449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmV-F0l@x=P)0a!^y zK~#90<&!aM!ax{?pGbzdDRg)5-w;Yup@aDg2jbxF)Ip>;NEZiD@)vXv(uk1y8(iEw zxd>(uydjVdZH~0L#1y*qg>d;k?jGK}_XTp~4fdbw%EMcE1e+jl>o=K2Fn}-&!Gs#M zQou?P4B&7)a5-O)kt_u)gaNVUDd#W^^9FlWHzqdgXh&mW10aNmi!!a`I8&N+M|7rr zX5EqMh360{^%0mlSnKIly(h5Fw6A*Gw=MRAt#^=o-WNEN**emOB`o_xUQSI zWg$dSWSCCdQH8hiXg#)!)S);%hxa`{=^MGgbYWQ*i{*mT@kDqI0sR~%?ymxycTM$6 zRjn!j?>#^5?5ecZgH3>x5*bPSS6?@0MxMies1F#4Ayb&N*@^%F002ovPDHLkV1lA2 B!RY`1 diff --git a/resources/mesh_add_sub.png b/resources/mesh_add_sub.png deleted file mode 100644 index 20d8d8f62d3ff63bd2799c28160dd6b405d5d456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmV;J0cZY+P)G8k#GTtHpbp#SuqDliaWVHkP3jlf;sGOLVN>2!I22Kh&hA{8KnfZ@e3 z@#ipLlS7&s-Haf6%Xa3p*9Ieq3sUj;W8G0E@i|RnFam_`T|Jz`+`uS@dkOnt+-9+c z5%iiv(elC_q%ONo8wg@c-gKQ#@>62=n&IqahSTS%2W*33V;OCmLObB34};TzH!t&s z%~)>whVrXKsxp7iHvy5w?b+lDJ+=?%1ED9}CXJ(l+=%E;iT)_6Qm|UCfU?#aCU+CR z%j?cImNP`l((lV}H;gKnJDj+-~4|m+K$5!AQqRCd%yq0000ZrE5Jevrh3R~RTp$OX(E>?a{(7A)5T>9ODVw>OJ{e`O$r>c z81UjaUm9tE*}tEiKM*xRBl z=BTcrP((EOv}#l9(a;lzEOa-FCa~K#MXctV-qX5$yzUfzoDC*f%{SGxQa3B~EjkyS zgy+7dixC{UE8-<{pSyLnJAhDP(b@e25nzltN!EwE>8wg(Gz2J9$oCyS8wk4vC;N`WI8dF>52M6nn`WF2a|4w+(q@kdH&la03PxwcYDdn*1_ zTS=v+2_G;zKd8JL-%#Rws~oEo{u(8=>etHuYP*=a%6rH17T$#bWGP$@AsB|342ZD7 zZHUp3tz6~8F-074=@5Z&oA%nN)N6Fgw z_%7HtB5V(!*g$G>vJ|d{#}_x1&Bh6N3VI7r0MJvh5=76Lyc~un$rj^;0?1RCB%^v> z#Y*(529&wXj+4#C35B;8lolJB>!Ee^RIJ3~(~r*9n#%CNDZrE5Jevrh3R~RTp$OX(E>?a{(7A)5T>9ODVw>OJ{e`O$r>c z81UjaUm9tE*}tEiKM*xRBl z=BTcrP((EOv}#l9(a;lzEOa-FCa~K#MXctV-qX5$yzUfzoDC*f%{SGxQa3B~EjkyS zgy+7dixC{UE8-<{pSyLnJAhDP(b@e25nzltN!EwE>8wg(Gz2J9$oCyS8wk4vC;N`WI8dF>52M6nn`WF2a|4w+(qixy^ur{z|2h0AFaoSh^Wn+E*DNkMEl|gZ6%eO zeMG><76gdzP0^?Vsj)rfa|J3t$*Dpb-leHskP#-2}qfIzGm7qh` z!T^pPa6d$(Q5{1`L?>5ec1JHp|E;dV`-=(0+eLy70E!HK ziUJ@a-{eFw)z_M|QP>;T zRQ1c2hyD8bC1DuXYcn&!v)fqDx%7Bx^}cq`GdExK_npxH&8i+;GLQ?pM&8;wq8I*{OkJZkuXdJ4NPNm$>j=(r!&t znBm>^nkKJbzxRDFsRI&@MmPyoR`e1%$Ft?%R~Uve%b84;Ow#yR{z;oj&88V1UM1t5 z%Z8y5JQs6S z$vQYDmD@wM^0is+=wZBPNX^XgBg3F?fUahldY#thS-hVogN#NY;L$AtdRPwE&XV|U zj|9W-?6@+C;tN6ZZEiX3v=0XbdKakH5LMp^p@E6HK;Xfx2Bj8jw~fWH-T`JaSMDpB zJm9GJaMX|i``7BjCRmC);Qb>8wnavz2BM2J%eM*4lekIB@W9y11jaVSL6?c<@1Ng; zi%s`g8KBmp-%irj+1EbvqUozd1LR_wS!-SS2E*_x8*p=`6_b=cF;%9p& Ta?$HR00000NkvXXu0mjfQ_m8? diff --git a/resources/mesh_algo_tetra.png b/resources/mesh_algo_tetra.png deleted file mode 100644 index 3fb67d507bc568b7a406c497e52e76a68b61262b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)gk0*WI5 zYK&P=DhHv(ok~os#Qtm3x^86>yemH)59hsgylw%-5w$PvREIIfYF)Q-`fH7We5-B-}HkHZ%;m1IbZ_q{%pYlPG9F?n-(n>+z0&(EC&>c_wn@oZe_JbH65Rw zS9n*crw5Y(iX$o#pYX0S_t~=-@pm}yX>vn~;)vESZJs|7=D9u}E-L)$PGAMbK??wt za*0y8^e9MDc4CVqgi{EoO8^Rwc}@pa)+^iv9qxiIrfIC)J^UX_pJp>T<@kMCfK_W$ zb7gI-I<%g2zv*ZY>djVZ`}|Zq}6ox-n49}7Wk6a?Bh&rXYQmf`DmFPw@G*hLVf=gsTf&nQEmD~YvOn?U3{1cYU z=l}ih*$T&9^>AMtME*+!ULETHz(DCfbrK08!uoN&2!8RUCemE!wvSP`&)3W^w=b*3 z@X?Yxb?~R>6-o_`A3bE?Fa&k5!!8T|={Zk7Qo_9Z4jpPT%Lx^Efi@b81#Xmlte)^suUd5#d4M@DCjZjhTXp5v;MJw`kHKK=PjWQs%(M9R@mAXZUV+MKn$L1$Gk{ zhCi0qJfK6R`_vVAJ7dz!*k-$#^+=35lt|D<6BGAl?C-#KU`52=)4BQq8Hae6>&y1& P00000NkvXXu0mjf{RyUe diff --git a/resources/mesh_area.png b/resources/mesh_area.png deleted file mode 100644 index 9c51c32edb3aed73cf343b8a982b29e7d20a56b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)9XJ*-sXHKP6xOjMn#C|VE^4)2Fu@P{w8P|clg#~4M7$+McGHo&uyhy7D{F2&@K znZqe4r__1%Rgu@cDhYq_ANZZOv1aKMwuYtG8glEyb&>njBXBC-#7hh4regb?uF zBO*8)#u`NL0H!eCdO`>Q7;Cz?)~!2K>d}}PtnFZE22eWub70b#C74*jS(m*<^PVPe z%2PQ+*#cXPeAlhL!B78{rfb3q>?trUey(2IfDu)ltJu{2j7c|R$B*NtpG4N7Xu()R mK{1-KzXSV$6_MedZq+Zv18T2Uwb_&a0000D3J^mDFUR3#3?ukE-cwaq)D+}v%7u~ zDI<+!?XJK1=ii4y_}3WpEfCz23e=y0HpB;X&FL|}WqU-r)d+|WeQ2wGPbg4zOT?>I z*W9btR$BK^H1x2(R73N((cM-&v`siQL}yh*A$BSYuS(-wb4xXc^@Z7L#BrlR_IIV+ zD*AOewJ0oG@&U(vVw~A45Jw-s1NM{YnVWw zvm;<1I-80HV6wamJ*dZ)?Y3d&JA}k!`CV`?XB1RX$4yO^E1;^Knk;Ya1Fcu{sd53% z`@CI0?pB=lUAEiTm7AAd%_Uf}Hk(bB_cn=G`rOT<&(0n;F>FVk0q_^*zw)5LE zJXdePgF!}N8hCALf&$bJg$uTediAU4D+C^H8XvI9L%Es@MOjdl6;T|K#0i`2W^!78 Y0KaU~v8xS1CIA2c07*qoM6N<$g6?q3EdT%j diff --git a/resources/mesh_compute.png b/resources/mesh_compute.png deleted file mode 100644 index c06dc7ba98b17b00abb9cb1f5894a07260dfccbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmV-A1I7G_P)=f&=30>y5~zqs;{*Kz?i{&^MT)S#KsYN++ysSy z;8Fy1g~B?JW357AuMnI93L8UUS75^$Vz?<5_7w}0V)pj#YzJpxnwdA>``-J$Hw`Rr zUyUlt(s*0wJO2l4a++}TRSXSm@JnFBQTU%UmH`{sn$5yeO~}p#0Ama$H-w|mzA1hV z*uaK|G4VL5naqNvg!I$_c6Yi+F06mDPBcsy+*@YeTtxTYS7d(+(c^^9##ILnWEa9l zPqVEP(lepE^8wK?Asq|Rx29&UTIvj=P-f|Cvn9Q3hYFciJ-?;kci6qVTUXee z`Ak*vWEWMLC7fSQc)=6=o)5s@7ag|O65^4|sIP#3V}gDcXu{^!O~)|(P00Qf(o?5q zEx^K3N&%p~xj0h7^iqibC=kp-u?rvr>%=K4IYcI?ftFMbN1-*jL2{wH z(CnH3e{XNb~p;{Y@D*Q1v3MM2#8A{#(B`Yj%&yB zxouWjD+}FgV56ZMt?#~e6L3dGc()YVb2iFOg~$YqdBFW^6WSh3PNw|CI)lRjT5G^o z8|>g-Z0|H93)udCe|BRxIIy3uMi!I>tl#r3U~d!JPdT!HJ^22>9u1G|Ym)-h$YdbpQYW diff --git a/resources/mesh_connectivity.png b/resources/mesh_connectivity.png deleted file mode 100644 index 9ce3e445574d18cd40e1e36f6dec7732252c3cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmV-g0j2(lP)O1$YXrAtXhJWTUunj0_QY1to>SG=|pj3@!|KgmWQ_I#Z+-M){RU z2=CtANeYaAjRpWHfn}&Uz=zR|0=u2#cHjQVy>n9&jb~U7sOu9m@biA~FW6O;Rloz? z&ar*9;OkjJWugT{ArEZ#E!R&q-1>m$x9To5RiOE5g6S!+TX&Fq(3Iu&b2|nCfP|{V zv^F1`=)Jx<>&kwGLx_*l`1SPbl0cz{o-U3d6?2|WvFAEuAkx0yqh0*P zg^k}Q#vQ%L+>x-SX>mD+?2(h)r5YuIw;U_@wjLGJmfHQZS%>rIr%zA&9cP*fGN>`E zo{_0g5EE~gww6!Q?z`4R1tp!$sr>!-d~2q!TC-uJs-olf`P*ME{^gfNwbE8uK5u*6aDMMR|8(9m3%}0u_eDA|(I-0WL{I zK~#90t&+cP!Y~lVKUW^k5(8sLUVyPrfEe=-EW8HFE1>M1=$0~gqw*6l<^>oTkj$8& z(sgLk+Kz1?;-o0CbN9RN{s=IhYA?^l0djPtaB5=+05D&M#psfq$ojJeNgAOrk=|Y` z)I@=Z0C47s-0HI7^K8btY#0Dn+sgYdbD04^myLIRdoR56ud1*J2N(iku;WUj*vz9o z4^R2H(tqD>@?tYbwXM26?8bgeoePT@5&4UqDkJP$?-#xmsehn3m@Mp;I&(09bb7d0 zE(G9DJA|bw0D!h_0fY-9z9P00000 LNkvXXu0mjfZAz}I diff --git a/resources/mesh_deleteGroups.png b/resources/mesh_deleteGroups.png deleted file mode 100644 index b7126e002d7aa7ab3a7c9a9265a9f283f1ecfa20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!9%)r1XI!iqT$l(m|32{Ae-~f>MpMk-+o$V%& z#aI&L7tG-B>_!@hljQC0!qCAg>jC75mAFQf1m~xflqVLYGNfmw85QKED;Vh+=o#9^ z?aKhF@bYwV45^rtoRAQZz`&@=rl@d};fZB~%MKBV8!Qqm2Z9)7c$k=Yboh9Bcz9&^ zc(@NN(ot|a%eZ2eW+U$rp9Y~h!WNPeDv}GT7{z>>C BH68!} diff --git a/resources/mesh_diagonal.png b/resources/mesh_diagonal.png deleted file mode 100644 index c997cefc7ff7850fc336e8fe812d54fe2edae0c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmV;k0ZjghP)15QV=DDrP~21SxchoI*H_<1+1TTb+cu!bN#tSBDq1~h4JQK(6L5D{>V__ zMh~!A?(pBMw-x)tp88lLk#q{L81EZd_$Sfa@9GTkZpn-eVEFSCh1`R;$r*FeqC-$ zthH2Cg{chHu|h) dcHi26@C)O{mNcsSmRkS-002ovPDHLkV1o0=#l-*s diff --git a/resources/mesh_edit.png b/resources/mesh_edit.png deleted file mode 100644 index 5ad2f1504ea84cae3b94a6c6f2cb4b42130f167a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547 zcmV+;0^I$HP)1j~v(fnhHJ zRy(^3Qi*jK2;B0W>bj?H!0qDvqGJ@7*}x@gdv(-r?qT)|W!FswH^=zl?1iTZRCr0N2Gf7!orM^*ox>0k}k{4i~`M0PWG zH9PYe#yOP)i$-P10$L9QrS^QNlyS4S7dvxIU1{-{*%*U0GfAL(0##uj)KR_4sdvlk zg|4|Kd1&zI=R?cqOiBrR-TvX7cS{S;+wgn>BZtOg6_w4(kHyVsZy-Z|K&H1+h834S zl@*cG&QU-ig!-L0b2!Hi@`Z07D+^m4Z$l8z6{bKslUBJ4I5j%i#C;~T}N9c;cd!I`~{!Ul&1RgQ}>e!HR=mT z>`ZZmrCejut#+~TEG)9c!Yvl}EOvJ?SwkKSyf-ud|7QO8o^n?vLS|bJPs?`zZo}*W z@bI*(3g27xWyB4)=R<~n?!jG|2m)k~Bj6+Cv9_J=ZX~+980yo97lOq#@u#sdYkDnOl*U7uzo^^Fwbdw3aecplQ~d<9_i zICwRmHhsWUJU~3h7tis<->ezmt`7M-t9F;ov*-95$DJMkY0_i+pb5|{>NWkX%B9O} z3*ioh=x$`la_}y~uW1TlelL_7Dqo+=EnW(&OS30C?|_o&S9Kc`v2?HsXf@Z&Y|fgp h#+kC9i^jS*djn1T4eyPjt^NQ2002ovPDHLkV1fx@@FV~L diff --git a/resources/mesh_extrusion.png b/resources/mesh_extrusion.png deleted file mode 100644 index 76909c0e119d8f8c0495d7a197023d670343e339..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmV;c0aX5pP)xd0XRuS zK~#90rIW#NgD?<9-)h{1ThJ{fI7eKQHJD6Ff@8{{g>>PcgAhm{?2zn?1|+S%-u?wc z91nxO8v(cmKfgD@>$J|5EmxQ@6^0?k2>Ehu*vUQ~Mr$qMBvnOHzsoN(E z(fwVlx%pWPrjoD0|C zK~#90rIgW?gdhw>Z{}DHr9e&cfi*!Xw3Gc1b`X(aXWtiUyva*)5EiAN^(-Jyaj#Y2 z4Dyv~g>9w(hIP*xLsq);)J6rhb`>;*e2cZaAsu<#ml0?Nt8(64hoYc*mMyC=yPM1N zwz3W-39(cG5JSd!L*$(#hRh})qshgPvEC>^3Yl2p3hBt${R*p=rCKbO1h{}&Yw5TH zViV)M;Z<#>ki~kV&KphPoL05x{2kV-^irg?H(Q5Ka^47>R^h{L_10R8svz>fq}8a)5S5QVouVZ|Nrfo zO&J{+3}WL4Gx*1v=*7#zp&(YmnA4V(@h4sFnnMFak_(^ngv431czmK~ zuRC~jiqqDA6O({i6HNt3Jn{iIFcS4 zi)3)L-8eOscdJp5(Rl_Yj>8TDy?HOTd8$i_#GVc0iP*i5b#*r*Q-`2!qVjH`v=?7r z-{5`t;6cKJgog~54HyI*Bu=u)9^g5g#-Yxx&dkj1Y(L?zq#D0~0}HQ9x#S50N5+Gm zGBz^u4R78n9G(+1ciEvQj7%J>8yC!Q{${r6G>a>XBufR$yy~A-r3sh0fyS{lEs_(n zJh73p7^pi%e-U#7gVKxC8RZA{SgM4lpH2Y!=EGF8s|D8`l^I0RT4aDuh=}Dl=e4lI ziRnq~mm5b|8JId&d=hvQy9LbVSl_td&6nrb<&)mD0L?m-sc_=xrGF^0{P4g Yt=b*-KOWv&4vZ@XPgg&ebxsLQ0EKg`2mk;8 diff --git a/resources/mesh_free_edges_2d.png b/resources/mesh_free_edges_2d.png deleted file mode 100644 index cc6cdb8ad77fe61557ad792ebad4b2b9d767be02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 501 zcmVOUI+jH0fI?H zK~#90t&=}X!%!5(Pnsa7kRhQ?C5ujJp>E=!Q=m&la4DVoK}2e+IJgM~KS8Gq#Ysm8 z!9jFVu=xaaDik^tq-h*#!pol~RePq#<-OlK=iU1x&-1WO<YvkW9UG)+%NU2=N>`e=X(W8M6f!>C9i+RZ-!ZM)N& rea%+6GaG1{o@^A2p|X+Lw~)R8ACZmLC~+Ym00000NkvXXu0mjf{aVfp diff --git a/resources/mesh_hexa.png b/resources/mesh_hexa.png deleted file mode 100644 index b4b64b2e48d4b6d68209a11929fdd1a21e5b2882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmV+@0oVSCP)Z!zVVVbLE z-PlHj5U~&jKeIGE6FAxt*%PLj>u;TurHy5u-nSB2H?(y$2lh<{d0NuV#hs1uc9qp2 z7xl_J`pw0%z6osuL>6nQnrEZka5wAc8l4-Q9f%OCovIFhkw0}0000nxgt=Dtl>lcdu%%+L`v@bfcjuPj)yOpvie^^5l3eWD%9@`0Vz<4P-~$euEK-JbCy zgh0m9z|-j()h`fvK-tY~%js;bBOMyDM%7O30C0tC)B%V*K=lihQV8I+e60x^ozsf6 zF(-fl0j0=Vb>F2aMw+j+@A;@sb>qxGJ1R<@E45X|;`6^}2Ah~e5`btD5)qOuRBK=J{M7R&?=uaSS&RO+u1oViPvKbvOl0j$|x3 z|9H;u>(DBS>$!}6RF-8dPZcK11WBu^ApByXP1{pwy6u_^N)dZB=aV3 z7HtuZwVoH(=RA?lO6M{Ur^A3`@51w6OqMg*^U9^Xxz8>iA3}hJ1JH3?hz@kZ1JZe- zV@$uTWzP+X6hlvuzX;O6<5M47uv+`D+D{a+)Wp)~S9e25+N&#;vw-+C%=tLblcX}r zMnnNU2cFNj1ehf|Ps}+`9eAEBQD-=9{t6Q)0V9fs^Ur`chQ(PvZUMq5=4>{dB(?W% zH}Kuv6#56+XGTFFrhD*?qwu*3XUIFT+i;RnxdgVPKx{h$n*>8~K*F{{3S&^0Ln*v* z65_}Ew8*qhyDBlFWKuBJPe=N)DQKA~fXYdPEy5fpVZzaZLqyBl257fBplVrYBLib{ zy1lDON@2-|G-n}Ykg22Ha=|iVz~K=V`;kzKq-6$%*9TeC2vHUzFijhNQUciK>cA#V zcr3_N0IFmzx}z#I$MNpm-nZZtyeri){b- a1^fXkxYyqogPPR<0000z diff --git a/resources/mesh_hypo_edit.png b/resources/mesh_hypo_edit.png deleted file mode 100644 index 8f61dea7c650b28364e75b572070759930f4a1fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 914 zcmV;D18w|?P)gBwsc3c860&0M<4sgngI6SqQUZDdBF`#fY56OyeSeDGu7 z$D7aZ&HKIYcQk~54P`0;u=19+Urs8S&e@di1mU(zDJ4$Bm0HCWrId`zNlm6dV=^M; zFKf%8|5Aw#v|N9*EDf28&tOMOls~Fc{h=P77=&fc8yH!m4;HQ45FhYc!-pzU$yEFV zPV`z2M)sX^2Zk!tW6<^>bIAY`X*CS;$plyyNg!#vcx}+$&}93%;6yhEVJzhe;n9B8 zU8&iQ)NEHA+m)K_ihu}6t>Va!rR(zYlUdp8nJnfCA|Q*og3LZV_xadM=)#;ntoQtB zqbbjwoZk;7smb*BBQUoy3|n7uq_9wyU2Q_L@tNDfHdB-7%b~$W_aZ=NI+dWb;!yW0 zY&C7}m0ilwIAWLJm#gr|S(b7IR<9HYIv#f)y6ebS8=qbdDN{)%YoPDJ+8#`&64Wa$ zUZufS)5gkMTJXt?q%S1FbAbr6`Vz*KHUMW%o#E{BFLKnpPbTt~MbLnT?NcrKeOR~B zZk%}Fq-;dvx88d-4V?yf4Y;vN(D4X59<#@u#oY>equHG|Qz`P6McsBG@Btmq^?B^2 z2icWdJoU^ezIZ|o_Btq%k+mEvOB0Np3>b&j7- zu=#b9SLWvdNW@C~`uh`v!(o2*s=RA_$hFqDL&_Q&?7U@R0vFF^IDR@owdC+88i(&c zjQ@vE`(~Qg-@3p<2anSBpjcZTk*PN5Hp*0zw=6WEy5{VuxT|3i;b!MA4%`vL_k8pi z_+y~|00+>k3+vd;B9BjHI2Z#W-F?3Wt)PM3Eb{ab13lv7wgM{6l|D2y&fDx}v72Ca z51BnQMY65QV?X1W3$fb)i|pQkJrowJ>EVYncOe{uR1$Nyjj(uwk`PTxKze*-SFZnMLf5 zZGmLPvXo}JGdH>!t={c>Z*Qd#UJO0a0$^gJUe1<(FRiuYg_U(;MQbh3=7Jz_a$L#2 zn!^Zz(z#EpmwacY- zyt^8qwFV%%iFho*7YEA*s(DvAe}!oapS%R2yvw& z9DwTqeF8jy-rs=tqcN`rHN{%9ov&zqJdX$ihuwLShua49l%8mGnN){dzPTm{2K=cF zFtJguzYpY$>z=O<=h@LkN5D*f$m%Ya`)T)9Xs!Ei%HcfgMnEtKd89iJ`zCnHl;`4q begS_0=KjG&L)HZ%00000NkvXXu0mjfhteo# diff --git a/resources/mesh_hypo_segment.png b/resources/mesh_hypo_segment.png deleted file mode 100644 index 2d924502382b82403079930585fac2d70928e0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmV-o0-gPdP)Y65QRTw3{FgCZCTBne_$9`T9~k!$?#6U!fHY~fnlYEG0K$1EMhj3j4Ux7yJJ@% z=`7iDGu@e;lQetp-tN9V1vuU{l_&?0uF~NBX!mbdO1Zo!-F8ztrIfoE3l0ZYr%XCF zeG36ynsYJ%&buRk9-vB;i|-_IDSe9FY5-FW(;qt+U@~A5L9HQPNJwyUDFLV}_%erh zF3~lR;NpcOP18}*gOuZi#99M{2*3ig?+w>xy`E3`b^k(kSf4a&qzT)sba|G$ZC1MN z=D0fW{`#DcHffNuN|cjJiO~j22-Z;UKC20z5dSK%l-MNDW%T7 wO?;0pdGEvDIyxhR(ETwBBE{hL0O4RL!a!q{9xXSL;Yt9oH9<6Lzpj(e{T-9mxj_)&C! zPzUU4^P|@GZ$m_+)vjy%^bcq;UpeoyQ+M0QP9!e*Y7yyb5vhpi03eSc-eiT1hsWE- z(ZvDS1ZSCA*x|7j9Prwgt Wqu1owqKOUw0000+LB49>33jMxnX8U`{5 zqyeT886aEo{>^&^P99DM0U*TgLa57-4Z-Ki7jIrLNB|+og*d&8&j4Zo)-Xi(CMlM( zkg9n04Dn#F zhJvb7qeikV%Pl$iI3ekt-<@<9fPkY)cwD%?fPsu7=ogD0Py(^rPc>z)OrT~TnG-zf z3x-k@h4P?s{GDM93}usVpeifiU%Z2bXi-pL!m)eMmepp+HD+~|TF!4yAbm~+i3kuv zV0=0bnmKFmuujjCOSXpPnzF?Z6 zW~cY3m(yPN?7d}CKeL~OSXAtV!TNCx%ljoP?iLMJqQ$;RduB$mFU`Zl#tIlvNJfbT zh)&wsWo=OTW$&4gEJga1{;C<>&kwGLx_)4uVdow13;mRo-U3d6?2|W*~@v@K)}tORaCuT z;icaa>mM00v-m$WvgY8Q&>F&Vh2@P>fo9L7h>g6KyHAI6-F^J-rF&yxh6#fM=LVjw ze0OeakYFv_n|z5y$tg5^ebnC2?NcR`d=e89(_gD=USRKkXqQmav-#`Ec}(Zs?ma9i zee(L}wy4`Brk~g*1#diTb8_X4#CcD?7$lsMXS%<9&fUGsR+lqKp8DFC-0|Vy;=Nn; z?|r+J&r{eZF<_BM={H`LrdC!#S>``~nhbb#epOAMANQ=pUchMiGJ^`HuN-cckuP+Z QfSzOUboFyt=akR{0G&B~TmS$7 diff --git a/resources/mesh_length.png b/resources/mesh_length.png deleted file mode 100644 index 64ddd510453fd574330cef3122cfff7430e73842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342 zcmV-c0jd6pP)<672Ey8s{HaQ!RV0dJ)d5!8A%knHu)p={kqf|LM%|u&;PXX2e5j z*=eoT{g_}G=`ocC@DyFFAk+EiH7|?u>0#AsdPt3guCZRNAzsFi7y0{8xXU5gCqF^2 zx2t-KfgnK6)dw3W&B2Cz;hRU0oim9$hO_XiuLxX33pF1GL+}IN{13;IF~d&L)9q&4 zsasU%aZh#G_+x7*?wIVFEvU-{_W^FbDH07*qoM6N<$g3)f42LJ#7 diff --git a/resources/mesh_length_2d.png b/resources/mesh_length_2d.png deleted file mode 100644 index 0009dc0cc68f474ce91668346413291b1eb6315b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmV;;0W$uHP)tmr{qmLbu{pyVNdrkq*UIu+Smx)Ty|L zqnqH^p_7PU2KRJ`HzqNbL_9;tNzVEB|8vh(_?$Hg(ZnY|KG{<^_TyBj+GS@ku0Sb+ zGEfET6m_OAw44`|RA$}_{}rAF_rqrpeom!{UMsDjKCNY9%^LGq?tZ%d0r0E8fJsJm zeP}&Y!*sLW>}Ker+z%Ik$IF|Hw0#U;hYVf@EZ58Zp@=1n-bT5h^=S=n>j9ukIsz0y zmo%N<`^?a2jaY)M?bsOsF#aC<-qz#!q8EO9n!FzcUQGgMrCh--+lPDTG##Z&n(nH{ z?cy$zS`ncrMZ}Wy#Wqm8Y}5HkA3@SCRscSFQw&t=^tsL&^U$t{AR;(TCuOk{PzdJQ zUG->Rw`oz0)kN(=#=C6Pnq7?nBX%JP|xOOp>{c7j^3AbSCvi&>`Cu2cLua-1=2eg*K M)78&qol`;+0Cx&G=l}o! diff --git a/resources/mesh_line_n.png b/resources/mesh_line_n.png deleted file mode 100644 index ce082c63c4af3e040cdc5101ca48cabb1103d518..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmV-x0hIoUP)5@9qo@C&Y z_3l0E-6=f(iYWM{x@qlEW6xe@wVxpBaj!5?ML6LN%+`2`1Q8+2GxgAL1f!Paw8qtr zrfJ%OM_tbZ9(tOs@l{#zTD$|`R!7oh`m1uTLWzVpiTO^y0MM5=TL0_CrV~zu6wFceO)KYXF+f8J*}!`;$4$@=WPO(`?ScN}mRME@{xD%pnaP zy>L=L@7TTd=EK}o?cVzS_I%s)Ip`)N%QH1pRg?w0&z%>M078!%hO3LswN{lC02)1G zAO6v(AJd{N5NQ`lxMhVOE{1+gQ&Qq2Mxs#5BM=cZx>eV$x*xSyp-29(WtRW|002ov JPDHLkV1mNqpiuw- diff --git a/resources/mesh_make_group.png b/resources/mesh_make_group.png deleted file mode 100644 index 19ba2e66eaaf380a718f336b6145601380036e2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432 zcmV;h0Z;ykP)((cdl$S3t@!YVSZgvg3x<#>KVd+Xa#4z9|d96>j-?T%} z?c*ZXF_wUZs(a}nPYT$MO8fRM3GFv+grDdDH=*hpLe+ir$hPZNyShvwm3Y#&!Vn6`Pf5z&kV+f{WmAO_o1tQ?<6YicC0Ee0000W&%gZGFm^rBZ>HYX+MjYV0PWCv zei@(k=lAEeet#PNjR`jC_m=zw&occ;>0LGGX7U_cK-9)uj*$DL|~=lJ08&((`m-R44=q*NbNm zw`r|;ni_uJ8MM~!Jgfl3sw)BKlUgccDPWE~vY8rtHYztdt%7(k1w_g|Lo+ob-x8#> zU7byWAP!EpR3|Dxxn#<53~+z|A`8&kZZC-S`F6(PV6PtMk|{gF$cf&XuwmQ#iDSPU z+>lGAa>;@}M!w9&}diuNcd^uQ~d4Oq!;Fw?4E@ zKX#6ak3K8|yiWhS{zI8R0I!9I>3ItMaMAXD(&$-}{qFAtP(95>Vn?IlMDE8%q_}Vq zko&Qzn{Rh6rsOo9TiZpn*=^a0-2vvK;Y8MUdvl=Ex{D&gH-Gk4*Ef=^_7Ka%Satu! zsw;u=N~ly^a~EQ|CdNLa}7YdH9p>fq^mG)5S5QVouVZ|Nrfo zO&J{+3}c%i>G|(CBZ!%ise?6^VfMlU35hD#92yvsT=<+PBwk-{Y;Y&K zmRIjt?DE!yoby>37+bD72soIDND6FXP-rmVxpS+e*HJTsd;P*4It-FL0uB+pEQ~d6 zNyVwo&dz&#rkpWuU^rwT;Ide{s{Xqt+j^T~5$32{Q5$wiC^Q5lNxn&062Z2UFGb^w zL5Z`4g@uGggv9|99tIWxw@r@hvu3TRNpZHYw2+jDkoeX3=Da~=1A|hA!miT}ZJb;j zevckJ{K1e?&o24w$tx34HGZ(|tX4WQ7h}~llujrdQ2ub|^!3%uv*W;yu#}mYEd0!9 zLgI-y7j_0lmkXy2-Z#Z^d{NVzevrX|K``{z0VM{Jw3aJOECPPa7x#9{&E5eNPc#*< z{oK5_TMW#5_|-_m`tQ%L?Gq$5fFV#I#ZjcHk-uq!;M9zopr0Q|C}Q~&?~ diff --git a/resources/mesh_multi_edges_2d.png b/resources/mesh_multi_edges_2d.png deleted file mode 100644 index 627ceebbf9fb3be4b3f4a169b20ebf085a38b728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmV6ze7k{sm6bzd#fR zse@P?EVNr4gt`_w6r^wt<-#S`HZA&1xkv7I-+SL3Nh$H4+WJ?T4kRK;M1Qs`k_94? zrA{$cdprD~b%CVMkci}901Vsxs1|s2W7DbwV!-{EJ$bv+0}zMmN*>TH_aLQ=4lr6C zw)?2GeB|Kcv2kwz&!6sM>lzABvzJnm;ZSX;w0r?133&`i^-_46=>|bUE3kEYsHDiWJDcB-NhBJV` z6*EuP29`R-SbHoOj_q8t#bXvcW#)-@}@?xBW4v}VCZnj1OP-==by yOmickQW%E8>}Qt7SPv+rBsc4h#CB?KG5rF%dx(+h`(^DB{sA1@a_>bEaPj~E002ovPDHLkV1mE-m#_c; diff --git a/resources/mesh_pattern.png b/resources/mesh_pattern.png deleted file mode 100755 index 9440269b7d8d7f02fc9df2acf592d574927e29c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W?!3HGtkJx+wQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG0wBz|R(WqJP>{XE)7O>#3MV745#Oid(kp;M8$DedLn`KMonp(^Y{1hxUwPT8 z33C?)E$^GtX#AaFP9taOt7CF2uIRpF=v*TdRB+wodZ#fnEAd5bUz4$;|C|>neU!eFzZEw>2!MZ&pG3&;r zLLCTMmfde=elxRzeU zsUUKCVfnJ`jj#pQUeh$~Mo~rYfKjY*FHnMut#yIE978iTS$~ASxeh#(BST>Oww3T| z7wEjdaH8W;j(W$;%%Sd#QIL#(?6@-qK73!xmnHM3d2==fzTiZP8|kz_px0ut7M@>s6fXvaH;fu8BUri6!c!T(!^f5RT6#Wozv_&oJ3cqCC&DSYygv=}W;m;BBB+ zRg~w}Nl_NxstSN6I*@}nRmDsV=TdG9(oPZ9TGu!!%0d7%(nwYJ{zP>n3|mIvb@K`! zauD);P7Nc3!SAn4H5tNawO*0u6(oQW!Ycpg20f_sU2-RyXfLQg!eBCp`lI?ASX)zs p`{e#27@Th#pn4DMrCb7P><1vgh>SvKf2{xj002ovPDHLkV1iRA*X;lR diff --git a/resources/mesh_polygon.png b/resources/mesh_polygon.png deleted file mode 100644 index a1f671b1fe3749d4cfeec9203f3ed8fb520627b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmVsAP>5iu*J?<2W9}|sfVR0##m|% zfdBPwGuW}8MXu#DGw|5Yl5*%Ar5rfrz#5db8IE989+Dm_v=Fz7|}Sa zi$g0+(=_F~YN1%?CMEZ6^5v?-23(!p1?VNyUDni&&67$!Hr-9R^Aphe)ldEnNUKL$ haySKg$US9u;1@4XY4z{U4m|(>002ovPDHLkV1igzUx@$! diff --git a/resources/mesh_polyhedron.png b/resources/mesh_polyhedron.png deleted file mode 100644 index f475dec62ef6f8bc1f4be34ce5d3c84011c050a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmV;B0dM|^P)8IfhnAyGrNoRoA$x*{YZFDOt_pQb5^NT@_ayr7(HX_&RFq~80Yq|RUfaAt;? zB@yw$1qCHko?6PIHltwLy;jrLZldBI6%}TdvgK5{qW@{+O=!iI=! usLxj397c9v~WI*8IwfF&7uF*znbxXE^STd7rDjyTpp#jP?OJBJ` z@BwdnX#~I6N_j+|s-QbP_TXw+VSR##5L`fT0nsIFtJ{$4a$ad@tYKqKw}^Y?Gp%$% z99=pL&`!DhZWeZ{&ZJNNH`IDsCi_k~c^PP((*(?VN~@$0Bu+8ZQe2+%HmLyru`a_4 c?D7lt1ENHgXR*1d3jhEB07*qoM6N<$f+GrWOaK4? diff --git a/resources/mesh_pyramid_n.png b/resources/mesh_pyramid_n.png deleted file mode 100644 index edde6a59fd181d4ab3807cdd3e5f5e063f1d1b43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 zcmV-z0+RiSP)BjU6oo$r4Nsuq88Rqa3|?X~#9QcU+C>m(JO(<2{(zD(^^oRQ1Wy5FlQR@&30^}t zcL?zkus3%o_zec#!JrPZWIfs1dM91Ich5cd+#}UU_^;vQPqhMcLap*$IZAh&VzPCi z5Yc0lC`X}`qVus+tEzLXstPaw^?C$=oJ@DKTmx?)O4Nrx-Vy*go}gZj7&`;ntMg5R z(|O9YRJW5;1_of7WAu9)fVuwyz`>sn>EX$AOM<;BFm*ZyAYR56kceOo#{dLp0i91B zYdWV2Onw~zAR^Rt9dkHF&)O)Zn9invt!1{fy|4dZ28vQ0uQ8btK(`nfjQmLXk0_>ktNIYy2rR=HW4ZHCHGxSorTpT4M^ zVZ&UO!on24ltPT2M~R3aE1`Sdwb%oe&e0%BnTx;*Vu|?&uY&(8vX-^B00000NkvXX Hu0mjf;KLfY diff --git a/resources/mesh_quad.png b/resources/mesh_quad.png deleted file mode 100644 index 1eba33ebb2e0e191c7184c441c21f29da75480a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqEPDf}2yM0f@6sa}7d-Quh?D*Ez!W8Vg%_1S}y-HX#qip|wE1&Fj>uh4md2L${ zF^Y=Fe0=}sZ^?-bnrVUti=t01ZkSj7AX#JY;qnB=r88##*qSBdm3qfTqpt9-hxUiu z&#Eh*1)T@mo_+MSc3EIn_<8=}$FbK=+*xQ@z?^f@Wd1daGigAF OGI+ZBxvX3=k1C8YPXxbm+i6`_WtX03zX8|9%O85`_{4DJ-v- z$p~m_6AEHL4DALWi#^o+%R+3*P38AjUpdqVbf%fh6x=6?VG61`FRHhh@s!_SA{4h$!8aP7N z{=}<Q)y)c>=}{Kr z_a+@mDyU46lLMf&2AIy|Kx1J0vv+wc-V~Q`g8l$Q=Df!&8x-pR0000AaDtHDIh18vwp_ zf{?i~RIcFj+dIvrC(9AQoS`ByBv8b+PJHX6{K%4Jsn>4PYhR{}A=P$^MH9m~=;`~k zdOX#X<5#K{Y5W;yb${t;KAI)0R(Mb4Fb;ENTLauhxY&YCjKb@N?kc7QZk>4CCT`bF zDd##({!XkC+QA$lTP3uON6BDzKUTgh_V*!$&&Hn<)|Q`)|8MyhFP+`Lk&L1M00000 LNkvXXu0mjf!pMl; diff --git a/resources/mesh_rem_node.png b/resources/mesh_rem_node.png deleted file mode 100644 index c4f2834fc20166fb68db404c3f2f56fadcd07d9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmV<703QE|P)Q4BzZPkv#-2FuEmj`v6DN?F@OM`9F7!YvB* z);OIcg%~ux$Hio&zXKRz=!0223^BA}TD+=l|2FF@3u|3>aNUqv_Mg(w{*@2t^a=mK bUjTjp#0znXlzZ1(8SER7>-bDzcjSrA!pTpu1D@k+hHnBg8gKYx7hOb~_afqOW zuqialvUjuV)fre8hMA9l{uvO$l>7VN7))c>{p_St7fLBRj==!hwuLd|(^b diff --git a/resources/mesh_renumbering_elements.png b/resources/mesh_renumbering_elements.png deleted file mode 100644 index b7bcc1cc6389d119738cc54cd2a7d2218cb985b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVfk$L9 z0|U1Z2s2)~TlWVj$X?><>&kwGO^BCCds*eQJwT!7o-U3d6?3*u3FJCtz|$7|k;kg4 zrP05t`=MtU8~ZxHmreEv9;_*5;*7i~1F?;g}+8zy^_XT2C0RS@4L5_*(v(^20V*BWP350nfmq zzmJl>p3HRdzy0*|QHPbXi|j?z0=Qo=)YyB+N$t!_gX7F_Nb6Mw<&;$T-*o8j; diff --git a/resources/mesh_renumbering_nodes.png b/resources/mesh_renumbering_nodes.png deleted file mode 100644 index dc1cb3dc8cc98f5e8a2908e13976f2f35d6fa991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVfk$L9 z0|U1Z2s2)~TlWVj$X?><>&kwGO^BC~LGgu+Jp%)ypr?ytNX4ADQyjex2Z*?y&u;eC zQ1lQNII%`y-2$f*W+HE-COO_|UT~X(wKdOS_2LF^jofJolWo}9{(7!b6DWBkeZSn| zfAN3uDURtTI`8CvR696M%&Yyu?ELe@NrMC5U&hpPD{PhxJw568=hSS&1FL7M7IH0c zd?IVIjX~{pZ_2jC3~2_P!KQa7S!`|i+ut_-!p?Vj%WY!sFa`vfeEzNQNu~3${`v)F z?flcfd(327J-_pWdG+(h=qtAYN1FQjg|+wr7wy?%t$)_?>tmwTHfPvy8@@18m(YD@L4 g7szopr0E0E4dH?_b diff --git a/resources/mesh_revolution.png b/resources/mesh_revolution.png deleted file mode 100644 index 3190e5f1bc4434007c99a2a6083db131ec0dc9bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmV;z0X_bSP)wZbWk;%5dP zn;$~0Ga!gPi6xs-%}c4ig(kqhdC=mot>PokCCY6)T%BR&X%9;tDzH3j4lwsHjdb*u zXB&ajBQqK=0bfzr00ll~$7ZH5`B%O&fbs{(8T3qH|Cazxosz>% diff --git a/resources/mesh_rotation.png b/resources/mesh_rotation.png deleted file mode 100644 index b971d45542382a0e4bb2d955d9e69519fbac7a72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmV;10(t$3P)CnniXCM-q_&s05=u`H0y7n@fp3{#oF z?`hLwiKgiQgc-i35twoPZ-g(0gvTF_=bDQoMxS=!@FaT)0FLVjWvh2VGk8)KXmwt9 z*4Q1QD_ea89s&4iL-f28llD{Lxt`IvMqB#nGQtYb8-+cG%bDwWC&o`3!gDXch4FJN&VYd)VK-`Y+0S_(UyOa`uXggXt+}ZdUwrXZ74B%p1EZ8Wd zlsQnd0P5>?vOFVh$7|uM+UYoK{GdyYQhn80Q;D`Bf@XlSRi%2rdYbGdLQ0905@oCD zIV}y0wxe58%I>5gXa*O`R(BoOF}~~LyZ#NwbxeJ|PP7%xympZ~yPa=Z>y?>J37Wx~ zvK2}xlu~b$tq7XIkYE^EMtBG4j#m9IPq}+DZpWWWmTs{Q-XEAje?Zz#=e(tVn<7a| gvTCp5;mvt}0OSC_EBH$9Gynhq07*qoM6N<$fujP) zp||BgVu5+N76M_mPB4k!9w_nhF2^8EMf1vOghqBzZWrOr2X^>-_yIwuh)W(R(|!N| N002ovPDHLkV1ls-Zdm{T diff --git a/resources/mesh_set_hypo.png b/resources/mesh_set_hypo.png deleted file mode 100644 index 68949b83e43af5e07537bcf67b56da58daf332be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmV->9>~2hL}9CA09I6C*!$_8L#f_a0&`*t%N+uKd|;=)hc{n!PD)E13-bT~002ovPDHLkV1i;^VZ;Cc diff --git a/resources/mesh_sew_bordertoside.png b/resources/mesh_sew_bordertoside.png deleted file mode 100644 index 48a3ba1d3a286b00bafb85afc19c026fc48be400..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVfk$L9 z0|U1Z2s2)~TlWVj$X?><>&kwGU5r~wQ|7Tf2>C;W@ddx~I9WO?!3g z>vD(Shd#l{?<;y`S4MELnQTpqUz_G867@OBM6`QW=`77F6J-ti(>UHx3vIVCg!0EmT) AF#rGn diff --git a/resources/mesh_sew_conform_freeborders.png b/resources/mesh_sew_conform_freeborders.png deleted file mode 100644 index fff04a28e3a6b4eebd1d2cf012362e10a367ee0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmV;U0bKrxP)~!!Qs#T}B(XIle;09k{}^p~6nD{f=i?e}iAt^t%X*uI2Qk3VX}#6$v_95Re%#od&B{Yb zh&$TY^|9vCTyTwxa-&l&52XTbn{8el#dHy&BB?k}K{o9^-GAB(^R{5&ehVOv&LIlb~$$7D)KGvhJfG;lvBG}UGcP;<` N002ovPDHLkV1ij{uonOT diff --git a/resources/mesh_sew_freeborders.png b/resources/mesh_sew_freeborders.png deleted file mode 100644 index 4b0f694dc365d7adf407cca2e7acc7f81595a509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412 zcmV;N0b~A&P)~!!Qsc!iH(3~>-E`49 z*iIycw)BJWjQJzaXTBxyKm-stt+Jb^h_4Ei(H4MWpVP;Ej;~O0!|ij0zYG!hc+N)e zp5EV3%HJVITLHvqEB9i)rC(QoYqXVF;9Eb!|4TO7PNy1_Jda7(>~fmYV)R#D?DHT$ zC>cNm)s!QP1o^YxKSo>b#Y6Pn`M5?~qLQ1^vf1U~K};}p+Gq_sZI5k~A2;@3v#PEL zaUV8zdu%y(XI$r^+~}06x>CS(v+c|FcT;wq!#M|YSR{)e*Jw*r^2J>MNRyN_Nn`ZC z|CfUY?BVsmGFg%)DeGcAYQuNHdLaT;U2$4vw8!@0E8r7v-XYjVJ8+T!0000<>&kwGU5s0fB{sn1El_BSr;B4q#hkN~4ssqg;BlQF#D5`L zp`^9%(#$S)Fa3R@My=aVtYsGYI$@WIqFCogMfsNfIupJ=~>-ie+?Q>%WV} l+hh+HC*)WMEW3Pw{e$$%+5dP#4guZI;OXk;vd$@?2>_^fZ_EGy diff --git a/resources/mesh_shading.png b/resources/mesh_shading.png deleted file mode 100644 index a2535afaa1a7cfc71815ce1066cb54714c51d715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352 zcmV-m0iXVfP)Zq}6ox-n3=heJE%g*!!%7$KlmSIONF};55t7eHGPOzAo#NnaR;YT=aW_Lnx6VtCF5PwS9$f%)VNTHj@@w0*5?qS+vF?S{5*vS2+>gvpD~B)pGmUa=YHR|J*k%<^cmr yz9d*<0X8jWE0jV&gDvc)#eCq2&67==Ft7c#iez@Ea_76Y_X&YQw8KUkf0`uui-1C3B-j# zE&|$O##&jUA&}&OjU~aS_kR7B!11Lz`C42I6gb4^JfCdt>xqI3Z5Q_J%E zQlx7b$qp9XXsUI2ux9EGQ+F(XEJ@Y*0BGut^PlJN#!+ZE7lZ#diNMXGtxNQsh78V5 z&t|~Q)dm15B{GvN)B-Y4g*p!O(0x7aVCjdRaU5A)t`1!5MxzR~KNOf9Oej0pT?wMH zgweORTkK!~0$`+SU9!2_&=36#60UD=w|<<<94X~-;G~OR7fIO7pBulK%p|$Yk2{>) zrRD+eTuO;56nT-O3YBoUuj4daU9M*Jy8eC5IF374d)VUJ0#zvAPqj7*gMLXDCTO=aJ Z`UmoH?>WBknMVKs002ovPDHLkV1oI}+pqut diff --git a/resources/mesh_skew.png b/resources/mesh_skew.png deleted file mode 100644 index 45cca1b3ebddfd5c6526bc5745e65af7170f547c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmV-l0igbgP)15Juky6|+)^93Z#~zJih}Rq!=(1{DIi2zUy?rqKVN71_=Q zf-QF6yqR4YJU7kVZE^nv^wf=4YlE-8bLs3e1)+DynE7_mdqhwd!jy)^x+?Pd{5=YJ z+}u~|G)Ze<7d!=OX7{>7GbK*qkxQAHTgUGBa|FPJZv2-2YPWsa0w95~aEk%pOgjLP z9Om4J;U#tiIk*kH#x8WM9#*Djc#Rzte@gSI%t_Y{DBj@(tq$4Mz%z%Y3`L}}8w8fG zUR8U5_0xK?NDlOv=p*uJk`gB|B7zHDs}+F#+a6UNE!Z-YK(L`@$r3BJH=8o53K^XA xgbi&z$3dV7j@(Lu{%pz|z7Aehk*wa=%r8fkYkv-HcUk}d002ovPDHLkV1mX)mb(A| diff --git a/resources/mesh_smoothing.png b/resources/mesh_smoothing.png deleted file mode 100644 index 0da777dfa6c5639ae62b80fb4de1328aed58d323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmV;R0bl-!P)H zK~#90wUoh1!$1&*ziEoFJrrs{N}fQ3oO}%Fi+J%|DHNgDcknf&kKswEZ=h0$fgHM* z*74A6YU3ttX&eX%JO6&W^Un}TjG@VBHA(~8Rf%=Cr&YNiOXVnF4hw=T{r2SA>uyhj zEEV^z1?I38K)AG?sw9KY+ZiZKdXfmB_!S`D*9+yQGl}d|26}~z~0M3_oueL1$&kwIViNQE7)4g#cPt@?ad3n2m>_wL5Lt9PGK_F;Vuc?CC+kVt8vh z?4t3epo&8Eql(TR=b(pa<&^(nXe~eou)t+v%-cyoUo`Gv%1C5T4*N!%s?0000< KMNUMnLSTYIDzGO2 diff --git a/resources/mesh_symmetry_axis.png b/resources/mesh_symmetry_axis.png deleted file mode 100644 index dd5e19bcfd80083e8b90672b1e7ceaf6d9db00bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5;mP)>dr1qj^5h`Zd1uFcoLkTG@H+i4#}qhy+^2S!+h`k7gFM z05KBl2Rg6;v{PXhJP!20##ZVoxD^IqzUyY4gK)34R8CaycO%T0(gS0awHyOeafYwd zLQ0!#D7S42Der)96QKY7Uef%9l#Be@LzNs7w~)YFqDSgek)G0KbGJ`h3$=-UfZxT7 z0;1Q5s;*c8gki}3ZI9iDxjuyciLom4avcEdUUsCX)Xodzd=m_ys;j!~r=?IA)~)7p zx%3-!4mt(9%D>e%S^qwqP;y9S@564|z@|EW94YgXbABF#OlEBR-$938A#yF*uo;B> Y0k`SNFI^A_zW@LL07*qoM6N<$g1;#!!Qs=pG*oCZDD5I=2wfR^pc1+;Cbvl!E!qTp4WA(k8++k}H?6v` z&_$#&H7tXE~7iQlyu(J>32C-a>7lAK-U&Qb6<; zQPmY2fG`X>z8^7JdHWECH^!>W%WVK~cs-C_QoAmU@m(;0s;=s;pVmUhuzod7(+nHb z2VH{Qfa60~Z3o UFVZ+5f&c&j07*qoM6N<$f`VM9<^TWy diff --git a/resources/mesh_symmetry_point.png b/resources/mesh_symmetry_point.png deleted file mode 100644 index 81a29a73cf673cf5f75b162e9e2a3db8e824c79d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 430 zcmV;f0a5;mP)GOoj%Grl7zA;*5UT%GW!|_0RP4&8`j30slRCQH%{j?T3g$=7| znr7UfE~pLG%Y4*2*!VrPC_cx|_iz~2*P$-o7s|ZkmfvPB)`;{MZiEhg1H@LaV>fg8 Y2MuY%E|Wy$cK`qY07*qoM6N<$g2zL*1poj5 diff --git a/resources/mesh_taper.png b/resources/mesh_taper.png deleted file mode 100644 index 68dbc66e6d8b02d6bc439066f7004534d4dd1dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmV;40e1e0P)b;z6hL1f!;h4~Y@7k9r$Ak(dZ7whiJ~5$Vyd`8#6r7NoC2w5$Pg(EmGD684yi*z z?0{7Iw>aO=@BeQH7%m!}%i{h47<&H%m1Y=%bMyQ_-=>yGmWeqFXnt|4>87^c3A)_e z56bU6%UenYUZ)=bygkBbGN2Q5oq6-;IeM>2v(z&bPl=<+!RFh1m3G_DEdVN3{wZ5K z8@AlhWKaXoo@M|@DD+g%0c;t-YPu=Gw+~n4x<~<2%42wJ=K>$w5f3tu^dnr*}kgRP@ma6hTo~ nN!aX-jrIH5Xswa`A+H)g;gEB`b!?|z00000NkvXXu0mjflJu}g diff --git a/resources/mesh_tetra.png b/resources/mesh_tetra.png deleted file mode 100644 index 6812d5b68623ae785eeb1875885a7defa2297e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmV+m0rdWfP)tt3Wm2L-P25{Q|9WsISv+ R@8JLd002ovPDHLkV1nJSaO400 diff --git a/resources/mesh_tetra_n.png b/resources/mesh_tetra_n.png deleted file mode 100644 index fa4d0fae9cf96049c3acb676ff2b347fed6d5df9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585 zcmV-P0=E5$P)Pp zhzR{bKOn$h2*SP5N|s$s4ZsN>{oQK0B8npt5*)0GaJyFu9ZY(2^!O0%`S}U(|Cky#w?)P1~wXpu69{^2$9z~kPr z-}{1<{`uHl7*>)9oCztu7Q5En6kOz)G!Zz8-M%zTMGct zTU!vVb^Z8qu#<~o7^I^VwJiEgVxbu}0T_NA0&xBPy8fr+az`$AUhO^;5t29|yUhS- zwwfh{h9Lc!n$>c}V!0rR6MG+40hJk8HFNsqG^os(>{n*gTCrJgh$Le8ZCG-D-{AcV XvqBA?DVDM%00000NkvXXu0mjf)!YSG diff --git a/resources/mesh_translation_points.png b/resources/mesh_translation_points.png deleted file mode 100644 index 1805c97fbc0ec9f3c6bbde3ec3826597d17d201f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmV;`0V@89P)3shDU(N?G@aGS>MrAtY;Dj-Oi9rAW!ZR2*+Q%x%UaGv1 z7Lbn;q;G14RX#Du$aYsrrjGN&V1ZEwOzY4vZ8FLM;Jxi!E0EZ5sktYk9AU7q*4C+z zI(|nR)C#O%29#`hHfW>Ex(TFVL|itZTHByrFn3kDFypE}nVk$gk zawA<;sE=K-JDBlC$>#GoWkLus!9)om>f`uTD1k8mYO|j%6V7Yszk%gkegb+D2rM@e z={6m#b_BxND#;o_8RhVn9;-rex=jZwJlHm5l*7OGSrrOHpsk~4LihW9Z=j>0UtLgd zIq%(l=NRTa%oDw*a2vb&T0`cHvIlOaIP)?W6D;7u1}tmJT4*00000 LNkvXXu0mjfbz8x) diff --git a/resources/mesh_translation_vector.png b/resources/mesh_translation_vector.png deleted file mode 100644 index dc4f08af10fa367e9ad0f474bc80ec41055e87cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmV;*0X6=KP))KAQq#fmdZ`iP|=)Zycz5IY|69lc6if9!zR@*{o&lc+= zrwU@cv8R(X(a|butZ-KrP(h4;=j$X*XacQVJrla!Zmofx4Ej|E^~OW%?stkX?|xXG zX*p72e7o7b3)}#Y;XGu}ADp{=_rkyRUu+b91FE#0s;GcV#{d8T07*qoM6N<$g1wr+ AO#lD@ diff --git a/resources/mesh_tree_algo.png b/resources/mesh_tree_algo.png deleted file mode 100644 index 61b11bbdd529e9db5f988fd3efeb3c7b1a0eb565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_0#6smkcv5LCtc)iP~dS{-&QJf zbS96nAs6#i`QGph*B;*=FAnZzTI+DJeZne%=PY9WHB2_|S9%1Cm2@AeI%%4+t@dq9 z!L=ZUsG`uIw~x-K@ybNIJmR*vCvo6^$e%CAPR8%Ot#=_&K9hk*A}IXAAGuEcrdvO^ SI!*xE&EV9Th$SfbOEWWb zhXuOXy!*jF<>)HG6`944Q+X2aSH;@+9bL>BJBKw=*le;R!|X(z7Lf#Fj>{`m7;a^= vSW8NYx@5atXJP7Cp{8_cWA>8p2Mi3y9?M94f1vRWXbpp>tDnm{r-UW|uA44F diff --git a/resources/mesh_tree_algo_mefisto.png b/resources/mesh_tree_algo_mefisto.png deleted file mode 100644 index 5375071b54a0235db4aab0908907fcd9bfc27927..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_T2B|pkcv5T18?&lP~foXd2P{U zYUf9R^(awR5ir8s`esn^`O#AiAxFUk;( z5T1QNFeO0gU+L!NsfQw2gtxz5uDsyUJC|N}3A+m>t6W!o3u1U4l5+U&&Q;IDub(WL g=^Cq$*`GV7C)Swb*7-7PphFluUHx3vIVCg!0R8qsGynhq diff --git a/resources/mesh_tree_algo_netgen.png b/resources/mesh_tree_algo_netgen.png deleted file mode 100644 index cb75b7e9d2c0c540feae86ebd25376f3cda5267d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_Xipc%kcwN$DL>9Th$SfbOEWWb zhXuOXy!*jF<>)HG6`944Q+X2aSH;@+9bL>BJBKw=*le;R!|X(z7Lf#Fj>{`m7;a^= vSW8NYx@5atXJP7Cp{8_cWA>8p2Mi3y9?M94f1vRWXbpp>tDnm{r-UW|uA44F diff --git a/resources/mesh_tree_algo_quad.png b/resources/mesh_tree_algo_quad.png deleted file mode 100644 index fe6ce0285194cbf77f4e60f5037107ed61e71fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_3{Mxwkcv55Ctl=jP~dTi?|p5+ zWh|IpB*MPRUd*E*!0_Jpy?4H9X?WkdW^m)K-^yK@mzpl=*UO1B7`AF{G@6~bY|abD zB(4P_jbwRycV^>rv&$d)l@mD5HROfzUue=VWtLeWE6ihdX9mzt22WQ% Jmvv4FO#qEwH{<{S diff --git a/resources/mesh_tree_algo_regular.png b/resources/mesh_tree_algo_regular.png deleted file mode 100644 index ecd1f73513bff745ff9c2792adedbb267c7c1243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xaUr!gukcv6UDL>9Th$SfbOHVp> z)_1z+mf!YF`FVT($j|H-U(7AAR&usN;H*MVfh#@!LhI9<{0^<0Iiumgs+l()9KYaG ivS(pt+LG!hR)*b7Q_fFo`TP%PFoUP7pUXO@geCxkJ}^W8 diff --git a/resources/mesh_tree_algo_tetra.png b/resources/mesh_tree_algo_tetra.png deleted file mode 100644 index 9c21a58c198111012112d2fe5aafe20404d7c597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xawj^(N7l!{JxM1({$v_d#0*}aI z1_o{+5N5n|x9$&6kiEpy*OmPW2QN3f>7-+~8h}E}JY5_^D(1|c- z6>DpE@|k!jg->`pf9aPL2Hi|np>sk%uUb6aF=O?#KE?y3OsUt`=9W%A(Jy$VFSv2P z!?K;sm2Rw@8^xyQd89ZLTFY=AoTbqDNASmme=5h>7x=9{yE2H!E+o{)_O8sFBhp@3 WcGB}_hgkz%%;4$j=d#Wzp$Pzwg=QlF diff --git a/resources/mesh_tree_group.png b/resources/mesh_tree_group.png deleted file mode 100644 index cfcfc687f397eebeaea38b740f9eef8ba18c79f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmV;M0c8G(P)h*kgq0VqjC zK~#90g_Au_!$1&)zlkCg(WPWlrCYg8atca%sNHY?8oC@HC2~cdGRJUhWf+F|N70b=!HX%C&%=IjH~u002ovPDHLk FV1j0Ws9OL4 diff --git a/resources/mesh_tree_hypo.png b/resources/mesh_tree_hypo.png deleted file mode 100644 index 3ab76a6e821acf3a04e4deea24d30022fb5d624c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_1Wy;okcv4|1097J6giq?|Nl?@ zcEv9{<)p5#t3r$DoK;M|>~i62IP%K4FG?A%?5MBpUt|4gxzA+zC11ZzmdKI;Vst08QsI AhX4Qo diff --git a/resources/mesh_tree_hypo_area.png b/resources/mesh_tree_hypo_area.png deleted file mode 100644 index 22c8bd0ae432ef2c82e1f1ff986fd1504916df88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_EKe85kcv5TCtl<|pupiGpZCtE z?~%jx{%cvLY&xAEL+&{q5!kQ9n80DZ*~52A%x=dMPy8l2s9rCxk8=sXfAuI=w%`3m z<1MD0Au+e?SH9S`t98$LPG|XohP#0snOEMboRO}N%450^@z_G|PU$YuKhvB-fwnSu My85}Sb4q9e0QO=%PXGV_ diff --git a/resources/mesh_tree_hypo_length.png b/resources/mesh_tree_hypo_length.png deleted file mode 100644 index abe34f5b471fc0d2a5cc125876e71850fcc22753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_1Wy;okcv5LCk65yP~dQme*AZR zjJ?^MgAb>yiC23X=)$SEbkboNjblIWX;1vfDtxQiEil2IXW4?&t;ucLK6V% Ct~ww9 diff --git a/resources/mesh_tree_hypo_segment.png b/resources/mesh_tree_hypo_segment.png deleted file mode 100644 index 1957e6d8fcc13868f52bcef9e4ff24dec42702a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_P)`@fkcwN$DL>9Th$S#i?(w+w zpSjY7LG9C<#SxF|HzXgdD88J!sOD^kZoxn0PNPR3K0Evry!+ST`9Xs``~T`a=H^VM qi#rX4<`!KL;{40pUa@=;BSZIAb@@e)6y1RqFnGH9xvX5*q7TeYt*E~)vzopr04Xy)_W%F@ diff --git a/resources/mesh_tree_importedmesh.png b/resources/mesh_tree_importedmesh.png deleted file mode 100644 index 0c37d0a7ec42c925da869172f040469d614828e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F?i!z|0Wf6XFWwGW=)Q+H&nbkRAo2 zAuz&1Ann3uKVTMMDhcun{?G7qyMY&wXY1+W7*cU7^&B@Bg8~Qhg_+;?7q5HTE+if7h4GYUBMsV)2mXWa7TNhg2k%WJkJ<2&o{64m|)+;x2Bzmso}^@VGEV-OG5mV zSv}|6)(SE>(lCWhrSPBH*R&|#;A3eUH@%LF`kHknoI~yCkCu7O2}N0KAK16l{mWdC0kclv8BYj8T}CeSeqp00i_>zopr0H_~FqyPW_ diff --git a/resources/mesh_tree_mesh_warn.png b/resources/mesh_tree_mesh_warn.png deleted file mode 100644 index d61b873c365922b18529c5db8154dccb4beeff01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_Tu&Frkcv5TCk1jHFyL^We6J?` zR$$qJH_5VF1yV21*HU?+soE0OJMXNdq{NKRKU|y?RGvQD*vaUS;F&1g?7(#5d9TQ| z3c2u|;Y&7JdwrcF73{nq^6i^N6}Jn|>A&+bxn9zd`DnS&5BGhczt`U@J+3XVWO7X= P&|(HpS3j3^P6drMSwiW1k^7*G(8iQkKvmRf9kG1n2r5WoF$jb_`%1@3qzp1wU z%R+$~7p?^fnsZ7|FgEp9#63u>mOb@JPo`^*jmU?vDcAN`*xFf!pDI}!ugB)~Sm5hI zi`!BYws~{+uol(c2-7(u_Vd;>+3x@Pr$rvGF7{Z#-+n1^`4!n!%>1pFg8MIDm@5l( ODTAl0pUXO@geCw$PfFgClC?li}`uD1?!+u zAbmXm01N;uuFADnD6&;yx5+2Us)UjX_xicFc=V2r1ki z^)owy-=;@cpf`6D?J4Sa28?q601?3$0|3yIJepjn_sGF4m@A1lkCF<>T>>Q)h$srI zs~UQz-ND?|-$MPx#uzMLmToRv6*iQntV$$E+<|<^bLL>&xP#Htw#h~}k|-z$DL}jf zMj|ZFhxz3RDIlciNpjMM=J7iY+qGG@8i(d*vCAP_6;@AjXO$2}lAxrDcF}*JH?#g& zyHYNJoh-SF{caB&;A})R3~PV`w~Q}-Os~@!dbb5ESh`7VU9}#g#$&!8&jW)X-t=*T or022Afx)lo3`<1l`t;KH16dNM0za#rVE_OC07*qoM6N<$fEjJRz7-+4bw1VDg5D{qKSoSwCu#XmE_NE_1Yqc^JL?jSLF|t|4 zf(lo!D^S!_Ez08XLc1yy5r|Valps)Pg#^jL4Wb^<_I+5#i5e__&udkxPE`^oo{D3T uFc8gxib!CDk=L73kki2SXLqgrC;kA{ag{=r^`v?L0000 diff --git a/resources/mesh_unionGroups.png b/resources/mesh_unionGroups.png deleted file mode 100644 index c3412bb09b2de82799924eaba0f741d1b5b37be8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmV;a0apHrP)rNG_V-f4e*WAMSp~orUJCWdmSUU^SK*1m2$BPquoKF8)&3{6$qT2m@Bj74as{%;)ZKcJpx*96S&9hdRyFc;xot(TEL)!_4}A zrj;{1tTfZg86H-eX)f5B-&KZl!Qacz^MZd)RNS<#mjjQLx4bv5?QXd@>C&vXxvsU? z>V$sZC8@zHP83keYC_8s4$*n)CnT)ASt zo|RK_K@l7rM5HnXrk}9F|2TRX;klmS>7|*55kVM~f{kxkY(X^?9^T2AYAF5z;a*{X TI1=ln00000NkvXXu0mjfR))N= diff --git a/resources/mesh_uniontri.png b/resources/mesh_uniontri.png deleted file mode 100644 index 229cb6aa834bbbf42dfe448b0a6577fca39dbfc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcmV;S0bc%zP)90WL{I zK~#90t&%-z!$1&)--az_!G)^?atGHwfC;X2jTE|s@fD2l4V+F%;Yv1p0M))jz{apC zRRlIgw9fw95q=<+l{DYXn;8a;yXxV-IDik1WR^D#1^{v|H5+W%imcyj5T^kZCeo|3 zf*1)95dfWeB5$|LgL77^%K6T7nE_zCJUI7aF>&s{Rrw|?pbwa?=V;630y{lDqb-{N zY;?7UZP{F)1{O~{sqYci7>|a*7!g_=&O$Y*~rh%00000 LNkvXXu0mjfhfu2< diff --git a/resources/mesh_update.png b/resources/mesh_update.png deleted file mode 100644 index 8757e30635a49a83f408d7f618a528dd025818c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)CrBx8JevJnL-~ULohd)8xBt;Q^47LLyDI>GzIbq zd4>#uXgD|x26a%a^WU~ZejpIC{Lxq6uOtt{yVi&I#ex6N8Q#Di4BpuEafKcR4^!Se zQ#V(i>^HfSy~T#srv^1EzMgUW^A>=sA6IU?d?*n@F#kOF{;seCOIIl`uP>;*B3ow; zu9QOU6}8$vu%j-%o{=mQwAKhA2qz)YG$NP;G6rf;o#H>AsSmYc=7dY6qc17n%qiLYzhOI^5)q9CRrvXStgBH!>!m9MsAxP z)+%?>sJ-Ii+Xd+=ZKWGb0v6xfDwAc>3ap*7hY2170E$h)+v^+Jx4>u`A$&3DaR<>K zky~lcR;61Cn}O8o0IM#H2*Ysr9M(UU4<+HW4{DYW!olLNvDdpPaw}awK95IX=_<8A zUx0r+HiM5t`KvT)uX+IhWb3SD#p(3ase_TLCxk#$g8VM$pbr4fQ?*yeRKo}{5l-Ex sLa@h2YYU*lfdK*$fN#TSK3xF60l(h+Ph!VND*ylh07*qoM6N<$f^!J;;s5{u diff --git a/resources/mesh_vertex.png b/resources/mesh_vertex.png deleted file mode 100644 index b85d63a13b0d7ace6de162c8ed8427ab33ef18e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=zNd?0NX4Awlpp6ELJzpaK6c}k zk!0H>5OT0%O3;5}1ECje-zQuBm0Z=Q0r>mdKI;Vst03&1_ AbN~PV diff --git a/resources/mesh_vertex_n.png b/resources/mesh_vertex_n.png deleted file mode 100644 index dfbafc9459f0a87e916f7d5a8f5b2c961729cc2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqEBOF-JySSM+m8hcsRX_|rBEZb z;eD0H+JuBf^PU8)+9i-zeemkM3uU@(w;9UI1OK}V2MKv;M?`3>bvWsxz{$)!sUl4x j_*i4h*T3f<@;CCYIjGRoEhoAI=z0cES3j3^P6&Cb(<`H~x$+?AejeA{7pY3ahXEU#?pHwTI$@yK0{uam!wA z`km&M9aUfrTDT$xmpvq@r4~eWb26ae&>s*Hbhfz!EnH&GhWR!#{Z5F;l1O7Hm5%LT z0qCSdMChce3L<+li9`>JL-f+&@%yNB_O}AIgGICeaDUu0kUy47_C6LQwqRw+N!6Uq z0uU)mOpjJ2+rctjC+6E6Oy2_eC{KCyE=*7FgKc&wTA=6Y(Y9dQ!1bZhvkTpF diff --git a/resources/mesh_wrap.png b/resources/mesh_wrap.png deleted file mode 100644 index c919168bc71dd3bf5ed3a72e199dab1a1590a3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)8Y~A}B-Aucf^Z{zbcqj&-1i)%jT~xQ*E714z>}G{?p(DIZJB%1}O)m{&uVW)$;6O)4}igQV@L`@=r| z|7s{7O8~Mo^G%rq+S)Q>7G;PClE_Jii+SPef12)4>-V*@2kTYMvKf-L5D^)gH!-u3 wLP-RjYOc9Pr`p$M%E@J5ciDSueQkal-z+|vCd{+j5dZ)H07*qoM6N<$f)9|(iU0rr diff --git a/resources/pattern_sample_2d.png b/resources/pattern_sample_2d.png deleted file mode 100755 index 290872b5105974f199c563435cfaf842f135a1ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1180 zcmeAS@N?(olHy`uVBq!ia0vp^mwFdgVg_Dt6UpPx4{XPQ&i>9ZGV@SoEw|7r(x@9Hc5co6X z-~Z`T9lbic3*=^OyE5sT)ZN*ROxw(Kr8WAZvKjAvHvGkSfUAXt5f$}m!X{sW)aaEq8?D4?tweIWd`QyHxlX@#QsUu?MY~Fx-_YFBYnK(M%Zk?TQ zyzt8B`u(5E|Ll6)c+f{~drA1VN;M%C0U?_mMVB9b;Ek-9-wCrVkNahfzg*Spz5fp7 zo7H@KPmVnx%=t5$1*`}?)$g4 zeu}nu9^RB*&n75$J?#C~vfD0I-&nHNy086eFt_8%wgb;ium3(;b>jQPbA~hhVy0&D z^8QY`U&)egA#g@H*x~Gl{1dbM_9(sPe*a;Dmt=Y437bvpdqosYw^iF1AFlEc4NBha zuK9EMg~(GAybR}-ncuGTmkvs{dYgK!c&^=&AfM&2XKLz}bF4I+du_`h%eh)0p{r|( z3AEGvSl{vLmlLFJ@3kwlI~Ls%()F@r``!N6W{RfEf_096>VFGVU()sH$KTDV z9=$J1dXvBHU+WAMs+#)v%bjmPRhO^J%wEs=@<>V5xsN~QO_*me_g?`|ou9}28qn+$6Y=tBIWKe_m1UU7L$1sth(p@BeJ8(*j<{at$F7H8W;rEBqB z6B5cax0Ove_|q!$RQ3}0b^Q_#_dHv+$IVJu(AZ0KQpb$YSrc52X!O5VjGg#MYNf4U z{wX7;wO=D1@kSmrxV1am;OsTNG&L0t1u!az_7L1I@^IC?*ZP0f-F+;a@&Elf8QY$y z`fX(b3MNa|A6vOru3UQOzg_zjwU=GDOe?m?>b3QsKeyt##}|XFzdPNU7#<40d>{WN sPnP*>T>bV|7VC{$n;D#%aH9Q;38vqY10B;Xf#nE;r>mdKI;Vst0NdXA$p8QV diff --git a/resources/pattern_sample_3D.png b/resources/pattern_sample_3D.png deleted file mode 100755 index b3066858ea5779f2aa45a82f28466f78b4fbb22b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2160 zcmds(|3A}fAIG-}$($tjr&+#^CC-{<9Gv-9A&eYSwxpPEAyHyqIJmiwXe3LcgPfx; z>O>it3gI?eYtwFvNwQVG=j)K{Xxtw^-v7e=xE}BK`+B_I*W-OX9@q80o{ua4mt#k@ zcOZ5^AP{YDFZVz&ia=}Jt`7R{lS|`ZP$v_PxfoSP&8dNfz z@f{R3E_?fVX!L19wXhCayz5X&>y* zgJj1wB$Ux&A+y8?SWzTRH6zexW@cKux};;dTde)rUO5^^&hq6rpDs4Bzwxe?W6|td? zMh(pS`V(MD!%B(hqEJ?pN~wH^D6L6=adm}efaOJOFOI+>Zb#h?Mh8mld=t>9QX+RT z)G4C)E@}vmk&Dp&Rq>&XCAlYdo3OcQyM+@=f{n%X$>DlQL`byh{H^L#Gi02n%y`I# zBlF)b!wL8KVM&~8A^b~Dn(@|q>gF}9ls`8YCGt51brWKo6=3O&l>a!}7T{_9uP9YdcXMyU*w>{fDtxK7kkR z%u^`zQ{iHFF}nOhr#m+=*>~DIk|uqc`}uhnWkqS%lEFWC)2L=_Mgs09K-@2#B+@I0 zG5p2?k1y?AQN1?6!{bLR8tjVumDvre$K2fGM-k94*bZvkMm{S z^7um8ePQFs;9Imk7{7XLxyfU-cbLY zWoWs&*AAE(tIViAR2UFZjL9BscbNC#35}&Em4)l(_SjxDn)>!pNUmj`u1dJpH&=se>TPk71)YT~N?{jUN7T7JN` ztR)y$Kn>2|9_$K!vEeFmsefc&JKW|!G35|!p*jxZZm}d``8O87>{)7~i3ZE%K4cTX zOIwN!#vK+6Rf=7{#RB^s->i#82KDfa-kncN=9snp7gyW1J?J$rQweAkCcUy1#kbVo znN+gQtR1V}>J$t33T6Tu92b@;B?c4c2Sh9VA4Be)>Z+KHzL_plxQK=?&ZYJ~v+cTZ zzq6#`x|Bkf^%$^5LSh;ud@^Qg0PD7I+g7*^EX)m?)fv=T4?p_!VK%hd?;kLGlU)ga zg=L-lpLAWpx#MbE-OH`uoSXkY>4wKq)1y%&sc483qqUyUnvS05XJlrgysN|$tAEZJ zr#P$;8fYeOe%_wmK zFU zUIqDL04oh&&@*J1tMZ*z4M8looIUkvvp@GsQ$jr%<5Z=CrYIFpMJkHdYo4p#k(&rjq#+pjtT?6JJvt-I6$f10HrF?k^9vE;md}m7lm&p{k0H zFl|_&^O1h_lYGi69fls&`{WXArYR5O_@+D|A-a^)z(uO5B|H7OViCjWZi;G)bXMly ztMg@hK}#cL7C}N%%_#g<2DMQLF!XeMXDd~YX35j`wWAI(Ez$mb6pLfSL#Cu37`)Xu zT+0;WWmlf#-wb2k_sg5*0r9vwIm=JQgMQslT+mf{@LnDP4WuJV9!qInI$ z<_vPn&Owk%*`MAU8F}V;Si#2Q)WHLWqkyS!?WJWTKj5X;s9hjh(gRCw#(>wiNgc&0 zo69z2H1lcg^o9jPq94h%hW}dGMu|0lGS`(9n~S&u;z)#*B*V-yd)*F5!N(SbZ4KJC z+AbtCv>Vy39@bt6)PrSh)aOEB+tslq@Q$o7NKPiSioQQz#eBB_{tY1B9>?4t9}dg@ EFVL*@A^-pY diff --git a/resources/select1.png b/resources/select1.png deleted file mode 100644 index 99ebde65e86ffe25badbb1507f0286abbabd99ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqMyzU}gyL32{Ag(ZBjoa^c8=d#Wzp$P!dS9t;e diff --git a/resources/standard_mesh_info.png b/resources/standard_mesh_info.png deleted file mode 100644 index 060008742e9813ab3d8d54be66de7937f353d382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VTavfC3&Vd9T(EcfWS|IVfk$L9 z0|U1p2s75F#7_hYvX^-Jy0Ty4mgA7unl-=p3Q*{Sr;B4q#hkrU_VP9x2(->u7EkXy zr0QM4HAQcY2+MB;t{X?Z10p_gOlNcdBk9xf$t!tZb-BMC4!^CGqq=ywKBS3j3^P6 - -namespace SMESH{ - namespace Controls{ - - class Functor; - typedef boost::shared_ptr FunctorPtr; - - - class NumericalFunctor; - typedef boost::shared_ptr NumericalFunctorPtr; - - - class Predicate; - typedef boost::shared_ptr PredicatePtr; - - } -} - - -#endif diff --git a/src/Controls/SMESH_ControlsDef.hxx b/src/Controls/SMESH_ControlsDef.hxx deleted file mode 100644 index 576b1e8e0..000000000 --- a/src/Controls/SMESH_ControlsDef.hxx +++ /dev/null @@ -1,660 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _SMESH_CONTROLSDEF_HXX_ -#define _SMESH_CONTROLSDEF_HXX_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SMDSAbs_ElementType.hxx" -#include "SMDS_MeshNode.hxx" - -#include "SMESH_Controls.hxx" - -class SMDS_MeshElement; -class SMDS_MeshFace; -class SMDS_MeshNode; -class SMDS_Mesh; - -class SMESHDS_Mesh; -class SMESHDS_SubMesh; - -class gp_Pnt; -class TopoDS_Shape; - - -namespace SMESH{ - namespace Controls{ - - class TSequenceOfXYZ: public std::vector - { - public: - typedef std::vector TSuperClass; - TSequenceOfXYZ() - {} - - TSequenceOfXYZ(size_type n): - TSuperClass(n) - {} - - TSequenceOfXYZ(size_type n, const value_type& t): - TSuperClass(n,t) - {} - - TSequenceOfXYZ(const TSequenceOfXYZ& theSequenceOfXYZ): - TSuperClass(theSequenceOfXYZ) - {} - - template - TSequenceOfXYZ(InputIterator theBegin, InputIterator theEnd): - TSuperClass(theBegin,theEnd) - {} - - TSequenceOfXYZ& operator=(const TSequenceOfXYZ& theSequenceOfXYZ){ - TSuperClass::operator=(theSequenceOfXYZ); - return *this; - } - - reference operator()(size_type n){ - return TSuperClass::operator[](n-1); - } - - const_reference operator()(size_type n) const{ - return TSuperClass::operator[](n-1); - } - - private: - reference operator[](size_type n); - - const_reference operator[](size_type n) const; - }; - - /* - Class : Functor - Description : Root of all Functors - */ - class Functor - { - public: - ~Functor(){} - virtual void SetMesh( const SMDS_Mesh* theMesh ) = 0; - virtual SMDSAbs_ElementType GetType() const = 0; - }; - - /* - Class : NumericalFunctor - Description : Root of all Functors returning numeric value - */ - class NumericalFunctor: public virtual Functor{ - public: - NumericalFunctor(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual double GetValue( long theElementId ); - virtual double GetValue(const TSequenceOfXYZ& thePoints) { return -1.0;}; - virtual SMDSAbs_ElementType GetType() const = 0; - virtual double GetBadRate( double Value, int nbNodes ) const = 0; - long GetPrecision() const; - void SetPrecision( const long thePrecision ); - - bool GetPoints(const int theId, - TSequenceOfXYZ& theRes) const; - static bool GetPoints(const SMDS_MeshElement* theElem, - TSequenceOfXYZ& theRes); - protected: - const SMDS_Mesh* myMesh; - long myPrecision; - }; - - - /* - Class : Volume - Description : Functor calculating volume of 3D mesh element - */ - class Volume: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - //virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : SMESH_MinimumAngle - Description : Functor for calculation of minimum angle - */ - class MinimumAngle: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : AspectRatio - Description : Functor for calculating aspect ratio - */ - class AspectRatio: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : AspectRatio3D - Description : Functor for calculating aspect ratio of 3D elems. - */ - class AspectRatio3D: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Warping - Description : Functor for calculating warping - */ - class Warping: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - - private: - double ComputeA( const gp_XYZ&, const gp_XYZ&, const gp_XYZ&, const gp_XYZ& ) const; - }; - - - /* - Class : Taper - Description : Functor for calculating taper - */ - class Taper: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Skew - Description : Functor for calculating skew in degrees - */ - class Skew: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Area - Description : Functor for calculating area - */ - class Area: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - - /* - Class : Length - Description : Functor for calculating length of edge - */ - class Length: public virtual NumericalFunctor{ - public: - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - /* - Class : Length2D - Description : Functor for calculating length of edge - */ - class Length2D: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - struct Value{ - double myLength; - long myPntId[2]; - Value(double theLength, long thePntId1, long thePntId2); - bool operator<(const Value& x) const; - }; - typedef std::set TValues; - void GetValues(TValues& theValues); - - }; - typedef boost::shared_ptr Length2DPtr; - - /* - Class : MultiConnection - Description : Functor for calculating number of faces conneted to the edge - */ - class MultiConnection: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - }; - - /* - Class : MultiConnection2D - Description : Functor for calculating number of faces conneted to the edge - */ - class MultiConnection2D: public virtual NumericalFunctor{ - public: - virtual double GetValue( long theElementId ); - virtual double GetValue( const TSequenceOfXYZ& thePoints ); - virtual double GetBadRate( double Value, int nbNodes ) const; - virtual SMDSAbs_ElementType GetType() const; - struct Value{ - long myPntId[2]; - Value(long thePntId1, long thePntId2); - bool operator<(const Value& x) const; - }; - typedef std::map MValues; - - void GetValues(MValues& theValues); - }; - typedef boost::shared_ptr MultiConnection2DPtr; - /* - PREDICATES - */ - /* - Class : Predicate - Description : Base class for all predicates - */ - class Predicate: public virtual Functor{ - public: - virtual bool IsSatisfy( long theElementId ) = 0; - virtual SMDSAbs_ElementType GetType() const = 0; - }; - - - - /* - Class : FreeBorders - Description : Predicate for free borders - */ - class FreeBorders: public virtual Predicate{ - public: - FreeBorders(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - protected: - const SMDS_Mesh* myMesh; - }; - - - /* - Class : BadOrientedVolume - Description : Predicate bad oriented volumes - */ - class BadOrientedVolume: public virtual Predicate{ - public: - BadOrientedVolume(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - protected: - const SMDS_Mesh* myMesh; - }; - - - /* - Class : FreeEdges - Description : Predicate for free Edges - */ - class FreeEdges: public virtual Predicate{ - public: - FreeEdges(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - static bool IsFreeEdge( const SMDS_MeshNode** theNodes, const int theFaceId ); - typedef long TElemId; - struct Border{ - TElemId myElemId; - TElemId myPntId[2]; - Border(long theElemId, long thePntId1, long thePntId2); - bool operator<(const Border& x) const; - }; - typedef std::set TBorders; - void GetBoreders(TBorders& theBorders); - - protected: - const SMDS_Mesh* myMesh; - }; - typedef boost::shared_ptr FreeEdgesPtr; - - - /* - Class : RangeOfIds - Description : Predicate for Range of Ids. - Range may be specified with two ways. - 1. Using AddToRange method - 2. With SetRangeStr method. Parameter of this method is a string - like as "1,2,3,50-60,63,67,70-" - */ - class RangeOfIds: public virtual Predicate - { - public: - RangeOfIds(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theNodeId ); - virtual SMDSAbs_ElementType GetType() const; - virtual void SetType( SMDSAbs_ElementType theType ); - - bool AddToRange( long theEntityId ); - void GetRangeStr( TCollection_AsciiString& ); - bool SetRangeStr( const TCollection_AsciiString& ); - - protected: - const SMDS_Mesh* myMesh; - - TColStd_SequenceOfInteger myMin; - TColStd_SequenceOfInteger myMax; - TColStd_MapOfInteger myIds; - - SMDSAbs_ElementType myType; - }; - - typedef boost::shared_ptr RangeOfIdsPtr; - - - /* - Class : Comparator - Description : Base class for comparators - */ - class Comparator: public virtual Predicate{ - public: - Comparator(); - virtual ~Comparator(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual void SetMargin(double theValue); - virtual void SetNumFunctor(NumericalFunctorPtr theFunct); - virtual bool IsSatisfy( long theElementId ) = 0; - virtual SMDSAbs_ElementType GetType() const; - double GetMargin(); - - protected: - double myMargin; - NumericalFunctorPtr myFunctor; - }; - typedef boost::shared_ptr ComparatorPtr; - - - /* - Class : LessThan - Description : Comparator "<" - */ - class LessThan: public virtual Comparator{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : MoreThan - Description : Comparator ">" - */ - class MoreThan: public virtual Comparator{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : EqualTo - Description : Comparator "=" - */ - class EqualTo: public virtual Comparator{ - public: - EqualTo(); - virtual bool IsSatisfy( long theElementId ); - virtual void SetTolerance( double theTol ); - virtual double GetTolerance(); - - private: - double myToler; - }; - typedef boost::shared_ptr EqualToPtr; - - - /* - Class : LogicalNOT - Description : Logical NOT predicate - */ - class LogicalNOT: public virtual Predicate{ - public: - LogicalNOT(); - virtual ~LogicalNOT(); - virtual bool IsSatisfy( long theElementId ); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual void SetPredicate(PredicatePtr thePred); - virtual SMDSAbs_ElementType GetType() const; - - private: - PredicatePtr myPredicate; - }; - typedef boost::shared_ptr LogicalNOTPtr; - - - /* - Class : LogicalBinary - Description : Base class for binary logical predicate - */ - class LogicalBinary: public virtual Predicate{ - public: - LogicalBinary(); - virtual ~LogicalBinary(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual void SetPredicate1(PredicatePtr thePred); - virtual void SetPredicate2(PredicatePtr thePred); - virtual SMDSAbs_ElementType GetType() const; - - protected: - PredicatePtr myPredicate1; - PredicatePtr myPredicate2; - }; - typedef boost::shared_ptr LogicalBinaryPtr; - - - /* - Class : LogicalAND - Description : Logical AND - */ - class LogicalAND: public virtual LogicalBinary{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : LogicalOR - Description : Logical OR - */ - class LogicalOR: public virtual LogicalBinary{ - public: - virtual bool IsSatisfy( long theElementId ); - }; - - - /* - Class : ManifoldPart - Description : Predicate for manifold part of mesh - */ - class ManifoldPart: public virtual Predicate{ - public: - - /* internal class for algorithm uses */ - class Link - { - public: - Link( SMDS_MeshNode* theNode1, - SMDS_MeshNode* theNode2 ); - ~Link(); - - bool IsEqual( const ManifoldPart::Link& theLink ) const; - bool operator<(const ManifoldPart::Link& x) const; - - SMDS_MeshNode* myNode1; - SMDS_MeshNode* myNode2; - }; - - bool IsEqual( const ManifoldPart::Link& theLink1, - const ManifoldPart::Link& theLink2 ); - - typedef std::set TMapOfLink; - typedef std::vector TVectorOfFacePtr; - typedef std::vector TVectorOfLink; - typedef std::map TDataMapFacePtrInt; - typedef std::map TDataMapOfLinkFacePtr; - - ManifoldPart(); - ~ManifoldPart(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - // inoke when all parameters already set - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - void SetAngleTolerance( const double theAngToler ); - double GetAngleTolerance() const; - void SetIsOnlyManifold( const bool theIsOnly ); - void SetStartElem( const long theStartElemId ); - - private: - bool process(); - bool findConnected( const TDataMapFacePtrInt& theAllFacePtrInt, - SMDS_MeshFace* theStartFace, - TMapOfLink& theNonManifold, - TColStd_MapOfInteger& theResFaces ); - bool isInPlane( const SMDS_MeshFace* theFace1, - const SMDS_MeshFace* theFace2 ); - void expandBoundary( TMapOfLink& theMapOfBoundary, - TVectorOfLink& theSeqOfBoundary, - TDataMapOfLinkFacePtr& theDMapLinkFacePtr, - TMapOfLink& theNonManifold, - SMDS_MeshFace* theNextFace ) const; - - void getFacesByLink( const Link& theLink, - TVectorOfFacePtr& theFaces ) const; - - private: - const SMDS_Mesh* myMesh; - TColStd_MapOfInteger myMapIds; - TColStd_MapOfInteger myMapBadGeomIds; - TVectorOfFacePtr myAllFacePtr; - TDataMapFacePtrInt myAllFacePtrIntDMap; - double myAngToler; - bool myIsOnlyManifold; - long myStartElemId; - - }; - typedef boost::shared_ptr ManifoldPartPtr; - - - /* - Class : ElementsOnSurface - Description : Predicate elements that lying on indicated surface - (plane or cylinder) - */ - class ElementsOnSurface : public virtual Predicate { - public: - ElementsOnSurface(); - ~ElementsOnSurface(); - virtual void SetMesh( const SMDS_Mesh* theMesh ); - virtual bool IsSatisfy( long theElementId ); - virtual SMDSAbs_ElementType GetType() const; - - void SetTolerance( const double theToler ); - double GetTolerance() const; - void SetSurface( const TopoDS_Shape& theShape, - const SMDSAbs_ElementType theType ); - - private: - void process(); - void process( const SMDS_MeshElement* theElem ); - bool isOnSurface( const SMDS_MeshNode* theNode ) const; - - private: - const SMDS_Mesh* myMesh; - TColStd_MapOfInteger myIds; - SMDSAbs_ElementType myType; - Handle(Geom_Surface) mySurf; - double myToler; - }; - - typedef boost::shared_ptr ElementsOnSurfacePtr; - - - /* - FILTER - */ - class Filter{ - public: - Filter(); - virtual ~Filter(); - virtual void SetPredicate(PredicatePtr thePred); - - typedef std::vector TIdSequence; - - virtual - void - GetElementsId( const SMDS_Mesh* theMesh, - TIdSequence& theSequence ); - - static - void - GetElementsId( const SMDS_Mesh* theMesh, - PredicatePtr thePredicate, - TIdSequence& theSequence ); - - protected: - PredicatePtr myPredicate; - }; - }; -}; - - -#endif diff --git a/src/Driver/Driver_Document.cxx b/src/Driver/Driver_Document.cxx deleted file mode 100644 index 159c1a85a..000000000 --- a/src/Driver/Driver_Document.cxx +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "Driver_Document.h" - -Driver_Document::Driver_Document(): - myDocument(NULL) -{} - - -void Driver_Document::SetFile(const std::string& theFileName) -{ - myFile = theFileName; -} - - -void Driver_Document::SetDocument(SMESHDS_Document * theDocument) -{ - myDocument = theDocument; -} diff --git a/src/Driver/Driver_Document.h b/src/Driver/Driver_Document.h deleted file mode 100644 index 8d4ff5a68..000000000 --- a/src/Driver/Driver_Document.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVER_DOCUMENT -#define _INCLUDE_DRIVER_DOCUMENT - -#include - -class SMESHDS_Document; - -class Driver_Document -{ - public: - Driver_Document(); - virtual ~Driver_Document(){} - - virtual void Perform() = 0; - void SetFile(const std::string& theFileName); - void SetDocument(SMESHDS_Document *theDocument); - - protected: - SMESHDS_Document * myDocument; - std::string myFile; - -}; - - -#endif diff --git a/src/Driver/Driver_Mesh.cxx b/src/Driver/Driver_Mesh.cxx deleted file mode 100644 index f656bdd5d..000000000 --- a/src/Driver/Driver_Mesh.cxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH Driver : implementaion of driver for reading and writing -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : Mesh_Reader.cxx -// Module : SMESH - -#include "Driver_Mesh.h" - -using namespace std; - -Driver_Mesh::Driver_Mesh(): - myFile(""), - myMeshId(-1) -{} - - -void Driver_Mesh::SetMeshId(int theMeshId) -{ - myMeshId = theMeshId; -} - - -void Driver_Mesh::SetFile(const std::string& theFileName) -{ - myFile = theFileName; -} diff --git a/src/Driver/Driver_Mesh.h b/src/Driver/Driver_Mesh.h deleted file mode 100644 index 14ca22fd1..000000000 --- a/src/Driver/Driver_Mesh.h +++ /dev/null @@ -1,63 +0,0 @@ -// SMESH Driver : implementaion of driver for reading and writing -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : Mesh_Reader.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVER_MESH -#define _INCLUDE_DRIVER_MESH - -#include - -#if defined WNT && defined WIN32 && defined DRIVER_EXPORTS -#define DRIVER_WNT_EXPORT __declspec( dllexport ) -#else -#define DRIVER_WNT_EXPORT -#endif - -class DRIVER_WNT_EXPORT Driver_Mesh -{ - public: - Driver_Mesh(); - virtual ~Driver_Mesh(){} - - enum Status { - DRS_OK, - DRS_EMPTY, // a file contains no mesh with the given name - DRS_WARN_RENUMBER, // a file has overlapped ranges of element numbers, - // so the numbers from the file are ignored - DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data - DRS_FAIL // general failure (exception etc.) - }; - - virtual Status Perform() = 0; - void SetMeshId(int theMeshId); - void SetFile(const std::string& theFileName); - - protected: - std::string myFile; - int myMeshId; - -}; - -#endif diff --git a/src/Driver/Driver_SMDS_Mesh.cxx b/src/Driver/Driver_SMDS_Mesh.cxx deleted file mode 100644 index dae030df0..000000000 --- a/src/Driver/Driver_SMDS_Mesh.cxx +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "Driver_SMDS_Mesh.h" - -using namespace std; - -Driver_SMDS_Mesh::Driver_SMDS_Mesh(): - myMesh(NULL) -{} - -void Driver_SMDS_Mesh::SetMesh(SMDS_Mesh *theMesh) -{ - myMesh = theMesh; -} diff --git a/src/Driver/Driver_SMDS_Mesh.h b/src/Driver/Driver_SMDS_Mesh.h deleted file mode 100644 index 1ea37562d..000000000 --- a/src/Driver/Driver_SMDS_Mesh.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVER_SMDS_MESH -#define _INCLUDE_DRIVER_SMDS_MESH - -#include "Driver_Mesh.h" - -class SMDS_Mesh; - -class Driver_SMDS_Mesh: public Driver_Mesh -{ - public: - Driver_SMDS_Mesh(); - void SetMesh(SMDS_Mesh *theMesh); - - protected: - SMDS_Mesh *myMesh; - -}; - -#endif diff --git a/src/Driver/Driver_SMESHDS_Mesh.cxx b/src/Driver/Driver_SMESHDS_Mesh.cxx deleted file mode 100644 index 2bf88277d..000000000 --- a/src/Driver/Driver_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "Driver_SMESHDS_Mesh.h" - -using namespace std; - -Driver_SMESHDS_Mesh::Driver_SMESHDS_Mesh(): - myMesh(NULL) -{} - -void Driver_SMESHDS_Mesh::SetMesh(SMESHDS_Mesh *theMesh) -{ - myMesh = theMesh; -} diff --git a/src/Driver/Driver_SMESHDS_Mesh.h b/src/Driver/Driver_SMESHDS_Mesh.h deleted file mode 100644 index 30e059522..000000000 --- a/src/Driver/Driver_SMESHDS_Mesh.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVER_SMESHDS_MESH -#define _INCLUDE_DRIVER_SMESHDS_MESH - -#include "Driver_Mesh.h" - -class SMESHDS_Mesh; - -#if defined WNT && defined WIN32 && defined DRIVER_EXPORTS -#define DRIVER_WNT_EXPORT __declspec( dllexport ) -#else -#define DRIVER_WNT_EXPORT -#endif - -class DRIVER_WNT_EXPORT Driver_SMESHDS_Mesh: public Driver_Mesh -{ - public: - Driver_SMESHDS_Mesh(); - void SetMesh(SMESHDS_Mesh *theMesh); - - protected: - SMESHDS_Mesh *myMesh; - -}; - -#endif diff --git a/src/Driver/Makefile.in b/src/Driver/Makefile.in deleted file mode 100644 index d1c71416d..000000000 --- a/src/Driver/Makefile.in +++ /dev/null @@ -1,60 +0,0 @@ -# SMESH Driver : implementaion of driver for reading and writing -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Author : Marc Tajchman (CEA) -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - - -@COMMENCE@ - -# header files -EXPORT_HEADERS= Driver_Document.h Driver_Mesh.h \ - Driver_SMDS_Mesh.h Driver_SMESHDS_Mesh.h - -# Libraries targets -LIB = libMeshDriver.la -LIB_SRC = Driver_Document.cxx Driver_Mesh.cxx \ - Driver_SMDS_Mesh.cxx Driver_SMESHDS_Mesh.cxx - -LIB_CLIENT_IDL = - -LIB_SERVER_IDL = - -# additionnal information to compil and link file -CPPFLAGS += -CXXFLAGS += - -LDFLAGS += $(OCC_KERNEL_LIBS) -lTKTopAlgo -lSMESHDS -L${KERNEL_ROOT_DIR}/lib/salome -lOpUtil - - -@CONCLUDE@ - - - diff --git a/src/DriverDAT/DAT_Test.cxx b/src/DriverDAT/DAT_Test.cxx deleted file mode 100644 index a36b4dd10..000000000 --- a/src/DriverDAT/DAT_Test.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverDAT_R_SMDS_Mesh.h" -#include "DriverDAT_W_SMDS_Mesh.h" - -int main(int argc, char** argv) -{ - DriverDAT_R_SMDS_Mesh aR; - DriverDAT_W_SMDS_Mesh aW; - return 1; -} diff --git a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx deleted file mode 100644 index a49d7dbf3..000000000 --- a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include - -#include "DriverDAT_R_SMDS_Mesh.h" -#include "SMDS_Mesh.hxx" - -#include "utilities.h" - -using namespace std; - -Driver_Mesh::Status DriverDAT_R_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - int i, j; - int nbNodes, nbCells; - int intNumPoint; - float coordX, coordY, coordZ; - int nbNoeuds; - - int intNumMaille, Degre; - int ValElement; - int ValDegre; - int NoeudsMaille[20]; - int NoeudMaille; - - bool ok; - - MESSAGE("in DriverDAT_R_SMDS_Mesh::Read()"); - /**************************************************************************** - * OUVERTURE DU FICHIER EN LECTURE * - ****************************************************************************/ - char *file2Read = (char *)myFile.c_str(); - FILE* aFileId = fopen(file2Read, "r"); - if (aFileId < 0) { - fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read); - return DRS_FAIL; - } - - fscanf(aFileId, "%d %d\n", &nbNodes, &nbCells); - - /**************************************************************************** - * LECTURE DES NOEUDS * - ****************************************************************************/ - fprintf(stdout, "\n(************************)\n"); - fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n"); - fprintf(stdout, "(************************)\n"); - - for (i = 0; i < nbNodes; i++){ - fscanf(aFileId, "%d %e %e %e\n", &intNumPoint, &coordX, &coordY, &coordZ); - ok = myMesh->AddNodeWithID(coordX, coordY, coordZ, intNumPoint); - } - - fprintf(stdout, "%d noeuds\n", myMesh->NbNodes()); - /**************************************************************************** - * LECTURE DES ELEMENTS * - ****************************************************************************/ - fprintf(stdout, "\n(**************************)\n"); - fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n"); - fprintf(stdout, "(**************************)"); - - fprintf(stdout, "%d elements\n", nbCells); - - for (i = 0; i < nbCells; i++) { - fscanf(aFileId, "%d %d", &intNumMaille, &ValElement); - Degre = abs(ValElement / 100); - nbNoeuds = ValElement - (Degre * 100); - - // Recuperation des noeuds de la maille - for (j = 0; j < nbNoeuds; j++) { - fscanf(aFileId, "%d", &NoeudMaille); - NoeudsMaille[j] = NoeudMaille; - } - - // Analyse des cas de cellules - switch (ValElement) { - case 102: - case 103: - ValDegre = 3; - nbNoeuds = 2; - ok = myMesh->AddEdgeWithID(NoeudsMaille[0], NoeudsMaille[1], - intNumMaille); - break; - case 204: - case 208: - ValDegre = 9; - nbNoeuds = 4; - ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - intNumMaille); - break; - case 203: - case 206: - ValDegre = 5; - nbNoeuds = 3; - ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], intNumMaille); - break; - case 308: - case 320: - ValDegre = 12; - nbNoeuds = 8; - if (ValElement == 320){ - //A voir, correspondance VTK - NoeudsMaille[4] = NoeudsMaille[8]; - NoeudsMaille[5] = NoeudsMaille[9]; - NoeudsMaille[6] = NoeudsMaille[10]; - NoeudsMaille[7] = NoeudsMaille[11]; - } - ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - NoeudsMaille[4], NoeudsMaille[5], - NoeudsMaille[6], NoeudsMaille[7], - intNumMaille); - break; - case 304: - case 310: - ValDegre = 10; - nbNoeuds = 4; - if (ValElement == 310) - NoeudsMaille[3] = NoeudsMaille[6]; - ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - intNumMaille); - break; - case 306: - case 315: - ValDegre = 12; - nbNoeuds = 8; - if (ValElement == 315) { - NoeudsMaille[3] = NoeudsMaille[6]; - NoeudsMaille[4] = NoeudsMaille[7]; - NoeudsMaille[5] = NoeudsMaille[8]; - } - NoeudsMaille[7] = NoeudsMaille[5]; - NoeudsMaille[6] = NoeudsMaille[5]; - NoeudsMaille[5] = NoeudsMaille[4]; - NoeudsMaille[4] = NoeudsMaille[3]; - NoeudsMaille[3] = NoeudsMaille[2]; - ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1], - NoeudsMaille[2], NoeudsMaille[3], - NoeudsMaille[4], NoeudsMaille[5], - intNumMaille); - break; - } - } - /**************************************************************************** - * FERMETURE DU FICHIER * - ****************************************************************************/ - fclose(aFileId); - return aResult; -} diff --git a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.h b/src/DriverDAT/DriverDAT_R_SMDS_Mesh.h deleted file mode 100644 index d955cf7b7..000000000 --- a/src/DriverDAT/DriverDAT_R_SMDS_Mesh.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERDAT_R_SMDS_MESH -#define _INCLUDE_DRIVERDAT_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverDAT_R_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - virtual Status Perform(); -}; - -#endif diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx b/src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx deleted file mode 100644 index c7d9b2230..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverDAT_R_SMESHDS_Document.h" diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.h b/src/DriverDAT/DriverDAT_R_SMESHDS_Document.h deleted file mode 100644 index 3d63ced6a..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERDAT_R_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERDAT_R_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverDAT_R_SMESHDS_Document : public Driver_Document -{}; - -#endif diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx b/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx deleted file mode 100644 index a7e974f52..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverDAT_R_SMESHDS_Mesh.h" diff --git a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h b/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h deleted file mode 100644 index e74967581..000000000 --- a/src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERDAT_R_SMESHDS_MESH -#define _INCLUDE_DRIVERDAT_R_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" - -class DriverDAT_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{}; - -#endif diff --git a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx deleted file mode 100644 index 1f8d5ab61..000000000 --- a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include - -#include "DriverDAT_W_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" - -#include "utilities.h" - -using namespace std; - -Driver_Mesh::Status DriverDAT_W_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - int nbNodes, nbCells; - int i; - - char *file2Read = (char *)myFile.c_str(); - FILE* aFileId = fopen(file2Read, "w+"); - if (aFileId < 0) { - fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read); - return DRS_FAIL; - } - SCRUTE(myMesh); - /**************************************************************************** - * NOMBRES D'OBJETS * - ****************************************************************************/ - fprintf(stdout, "\n(****************************)\n"); - fprintf(stdout, "(* INFORMATIONS GENERALES : *)\n"); - fprintf(stdout, "(****************************)\n"); - - /* Combien de noeuds ? */ - nbNodes = myMesh->NbNodes(); - - /* Combien de mailles, faces ou aretes ? */ - int nb_of_nodes, nb_of_edges, nb_of_faces, nb_of_volumes; - nb_of_edges = myMesh->NbEdges(); - nb_of_faces = myMesh->NbFaces(); - nb_of_volumes = myMesh->NbVolumes(); - nbCells = nb_of_edges + nb_of_faces + nb_of_volumes; - SCRUTE(nb_of_edges); - SCRUTE(nb_of_faces); - SCRUTE(nb_of_volumes); - - fprintf(stdout, "%d %d\n", nbNodes, nbCells); - fprintf(aFileId, "%d %d\n", nbNodes, nbCells); - - /**************************************************************************** - * ECRITURE DES NOEUDS * - ****************************************************************************/ - fprintf(stdout, "\n(************************)\n"); - fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n"); - fprintf(stdout, "(************************)\n"); - - SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator(); - while(itNodes->more()){ - const SMDS_MeshNode * node = itNodes->next(); - fprintf(aFileId, "%d %e %e %e\n", node->GetID(), node->X(), node->Y(), node->Z()); - } - - /**************************************************************************** - * ECRITURE DES ELEMENTS * - ****************************************************************************/ - fprintf(stdout, "\n(**************************)\n"); - fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n"); - fprintf(stdout, "(**************************)"); - /* Ecriture des connectivites, noms, numeros des mailles */ - - SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator(); - while(itEdges->more()){ - const SMDS_MeshElement * elem = itEdges->next(); - switch (elem->NbNodes()) { - case 2: - fprintf(aFileId, "%d %d ", elem->GetID(), 102); - break; - case 3: - fprintf(aFileId, "%d %d ", elem->GetID(), 103); - break; - } - SMDS_ElemIteratorPtr it=elem->nodesIterator(); - while(it->more()) - fprintf(aFileId, "%d ", it->next()->GetID()); - fprintf(aFileId, "\n"); - } - - SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator(); - while(itFaces->more()){ - const SMDS_MeshElement * elem = itFaces->next(); - switch (elem->NbNodes()) { - case 3: - fprintf(aFileId, "%d %d ", elem->GetID(), 203); - break; - case 4: - fprintf(aFileId, "%d %d ", elem->GetID(), 204); - break; - case 6: - fprintf(aFileId, "%d %d ", elem->GetID(), 206); - break; - } - SMDS_ElemIteratorPtr it=elem->nodesIterator(); - while(it->more()) - fprintf(aFileId, "%d ", it->next()->GetID()); - fprintf(aFileId, "\n"); - } - - SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator(); - while(itVolumes->more()){ - const SMDS_MeshElement * elem = itVolumes->next(); - switch (elem->NbNodes()) { - case 8: - fprintf(aFileId, "%d %d ", elem->GetID(), 308); - break; - } - - SMDS_ElemIteratorPtr it=elem->nodesIterator(); - while(it->more()) - fprintf(aFileId, "%d ", it->next()->GetID()); - - fprintf(aFileId, "\n"); - } - - fclose(aFileId); - - return aResult; -} diff --git a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.h b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.h deleted file mode 100644 index ebd3d642e..000000000 --- a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.h +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH DriverDAT : driver to read and write 'dat' files -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverDAT_W_SMDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERDAT_W_SMDS_MESH -#define _INCLUDE_DRIVERDAT_W_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverDAT_W_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - virtual Status Perform(); -}; - -#endif diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx b/src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx deleted file mode 100644 index 1cd9699af..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverDAT_W_SMESHDS_Document.h" diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.h b/src/DriverDAT/DriverDAT_W_SMESHDS_Document.h deleted file mode 100644 index 6b2bad5a0..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERDAT_W_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERDAT_W_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverDAT_W_SMESHDS_Document: public Driver_Document -{}; - -#endif diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx deleted file mode 100644 index e17c6cdd2..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverDAT_W_SMESHDS_Mesh.h" diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h b/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h deleted file mode 100644 index b9b9130c2..000000000 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h +++ /dev/null @@ -1,35 +0,0 @@ -// SMESH DriverDAT : driver to read and write 'dat' files -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverDAT_W_SMESHDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERDAT_W_SMESHDS_MESH -#define _INCLUDE_DRIVERDAT_W_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" - -class DriverDAT_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{}; - -#endif diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx deleted file mode 100644 index 47a923dbd..000000000 --- a/src/DriverMED/DriverMED_Family.cxx +++ /dev/null @@ -1,390 +0,0 @@ -// SMESH DriverMED : tool to split groups on families -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverMED_Family.cxx -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -#include "DriverMED_Family.h" -#include "MED_Factory.hxx" - -#include - -using namespace std; - -//============================================================================= -/*! - * Split each group from list on some parts (families) - * on the basis of the elements membership in other groups from this list. - * Resulting families have no common elements. - */ -//============================================================================= -list DriverMED_Family::MakeFamilies - (const map & theSubMeshes, - const list& theGroups, - const bool doGroupOfNodes, - const bool doGroupOfEdges, - const bool doGroupOfFaces, - const bool doGroupOfVolumes) -{ - list aFamilies; - - string anAllNodesGroupName = "Group_Of_All_Nodes"; - string anAllEdgesGroupName = "Group_Of_All_Edges"; - string anAllFacesGroupName = "Group_Of_All_Faces"; - string anAllVolumesGroupName = "Group_Of_All_Volumes"; - - // Reserve four ids for families of free elements - // (1 - nodes, -1 - edges, -2 - faces, -3 - volumes). - // 'Free' means here not belonging to any group. - int aNodeFamId = FIRST_NODE_FAMILY; - int aElemFamId = FIRST_ELEM_FAMILY; - - // Process sub-meshes - map::const_iterator aSMIter = theSubMeshes.begin(); - for (; aSMIter != theSubMeshes.end(); aSMIter++) - { - if ( aSMIter->second->IsComplexSubmesh() ) - continue; // submesh containing other submeshs - list aSMFams = SplitByType((*aSMIter).second, (*aSMIter).first); - list::iterator aSMFamsIter = aSMFams.begin(); - for (; aSMFamsIter != aSMFams.end(); aSMFamsIter++) - { - DriverMED_FamilyPtr aFam2 = (*aSMFamsIter); - - list::iterator aFamsIter = aFamilies.begin(); - while (aFamsIter != aFamilies.end()) - { - DriverMED_FamilyPtr aFam1 = *aFamsIter; - list::iterator aCurrIter = aFamsIter++; - if (aFam1->myType == aFam2->myType) - { - DriverMED_FamilyPtr aCommon (new DriverMED_Family); - aFam1->Split(aFam2, aCommon); - if (!aCommon->IsEmpty()) - { - aFamilies.push_back(aCommon); - } - if (aFam1->IsEmpty()) - { - aFamilies.erase(aCurrIter); - } - if (aFam2->IsEmpty()) break; - } - } - // The rest elements of family - if (!aFam2->IsEmpty()) - { - aFamilies.push_back(aFam2); - } - } - } - - // Process groups - list::const_iterator aGroupsIter = theGroups.begin(); - for (; aGroupsIter != theGroups.end(); aGroupsIter++) - { - DriverMED_FamilyPtr aFam2 (new DriverMED_Family); - aFam2->Init(*aGroupsIter); - - list::iterator aFamsIter = aFamilies.begin(); - while (aFamsIter != aFamilies.end()) - { - DriverMED_FamilyPtr aFam1 = *aFamsIter; - list::iterator aCurrIter = aFamsIter++; - if (aFam1->myType == aFam2->myType) - { - DriverMED_FamilyPtr aCommon (new DriverMED_Family); - aFam1->Split(aFam2, aCommon); - if (!aCommon->IsEmpty()) - { - aFamilies.push_back(aCommon); - } - if (aFam1->IsEmpty()) - { - aFamilies.erase(aCurrIter); - } - if (aFam2->IsEmpty()) break; - } - } - // The rest elements of group - if (!aFam2->IsEmpty()) - { - aFamilies.push_back(aFam2); - } - } - - list::iterator aFamsIter = aFamilies.begin(); - for (; aFamsIter != aFamilies.end(); aFamsIter++) - { - DriverMED_FamilyPtr aFam = *aFamsIter; - if (aFam->myType == SMDSAbs_Node) { - aFam->SetId(aNodeFamId++); - if (doGroupOfNodes) aFam->myGroupNames.insert(anAllNodesGroupName); - } - else { - aFam->SetId(aElemFamId--); - if (aFam->myType == SMDSAbs_Edge) { - if (doGroupOfEdges) aFam->myGroupNames.insert(anAllEdgesGroupName); - } - else if (aFam->myType == SMDSAbs_Face) { - if (doGroupOfFaces) aFam->myGroupNames.insert(anAllFacesGroupName); - } - else if (aFam->myType == SMDSAbs_Volume) { - if (doGroupOfVolumes) aFam->myGroupNames.insert(anAllVolumesGroupName); - } - } - } - - // Create families for elements, not belonging to any group - if (doGroupOfNodes) - { - DriverMED_FamilyPtr aFreeNodesFam (new DriverMED_Family); - aFreeNodesFam->SetId(REST_NODES_FAMILY); - aFreeNodesFam->myType = SMDSAbs_Node; - aFreeNodesFam->myGroupNames.insert(anAllNodesGroupName); - aFamilies.push_back(aFreeNodesFam); - } - - if (doGroupOfEdges) - { - DriverMED_FamilyPtr aFreeEdgesFam (new DriverMED_Family); - aFreeEdgesFam->SetId(REST_EDGES_FAMILY); - aFreeEdgesFam->myType = SMDSAbs_Edge; - aFreeEdgesFam->myGroupNames.insert(anAllEdgesGroupName); - aFamilies.push_back(aFreeEdgesFam); - } - - if (doGroupOfFaces) - { - DriverMED_FamilyPtr aFreeFacesFam (new DriverMED_Family); - aFreeFacesFam->SetId(REST_FACES_FAMILY); - aFreeFacesFam->myType = SMDSAbs_Face; - aFreeFacesFam->myGroupNames.insert(anAllFacesGroupName); - aFamilies.push_back(aFreeFacesFam); - } - - if (doGroupOfVolumes) - { - DriverMED_FamilyPtr aFreeVolumesFam (new DriverMED_Family); - aFreeVolumesFam->SetId(REST_VOLUMES_FAMILY); - aFreeVolumesFam->myType = SMDSAbs_Volume; - aFreeVolumesFam->myGroupNames.insert(anAllVolumesGroupName); - aFamilies.push_back(aFreeVolumesFam); - } - - DriverMED_FamilyPtr aNullFam (new DriverMED_Family); - aNullFam->SetId(0); - aNullFam->myType = SMDSAbs_All; - aFamilies.push_back(aNullFam); - - return aFamilies; -} - -//============================================================================= -/*! - * Create TFamilyInfo for this family - */ -//============================================================================= -MED::PFamilyInfo -DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, - const MED::PMeshInfo& theMeshInfo) const -{ - string aValue; - - ostringstream aStr; - - aStr << "FAM_" << myId; - set::const_iterator aGrIter = myGroupNames.begin(); - for (; aGrIter != myGroupNames.end(); aGrIter++) - { - aStr << "_" << *aGrIter; - } - - aValue = aStr.str(); - /* - MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description, - MED::TIntVector anAttrIds (1, myId); // Id=0, - MED::TIntVector anAttrVals (1, myId); // Value=0 - */ - - MED::PFamilyInfo anInfo = theWrapper->CrFamilyInfo(theMeshInfo, - aValue, - myId, - myGroupNames); -/* - anAttrDescs, - anAttrIds, - anAttrVals); -*/ - -// cout << endl; -// cout << "Groups: "; -// set::iterator aGrIter = myGroupNames.begin(); -// for (; aGrIter != myGroupNames.end(); aGrIter++) -// { -// cout << " " << *aGrIter; -// } -// cout << endl; -// -// cout << "Elements: "; -// set::iterator anIter = myElements.begin(); -// for (; anIter != myElements.end(); anIter++) -// { -// cout << " " << (*anIter)->GetID(); -// } -// cout << endl; - - return anInfo; -} - -//============================================================================= -/*! - * Initialize the tool by SMESHDS_GroupBase - */ -//============================================================================= -void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup) -{ - // Elements - myElements.clear(); - SMDS_ElemIteratorPtr elemIt = theGroup->GetElements(); - while (elemIt->more()) - { - myElements.insert(elemIt->next()); - } - - // Type - myType = theGroup->GetType(); - - // Groups list - myGroupNames.clear(); - myGroupNames.insert(string(theGroup->GetStoreName())); -} - -//============================================================================= -/*! - * Split on some parts (families) - * on the basis of the elements type. - */ -//============================================================================= -list DriverMED_Family::SplitByType (SMESHDS_SubMesh* theSubMesh, - const int theId) -{ - list aFamilies; - DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family); - DriverMED_FamilyPtr anEdgesFamily (new DriverMED_Family); - DriverMED_FamilyPtr aFacesFamily (new DriverMED_Family); - DriverMED_FamilyPtr aVolumesFamily (new DriverMED_Family); - - char submeshGrpName[ 30 ]; - sprintf( submeshGrpName, "SubMesh %d", theId ); - - SMDS_NodeIteratorPtr aNodesIter = theSubMesh->GetNodes(); - while (aNodesIter->more()) - { - const SMDS_MeshNode* aNode = aNodesIter->next(); - aNodesFamily->AddElement(aNode); - } - - SMDS_ElemIteratorPtr anElemsIter = theSubMesh->GetElements(); - while (anElemsIter->more()) - { - const SMDS_MeshElement* anElem = anElemsIter->next(); - switch (anElem->GetType()) - { - case SMDSAbs_Edge: - anEdgesFamily->AddElement(anElem); - break; - case SMDSAbs_Face: - aFacesFamily->AddElement(anElem); - break; - case SMDSAbs_Volume: - aVolumesFamily->AddElement(anElem); - break; - default: - break; - } - } - - if (!aNodesFamily->IsEmpty()) { - aNodesFamily->SetType(SMDSAbs_Node); - aNodesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(aNodesFamily); - } - if (!anEdgesFamily->IsEmpty()) { - anEdgesFamily->SetType(SMDSAbs_Edge); - anEdgesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(anEdgesFamily); - } - if (!aFacesFamily->IsEmpty()) { - aFacesFamily->SetType(SMDSAbs_Face); - aFacesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(aFacesFamily); - } - if (!aVolumesFamily->IsEmpty()) { - aVolumesFamily->SetType(SMDSAbs_Volume); - aVolumesFamily->AddGroupName(submeshGrpName); - aFamilies.push_back(aVolumesFamily); - } - - return aFamilies; -} - -//============================================================================= -/*! - * Remove from elements, common with , - * Remove from elements, common with , - * Create family from common elements, with combined groups list. - */ -//============================================================================= -void DriverMED_Family::Split (DriverMED_FamilyPtr by, - DriverMED_FamilyPtr common) -{ - // Elements - set::iterator anIter = by->myElements.begin(); - while ( anIter != by->myElements.end()) - { - if (myElements.find(*anIter) != myElements.end()) - { - common->myElements.insert(*anIter); - myElements.erase(*anIter); - by->myElements.erase(anIter++); - } - else - anIter++; - } - - if (!common->IsEmpty()) - { - // Groups list - common->myGroupNames = myGroupNames; - set::iterator aGrNamesIter = by->myGroupNames.begin(); - for (; aGrNamesIter != by->myGroupNames.end(); aGrNamesIter++) - { - common->myGroupNames.insert(*aGrNamesIter); - } - - // Type - common->myType = myType; - } -} diff --git a/src/DriverMED/DriverMED_Family.h b/src/DriverMED/DriverMED_Family.h deleted file mode 100644 index 1632ccb3b..000000000 --- a/src/DriverMED/DriverMED_Family.h +++ /dev/null @@ -1,120 +0,0 @@ -// SMESH DriverMED : tool to split groups on families -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverMED_Family.hxx -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -#ifndef _INCLUDE_DRIVERMED_FAMILY -#define _INCLUDE_DRIVERMED_FAMILY - -#include "SMDS_Mesh.hxx" -#include "SMESHDS_GroupBase.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "MED_Common.hxx" - -#include -#include - -#define REST_NODES_FAMILY 1 -#define REST_EDGES_FAMILY -1 -#define REST_FACES_FAMILY -2 -#define REST_VOLUMES_FAMILY -3 -#define FIRST_NODE_FAMILY 2 -#define FIRST_ELEM_FAMILY -4 - -class DriverMED_Family; -typedef boost::shared_ptr DriverMED_FamilyPtr; - -class DriverMED_Family -{ - public: - - // Methods for groups storing to MED - - static std::list MakeFamilies (const std::map & theSubMeshes, - const std::list& theGroups, - const bool doGroupOfNodes, - const bool doGroupOfEdges, - const bool doGroupOfFaces, - const bool doGroupOfVolumes); - // Split each group from list and each sub-mesh from list - // on some parts (families) on the basis of the elements membership in other groups - // from and other sub-meshes from . - // Resulting families have no common elements. - - MED::PFamilyInfo GetFamilyInfo (const MED::PWrapper& theWrapper, - const MED::PMeshInfo& theMeshInfo) const; - // Create TFamilyInfo for this family - - const std::set& GetElements () const { return myElements; } - // Returns elements of this family - - int GetId () const { return myId; } - // Returns a family ID - - public: - - // Methods for groups reading from MED - - void AddElement (const SMDS_MeshElement* theElement) { myElements.insert(theElement); } - - void AddGroupName (std::string theGroupName) { myGroupNames.insert(theGroupName); } - - void SetType (const SMDSAbs_ElementType theType) { myType = theType; } - SMDSAbs_ElementType GetType () { return myType; } - - bool MemberOf (std::string theGroupName) const - { return (myGroupNames.find(theGroupName) != myGroupNames.end()); } - - const MED::TStringSet& GetGroupNames () const { return myGroupNames; } - - void SetId (const int theId) { myId = theId; } - // Sets a family ID - - private: - void Init (SMESHDS_GroupBase* group); - // Initialize the tool by SMESHDS_GroupBase - - static std::list SplitByType (SMESHDS_SubMesh* theSubMesh, - const int theId); - // Split on some parts (families) - // on the basis of the elements type. - - void Split (DriverMED_FamilyPtr by, - DriverMED_FamilyPtr common); - // Remove from elements, common with , - // Remove from elements, common with , - // Create family from common elements, with combined groups list. - - bool IsEmpty () const { return myElements.empty(); } - // Check, if this family has empty list of elements - - private: - int myId; - SMDSAbs_ElementType myType; - std::set myElements; - MED::TStringSet myGroupNames; -}; - -#endif diff --git a/src/DriverMED/DriverMED_R_SMDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMDS_Mesh.cxx deleted file mode 100644 index cac48ff45..000000000 --- a/src/DriverMED/DriverMED_R_SMDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverMED_R_SMDS_Mesh.h" diff --git a/src/DriverMED/DriverMED_R_SMDS_Mesh.h b/src/DriverMED/DriverMED_R_SMDS_Mesh.h deleted file mode 100644 index a6ece3039..000000000 --- a/src/DriverMED/DriverMED_R_SMDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERMED_R_SMDS_MESH -#define _INCLUDE_DRIVERMED_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverMED_R_SMDS_Mesh: public Driver_SMDS_Mesh -{}; - -#endif diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Document.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Document.cxx deleted file mode 100644 index 9527382ad..000000000 --- a/src/DriverMED/DriverMED_R_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverMED_R_SMESHDS_Document.h" diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Document.h b/src/DriverMED/DriverMED_R_SMESHDS_Document.h deleted file mode 100644 index c933e0c4a..000000000 --- a/src/DriverMED/DriverMED_R_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERMED_R_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERMED_R_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverMED_R_SMESHDS_Document : public Driver_Document -{}; - -#endif diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h deleted file mode 100644 index cb72bccdf..000000000 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h +++ /dev/null @@ -1,69 +0,0 @@ -// SMESH DriverMED : driver to read and write 'med' files -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverMED_R_SMESHDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERMED_R_SMESHDS_MESH -#define _INCLUDE_DRIVERMED_R_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" -#include "DriverMED_Family.h" - -#include - -class SMESHDS_Mesh; -class SMESHDS_Group; -class SMESHDS_SubMesh; - -typedef std::pair< std::string, SMDSAbs_ElementType > TNameAndType; - -class DriverMED_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{ - public: - virtual Status Perform(); - - std::list< TNameAndType > GetGroupNamesAndTypes(); - void GetGroup(SMESHDS_Group* theGroup); - void CreateAllSubMeshes(); - void GetSubMesh(SMESHDS_SubMesh* theSubMesh, const int theId); - - std::list GetMeshNames(Status& theStatus); - void SetMeshName(std::string theMeshName); - - private: - /*! - * \brief Ensure aFamily has required ID - * \param aFamily - a family to check - * \param anID - an ID aFamily should have - * \retval bool - true if successful - */ - bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const; - - private: - std::string myMeshName; - std::map myFamilies; - -}; - -#endif diff --git a/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx deleted file mode 100644 index d48e08547..000000000 --- a/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverMED_W_SMDS_Mesh.h" diff --git a/src/DriverMED/DriverMED_W_SMDS_Mesh.h b/src/DriverMED/DriverMED_W_SMDS_Mesh.h deleted file mode 100644 index 2151ae672..000000000 --- a/src/DriverMED/DriverMED_W_SMDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERMED_W_SMDS_MESH -#define _INCLUDE_DRIVERMED_W_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class DriverMED_W_SMDS_Mesh: public Driver_SMDS_Mesh -{}; - -#endif diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Document.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Document.cxx deleted file mode 100644 index d0537c23a..000000000 --- a/src/DriverMED/DriverMED_W_SMESHDS_Document.cxx +++ /dev/null @@ -1,27 +0,0 @@ -// SMESH DriverMED : driver to read and write 'med' files -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverMED_W_SMESHDS_Document.cxx -// Module : SMESH - -#include "DriverMED_W_SMESHDS_Document.h" diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Document.h b/src/DriverMED/DriverMED_W_SMESHDS_Document.h deleted file mode 100644 index 2f0cce3bc..000000000 --- a/src/DriverMED/DriverMED_W_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERMED_W_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERMED_W_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverMED_W_SMESHDS_Document : public Driver_Document -{}; - -#endif diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h deleted file mode 100644 index 1cc864944..000000000 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.h +++ /dev/null @@ -1,83 +0,0 @@ -// SMESH DriverMED : driver to read and write 'med' files -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverMED_W_SMESHDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERMED_W_SMESHDS_MESH -#define _INCLUDE_DRIVERMED_W_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" -#include "MED_Factory.hxx" - -#include -#include -#include - -class SMESHDS_Mesh; -class SMESHDS_GroupBase; -class SMESHDS_SubMesh; - -class DriverMED_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{ - public: - - DriverMED_W_SMESHDS_Mesh(); - - virtual void SetFile(const std::string& theFileName); - void SetFile(const std::string& theFileName, MED::EVersion theId); - - /*! sets file name; only for usage with Add(), not Write() - */ - void AddGroupOfNodes(); - void AddGroupOfEdges(); - void AddGroupOfFaces(); - void AddGroupOfVolumes(); - - /*! functions to prepare adding one mesh - */ - void SetMeshName(const std::string& theMeshName); - void AddGroup(SMESHDS_GroupBase * theGroup); - void AddAllSubMeshes(); - void AddSubMesh(SMESHDS_SubMesh* theSubMesh, int theID); - - /*! add one mesh - */ - virtual Status Perform(); - - private: - - MED::PWrapper myMed; - std::string myMeshName; - std::list myGroups; - bool myAllSubMeshes; - std::map mySubMeshes; - bool myDoGroupOfNodes; - bool myDoGroupOfEdges; - bool myDoGroupOfFaces; - bool myDoGroupOfVolumes; -}; - - -#endif - diff --git a/src/DriverMED/MED_Test.cxx b/src/DriverMED/MED_Test.cxx deleted file mode 100644 index 7d6c3cd21..000000000 --- a/src/DriverMED/MED_Test.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverMED_R_SMESHDS_Mesh.h" -#include "DriverMED_W_SMESHDS_Mesh.h" - -int main(int argc, char** argv) -{ - DriverMED_R_SMESHDS_Mesh aR; - DriverMED_W_SMESHDS_Mesh aW; - return 1; -} diff --git a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx b/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx deleted file mode 100644 index 2064453af..000000000 --- a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include -#include -//======================================================================= -//function : HashCode -//purpose : -//======================================================================= -inline Standard_Integer HashCode - (const gp_Pnt& point, Standard_Integer Upper) -{ - union - { - Standard_Real R[3]; - Standard_Integer I[6]; - } U; - - point.Coord(U.R[0],U.R[1],U.R[2]); - - return ::HashCode(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7,Upper); -} -static Standard_Real tab1[3]; -static Standard_Real tab2[3]; -//======================================================================= -//function : IsEqual -//purpose : -//======================================================================= -inline Standard_Boolean IsEqual - (const gp_Pnt& point1, const gp_Pnt& point2) -{ - point1.Coord(tab1[0],tab1[1],tab1[2]); - point2.Coord(tab2[0],tab2[1],tab2[2]); - return (memcmp(tab1,tab2,sizeof(tab1)) == 0); -} -#include "DriverSTL_R_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" - -#include -#include -#include -#include -#include -#include - -#include "utilities.h" - -static const int HEADER_SIZE = 84; -static const int SIZEOF_STL_FACET = 50; -//static const int STL_MIN_FILE_SIZE = 284; -static const int ASCII_LINES_PER_FACET = 7; - - -//typedef NCollection_BaseCollection DriverSTL_ColOfNodePtr; - - -#include -typedef NCollection_DataMap DriverSTL_DataMapOfPntNodePtr; -//======================================================================= -//function : DriverSTL_R_SMDS_Mesh -//purpose : -//======================================================================= - -DriverSTL_R_SMDS_Mesh::DriverSTL_R_SMDS_Mesh() -{ - myIsCreateFaces = true; - myIsAscii = Standard_True; -} - -//======================================================================= -//function : SetIsCreateFaces -//purpose : -//======================================================================= - -void DriverSTL_R_SMDS_Mesh::SetIsCreateFaces( const bool theIsCreate ) -{ myIsCreateFaces = theIsCreate; } - -//======================================================================= -//function : Perform -//purpose : -//======================================================================= - -Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - if ( aFileName.IsEmpty() ) { - fprintf(stderr, ">> ERREOR : invalid file name \n"); - return DRS_FAIL; - } - - filebuf fic; - Standard_IStream is(&fic); - if (!fic.open(aFileName.ToCString(),ios::in)) { - fprintf(stderr, ">> ERROR : cannot open file %s \n", aFileName.ToCString()); - return DRS_FAIL; - } - - - OSD_Path aPath( aFileName ); - OSD_File file = OSD_File( aPath ); - file.Open(OSD_ReadOnly,OSD_Protection(OSD_RWD,OSD_RWD,OSD_RWD,OSD_RWD)); - unsigned char str[128]; - Standard_Integer lread,i; - Standard_Address ach; - ach = (Standard_Address)str; - // we skip the header which is in Ascii for both modes - file.Read(ach,HEADER_SIZE,lread); - - // we read 128 characters to detect if we have a non-ascii char - file.Read(ach,sizeof(str),lread); - - myIsAscii = Standard_True; - for (i = 0; i < lread; ++i) { - if (str[i] > '~') { - myIsAscii = Standard_False; - break; - } - } - - file.Close(); - - if ( !myMesh ) { - fprintf(stderr, ">> ERREOR : cannot create mesh \n"); - return DRS_FAIL; - } - - if ( myIsAscii ) - aResult = readAscii(); - else - aResult = readBinary(); - - return aResult; -} - -// static methods - -static Standard_Real readFloat(OSD_File& theFile) -{ - union { - Standard_Boolean i; - Standard_ShortReal f; - }u; - - char c[4]; - Standard_Address adr; - adr = (Standard_Address)c; - Standard_Integer lread; - theFile.Read(adr,4,lread); - u.i = c[0] & 0xFF; - u.i |= (c[1] & 0xFF) << 0x08; - u.i |= (c[2] & 0xFF) << 0x10; - u.i |= (c[3] & 0xFF) << 0x18; - - return u.f; -} - -static SMDS_MeshNode* addNode(const gp_Pnt& P, - DriverSTL_DataMapOfPntNodePtr& uniqnodes, - SMDS_Mesh* theMesh) -{ - SMDS_MeshNode* node = 0; - if ( uniqnodes.IsBound(P) ) { - node = uniqnodes.Find(P); - } else { - node = theMesh->AddNode(P.X(), P.Y(), P.Z() ); - uniqnodes.Bind(P,node); - } - - return node; -} - -static SMDS_MeshNode* readNode(FILE* file, - DriverSTL_DataMapOfPntNodePtr& uniqnodes, - SMDS_Mesh* theMesh) -{ - Standard_ShortReal coord[3]; - // reading vertex - fscanf(file,"%*s %f %f %f\n",&coord[0],&coord[1],&coord[2]); - - gp_Pnt P(coord[0],coord[1],coord[2]); - return addNode( P, uniqnodes, theMesh ); -} - -static SMDS_MeshNode* readNode(OSD_File& theFile, - DriverSTL_DataMapOfPntNodePtr& uniqnodes, - SMDS_Mesh* theMesh) -{ - Standard_ShortReal coord[3]; - coord[0] = readFloat(theFile); - coord[1] = readFloat(theFile); - coord[2] = readFloat(theFile); - - gp_Pnt P(coord[0],coord[1],coord[2]); - return addNode( P, uniqnodes, theMesh ); -} - -//======================================================================= -//function : readAscii -//purpose : -//======================================================================= - -Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::readAscii() const -{ - Status aResult = DRS_OK; - long ipos; - Standard_Integer nbLines = 0; - - // Open the file - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - FILE* file = fopen(aFileName.ToCString(),"r"); - fseek(file,0L,SEEK_END); - // get the file size - long filesize = ftell(file); - fclose(file); - file = fopen(aFileName.ToCString(),"r"); - - // count the number of lines - for (ipos = 0; ipos < filesize; ++ipos) { - if (getc(file) == '\n') - nbLines++; - } - - // go back to the beginning of the file -// fclose(file); -// file = fopen(aFileName.ToCString(),"r"); - rewind(file); - - Standard_Integer nbTri = (nbLines / ASCII_LINES_PER_FACET); - - DriverSTL_DataMapOfPntNodePtr uniqnodes; - // skip header - while (getc(file) != '\n'); - - // main reading - for (Standard_Integer iTri = 0; iTri < nbTri; ++iTri) { - - // skipping the facet normal - Standard_ShortReal normal[3]; - fscanf(file,"%*s %*s %f %f %f\n",&normal[0],&normal[1],&normal[2]); - - // skip the keywords "outer loop" - fscanf(file,"%*s %*s"); - - // reading nodes - SMDS_MeshNode* node1 = readNode( file, uniqnodes, myMesh ); - SMDS_MeshNode* node2 = readNode( file, uniqnodes, myMesh ); - SMDS_MeshNode* node3 = readNode( file, uniqnodes, myMesh ); - - if (myIsCreateFaces) - myMesh->AddFace(node1,node2,node3); - - // skip the keywords "endloop" - fscanf(file,"%*s"); - - // skip the keywords "endfacet" - fscanf(file,"%*s"); - } - - fclose(file); - return aResult; -} - -//======================================================================= -//function : readBinary -//purpose : -//======================================================================= - -Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::readBinary() const -{ - Status aResult = DRS_OK; - - char buftest[5]; - Standard_Address adr; - adr = (Standard_Address)buftest; - - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - OSD_File aFile = OSD_File(OSD_Path( aFileName )); - aFile.Open(OSD_ReadOnly,OSD_Protection(OSD_RWD,OSD_RWD,OSD_RWD,OSD_RWD)); - - // the size of the file (minus the header size) - // must be a multiple of SIZEOF_STL_FACET - - // compute file size - Standard_Integer filesize = aFile.Size(); - - if ( (filesize - HEADER_SIZE) % SIZEOF_STL_FACET !=0 - // Commented to allow reading small files (ex: 1 face) - /*|| (filesize < STL_MIN_FILE_SIZE)*/) { - Standard_NoMoreObject::Raise("DriverSTL_R_SMDS_MESH::readBinary (wrong file size)"); - } - - // don't trust the number of triangles which is coded in the file - // sometimes it is wrong, and with this technique we don't need to swap endians for integer - Standard_Integer nbTri = ((filesize - HEADER_SIZE) / SIZEOF_STL_FACET); - - // skip the header - aFile.Seek(HEADER_SIZE,OSD_FromBeginning); - - DriverSTL_DataMapOfPntNodePtr uniqnodes; - Standard_Integer lread; - - for (Standard_Integer iTri = 0; iTri < nbTri; ++iTri) { - - // ignore normals - readFloat(aFile); - readFloat(aFile); - readFloat(aFile); - - // read vertices - SMDS_MeshNode* node1 = readNode( aFile, uniqnodes, myMesh ); - SMDS_MeshNode* node2 = readNode( aFile, uniqnodes, myMesh ); - SMDS_MeshNode* node3 = readNode( aFile, uniqnodes, myMesh ); - - if (myIsCreateFaces) - myMesh->AddFace(node1,node2,node3); - - // skip extra bytes - aFile.Read(adr,2,lread); - } - aFile.Close(); - return aResult; -} diff --git a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.h b/src/DriverSTL/DriverSTL_R_SMDS_Mesh.h deleted file mode 100644 index 14afd3c21..000000000 --- a/src/DriverSTL/DriverSTL_R_SMDS_Mesh.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERSTL_R_SMDS_MESH -#define _INCLUDE_DRIVERSTL_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -#include - -class DriverSTL_R_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - DriverSTL_R_SMDS_Mesh(); - virtual Status Perform(); - void SetIsCreateFaces( const bool theIsCreate = true ); - - private: - // PRIVATE METHODS - Status readAscii() const; - Status readBinary() const; - - private: - // PRIVATE FIELDS - bool myIsCreateFaces; - bool myIsAscii; -}; - -#endif diff --git a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx b/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx deleted file mode 100644 index 04ce4058a..000000000 --- a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include - -#include "DriverSTL_W_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include -#include -#include -#include -#include -#include -#include -#include - -#include "utilities.h" - -//using namespace std; - -// definition des constantes -static const int LABEL_SIZE = 80; - -DriverSTL_W_SMDS_Mesh::DriverSTL_W_SMDS_Mesh() -{ - myIsAscii = false; -} - -void DriverSTL_W_SMDS_Mesh::SetIsAscii( const bool theIsAscii ) -{ - myIsAscii = theIsAscii; -} - -Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - - if ( !myMesh ) { - fprintf(stderr, ">> ERROR : Mesh is null \n"); - return DRS_FAIL; - } - if ( myIsAscii ) - aResult = writeAscii(); - else - aResult = writeBinary(); - - return aResult; -} - -// static methods - -static void writeInteger( const Standard_Integer& theVal, - OSD_File& ofile ) -{ - union { - Standard_Integer i; - char c[4]; - }u; - - u.i = theVal; - - Standard_Integer entier; - entier = u.c[0] & 0xFF; - entier |= (u.c[1] & 0xFF) << 0x08; - entier |= (u.c[2] & 0xFF) << 0x10; - entier |= (u.c[3] & 0xFF) << 0x18; - - ofile.Write((char *)&entier,sizeof(u.c)); -} - -static void writeFloat ( const Standard_ShortReal& theVal, - OSD_File& ofile) -{ - union { - Standard_ShortReal f; - char c[4]; - }u; - - u.f = theVal; - - Standard_Integer entier; - - entier = u.c[0] & 0xFF; - entier |= (u.c[1] & 0xFF) << 0x08; - entier |= (u.c[2] & 0xFF) << 0x10; - entier |= (u.c[3] & 0xFF) << 0x18; - - ofile.Write((char *)&entier,sizeof(u.c)); -} - -static gp_XYZ getNormale( const SMDS_MeshFace* theFace ) -{ - gp_XYZ n; - int aNbNode = theFace->NbNodes(); - TColgp_Array1OfXYZ anArrOfXYZ(1,4); - gp_XYZ p1, p2, p3, p4; - SMDS_ElemIteratorPtr aNodeItr = theFace->nodesIterator(); - int i = 1; - for ( ; aNodeItr->more() && i <= 4; i++ ) - { - SMDS_MeshNode* aNode = (SMDS_MeshNode*)aNodeItr->next(); - anArrOfXYZ.SetValue(i, gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) ); - } - - gp_XYZ q1 = anArrOfXYZ.Value(2) - anArrOfXYZ.Value(1); - gp_XYZ q2 = anArrOfXYZ.Value(3) - anArrOfXYZ.Value(1); - n = q1 ^ q2; - if ( aNbNode > 3 ) - { - gp_XYZ q3 = anArrOfXYZ.Value(4) - anArrOfXYZ.Value(1); - n += q2 ^ q3; - } - double len = n.Modulus(); - if ( len > 0 ) - n /= len; - - return n; -} - -// private methods - -Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::writeAscii() const -{ - Status aResult = DRS_OK; - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - if ( aFileName.IsEmpty() ) { - fprintf(stderr, ">> ERREOR : invalid file name \n"); - return DRS_FAIL; - } - - OSD_File aFile = OSD_File(OSD_Path(aFileName)); - aFile.Build(OSD_WriteOnly,OSD_Protection()); - TCollection_AsciiString buf = TCollection_AsciiString ("solid\n"); - aFile.Write (buf,buf.Length());buf.Clear(); - char sval[16]; - - SMDS_FaceIteratorPtr itFaces = myMesh->facesIterator(); - - for (; itFaces->more() ;) { - SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next(); - - if (aFace->NbNodes() == 3) { - gp_XYZ normale = getNormale( aFace ); - - buf += " facet normal "; - sprintf (sval,"% 12e",normale.X()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",normale.Y()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",normale.Z()); - buf += sval; - buf += '\n'; - aFile.Write (buf,buf.Length());buf.Clear(); - buf += " outer loop\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - - SMDS_ElemIteratorPtr aNodeIter = aFace->nodesIterator(); - for (; aNodeIter->more(); ) { - SMDS_MeshNode* node = (SMDS_MeshNode*)aNodeIter->next(); - buf += " vertex "; - sprintf (sval,"% 12e",node->X()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",node->Y()); - buf += sval; - buf += " "; - sprintf (sval,"% 12e",node->Z()); - buf += sval; - buf += '\n'; - aFile.Write (buf,buf.Length());buf.Clear(); - } - buf += " endloop\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - buf += " endfacet\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - } - } - buf += "endsolid\n"; - aFile.Write (buf,buf.Length());buf.Clear(); - - aFile.Close (); - - return aResult; -} - -Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::writeBinary() const -{ - Status aResult = DRS_OK; - TCollection_AsciiString aFileName( (char *)myFile.c_str() ); - if ( aFileName.IsEmpty() ) { - fprintf(stderr, ">> ERREOR : invalid filename \n"); - return DRS_FAIL; - } - - OSD_File aFile = OSD_File(OSD_Path(aFileName)); - aFile.Build(OSD_WriteOnly,OSD_Protection()); - - char sval[80]; - Standard_Integer nbTri = 0; - SMDS_FaceIteratorPtr itFaces = myMesh->facesIterator(); - - // we first count the number of triangles - for (;itFaces->more();) { - SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next(); - if (aFace->NbNodes() == 3) - nbTri++; - } - - // write number of triangles - unsigned int NBT = nbTri; - aFile.Write((Standard_Address)sval,LABEL_SIZE); - writeInteger(nbTri,aFile); - - // loop writing nodes. take face iterator again - int dum=0; - itFaces = myMesh->facesIterator(); - - for (;itFaces->more();) { - SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next(); - - if (aFace->NbNodes() == 3) { - gp_XYZ aNorm = getNormale( aFace ); - writeFloat(aNorm.X(),aFile); - writeFloat(aNorm.Y(),aFile); - writeFloat(aNorm.Z(),aFile); - - SMDS_ElemIteratorPtr aNodeIter = aFace->nodesIterator(); - for (; aNodeIter->more(); ) { - SMDS_MeshNode* node = (SMDS_MeshNode*)aNodeIter->next(); - writeFloat(node->X(),aFile); - writeFloat(node->Y(),aFile); - writeFloat(node->Z(),aFile); - } - aFile.Write (&dum,2); - } - } - aFile.Close (); - - return aResult; -} diff --git a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.h b/src/DriverSTL/DriverSTL_W_SMDS_Mesh.h deleted file mode 100644 index 49d752083..000000000 --- a/src/DriverSTL/DriverSTL_W_SMDS_Mesh.h +++ /dev/null @@ -1,51 +0,0 @@ -// SMESH DriverSTL : driver to read and write 'stl' files -// -// Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : DriverSTL_W_SMDS_Mesh.h -// Module : SMESH - -#ifndef _INCLUDE_DRIVERSTL_W_SMDS_MESH -#define _INCLUDE_DRIVERSTL_W_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" -#include - -class DriverSTL_W_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - - DriverSTL_W_SMDS_Mesh(); - virtual Status Perform(); - void SetIsAscii( const bool theIsAscii = false ); - - private: - // PRIVATE METHODS - Status writeAscii () const; - Status writeBinary () const; - - private: - // PRIVATE FIELDS - bool myIsAscii; -}; - -#endif diff --git a/src/DriverSTL/STL_Test.cxx b/src/DriverSTL/STL_Test.cxx deleted file mode 100644 index 78dc0df71..000000000 --- a/src/DriverSTL/STL_Test.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -//#include "DriverSTL_R_SMDS_Mesh.h" -#include "DriverSTL_W_SMDS_Mesh.h" - -int main(int argc, char** argv) -{ -// DriverSTL_R_SMDS_Mesh aR; - DriverSTL_W_SMDS_Mesh aW; - return 1; -} diff --git a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.h b/src/DriverUNV/DriverUNV_R_SMDS_Mesh.h deleted file mode 100644 index 46c6ad347..000000000 --- a/src/DriverUNV/DriverUNV_R_SMDS_Mesh.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERUNV_R_SMDS_MESH -#define _INCLUDE_DRIVERUNV_R_SMDS_MESH - -#include "Driver_SMDS_Mesh.h" - -class SMDS_Mesh; - -class DriverUNV_R_SMDS_Mesh: public Driver_SMDS_Mesh -{ - public: - virtual Status Perform(); -}; - -#endif diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx b/src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx deleted file mode 100644 index 0e1b871fc..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverUNV_R_SMESHDS_Document.h" diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.h b/src/DriverUNV/DriverUNV_R_SMESHDS_Document.h deleted file mode 100644 index 4d38a67c3..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Document.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERUNV_R_SMESHDS_DOCUMENT -#define _INCLUDE_DRIVERUNV_R_SMESHDS_DOCUMENT - -#include "Driver_Document.h" - -class DriverUNV_R_SMESHDS_Document: public Driver_Document -{}; - -#endif diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx b/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx deleted file mode 100644 index e4fcbf3e0..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "DriverUNV_R_SMESHDS_Mesh.h" diff --git a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h b/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h deleted file mode 100644 index fce4b66bd..000000000 --- a/src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _INCLUDE_DRIVERUNV_R_SMESHDS_MESH -#define _INCLUDE_DRIVERUNV_R_SMESHDS_MESH - -#include "Driver_SMESHDS_Mesh.h" - -class DriverUNV_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh -{}; - -#endif diff --git a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx deleted file mode 100644 index 3fe3b18ef..000000000 --- a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include - -#include "DriverUNV_W_SMDS_Mesh.h" - -#include "SMDS_Mesh.hxx" - -#include "utilities.h" - -#include "UNV2411_Structure.hxx" -#include "UNV2412_Structure.hxx" -#include "UNV_Utilities.hxx" - -using namespace std; - -namespace{ - typedef std::vector TConnect; - - int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter, - TConnect& theConnect) - { - theConnect.clear(); - for(; theNodesIter->more();){ - const SMDS_MeshElement* anElem = theNodesIter->next(); - theConnect.push_back(anElem->GetID()); - } - return theConnect.size(); - } - -} - -Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() -{ - Status aResult = DRS_OK; - std::ofstream out_stream(myFile.c_str()); - try{ - { - using namespace UNV2411; - TDataSet aDataSet2411; - // Storing SMDS nodes to the UNV file - //----------------------------------- - MESSAGE("Perform - myMesh->NbNodes() = "<NbNodes()); - SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); - for(; aNodesIter->more();){ - const SMDS_MeshNode* aNode = aNodesIter->next(); - TRecord aRec; - aRec.coord[0] = aNode->X(); - aRec.coord[1] = aNode->Y(); - aRec.coord[2] = aNode->Z(); - const TNodeLab& aLabel = aNode->GetID(); - aDataSet2411.insert(TDataSet::value_type(aLabel,aRec)); - } - MESSAGE("Perform - aDataSet2411.size() = "<NbEdges() = "<NbEdges()); - if(myMesh->NbEdges()){ - SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); - for(; anIter->more();){ - const SMDS_MeshEdge* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); - int aNbNodes = anElem->NbNodes(); - TRecord aRec; - aRec.node_labels.reserve(aNbNodes); - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - for(; aNodesIter->more();){ - const SMDS_MeshElement* aNode = aNodesIter->next(); - aRec.node_labels.push_back(aNode->GetID()); - } - aRec.fe_descriptor_id = 11; - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); - } - MESSAGE("Perform - aDataSet2412.size() = "<NbFaces() = "<NbFaces()); - if(myMesh->NbFaces()){ - SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); - for(; anIter->more();){ - const SMDS_MeshFace* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); - int aNbNodes = anElem->NbNodes(); - TRecord aRec; - aRec.node_labels.reserve(aNbNodes); - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - for(; aNodesIter->more();){ - const SMDS_MeshElement* aNode = aNodesIter->next(); - aRec.node_labels.push_back(aNode->GetID()); - } - switch(aNbNodes){ - case 3: - aRec.fe_descriptor_id = 41; - break; - case 4: - aRec.fe_descriptor_id = 44; - break; - default: - continue; - } - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); - } - MESSAGE("Perform - aDataSet2412.size() = "<NbVolumes() = "<NbVolumes()); - if(myMesh->NbVolumes()){ - SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator(); - for(; anIter->more();){ - const SMDS_MeshVolume* anElem = anIter->next(); - TElementLab aLabel = anElem->GetID(); - - int aNbNodes = anElem->NbNodes(); - aConnect.resize(aNbNodes); - - SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - GetConnect(aNodesIter,aConnect); - - int anId = -1; - int* aConn = NULL; - switch(aNbNodes){ - case 4: { - static int anIds[] = {0,2,1,3}; - aConn = anIds; - anId = 111; - break; - } - case 6: { - static int anIds[] = {0,2,1,3,5,4}; - aConn = anIds; - anId = 112; - break; - } - case 8: { - static int anIds[] = {0,3,2,1,4,7,6,5}; - aConn = anIds; - anId = 115; - break; - } - default: - continue; - } - if(aConn){ - TRecord aRec; - aRec.fe_descriptor_id = anId; - aRec.node_labels.resize(aNbNodes); - for(int aNodeId = 0; aNodeId < aNbNodes; aNodeId++){ - aRec.node_labels[aConn[aNodeId]] = aConnect[aNodeId]; - } - aDataSet2412.insert(TDataSet::value_type(aLabel,aRec)); - } - } - MESSAGE("Perform - aDataSet2412.size() = "< -#include - -#include "UNV2411_Structure.hxx" -#include "UNV_Utilities.hxx" - -using namespace std; -using namespace UNV; -using namespace UNV2411; - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -static string _label_dataset = "2411"; - -UNV2411::TRecord::TRecord(): - exp_coord_sys_num(0), - disp_coord_sys_num(0), - color(0) -{} - -void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet) -{ - if(!in_stream.good()) - EXCEPTION(runtime_error,"ERROR: Input file not good."); - - /* - * adjust the \p istream to our - * position - */ - if(!beginning_of_dataset(in_stream,_label_dataset)) - EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!"); - - /** - * always 3 coordinates in the UNV file, no matter - * which dimensionality libMesh is in - */ - TNodeLab aLabel; - std::string num_buf; - for(; !in_stream.eof();){ - in_stream >> aLabel ; - if(aLabel == -1){ - // end of dataset is reached - break; - } - - TRecord aRec; - in_stream>>aRec.exp_coord_sys_num; - in_stream>>aRec.disp_coord_sys_num; - in_stream>>aRec.color; - - /* - * take care of the - * floating-point data - */ - for(int d = 0; d < 3; d++){ - in_stream>>num_buf; - aRec.coord[d] = D_to_e(num_buf); - } - - theDataSet.insert(TDataSet::value_type(aLabel,aRec)); - } -} - - -void UNV2411::Write(std::ofstream& out_stream, const TDataSet& theDataSet) -{ - if(!out_stream.good()) - EXCEPTION(runtime_error,"ERROR: Output file not good."); - - /* - * Write beginning of dataset - */ - out_stream<<" -1\n"; - out_stream<<" "<<_label_dataset<<"\n"; - - TDataSet::const_iterator anIter = theDataSet.begin(); - for(; anIter != theDataSet.end(); anIter++){ - const TNodeLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; - char buf[78]; - sprintf(buf, "%10d%10d%10d%10d\n", - aLabel, - aRec.exp_coord_sys_num, - aRec.disp_coord_sys_num, - aRec.color); - out_stream< -#include - -namespace UNV2411{ - - struct TRecord{ - TRecord(); - int exp_coord_sys_num; // export coordinate system number - int disp_coord_sys_num; // displacement coordinate system number - int color; // color - double coord[3]; // node coordinates in the part coordinate system - }; - - typedef int TNodeLab; // type of node label - typedef std::map TDataSet; - - void Read(std::ifstream& in_stream, TDataSet& theDataSet); - - void Write(std::ofstream& out_stream, const TDataSet& theDataSet); - -}; - - -#endif diff --git a/src/DriverUNV/UNV2412_Structure.cxx b/src/DriverUNV/UNV2412_Structure.cxx deleted file mode 100644 index 0160d7b68..000000000 --- a/src/DriverUNV/UNV2412_Structure.cxx +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include -#include - -#include "UNV2412_Structure.hxx" -#include "UNV_Utilities.hxx" - -using namespace std; -using namespace UNV; -using namespace UNV2412; - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -static string _label_dataset = "2412"; - -UNV2412::TRecord::TRecord(): - phys_prop_tab_num(2), - mat_prop_tab_num(1), - color(7), - beam_orientation(0), - beam_fore_end(0), - beam_aft_end(0) -{} - -void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet) -{ - if(!in_stream.good()) - EXCEPTION(runtime_error,"ERROR: Input file not good."); - - /* - * adjust the \p istream to our - * position - */ - if(!beginning_of_dataset(in_stream,_label_dataset)) - EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!"); - - TElementLab aLabel; - for(; !in_stream.eof();){ - in_stream >> aLabel ; - if(aLabel == -1){ - // end of dataset is reached - break; - } - - int n_nodes; - TRecord aRec; - in_stream>>aRec.fe_descriptor_id; - in_stream>>aRec.phys_prop_tab_num; - in_stream>>aRec.mat_prop_tab_num; - in_stream>>aRec.color; - in_stream>>n_nodes; - - if(IsBeam(aRec.fe_descriptor_id)){ - in_stream>>aRec.beam_orientation; - in_stream>>aRec.beam_fore_end; - in_stream>>aRec.beam_aft_end; - } - - aRec.node_labels.resize(n_nodes); - for(int j=0; j < n_nodes; j++){ - // read node labels - in_stream>>aRec.node_labels[j]; - } - - theDataSet.insert(TDataSet::value_type(aLabel,aRec)); - } - -} - - -void UNV2412::Write(std::ofstream& out_stream, const TDataSet& theDataSet) -{ - if(!out_stream.good()) - EXCEPTION(runtime_error,"ERROR: Output file not good."); - - /* - * Write beginning of dataset - */ - out_stream<<" -1\n"; - out_stream<<" "<<_label_dataset<<"\n"; - - TDataSet::const_iterator anIter = theDataSet.begin(); - for(; anIter != theDataSet.end(); anIter++){ - const TElementLab& aLabel = anIter->first; - const TRecord& aRec = anIter->second; - out_stream< -#include -#include - - -namespace UNV2412{ - - typedef std::vector TNodeLabels; // Nodal connectivities - - struct TRecord{ - TRecord(); - - int fe_descriptor_id; // FE descriptor id - int phys_prop_tab_num; // physical property table number - int mat_prop_tab_num; // material property table number - int color; // color - TNodeLabels node_labels; // node labels defining element - - //FOR BEAM ELEMENTS ONLY - int beam_orientation; // beam orientation node number - int beam_fore_end; // beam fore-end cross section number - int beam_aft_end; // beam aft-end cross section number - }; - - typedef int TElementLab; // type of element label - typedef std::map TDataSet; - - void Read(std::ifstream& in_stream, TDataSet& theDataSet); - - void Write(std::ofstream& out_stream, const TDataSet& theDataSet); - - bool IsBeam(int theFeDescriptorId); - bool IsFace(int theFeDescriptorId); - bool IsVolume(int theFeDescriptorId); - -}; - - -#endif diff --git a/src/DriverUNV/UNV_Test.cxx b/src/DriverUNV/UNV_Test.cxx deleted file mode 100644 index 0156b5051..000000000 --- a/src/DriverUNV/UNV_Test.cxx +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "UNV2411_Structure.hxx" -#include "UNV2412_Structure.hxx" -#include "UNV_Utilities.hxx" - -#include "DriverUNV_R_SMDS_Mesh.h" -#include "DriverUNV_W_SMDS_Mesh.h" - -using namespace std; - -#ifdef DEBUG -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - - -void ReadMed(const char* theFileName){ - std::ifstream in_stream(theFileName); - - UNV2411::TDataSet aDataSet2411; - UNV2411::Read(in_stream,aDataSet2411); - - in_stream.seekg(0); - UNV2412::TDataSet aDataSet2412; - UNV2412::Read(in_stream,aDataSet2412); - - string aFileName(theFileName); - aFileName += "-"; - std::ofstream out_stream(aFileName.c_str()); - - UNV2411::Write(out_stream,aDataSet2411); - UNV2412::Write(out_stream,aDataSet2412); -} - - -int main(int argc, char** argv){ - DriverUNV_R_SMDS_Mesh aR; - DriverUNV_W_SMDS_Mesh aW; - try{ - if(argc > 1){ - ReadMed(argv[1]); - } - return 0; - }catch(std::exception& exc){ - MESSAGE("Follow exception was accured :\n"< -#include -#include -#include -#include - -namespace UNV{ - using namespace std; - - class PrefixPrinter{ - static int myCounter; - public: - PrefixPrinter(); - ~PrefixPrinter(); - - static string GetPrefix(); - }; - - /** - * @returns \p false when error occured, \p true otherwise. - * Adjusts the \p in_stream to the beginning of the - * dataset \p ds_name. - */ - inline bool beginning_of_dataset(std::istream& in_file, const std::string& ds_name) - { - assert (in_file.good()); - assert (!ds_name.empty()); - - std::string olds, news; - - while(true){ - in_file >> olds >> news; - /* - * a "-1" followed by a number means the beginning of a dataset - * stop combing at the end of the file - */ - while( ((olds != "-1") || (news == "-1") ) && !in_file.eof() ){ - olds = news; - in_file >> news; - } - if(in_file.eof()) - return false; - if (news == ds_name) - return true; - } - // should never end up here - return false; - } - - /** - * Method for converting exponential notation - * from "D" to "e", for example - * \p 3.141592654D+00 \p --> \p 3.141592654e+00 - * in order to make it readable for C++. - */ - inline double D_to_e(std::string& number) - { - /* find "D" in string, start looking at - * 6th element, to improve speed. - * We dont expect a "D" earlier - */ - const int position = number.find("D",6); - if(position != std::string::npos){ - number.replace(position, 1, "e"); - } - return atof (number.c_str()); - } - -}; - - -#ifndef MESSAGE - -#define MESSAGE(msg) std::cout<<__FILE__<<"["<<__LINE__<<"]::"< //Dans OpenCascade -#include //Dans OpenCascade -#include //Dans OpenCascade - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// BUT: Definir les espaces affines R R2 R3 R4 soit Rn pour n=1,2,3,4 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// AUTEUR : Frederic HECHT ANALYSE NUMERIQUE UPMC PARIS OCTOBRE 2000 -// MODIFS : Alain PERRONNET ANALYSE NUMERIQUE UPMC PARIS NOVEMBRE 2000 -//............................................................................... -#include -#include - - -template inline T Abs (const T &a){return a <0 ? -a : a;} -template inline void Echange (T& a,T& b) {T c=a;a=b;b=c;} - -template inline T Min (const T &a,const T &b) {return a < b ? a : b;} -template inline T Max (const T &a,const T & b) {return a > b ? a : b;} - -template inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);} -template inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);} - -template inline T Max (const T &a,const T & b,const T & c,const T & d) - {return Max(Max(a,b),Max(c,d));} -template inline T Min (const T &a,const T & b,const T & c,const T & d) - {return Min(Min(a,b),Min(c,d));} - -//le type Nom des entites geometriques P L S V O -//=========== -typedef char Nom[1+24]; - -//le type N des nombres entiers positifs -//========= -typedef unsigned long int N; - -//le type Z des nombres entiers relatifs -//========= -typedef long int Z; - -//le type R des nombres "reels" -//========= -typedef double R; - -//le type XPoint des coordonnees d'un pixel dans une fenetre -//============== -//typedef struct { short int x,y } XPoint; //en fait ce type est defini dans X11-Window - // #include -//la classe R2 -//============ -class R2 -{ - friend std::ostream& operator << (std::ostream& f, const R2 & P) - { f << P.x << ' ' << P.y ; return f; } - friend std::istream& operator >> (std::istream& f, R2 & P) - { f >> P.x >> P.y ; return f; } - - friend std::ostream& operator << (std::ostream& f, const R2 * P) - { f << P->x << ' ' << P->y ; return f; } - friend std::istream& operator >> (std::istream& f, R2 * P) - { f >> P->x >> P->y ; return f; } - -public: - R x,y; //les donnees - - R2 () :x(0),y(0) {} //les constructeurs - R2 (R a,R b) :x(a),y(b) {} - R2 (R2 A,R2 B) :x(B.x-A.x),y(B.y-A.y) {} //vecteur defini par 2 points - - R2 operator+(R2 P) const {return R2(x+P.x,y+P.y);} // Q+P possible - R2 operator+=(R2 P) {x += P.x;y += P.y; return *this;}// Q+=P; - R2 operator-(R2 P) const {return R2(x-P.x,y-P.y);} // Q-P - R2 operator-=(R2 P) {x -= P.x;y -= P.y; return *this;} // Q-=P; - R2 operator-()const {return R2(-x,-y);} // -Q - R2 operator+()const {return *this;} // +Q - R operator,(R2 P)const {return x*P.x+y*P.y;} // produit scalaire (Q,P) - R operator^(R2 P)const {return x*P.y-y*P.x;} // produit vectoriel Q^P - R2 operator*(R c)const {return R2(x*c,y*c);} // produit a droite P*c - R2 operator*=(R c) {x *= c; y *= c; return *this;} - R2 operator/(R c)const {return R2(x/c,y/c);} // division par un reel - R2 operator/=(R c) {x /= c; y /= c; return *this;} - R & operator[](int i) {return (&x)[i];} // la coordonnee i - R2 orthogonal() {return R2(-y,x);} //le vecteur orthogonal dans R2 - friend R2 operator*(R c,R2 P) {return P*c;} // produit a gauche c*P -}; - - -//la classe R3 -//============ -class R3 -{ - friend std::ostream& operator << (std::ostream& f, const R3 & P) - { f << P.x << ' ' << P.y << ' ' << P.z ; return f; } - friend std::istream& operator >> (std::istream& f, R3 & P) - { f >> P.x >> P.y >> P.z ; return f; } - - friend std::ostream& operator << (std::ostream& f, const R3 * P) - { f << P->x << ' ' << P->y << ' ' << P->z ; return f; } - friend std::istream& operator >> (std::istream& f, R3 * P) - { f >> P->x >> P->y >> P->z ; return f; } - -public: - R x,y,z; //les 3 coordonnees - - R3 () :x(0),y(0),z(0) {} //les constructeurs - R3 (R a,R b,R c):x(a),y(b),z(c) {} //Point ou Vecteur (a,b,c) - R3 (R3 A,R3 B):x(B.x-A.x),y(B.y-A.y),z(B.z-A.z) {} //Vecteur AB - - R3 (gp_Pnt P) : x(P.X()), y(P.Y()), z(P.Z()) {} //Point d'OpenCascade - R3 (gp_Vec V) : x(V.X()), y(V.Y()), z(V.Z()) {} //Vecteur d'OpenCascade - R3 (gp_Dir P) : x(P.X()), y(P.Y()), z(P.Z()) {} //Direction d'OpenCascade - - R3 operator+(R3 P)const {return R3(x+P.x,y+P.y,z+P.z);} - R3 operator+=(R3 P) {x += P.x; y += P.y; z += P.z; return *this;} - R3 operator-(R3 P)const {return R3(x-P.x,y-P.y,z-P.z);} - R3 operator-=(R3 P) {x -= P.x; y -= P.y; z -= P.z; return *this;} - R3 operator-()const {return R3(-x,-y,-z);} - R3 operator+()const {return *this;} - R operator,(R3 P)const {return x*P.x+y*P.y+z*P.z;} // produit scalaire - R3 operator^(R3 P)const {return R3(y*P.z-z*P.y ,P.x*z-x*P.z, x*P.y-y*P.x);} // produit vectoriel - R3 operator*(R c)const {return R3(x*c,y*c,z*c);} - R3 operator*=(R c) {x *= c; y *= c; z *= c; return *this;} - R3 operator/(R c)const {return R3(x/c,y/c,z/c);} - R3 operator/=(R c) {x /= c; y /= c; z /= c; return *this;} - R & operator[](int i) {return (&x)[i];} - friend R3 operator*(R c,R3 P) {return P*c;} - - R3 operator=(gp_Pnt P) {return R3(P.X(),P.Y(),P.Z());} - R3 operator=(gp_Dir P) {return R3(P.X(),P.Y(),P.Z());} - - friend gp_Pnt gp_pnt(R3 xyz) { return gp_Pnt(xyz.x,xyz.y,xyz.z); } - //friend gp_Pnt operator=() { return gp_Pnt(x,y,z); } - friend gp_Dir gp_dir(R3 xyz) { return gp_Dir(xyz.x,xyz.y,xyz.z); } - - bool DansPave( R3 & xyzMin, R3 & xyzMax ) - { return xyzMin.x<=x && x<=xyzMax.x && - xyzMin.y<=y && y<=xyzMax.y && - xyzMin.z<=z && z<=xyzMax.z; } -}; - -//la classe R4 -//============ -class R4: public R3 -{ - friend std::ostream& operator <<(std::ostream& f, const R4 & P ) - { f << P.x << ' ' << P.y << ' ' << P.z << ' ' << P.omega; return f; } - friend istream& operator >>(istream& f, R4 & P) - { f >> P.x >> P.y >> P.z >> P.omega ; return f; } - - friend std::ostream& operator <<(std::ostream& f, const R4 * P ) - { f << P->x << ' ' << P->y << ' ' << P->z << ' ' << P->omega; return f; } - friend istream& operator >>(istream& f, R4 * P) - { f >> P->x >> P->y >> P->z >> P->omega ; return f; } - -public: - R omega; //la donnee du poids supplementaire - - R4 () :omega(1.0) {} //les constructeurs - R4 (R a,R b,R c,R d):R3(a,b,c),omega(d) {} - R4 (R4 A,R4 B) :R3(B.x-A.x,B.y-A.y,B.z-A.z),omega(B.omega-A.omega) {} - - R4 operator+(R4 P)const {return R4(x+P.x,y+P.y,z+P.z,omega+P.omega);} - R4 operator+=(R4 P) {x += P.x;y += P.y;z += P.z;omega += P.omega;return *this;} - R4 operator-(R4 P)const {return R4(x-P.x,y-P.y,z-P.z,omega-P.omega);} - R4 operator-=(R4 P) {x -= P.x;y -= P.y;z -= P.z;omega -= P.omega;return *this;} - R4 operator-()const {return R4(-x,-y,-z,-omega);} - R4 operator+()const {return *this;} - R operator,(R4 P)const {return x*P.x+y*P.y+z*P.z+omega*P.omega;} // produit scalaire - R4 operator*(R c)const {return R4(x*c,y*c,z*c,omega*c);} - R4 operator*=(R c) {x *= c; y *= c; z *= c; omega *= c; return *this;} - R4 operator/(R c)const {return R4(x/c,y/c,z/c,omega/c);} - R4 operator/=(R c) {x /= c; y /= c; z /= c; omega /= c; return *this;} - R & operator[](int i) {return (&x)[i];} - friend R4 operator*(R c,R4 P) {return P*c;} -}; - -//quelques fonctions supplementaires sur ces classes -//================================================== -inline R Aire2d(const R2 A,const R2 B,const R2 C){return (B-A)^(C-A);} -inline R Angle2d(R2 P){ return atan2(P.y,P.x);} - -inline R Norme2_2(const R2 & A){ return (A,A);} -inline R Norme2(const R2 & A){ return sqrt((A,A));} -inline R NormeInfinie(const R2 & A){return Max(Abs(A.x),Abs(A.y));} - -inline R Norme2_2(const R3 & A){ return (A,A);} -inline R Norme2(const R3 & A){ return sqrt((A,A));} -inline R NormeInfinie(const R3 & A){return Max(Abs(A.x),Abs(A.y),Abs(A.z));} - -inline R Norme2_2(const R4 & A){ return (A,A);} -inline R Norme2(const R4 & A){ return sqrt((A,A));} -inline R NormeInfinie(const R4 & A){return Max(Abs(A.x),Abs(A.y),Abs(A.z),Abs(A.omega));} - -inline R2 XY(R3 P) {return R2(P.x, P.y);} //restriction a R2 d'un R3 par perte de z -inline R3 Min(R3 P, R3 Q) -{return R3(P.xQ.x ? P.x : Q.x, P.y>Q.y ? P.y : Q.y, P.z>Q.z ? P.z : Q.z);} //Pt de xyz Max - -#endif diff --git a/src/MEFISTO2/aptrte.cxx b/src/MEFISTO2/aptrte.cxx deleted file mode 100755 index 40c090523..000000000 --- a/src/MEFISTO2/aptrte.cxx +++ /dev/null @@ -1,786 +0,0 @@ -// MEFISTO : library to compute 2D triangulation from segmented boundaries -// -// Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -// -// -// File : aptrte.cxx -// Module : SMESH -// Author: Alain PERRONNET - -#include "Rn.h" -#include "aptrte.h" -#include "utilities.h" - -using namespace std; - -extern "C" -{ - R aretemaxface_; - R areteideale_( R3 xyz, R3 direction ) - { - return aretemaxface_; - } -} -//calcul de la longueur ideale de l'arete au sommet xyz (z ici inactif) -//dans la direction donnee -//a ajuster pour chaque surface plane et selon l'entier notysu (voir plus bas) - - -static double cpunew, cpuold=0; - -void tempscpu_( double & tempsec ) -//Retourne le temps CPU utilise en secondes -{ - tempsec = ( (double) clock() ) / CLOCKS_PER_SEC; - //MESSAGE( "temps cpu=" << tempsec ); -} - - -void deltacpu_( R & dtcpu ) -//Retourne le temps CPU utilise en secondes depuis le precedent appel -{ - tempscpu_( cpunew ); - dtcpu = R( cpunew - cpuold ); - cpuold = cpunew; - //MESSAGE( "delta temps cpu=" << dtcpu ); - return; -} - - -void aptrte( Z nutysu, R aretmx, - Z nblf, Z * nudslf, R2 * uvslf, - Z nbpti, R2 *uvpti, - Z & nbst, R2 * & uvst, Z & nbt, Z * & nust, - Z & ierr ) -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : appel de la triangulation par un arbre-4 recouvrant -// ----- de triangles equilateraux -// le contour du domaine plan est defini par des lignes fermees -// la premiere ligne etant l'enveloppe de toutes les autres -// la fonction areteideale(s,d) donne la taille d'arete -// au point s dans la direction (actuellement inactive) d -// des lors toute arete issue d'un sommet s devrait avoir une longueur -// comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d) -// -//Attention: -// Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques! -// De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee -// -// entrees: -// -------- -// nutysu : numero de traitement de areteideale_(s,d) selon le type de surface -// 0 pas d'emploi de la fonction areteideale_() et aretmx est active -// 1 il existe une fonction areteideale_(s,d) -// dont seules les 2 premieres composantes de uv sont actives -// ... autres options a definir ... -// aretmx : longueur maximale des aretes de la future triangulation -// nblf : nombre de lignes fermees de la surface -// nudslf : numero du dernier sommet de chacune des nblf lignes fermees -// nudslf(0)=0 pour permettre la difference sans test -// Attention le dernier sommet de chaque ligne est raccorde au premier -// tous les sommets et les points internes ont des coordonnees -// UV differentes <=> Pas de point double! -// uvslf : uv des nudslf(nblf) sommets des lignes fermees -// nbpti : nombre de points internes futurs sommets de la triangulation -// uvpti : uv des points internes futurs sommets de la triangulation -// -// sorties: -// -------- -// nbst : nombre de sommets de la triangulation finale -// uvst : coordonnees uv des nbst sommets de la triangulation -// nbt : nombre de triangles de la triangulation finale -// nust : 4 numeros dans uvst des sommets des nbt triangles -// s1, s2, s3, 0: no dans uvst des 3 sommets et 0 car quadrangle! -// ierr : 0 si pas d'erreur -// > 0 sinon -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -{ - R d, tcpu=0; - R3 direction=R3(0,0,0); //direction pour areteideale() inactive ici! - Z nbarfr=nudslf[nblf]; //nombre total d'aretes des lignes fermees - Z mxtrou = Max( 1024, nblf ); //nombre maximal de trous dans la surface - - R3 *mnpxyd=NULL; - Z *mnsoar=NULL, mosoar=7, mxsoar, n1soar; //le hachage des aretes - Z *mnartr=NULL, moartr=3, mxartr, n1artr; //le no des 3 aretes des triangles - Z *mntree=NULL, motree=9, mxtree; //L'arbre 4 de TE et nombre d'entiers par TE - Z *mnqueu=NULL, mxqueu; - Z *mn1arcf=NULL; - Z *mnarcf=NULL, mxarcf; - Z *mnarcf1=NULL; - Z *mnarcf2=NULL; - Z *mnarcf3=NULL; - Z *mntrsu=NULL; - Z *mndalf=NULL; - Z *mnslig=NULL; - Z *mnarst=NULL; - Z *mnlftr=NULL; - - R3 comxmi[2]; //coordonnees UV Min et Maximales - R aremin, aremax; //longueur minimale et maximale des aretes - R quamoy, quamin; - - Z noar0, noar, na; - Z i, l, n, ns, ns0, ns1, ns2, nosotr[3], nt; - Z mxsomm, nbsomm, nbarpi, nbarli, ndtri0, mn; - Z moins1=-1; - - aretemaxface_ = aretmx; - - // initialisation du temps cpu - deltacpu_( d ); - ierr = 0; - - // quelques reservations de tableaux pour faire les calculs - // ======================================================== - // le tableau pointeur sur la premiere arete de chaque ligne fermee - if( mndalf!=NULL ) delete [] mndalf; - mndalf = new Z[1+nblf]; - if( mndalf==NULL ) goto ERREUR; - mndalf[0]=0; - - // declaration du tableau des coordonnees des sommets de la frontiere - // puis des sommets internes ajoutes - // majoration empirique du nombre de sommets de la triangulation - i = 4*nbarfr/10; - mxsomm = Max( 20000, 64*nbpti+i*i ); - MESSAGE( "APTRTE: Depart de la triangulation avec " ); - MESSAGE( "nutysu=" << nutysu << " aretmx=" << aretmx << " mxsomm=" << mxsomm ); - - NEWDEPART: - //mnpxyd( 3, mxsomm ) les coordonnees UV des sommets et la taille d'arete aux sommets - if( mnpxyd!=NULL ) delete [] mnpxyd; - mnpxyd = new R3[mxsomm]; - if( mnpxyd==NULL ) goto ERREUR; - - // le tableau mnsoar des aretes des triangles - // 1: sommet 1 dans pxyd, - // 2: sommet 2 dans pxyd, - // 3: numero de 1 a nblf de la ligne qui supporte l'arete - // 4: numero dans mnartr du triangle 1 partageant cette arete, - // 5: numero dans mnartr du triangle 2 partageant cette arete, - // 6: chainage des aretes frontalieres ou internes ou - // des aretes simples des etoiles de triangles, - // 7: chainage du hachage des aretes - // nombre d'aretes = 3 ( nombre de sommets - 1 + nombre de trous ) - // pour le hachage des aretes mxsoar doit etre > 3*mxsomm! - // h(ns1,ns2) = min( ns1, ns2 ) - if( mnsoar!=NULL ) delete [] mnsoar; - mxsoar = 3 * ( mxsomm + mxtrou ); - mnsoar = new Z[mosoar*mxsoar]; - if( mnsoar==NULL ) goto ERREUR; - //initialiser le tableau mnsoar pour le hachage des aretes - insoar_( mxsomm, mosoar, mxsoar, n1soar, mnsoar ); - - // mnarst( mxsomm ) numero mnsoar d'une arete pour chacun des sommets - if( mnarst!=NULL ) delete [] mnarst; - mnarst = new Z[1+mxsomm]; - if( mnarst==NULL ) goto ERREUR; - n = 1+mxsomm; - azeroi_( n, mnarst ); - - // mnslig( mxsomm ) no de sommet dans sa ligne pour chaque sommet frontalier - // ou no du point si interne forc'e par l'utilisateur - // ou 0 si interne cree par le module - if( mnslig!=NULL ) delete [] mnslig; - mnslig = new Z[mxsomm]; - if( mnslig==NULL ) goto ERREUR; - azeroi_( mxsomm, mnslig ); - - // initialisation des aretes frontalieres de la triangulation future - // renumerotation des sommets des aretes des lignes pour la triangulation - // mise a l'echelle des coordonnees des sommets pour obtenir une - // meilleure precision lors des calculs + quelques verifications - // boucle sur les lignes fermees qui forment la frontiere - // ====================================================================== - noar = 0; - aremin = 1e100; - aremax = 0; - - for (n=1; n<=nblf; n++) - { - //l'initialisation de la premiere arete de la ligne n dans la triangulation - //------------------------------------------------------------------------- - //le sommet ns0 est le numero de l'origine de la ligne - ns0 = nudslf[n-1]; - mnpxyd[ns0].x = uvslf[ns0].x; - mnpxyd[ns0].y = uvslf[ns0].y; - mnpxyd[ns0].z = areteideale_( mnpxyd[ns0], direction ); -// MESSAGE("Sommet " << ns0 << ": " << mnpxyd[ns0].x -// << " " << mnpxyd[ns0].y << " longueur arete=" << mnpxyd[ns0].z); - - //carre de la longueur de l'arete 1 de la ligne fermee n - d = pow( uvslf[ns0+1].x - uvslf[ns0].x, 2 ) - + pow( uvslf[ns0+1].y - uvslf[ns0].y, 2 ) ; - aremin = Min( aremin, d ); - aremax = Max( aremax, d ); - - //le numero des 2 sommets (ns1,ns2) de la premiere arete de la ligne - //initialisation de la 1-ere arete ns1-ns1+1 de cette ligne fermee n - //le numero des 2 sommets ns1 ns2 de la 1-ere arete - //Attention: les numeros ns debutent a 1 (ils ont >0) - // les tableaux c++ demarrent a zero! - // les tableaux fortran demarrent ou l'on veut! - ns0++; - ns1 = ns0; - ns2 = ns1+1; - - //le numero n de la ligne du sommet et son numero ns1 dans la ligne - mnslig[ns0-1] = 1000000 * n + ns1-nudslf[n-1]; - fasoar_( ns1, ns2, moins1, moins1, n, - mosoar, mxsoar, n1soar, mnsoar, mnarst, - noar0, ierr ); - //pas de test sur ierr car pas de saturation possible a ce niveau - - //le pointeur dans le hachage sur la premiere arete de la ligne fermee n - mndalf[n] = noar0; - - //la nouvelle arete est la suivante de l'arete definie juste avant - if( noar > 0 ) - mnsoar[mosoar * noar - mosoar + 5] = noar0; - - //l'initialisation des aretes suivantes de la ligne dans la triangulation - //----------------------------------------------------------------------- - nbarli = nudslf[n] - nudslf[n-1]; //nombre d'aretes=sommets de la ligne n - for (i=2; i<=nbarli; i++) - { - ns1 = ns2; //le numero de l'arete et le numero du premier sommet de l'arete - if( i < nbarli ) - //nbs+1 est le 2-eme sommet de l'arete i de la ligne fermee n - ns2 = ns1+1; - else - //le 2-eme sommet de la derniere arete est le premier sommet de la ligne - ns2 = ns0; - - //l'arete precedente est dotee de sa suivante:celle cree ensuite - //les 2 coordonnees du sommet ns2 de la ligne - ns = ns1 - 1; - mnpxyd[ns].x = uvslf[ns].x; - mnpxyd[ns].y = uvslf[ns].y; - mnpxyd[ns].z = areteideale_( mnpxyd[ns], direction ); -// MESSAGE("Sommet " << ns << ": " << mnpxyd[ns].x -// << " " << mnpxyd[ns].y << " longueur arete=" << mnpxyd[ns].z); - - //carre de la longueur de l'arete - d = pow( uvslf[ns2-1].x - uvslf[ns1-1].x, 2) - + pow( uvslf[ns2-1].y - uvslf[ns1-1].y, 2); - aremin = Min( aremin, d ); - aremax = Max( aremax, d ); - - //le numero n de la ligne du sommet et son numero ns1 dans la ligne - mnslig[ns] = 1000000 * n + ns1-nudslf[n-1]; - - //ajout de l'arete dans la liste - fasoar_( ns1, ns2, moins1, moins1, n, - mosoar, mxsoar, n1soar, mnsoar, - mnarst, noar, ierr ); - //pas de test sur ierr car pas de saturation possible a ce niveau - - //chainage des aretes frontalieres en position 6 du tableau mnsoar - //la nouvelle arete est la suivante de l'arete definie juste avant - mnsoar[ mosoar * noar0 - mosoar + 5 ] = noar; - noar0 = noar; - } - //attention: la derniere arete de la ligne fermee enveloppe - // devient en fait la premiere arete de cette ligne - // dans le chainage des aretes de la frontiere! - } - if( ierr != 0 ) goto ERREUR; - - aremin = sqrt( aremin ); //longueur minimale d'une arete des lignes fermees - aremax = sqrt( aremax ); //longueur maximale d'une arete - - aretmx = Min( aretmx, aremax ); //pour homogeneiser - MESSAGE("nutysu=" << nutysu << " aretmx=" << aretmx - << " arete min=" << aremin << " arete max=" << aremax); - - //chainage des aretes frontalieres : la derniere arete frontaliere - mnsoar[ mosoar * noar - mosoar + 5 ] = 0; - - //tous les sommets et aretes frontaliers sont numerotes de 1 a nbarfr - //reservation du tableau des numeros des 3 aretes de chaque triangle - //mnartr( moartr, mxartr ) - //En nombre: Triangles = Aretes Internes + Aretes Frontalieres - Sommets + 1-Trous - // 3Triangles = 2 Aretes internes + Aretes frontalieres - // d'ou 3T/2 < AI + AF => T < 3T/2 - Sommets + 1-Trous - //nombre de triangles < 2 ( nombre de sommets - 1 + nombre de trous ) - if( mnartr!=NULL ) delete [] mnartr; - mxartr = 2 * ( mxsomm + mxtrou ); - mnartr = new Z[moartr*mxartr]; - if( mnartr==NULL ) goto ERREUR; - - //Ajout des points internes - ns1 = nudslf[ nblf ]; - for (i=0; i redepart avec 2 fois plus de sommets - mxsomm = 2 * mxsomm; - ierr = 0; - goto NEWDEPART; - } - else - { - MESSAGE( "Triangulation non realisee " << ierr ); - if( ierr == 0 ) ierr=1; - goto NETTOYAGE; - } -} - - -void qualitetrte( R3 *mnpxyd, - Z & mosoar, Z & mxsoar, Z *mnsoar, - Z & moartr, Z & mxartr, Z *mnartr, - Z & nbtria, R & quamoy, R & quamin ) -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : calculer la qualite moyenne et minimale de la triangulation -// ----- actuelle definie par les tableaux mnsoar et mnartr -// entrees: -// -------- -// mnpxyd : tableau des coordonnees 2d des points -// par point : x y distance_souhaitee -// mosoar : nombre maximal d'entiers par arete et -// indice dans mnsoar de l'arete suivante dans le hachage -// mxsoar : nombre maximal d'aretes stockables dans le tableau mnsoar -// attention: mxsoar>3*mxsomm obligatoire! -// mnsoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -// chainage des aretes frontalieres, chainage du hachage des aretes -// hachage des aretes = mnsoar(1)+mnsoar(2)*2 -// avec mxsoar>=3*mxsomm -// une arete i de mnsoar est vide <=> mnsoar(1,i)=0 et -// mnsoar(2,arete vide)=l'arete vide qui precede -// mnsoar(3,arete vide)=l'arete vide qui suit -// moartr : nombre maximal d'entiers par arete du tableau mnartr -// mxartr : nombre maximal de triangles declarables -// mnartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -// arete1 = 0 si triangle vide => arete2 = triangle vide suivant -// sorties: -// -------- -// nbtria : nombre de triangles internes au domaine -// quamoy : qualite moyenne des triangles actuels -// quamin : qualite minimale des triangles actuels -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -{ - R d, aire, qualite; - Z nosotr[3], mn, nbtrianeg, nt; - - aire = 0; - quamoy = 0; - quamin = 2.0; - nbtria = 0; - nbtrianeg = 0; - - mn = -moartr; - for ( nt=1; nt<=mxartr; nt++ ) - { - mn += moartr; - if( mnartr[mn]!=0 ) - { - //un triangle occupe de plus - nbtria++; - - //le numero des 3 sommets du triangle nt - nusotr_( nt, mosoar, mnsoar, moartr, mnartr, nosotr ); - - //la qualite du triangle ns1 ns2 ns3 - qutr2d_( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1], - qualite ); - - //la qualite moyenne - quamoy += qualite; - - //la qualite minimale - quamin = Min( quamin, qualite ); - - //aire signee du triangle nt - d = surtd2_( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1] ); - if( d<0 ) - { - //un triangle d'aire negative de plus - nbtrianeg++; - MESSAGE("ATTENTION: le triangle " << nt << " de sommets:" - << nosotr[0] << " " << nosotr[1] << " " << nosotr[2] - << " a une aire " << d <<"<=0"); - } - - //aire des triangles actuels - aire += Abs(d); - } - } - - //les affichages - quamoy /= nbtria; - MESSAGE("Qualite moyenne=" << quamoy - << " Qualite minimale=" << quamin - << " des " << nbtria << " triangles de surface totale=" - << aire); - - if( nbtrianeg>0 ) - MESSAGE( "ATTENTION: nombre de triangles d'aire negative=" << nbtrianeg ); - return; -} diff --git a/src/MEFISTO2/aptrte.h b/src/MEFISTO2/aptrte.h deleted file mode 100755 index 531087700..000000000 --- a/src/MEFISTO2/aptrte.h +++ /dev/null @@ -1,255 +0,0 @@ -// SMESH MEFISTO2 : algorithm for meshing -// -// Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -// -// -// -// File : aptrte.h -// Author: Alain PERRONNET -// Module : SMESH - -#ifndef aptrte__h -#define aptrte__h - -#include // limites min max int long real ... -#include // gethostname, ... -#include -#include // pour cout cin ... -#include // pour le format des io setw, stx, setfill, ... -#include // pour les fonctions sur les chaines de caracteres -#include -#include -#include // pour les fonctions mathematiques -#include - -#include -#include - -void qualitetrte( R3 *mnpxyd, - Z & mosoar, Z & mxsoar, Z *mnsoar, - Z & moartr, Z & mxartr, Z *mnartr, - Z & nbtria, R & quamoy, R & quamin ); -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : calculer la qualite moyenne et minimale de la triangulation -// ----- actuelle definie par les tableaux nosoar et noartr -// entrees: -// -------- -// mnpxyd : tableau des coordonnees 2d des points -// par point : x y distance_souhaitee -// mosoar : nombre maximal d'entiers par arete et -// indice dans nosoar de l'arete suivante dans le hachage -// mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -// attention: mxsoar>3*mxsomm obligatoire! -// nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -// chainage des aretes frontalieres, chainage du hachage des aretes -// hachage des aretes = nosoar(1)+nosoar(2)*2 -// avec mxsoar>=3*mxsomm -// une arete i de nosoar est vide <=> nosoar(1,i)=0 et -// nosoar(2,arete vide)=l'arete vide qui precede -// nosoar(3,arete vide)=l'arete vide qui suit -// moartr : nombre maximal d'entiers par arete du tableau noartr -// mxartr : nombre maximal de triangles declarables -// noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -// arete1 = 0 si triangle vide => arete2 = triangle vide suivant -// sorties: -// -------- -// nbtria : nombre de triangles internes au domaine -// quamoy : qualite moyenne des triangles actuels -// quamin : qualite minimale des triangles actuels -// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - -void aptrte( Z nutysu, R aretmx, - Z nblf, Z *nudslf, R2 *uvslf, - Z nbpti, R2 *uvpti, - Z & nbst, R2 * & uvst, Z & nbt, Z * & nust, - Z & ierr ); -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : appel de la triangulation par un arbre-4 recouvrant -// ----- de triangles equilateraux -// le contour du domaine plan est defini par des lignes fermees -// la premiere ligne etant l'enveloppe de toutes les autres -// la fonction areteideale_(s,d) donne la taille d'arete -// au point s dans la direction d (direction inactive pour l'instant) -// des lors toute arete issue d'un sommet s devrait avoir une longueur -// comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d) -// -//Attention: -// Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques! -// De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee -// -// entrees: -// -------- -// nutysu : numero de traitement de areteideale_() selon le type de surface -// 0 pas d'emploi de la fonction areteideale_() et aretmx est active -// 1 il existe une fonction areteideale_(s,d) -// dont seules les 2 premieres composantes de uv sont actives -// ... autres options a definir ... -// aretmx : longueur maximale des aretes de la future triangulation -// nblf : nombre de lignes fermees de la surface -// nudslf : numero du dernier sommet de chacune des nblf lignes fermees -// nudslf(0)=0 pour permettre la difference sans test -// Attention le dernier sommet de chaque ligne est raccorde au premier -// tous les sommets et les points internes ont des coordonnees -// UV differentes <=> Pas de point double! -// uvslf : uv des nudslf(nblf) sommets des lignes fermees -// nbpti : nombre de points internes futurs sommets de la triangulation -// uvpti : uv des points internes futurs sommets de la triangulation -// -// sorties: -// -------- -// nbst : nombre de sommets de la triangulation finale -// uvst : coordonnees uv des nbst sommets de la triangulation -// nbt : nombre de triangles de la triangulation finale -// nust : 3 numeros dans uvst des sommets des nbt triangles -// ierr : 0 si pas d'erreur -// > 0 sinon -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -extern "C" { void tempscpu_( double & tempsec ); } -//Retourne le temps CPU utilise en secondes - -extern "C" { void deltacpu_( R & dtcpu ); } -//Retourne le temps CPU utilise en secondes depuis le precedent appel - -//initialiser le tableau mnsoar pour le hachage des aretes -extern "C" {void insoar_( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );} - -//mettre a zero les nb entiers de tab -extern "C" {void azeroi_( Z & nb, Z * tab );} - -extern "C" {void fasoar_( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst, - Z & noar, Z & ierr );} -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// but : former l'arete de sommet ns1-ns2 dans le hachage du tableau -// ----- nosoar des aretes de la triangulation -// entrees: -// -------- -// ns1 ns2: numero pxyd des 2 sommets de l'arete -// nt1 : numero du triangle auquel appartient l'arete -// nt1=-1 si numero inconnu -// nt2 : numero de l'eventuel second triangle de l'arete si connu -// nt2=-1 si numero inconnu -// nolign : numero de la ligne fermee de l'arete -// =0 si l'arete n'est une arete de ligne -// ce numero est ajoute seulement si l'arete est creee -// mosoar : nombre maximal d'entiers par arete du tableau nosoar -// mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -// modifies: -// --------- -// n1soar : numero de la premiere arete vide dans le tableau nosoar -// une arete i de nosoar est vide <=> nosoar(1,i)=0 -// chainage des aretes vides amont et aval -// l'arete vide qui precede=nosoar(4,i) -// l'arete vide qui suit =nosoar(5,i) -// nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -// chainage momentan'e d'aretes, chainage du hachage des aretes -// hachage des aretes = min( nosoar(1), nosoar(2) ) -// noarst : noarst(np) numero d'une arete du sommet np - -// ierr : si < 0 en entree pas d'affichage en cas d'erreur du type -// "arete appartenant a plus de 2 triangles et a creer!" -// si >=0 en entree affichage de ce type d'erreur -// sorties: -// -------- -// noar : >0 numero de l'arete retrouvee ou ajoutee -// ierr : =0 si pas d'erreur -// =1 si le tableau nosoar est sature -// =2 si arete a creer et appartenant a 2 triangles distincts -// des triangles nt1 et nt2 -// =3 si arete appartenant a 2 triangles distincts -// differents des triangles nt1 et nt2 -// =4 si arete appartenant a 2 triangles distincts -// dont le second n'est pas le triangle nt2 -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm -extern "C" {void teajte_( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi, - R & aretmx, Z & mxtree, Z * letree, - Z & ierr );} - - -extern "C" {void tehote_( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd, - R3 * comxmi, R & aretmx, - Z * letree, Z & mxqueu, Z * mnqueu, - Z & ierr );} -// homogeneisation de l'arbre des te a un saut de taille au plus -// prise en compte des tailles d'aretes souhaitees autour des sommets initiaux - -extern "C" {void tetrte_( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd, - Z & mxqueu, Z * mnqueu, Z * mntree, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, - Z & ierr );} -// trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets -// et des points de la frontiere, des points internes imposes interieurs - -extern "C" {void aisoar_( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );} - // formation du chainage 6 des aretes internes a echanger eventuellement - -extern "C" {void tedela_( R3 * mnpxyd, Z * mnarst, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );} - // boucle sur les aretes internes (non sur une ligne de la frontiere) - // avec echange des 2 diagonales afin de rendre la triangulation delaunay - -extern "C" {void terefr_( Z & nbarpi, R3 * mnpxyd, - Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, - Z & moartr, Z & n1artr, Z * mnartr, Z * mnarst, - Z & mxarcf, Z * mnarc1, Z * mnarc2, - Z * mnarc3, Z * mnarc4, - Z & n, Z & ierr );} -// detection des aretes frontalieres initiales perdues -// triangulation frontale pour les restaurer - -extern "C" {void tesuex_( Z & nblf, Z * nulftr, - Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig, - Z & mosoar, Z & mxsoar, Z * mnsoar, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst, - Z & nbtria, Z * mntrsu, Z & ierr );} -// suppression des triangles externes a la surface - -extern "C" {void teamqt_( Z & nutysu, - Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, - Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, - Z & mxarcf, Z * mntrcf, Z * mnstbo, - Z * n1arcf, Z * mnarcf, Z * mnarc1, - R3 * comxmi, Z & nbarpi, Z & nbsomm, Z & mxsomm, - R3 * mnpxyd, Z * mnslig, - Z & ierr );} -// amelioration de la qualite de la triangulation par -// barycentrage des sommets internes a la triangulation -// suppression des aretes trop longues ou trop courtes -// modification de la topologie des groupes de triangles -// mise en delaunay de la triangulation - -extern "C" {void nusotr_( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr, - Z * nosotr );} -//retrouver les numero des 3 sommets du triangle nt - -extern "C" {void qutr2d_( R3 & p1, R3 & p2, R3 & p3, R & qualite );} -//calculer la qualite d'un triangle de R2 de sommets p1, p2, p3 - -extern "C" { R surtd2_( R3 & p1, R3 & p2, R3 & p3 ); } -//calcul de la surface d'un triangle defini par 3 points de r**2 - -#endif diff --git a/src/MEFISTO2/areteideale.f b/src/MEFISTO2/areteideale.f deleted file mode 100755 index f0c8744ca..000000000 --- a/src/MEFISTO2/areteideale.f +++ /dev/null @@ -1,30 +0,0 @@ -c MEFISTO : library to compute 2D triangulation from segmented boundaries -c -c Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -c -c This library is free software; you can redistribute it and/or -c modify it under the terms of the GNU Lesser General Public -c License as published by the Free Software Foundation; either -c version 2.1 of the License. -c -c This library is distributed in the hope that it will be useful, -c but WITHOUT ANY WARRANTY; without even the implied warranty of -c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -c Lesser General Public License for more details. -c -c You should have received a copy of the GNU Lesser General Public -c License along with this library; if not, write to the Free Software -c Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -c -c See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -c -c -c File : areteideale.f -c Module : SMESH -c Author: Alain PERRONNET - - double precision function areteideale( xyz, direction ) - double precision xyz(3), direction(3) - areteideale = 10 - return - end diff --git a/src/MEFISTO2/trte.f b/src/MEFISTO2/trte.f deleted file mode 100755 index 8e0388b88..000000000 --- a/src/MEFISTO2/trte.f +++ /dev/null @@ -1,8332 +0,0 @@ -c MEFISTO : library to compute 2D triangulation from segmented boundaries -c -c Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris -c -c This library is free software; you can redistribute it and/or -c modify it under the terms of the GNU Lesser General Public -c License as published by the Free Software Foundation; either -c version 2.1 of the License. -c -c This library is distributed in the hope that it will be useful, -c but WITHOUT ANY WARRANTY; without even the implied warranty of -c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -c Lesser General Public License for more details. -c -c You should have received a copy of the GNU Lesser General Public -c License along with this library; if not, write to the Free Software -c Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -c -c See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr -c -c -c File : trte.f -c Module : SMESH -c Author: Alain PERRONNET - - subroutine qutr2d( p1, p2, p3, qualite ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer la qualite d'un triangle de r**2 -c ----- 2 coordonnees des 3 sommets en double precision -c -c entrees : -c --------- -c p1,p2,p3 : les 3 coordonnees des 3 sommets du triangle -c sens direct pour une surface et qualite >0 -c sorties : -c --------- -c qualite: valeur de la qualite du triangle entre 0 et 1 (equilateral) -c 1 etant la qualite optimale -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris janvier 1995 -c2345x7..............................................................012 - parameter ( d2uxr3 = 3.4641016151377544d0 ) -c d2uxr3 = 2 * sqrt(3) - double precision p1(2), p2(2), p3(2), qualite, a, b, c, p -c -c la longueur des 3 cotes - a = sqrt( (p2(1)-p1(1))**2 + (p2(2)-p1(2))**2 ) - b = sqrt( (p3(1)-p2(1))**2 + (p3(2)-p2(2))**2 ) - c = sqrt( (p1(1)-p3(1))**2 + (p1(2)-p3(2))**2 ) -c -c demi perimetre - p = (a+b+c) * 0.5d0 -c - if ( (a*b*c) .ne. 0d0 ) then -c critere : 2 racine(3) * rayon_inscrit / plus longue arete - qualite = d2uxr3 * sqrt( abs( (p-a) / p * (p-b) * (p-c) ) ) - % / max(a,b,c) - else - qualite = 0d0 - endif -c -c -c autres criteres possibles: -c critere : 2 * rayon_inscrit / rayon_circonscrit -c qualite = 8d0 * (p-a) * (p-b) * (p-c) / (a * b * c) -c -c critere : 3*sqrt(3.) * ray_inscrit / demi perimetre -c qualite = 3*sqrt(3.) * sqrt ((p-a)*(p-b)*(p-c) / p**3) -c -c critere : 2*sqrt(3.) * ray_inscrit / max( des aretes ) -c qualite = 2*sqrt(3.) * sqrt( (p-a)*(p-b)*(p-c) / p ) / max(a,b,c) - end - - - double precision function surtd2( p1 , p2 , p3 ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul de la surface d'un triangle defini par 3 points de R**2 -c ----- -c parametres d entree : -c --------------------- -c p1 p2 p3 : les 3 fois 2 coordonnees des sommets du triangle -c -c parametre resultat : -c -------------------- -c surtd2 : surface du triangle -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris fevrier 1992 -c2345x7..............................................................012 - double precision p1(2), p2(2), p3(2) -c -c la surface du triangle - surtd2 = ( ( p2(1)-p1(1) ) * ( p3(2)-p1(2) ) - % - ( p2(2)-p1(2) ) * ( p3(1)-p1(1) ) ) * 0.5d0 - end - - integer function nopre3( i ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : numero precedent i dans le sens circulaire 1 2 3 1 ... -c ----- -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - if( i .eq. 1 ) then - nopre3 = 3 - else - nopre3 = i - 1 - endif - end - - integer function nosui3( i ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : numero suivant i dans le sens circulaire 1 2 3 1 ... -c ----- -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - if( i .eq. 3 ) then - nosui3 = 1 - else - nosui3 = i + 1 - endif - end - - subroutine provec( v1 , v2 , v3 ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : v3 vecteur = produit vectoriel de 2 vecteurs de r ** 3 -c ----- -c entrees: -c -------- -c v1, v2 : les 2 vecteurs de 3 composantes -c -c sortie : -c -------- -c v3 : vecteur = v1 produit vectoriel v2 -cc++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : perronnet alain upmc analyse numerique paris mars 1987 -c2345x7..............................................................012 - double precision v1(3), v2(3), v3(3) -c - v3( 1 ) = v1( 2 ) * v2( 3 ) - v1( 3 ) * v2( 2 ) - v3( 2 ) = v1( 3 ) * v2( 1 ) - v1( 1 ) * v2( 3 ) - v3( 3 ) = v1( 1 ) * v2( 2 ) - v1( 2 ) * v2( 1 ) -c - return - end - - subroutine norme1( n, v, ierr ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : normalisation euclidienne a 1 d un vecteur v de n composantes -c ----- -c entrees : -c --------- -c n : nombre de composantes du vecteur -c -c modifie : -c --------- -c v : le vecteur a normaliser a 1 -c -c sortie : -c --------- -c ierr : 1 si la norme de v est egale a 0 -c 0 si pas d'erreur -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris mars 1987 -c ...................................................................... - double precision v( n ), s, sqrt -c - s = 0.0d0 - do 10 i=1,n - s = s + v( i ) * v( i ) - 10 continue -c -c test de nullite de la norme du vecteur -c -------------------------------------- - if( s .le. 0.0d0 ) then -c norme nulle du vecteur non normalisable a 1 - ierr = 1 - return - endif -c - s = 1.0d0 / sqrt( s ) - do 20 i=1,n - v( i ) = v ( i ) * s - 20 continue -c - ierr = 0 - end - - - subroutine insoar( mxsomm, mosoar, mxsoar, n1soar, nosoar ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : initialiser le tableau nosoar pour le hachage des aretes -c ----- -c -c entrees: -c -------- -c mxsomm : plus grand numero de sommet d'une arete au cours du calcul -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c avec mxsoar>=3*mxsomm -c -c sorties: -c -------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c chainage des aretes vides amont et aval -c l'arete vide qui precede=nosoar(4,i) -c l'arete vide qui suit =nosoar(5,i) -c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -c chainage momentan'e d'aretes, chainage du hachage des aretes -c hachage des aretes = min( nosoar(1), nosoar(2) ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - integer nosoar(mosoar,mxsoar) -c -c initialisation des aretes 1 a mxsomm - do 10 i=1,mxsomm -c -c sommet 1 = 0 <=> temoin d'arete vide pour le hachage - nosoar( 1, i ) = 0 -c -c arete sur aucune ligne - nosoar( 3, i ) = 0 -c -c la position de l'arete interne ou frontaliere est inconnue - nosoar( 6, i ) = -2 -c -c fin de chainage du hachage pas d'arete suivante - nosoar( mosoar, i ) = 0 -c - 10 continue -c -c la premiere arete vide chainee est la mxsomm+1 du tableau -c car ces aretes ne sont pas atteignables par le hachage direct - n1soar = mxsomm + 1 -c -c initialisation des aretes vides et des chainages - do 20 i = n1soar, mxsoar -c -c sommet 1 = 0 <=> temoin d'arete vide pour le hachage - nosoar( 1, i ) = 0 -c -c arete sur aucune ligne - nosoar( 3, i ) = 0 -c -c chainage sur l'arete vide qui precede -c (si arete occupee cela deviendra le no du triangle 1 de l'arete) - nosoar( 4, i ) = i-1 -c -c chainage sur l'arete vide qui suit -c (si arete occupee cela deviendra le no du triangle 2 de l'arete) - nosoar( 5, i ) = i+1 -c -c chainages des aretes frontalieres ou internes ou ... - nosoar( 6, i ) = -2 -c -c fin de chainage du hachage - nosoar( mosoar, i ) = 0 -c - 20 continue -c -c la premiere arete vide n'a pas de precedent - nosoar( 4, n1soar ) = 0 -c -c la derniere arete vide est mxsoar sans arete vide suivante - nosoar( 5, mxsoar ) = 0 - end - - - subroutine azeroi ( l , ntab ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : initialisation a zero d un tableau ntab de l variables entieres -c ----- -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris septembre 1988 -c23456---------------------------------------------------------------012 - integer ntab(l) - do 1 i = 1 , l - ntab( i ) = 0 - 1 continue - end - - - subroutine fasoar( ns1, ns2, nt1, nt2, nolign, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former l'arete de sommet ns1-ns2 dans le hachage du tableau -c ----- nosoar des aretes de la triangulation -c -c entrees: -c -------- -c ns1 ns2: numero pxyd des 2 sommets de l'arete -c nt1 : numero du triangle auquel appartient l'arete -c nt1=-1 si numero inconnu -c nt2 : numero de l'eventuel second triangle de l'arete si connu -c nt2=-1 si numero inconnu -c nolign : numero de la ligne de l'arete dans ladefi(wulftr-1+nolign) -c =0 si l'arete n'est une arete de ligne -c ce numero est ajoute seulement si l'arete est creee -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c chainage des aretes vides amont et aval -c l'arete vide qui precede=nosoar(4,i) -c l'arete vide qui suit =nosoar(5,i) -c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -c chainage momentan'e d'aretes, chainage du hachage des aretes -c hachage des aretes = min( nosoar(1), nosoar(2) ) -c noarst : noarst(np) numero d'une arete du sommet np -c -c ierr : si < 0 en entree pas d'affichage en cas d'erreur du type -c "arete appartenant a plus de 2 triangles et a creer!" -c si >=0 en entree affichage de ce type d'erreur -c -c sorties: -c -------- -c noar : >0 numero de l'arete retrouvee ou ajoutee -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si arete a creer et appartenant a 2 triangles distincts -c des triangles nt1 et nt2 -c =3 si arete appartenant a 2 triangles distincts -c differents des triangles nt1 et nt2 -c =4 si arete appartenant a 2 triangles distincts -c dont le second n'est pas le triangle nt2 -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,mxsoar), noarst(*) - integer nu2sar(2) -c -c ajout eventuel de l'arete s1 s2 dans nosoar - nu2sar(1) = ns1 - nu2sar(2) = ns2 -c -c hachage de l'arete de sommets nu2sar - call hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, noar ) -c en sortie: noar>0 => no arete retrouvee -c <0 => no arete ajoutee -c =0 => saturation du tableau nosoar -c - if( noar .eq. 0 ) then -c -c saturation du tableau nosoar - write(imprim,*) 'fasoar: tableau nosoar sature' - ierr = 1 - return -c - else if( noar .lt. 0 ) then -c -c l'arete a ete ajoutee. initialisation des autres informations - noar = -noar -c le numero de la ligne de l'arete - nosoar(3,noar) = nolign -c le triangle 1 de l'arete => le triangle nt1 - nosoar(4,noar) = nt1 -c le triangle 2 de l'arete => le triangle nt2 - nosoar(5,noar) = nt2 -c -c le sommet appartient a l'arete noar - noarst( nu2sar(1) ) = noar - noarst( nu2sar(2) ) = noar -c - else -c -c l'arete a ete retrouvee. -c si elle appartient a 2 triangles differents de nt1 et nt2 -c alors il y a une erreur - if( nosoar(4,noar) .gt. 0 .and. - % nosoar(5,noar) .gt. 0 ) then - if( nosoar(4,noar) .ne. nt1 .and. - % nosoar(4,noar) .ne. nt2 .or. - % nosoar(5,noar) .ne. nt1 .and. - % nosoar(5,noar) .ne. nt2 ) then -c arete appartenant a plus de 2 triangles => erreur - if( ierr .ge. 0 ) then - write(imprim,*) 'erreur fasoar: arete ',noar, - % ' dans 2 triangles et a creer!' - endif - ierr = 2 - return - endif - endif -c -c mise a jour du numero des triangles de l'arete noar -c le triangle 2 de l'arete => le triangle nt1 - if( nosoar(4,noar) .lt. 0 ) then -c pas de triangle connu pour cette arete - n = 4 - else -c deja un triangle connu. ce nouveau est le second - if( nosoar(5,noar) .gt. 0 .and. nt1 .gt. 0 .and. - % nosoar(5,noar) .ne. nt1 ) then -c arete appartenant a plus de 2 triangles => erreur - write(imprim,*) 'erreur fasoar: arete ',noar, - % ' dans plus de 2 triangles' - ierr = 3 - return - endif - n = 5 - endif - nosoar(n,noar) = nt1 -c -c cas de l'arete frontaliere retrouvee comme diagonale d'un quadrangle - if( nt2 .gt. 0 ) then -c l'arete appartient a 2 triangles - if( nosoar(5,noar) .gt. 0 .and. - % nosoar(5,noar) .ne. nt2 ) then -c arete appartenant a plus de 2 triangles => erreur - write(imprim,*) 'erreur fasoar: arete ',noar, - % ' dans plus de 2 triangles' - ierr = 4 - return - endif - nosoar(5,noar) = nt2 - endif -c - endif -c -c pas d'erreur - ierr = 0 - end - - subroutine fq1inv( x, y, s, xc, yc, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul des 2 coordonnees (xc,yc) dans le carre (0,1) -c ----- image par f:carre unite-->quadrangle appartenant a q1**2 -c par une resolution directe due a nicolas thenault -c -c entrees: -c -------- -c x,y : coordonnees du point image dans le quadrangle de sommets s -c s : les 2 coordonnees des 4 sommets du quadrangle -c -c sorties: -c -------- -c xc,yc : coordonnees dans le carre dont l'image par f vaut (x,y) -c ierr : 0 si calcul sans erreur, 1 si quadrangle degenere -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteurs: thenault tulenew analyse numerique paris janvier 1998 -c modifs : perronnet alain analyse numerique paris janvier 1998 -c234567..............................................................012 - real s(1:2,1:4), dist(2) - double precision a,b,c,d,alpha,beta,gamma,delta,x0,y0,t(2),u,v,w -c - a = s(1,1) - b = s(1,2) - s(1,1) - c = s(1,4) - s(1,1) - d = s(1,1) - s(1,2) + s(1,3) - s(1,4) -c - alpha = s(2,1) - beta = s(2,2) - s(2,1) - gamma = s(2,4) - s(2,1) - delta = s(2,1) - s(2,2) + s(2,3) - s(2,4) -c - u = beta * c - b * gamma - if( u .eq. 0 ) then -c quadrangle degenere - ierr = 1 - return - endif - v = delta * c - d * gamma - w = b * delta - beta * d -c - x0 = c * (y-alpha) - gamma * (x-a) - y0 = b * (y-alpha) - beta * (x-a) -c - a = v * w - b = u * u - w * x0 - v * y0 - c = x0 * y0 -c - if( a .ne. 0 ) then -c - delta = sqrt( b*b-4*a*c ) - if( b .ge. 0.0 ) then - t(2) = -b - delta - else - t(2) = -b + delta - endif -c la racine de plus grande valeur absolue -c (elle donne le plus souvent le point exterieur au carre unite -c donc a tester en second pour reduire les calculs) - t(2) = t(2) / ( 2 * a ) -c calcul de la seconde racine a partir de la somme => plus stable - t(1) = - b/a - t(2) -c - do 10 i=1,2 -c -c la solution i donne t elle un point interne au carre unite? - xc = ( x0 - v * t(i) ) / u - yc = ( w * t(i) - y0 ) / u - if( 0.0 .le. xc .and. xc .le. 1.0 ) then - if( 0.0 .le. yc .and. yc .le. 1.0 ) goto 9000 - endif -c -c le point (xc,yc) n'est pas dans le carre unite -c cela peut etre du aux erreurs d'arrondi -c => choix par le minimum de la distance aux bords du carre - dist(i) = max( 0.0, -xc, xc-1.0, -yc, yc-1.0 ) -c - 10 continue -c - if( dist(1) .gt. dist(2) ) then -c f(xc,yc) pour la racine 2 est plus proche de x,y -c xc yc sont deja calcules - goto 9000 - endif -c - else if ( b .ne. 0 ) then - t(1) = - c / b - else - t(1) = 0 - endif -c -c les 2 coordonnees du point dans le carre unite - xc = ( x0 - v * t(1) ) / u - yc = ( w * t(1) - y0 ) / u -c - 9000 ierr = 0 - return - end - - - subroutine ptdatr( point, pxyd, nosotr, nsigne ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : le point est il dans le triangle de sommets nosotr -c ----- -c -c entrees: -c -------- -c point : les 2 coordonnees du point -c pxyd : les 2 coordonnees et distance souhaitee des points du maillage -c nosotr : le numero des 3 sommets du triangle -c -c sorties: -c -------- -c nsigne : >0 si le point est dans le triangle ou sur une des 3 aretes -c =0 si le triangle est degenere ou indirect ou ne contient pas le poin -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - integer nosotr(3) - double precision point(2), pxyd(3,*) - double precision xp,yp, x1,x2,x3, y1,y2,y3, d,dd, cb1,cb2,cb3 -c - xp = point( 1 ) - yp = point( 2 ) -c - n1 = nosotr( 1 ) - x1 = pxyd( 1 , n1 ) - y1 = pxyd( 2 , n1 ) -c - n2 = nosotr( 2 ) - x2 = pxyd( 1 , n2 ) - y2 = pxyd( 2 , n2 ) -c - n3 = nosotr( 3 ) - x3 = pxyd( 1 , n3 ) - y3 = pxyd( 2 , n3 ) -c -c 2 fois la surface du triangle = determinant de la matrice -c de calcul des coordonnees barycentriques du point p - d = ( x2 - x1 ) * ( y3 - y1 ) - ( x3 - x1 ) * ( y2 - y1 ) -c - if( d .gt. 0 ) then -c -c triangle non degenere -c ===================== -c calcul des 3 coordonnees barycentriques du -c point xp yp dans le triangle - cb1 = ( ( x2-xp ) * ( y3-yp ) - ( x3-xp ) * ( y2-yp ) ) / d - cb2 = ( ( x3-xp ) * ( y1-yp ) - ( x1-xp ) * ( y3-yp ) ) / d - cb3 = 1d0 - cb1 -cb2 -ccc cb3 = ( ( x1-xp ) * ( y2-yp ) - ( x2-xp ) * ( y1-yp ) ) / d -c -ccc if( cb1 .ge. -0.00005d0 .and. cb1 .le. 1.00005d0 .and. - if( cb1 .ge. 0d0 .and. cb1 .le. 1d0 .and. - % cb2 .ge. 0d0 .and. cb2 .le. 1d0 .and. - % cb3 .ge. 0d0 .and. cb3 .le. 1d0 ) then -c -c le triangle nosotr contient le point - nsigne = 1 - else - nsigne = 0 - endif -c - else -c -c triangle degenere -c ================= -c le point est il du meme cote que le sommet oppose de chaque arete? - nsigne = 0 - do 10 i=1,3 -c le sinus de l'angle p1 p2-p1 point - x1 = pxyd(1,n1) - y1 = pxyd(2,n1) - d = ( pxyd(1,n2) - x1 ) * ( point(2) - y1 ) - % - ( pxyd(2,n2) - y1 ) * ( point(1) - x1 ) - dd = ( pxyd(1,n2) - x1 ) * ( pxyd(2,n3) - y1 ) - % - ( pxyd(2,n2) - y1 ) * ( pxyd(1,n3) - x1 ) - cb1 = ( pxyd(1,n2) - x1 ) ** 2 - % + ( pxyd(2,n2) - y1 ) ** 2 - cb2 = ( point(1) - x1 ) ** 2 - % + ( point(2) - y1 ) ** 2 - cb3 = ( pxyd(1,n3) - x1 ) ** 2 - % + ( pxyd(2,n3) - y1 ) ** 2 - if( abs( dd ) .le. 1e-4 * sqrt( cb1 * cb3 ) ) then -c le point 3 est sur l'arete 1-2 -c le point doit y etre aussi - if( abs( d ) .le. 1e-4 * sqrt( cb1 * cb2 ) ) then -c point sur l'arete - nsigne = nsigne + 1 - endif - else -c le point 3 n'est pas sur l'arete . test des signes - if( d * dd .ge. 0 ) then - nsigne = nsigne + 1 - endif - endif -c permutation circulaire des 3 sommets et aretes - n = n1 - n1 = n2 - n2 = n3 - n3 = n - 10 continue - if( nsigne .ne. 3 ) nsigne = 0 - endif - end - - integer function nosstr( p, pxyd, nt, letree ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le numero 0 a 3 du sous-triangle te contenant -c ----- le point p -c -c entrees: -c -------- -c p : point de r**2 contenu dans le te nt de letree -c pxyd : x y distance des points -c nt : numero letree du te de te voisin a calculer -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 Â…a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c nosstr : 0 si le sous-triangle central contient p -c i =1,2,3 numero du sous-triangle contenant p -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - double precision pxyd(3,*), p(2), - % x1, y1, x21, y21, x31, y31, d, xe, ye -c -c le numero des 3 sommets du triangle - ns1 = letree( 6, nt ) - ns2 = letree( 7, nt ) - ns3 = letree( 8, nt ) -c -c les coordonnees entre 0 et 1 du point p - x1 = pxyd(1,ns1) - y1 = pxyd(2,ns1) -c - x21 = pxyd(1,ns2) - x1 - y21 = pxyd(2,ns2) - y1 -c - x31 = pxyd(1,ns3) - x1 - y31 = pxyd(2,ns3) - y1 -c - d = 1.0 / ( x21 * y31 - x31 * y21 ) -c - xe = ( ( p(1) - x1 ) * y31 - ( p(2) - y1 ) * x31 ) * d - ye = ( ( p(2) - y1 ) * x21 - ( p(1) - x1 ) * y21 ) * d -c - if( xe .gt. 0.5d0 ) then -c sous-triangle droit - nosstr = 2 - else if( ye .gt. 0.5d0 ) then -c sous-triangle haut - nosstr = 3 - else if( xe+ye .lt. 0.5d0 ) then -c sous-triangle gauche - nosstr = 1 - else -c sous-triangle central - nosstr = 0 - endif - end - - - integer function notrpt( p, pxyd, notrde, letree ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le numero letree du sous-triangle feuille contenant -c ----- le point p a partir du te notrde de letree -c -c entrees: -c -------- -c p : point de r**2 contenu dans le te nt de letree -c pxyd : x y distance des points -c notrde : numero letree du triangle depart de recherche (1=>racine) -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 Â… 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c notrpt : numero letree du triangle contenant le point p -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - double precision pxyd(1:3,*), p(2) -c -c la racine depart de la recherche - notrpt = notrde -c -c tant que la feuille n'est pas atteinte descendre l'arbre - 10 if( letree(0,notrpt) .gt. 0 ) then -c -c recherche du sous-triangle contenant p - nsot = nosstr( p, pxyd, notrpt, letree ) -c -c le numero letree du sous-triangle - notrpt = letree( nsot, notrpt ) - goto 10 -c - endif - end - - - subroutine teajpt( ns, nbsomm, mxsomm, pxyd, letree, - & ntrp, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajout du point ns de pxyd dans letree -c ----- -c -c entrees: -c -------- -c ns : numero du point a ajouter dans letree -c mxsomm : nombre maximal de points declarables dans pxyd -c pxyd : tableau des coordonnees des points -c par point : x y distance_souhaitee -c -c modifies : -c ---------- -c nbsomm : nombre actuel de points dans pxyd -c -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 Â…a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c ntrp : numero letree du triangle te ou a ete ajoute le point -c ierr : 0 si pas d'erreur, 51 saturation letree, 52 saturation pxyd -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - double precision pxyd(3,mxsomm) -c -c depart de la racine - ntrp = 1 -c -c recherche du triangle contenant le point pxyd(ns) - 1 ntrp = notrpt( pxyd(1,ns), pxyd, ntrp, letree ) -c -c existe t il un point libre - do 10 i=0,3 - if( letree(i,ntrp) .eq. 0 ) then -c la place i est libre - letree(i,ntrp) = -ns - return - endif - 10 continue -c -c pas de place libre => 4 sous-triangles sont crees -c a partir des 3 milieux des aretes - call te4ste( nbsomm, mxsomm, pxyd, ntrp, letree, ierr ) - if( ierr .ne. 0 ) return -c -c ajout du point ns - goto 1 - end - - subroutine n1trva( nt, lar, letree, notrva, lhpile ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le numero letree du triangle voisin du te nt -c ----- par l'arete lar (1 a 3 ) de nt -c attention : notrva n'est pas forcement minimal -c -c entrees: -c -------- -c nt : numero letree du te de te voisin a calculer -c lar : numero 1 a 3 de l'arete du triangle nt -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur-triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c notrva : >0 numero letree du te voisin par l'arete lar -c =0 si pas de te voisin (racine , ... ) -c lhpile : =0 si nt et notrva ont meme taille -c >0 nt est 4**lhpile fois plus petit que notrva -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - integer letree(0:8,0:*) - integer lapile(1:64) -c -c initialisation de la pile -c le triangle est empile - lapile(1) = nt - lhpile = 1 -c -c tant qu'il existe un sur-triangle - 10 ntr = lapile( lhpile ) - if( ntr .eq. 1 ) then -c racine atteinte => pas de triangle voisin - notrva = 0 - lhpile = lhpile - 1 - return - endif -c -c le type du triangle ntr - nty = letree( 5, ntr ) -c l'eventuel sur-triangle - nsut = letree( 4, ntr ) -c - if( nty .eq. 0 ) then -c -c triangle de type 0 => triangle voisin de type precedent(lar) -c dans le sur-triangle de ntr -c ce triangle remplace ntr dans lapile - lapile( lhpile ) = letree( nopre3(lar), nsut ) - goto 20 - endif -c -c triangle ntr de type nty>0 - if( nosui3(nty) .eq. lar ) then -c -c le triangle voisin par lar est le triangle 0 - lapile( lhpile ) = letree( 0, nsut ) - goto 20 - endif -c -c triangle sans voisin direct => passage par le sur-triangle - if( nsut .eq. 0 ) then -c -c ntr est la racine => pas de triangle voisin par cette arete - notrva = 0 - return - else -c -c le sur-triangle est empile - lhpile = lhpile + 1 - lapile(lhpile) = nsut - goto 10 - endif -c -c descente aux sous-triangles selon la meme arete - 20 notrva = lapile( lhpile ) -c - 30 lhpile = lhpile - 1 - if( letree(0,notrva) .le. 0 ) then -c le triangle est une feuille de l'arbre 0 sous-triangle -c lhpile = nombre de differences de niveaux dans l'arbre - return - else -c le triangle a 4 sous-triangles - if( lhpile .gt. 0 ) then -c -c bas de pile non atteint - nty = letree( 5, lapile(lhpile) ) - if( nty .eq. lar ) then -c l'oppose est suivant(nty) de notrva - notrva = letree( nosui3(nty) , notrva ) - else -c l'oppose est precedent(nty) de notrva - notrva = letree( nopre3(nty) , notrva ) - endif - goto 30 - endif - endif -c -c meme niveau dans l'arbre lhpile = 0 - end - - - subroutine cenced( xy1, xy2, xy3, cetria, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul des coordonnees du centre du cercle circonscrit -c ----- du triangle defini par ses 3 sommets de coordonnees -c xy1 xy2 xy3 ainsi que le carre du rayon de ce cercle -c -c entrees : -c --------- -c xy1 xy2 xy3 : les 2 coordonnees des 3 sommets du triangle -c ierr : <0 => pas d'affichage si triangle degenere -c >=0 => affichage si triangle degenere -c -c sortie : -c -------- -c cetria : cetria(1)=abcisse du centre -c cetria(2)=ordonnee du centre -c cetria(3)=carre du rayon 1d28 si triangle degenere -c ierr : 0 si triangle non degenere -c 1 si triangle degenere -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : perronnet alain upmc analyse numerique paris juin 1995 -c2345x7..............................................................012 - parameter (epsurf=1d-7) - common / unites / lecteu,imprim,nunite(30) - double precision x1,y1,x21,y21,x31,y31, - % aire2,xc,yc,rot, - % xy1(2),xy2(2),xy3(2),cetria(3) -c -c le calcul de 2 fois l'aire du triangle -c attention l'ordre des 3 sommets est direct ou non - x1 = xy1(1) - x21 = xy2(1) - x1 - x31 = xy3(1) - x1 -c - y1 = xy1(2) - y21 = xy2(2) - y1 - y31 = xy3(2) - y1 -c - aire2 = x21 * y31 - x31 * y21 -c -c recherche d'un test relatif peu couteux -c pour reperer la degenerescence du triangle - if( abs(aire2) .le. - % epsurf*(abs(x21)+abs(x31))*(abs(y21)+abs(y31)) ) then -c triangle de qualite trop faible - if( ierr .ge. 0 ) then -c nblgrc(nrerr) = 1 -c kerr(1) = 'erreur cenced: triangle degenere' -c call lereur - write(imprim,*) 'erreur cenced: triangle degenere' - write(imprim,10000) xy1,xy2,xy3,aire2 - endif -10000 format( 3(' x=',g24.16,' y=',g24.16/),' aire*2=',g24.16) - cetria(1) = 0d0 - cetria(2) = 0d0 - cetria(3) = 1d28 - ierr = 1 - return - endif -c -c les 2 coordonnees du centre intersection des 2 mediatrices -c x = (x1+x2)/2 + lambda * (y2-y1) -c y = (y1+y2)/2 - lambda * (x2-x1) -c x = (x1+x3)/2 + rot * (y3-y1) -c y = (y1+y3)/2 - rot * (x3-x1) -c ========================================================== - rot = ((xy2(1)-xy3(1))*x21 + (xy2(2)-xy3(2))*y21) / (2 * aire2) -c - xc = ( x1 + xy3(1) ) * 0.5d0 + rot * y31 - yc = ( y1 + xy3(2) ) * 0.5d0 - rot * x31 -c - cetria(1) = xc - cetria(2) = yc -c -c le carre du rayon - cetria(3) = (x1-xc) ** 2 + (y1-yc) ** 2 -c -c pas d'erreur rencontree - ierr = 0 - end - - - double precision function angled( p1, p2, p3 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer l'angle (p1p2,p1p3) en radians -c ----- -c -c entrees : -c --------- -c p1,p2,p3 : les 2 coordonnees des 3 sommets de l'angle -c sens direct pour une surface >0 -c sorties : -c --------- -c angled : angle (p1p2,p1p3) en radians entre [0 et 2pi] -c 0 si p1=p2 ou p1=p3 -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris fevrier 1992 -c2345x7..............................................................012 - double precision p1(2),p2(2),p3(2),x21,y21,x31,y31,a1,a2,d,c -c -c les cotes - x21 = p2(1) - p1(1) - y21 = p2(2) - p1(2) - x31 = p3(1) - p1(1) - y31 = p3(2) - p1(2) -c -c longueur des cotes - a1 = x21 * x21 + y21 * y21 - a2 = x31 * x31 + y31 * y31 - d = sqrt( a1 * a2 ) - if( d .eq. 0 ) then - angled = 0 - return - endif -c -c cosinus de l'angle - c = ( x21 * x31 + y21 * y31 ) / d - if( c .le. -1.d0 ) then -c tilt sur apollo si acos( -1 -eps ) - angled = atan( 1.d0 ) * 4.d0 - return - else if( c .ge. 1.d0 ) then -c tilt sur apollo si acos( 1 + eps ) - angled = 0 - return - endif -c - angled = acos( c ) - if( x21 * y31 - x31 * y21 .lt. 0 ) then -c demi plan inferieur - angled = 8.d0 * atan( 1.d0 ) - angled - endif - end - - - subroutine teajte( mxsomm, nbsomm, pxyd, comxmi, - % aretmx, mxtree, letree, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : initialisation des tableaux letree -c ----- ajout des sommets 1 a nbsomm (valeur en entree) dans letree -c -c entrees: -c -------- -c mxsomm : nombre maximal de sommets permis pour la triangulation -c mxtree : nombre maximal de triangles equilateraux (te) declarables -c aretmx : longueur maximale des aretes des triangles equilateraux -c -c entrees et sorties : -c -------------------- -c nbsomm : nombre de sommets apres identification -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c tableau reel(3,mxsomm) -c -c sorties: -c -------- -c comxmi : coordonnees minimales et maximales des points frontaliers -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c ierr : 0 si pas d'erreur -c 51 saturation letree -c 52 saturation pxyd -c 7 tous les points sont alignes -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juillet 1994 -c....................................................................012 - integer letree(0:8,0:mxtree) - double precision pxyd(3,mxsomm) - double precision comxmi(3,2) - double precision a(2),s,aretmx,rac3 -c -c protection du nombre de sommets avant d'ajouter ceux de tetree - nbsofr = nbsomm - do 1 i = 1, nbsomm - comxmi(1,1) = min( comxmi(1,1), pxyd(1,i) ) - comxmi(1,2) = max( comxmi(1,2), pxyd(1,i) ) - comxmi(2,1) = min( comxmi(2,1), pxyd(2,i) ) - comxmi(2,2) = max( comxmi(2,2), pxyd(2,i) ) - 1 continue -c -c creation de l'arbre tee -c ======================= -c la premiere colonne vide de letree - letree(0,0) = 2 -c chainage des te vides - do 4 i = 2 , mxtree - letree(0,i) = i+1 - 4 continue - letree(0,mxtree) = 0 -c les maxima des 2 indices de letree - letree(1,0) = 8 - letree(2,0) = mxtree -c -c la racine -c aucun point interne au triangle equilateral (te) 1 - letree(0,1) = 0 - letree(1,1) = 0 - letree(2,1) = 0 - letree(3,1) = 0 -c pas de sur-triangle - letree(4,1) = 0 - letree(5,1) = 0 -c le numero pxyd des 3 sommets du te 1 - letree(6,1) = nbsomm + 1 - letree(7,1) = nbsomm + 2 - letree(8,1) = nbsomm + 3 -c -c calcul de la largeur et hauteur du rectangle englobant -c ====================================================== - a(1) = comxmi(1,2) - comxmi(1,1) - a(2) = comxmi(2,2) - comxmi(2,1) -c la longueur de la diagonale - s = sqrt( a(1)**2 + a(2)**2 ) - do 60 k=1,2 - if( a(k) .lt. 1e-4 * s ) then -c nblgrc(nrerr) = 1 - write(imprim,*) 'tous les points sont alignes' -c call lereur - ierr = 7 - return - endif - 60 continue -c -c le maximum des ecarts - s = s + s -c -c le triangle equilateral englobant -c ================================= -c ecart du rectangle au triangle equilateral - rac3 = sqrt( 3.0d0 ) - arete = a(1) + 2 * aretmx + 2 * ( a(2) + aretmx ) / rac3 -c -c le point nbsomm + 1 en bas a gauche - nbsomm = nbsomm + 1 - pxyd(1,nbsomm) = (comxmi(1,1)+comxmi(1,2))*0.5d0 - arete*0.5d0 - pxyd(2,nbsomm) = comxmi(2,1) - aretmx - pxyd(3,nbsomm) = s -c -c le point nbsomm + 2 en bas a droite - nbsomm = nbsomm + 1 - pxyd(1,nbsomm) = pxyd(1,nbsomm-1) + arete - pxyd(2,nbsomm) = pxyd(2,nbsomm-1) - pxyd(3,nbsomm) = s -c -c le point nbsomm + 3 sommet au dessus - nbsomm = nbsomm + 1 - pxyd(1,nbsomm) = pxyd(1,nbsomm-2) + arete * 0.5d0 - pxyd(2,nbsomm) = pxyd(2,nbsomm-2) + arete * 0.5d0 * rac3 - pxyd(3,nbsomm) = s -c -c ajout des sommets des lignes pour former letree -c =============================================== - do 150 i=1,nbsofr -c ajout du point i de pxyd a letree - call teajpt( i, nbsomm, mxsomm, pxyd, letree, - & nt, ierr ) - if( ierr .ne. 0 ) return - 150 continue -c - return - end - - - subroutine tetaid( nutysu, dx, dy, longai, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer la longueur de l'arete ideale en dx,dy -c ----- -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale(xyz,xyzdir) -c ... autres options a definir ... -c dx, dy : abscisse et ordonnee dans le plan du point (reel2!) -c -c sorties: -c -------- -c longai : longueur de l'areteideale(xyz,xyzdir) autour du point xyz -c ierr : 0 si pas d'erreur, <>0 sinon -c 1 calcul incorrect de areteideale(xyz,xyzdir) -c 2 longueur calculee nulle -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) -c - double precision areteideale - double precision dx, dy, longai - double precision xyz(3), xyzd(3), d0 -c - ierr = 0 - if( nutysu .gt. 0 ) then - d0 = longai -c le point ou se calcule la longueur - xyz(1) = dx - xyz(2) = dy -c z pour le calcul de la longueur (inactif ici!) - xyz(3) = 0d0 -c la direction pour le calcul de la longueur (inactif ici!) - xyzd(1) = 0d0 - xyzd(2) = 0d0 - xyzd(3) = 0d0 - - longai = areteideale(xyz,xyzd) - if( longai .lt. 0d0 ) then - write(imprim,10000) xyz -10000 format('attention: longueur de areteideale(', - % g14.6,',',g14.6,',',g14.6,')<=0! => rendue >0' ) - longai = -longai - endif - if( longai .eq. 0d0 ) then - write(imprim,10001) xyz -10001 format('erreur: longueur de areteideale(', - % g14.6,',',g14.6,',',g14.6,')=0!' ) - ierr = 2 - longai = d0 - endif - endif - end - - - subroutine tehote( nutysu, - % nbarpi, mxsomm, nbsomm, pxyd, - % comxmi, aretmx, - % letree, mxqueu, laqueu, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : homogeneisation de l'arbre des te a un saut de taille au plus -c ----- prise en compte des distances souhaitees autour des sommets initiaux -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c nbarpi : nombre de sommets de la frontiere + nombre de points internes -c imposes par l'utilisateur -c mxsomm : nombre maximal de sommets permis pour la triangulation et te -c mxqueu : nombre d'entiers utilisables dans laqueu -c comxmi : minimum et maximum des coordonnees de l'objet -c aretmx : longueur maximale des aretes des triangles equilateraux -c permtr : perimetre de la ligne enveloppe dans le plan -c avant mise a l'echelle a 2**20 -c -c modifies : -c ---------- -c nbsomm : nombre de sommets apres identification -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(1,0) : maximum du 1-er indice de letree (ici 8) -c letree(2,0) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c auxiliaire : -c ------------ -c laqueu : mxqueu entiers servant de queue pour le parcours de letree -c -c sorties: -c -------- -c ierr : 0 si pas d'erreur -c 51 si saturation letree dans te4ste -c 52 si saturation pxyd dans te4ste -c >0 si autre erreur -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc avril 1997 -c2345x7..............................................................012 - double precision ampli - parameter (ampli=1.34d0) - common / unites / lecteu, imprim, intera, nunite(29) -c - double precision pxyd(3,mxsomm), d2, aretm2 - double precision comxmi(3,2),aretmx,a,s,xrmin,xrmax,yrmin,yrmax - double precision dmin, dmax - integer letree(0:8,0:*) -c - integer laqueu(1:mxqueu),lequeu -c lequeu : entree dans la queue -c lhqueu : longueur de la queue -c gestion circulaire -c - integer nuste(3) - equivalence (nuste(1),ns1),(nuste(2),ns2),(nuste(3),ns3) -c -c existence ou non de la fonction 'taille_ideale' des aretes -c autour du point. ici la carte est supposee isotrope -c ========================================================== -c attention: si la fonction taille_ideale existe -c alors pxyd(3,*) est la taille_ideale dans l'espace initial -c sinon pxyd(3,*) est la distance calculee dans le plan par -c propagation a partir des tailles des aretes de la frontiere -c - if( nutysu .gt. 0 ) then -c -c la fonction taille_ideale(x,y,z) existe -c --------------------------------------- -c initialisation de la distance souhaitee autour des points 1 a nbsomm - do 1 i=1,nbsomm -c calcul de pxyzd(3,i) - call tetaid( nutysu, pxyd(1,i), pxyd(2,i), - % pxyd(3,i), ierr ) - if( ierr .ne. 0 ) goto 9999 - 1 continue -c - else -c -c la fonction taille_ideale(x,y,z) n'existe pas -c --------------------------------------------- -c prise en compte des distances souhaitees dans le plan -c autour des points frontaliers et des points internes imposes -c toutes les autres distances souhaitees ont ete mis a aretmx -c lors de l'execution du sp teqini - do 3 i=1,nbarpi -c le sommet i n'est pas un sommet de letree => sommet frontalier -c recherche du sous-triangle minimal feuille contenant le point i - nte = 1 - 2 nte = notrpt( pxyd(1,i), pxyd, nte, letree ) -c la distance au sommet le plus eloigne est elle inferieure -c a la distance souhaitee? - ns1 = letree(6,nte) - ns2 = letree(7,nte) - ns3 = letree(8,nte) - d2 = max( ( pxyd(1,i)-pxyd(1,ns1) )**2 + - % ( pxyd(2,i)-pxyd(2,ns1) )**2 - % , ( pxyd(1,i)-pxyd(1,ns2) )**2 + - % ( pxyd(2,i)-pxyd(2,ns2) )**2 - % , ( pxyd(1,i)-pxyd(1,ns3) )**2 + - % ( pxyd(2,i)-pxyd(2,ns3) )**2 ) - if( d2 .gt. pxyd(3,i)**2 ) then -c le triangle nte trop grand doit etre subdivise en 4 sous-triangle - call te4ste( nbsomm, mxsomm, pxyd, nte, letree, - & ierr ) - if( ierr .ne. 0 ) return - goto 2 - endif - 3 continue - endif -c -c le sous-triangle central de la racine est decoupe systematiquement -c ================================================================== - nte = 2 - if( letree(0,2) .le. 0 ) then -c le sous-triangle central de la racine n'est pas subdivise -c il est donc decoupe en 4 soustriangles - nbsom0 = nbsomm - call te4ste( nbsomm, mxsomm, pxyd, nte, letree, - % ierr ) - if( ierr .ne. 0 ) return - do 4 i=nbsom0+1,nbsomm -c mise a jour de taille_ideale des nouveaux sommets de te - call tetaid( nutysu, pxyd(1,i), pxyd(2,i), pxyd(3,i), ierr ) - if( ierr .ne. 0 ) goto 9999 - 4 continue - endif -c -c le carre de la longueur de l'arete de triangles equilateraux -c souhaitee pour le fond de la triangulation - aretm2 = (aretmx*ampli) ** 2 -c -c tout te contenu dans le rectangle englobant doit avoir un -c cote < aretmx et etre de meme taille que les te voisins -c s'il contient un point; sinon un seul saut de taille est permis -c =============================================================== -c le rectangle englobant pour selectionner les te "internes" -c le numero des 3 sommets du te englobant racine de l'arbre des te - ns1 = letree(6,1) - ns2 = letree(7,1) - ns3 = letree(8,1) - a = aretmx * 0.01d0 -c abscisse du milieu de l'arete gauche du te 1 - s = ( pxyd(1,ns1) + pxyd(1,ns3) ) / 2 - xrmin = min( s, comxmi(1,1) - aretmx ) - a -c abscisse du milieu de l'arete droite du te 1 - s = ( pxyd(1,ns2) + pxyd(1,ns3) ) / 2 - xrmax = max( s, comxmi(1,2) + aretmx ) + a - yrmin = comxmi(2,1) - aretmx -c ordonnee de la droite passant par les milieus des 2 aretes -c droite gauche du te 1 - s = ( pxyd(2,ns1) + pxyd(2,ns3) ) / 2 - yrmax = max( s, comxmi(2,2) + aretmx ) + a -c -c cas particulier de 3 ou 4 ou peu d'aretes frontalieres - if( nbarpi .le. 8 ) then -c tout le triangle englobant (racine) est a prendre en compte - xrmin = pxyd(1,ns1) - a - xrmax = pxyd(1,ns2) + a - yrmin = pxyd(2,ns1) - a - yrmax = pxyd(2,ns3) + a - endif -c - nbs0 = nbsomm - nbiter = -1 -c -c initialisation de la queue - 5 nbiter = nbiter + 1 - lequeu = 1 - lhqueu = 0 -c la racine de letree initialise la queue - laqueu(1) = 1 -c -c tant que la longueur de la queue est >=0 traiter le debut de queue - 10 if( lhqueu .ge. 0 ) then -c -c le triangle te a traiter - i = lequeu - lhqueu - if( i .le. 0 ) i = mxqueu + i - nte = laqueu( i ) -c la longueur de la queue est reduite - lhqueu = lhqueu - 1 -c -c nte est il un sous-triangle feuille minimal ? - 15 if( letree(0,nte) .gt. 0 ) then -c -c non les 4 sous-triangles sont mis dans la queue - if( lhqueu + 4 .ge. mxqueu ) then - write(imprim,*) 'tehote: saturation de la queue' - ierr = 7 - return - endif - do 20 i=3,0,-1 -c ajout du sous-triangle i - lhqueu = lhqueu + 1 - lequeu = lequeu + 1 - if( lequeu .gt. mxqueu ) lequeu = lequeu - mxqueu - laqueu( lequeu ) = letree( i, nte ) - 20 continue - goto 10 -c - endif -c -c ici nte est un triangle minimal non subdivise -c --------------------------------------------- -c le te est il dans le cadre englobant de l'objet ? - ns1 = letree(6,nte) - ns2 = letree(7,nte) - ns3 = letree(8,nte) - if( pxyd(1,ns1) .gt. pxyd(1,ns2) ) then - dmin = pxyd(1,ns2) - dmax = pxyd(1,ns1) - else - dmin = pxyd(1,ns1) - dmax = pxyd(1,ns2) - endif - if( (xrmin .le. dmin .and. dmin .le. xrmax) .or. - % (xrmin .le. dmax .and. dmax .le. xrmax) ) then - if( pxyd(2,ns1) .gt. pxyd(2,ns3) ) then - dmin = pxyd(2,ns3) - dmax = pxyd(2,ns1) - else - dmin = pxyd(2,ns1) - dmax = pxyd(2,ns3) - endif - if( (yrmin .le. dmin .and. dmin .le. yrmax) .or. - % (yrmin .le. dmax .and. dmax .le. yrmax) ) then -c -c nte est un te feuille et interne au rectangle englobant -c ======================================================= -c le carre de la longueur de l'arete du te de numero nte - d2 = (pxyd(1,ns1)-pxyd(1,ns2)) ** 2 + - % (pxyd(2,ns1)-pxyd(2,ns2)) ** 2 -c - if( nutysu .eq. 0 ) then -c -c il n'existe pas de fonction 'taille_ideale' -c ------------------------------------------- -c si la taille effective de l'arete du te est superieure a aretmx -c alors le te est decoupe - if( d2 .gt. aretm2 ) then -c le triangle nte trop grand doit etre subdivise -c en 4 sous-triangles - call te4ste( nbsomm,mxsomm, pxyd, - % nte, letree, ierr ) - if( ierr .ne. 0 ) return - goto 15 - endif -c - else -c -c il existe ici une fonction 'taille_ideale' -c ------------------------------------------ -c si la taille effective de l'arete du te est superieure au mini -c des 3 tailles_ideales aux sommets alors le te est decoupe - do 28 i=1,3 - if( d2 .gt. (pxyd(3,nuste(i))*ampli)**2 ) then -c le triangle nte trop grand doit etre subdivise -c en 4 sous-triangles - nbsom0 = nbsomm - call te4ste( nbsomm, mxsomm, pxyd, - & nte, letree, ierr ) - if( ierr .ne. 0 ) return - do 27 j=nbsom0+1,nbsomm -c mise a jour de taille_ideale des nouveaux sommets de - call tetaid( nutysu, pxyd(1,j), pxyd(2,j), - % pxyd(3,j), ierr ) - if( ierr .ne. 0 ) goto 9999 - 27 continue - goto 15 - endif - 28 continue - endif -c -c recherche du nombre de niveaux entre nte et les te voisins par se -c si la difference de subdivisions excede 1 alors le plus grand des -c ================================================================= - 29 do 30 i=1,3 -c -c noteva triangle voisin de nte par l'arete i - call n1trva( nte, i, letree, noteva, niveau ) - if( noteva .le. 0 ) goto 30 -c il existe un te voisin - if( niveau .gt. 0 ) goto 30 -c nte a un te voisin plus petit ou egal - if( letree(0,noteva) .le. 0 ) goto 30 -c nte a un te voisin noteva subdivise au moins une fois -c - if( nbiter .gt. 0 ) then -c les 2 sous triangles voisins sont-ils subdivises? - ns2 = letree(i,noteva) - if( letree(0,ns2) .le. 0 ) then -c ns2 n'est pas subdivise - ns2 = letree(nosui3(i),noteva) - if( letree(0,ns2) .le. 0 ) then -c les 2 sous-triangles ne sont pas subdivises - goto 30 - endif - endif - endif -c -c saut>1 => le triangle nte doit etre subdivise en 4 sous-triang -c -------------------------------------------------------------- - nbsom0 = nbsomm - call te4ste( nbsomm,mxsomm, pxyd, nte, letree, - & ierr ) - if( ierr .ne. 0 ) return - if( nutysu .gt. 0 ) then - do 32 j=nbsom0+1,nbsomm -c mise a jour de taille_ideale des nouveaux sommets de te - call tetaid( nutysu, pxyd(1,j), pxyd(2,j), - % pxyd(3,j), ierr ) - if( ierr .ne. 0 ) goto 9999 - 32 continue - endif - goto 15 -c - 30 continue - endif - endif - goto 10 - endif - if( nbs0 .lt. nbsomm ) then - nbs0 = nbsomm - goto 5 - endif - return -c -c pb dans le calcul de la fonction taille_ideale - - 9999 write(imprim,*) 'pb dans le calcul de taille_ideale' -c nblgrc(nrerr) = 1 -c kerr(1) = 'pb dans le calcul de taille_ideale' -c call lereur - return - end - - - subroutine tetrte( comxmi, aretmx, nbarpi, mxsomm, pxyd, - % mxqueu, laqueu, letree, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : trianguler les triangles equilateraux feuilles et -c ----- les points de la frontiere et les points internes imposes -c -c attention: la triangulation finale n'est pas de type delaunay! -c -c entrees: -c -------- -c comxmi : minimum et maximum des coordonnees de l'objet -c aretmx : longueur maximale des aretes des triangles equilateraux -c nbarpi : nombre de sommets de la frontiere + nombre de points internes -c imposes par l'utilisateur -c mxsomm : nombre maximal de sommets declarables dans pxyd -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c -c mxqueu : nombre d'entiers utilisables dans laqueu -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c noarst : noarst(i) numero d'une arete de sommet i -c -c auxiliaire : -c ------------ -c laqueu : mxqueu entiers servant de queue pour le parcours de letree -c -c sorties: -c -------- -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes d'un t -c =5 si saturation de la queue de parcours de l'arbre des te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, intera, nunite(29) -c - double precision pxyd(3,mxsomm) - double precision comxmi(3,2),aretmx,a,s,xrmin,xrmax,yrmin,yrmax - double precision dmin, dmax -c - integer nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(mxsomm) -c - integer letree(0:8,0:*) - integer laqueu(1:mxqueu) -c lequeu:entree dans la queue en gestion circulaire -c lhqueu:longueur de la queue en gestion circulaire -c - integer milieu(3), nutr(1:13) -c -c le rectangle englobant pour selectionner les te "internes" -c le numero des 3 sommets du te englobant racine de l'arbre des te - ns1 = letree(6,1) - ns2 = letree(7,1) - ns3 = letree(8,1) - a = aretmx * 0.01d0 -c abscisse du milieu de l'arete gauche du te 1 - s = ( pxyd(1,ns1) + pxyd(1,ns3) ) / 2 - xrmin = min( s, comxmi(1,1) - aretmx ) - a -c abscisse du milieu de l'arete droite du te 1 - s = ( pxyd(1,ns2) + pxyd(1,ns3) ) / 2 - xrmax = max( s, comxmi(1,2) + aretmx ) + a - yrmin = comxmi(2,1) - aretmx -c ordonnee de la droite passant par les milieus des 2 aretes -c droite gauche du te 1 - s = ( pxyd(2,ns1) + pxyd(2,ns3) ) / 2 - yrmax = max( s, comxmi(2,2) + aretmx ) + a -c -c cas particulier de 3 ou 4 ou peu d'aretes frontalieres - if( nbarpi .le. 8 ) then -c tout le triangle englobant (racine) est a prendre en compte - xrmin = pxyd(1,ns1) - a - xrmax = pxyd(1,ns2) + a - yrmin = pxyd(2,ns1) - a - yrmax = pxyd(2,ns3) + a - endif -c -c initialisation du tableau noartr - do 5 i=1,mxartr -c le numero de l'arete est inconnu - noartr(1,i) = 0 -c le chainage sur le triangle vide suivant - noartr(2,i) = i+1 - 5 continue - noartr(2,mxartr) = 0 - n1artr = 1 -c -c parcours des te jusqu'a trianguler toutes les feuilles (triangles eq) -c ===================================================================== -c initialisation de la queue sur les te - ierr = 0 - lequeu = 1 - lhqueu = 0 -c la racine de letree initialise la queue - laqueu(1) = 1 -c -c tant que la longueur de la queue est >=0 traiter le debut de queue - 10 if( lhqueu .ge. 0 ) then -c -c le triangle te a traiter - i = lequeu - lhqueu - if( i .le. 0 ) i = mxqueu + i - nte = laqueu( i ) -c la longueur est reduite - lhqueu = lhqueu - 1 -c -c nte est il un sous-triangle feuille (minimal) ? - 15 if( letree(0,nte) .gt. 0 ) then -c non les 4 sous-triangles sont mis dans la queue - if( lhqueu + 4 .ge. mxqueu ) then - write(imprim,*) 'tetrte: saturation de la queue' - ierr = 5 - return - endif - do 20 i=3,0,-1 -c ajout du sous-triangle i - lhqueu = lhqueu + 1 - lequeu = lequeu + 1 - if( lequeu .gt. mxqueu ) lequeu = lequeu - mxqueu - laqueu( lequeu ) = letree( i, nte ) - 20 continue - goto 10 - endif -c -c ici nte est un triangle minimal non subdivise -c --------------------------------------------- -c le te est il dans le cadre englobant de l'objet ? - ns1 = letree(6,nte) - ns2 = letree(7,nte) - ns3 = letree(8,nte) - if( pxyd(1,ns1) .gt. pxyd(1,ns2) ) then - dmin = pxyd(1,ns2) - dmax = pxyd(1,ns1) - else - dmin = pxyd(1,ns1) - dmax = pxyd(1,ns2) - endif - if( (xrmin .le. dmin .and. dmin .le. xrmax) .or. - % (xrmin .le. dmax .and. dmax .le. xrmax) ) then - if( pxyd(2,ns1) .gt. pxyd(2,ns3) ) then - dmin = pxyd(2,ns3) - dmax = pxyd(2,ns1) - else - dmin = pxyd(2,ns1) - dmax = pxyd(2,ns3) - endif - if( (yrmin .le. dmin .and. dmin .le. yrmax) .or. - % (yrmin .le. dmax .and. dmax .le. yrmax) ) then -c -c te minimal et interne au rectangle englobant -c -------------------------------------------- -c recherche du nombre de niveaux entre nte et les te voisins -c par ses aretes - nbmili = 0 - do 30 i=1,3 -c -c a priori pas de milieu de l'arete i du te nte - milieu(i) = 0 -c -c recherche de noteva te voisin de nte par l'arete i - call n1trva( nte, i, letree, noteva, niveau ) -c noteva : >0 numero letree du te voisin par l'arete i -c =0 si pas de te voisin (racine , ... ) -c niveau : =0 si nte et noteva ont meme taille -c >0 nte est 4**niveau fois plus petit que noteva - if( noteva .gt. 0 ) then -c il existe un te voisin - if( letree(0,noteva) .gt. 0 ) then -c noteva est plus petit que nte -c => recherche du numero du milieu du cote=sommet du te no -c le sous-te 0 du te noteva - nsot = letree(0,noteva) -c le numero dans pxyd du milieu de l'arete i de nte - milieu( i ) = letree( 5+nopre3(i), nsot ) - nbmili = nbmili + 1 - endif - endif -c - 30 continue -c -c triangulation du te nte en fonction du nombre de ses milieux - goto( 50, 100, 200, 300 ) , nbmili + 1 -c -c 0 milieu => 1 triangle = le te nte -c ---------------------------------- - 50 call f0trte( letree(0,nte), pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 -c -c 1 milieu => 2 triangles = 2 demi te -c ----------------------------------- - 100 call f1trte( letree(0,nte), pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 -c -c 2 milieux => 3 triangles -c ----------------------------------- - 200 call f2trte( letree(0,nte), pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 -c -c 3 milieux => 4 triangles = 4 quart te -c ------------------------------------- - 300 call f3trte( letree(0,nte), pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) - if( ierr .ne. 0 ) return - goto 10 - endif - endif - goto 10 - endif - end - - - subroutine aisoar( mosoar, mxsoar, nosoar, na1 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : chainer en colonne lchain les aretes non vides et -c ----- non frontalieres du tableau nosoar -c -c entrees: -c -------- -c mosoar : nombre maximal d'entiers par arete dans le tableau nosoar -c mxsoar : nombre maximal d'aretes frontalieres declarables -c -c modifies : -c ---------- -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c nosoar(lchain,i)=arete interne suivante -c -c sortie : -c -------- -c na1 : numero dans nosoar de la premiere arete interne -c les suivantes sont nosoar(lchain,na1), ... -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - integer nosoar(mosoar,mxsoar) -c -c formation du chainage des aretes internes a echanger eventuellement -c recherche de la premiere arete non vide et non frontaliere - do 10 na1=1,mxsoar - if( nosoar(1,na1) .gt. 0 .and. nosoar(3,na1) .le. 0 ) goto 15 - 10 continue -c -c protection de la premiere arete non vide et non frontaliere - 15 na0 = na1 - do 20 na=na1+1,mxsoar - if( nosoar(1,na) .gt. 0 .and. nosoar(3,na) .le. 0 ) then -c arete interne => elle est chainee a partir de la precedente - nosoar(lchain,na0) = na - na0 = na - endif - 20 continue -c -c la derniere arete interne n'a pas de suivante - nosoar(lchain,na0) = 0 - end - - - subroutine tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, n1ardv, - % moartr, mxartr, n1artr, noartr, modifs ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : pour toutes les aretes chainees dans nosoar(lchain,*) -c ----- du tableau nosoar -c echanger la diagonale des 2 triangles si le sommet oppose -c a un triangle ayant en commun une arete appartient au cercle -c circonscrit de l'autre (violation boule vide delaunay) -c -c entrees: -c -------- -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c -c modifies : -c ---------- -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete dans le tableau nosoar -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c n1ardv : numero dans nosoar de la premiere arete du chainage -c des aretes a rendre delaunay -c -c moartr : nombre d'entiers par triangle dans le tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c modifs : nombre d'echanges de diagonales pour maximiser la qualite -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*), surtd2, s123, s142, s143, s234, - % s12, s34, a12, cetria(3), r0 - integer nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*) -c -c le nombre d'echanges de diagonales pour minimiser l'aire - modifs = 0 - r0 = 0 -c -c la premiere arete du chainage des aretes a rendre delaunay - na0 = n1ardv -c -c tant que la pile des aretes a echanger eventuellement est non vide -c ================================================================== - 20 if( na0 .gt. 0 ) then -c -c l'arete a traiter - na = na0 -c la prochaine arete a traiter - na0 = nosoar(lchain,na0) -c -c l'arete est marquee traitee avec le numero -1 - nosoar(lchain,na) = -1 -c -c l'arete est elle active? - if( nosoar(1,na) .eq. 0 ) goto 20 -c -c si arete frontaliere pas d'echange possible - if( nosoar(3,na) .gt. 0 ) goto 20 -c -c existe-t-il 2 triangles ayant cette arete commune? - if( nosoar(4,na) .le. 0 .or. nosoar(5,na) .le. 0 ) goto 20 -c -c aucun des 2 triangles est-il desactive? - if( noartr(1,nosoar(4,na)) .eq. 0 .or. - % noartr(1,nosoar(5,na)) .eq. 0 ) goto 20 -c -c l'arete appartient a deux triangles actifs -c le numero des 4 sommets du quadrangle des 2 triangles - call mt4sqa( na, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3, ns4 ) - if( ns4 .eq. 0 ) goto 20 -c -c carre de la longueur de l'arete ns1 ns2 - a12 = (pxyd(1,ns2)-pxyd(1,ns1))**2+(pxyd(2,ns2)-pxyd(2,ns1))**2 -c -c comparaison de la somme des aires des 2 triangles -c ------------------------------------------------- -c calcul des surfaces des triangles 123 et 142 de cette arete - s123=surtd2( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3) ) - s142=surtd2( pxyd(1,ns1), pxyd(1,ns4), pxyd(1,ns2) ) - s12 = abs( s123 ) + abs( s142 ) - if( s12 .le. 0.001*a12 ) goto 20 -c -c calcul des surfaces des triangles 143 et 234 de cette arete - s143=surtd2( pxyd(1,ns1), pxyd(1,ns4), pxyd(1,ns3) ) - s234=surtd2( pxyd(1,ns2), pxyd(1,ns3), pxyd(1,ns4) ) - s34 = abs( s234 ) + abs( s143 ) -c - if( abs(s34-s12) .gt. 1d-15*s34 ) goto 20 -c -c quadrangle convexe : le critere de delaunay intervient -c ------------------ --------------------------------- -c calcul du centre et rayon de la boule circonscrite a 123 -c pas d'affichage si le triangle est degenere - ierr = -1 - call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), cetria, - % ierr ) - if( ierr .gt. 0 ) then -c ierr=1 si triangle degenere => abandon - goto 20 - endif -c - if( (cetria(1)-pxyd(1,ns4))**2+(cetria(2)-pxyd(2,ns4))**2 - % .lt. cetria(3) ) then -c -c protection contre une boucle infinie sur le meme cercle - if( r0 .eq. cetria(3) ) goto 20 -c -c oui: ns4 est dans le cercle circonscrit a ns1 ns2 ns3 -c => ns3 est aussi dans le cercle circonscrit de ns1 ns2 ns4 -c -cccc les 2 triangles d'arete na sont effaces -ccc do 25 j=4,5 -ccc nt = nosoar(j,na) -cccc trace du triangle nt -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ncnoir, ncjaun ) -ccc 25 continue -c -c echange de la diagonale 12 par 34 des 2 triangles - call te2t2t( na, mosoar, n1soar, nosoar, noarst, - % moartr, noartr, na34 ) - if( na34 .eq. 0 ) goto 20 - r0 = cetria(3) -c -c l'arete na34 est marquee traitee - nosoar(lchain,na34) = -1 - modifs = modifs + 1 -c -c les aretes internes peripheriques des 2 triangles sont enchainees - do 60 j=4,5 - nt = nosoar(j,na34) -cccc trace du triangle nt -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ncoran, ncgric ) - do 50 i=1,3 - n = abs( noartr(i,nt) ) - if( n .ne. na34 ) then - if( nosoar(3,n) .eq. 0 .and. - % nosoar(lchain,n) .eq. -1 ) then -c cette arete marquee est chainee pour etre traitee - nosoar(lchain,n) = na0 - na0 = n - endif - endif - 50 continue - 60 continue - goto 20 - endif -c -c retour en haut de la pile des aretes a traiter - goto 20 - endif - end - - - subroutine terefr( nbarpi, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, larmin, notrcf, - % nbarpe, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : recherche des aretes de la frontiere non dans la triangulation -c ----- triangulation frontale pour les reobtenir -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c le tableau nosoar -c nbarpi : numero du dernier point interne impose par l'utilisateur -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c -c auxiliaires : -c ------------- -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau (mxarcf) auxiliaire d'entiers -c notrcf : tableau (mxarcf) auxiliaire d'entiers -c -c sortie : -c -------- -c nbarpe : nombre d'aretes perdues puis retrouvees -c ierr : =0 si pas d'erreur -c >0 si une erreur est survenue -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu,imprim,intera,nunite(29) - double precision pxyd(3,*) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf) -c -c le nombre d'aretes de la frontiere non arete de la triangulation - nbarpe = 0 -c -c initialisation du chainage des aretes des cf => 0 arete de cf - do 10 narete=1,mxsoar - nosoar( lchain, narete) = -1 - 10 continue -c -c boucle sur l'ensemble des aretes actuelles -c ========================================== - do 30 narete=1,mxsoar -c - if( nosoar(3,narete) .gt. 0 ) then -c arete appartenant a une ligne => frontaliere -c - if(nosoar(4,narete) .le. 0 .or. nosoar(5,narete) .le. 0)then -c l'arete narete frontaliere n'appartient pas a 2 triangles -c => elle est perdue - nbarpe = nbarpe + 1 -c -c le numero des 2 sommets de l'arete frontaliere perdue - ns1 = nosoar( 1, narete ) - ns2 = nosoar( 2, narete ) -c write(imprim,10000) ns1,(pxyd(j,ns1),j=1,2), -c % ns2,(pxyd(j,ns2),j=1,2) -10000 format(' arete perdue a forcer', - % (t24,'sommet=',i6,' x=',g13.5,' y=',g13.5)) -c -c traitement de cette arete perdue ns1-ns2 - call tefoar( narete, nbarpi, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, larmin, notrcf, - % ierr ) - if( ierr .ne. 0 ) return -c -c fin du traitement de cette arete perdue et retrouvee - endif - endif -c - 30 continue - end - - - subroutine tesuex( nblftr, nulftr, - % ndtri0, nbsomm, pxyd, nslign, - % mosoar, mxsoar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtria, letrsu, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer du tableau noartr les triangles externes au domaine -c ----- en annulant le numero de leur 1-ere arete dans noartr -c et en les chainant comme triangles vides -c -c entrees: -c -------- -c nblftr : nombre de lignes fermees definissant la surface -c nulftr : numero des lignes fermees definissant la surface -c ndtri0 : plus grand numero dans noartr d'un triangle -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c nslign : tableau du numero de sommet dans sa ligne pour chaque -c sommet frontalier -c numero du point dans le lexique point si interne impose -c 0 si le point est interne non impose par l'utilisateur -c -1 si le sommet est externe au domaine -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero nosoar d'une arete de sommet i -c -c sorties: -c -------- -c nbtria : nombre de triangles internes au domaine -c letrsu : letrsu(nt)=numero du triangle interne, 0 sinon -c noarst : noarst(i) numero nosoar d'une arete du sommet i (modifi'e) -c ierr : 0 si pas d'erreur, >0 sinon -cc++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mai 1999 -c2345x7..............................................................012 - double precision pxyd(3,*) - integer nulftr(nblftr),nslign(nbsomm), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*) - integer letrsu(1:ndtri0) - double precision dmin -c -c les triangles sont a priori non marques - do 5 nt=1,ndtri0 - letrsu(nt) = 0 - 5 continue -c -c les aretes sont marquees non chainees - do 10 noar1=1,mxsoar - nosoar(6,noar1) = -2 - 10 continue -c -c recherche du sommet de la triangulation de plus petite abscisse -c =============================================================== - ntmin = 0 - dmin = 1d38 - do 20 i=1,nbsomm - if( pxyd(1,i) .lt. dmin ) then -c le nouveau minimum - noar1 = noarst(i) - if( noar1 .gt. 0 ) then -c le sommet appartient a une arete de triangle - if( nosoar(4,noar1) .gt. 0 ) then -c le nouveau minimum - dmin = pxyd(1,i) - ntmin = i - endif - endif - endif - 20 continue -c -c une arete de sommet ntmin - noar1 = noarst( ntmin ) -c un triangle d'arete noar1 - ntmin = nosoar( 4, noar1 ) - if( ntmin .le. 0 ) then -c nblgrc(nrerr) = 1 -c kerr(1) = 'pas de triangle d''abscisse minimale' -c call lereur - write(imprim,*) 'pas de triangle d''abscisse minimale' - ierr = 2 - goto 9990 - endif -c -c chainage des 3 aretes du triangle ntmin -c ======================================= -c la premiere arete du chainage des aretes traitees - noar1 = abs( noartr(1,ntmin) ) - na0 = abs( noartr(2,ntmin) ) -c elle est chainee sur la seconde arete du triangle ntmin - nosoar(6,noar1) = na0 -c les 2 autres aretes du triangle ntmin sont chainees - na1 = abs( noartr(3,ntmin) ) -c la seconde est chainee sur la troisieme arete - nosoar(6,na0) = na1 -c la troisieme n'a pas de suivante - nosoar(6,na1) = 0 -c -c le triangle ntmin est a l'exterieur du domaine -c tous les triangles externes sont marques -123 456 789 -c les triangles de l'autre cote d'une arete sur une ligne -c sont marques: no de la ligne de l'arete * signe oppose -c ======================================================= - ligne0 = 0 - ligne = -123 456 789 -c - 40 if( noar1 .ne. 0 ) then -c -c l'arete noar1 du tableau nosoar est a traiter -c --------------------------------------------- - noar = noar1 -c l'arete suivante devient la premiere a traiter ensuite - noar1 = nosoar(6,noar1) -c l'arete noar est traitee - nosoar(6,noar) = -3 -c - do 60 i=4,5 -c -c l'un des 2 triangles de l'arete - nt = nosoar(i,noar) - if( nt .gt. 0 ) then -c -c triangle deja traite pour une ligne anterieure? - if( letrsu(nt) .ne. 0 .and. - % abs(letrsu(nt)) .ne. ligne ) goto 60 -c -cccc trace du triangle nt en couleur ligne0 -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ligne0, ncnoir ) -c -c le triangle est marque avec la valeur de ligne - letrsu(nt) = ligne -c -c chainage eventuel des autres aretes de ce triangle -c si ce n'est pas encore fait - do 50 j=1,3 -c -c le numero na de l'arete j du triangle nt dans nosoar - na = abs( noartr(j,nt) ) - if( nosoar(6,na) .ne. -2 ) goto 50 -c -c le numero de 1 a nblftr dans nulftr de la ligne de l'arete - nl = nosoar(3,na) -c -c si l'arete est sur une ligne fermee differente de celle envelo -c et non marquee alors examen du triangle oppose - if( nl .gt. 0 ) then -c - if( nl .eq. ligne0 ) goto 50 -c -c arete frontaliere de ligne non traitee -c => passage de l'autre cote de la ligne -c le triangle de l'autre cote de la ligne est recherche - if( nt .eq. abs( nosoar(4,na) ) ) then - nt2 = 5 - else - nt2 = 4 - endif - nt2 = abs( nosoar(nt2,na) ) - if( nt2 .gt. 0 ) then -c -c le triangle nt2 de l'autre cote est marque avec le -c avec le signe oppose de celui de ligne - if( ligne .ge. 0 ) then - lsigne = -1 - else - lsigne = 1 - endif - letrsu(nt2) = lsigne * nl -c -c temoin de ligne a traiter ensuite dans nulftr - nulftr(nl) = -abs( nulftr(nl) ) -c -cccc trace du triangle nt2 en jaune borde de magenta -ccc call mttrtr( pxyd,nt2, -ccc % moartr,noartr,mosoar,nosoar, -ccc % ncjaun, ncmage ) -c -c l'arete est traitee - nosoar(6,na) = -3 -c - endif -c -c l'arete est traitee - goto 50 -c - endif -c -c arete non traitee => elle est chainee - nosoar(6,na) = noar1 - noar1 = na -c - 50 continue -c - endif - 60 continue -c - goto 40 - endif -c les triangles de la ligne fermee ont tous ete marques -c plus d'arete chainee -c -c recherche d'une nouvelle ligne fermee a traiter -c =============================================== - 65 do 70 nl=1,nblftr - if( nulftr(nl) .lt. 0 ) goto 80 - 70 continue -c plus de ligne fermee a traiter - goto 110 -c -c tous les triangles de cette composante connexe -c entre ligne et ligne0 vont etre marques -c ============================================== -c remise en etat du numero de ligne -c nl est le numero de la ligne dans nulftr a traiter - 80 nulftr(nl) = -nulftr(nl) - do 90 nt2=1,ndtri0 - if( abs(letrsu(nt2)) .eq. nl ) goto 92 - 90 continue -c -c recherche de l'arete j du triangle nt2 avec ce numero de ligne nl - 92 do 95 j=1,3 -c -c le numero de l'arete j du triangle dans nosoar - noar1 = 0 - na0 = abs( noartr(j,nt2) ) - if( nl .eq. nosoar(3,na0) ) then -c -c na0 est l'arete de ligne nl -c l'arete suivante du triangle nt2 - i = mod(j,3) + 1 -c le numero dans nosoar de l'arete i de nt2 - na1 = abs( noartr(i,nt2) ) - if( nosoar(6,na1) .eq. -2 ) then -c arete non traitee => elle est la premiere du chainage - noar1 = na1 -c pas de suivante dans ce chainage - nosoar(6,na1) = 0 - else - na1 = 0 - endif -c -c l'eventuelle seconde arete suivante - i = mod(i,3) + 1 - na = abs( noartr(i,nt2) ) - if( nosoar(6,na) .eq. -2 ) then - if( na1 .eq. 0 ) then -c 1 arete non traitee et seule a chainer - noar1 = na - nosoar(6,na) = 0 - else -c 2 aretes a chainer - noar1 = na - nosoar(6,na) = na1 - endif - endif -c - if( noar1 .gt. 0 ) then -c -c il existe au moins une arete a visiter pour ligne -c marquage des triangles internes a la ligne nl - ligne = letrsu(nt2) - ligne0 = nl - goto 40 -c - else -c -c nt2 est le seul triangle de la ligne fermee - goto 65 -c - endif - endif - 95 continue -c -c reperage des sommets internes ou externes dans nslign -c nslign(sommet externe au domaine)=-1 -c nslign(sommet interne au domaine)= 0 -c ===================================================== - 110 do 170 ns1=1,nbsomm -c tout sommet non sur la frontiere ou interne impose -c est suppose externe - if( nslign(ns1) .eq. 0 ) nslign(ns1) = -1 - 170 continue -c -c les triangles externes sont marques vides dans le tableau noartr -c ================================================================ - nbtria = 0 - do 200 nt=1,ndtri0 -c - if( letrsu(nt) .le. 0 ) then -c -c triangle nt externe - if( noartr(1,nt) .ne. 0 ) then -c la premiere arete est annulee - noartr(1,nt) = 0 -c le triangle nt est considere comme etant vide - noartr(2,nt) = n1artr - n1artr = nt - endif -c - else -c -c triangle nt interne - nbtria = nbtria + 1 - letrsu(nt) = nbtria -c -c marquage des 3 sommets du triangle nt - do 190 i=1,3 -c le numero nosoar de l'arete i du triangle nt - noar = abs( noartr(i,nt) ) -c le numero des 2 sommets - ns1 = nosoar(1,noar) - ns2 = nosoar(2,noar) -c mise a jour du numero d'une arete des 2 sommets de l'arete - noarst( ns1 ) = noar - noarst( ns2 ) = noar -c ns1 et ns2 sont des sommets de la triangulation du domaine - if( nslign(ns1) .lt. 0 ) nslign(ns1)=0 - if( nslign(ns2) .lt. 0 ) nslign(ns2)=0 - 190 continue -c - endif -c - 200 continue -c ici tout sommet externe ns verifie nslign(ns)=-1 -c -c les triangles externes sont mis a zero dans nosoar -c ================================================== - do 300 noar=1,mxsoar -c - if( nosoar(1,noar) .gt. 0 ) then -c -c le second triangle de l'arete noar - nt = nosoar(5,noar) - if( nt .gt. 0 ) then -c si le triangle nt est externe -c alors il est supprime pour l'arete noar - if( letrsu(nt) .le. 0 ) nosoar(5,noar)=0 - endif -c -c le premier triangle de l'arete noar - nt = nosoar(4,noar) - if( nt .gt. 0 ) then - if( letrsu(nt) .le. 0 ) then -c si le triangle nt est externe -c alors il est supprime pour l'arete noar -c et l'eventuel triangle oppose prend sa place -c en position 4 de nosoar - if( nosoar(5,noar) .gt. 0 ) then - nosoar(4,noar)=nosoar(5,noar) - nosoar(5,noar)=0 - else - nosoar(4,noar)=0 - endif - endif - endif - endif -c - 300 continue -c -c remise en etat pour eviter les modifications de ladefi - 9990 do 9991 nl=1,nblftr - if( nulftr(nl) .lt. 0 ) nulftr(nl)=-nulftr(nl) - 9991 continue - return - end - - - - subroutine trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxpile, lhpile, lapile ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : recherche des triangles de noartr partageant le sommet ns -c ----- -c limite: un camembert de centre ns entame 2 fois -c ne donne que l'une des parties -c -c entrees: -c -------- -c ns : numero du sommet -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxpile : nombre maximal de triangles empilables -c -c sorties : -c -------- -c lhpile : >0 nombre de triangles empiles -c =0 si impossible de tourner autour du point -c =-lhpile si apres butee sur la frontiere il y a a nouveau -c butee sur la frontiere . a ce stade on ne peut dire si tous -c les triangles ayant ce sommet ont ete recenses -c ce cas arrive seulement si le sommet est sur la frontiere -c lapile : numero dans noartr des triangles de sommet ns -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*) - integer lapile(1:mxpile) - integer nosotr(3) -c -c la premiere arete de sommet ns - nar = noarst( ns ) - if( nar .le. 0 ) then - write(imprim,*) 'trp1st: sommet',ns,' sans arete' - goto 9999 - endif -c -c l'arete nar est elle active? - if( nosoar(1,nar) .le. 0 ) then -ccc write(imprim,*) 'trp1st: arete vide',nar, -ccc % ' st1:', nosoar(1,nar),' st2:',nosoar(2,nar) - goto 9999 - endif -c -c le premier triangle de sommet ns - nt0 = abs( nosoar(4,nar) ) - if( nt0 .le. 0 ) then - write(imprim,*) 'trp1st: sommet',ns,' dans aucun triangle' - goto 9999 - endif -c -c le triangle est il interne? - if( noartr(1,nt0) .eq. 0 ) goto 9999 -c -c le numero des 3 sommets du triangle nt0 dans le sens direct - call nusotr( nt0, mosoar, nosoar, moartr, noartr, nosotr ) -c -c reperage du sommet ns dans le triangle nt0 - do 5 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 10 - 5 continue - nta = nt0 - goto 9995 -c -c ns retrouve : le triangle nt0 est empile - 10 lhpile = 1 - lapile(1) = nt0 - nta = nt0 -c -c recherche dans le sens des aiguilles d'une montre -c (sens indirect) du triangle nt1 de l'autre cote de l'arete -c nar du triangle et en tournant autour du sommet ns -c ========================================================== - noar = abs( noartr(nar,nt0) ) -c le triangle nt1 oppose du triangle nt0 par l'arete noar - if( nosoar(4,noar) .eq. nt0 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif -c -c la boucle sur les triangles nt1 de sommet ns dans le sens indirect -c ================================================================== - if( nt1 .gt. 0 ) then -c - if( noartr(1,nt1) .eq. 0 ) goto 30 -c -c le triangle nt1 n'a pas ete detruit. il est actif -c le triangle oppose par l'arete noar existe -c le numero des 3 sommets du triangle nt1 dans le sens direct - 15 call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr ) -c -c reperage du sommet ns dans nt1 - do 20 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 25 - 20 continue - nta = nt1 - goto 9995 -c -c nt1 est empile - 25 if( lhpile .ge. mxpile ) goto 9990 - lhpile = lhpile + 1 - lapile(lhpile) = nt1 -c -c le triangle nt1 de l'autre cote de l'arete de sommet ns -c sauvegarde du precedent triangle dans nta - nta = nt1 - noar = abs( noartr(nar,nt1) ) - if( nosoar(4,noar) .eq. nt1 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif - if( nt1 .le. 0 ) goto 30 -c le triangle suivant est a l'exterieur - if( nt1 .ne. nt0 ) goto 15 -c -c recherche terminee par arrivee sur nt0 -c les triangles forment un "cercle" de "centre" ns - return -c - endif -c -c pas de triangle voisin a nt1 -c ============================ -c le parcours passe par 1 des triangles exterieurs -c le parcours est inverse par l'arete de gauche -c le triangle nta est le premier triangle empile - 30 lhpile = 1 - lapile(lhpile) = nta -c -c le numero des 3 sommets du triangle nta dans le sens direct - call nusotr( nta, mosoar, nosoar, moartr, noartr, nosotr ) - do 32 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 33 - 32 continue - goto 9995 -c -c l'arete qui precede (rotation / ns dans le sens direct) - 33 if( nar .eq. 1 ) then - nar = 3 - else - nar = nar - 1 - endif -c -c le triangle voisin de nta dans le sens direct - noar = abs( noartr(nar,nta) ) - if( nosoar(4,noar) .eq. nta ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif - if( nt1 .le. 0 ) then -c un seul triangle contient ns - goto 70 - endif -c -c boucle sur les triangles de sommet ns dans le sens direct -c ========================================================== - 40 if( noartr(1,nt1) .eq. 0 ) goto 70 -c -c le triangle nt1 n'a pas ete detruit. il est actif -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr ) -c -c reperage du sommet ns dans nt1 - do 50 nar=1,3 - if( nosotr(nar) .eq. ns ) goto 60 - 50 continue - nta = nt1 - goto 9995 -c -c nt1 est empile - 60 if( lhpile .ge. mxpile ) goto 9990 - lhpile = lhpile + 1 - lapile(lhpile) = nt1 -c -c l'arete qui precede dans le sens direct - if( nar .eq. 1 ) then - nar = 3 - else - nar = nar - 1 - endif -c -c l'arete de sommet ns dans nosoar - noar = abs( noartr(nar,nt1) ) -c -c le triangle voisin de nta dans le sens direct - nta = nt1 - if( nosoar(4,noar) .eq. nt1 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif - nta = nt1 - if( nt1 .gt. 0 ) goto 40 -c -c butee sur le trou => fin des triangles de sommet ns -c ---------------------------------------------------- - 70 lhpile = -lhpile -c impossible ici de trouver les autres triangles de sommet ns -c les triangles de sommet ns ne forment pas une boule de centre ns - return -c -c saturation de la pile des triangles -c ----------------------------------- - 9990 write(imprim,*) 'trp1st:saturation pile des triangles autour ', - %'sommet',ns - goto 9999 -c -c erreur triangle ne contenant pas le sommet ns -c ---------------------------------------------- - 9995 write(imprim,*) 'trp1st:triangle ',nta,' st=', - % (nosotr(nar),nar=1,3),' sans le sommet' ,ns -c - 9999 lhpile = 0 - return - end - - - - subroutine nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul du numero des 3 sommets du triangle nt de noartr -c ----- dans le sens direct (aire>0 si non degenere) -c -c entrees: -c -------- -c nt : numero du triangle dans le tableau noartr -c mosoar : nombre maximal d'entiers par arete -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c moartr : nombre maximal d'entiers par arete du tableau noartr -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1=0 si triangle vide => arete2=triangle vide suivant -c -c sorties: -c -------- -c nosotr : numero (dans le tableau pxyd) des 3 sommets du triangle -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - integer nosoar(mosoar,*), noartr(moartr,*), nosotr(3) -c -c les 2 sommets de l'arete 1 du triangle nt dans le sens direct - na = noartr( 1, nt ) - if( na .gt. 0 ) then - nosotr(1) = 1 - nosotr(2) = 2 - else - nosotr(1) = 2 - nosotr(2) = 1 - na = -na - endif - nosotr(1) = nosoar( nosotr(1), na ) - nosotr(2) = nosoar( nosotr(2), na ) -c -c l'arete suivante - na = abs( noartr(2,nt) ) -c -c le sommet nosotr(3 du triangle 123 - nosotr(3) = nosoar( 1, na ) - if( nosotr(3) .eq. nosotr(1) .or. nosotr(3) .eq. nosotr(2) ) then - nosotr(3) = nosoar(2,na) - endif - end - - - subroutine tesusp( nbarpi, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, notrcf, liarcf, - % nbstsu, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer de la triangulation les sommets de te trop proches -c ----- soit d'un sommet frontalier ou point interne impose -c soit d'une arete frontaliere -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c nbarpi : numero du dernier point interne impose par l'utilisateur -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c modifies: -c --------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c -c auxiliaires : -c ------------- -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau ( mxarcf ) auxiliaire d'entiers -c notrcf : tableau ( mxarcf ) auxiliaire d'entiers -c liarcf : tableau ( mxarcf ) auxiliaire d'entiers -c -c sortie : -c -------- -c nbstsu : nombre de sommets de te supprimes -c ierr : =0 si pas d'erreur -c >0 si une erreur est survenue -c 11 algorithme defaillant -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 -c parameter ( quamal=0.3 ) => ok -c parameter ( quamal=0.4 ) => pb pour le test ocean -c parameter ( quamal=0.5 ) => pb pour le test ocean -c - parameter ( quamal=0.333, lchain=6 ) - common / unites / lecteu,imprim,intera,nunite(29) - double precision pxyd(3,*), qualit - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf), - % liarcf(mxarcf) -c - integer nosotr(3) - equivalence (nosotr(1),ns1), (nosotr(2),ns2), - % (nosotr(3),ns3) -c -c le nombre de sommets de te supprimes - nbstsu = 0 -c -c initialisation du chainage des aretes des cf => 0 arete de cf - do 10 narete=1,mxsoar - nosoar( lchain, narete ) = -1 - 10 continue -c -c boucle sur l'ensemble des sommets frontaliers ou points internes -c ================================================================ - do 100 ns = 1, nbarpi -c -cccc le nombre de sommets supprimes pour ce sommet ns -ccc nbsuns = 0 -c -c la qualite minimale au dessous de laquelle le point proche -c interne est supprime - quaopt = quamal -c -c une arete de sommet ns - 15 narete = noarst( ns ) - if( narete .le. 0 ) then -c erreur: le point appartient a aucune arete - write(imprim,*) 'sommet ',ns,' dans aucune arete' - ierr = 11 - return - endif -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type etoile - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxarcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) then -c erreur: impossible de trouver tous les triangles de sommet ns -c seule une partie est a priori retrouvee - nbtrcf = -nbtrcf - endif -c -c boucle sur les triangles de l'etoile du sommet ns - quamin = 2.0 - do 20 i=1,nbtrcf -c -c le numero des 3 sommets du triangle nt - nt = notrcf(i) - call nusotr( nt, mosoar, nosoar, moartr, noartr, - % nosotr ) -c nosotr(1:3) est en equivalence avec ns1, ns2, ns3 -c -c la qualite du triangle ns1 ns2 ns3 - call qutr2d( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), qualit ) - if( qualit .lt. quamin ) then - quamin = qualit - ntqmin = nt - endif - 20 continue -c -c bilan sur la qualite des triangles de sommet ns - if( quamin .lt. quaopt ) then -c -c recherche du sommet de ntqmin le plus proche et non frontalier -c ============================================================== -c le numero des 3 sommets du triangle nt - call nusotr( ntqmin, mosoar, nosoar, moartr, noartr, - % nosotr ) - nste = 0 - quamin = 1e28 - do 30 j=1,3 - if( nosotr(j) .ne. ns .and. nosotr(j) .gt. nbarpi ) then - d = (pxyd(1,nosotr(j))-pxyd(1,ns))**2 - % + (pxyd(2,nosotr(j))-pxyd(2,ns))**2 - if( d .lt. quamin ) then - quamin = d - nste = j - endif - endif - 30 continue -c - if( nste .gt. 0 ) then -c -c nste est le sommet le plus proche de ns de ce -c triangle de mauvaise qualite et sommet non encore traite - nste = nosotr( nste ) -c -c nste est un sommet de triangle equilateral -c => le sommet nste va etre supprime -c ========================================== - call te1stm( nste, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, - % larmin, notrcf, liarcf, ierr ) - if( ierr .eq. 0 ) then -c un sommet de te supprime de plus - nbstsu = nbstsu + 1 - else if( ierr .lt. 0 ) then -c le sommet nste est externe donc non supprime -c ou bien le sommet nste est le centre d'un cf dont toutes -c les aretes simples sont frontalieres -c dans les 2 cas le sommet n'est pas supprime - ierr = 0 - goto 100 - else -c erreur motivant un arret de la triangulation - return - endif -c -c boucle jusqu'a obtenir une qualite suffisante -c si triangulation tres irreguliere => -c destruction de beaucoup de points internes -c les 2 variables suivantes brident ces destructions massives -ccc nbsuns = nbsuns + 1 - quaopt = quaopt * 0.8 -ccc if( nbsuns .le. 5 ) goto 15 - goto 15 - endif - endif -c - 100 continue - end - - - subroutine teamqa( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but: si la taille de l'arete moyenne est >ampli*taille souhaitee -c ---- alors ajout d'un sommet barycentre du plus grand triangle -c de sommet ns -c si la taille de l'arete moyenne est aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxtrcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : tableau du numero de sommet dans sa ligne pour chaque -c sommet frontalier -c numero du point dans le lexique point si interne impose -c 0 si le point est interne non impose par l'utilisateur -c -1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers -c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers -c larmin : tableau ( mxtrcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juin 1997 -c....................................................................012 - double precision ampli,ampli2 - parameter (ampli=1.34d0,ampli2=ampli/2d0) - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - double precision ponder, ponde1, xbar, ybar, x, y, surtd2 - double precision d, dmoy - double precision d2d3(3,3) - real origin(3), xyz(3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxtrcf), - % nslign(*), - % nostbo(*), - % n1arcf(0:mxtrcf), - % noarcf(3,mxtrcf), - % larmin(mxtrcf) - double precision comxmi(3,2) - integer nosotr(3) -c -c le nombre d'iterations pour ameliorer la qualite - nbitaq = 4 - ier = 0 -c -c initialisation du parcours - nbs1 = nbsomm - nbs2 = nbarpi + 1 - nbs3 = -1 -c - do 5000 iter=1,nbitaq -c -c le nombre de sommets supprimes - nbstsu = 0 - nbbaaj = 0 -c -c coefficient de ponderation croissant avec les iterations - ponder = min( 1d0, ( 50 + (50*iter)/nbitaq ) * 0.01d0 ) - ponde1 = 1d0 - ponder -c -c l'ordre du parcours dans le sens croissant ou decroissant - nt = nbs1 - nbs1 = nbs2 - nbs2 = nt -c alternance du parcours - nbs3 = -nbs3 -c - do 1000 ns = nbs1, nbs2, nbs3 -c -c le sommet est il interne au domaine? - if( nslign(ns) .ne. 0 ) goto 1000 -c -c existe-t-il une arete de sommet ns ? - 10 noar = noarst( ns ) - if( noar .le. 0 ) goto 1000 -c -c le 1-er triangle de l'arete noar - nt = nosoar( 4, noar ) - if( nt .le. 0 ) goto 1000 -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type etoile - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxtrcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) goto 1000 -c -c mise a jour de la distance souhaitee - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,ns) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns), - % pxyd(3,ns), ier ) - endif -c -c boucle sur les triangles qui forment une boule autour du sommet ns - nbstbo = 0 -c chainage des aretes simples de la boule a rendre delaunay - noar0 = 0 - do 40 i=1,nbtrcf -c -c le numero de l'arete du triangle nt ne contenant pas le sommet ns - nt = notrcf(i) - do 20 na=1,3 -c le numero de l'arete na dans le tableau nosoar - noar = abs( noartr(na,nt) ) - if( nosoar(1,noar) .ne. ns .and. - % nosoar(2,noar) .ne. ns ) goto 25 - 20 continue -c -c construction de la liste des sommets des aretes simples -c de la boule des triangles de sommet ns -c ------------------------------------------------------- - 25 do 35 na=1,2 - ns1 = nosoar(na,noar) - do 30 j=nbstbo,1,-1 - if( ns1 .eq. nostbo(j) ) goto 35 - 30 continue -c ns1 est un nouveau sommet a ajouter - nbstbo = nbstbo + 1 - nostbo(nbstbo) = ns1 - 35 continue -c -c noar est une arete potentielle a rendre delaunay - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - nosoar(lchain,noar) = noar0 - noar0 = noar - endif -c - 40 continue -c -c calcul des 2 coordonnees du barycentre de la boule du sommet ns -c calcul de la longueur moyenne des aretes issues du sommet ns -c --------------------------------------------------------------- - xbar = 0d0 - ybar = 0d0 - dmoy = 0d0 - do 50 i=1,nbstbo - x = pxyd(1,nostbo(i)) - y = pxyd(2,nostbo(i)) - xbar = xbar + x - ybar = ybar + y - dmoy = dmoy + sqrt( (x-pxyd(1,ns))**2+(y-pxyd(2,ns))**2 ) - 50 continue - dmoy = dmoy / nbstbo -c -c pas de modification de la topologie lors de la derniere iteration -c ================================================================= - if( iter .eq. nbitaq ) goto 200 -c -c si la taille de l'arete moyenne est >ampli*taille souhaitee -c alors ajout d'un sommet barycentre du plus grand triangle -c de sommet ns -c =========================================================== - if( dmoy .gt. ampli*pxyd(3,ns) ) then -c - dmoy = 0d0 - do 150 i=1,nbtrcf -c recherche du plus grand triangle en surface - call nusotr( notrcf(i), mosoar, nosoar, - % moartr, noartr, nosotr ) - d = surtd2( pxyd(1,nosotr(1)), - % pxyd(1,nosotr(2)), - % pxyd(1,nosotr(3)) ) - if( d .gt. dmoy ) then - dmoy = d - imax = i - endif - 150 continue -c -c ajout du barycentre du triangle notrcf(imax) - nt = notrcf( imax ) - call nusotr( nt, mosoar, nosoar, - % moartr, noartr, nosotr ) - if( nbsomm .ge. mxsomm ) then - write(imprim,*) 'saturation du tableau pxyd' -c abandon de l'amelioration du sommet ns - goto 9999 - endif - nbsomm = nbsomm + 1 - do 160 i=1,3 - pxyd(i,nbsomm) = ( pxyd(i,nosotr(1)) - % + pxyd(i,nosotr(2)) - % + pxyd(i,nosotr(3)) ) / 3d0 - 160 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,nbsomm), pxyd(2,nbsomm), - % pxyd(3,nbsomm), ier ) - endif -c -c sommet interne a la triangulation - nslign(nbsomm) = 0 -c -c les 3 aretes du triangle nt sont a rendre delaunay - do 170 i=1,3 - noar = abs( noartr(i,nt) ) - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - if( nosoar(lchain,noar) .lt. 0 ) then -c arete non encore chainee - nosoar(lchain,noar) = noar0 - noar0 = noar - endif - endif - 170 continue -c -c triangulation du triangle de barycentre nbsomm -c protection a ne pas modifier sinon erreur! - call tr3str( nbsomm, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nosotr, ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c un barycentre ajoute de plus - nbbaaj = nbbaaj + 1 -c -c les aretes chainees de la boule sont rendues delaunay - goto 900 -c - endif -c -c si la taille de l'arete moyenne est xyz(1:3) - call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns), - % pxyd(3,ns), ier ) - endif -c -c les aretes chainees de la boule sont rendues delaunay - 900 call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, noar0, - % moartr, mxartr, n1artr, noartr, modifs ) -c - 1000 continue -c -ccc write(imprim,11000) nbstsu, nbbaaj -ccc11000 format( i6,' sommets supprimes ' , -ccc % i6,' barycentres ajoutes' ) -c -c mise a jour pour ne pas oublier les nouveaux sommets - if( nbs1 .gt. nbs2 ) then - nbs1 = nbsomm - else - nbs2 = nbsomm - endif -c - 5000 continue -c - 9999 return - end - - - subroutine teamsf( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la topologie des triangles autour des -c ----- sommets frontaliers et mise en triangulation delaunay locale -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxtrcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : >0 => ns numero du point dans le lexique point si interne impose -c ou => 1 000 000 * n + ns1 -c ou n est le numero (1 a nblftr) de la ligne de ce point -c ns1 est le numero du point dans sa ligne -c = 0 si le point est interne non impose par l'utilisateur -c =-1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers -c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers -c larmin : tableau ( mxtrcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc janvier 1998 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - double precision a, angle, angled, pi, deuxpi, pis3 - double precision d2d3(3,3) - real origin(3), xyz(3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxtrcf), - % nslign(*), - % nostbo(*), - % n1arcf(0:mxtrcf), - % noarcf(3,mxtrcf), - % larmin(mxtrcf), - % nosotr(3) - double precision comxmi(3,2) -c -c le nombre d'iterations pour ameliorer la qualite - nbitaq = 2 - ier = 0 -c -c pi / 3 - pi = atan(1d0) * 4d0 - pis3 = pi / 3d0 - deuxpi = 2d0 * pi -c -c initialisation du parcours - modifs = 0 - nbs1 = nbarpi - nbs2 = 1 -c => pas de traitement sur les points des lignes de la frontiere - nbs3 = -1 -c - do 5000 iter=1,nbitaq -c -c le nombre de sommets supprimes - nbstsu = 0 -c -c l'ordre du parcours dans le sens croissant ou decroissant - nt = nbs1 - nbs1 = nbs2 - nbs2 = nt -c alternance du parcours - nbs3 = -nbs3 -c - do 1000 ns = nbs1, nbs2, nbs3 -c -c le sommet est il sur une ligne de la frontiere? -c if( nslign(ns) .lt. 1 000 000 ) goto 1000 -c -c traitement d'un sommet d'une ligne de la frontiere -c ================================================== -c existe-t-il une arete de sommet ns ? - noar = noarst( ns ) - if( noar .le. 0 ) goto 1000 -c -c le 1-er triangle de l'arete noar - nt = nosoar( 4, noar ) - if( nt .le. 0 ) goto 1000 -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type camembert - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxtrcf, nbtrcf, notrcf ) - if( nbtrcf .ge. -1 ) goto 1000 -c -c boucle sur les triangles qui forment un camembert autour du sommet n - nbtrcf = -nbtrcf -c -c angle interne au camembert autour du sommet ns - angle = 0d0 - do 540 i=1,nbtrcf -c -c le numero de l'arete du triangle nt ne contenant pas le sommet ns - nt = notrcf(i) - do 520 na=1,3 -c le numero de l'arete na dans le tableau nosoar - noar = abs( noartr(na,nt) ) - if( nosoar(1,noar) .ne. ns .and. - % nosoar(2,noar) .ne. ns ) goto 525 - 520 continue -c -c calcul de l'angle (ns-st1 arete, ns-st2 arete) - 525 ns1 = nosoar(1,noar) - ns2 = nosoar(2,noar) - a = angled( pxyd(1,ns), pxyd(1,ns1), pxyd(1,ns2) ) - if( a .gt. pi ) a = deuxpi - a - angle = angle + a -c - 540 continue -c -c nombre ideal de triangles autour du sommet ns - n = nint( angle / pis3 ) - if( n .le. 1 ) goto 1000 - i = 1 - if( nbtrcf .gt. n ) then -c -c ajout du barycentre du triangle "milieu" - nt = notrcf( (n+1)/2 ) - call nusotr( nt, mosoar, nosoar, - % moartr, noartr, nosotr ) - if( nbsomm .ge. mxsomm ) then - write(imprim,*) 'saturation du tableau pxyd' -c abandon de l'amelioration du sommet ns - goto 1000 - endif - nbsomm = nbsomm + 1 - do 560 i=1,3 - pxyd(i,nbsomm) = ( pxyd(i,nosotr(1)) - % + pxyd(i,nosotr(2)) - % + pxyd(i,nosotr(3)) ) / 3d0 - 560 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,nbsomm), pxyd(2,nbsomm), - % pxyd(3,nbsomm), ier ) - endif -c -c sommet interne a la triangulation - nslign(nbsomm) = 0 -c -c les 3 aretes du triangle nt sont a rendre delaunay - noar0 = 0 - do 570 i=1,3 - noar = abs( noartr(i,nt) ) - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - if( nosoar(lchain,noar) .lt. 0 ) then -c arete non encore chainee - nosoar(lchain,noar) = noar0 - noar0 = noar - endif - endif - 570 continue -c -c triangulation du triangle de barycentre nbsomm -c protection a ne pas modifier sinon erreur! - call tr3str( nbsomm, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nosotr, ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c les aretes chainees de la boule sont rendues delaunay - call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, noar0, - % moartr, mxartr, n1artr, noartr, modifs ) - endif -c - 1000 continue -c - 5000 continue -c - 9999 return - end - - - subroutine teamqs( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : une iteration de barycentrage des points internes -c ----- modification de la topologie pour avoir 4 ou 5 ou 6 triangles -c pour chaque sommet de la triangulation -c mise en triangulation delaunay -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxtrcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : >0 => ns numero du point dans le lexique point si interne impose -c ou => 1 000 000 * n + ns1 -c ou n est le numero (1 a nblftr) de la ligne de ce point -c ns1 est le numero du point dans sa ligne -c = 0 si le point est interne non impose par l'utilisateur -c =-1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers -c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers -c larmin : tableau ( mxtrcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mai 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - double precision ponder, ponde1, xbar, ybar, x, y, d, dmin, dmax - double precision d2d3(3,3) - real origin(3), xyz(3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxtrcf), - % nslign(*), - % nostbo(*), - % n1arcf(0:mxtrcf), - % noarcf(3,mxtrcf), - % larmin(mxtrcf) - integer nosotr(3,2) - double precision comxmi(3,2) -c -c le nombre d'iterations pour ameliorer la qualite - nbitaq = 6 - ier = 0 -c -c initialisation du parcours - nbs1 = nbsomm - nbs2 = nbarpi + 1 -c => pas de traitement sur les points des lignes de la frontiere - nbs3 = -1 -c - do 5000 iter=1,nbitaq -c -c le nombre de sommets supprimes - nbstsu = 0 -c -c les compteurs de passage sur les differents cas - nbst4 = 0 - nbst5 = 0 - nbst8 = 0 -c -c coefficient de ponderation croissant avec les iterations - ponder = min( 1d0, ( 50 + (50*iter)/nbitaq ) * 0.01d0 ) - ponde1 = 1d0 - ponder -c -c l'ordre du parcours dans le sens croissant ou decroissant - nt = nbs1 - nbs1 = nbs2 - nbs2 = nt -c alternance du parcours - nbs3 = -nbs3 -c - do 1000 ns = nbs1, nbs2, nbs3 -c -c le sommet est il interne au domaine? - if( nslign(ns) .ne. 0 ) goto 1000 -c -c traitement d'un sommet interne non impose par l'utilisateur -c =========================================================== -c existe-t-il une arete de sommet ns ? - 10 noar = noarst( ns ) - if( noar .le. 0 ) goto 1000 -c -c le 1-er triangle de l'arete noar - nt = nosoar( 4, noar ) - if( nt .le. 0 ) goto 1000 -c -c recherche des triangles de sommet ns -c ils doivent former un contour ferme de type etoile - call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr, - % mxtrcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) goto 1000 -c -c boucle sur les triangles qui forment une boule autour du sommet ns - nbstbo = 0 -c chainage des aretes simples de la boule a rendre delaunay - noar0 = 0 - do 40 i=1,nbtrcf -c -c le numero de l'arete du triangle nt ne contenant pas le sommet ns - nt = notrcf(i) - do 20 na=1,3 -c le numero de l'arete na dans le tableau nosoar - noar = abs( noartr(na,nt) ) - if( nosoar(1,noar) .ne. ns .and. - % nosoar(2,noar) .ne. ns ) goto 25 - 20 continue -c -c construction de la liste des sommets des aretes simples -c de la boule des triangles de sommet ns -c ------------------------------------------------------- - 25 do 35 na=1,2 - ns1 = nosoar(na,noar) - do 30 j=nbstbo,1,-1 - if( ns1 .eq. nostbo(j) ) goto 35 - 30 continue -c ns1 est un nouveau sommet a ajouter - nbstbo = nbstbo + 1 - nostbo(nbstbo) = ns1 - 35 continue -c -c noar est une arete potentielle a rendre delaunay - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - nosoar(lchain,noar) = noar0 - noar0 = noar - endif -c - 40 continue -c -c calcul des 2 coordonnees du barycentre de la boule du sommet ns -c calcul de l'arete de taille maximale et minimale issue de ns -c --------------------------------------------------------------- - xbar = 0d0 - ybar = 0d0 - dmin = 1d28 - dmax = 0d0 - do 50 i=1,nbstbo - x = pxyd(1,nostbo(i)) - y = pxyd(2,nostbo(i)) - xbar = xbar + x - ybar = ybar + y - d = (x-pxyd(1,ns)) ** 2 + (y-pxyd(2,ns)) ** 2 - if( d .gt. dmax ) then - dmax = d - imax = i - endif - if( d .lt. dmin ) then - dmin = d - imin = i - endif - 50 continue -c -c pas de modification de la topologie lors de la derniere iteration -c ================================================================= - if( iter .ge. nbitaq ) goto 200 -c -c si la boule de ns contient 3 ou 4 triangles le sommet ns est detruit -c ==================================================================== - if( nbtrcf .le. 4 ) then -c -c remise a -1 du chainage des aretes peripheriques de la boule ns - noar = noar0 - 60 if( noar .gt. 0 ) then -c protection du no de l'arete suivante - na = nosoar(lchain,noar) -c l'arete interne est remise a -1 - nosoar(lchain,noar) = -1 -c l'arete suivante - noar = na - goto 60 - endif - call te1stm( ns, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, n1arcf, noarcf, - % larmin, notrcf, nostbo, - % ierr ) - if( ierr .lt. 0 ) then -c le sommet ns est externe donc non supprime -c ou bien le sommet ns est le centre d'un cf dont toutes -c les aretes simples sont frontalieres -c dans les 2 cas le sommet ns n'est pas supprime - ierr = 0 - goto 200 - else if( ierr .eq. 0 ) then - nbst4 = nbst4 + 1 - nbstsu = nbstsu + 1 - else -c erreur irrecuperable - goto 9999 - endif - goto 1000 -c - endif -c -c si la boule de ns contient 5 triangles et a un sommet voisin -c sommet de 5 triangles alors l'arete joignant ces 2 sommets -c est transformee en un seul sommet de 6 triangles -c ============================================================ - if( nbtrcf .eq. 5 ) then -c - do 80 i=1,5 -c le numero du sommet de l'arete i et different de ns - ns1 = nostbo(i) -c la liste des triangles de sommet ns1 - call trp1st( ns1, noarst, - % mosoar, nosoar, moartr, noartr, - % mxtrcf-5, nbtrc1, notrcf(6) ) - if( nbtrc1 .eq. 5 ) then -c -c l'arete de sommets ns-ns1 devient un point -c par suppression du sommet ns -c -c remise a -1 du chainage des aretes peripheriques de la boul - noar = noar0 - 70 if( noar .gt. 0 ) then -c protection du no de l'arete suivante - na = nosoar(lchain,noar) -c l'arete interne est remise a -1 - nosoar(lchain,noar) = -1 -c l'arete suivante - noar = na - goto 70 - endif -c -c le point ns1 devient le milieu de l'arete ns-ns1 - do 75 j=1,3 - pxyd(j,ns1) = (pxyd(j,ns) + pxyd(j,ns1)) * 0.5d0 - 75 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,ns1) dans le repere initial => xyz(1:3 - call tetaid( nutysu,pxyd(1,ns1),pxyd(2,ns1), - % pxyd(3,ns1), ier ) - endif -c -c suppression du point ns et mise en delaunay - call te1stm( ns, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxtrcf, n1arcf, noarcf, - % larmin, notrcf, nostbo, - % ierr ) - if( ierr .lt. 0 ) then -c le sommet ns est externe donc non supprime -c ou bien le sommet ns est le centre d'un cf dont toutes -c les aretes simples sont frontalieres -c dans les 2 cas le sommet ns n'est pas supprime - ierr = 0 - goto 200 - else if( ierr .eq. 0 ) then - nbstsu = nbstsu + 1 - nbst5 = nbst5 + 1 - goto 1000 - else -c erreur irrecuperable - goto 9999 - endif - endif - 80 continue - endif -c -c si la boule de ns contient au moins 8 triangles -c alors un triangle interne est ajoute + 3 triangles (1 par arete) -c ================================================================ - if( nbtrcf .ge. 8 ) then -c -c modification des coordonnees du sommet ns -c il devient le barycentre du triangle notrcf(1) - call nusotr( notrcf(1), mosoar, nosoar, - % moartr, noartr, nosotr ) - do 110 i=1,3 - pxyd(i,ns) = ( pxyd(i,nosotr(1,1)) - % + pxyd(i,nosotr(2,1)) - % + pxyd(i,nosotr(3,1)) ) / 3d0 - 110 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3) - call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns), - % pxyd(3,ns), ier ) - endif -c -c ajout des 2 autres sommets comme barycentres des triangles -c notrcf(1+nbtrcf/3) et notrcf(1+2*nbtrcf/3) - nbt1 = ( nbtrcf + 1 ) / 3 - do 140 n=1,2 -c -c le triangle traite - nt = notrcf(1 + n * nbt1 ) -c -c le numero pxyd de ses 3 sommets - call nusotr( nt, mosoar, nosoar, - % moartr, noartr, nosotr ) -c -c ajout du nouveau barycentre - if( nbsomm .ge. mxsomm ) then - write(imprim,*) 'saturation du tableau pxyd' -c abandon de l'amelioration - goto 1100 - endif - nbsomm = nbsomm + 1 - do 120 i=1,3 - pxyd(i,nbsomm) = ( pxyd(i,nosotr(1,1)) - % + pxyd(i,nosotr(2,1)) - % + pxyd(i,nosotr(3,1)) ) / 3d0 - 120 continue -c - if( nutysu .gt. 0 ) then -c la fonction taille_ideale(x,y,z) existe -c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3 - call tetaid( nutysu, pxyd(1,nbsomm),pxyd(2,nbsomm), - % pxyd(3,nbsomm), ier ) - endif -c -c sommet interne a la triangulation - nslign(nbsomm) = 0 -c -c les 3 aretes du triangle nt sont a rendre delaunay - do 130 i=1,3 - noar = abs( noartr(i,nt) ) - if( nosoar(3,noar) .eq. 0 ) then -c arete non frontaliere - if( nosoar(lchain,noar) .lt. 0 ) then -c arete non encore chainee - nosoar(lchain,noar) = noar0 - noar0 = noar - endif - endif - 130 continue -c -c triangulation du triangle de barycentre nbsomm -c protection a ne pas modifier sinon erreur! - call tr3str( nbsomm, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nosotr, ierr ) - if( ierr .ne. 0 ) goto 9999 - 140 continue -c - nbst8 = nbst8 + 1 -c -c les aretes chainees de la boule sont rendues delaunay - goto 300 -c - endif -c -c nbtrcf est compris entre 5 et 7 => barycentrage simple -c ====================================================== -c les 2 coordonnees du barycentre des sommets des aretes -c simples de la boule du sommet ns - 200 xbar = xbar / nbstbo - ybar = ybar / nbstbo -c -c ponderation pour eviter les degenerescenses - pxyd(1,ns) = ponde1 * pxyd(1,ns) + ponder * xbar - pxyd(2,ns) = ponde1 * pxyd(2,ns) + ponder * ybar -c -c les aretes chainees de la boule sont rendues delaunay - 300 call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, noar0, - % moartr, mxartr, n1artr, noartr, modifs ) -c - 1000 continue -c -c trace de la triangulation actuelle et calcul de la qualite - 1100 continue -c -ccc write(imprim,11000) nbst4, nbst5, nbst8 -ccc11000 format( i7,' sommets de 4t', -ccc % i7,' sommets 5t+5t', -ccc % i7,' sommets >7t' ) -c -c mise a jour pour ne pas oublier les nouveaux sommets - if( nbs1 .gt. nbs2 ) then - nbs1 = nbsomm - nbs2 = nbarpi + 1 - else - nbs1 = nbarpi + 1 - nbs2 = nbsomm - endif -c - 5000 continue -c - 9999 return - end - - - subroutine teamqt( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : amelioration de la qualite de la triangulation issue de teabr4 -c ----- -c -c entrees: -c -------- -c nutysu : numero de traitement de areteideale() selon le type de surface -c 0 pas d'emploi de la fonction areteideale() => aretmx active -c 1 il existe une fonction areteideale() -c dont seules les 2 premieres composantes de uv sont actives -c autres options a definir... -c noarst : noarst(i) numero d'une arete de sommet i -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes frontalieres declarables -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles declarables dans noartr -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c mxarcf : nombre maximal de triangles empilables -c nbarpi : numero du dernier sommet frontalier ou interne impose -c nslign : tableau du numero de sommet dans sa ligne pour chaque -c sommet frontalier -c numero du point dans le lexique point si interne impose -c 0 si le point est interne non impose par l'utilisateur -c -1 si le sommet est externe au domaine -c comxmi : min et max des coordonneees des sommets du maillage -c -c modifies : -c ---------- -c nbsomm : nombre actuel de sommets de la triangulation -c (certains sommets internes ont ete desactives ou ajoutes) -c pxyd : tableau des coordonnees 2d des points -c -c auxiliaires: -c ------------ -c notrcf : tableau ( mxarcf ) auxiliaire d'entiers -c numero dans noartr des triangles de sommet ns -c nostbo : tableau ( mxarcf ) auxiliaire d'entiers -c numero dans pxyd des sommets des aretes simples de la boule -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau ( mxarcf ) auxiliaire d'entiers -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juin 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*), d2d3(3,3) - integer noartr(moartr,*), - % nosoar(mosoar,*), - % noarst(*), - % notrcf(mxarcf), - % nslign(*), - % nostbo(mxarcf), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf) - double precision comxmi(3,2) -c -c suppression des sommets de triangles equilateraux trop proches -c d'un sommet frontalier ou d'un point interne impose par -c triangulation frontale de l'etoile et mise en delaunay -c ============================================================== - call tesusp( nbarpi, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, notrcf, nostbo, - % nbstsu, ierr ) - if( ierr .ne. 0 ) goto 9999 -c write(imprim,*) 'retrait de',nbstsu, -c % ' sommets de te trop proches de la frontiere' -c -c ajustage des tailles moyennes des aretes avec ampli=1.34d0 entre -c ampli/2 x taille_souhaitee et ampli x taille_souhaitee -c + barycentrage des sommets et mise en triangulation delaunay -c ================================================================ - call teamqa( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c modification de la topologie autour des sommets frontaliers -c pour avoir un nombre de triangles egal a l'angle/60 degres -c et mise en triangulation delaunay locale -c =========================================================== - call teamsf( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) - if( ierr .ne. 0 ) goto 9999 -c -c quelques iterations de barycentrage des points internes -c modification de la topologie pour avoir 4 ou 5 ou 6 triangles -c pour chaque sommet de la triangulation -c et mise en triangulation delaunay -c ============================================================= - call teamqs( nutysu, - % noarst, mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, notrcf, nostbo, - % n1arcf, noarcf, larmin, - % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign, - % ierr ) -c - 9999 return - end - - subroutine trfrcf( nscent, mosoar, nosoar, moartr, noartr, - % nbtrcf, notrcf, nbarfr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calculer le nombre d'aretes simples du contour ferme des -c ----- nbtrcf triangles de numeros stockes dans le tableau notrcf -c ayant tous le sommet nscent -c -c entrees: -c -------- -c nscent : numero du sommet appartenant a tous les triangles notrcf -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c moartr : nombre maximal d'entiers par arete du tableau noartr -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c nbtrcf : >0 nombre de triangles empiles -c =0 si impossible de tourner autour du point -c =-nbtrcf si apres butee sur la frontiere il y a a nouveau -c butee sur la frontiere . a ce stade on ne peut dire si tous -c les triangles ayant ce sommet ont ete recenses -c ce cas arrive seulement si le sommet est sur la frontiere -c notrcf : numero dans noartr des triangles de sommet ns -c -c sortie : -c -------- -c nbarfr : nombre d'aretes simples frontalieres -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juin 1997 -c....................................................................012 - integer noartr(moartr,*), - % nosoar(mosoar,*), - % notrcf(1:nbtrcf) -c - nbarfr = 0 - do 50 n=1,nbtrcf -c le numero du triangle n dans le tableau noartr - nt = notrcf( n ) -c parcours des 3 aretes du triangle nt - do 40 i=1,3 -c le numero de l'arete i dans le tableau nosoar - noar = abs( noartr( i, nt ) ) - do 30 j=1,2 -c le numero du sommet j de l'arete noar - ns = nosoar( j, noar ) - if( ns .eq. nscent ) goto 40 - 30 continue -c l'arete noar (sans sommet nscent) est elle frontaliere? - if( nosoar( 5, noar ) .le. 0 ) then -c l'arete appartient au plus a un triangle -c une arete simple frontaliere de plus - nbarfr = nbarfr + 1 - endif -c le triangle a au plus une arete sans sommet nscent - goto 50 - 40 continue - 50 continue - end - - subroutine int2ar( p1, p2, p3, p4, oui ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : les 2 aretes de r**2 p1-p2 p3-p4 s'intersectent elles -c ----- entre leurs sommets? -c -c entrees: -c -------- -c p1,p2,p3,p4 : les 2 coordonnees reelles des sommets des 2 aretes -c -c sortie : -c -------- -c oui : .true. si intersection, .false. sinon -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc octobre 1991 -c2345x7..............................................................012 - double precision p1(2),p2(2),p3(2),p4(2) - double precision x21,y21,d21,x43,y43,d43,d,x,y,xx - logical oui -c -c longueur des aretes - x21 = p2(1)-p1(1) - y21 = p2(2)-p1(2) - d21 = x21**2 + y21**2 -c - x43 = p4(1)-p3(1) - y43 = p4(2)-p3(2) - d43 = x43**2 + y43**2 -c -c les 2 aretes sont-elles jugees paralleles ? - d = x43 * y21 - y43 * x21 - if( abs(d) .le. 0.001 * sqrt(d21 * d43) ) then -c aretes paralleles . pas d'intersection - oui = .false. - return - endif -c -c les 2 coordonnees du point d'intersection - x = ( p1(1)*x43*y21 - p3(1)*x21*y43 - (p1(2)-p3(2))*x21*x43 ) / d - y =-( p1(2)*y43*x21 - p3(2)*y21*x43 - (p1(1)-p3(1))*y21*y43 ) / d -c -c coordonnees de x,y dans le repere ns1-ns2 - xx = ( x - p1(1) ) * x21 + ( y - p1(2) ) * y21 -c le point est il entre p1 et p2 ? - oui = -0.00001d0*d21 .le. xx .and. xx .le. 1.00001d0*d21 -c -c coordonnees de x,y dans le repere ns3-ns4 - xx = ( x - p3(1) ) * x43 + ( y - p3(2) ) * y43 -c le point est il entre p3 et p4 ? - oui = oui .and. -0.00001d0*d43 .le. xx .and. xx .le. 1.00001d0*d43 - end - - - subroutine trchtd( pxyd, nar00, nar0, noarcf, - % namin0, namin, larmin ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : recherche dans le contour ferme du sommet qui joint a la plus -c ----- courte arete nar00 donne le triangle sans intersection -c avec le contour ferme de meilleure qualite -c -c entrees: -c -------- -c pxyd : tableau des coordonnees des sommets et distance_souhaitee -c -c entrees et sorties: -c ------------------- -c nar00 : numero dans noarcf de l'arete avant nar0 -c nar0 : numero dans noarcf de la plus petite arete du contour ferme -c a joindre a noarcf(1,namin) pour former le triangle ideal -c noarcf : numero du sommet , numero de l'arete suivante -c numero du triangle exterieur a l'etoile -c -c sortie : -c -------- -c namin0 : numero dans noarcf de l'arete avant namin -c namin : numero dans noarcf du sommet choisi -c 0 si contour ferme reduit a moins de 3 aretes -c larmin : tableau auxiliaire pour stocker la liste des numeros des -c aretes de meilleure qualite pour faire le choix final -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - double precision dmaxim, precision - parameter (dmaxim=1.7d+308, precision=1d-16) -c ATTENTION:variables a ajuster selon la machine! -c ATTENTION:dmaxim : le plus grand reel machine -c ATTENTION:sur dec-alpha la precision est de 10**-14 seulement - - common / unites / lecteu,imprim,nunite(30) - double precision pxyd(1:3,1:*) - integer noarcf(1:3,1:*), - % larmin(1:*) - double precision q, dd, dmima, - % unpeps, rayon, surtd2 - logical oui - double precision centre(3) -c -c initialisations -c dmaxim : le plus grand reel machine - unpeps = 1d0 + 100d0 * precision -c -c recherche de la plus courte arete du contour ferme - nbmin = 0 - na00 = nar00 - dmima = dmaxim - nbar = 0 -c - 2 na0 = noarcf( 2, na00 ) - na1 = noarcf( 2, na0 ) - nbar = nbar + 1 -c les 2 sommets de l'arete na0 du cf - ns1 = noarcf( 1, na0 ) - ns2 = noarcf( 1, na1 ) - dd = (pxyd(1,ns2)-pxyd(1,ns1))**2 + (pxyd(2,ns2)-pxyd(2,ns1))**2 - if( dd .lt. dmima ) then - dmima = dd - larmin(1) = na00 - endif - na00 = na0 - if( na00 .ne. nar00 ) then -c derniere arete non atteinte - goto 2 - endif -c - if( nbar .eq. 3 ) then -c -c contour ferme reduit a un triangle -c ---------------------------------- - namin = nar00 - nar0 = noarcf( 2, nar00 ) - namin0 = noarcf( 2, nar0 ) - return -c - else if( nbar .le. 2 ) then - write(imprim,*) 'erreur trchtd: cf<3 aretes' - namin = 0 - namin0 = 0 - return - endif -c -c cf non reduit a un triangle -c la plus petite arete est nar0 dans noarcf - nar00 = larmin( 1 ) - nar0 = noarcf( 2, nar00 ) - nar = noarcf( 2, nar0 ) -c - ns1 = noarcf( 1, nar0 ) - ns2 = noarcf( 1, nar ) -c -c recherche dans cette etoile du sommet offrant la meilleure qualite -c du triangle ns1-ns2 ns3 sans intersection avec le contour ferme -c ================================================================== - nar3 = nar - qmima = -1 -c -c parcours des sommets possibles ns3 - 10 nar3 = noarcf( 2, nar3 ) - if( nar3 .ne. nar0 ) then -c -c il existe un sommet ns3 different de ns1 et ns2 - ns3 = noarcf( 1, nar3 ) -c -c les aretes ns1-ns3 et ns2-ns3 intersectent-elles une arete -c du contour ferme ? -c ---------------------------------------------------------- -c intersection de l'arete ns2-ns3 et des aretes du cf -c jusqu'au sommet ns3 - nar1 = noarcf( 2, nar ) -c - 15 if( nar1 .ne. nar3 .and. noarcf( 2, nar1 ) .ne. nar3 ) then -c l'arete suivante - nar2 = noarcf( 2, nar1 ) -c le numero des 2 sommets de l'arete - np1 = noarcf( 1, nar1 ) - np2 = noarcf( 1, nar2 ) - call int2ar( pxyd(1,ns2), pxyd(1,ns3), - % pxyd(1,np1), pxyd(1,np2), oui ) - if( oui ) goto 10 -c les 2 aretes ne s'intersectent pas entre leurs sommets - nar1 = nar2 - goto 15 - endif -c -c intersection de l'arete ns3-ns1 et des aretes du cf -c jusqu'au sommet de l'arete nar0 - nar1 = noarcf( 2, nar3 ) -c - 18 if( nar1 .ne. nar0 .and. noarcf( 2, nar1 ) .ne. nar0 ) then -c l'arete suivante - nar2 = noarcf( 2, nar1 ) -c le numero des 2 sommets de l'arete - np1 = noarcf( 1, nar1 ) - np2 = noarcf( 1, nar2 ) - call int2ar( pxyd(1,ns1), pxyd(1,ns3), - % pxyd(1,np1), pxyd(1,np2), oui ) - if( oui ) goto 10 -c les 2 aretes ne s'intersectent pas entre leurs sommets - nar1 = nar2 - goto 18 - endif -c -c le triangle ns1-ns2-ns3 n'intersecte pas une arete du contour ferme -c le calcul de la surface du triangle - dd = surtd2( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3) ) - if( dd .le. 0d0 ) then -c surface negative => triangle a rejeter - q = 0 - else -c calcul de la qualite du triangle ns1-ns2-ns3 - call qutr2d( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), q ) - endif -c - if( q .ge. qmima*1.00001 ) then -c q est un vrai maximum de la qualite - qmima = q - nbmin = 1 - larmin(1) = nar3 - else if( q .ge. qmima*0.999998 ) then -c q est voisin de qmima -c il est empile - nbmin = nbmin + 1 - larmin( nbmin ) = nar3 - endif - goto 10 - endif -c -c bilan : existe t il plusieurs sommets de meme qualite? -c ====================================================== - if( nbmin .gt. 1 ) then -c -c oui:recherche de ceux de cercle ne contenant pas d'autres sommets - do 80 i=1,nbmin -c le sommet - nar = larmin( i ) - if( nar .le. 0 ) goto 80 - ns3 = noarcf(1,nar) -c les coordonnees du centre du cercle circonscrit -c et son rayon - ier = -1 - call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), - % centre, ier ) - if( ier .ne. 0 ) then -c le sommet ns3 ne convient pas - larmin( i ) = 0 - goto 80 - endif - rayon = centre(3) * unpeps - do 70 j=1,nbmin - if( j .ne. i ) then -c l'autre sommet - nar1 = larmin(j) - if( nar1 .le. 0 ) goto 70 - ns4 = noarcf(1,nar1) -c appartient t il au cercle ns1 ns2 ns3 ? - dd = (centre(1)-pxyd(1,ns4))**2 + - % (centre(2)-pxyd(2,ns4))**2 - if( dd .le. rayon ) then -c ns4 est dans le cercle circonscrit ns1 ns2 ns3 -c le sommet ns3 ne convient pas - larmin( i ) = 0 - goto 80 - endif - endif - 70 continue - 80 continue -c -c existe t il plusieurs sommets ? - j = 0 - do 90 i=1,nbmin - if( larmin( i ) .gt. 0 ) then -c compactage des min - j = j + 1 - larmin(j) = larmin(i) - endif - 90 continue -c - if( j .gt. 1 ) then -c oui : choix du plus petit rayon de cercle circonscrit - dmima = dmaxim - do 120 i=1,nbmin - ns3 = noarcf(1,larmin(i)) -c -c les coordonnees du centre de cercle circonscrit -c au triangle nt et son rayon - ier = -1 - call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), - % centre, ier ) - if( ier .ne. 0 ) then -c le sommet ns3 ne convient pas - goto 120 - endif - rayon = sqrt( centre(3) ) - if( rayon .lt. dmima ) then - dmima = rayon - larmin(1) = larmin(i) - endif - 120 continue - endif - endif -c -c le choix final -c ============== - namin = larmin(1) -c -c recherche de l'arete avant namin ( nar0 <> namin ) -c ================================================== - nar1 = nar0 - 200 if( nar1 .ne. namin ) then - namin0 = nar1 - nar1 = noarcf( 2, nar1 ) - goto 200 - endif - end - - subroutine trcf0a( nbcf, na01, na1, na2, na3, - % noar1, noar2, noar3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la triangulation du contour ferme nbcf -c ----- par ajout d'un triangle ayant 0 arete sur le contour -c creation des 3 aretes dans le tableau nosoar -c modification du contour par ajout de la 3-eme arete -c creation d'un contour ferme a partir de la seconde arete -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c na01 : numero noarcf de l'arete precedent l'arete na1 de noarcf -c na1 : numero noarcf du 1-er sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c na2 : numero noarcf du 2-eme sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c na3 : numero noarcf du 3-eme sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c noarst : noarst(i) numero d'une arete de sommet i -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c noar1 : numero dans le tableau nosoar de l'arete 1 du triangle -c noar2 : numero dans le tableau nosoar de l'arete 2 du triangle -c noar3 : numero dans le tableau nosoar de l'arete 3 du triangle -c nt : numero du triangle ajoute dans noartr -c 0 si saturation du tableau noartr ou noarcf ou n1arcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:*), - % noarcf(3,*) -c - ierr = 0 -c -c 2 contours fermes peuvent ils etre ajoutes ? - if( nbcf+2 .gt. mxarcf ) goto 9100 -c -c creation des 3 aretes du triangle dans le tableau nosoar -c ======================================================== -c la formation de l'arete sommet1-sommet2 dans le tableau nosoar - call fasoar( noarcf(1,na1), noarcf(1,na2), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar1, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c la formation de l'arete sommet2-sommet3 dans le tableau nosoar - call fasoar( noarcf(1,na2), noarcf(1,na3), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar2, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c la formation de l'arete sommet3-sommet1 dans le tableau nosoar - call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar3, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c ajout dans noartr de ce triangle nt -c =================================== - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noar1, noar2, noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c modification du contour nbcf existant -c chainage de l'arete na2 vers l'arete na1 -c ======================================== -c modification du cf en pointant na2 sur na1 - na2s = noarcf( 2, na2 ) - noarcf( 2, na2 ) = na1 -c le numero de l'arete dans le tableau nosoar - noar2s = noarcf( 3, na2 ) -c le numero de l'arete dans le tableau nosoar - noarcf( 3, na2 ) = noar1 -c debut du cf - n1arcf( nbcf ) = na2 -c -c creation d'un nouveau contour ferme na2 - na3 -c ============================================= - nbcf = nbcf + 1 -c recherche d'une arete de cf vide - nav = n1arcf(0) - if( nav .le. 0 ) goto 9100 -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav ) -c -c ajout de l'arete nav pointant sur na2s -c le numero du sommet - noarcf( 1, nav ) = noarcf( 1, na2 ) -c l'arete suivante - noarcf( 2, nav ) = na2s -c le numero nosoar de cette arete - noarcf( 3, nav ) = noar2s -c -c l'arete na3 se referme sur nav - na3s = noarcf( 2, na3 ) - noarcf( 2, na3 ) = nav -c le numero de l'arete dans le tableau nosoar - noar3s = noarcf( 3, na3 ) - noarcf( 3, na3 ) = noar2 -c debut du cf+1 - n1arcf( nbcf ) = na3 -c -c creation d'un nouveau contour ferme na3 - na1 -c ============================================= - nbcf = nbcf + 1 -c recherche d'une arete de cf vide - nav = n1arcf(0) - if( nav .le. 0 ) goto 9100 -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav ) -c -c ajout de l'arete nav pointant sur na3s -c le numero du sommet - noarcf( 1, nav ) = noarcf( 1, na3 ) -c l'arete suivante - noarcf( 2, nav ) = na3s -c le numero de l'arete dans le tableau nosoar - noarcf( 3, nav ) = noar3s -c -c recherche d'une arete de cf vide - nav1 = n1arcf(0) - if( nav1 .le. 0 ) goto 9100 -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav1 ) -c -c l'arete precedente na01 de na1 pointe sur la nouvelle nav1 - noarcf( 2, na01 ) = nav1 -c -c ajout de l'arete nav1 pointant sur nav -c le numero du sommet - noarcf( 1, nav1 ) = noarcf( 1, na1 ) -c l'arete suivante - noarcf( 2, nav1 ) = nav -c le numero de l'arete dans le tableau nosoar - noarcf( 3, nav1 ) = noar3 -c -c debut du cf+2 - n1arcf( nbcf ) = nav1 - return -c -c erreur - 9100 write(imprim,*) 'saturation du tableau mxarcf' - nt = 0 - return -c -c erreur tableau nosoar sature - 9900 write(imprim,*) 'saturation du tableau nosoar' - nt = 0 - return - end - - - subroutine trcf1a( nbcf, na01, na1, na2, noar1, noar3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la triangulation du contour ferme nbcf -c ----- par ajout d'un triangle ayant 1 arete sur le contour -c modification du contour par ajout de la 3-eme arete -c creation d'un contour ferme a partir de la seconde arete -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c na01 : numero noarcf de l'arete precedant l'arete na1 de noarcf -c na1 : numero noarcf du 1-er sommet du triangle -c implicitement l'arete na1 n'est pas une arete du triangle -c na2 : numero noarcf du 2-eme sommet du triangle -c cette arete est l'arete 2 du triangle a ajouter -c son arete suivante dans noarcf n'est pas sur le contour -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c noarst : noarst(i) numero d'une arete de sommet i -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c noar1 : numero nosoar de l'arete 1 du triangle cree -c noar3 : numero nosoar de l'arete 3 du triangle cree -c nt : numero du triangle ajoute dans notria -c 0 si saturation du tableau notria ou noarcf ou n1arcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:*), - % noarcf(3,*) -c -c un cf supplementaire peut il etre ajoute ? - if( nbcf .ge. mxarcf ) then - write(imprim,*) 'saturation du tableau noarcf' - nt = 0 - return - endif -c - ierr = 0 -c -c l' arete suivante du triangle non sur le cf - na3 = noarcf( 2, na2 ) -c -c creation des 2 nouvelles aretes du triangle dans le tableau nosoar -c ================================================================== -c la formation de l'arete sommet1-sommet2 dans le tableau nosoar - call fasoar( noarcf(1,na1), noarcf(1,na2), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar1, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c la formation de l'arete sommet1-sommet3 dans le tableau nosoar - call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar3, ierr ) - if( ierr .ne. 0 ) goto 9900 -c -c le triangle nt de noartr a l'arete 2 comme arete du contour na2 -c =============================================================== - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noar1, noarcf(3,na2), noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c modification du contour ferme existant -c suppression de l'arete na2 du cf -c ====================================== -c modification du cf en pointant na2 sur na1 - noarcf( 2, na2 ) = na1 - noarcf( 3, na2 ) = noar1 -c debut du cf - n1arcf( nbcf ) = na2 -c -c creation d'un nouveau contour ferme na3 - na1 -c ============================================= - nbcf = nbcf + 1 -c -c recherche d'une arete de cf vide - nav = n1arcf(0) - if( nav .le. 0 ) then - write(imprim,*) 'saturation du tableau noarcf' - nt = 0 - return - endif -c -c la 1-ere arete vide est mise a jour - n1arcf(0) = noarcf( 2, nav ) -c -c ajout de l'arete nav pointant sur na3 -c le numero du sommet - noarcf( 1, nav ) = noarcf( 1, na1 ) -c l'arete suivante - noarcf( 2, nav ) = na3 -c le numero de l'arete dans le tableau nosoar - noarcf( 3, nav ) = noar3 -c -c l'arete precedente na01 de na1 pointe sur la nouvelle nav - noarcf( 2, na01 ) = nav -c -c debut du cf - n1arcf( nbcf ) = nav - return -c -c erreur tableau nosoar sature - 9900 write(imprim,*) 'saturation du tableau nosoar' - nt = 0 - return - end - - - subroutine trcf2a( nbcf, na1, noar3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : modification de la triangulation du contour ferme nbcf -c ----- par ajout d'un triangle ayant 2 aretes sur le contour -c creation d'une arete dans nosoar (sommet3-sommet1) -c et modification du contour par ajout de la 3-eme arete -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c na1 : numero noarcf de la premiere arete sur le contour -c implicitement sa suivante est sur le contour -c la suivante de la suivante n'est pas sur le contour -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c noarst : noarst(i) numero d'une arete de sommet i -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c noar3 : numero de l'arete 3 dans le tableau nosoar -c nt : numero du triangle ajoute dans noartr -c 0 si saturation du tableau noartr ou nosoar -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*) - integer n1arcf(0:*), - % noarcf(3,*) -c - ierr = 0 -c -c l'arete suivante de l'arete na1 dans noarcf - na2 = noarcf( 2, na1 ) -c l'arete suivante de l'arete na2 dans noarcf - na3 = noarcf( 2, na2 ) -c -c la formation de l'arete sommet3-sommet1 dans le tableau nosoar - call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar3, ierr ) - if( ierr .ne. 0 ) then - if( ierr .eq. 1 ) then - write(imprim,*) 'saturation des aretes (tableau nosoar)' - endif - nt = 0 - return - endif -c -c le triangle a ses 2 aretes na1 na2 sur le contour ferme -c ajout dans noartr de ce triangle nt - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noarcf(3,na1), noarcf(3,na2), noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c suppression des 2 aretes (na1 na2) du cf -c ces 2 aretes se suivent dans le chainage du cf -c ajout de la 3-eme arete (noar3) dans le cf -c l'arete suivante de na1 devient la suivante de na2 - noarcf(2,na1) = na3 - noarcf(3,na1) = noar3 -c -c l'arete na2 devient vide dans noarcf - noarcf(2,na2) = n1arcf( 0 ) - n1arcf( 0 ) = na2 -c -c la premiere pointee dans noarcf est na1 -c chainage circulaire => ce peut etre n'importe laquelle - n1arcf(nbcf) = na1 - end - - - subroutine trcf3a( ns1, ns2, ns3, - % noar1, noar2, noar3, - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) -c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajouter dans le tableau noartr le triangle -c ----- de sommets ns1 ns2 ns3 -c d'aretes noar1 noar2 noar3 deja existantes -c dans le tableau nosoar des aretes -c -c entrees: -c -------- -c ns1, ns2, ns3 : le numero dans pxyd des 3 sommets du triangle -c noar1,noar2,noar3 : le numero dans nosoar des 3 aretes du triangle -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies : -c ---------- -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c sorties: -c -------- -c nt : numero dans noartr du triangle ajoute -c =0 si le tableau noartr est sature -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu,imprim,nunite(30) - integer nosoar(mosoar,*), - % noartr(moartr,*) -c -c recherche d'un triangle libre dans le tableau noartr - if( n1artr .le. 0 ) then - write(imprim,*) 'saturation du tableau noartr des aretes' - nt = 0 - return - endif -c -c le numero dans noartr du nouveau triangle - nt = n1artr -c -c le nouveau premier triangle vide dans le tableau noartr - n1artr = noartr(2,n1artr) -c -c arete 1 du triangle nt -c ====================== -c orientation des 3 aretes du triangle pour qu'il soit direct - if( ns1 .eq. nosoar(1,noar1) ) then - n = 1 - else - n = -1 - endif -c le numero de l'arete 1 du triangle nt - noartr(1,nt) = n * noar1 -c -c le numero du triangle nt pour l'arete - if( nosoar(4,noar1) .le. 0 ) then - n = 4 - else - n = 5 - endif - nosoar(n,noar1) = nt -c -c arete 2 du triangle nt -c ====================== -c orientation des 3 aretes du triangle pour qu'il soit direct - if( ns2 .eq. nosoar(1,noar2) ) then - n = 1 - else - n = -1 - endif -c le numero de l'arete 2 du triangle nt - noartr(2,nt) = n * noar2 -c -c le numero du triangle nt pour l'arete - if( nosoar(4,noar2) .le. 0 ) then - n = 4 - else - n = 5 - endif - nosoar(n,noar2) = nt -c -c arete 3 du triangle nt -c ====================== -c orientation des 3 aretes du triangle pour qu'il soit direct - if( ns3 .eq. nosoar(1,noar3) ) then - n = 1 - else - n = -1 - endif -c le numero de l'arete 3 du triangle nt - noartr(3,nt) = n * noar3 -c -c le numero du triangle nt pour l'arete - if( nosoar(4,noar3) .le. 0 ) then - n = 4 - else - n = 5 - endif - nosoar(n,noar3) = nt - end - - - - subroutine trcf3s( nbcf, na01, na1, na02, na2, na03, na3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajout d'un triangle d'aretes na1 2 3 du tableau noarcf -c ----- a la triangulation d'un contour ferme (cf) -c -c entrees: -c -------- -c nbcf : numero dans n1arcf du cf traite ici -c mais aussi nombre actuel de cf avant ajout du triangle -c na01 : numero noarcf de l'arete precedent l'arete na1 de noarcf -c na1 : numero noarcf du 1-er sommet du triangle -c na02 : numero noarcf de l'arete precedent l'arete na2 de noarcf -c na2 : numero noarcf du 2-eme sommet du triangle -c na03 : numero noarcf de l'arete precedent l'arete na3 de noarcf -c na3 : numero noarcf du 3-eme sommet du triangle -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre maximal d'aretes declarables dans noarcf, n1arcf -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c n1arcf : numero d'une arete de chaque contour ferme -c noarcf : numero du sommet , numero de l'arete suivante -c numero de l'arete dans le tableau nosoar -c attention : chainage circulaire des aretes -c -c sortie : -c -------- -c nbcf : nombre actuel de cf apres ajout du triangle -c nt : numero du triangle ajoute dans noartr -c 0 si saturation du tableau nosoar ou noartr ou noarcf ou n1arcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf) -c -c combien y a t il d'aretes nbascf sur le cf ? -c ============================================ -c la premiere arete est elle sur le cf? - if( noarcf(2,na1) .eq. na2 ) then -c la 1-ere arete est sur le cf - na1cf = 1 - else -c la 1-ere arete n'est pas sur le cf - na1cf = 0 - endif -c -c la seconde arete est elle sur le cf? - if( noarcf(2,na2) .eq. na3 ) then -c la 2-eme arete est sur le cf - na2cf = 1 - else - na2cf = 0 - endif -c -c la troisieme arete est elle sur le cf? - if( noarcf(2,na3) .eq. na1 ) then -c la 3-eme arete est sur le cf - na3cf = 1 - else - na3cf = 0 - endif -c -c le nombre d'aretes sur le cf - nbascf = na1cf + na2cf + na3cf -c -c traitement selon le nombre d'aretes sur le cf -c ============================================= - if( nbascf .eq. 3 ) then -c -c le contour ferme se reduit a un triangle avec 3 aretes sur le cf -c ---------------------------------------------------------------- -c ajout dans noartr de ce nouveau triangle - call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3), - % noarcf(3,na1), noarcf(3,na2), noarcf(3,na3), - % mosoar, nosoar, - % moartr, n1artr, noartr, - % nt ) - if( nt .le. 0 ) return -c -c le cf est supprime et chaine vide - noarcf(2,na3) = n1arcf(0) - n1arcf( 0 ) = na1 -c -c ce cf a ete traite => un cf de moins a traiter - nbcf = nbcf - 1 -c - else if( nbascf .eq. 2 ) then -c -c le triangle a 2 aretes sur le contour -c ------------------------------------- -c les 2 aretes sont la 1-ere et 2-eme du triangle - if( na1cf .eq. 0 ) then -c l'arete 1 n'est pas sur le cf - naa1 = na2 - else if( na2cf .eq. 0 ) then -c l'arete 2 n'est pas sur le cf - naa1 = na3 - else -c l'arete 3 n'est pas sur le cf - naa1 = na1 - endif -c le triangle oppose a l'arete 3 est inconnu -c modification du contour apres integration du -c triangle ayant ses 2-eres aretes sur le cf - call trcf2a( nbcf, naa1, naor3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % n1arcf, noarcf, nt ) -c - else if( nbascf .eq. 1 ) then -c -c le triangle a 1 arete sur le contour -c ------------------------------------ -c cette arete est la seconde du triangle - if( na3cf .ne. 0 ) then -c l'arete 3 est sur le cf - naa01 = na02 - naa1 = na2 - naa2 = na3 - else if( na1cf .ne. 0 ) then -c l'arete 1 est sur le cf - naa01 = na03 - naa1 = na3 - naa2 = na1 - else -c l'arete 2 est sur le cf - naa01 = na01 - naa1 = na1 - naa2 = na2 - endif -c le triangle oppose a l'arete 1 et 3 est inconnu -c modification du contour apres integration du -c triangle ayant 1 arete sur le cf avec creation -c d'un nouveau contour ferme - call trcf1a( nbcf, naa01, naa1, naa2, naor1, naor3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) -c - else -c -c le triangle a 0 arete sur le contour -c ------------------------------------ -c modification du contour apres integration du -c triangle ayant 0 arete sur le cf avec creation -c de 2 nouveaux contours fermes - call trcf0a( nbcf, na01, na1, na2, na3, - % naa1, naa2, naa01, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) - endif - end - - - subroutine tridcf( nbcf0, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, - % nbtrcf, notrcf, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : triangulation directe de nbcf0 contours fermes (cf) -c ----- definis par la liste circulaire de leurs aretes peripheriques -c -c entrees: -c -------- -c nbcf0 : nombre initial de cf a trianguler -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre maximal d'aretes declarables dans noarcf, n1arcf, larmin, not -c -c modifies: -c --------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c n1arcf : numero de la premiere arete de chacun des nbcf0 cf -c n1arcf(0) no de la premiere arete vide du tableau noarcf -c noarcf(2,i) no de l'arete suivante -c noarcf : numero du sommet , numero de l'arete suivante du cf -c numero de l'arete dans le tableau nosoar -c -c auxiliaires : -c ------------- -c larmin : tableau (mxarcf) auxiliaire -c stocker la liste des numeros des meilleures aretes -c lors de la selection du meilleur sommet du cf a trianguler -c cf le sp trchtd -c -c sortie : -c -------- -c nbtrcf : nombre de triangles des nbcf0 cf -c notrcf : numero des triangles des nbcf0 cf dans le tableau noartr -c ierr : 0 si pas d'erreur -c 2 saturation de l'un des des tableaux nosoar, noartr, ... -c 3 si contour ferme reduit a moins de 3 aretes -c 4 saturation du tableau notrcf -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer noartr(moartr,*), - % nosoar(mosoar,mxsoar), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf) -c -ccc integer nosotr(3) -ccc double precision d, surtd2 -c -c depart avec nbcf0 cf a trianguler - nbcf = nbcf0 -c -c le nombre de triangles formes dans l'ensemble des cf - nbtrcf = 0 -c -c tant qu'il existe un cf a trianguler faire -c la triangulation directe du cf -c ========================================== - 10 if( nbcf .gt. 0 ) then -c -c le cf en haut de pile a pour premiere arete - na01 = n1arcf( nbcf ) - na1 = noarcf( 2, na01 ) -c -c choix du sommet du cf a relier a l'arete na1 -c -------------------------------------------- - call trchtd( pxyd, na01, na1, noarcf, - % na03, na3, larmin ) - if( na3 .eq. 0 ) then - ierr = 3 - return - endif -c -c l'arete suivante de na1 - na02 = na1 - na2 = noarcf( 2, na1 ) -c -c formation du triangle arete na1 - sommet noarcf(1,na3) -c ------------------------------------------------------ - call trcf3s( nbcf, na01, na1, na02, na2, na03, na3, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, nt ) - if( nt .le. 0 ) then -c saturation du tableau noartr ou noarcf ou n1arcf - ierr = 2 - return - endif -c -c ajout du triangle cree a sa pile - if( nbtrcf .ge. mxarcf ) then - write(imprim,*) 'saturation du tableau notrcf' - ierr = 4 - return - endif - nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt - goto 10 - endif -c -c mise a jour du chainage des triangles des aretes -c ================================================ - do 30 ntp0 = 1, nbtrcf -c -c le numero du triangle ajoute dans le tableau noartr - nt0 = notrcf( ntp0 ) -c -cccc aire signee du triangle nt0 -cccc le numero des 3 sommets du triangle nt -ccc call nusotr( nt0, mosoar, nosoar, moartr, noartr, -ccc % nosotr ) -ccc d = surtd2( pxyd(1,nosotr(1)), pxyd(1,nosotr(2)), -ccc % pxyd(1,nosotr(3)) ) -ccc if( d .le. 0 ) then -cccc -cccc un triangle d'aire negative de plus -ccc write(imprim,*) 'triangle ',nt0,' st:',nosotr, -ccc % ' d aire ',d,'<=0' -ccc pause -ccc endif -c -cccc trace du triangle nt0 -ccc call mttrtr( pxyd, nt0, moartr, noartr, mosoar, nosoar, -ccc % ncturq, ncblan ) -c -c boucle sur les 3 aretes du triangle - do 20 i=1,3 -c -c le numero de l'arete i du triangle dans le tableau nosoar - noar = abs( noartr(i,nt0) ) -c -c ce triangle est il deja chaine dans cette arete? - nt1 = nosoar(4,noar) - nt2 = nosoar(5,noar) - if( nt1 .eq. nt0 .or. nt2 .eq. nt0 ) goto 20 -c -c ajout de ce triangle nt0 a l'arete noar - if( nt1 .le. 0 ) then -c le triangle est ajoute a l'arete - nosoar( 4, noar ) = nt0 - else if( nt2 .le. 0 ) then -c le triangle est ajoute a l'arete - nosoar( 5, noar ) = nt0 - else -c l'arete appartient a 2 triangles differents de nt0 -c anomalie. chainage des triangles des aretes defectueux -c a corriger - write(imprim,*) 'pause dans tridcf' - ierr = 5 - return - endif -c - 20 continue -c - 30 continue - end - - - subroutine te1stm( nsasup, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, notrcf, liarcf, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer de la triangulation le sommet nsasup qui doit -c ----- etre un sommet interne ("centre" d'une boule de triangles) -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c nsasup : numero dans le tableau pxyd du sommet a supprimer -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c modifies: -c --------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c -c auxiliaires : -c ------------- -c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers -c noarcf : tableau (3,mxarcf) auxiliaire d'entiers -c larmin : tableau ( mxarcf ) auxiliaire d'entiers -c notrcf : tableau ( mxarcf ) auxiliaire d'entiers -c liarcf : tableau ( mxarcf ) auxiliaire d'entiers -c -c sortie : -c -------- -c ierr : =0 si pas d'erreur -c -1 le sommet a supprimer n'est pas le centre d'une boule -c de triangles. il est suppose externe -c ou bien le sommet est centre d'un cf dont toutes les -c aretes sont frontalieres -c dans les 2 cas => retour sans modifs -c >0 si une erreur est survenue -c =11 algorithme defaillant -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter ( lchain=6, quamal=0.3) - common / unites / lecteu,imprim,intera,nunite(29) - double precision pxyd(3,*) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf), - % liarcf(mxarcf) -c -c nsasup est il un sommet interne, "centre" d'une boule de triangles? -c => le sommet nsasup peut etre supprime -c =================================================================== -c formation du cf de ''centre'' le sommet nsasup - call trp1st( nsasup, noarst, mosoar, nosoar, - % moartr, noartr, - % mxarcf, nbtrcf, notrcf ) - if( nbtrcf .le. 0 ) then -c erreur: impossible de trouver tous les triangles de sommet nsasup -c le sommet nsasup n'est pas supprime de la triangulation - ierr = -1 - return - else if( nbtrcf .le. 2 ) then -c le sommet nsasup n'est pas supprime - ierr = -1 - return - endif - if( nbtrcf*3 .gt. mxarcf ) then - write(imprim,*) 'saturation du tableau noarcf' - ierr = 10 - return - endif -c -ccc trace des triangles de l'etoile du sommet nsasup -ccc call trpltr( nbtrcf, notrcf, pxyd, -ccc % moartr, noartr, mosoar, nosoar, -ccc % ncroug, ncblan ) -c -c si toutes les aretes du cf sont frontalieres, alors il est -c interdit de detruire le sommet "centre" du cf -c calcul du nombre nbarfr des aretes simples des nbtrcf triangles - call trfrcf( nsasup, mosoar, nosoar, moartr, noartr, - % nbtrcf, notrcf, nbarfr ) - if( nbarfr .ge. nbtrcf ) then -c toutes les aretes simples sont frontalieres -c le sommet nsasup ("centre" de la cavite) n'est pas supprime - ierr = -1 - return - endif -c -c formation du contour ferme (liste chainee des aretes simples) -c forme a partir des aretes des triangles de l'etoile du sommet nsasup - call focftr( nbtrcf, notrcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % nbarcf, n1arcf, noarcf, - % ierr ) - if( ierr .ne. 0 ) return -c -c ici le sommet nsasup appartient a aucune arete - noarst( nsasup ) = 0 -c -c chainage des aretes vides dans le tableau noarcf - n1arcf(0) = nbarcf+1 - mmarcf = min(8*nbarcf,mxarcf) - do 40 i=nbarcf+1,mmarcf - noarcf(2,i) = i+1 - 40 continue - noarcf(2,mmarcf) = 0 -c -c sauvegarde du chainage des aretes peripheriques -c pour la mise en delaunay du maillage - nbcf = n1arcf(1) - do 50 i=1,nbarcf -c le numero de l'arete dans le tableau nosoar - liarcf( i ) = noarcf( 3, nbcf ) -c l'arete suivante dans le cf - nbcf = noarcf( 2, nbcf ) - 50 continue -c -c triangulation directe du contour ferme sans le sommet nsasup -c ============================================================ - nbcf = 1 - call tridcf( nbcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, - % nbtrcf, notrcf, ierr ) - if( ierr .ne. 0 ) return -c -c transformation des triangles du cf en triangles delaunay -c ======================================================== -c construction du chainage lchain dans nosoar -c des aretes peripheriques du cf a partir de la sauvegarde liarcf - noar0 = liarcf(1) - do 60 i=2,nbarcf -c le numero de l'arete peripherique du cf dans nosoar - noar = liarcf( i ) - if( nosoar(3,noar) .le. 0 ) then -c arete interne => elle est chainee a partir de la precedente - nosoar( lchain, noar0 ) = noar - noar0 = noar - endif - 60 continue -c la derniere arete peripherique n'a pas de suivante - nosoar(lchain,noar0) = 0 -c -c mise en delaunay des aretes chainees - call tedela( pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, liarcf(1), - % moartr, mxartr, n1artr, noartr, modifs ) -ccc write(imprim,*) 'nombre echanges diagonales =',modifs - return - end - - - subroutine tr3str( np, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les 3 sous-triangles du triangle nt a partir -c ----- du point interne np -c -c entrees: -c -------- -c np : numero dans le tableau pxyd du point -c nt : numero dans le tableau noartr du triangle a trianguler -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c sorties: -c -------- -c nutr : le numero des 3 sous-triangles du triangle nt -c nt : en sortie le triangle initial n'est plus actif dans noartr -c c'est en fait le premier triangle vide de noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - integer nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(3) -c - integer nosotr(3), nu2sar(2), nuarco(3) -c -c reservation des 3 nouveaux triangles dans le tableau noartr -c =========================================================== - do 10 i=1,3 -c le numero du sous-triangle i dans le tableau noartr - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(i) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 10 continue -c -c les numeros des 3 sommets du triangle nt - call nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr ) -c -c formation des 3 aretes nosotr(i)-np dans le tableau nosoar -c ========================================================== - nt0 = nutr(3) - do 20 i=1,3 -c -c le triangle a creer - nti = nutr(i) -c -c les 2 sommets du cote i du triangle nosotr - nu2sar(1) = nosotr(i) - nu2sar(2) = np - call hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, noar ) -c en sortie: noar>0 => no arete retrouvee -c <0 => no arete ajoutee -c =0 => saturation du tableau nosoar -c - if( noar .eq. 0 ) then -c saturation du tableau nosoar - ierr = 1 - return - else if( noar .lt. 0 ) then -c l'arete a ete ajoutee. initialisation des autres informations - noar = -noar -c le numero des 2 sommets a ete initialise par hasoar -c et (nosoar(1,noar) le triangle nt0 - nosoar(4,noar) = nt0 -c le triangle 2 de l'arete noar => le triangle nti - nosoar(5,noar) = nti -c -c le sommet nosotr(i) appartient a l'arete noar - noarst( nosotr(i) ) = noar -c -c le numero d'arete nosotr(i)-np - nuarco(i) = noar -c -c le triangle qui precede le suivant - nt0 = nti - 20 continue -c -c le numero d'une arete du point np - noarst( np ) = noar -c -c les 3 sous-triangles du triangle nt sont formes dans le tableau noartr -c ====================================================================== - do 30 i=1,3 -c -c le numero suivant i => i mod 3 + 1 - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c -c le numero dans noartr du sous-triangle a ajouter - nti = nutr( i ) -c -c le numero de l'arete i du triangle initial nt -c est l'arete 1 du sous-triangle i - noar = noartr(i,nt) - noartr( 1, nti ) = noar -c -c mise a jour du numero de triangle de cette arete - noar = abs( noar ) - if( nosoar(4,noar) .eq. nt ) then -c le sous-triangle nti remplace le triangle nt - nosoar(4,noar) = nti - else -c le sous-triangle nti remplace le triangle nt - nosoar(5,noar) = nti - endif -c -c l'arete 2 du sous-triangle i est l'arete i1 ajoutee - if( nosotr(i1) .eq. nosoar(1,nuarco(i1)) ) then -c l'arete ns i1-np dans nosoar est dans le sens direct - noartr( 2, nti ) = nuarco(i1) - else -c l'arete ns i1-np dans nosoar est dans le sens indirect - noartr( 2, nti ) = -nuarco(i1) - endif -c -c l'arete 3 du sous-triangle i est l'arete i ajoutee - if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then -c l'arete ns i1-np dans nosoar est dans le sens indirect - noartr( 3, nti ) = -nuarco(i) - else -c l'arete ns i1-np dans nosoar est dans le sens direct - noartr( 3, nti ) = nuarco(i) - endif - 30 continue -c -c le triangle nt est rendu libre -c ============================== -c il devient n1artr le premier triangle libre - noartr( 1, nt ) = 0 - noartr( 2, nt ) = n1artr - n1artr = nt - end - - - subroutine mt4sqa( na, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3, ns4) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul du numero des 4 sommets de l'arete na de nosoar -c ----- formant un quadrangle -c -c entrees: -c -------- -c na : numero de l'arete dans nosoar a traiter -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1=0 si triangle vide => arete2=triangle vide suivant -c mosoar : nombre maximal d'entiers par arete -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c -c sorties: -c -------- -c ns1,ns2,ns3 : les 3 numeros des sommets du triangle t1 en sens direct -c ns1,ns4,ns2 : les 3 numeros des sommets du triangle t2 en sens direct -c -c si erreur rencontree => ns4 = 0 -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - common / unites / lecteu, imprim, nunite(30) - integer noartr(moartr,*), nosoar(mosoar,*) -c -c le numero de triangle est il correct ? -c a supprimer apres mise au point - if( na .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = kerr(mxlger)(1:6) // -c % ' no incorrect arete dans nosoar' -c call lereur - write(imprim,*) na, ' no incorrect arete dans nosoar' - ns4 = 0 - return - endif -c - if( nosoar(1,na) .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = kerr(mxlger)(1:6) // -c % ' arete non active dans nosoar' -c call lereur - write(imprim,*) na, ' arete non active dans nosoar' - ns4 = 0 - return - endif -c -c recherche de l'arete na dans le premier triangle - nt = nosoar(4,na) - if( nt .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = 'triangle 1 incorrect pour l''arete ' // -c % kerr(mxlger)(1:6) -c call lereur - write(imprim,*) 'triangle 1 incorrect pour l''arete ', na - ns4 = 0 - return - endif -c - do 5 i=1,3 - if( abs( noartr(i,nt) ) .eq. na ) goto 8 - 5 continue -c si arrivee ici => bogue avant - write(imprim,*) 'mt4sqa: arete',na,' non dans le triangle',nt - ns4 = 0 - return -c -c les 2 sommets de l'arete na - 8 if( noartr(i,nt) .gt. 0 ) then - ns1 = 1 - ns2 = 2 - else - ns1 = 2 - ns2 = 1 - endif - ns1 = nosoar(ns1,na) - ns2 = nosoar(ns2,na) -c -c l'arete suivante - if( i .lt. 3 ) then - i = i + 1 - else - i = 1 - endif - naa = abs( noartr(i,nt) ) -c -c le sommet ns3 du triangle 123 - ns3 = nosoar(1,naa) - if( ns3 .eq. ns1 .or. ns3 .eq. ns2 ) then - ns3 = nosoar(2,naa) - endif -c -c le triangle de l'autre cote de l'arete na -c ========================================= - nt = nosoar(5,na) - if( nt .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') na -c kerr(1) = 'triangle 2 incorrect pour l''arete ' // -c % kerr(mxlger)(1:6) -c call lereur - write(imprim,*) 'triangle 2 incorrect pour l''arete ',na - ns4 = 0 - return - endif -c -c le numero de l'arete naa du triangle nt - naa = abs( noartr(1,nt) ) - if( naa .eq. na ) naa = abs( noartr(2,nt) ) - ns4 = nosoar(1,naa) - if( ns4 .eq. ns1 .or. ns4 .eq. ns2 ) then - ns4 = nosoar(2,naa) - endif - end - - - subroutine te2t2t( noaret, mosoar, n1soar, nosoar, noarst, - % moartr, noartr, noar34 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : echanger la diagonale des 2 triangles ayant en commun -c ----- l'arete noaret du tableau nosoar si c'est possible -c -c entrees: -c -------- -c noaret : numero de l'arete a echanger entre les 2 triangles -c mosoar : nombre maximal d'entiers par arete -c moartr : nombre maximal d'entiers par triangle -c -c modifies : -c ---------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c noarst : noarst(i) numero d'une arete de sommet i -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c sortie : -c -------- -c noar34 : numero nosoar de la nouvelle arete diagonale -c 0 si pas d'echange des aretes diagonales -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc avril 1997 -c....................................................................012 - integer nosoar(mosoar,*), - % noartr(moartr,*), - % noarst(*) -c -c une arete frontaliere ne peut etre echangee - noar34 = 0 - if( nosoar(3,noaret) .gt. 0 ) return -c -c les 4 sommets des 2 triangles ayant l'arete noaret en commun - call mt4sqa( noaret, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3, ns4) -c ns1,ns2,ns3 : les 3 numeros des sommets du triangle nt1 en sens direct -c ns1,ns4,ns2 : les 3 numeros des sommets du triangle nt2 en sens direct -c -c recherche du numero de l'arete noaret dans le triangle nt1 - nt1 = nosoar(4,noaret) - do 10 n1 = 1, 3 - if( abs(noartr(n1,nt1)) .eq. noaret ) goto 15 - 10 continue -c impossible d'arriver ici sans bogue! - write(imprim,*) 'pause dans te2t2t 1' -c -c l'arete de sommets 2 et 3 - 15 if( n1 .lt. 3 ) then - n2 = n1 + 1 - else - n2 = 1 - endif - na23 = noartr(n2,nt1) -c -c l'arete de sommets 3 et 1 - if( n2 .lt. 3 ) then - n3 = n2 + 1 - else - n3 = 1 - endif - na31 = noartr(n3,nt1) -c -c recherche du numero de l'arete noaret dans le triangle nt2 - nt2 = nosoar(5,noaret) - do 20 n1 = 1, 3 - if( abs(noartr(n1,nt2)) .eq. noaret ) goto 25 - 20 continue -c impossible d'arriver ici sans bogue! - write(imprim,*) 'pause dans te2t2t 2' -c -c l'arete de sommets 1 et 4 - 25 if( n1 .lt. 3 ) then - n2 = n1 + 1 - else - n2 = 1 - endif - na14 = noartr(n2,nt2) -c -c l'arete de sommets 4 et 2 - if( n2 .lt. 3 ) then - n3 = n2 + 1 - else - n3 = 1 - endif - na42 = noartr(n3,nt2) -c -c les triangles 123 142 deviennent 143 234 -c ======================================== -c ajout de l'arete ns3-ns4 -c on evite l'affichage de l'erreur - ierr = -1 - call fasoar( ns3, ns4, nt1, nt2, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % noar34, ierr ) - if( ierr .gt. 0 ) then -c ierr=1 si le tableau nosoar est sature -c =2 si arete a creer et appartenant a 2 triangles distincts -c des triangles nt1 et nt2 -c =3 si arete appartenant a 2 triangles distincts -c differents des triangles nt1 et nt2 -c =4 si arete appartenant a 2 triangles distincts -c dont le second n'est pas le triangle nt2 -c => pas d'echange - noar34 = 0 - return - endif -c -c suppression de l'arete noaret - call sasoar( noaret, mosoar, mxsoar, n1soar, nosoar ) -c -c nt1 = triangle 143 - noartr(1,nt1) = na14 -c sens de stockage de l'arete ns3-ns4 dans nosoar? - if( nosoar(1,noar34) .eq. ns3 ) then - n1 = -1 - else - n1 = 1 - endif - noartr(2,nt1) = noar34 * n1 - noartr(3,nt1) = na31 -c -c nt2 = triangle 234 - noartr(1,nt2) = na23 - noartr(2,nt2) = -noar34 * n1 - noartr(3,nt2) = na42 -c -c echange nt1 -> nt2 pour l'arete na23 - na23 = abs( na23 ) - if( nosoar(4,na23) .eq. nt1 ) then - n1 = 4 - else - n1 = 5 - endif - nosoar(n1,na23) = nt2 -c -c echange nt2 -> nt1 pour l'arete na14 - na14 = abs( na14 ) - if( nosoar(4,na14) .eq. nt2 ) then - n1 = 4 - else - n1 = 5 - endif - nosoar(n1,na14) = nt1 -c -c numero d'une arete de chacun des 4 sommets - noarst(ns1) = na14 - noarst(ns2) = na23 - noarst(ns3) = noar34 - noarst(ns4) = noar34 - end - - - - subroutine f0trte( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former le ou les triangles du triangle equilateral letree -c ----- les points internes au te deviennent des sommets des -c sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) - integer nuarco(3) -c -c le numero nt du triangle dans le tableau noartr - if( n1artr .le. 0 ) then -c tableau noartr sature - write(imprim,*) 'f0trte: tableau noartr sature' - ierr = 2 - return - endif - nt = n1artr -c le numero du nouveau premier triangle libre dans noartr - n1artr = noartr( 2, n1artr ) -c -c formation du triangle = le triangle equilateral letree - do 10 i=1,3 - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c ajout eventuel de l'arete si si+1 dans le tableau nosoar - call fasoar( letree(5+i), letree(5+i1), nt, -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i), ierr ) - if( ierr .ne. 0 ) return - 10 continue -c -c le triangle nt est forme dans le tableau noartr - do 20 i=1,3 -c letree(5+i) est le numero du sommet 1 de l'arete i du te - if( letree(5+i) .eq. nosoar(1,nuarco(i)) ) then - lesign = 1 - else - lesign = -1 - endif -c l'arete ns1-ns2 dans nosoar est celle du cote du te - noartr( i, nt ) = lesign * nuarco(i) - 20 continue -c -c triangulation du te=triangle nt par ajout des points internes du te - nbtr = 1 - nutr(1) = nt - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - subroutine f1trte( letree, pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les triangles du triangle equilateral letree -c ----- a partir de l'un des 3 milieux des cotes du te -c et des points internes au te -c ils deviennent tous des sommets des sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te -c 0 si pas de milieu du cote i a ajouter -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(np) numero d'une arete du sommet np -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - double precision pxyd(3,*) - integer letree(0:8), - % milieu(3), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nosotr(3), nuarco(5) -c -c le numero des 2 triangles (=2 demi te) a creer dans le tableau noartr - do 5 nbtr=1,2 - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(nbtr) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 5 continue - nbtr = 2 -c -c recherche du milieu a creer - do 7 i=1,3 - if( milieu(i) .ne. 0 ) goto 9 - 7 continue -c le numero pxyd du point milieu du cote i - 9 nm = milieu( i ) -c -c on se ramene au seul cas i=3 c-a-d le milieu est sur le cote 3 - if( i .eq. 1 ) then -c milieu sur le cote 1 - nosotr(1) = letree(7) - nosotr(2) = letree(8) - nosotr(3) = letree(6) - else if( i .eq. 2 ) then -c milieu sur le cote 2 - nosotr(1) = letree(8) - nosotr(2) = letree(6) - nosotr(3) = letree(7) - else -c milieu sur le cote 3 - nosotr(1) = letree(6) - nosotr(2) = letree(7) - nosotr(3) = letree(8) - endif -c -c formation des 2 aretes s1 s2 et s2 s3 - do 10 i=1,2 - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c ajout eventuel de l'arete dans nosoar - call fasoar( nosotr(i), nosotr(i1), nutr(i), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i), ierr ) - if( ierr .ne. 0 ) return - 10 continue -c -c ajout eventuel de l'arete s3 milieu dans nosoar - call fasoar( nosotr(3), nm, nutr(2), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(3), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete milieu s1 dans nosoar - call fasoar( nosotr(1), nm, nutr(1), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(4), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete milieu s2 dans nosoar - call fasoar( nosotr(2), nm, nutr(1), nutr(2), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(5), ierr ) - if( ierr .ne. 0 ) return -c -c les aretes s1 s2 et s2 s3 dans le tableau noartr - do 20 i=1,2 -c nosotr(i) est le numero du sommet 1 de l'arete i du te - if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then - lesign = 1 - else - lesign = -1 - endif -c l'arete ns1-ns2 dans nosoar est celle du cote du te - noartr( 1, nutr(i) ) = lesign * nuarco(i) - 20 continue -c -c l'arete mediane s2 milieu - if( nm .eq. nosoar(1,nuarco(5)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( 2, nutr(1) ) = lesign * nuarco(5) - noartr( 3, nutr(2) ) = -lesign * nuarco(5) -c -c l'arete s1 milieu - if( nm .eq. nosoar(1,nuarco(4)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(1) ) = lesign * nuarco(4) -c -c l'arete s3 milieu - if( nm .eq. nosoar(1,nuarco(3)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( 2, nutr(2) ) = lesign * nuarco(3) -c -c triangulation des 2 demi te par ajout des points internes du te - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - subroutine f2trte( letree, pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les triangles du triangle equilateral letree -c ----- a partir de 2 milieux des cotes du te -c et des points internes au te -c ils deviennent tous des sommets des sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te -c 0 si pas de milieu du cote i a ajouter -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(np) numero d'une arete du sommet np -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % milieu(3), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nosotr(3), nuarco(7) -c -c le numero des 3 triangles a creer dans le tableau noartr - do 5 nbtr=1,3 - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(nbtr) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 5 continue - nbtr = 3 -c -c recherche du premier milieu a creer - do 7 i=1,3 - if( milieu(i) .ne. 0 ) goto 9 - 7 continue -c -c on se ramene au seul cas i=2 c-a-d le cote 1 n'a pas de milieu - 9 if( i .eq. 2 ) then -c pas de milieu sur le cote 1 - nosotr(1) = letree(6) - nosotr(2) = letree(7) - nosotr(3) = letree(8) -c le numero pxyd du milieu du cote 2 - nm2 = milieu( 2 ) -c le numero pxyd du milieu du cote 3 - nm3 = milieu( 3 ) - else if( milieu(2) .ne. 0 ) then -c pas de milieu sur le cote 3 - nosotr(1) = letree(8) - nosotr(2) = letree(6) - nosotr(3) = letree(7) -c le numero pxyd du milieu du cote 2 - nm2 = milieu( 1 ) -c le numero pxyd du milieu du cote 3 - nm3 = milieu( 2 ) - else -c pas de milieu sur le cote 2 - nosotr(1) = letree(7) - nosotr(2) = letree(8) - nosotr(3) = letree(6) -c le numero pxyd du milieu du cote 2 - nm2 = milieu( 3 ) -c le numero pxyd du milieu du cote 3 - nm3 = milieu( 1 ) - endif -c -c ici seul le cote 1 n'a pas de milieu -c nm2 est le milieu du cote 2 -c nm3 est le milieu du cote 3 -c -c ajout eventuel de l'arete s1 s2 dans nosoar - call fasoar( nosotr(1), nosotr(2), nutr(1), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(1), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete s1 s2 dans nosoar - call fasoar( nosotr(2), nm2, nutr(1), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(2), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete s1 nm2 dans nosoar - call fasoar( nosotr(1), nm2, nutr(1), nutr(2), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(3), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete nm2 nm3 dans nosoar - call fasoar( nm3, nm2, nutr(2), nutr(3), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(4), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete s1 nm3 dans nosoar - call fasoar( nosotr(1), nm3, nutr(2), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(5), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete nm2 s3 dans nosoar - call fasoar( nm2, nosotr(3), nutr(3), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(6), ierr ) -c -c ajout eventuel de l'arete nm3 s3 dans nosoar - call fasoar( nosotr(3), nm3, nutr(3), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(7), ierr ) - if( ierr .ne. 0 ) return -c -c le triangle s1 s2 nm2 ou arete1 arete2 arete3 - do 20 i=1,2 -c nosotr(i) est le numero du sommet 1 de l'arete i du te - if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then - lesign = 1 - else - lesign = -1 - endif -c l'arete ns1-ns2 dans nosoar est celle du cote du te - noartr( i, nutr(1) ) = lesign * nuarco(i) - 20 continue - if( nm2 .eq. nosoar(1,nuarco(3)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(1) ) = lesign * nuarco(3) -c -c le triangle s1 nm2 nm3 - noartr( 1, nutr(2) ) = -lesign * nuarco(3) - if( nm2 .eq. nosoar(1,nuarco(4)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 2, nutr(2) ) = lesign * nuarco(4) - noartr( 1, nutr(3) ) = -lesign * nuarco(4) - if( nm3 .eq. nosoar(1,nuarco(5)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(2) ) = lesign * nuarco(5) -c -c le triangle nm2 nm3 s3 - if( nm2 .eq. nosoar(1,nuarco(6)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 2, nutr(3) ) = lesign * nuarco(6) - if( nm3 .eq. nosoar(1,nuarco(7)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( 3, nutr(3) ) = lesign * nuarco(7) -c -c triangulation des 3 sous-te par ajout des points internes du te - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - subroutine f3trte( letree, pxyd, milieu, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former les triangles du triangle equilateral letree -c ----- a partir de 3 milieux des cotes du te -c et des points internes au te -c ils deviennent tous des sommets des sous-triangles du te -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c si letree(0)>0 alors -c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te -c 0 si pas de milieu du cote i a ajouter -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(np) numero d'une arete du sommet np -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te, triangulation du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % milieu(3), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nuarco(9) -c -c le numero des 4 triangles a creer dans le tableau noartr - do 5 nbtr=1,4 - if( n1artr .le. 0 ) then -c tableau noartr sature - ierr = 2 - return - endif - nutr(nbtr) = n1artr -c le nouveau premier triangle libre dans noartr - n1artr = noartr(2,n1artr) - 5 continue - nbtr = 4 -c - do 10 i=1,3 -c le sommet suivant - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c le sommet precedant - if( i .ne. 1 ) then - i0 = i - 1 - else - i0 = 3 - endif - i3 = 3 * i -c -c ajout eventuel de l'arete si mi dans nosoar - call fasoar( letree(5+i), milieu(i), nutr(i), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i3-2), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete mi mi-1 dans nosoar - call fasoar( milieu(i), milieu(i0), nutr(i), nutr(4), 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i3-1), ierr ) - if( ierr .ne. 0 ) return -c -c ajout eventuel de l'arete m i-1 si dans nosoar - call fasoar( milieu(i0), letree(5+i), nutr(i), -1, 0, - % mosoar, mxsoar, n1soar, nosoar, noarst, - % nuarco(i3), ierr ) - if( ierr .ne. 0 ) return -c - 10 continue -c -c les 3 sous-triangles pres des sommets - do 20 i=1,3 -c le sommet suivant - if( i .ne. 3 ) then - i1 = i + 1 - else - i1 = 1 - endif -c le sommet precedant - if( i .ne. 1 ) then - i0 = i - 1 - else - i0 = 3 - endif - i3 = 3 * i -c -c ajout du triangle arete3i-2 arete3i-1 arete3i - if( letree(5+i) .eq. nosoar(1,nuarco(i3-2)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 1, nutr(i) ) = lesign * nuarco(i3-2) -c - if( milieu(i) .eq. nosoar(1,nuarco(i3-1)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 2, nutr(i) ) = lesign * nuarco(i3-1) -c - if( milieu(i0) .eq. nosoar(1,nuarco(i3)) ) then - lesign = 1 - else - lesign = -1 - endif - noartr( 3, nutr(i) ) = lesign * nuarco(i3) -c - 20 continue -c -c le sous triangle central - i3 = -1 - do 30 i=1,3 - i3 = i3 + 3 - if( milieu(i) .eq. nosoar(1,nuarco(i3)) ) then - lesign = -1 - else - lesign = 1 - endif - noartr( i, nutr(4) ) = lesign * nuarco(i3) - 30 continue -c -c triangulation des 3 sous-te par ajout des points internes du te - call trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, noarst, - % nbtr, nutr, ierr ) - end - - - - subroutine hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, - % noar ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : rechercher le numero des 2 sommets d'une arete parmi -c ----- les numeros des 2 sommets des aretes du tableau nosoar -c s ils n y sont pas stockes les y ajouter -c dans tous les cas retourner le numero de l'arete dans nosoar -c -c la methode employee ici est celle du hachage -c avec pour fonction d'adressage h(ns1,ns2)=min(ns1,ns2) -c -c remarque: h(ns1,ns2)=ns1 + 2*ns2 -c ne marche pas si des aretes sont detruites -c et ajoutees aux aretes vides -c le chainage est commun a plusieurs hachages! -c d'ou ce choix du minimum pour le hachage -c -c entrees: -c -------- -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c chainage des aretes vides amont et aval -c l'arete vide qui precede=nosoar(4,i) -c l'arete vide qui suit =nosoar(5,i) -c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete, -c chainage momentan'e d'aretes, chainage du hachage des aretes -c hachage des aretes = min( nosoar(1), nosoar(2) ) -c nu2sar : en entree les 2 numeros des sommets de l'arete -c en sortie nu2sar(1)0 si le tableau nu2sar est l'arete noar retrouvee -c dans le tableau nosoar -c <0 si le tableau nu2sar a ete ajoute et forme l'arete -c -noar du tableau nosoar avec nosoar(1,noar) elle devient la nouvelle arete -c retouche des chainages de cette arete noar qui ne sera plus vide - noar = nu2sar(1) -c l'eventuel chainage du hachage n'est pas modifie -c - else -c -c la premiere arete dans l'adressage du hachage n'est pas libre -c => choix quelconque d'une arete vide pour ajouter cette arete - if( n1soar .le. 0 ) then -c -c le tableau nosoar est sature avec pour temoin d'erreur - noar = 0 - return -c - else -c -c l'arete n1soar est vide => c'est la nouvelle arete -c mise a jour du chainage de la derniere arete noar du chainage -c sa suivante est la nouvelle arete n1soar - nosoar( mosoar, noar ) = n1soar -c -c l'arete ajoutee est n1soar - noar = n1soar -c -c la nouvelle premiere arete vide - n1soar = nosoar( 5, n1soar ) -c -c la premiere arete vide n1soar n'a pas d'arete vide precedente - nosoar( 4, n1soar ) = 0 -c -c noar la nouvelle arete est la derniere du chainage du hachage - nosoar( mosoar, noar ) = 0 -c - endif -c - endif -c -c les 2 sommets de la nouvelle arete noar - nosoar( 1, noar ) = nu2sar(1) - nosoar( 2, noar ) = nu2sar(2) -c -c le tableau nu2sar a ete ajoute avec l'indice -noar - noar = - noar - end - - - subroutine mt3str( nt, moartr, noartr, mosoar, nosoar, - % ns1, ns2, ns3 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : calcul du numero des 3 sommets du triangle nt du tableau noartr -c ----- -c -c entrees: -c -------- -c nt : numero du triangle de noartr a traiter -c moartr : nombre maximal d'entiers par triangle -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1=0 si triangle vide => arete2=triangle vide suivant -c mosoar : nombre maximal d'entiers par arete -c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en + -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c -c sorties: -c -------- -c ns1,ns2,ns3 : les 3 numeros des sommets du triangle en sens direct -c -c si erreur rencontree => ns1 = 0 -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juillet 1995 -c2345x7..............................................................012 - integer noartr(moartr,*), nosoar(mosoar,*) -c -c le numero de triangle est il correct ? -c a supprimer apres mise au point - if( nt .le. 0 ) then -c nblgrc(nrerr) = 1 -c write(kerr(mxlger)(1:6),'(i6)') nt -c kerr(1) = kerr(mxlger)(1:6) // -c % ' no triangle dans noartr incorrect' -c call lereur - write(imprim,*) nt,' no triangle dans noartr incorrect' - ns1 = 0 - return - endif -c - na = noartr(1,nt) - if( na .gt. 0 ) then -c arete dans le sens direct - ns1 = nosoar(1,na) - ns2 = nosoar(2,na) - else -c arete dans le sens indirect - ns1 = nosoar(2,-na) - ns2 = nosoar(1,-na) - endif -c - na = noartr(2,nt) - if( na .gt. 0 ) then -c arete dans le sens direct => ns3 est le second sommet de l'arete - ns3 = nosoar(2,na) - else -c arete dans le sens indirect => ns3 est le premier sommet de l'arete - ns3 = nosoar(1,-na) - endif - end - subroutine trpite( letree, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nbtr, nutr, ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former le ou les sous-triangles des nbtr triangles nutr -c ----- qui forment le triangle equilateral letree par ajout -c des points internes au te qui deviennent des sommets des -c sous-triangles des nbtr triangles -c -c entrees: -c -------- -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0:3):-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( le te est ici une feuille de l'arbre ) -c letree(4) : no letree du sur-triangle du triangle j -c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8) : no pxyd des 3 sommets du triangle j -c pxyd : tableau des x y distance_souhaitee de chaque sommet -c mosoar : nombre maximal d'entiers par arete du tableau nosoar -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c moartr : nombre maximal d'entiers par arete du tableau noartr -c mxartr : nombre maximal de triangles stockables dans le tableau noartr -c -c modifies: -c --------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar -c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c sorties: -c -------- -c nbtr : nombre de sous-triangles du te -c nutr : numero des nbtr sous-triangles du te dans le tableau noartr -c ierr : =0 si pas d'erreur -c =1 si le tableau nosoar est sature -c =2 si le tableau noartr est sature -c =3 si aucun des triangles ne contient l'un des points internes au te -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - logical tratri - common / dv2dco / tratri -c trace ou non des triangles generes dans la triangulation - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer letree(0:8), - % nosoar(mosoar,mxsoar), - % noartr(moartr,mxartr), - % noarst(*), - % nutr(1:nbtr) -c - integer nosotr(3) -c -c si pas de point interne alors trace eventuel puis retour - if( letree(0) .eq. 0 ) goto 150 -c -c il existe au moins un point interne a trianguler -c dans les nbtr triangles - do 100 k=0,3 -c -c le numero du point - np = -letree(k) - if( np .eq. 0 ) goto 150 -c -c le point np dans pxyd est a traiter - do 10 n = 1, nbtr -c -c les numeros des 3 sommets du triangle nt=nutr(n) - nt = nutr(n) - call nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr ) -c -c le triangle nt contient il le point np? - call ptdatr( pxyd(1,np), pxyd, nosotr, nsigne ) -c nsigne>0 si le point est dans le triangle ou sur une des 3 aretes -c =0 si triangle degenere ou indirect ou ne contient pas le poin -c - if( nsigne .gt. 0 ) then -c -c le triangle nt est triangule en 3 sous-triangles - call tr3str( np, nt, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, mxartr, n1artr, noartr, - % noarst, - % nutr(nbtr+1), ierr ) - if( ierr .ne. 0 ) return -c -c reamenagement des 3 triangles crees dans nutr -c en supprimant le triangle nt - nutr( n ) = nutr( nbtr + 3 ) - nbtr = nbtr + 2 -c le point np est triangule - goto 100 -c - endif - 10 continue -c -c erreur: le point np n'est pas dans l'un des nbtr triangles - write(imprim,10010) np - ierr = 3 - return -c - 100 continue -10010 format(' erreur trpite: pas de triangle contenant le point',i7) -c - 150 continue - -ccc 150 if( tratri ) then -cccc les traces sont demandes -ccc call efface -cccc le cadre objet global en unites utilisateur -ccc xx1 = min(pxyd(1,nosotr(1)),pxyd(1,nosotr(2)),pxyd(1,nosotr(3))) -ccc xx2 = max(pxyd(1,nosotr(1)),pxyd(1,nosotr(2)),pxyd(1,nosotr(3))) -ccc yy1 = min(pxyd(2,nosotr(1)),pxyd(2,nosotr(2)),pxyd(2,nosotr(3))) -ccc yy2 = max(pxyd(2,nosotr(1)),pxyd(2,nosotr(2)),pxyd(2,nosotr(3))) -ccc if( xx1 .ge. xx2 ) xx2 = xx1 + (yy2-yy1) -ccc if( yy1 .ge. yy2 ) yy2 = yy1 + (xx2-xx1)*0.5 -ccc call isofenetre( xx1-(xx2-xx1), xx2+(xx2-xx1), -ccc % yy1-(yy2-yy1), yy2+(yy2-yy1) ) -ccc do 200 i=1,nbtr -cccc trace du triangle nutr(i) -ccc call mttrtr( pxyd, nutr(i), moartr, noartr, mosoar, nosoar, -ccc % i, ncblan ) -ccc 200 continue -ccc endif - - end - - - subroutine sasoar( noar, mosoar, mxsoar, n1soar, nosoar ) -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : supprimer l'arete noar du tableau nosoar -c ----- si celle ci n'est pas une arete des lignes de la frontiere -c -c la methode employee ici est celle du hachage -c avec pour fonction d'adressage h = min( nu2sar(1), nu2sar(2) ) -c -c attention: il faut mettre a jour le no d'arete des 2 sommets -c de l'arete supprimee dans le tableau noarst! -c -c entrees: -c -------- -c noar : numero de l'arete de nosoar a supprimer -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage h -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(4,arete vide)=l'arete vide qui precede -c nosoar(5,arete vide)=l'arete vide qui suit -c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique upmc paris mars 1997 -c ...................................................................012 - common / unites / lecteu, imprim, nunite(30) - integer nosoar(mosoar,mxsoar) -c - if( nosoar(3,noar) .le. 0 ) then -c -c l'arete n'est pas frontaliere => elle devient une arete vide -c -c recherche de l'arete qui precede dans le chainage du hachage - noar1 = nosoar(1,noar) -c -c parcours du chainage du hachage jusqu'a retrouver l'arete noar - 10 if( noar1 .ne. noar ) then -c -c l'arete suivante parmi celles ayant meme fonction d'adressage - noar0 = noar1 - noar1 = nosoar( mosoar, noar1 ) - if( noar1 .gt. 0 ) goto 10 -c -c l'arete noar n'a pas ete retrouvee dans le chainage => erreur - write(imprim,*) 'erreur sasoar:arete non dans le chainage ' - % ,noar - write(imprim,*) 'arete de st1=',nosoar(1,noar), - % ' st2=',nosoar(2,noar),' ligne=',nosoar(3,noar), - % ' tr1=',nosoar(4,noar),' tr2=',nosoar(5,noar) - write(imprim,*) 'chainages=',(nosoar(i,noar),i=6,mosoar) -c l'arete n'est pas detruite - return -c - endif -c - if( noar .ne. nosoar(1,noar) ) then -c -c saut de l'arete noar dans le chainage du hachage -c noar0 initialisee est ici l'arete qui precede noar dans ce chainage - nosoar( mosoar, noar0 ) = nosoar( mosoar, noar ) -c -c le chainage du hachage n'existe plus pour noar -c pas utile car mise a zero faite dans le sp hasoar -ccc nosoar( mosoar, noar ) = 0 -c -c noar devient la nouvelle premiere arete du chainage des vides - nosoar( 4, noar ) = 0 - nosoar( 5, noar ) = n1soar -c la nouvelle precede l'ancienne premiere - nosoar( 4, n1soar ) = noar - n1soar = noar -c -ccc else -c -c noar est la premiere arete du chainage du hachage h -c cette arete ne peut etre consideree dans le chainage des vides -c car le chainage du hachage doit etre conserve (sinon perte...) -c - endif -c -c le temoin d'arete vide - nosoar( 1, noar ) = 0 - endif - end - - - subroutine caetoi( noar, mosoar, mxsoar, n1soar, nosoar, - % n1aeoc, nbtrar ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : ajouter (ou retirer) l'arete noar de nosoar de l'etoile -c ----- des aretes simples chainees en position lchain de nosoar -c detruire du tableau nosoar les aretes doubles -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entree : -c -------- -c noar : numero dans le tableau nosoar de l'arete a traiter -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c -c entrees et sorties: -c ------------------- -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c n1aeoc : numero dans nosoar de la premiere arete simple de l'etoile -c -c sortie : -c -------- -c nbtrar : 1 si arete ajoutee, 2 si arete double supprimee -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c2345x7..............................................................012 - parameter (lchain=6) - integer nosoar(mosoar,mxsoar) -c -c si l'arete n'appartient pas aux aretes de l'etoile naetoi -c alors elle est ajoutee a l'etoile dans naetoi -c sinon elle est empilee dans npile pour etre detruite ensuite -c elle est supprimee de l'etoile naetoi -c - if( nosoar( lchain, noar ) .lt. 0 ) then -c -c arete de l'etoile vue pour la premiere fois -c elle est ajoutee au chainage - nosoar( lchain, noar ) = n1aeoc -c elle devient la premiere du chainage - n1aeoc = noar -c arete simple - nbtrar = 1 -c - else -c -c arete double de l'etoile. elle est supprimee du chainage - na0 = 0 - na = n1aeoc -c parcours des aretes chainees jusqu'a trouver l'arete noar - 10 if( na .ne. noar ) then -c passage a la suivante - na0 = na - na = nosoar( lchain, na ) - goto 10 - endif -c -c suppression de noar du chainage des aretes simples de l'etoile - if( na0 .gt. 0 ) then -c il existe une arete qui precede - nosoar( lchain, na0 ) = nosoar( lchain, noar ) - else -c noar est en fait n1aeoc la premiere du chainage - n1aeoc = nosoar( lchain, noar ) - endif -c noar n'est plus une arete simple de l'etoile - nosoar( lchain, noar ) = -1 -c -c destruction du tableau nosoar de l'arete double noar - call sasoar( noar, mosoar, mxsoar, n1soar, nosoar ) -c -c arete double - nbtrar = 2 - endif - end - - - subroutine focftr( nbtrcf, notrcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % nbarcf, n1arcf, noarcf, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : former un contour ferme (cf) avec les aretes simples des -c ----- nbtrcf triangles du tableau notrcf -c destruction des nbtrcf triangles du tableau noartr -c destruction des aretes doubles du tableau nosoar -c -c attention: le chainage lchain de nosoar devient celui des cf -c -c entrees: -c -------- -c nbtrcf : nombre de triangles du cf a former -c notrcf : numero des triangles dans le tableau noartr -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c entrees et sorties : -c -------------------- -c noarst : noarst(i) numero d'une arete de sommet i -c n1soar : numero de la premiere arete vide dans le tableau nosoar -c une arete i de nosoar est vide <=> nosoar(1,i)=0 -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c -c sorties: -c -------- -c nbarcf : nombre d'aretes du cf -c n1arcf : numero d'une arete de chaque contour -c noarcf : numero des aretes de la ligne du contour ferme -c attention: chainage circulaire des aretes -c les aretes vides pointes par n1arcf(0) ne sont pas chainees -c ierr : 0 si pas d'erreur -c 14 si les lignes fermees se coupent => donnees a revoir -c 15 si une seule arete simple frontaliere -c 16 si boucle infinie car toutes les aretes simples -c de la boule sont frontalieres! -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (lchain=6) - common / unites / lecteu, imprim, nunite(30) - double precision pxyd(3,*) - integer notrcf(1:nbtrcf) - integer nosoar(mosoar,mxsoar), - % noartr(moartr,*), - % n1arcf(0:*), - % noarcf(3,*), - % noarst(*) -c -c formation des aretes simples du cf autour de l'arete ns1-ns2 -c attention: le chainage lchain du tableau nosoar devient actif -c ============================================================ -c ici toutes les aretes du tableau nosoar verifient nosoar(lchain,i) = -1 -c ce qui equivaut a dire que l'etoile des aretes simples est vide -c (initialisation dans le sp insoar puis remise a -1 dans la suite!) - n1aeoc = 0 -c -c ajout a l'etoile des aretes simples des 3 aretes des triangles a supprimer -c suppression des triangles de l'etoile pour les aretes simples de l'etoile - do 10 i=1,nbtrcf -c ajout ou retrait des 3 aretes du triangle notrcf(i) de l'etoile - nt = notrcf( i ) - do 5 j=1,3 -c l'arete de nosoar a traiter - noar = abs( noartr(j,nt) ) - call caetoi( noar, mosoar, mxsoar, n1soar, nosoar, - % n1aeoc, nbtrar ) -c si arete simple alors suppression du numero de triangle pour cette a - if( nbtrar .eq. 1 ) then - if( nosoar(4,noar) .eq. nt ) then - nosoar(4,noar) = nosoar(5,noar) - endif - nosoar(5,noar) = -1 -c else -c l'arete appartient a aucun triangle => elle est vide -c les positions 4 et 5 servent maintenant aux chainages des vides - endif - 5 continue - 10 continue -c -c les aretes simples de l'etoile sont reordonnees pour former une -c ligne fermee = un contour ferme peripherique de l'etoile encore dit 1 cf -c ======================================================================== - n1ae00 = n1aeoc - 12 na1 = n1aeoc -c la premiere arete du contour ferme - ns0 = nosoar(1,na1) - ns1 = nosoar(2,na1) -c -c l'arete est-elle dans le sens direct? -c recherche de l'arete du triangle exterieur nt d'arete na1 - nt = nosoar(4,na1) - if( nt .le. 0 ) nt = nosoar(5,na1) -c -c attention au cas de l'arete initiale frontaliere de no de triangles 0 et - - if( nt .le. 0 ) then -c permutation circulaire des aretes simples chainees -c la premiere arete doit devenir la derniere du chainage, -c la 2=>1, la 3=>2, ... , la derniere=>l'avant derniere, 1=>derniere - n1aeoc = nosoar( lchain, n1aeoc ) - if( n1aeoc .eq. n1ae00 ) then -c attention: boucle infinie si toutes les aretes simples -c de la boule sont frontalieres!... arretee par ce test - ierr = 16 - return - endif - noar = n1aeoc - na0 = 0 - 14 if( noar .gt. 0 ) then -c la sauvegarde de l'arete et l'arete suivante - na0 = noar - noar = nosoar(lchain,noar) - goto 14 - endif - if( na0 .le. 0 ) then -c une seule arete simple frontaliere - ierr = 15 - return - endif -c le suivant de l'ancien dernier est l'ancien premier - nosoar(lchain,na0) = na1 -c le nouveau dernier est l'ancien premier - nosoar(lchain,na1) = 0 - goto 12 - endif -c -c ici l'arete na1 est l'une des aretes du triangle nt - do 15 i=1,3 - if( abs(noartr(i,nt)) .eq. na1 ) then -c c'est l'arete - if( noartr(i,nt) .gt. 0 ) then -c elle est parcourue dans le sens indirect de l'etoile -c (car c'est en fait le triangle exterieur a la boule) - ns0 = nosoar(2,na1) - ns1 = nosoar(1,na1) - endif - goto 17 - endif - 15 continue -c -c le 1-er sommet ou arete du contour ferme - 17 n1arcf( 1 ) = 1 -c le nombre de sommets du contour ferme de l'etoile - nbarcf = 1 -c le premier sommet de l'etoile - noarcf( 1, nbarcf ) = ns0 -c l'arete suivante du cf - noarcf( 2, nbarcf ) = nbarcf + 1 -c le numero de cette arete dans le tableau nosoar - noarcf( 3, nbarcf ) = na1 -c mise a jour du numero d'arete du sommet ns0 - noarst(ns0) = na1 -c -cccc trace de l'arete -ccc call dvtrar( pxyd, ns0, ns1, ncvert, ncblan ) -c -c l'arete suivante a chainer - n1aeoc = nosoar( lchain, na1 ) -c l'arete na1 n'est plus dans l'etoile - nosoar( lchain, na1 ) = -1 -c -c boucle sur les aretes simples de l'etoile - 20 if( n1aeoc .gt. 0 ) then -c -c recherche de l'arete de 1-er sommet ns1 - na0 = -1 - na1 = n1aeoc - 25 if( na1 .gt. 0 ) then -c -c le numero du dernier sommet de l'arete precedente -c est il l'un des 2 sommets de l'arete na1? - if ( ns1 .eq. nosoar(1,na1) ) then -c l'autre sommet de l'arete na1 - ns2 = nosoar(2,na1) - else if( ns1 .eq. nosoar(2,na1) ) then -c l'autre sommet de l'arete na1 - ns2 = nosoar(1,na1) - else -c non: passage a l'arete suivante - na0 = na1 - na1 = nosoar( lchain, na1 ) - goto 25 - endif -c -c oui: na1 est l'arete peripherique suivante -c na0 est sa precedente dans le chainage -c une arete de plus dans le contour ferme (cf) - nbarcf = nbarcf + 1 -c le premier sommet de l'arete nbarcf peripherique - noarcf( 1, nbarcf ) = ns1 -c l'arete suivante du cf - noarcf( 2, nbarcf ) = nbarcf + 1 -c le numero de cette arete dans le tableau nosoar - noarcf( 3, nbarcf ) = na1 -c mise a jour du numero d'arete du sommet ns1 - noarst(ns1) = na1 -c -cccc trace de l'arete -ccc call dvtrar( pxyd, ns1, ns2, ncvert, ncblan ) -c -c suppression de l'arete des aretes simples de l'etoile - if( n1aeoc .eq. na1 ) then - n1aeoc = nosoar( lchain, na1 ) - else - nosoar( lchain, na0 ) = nosoar( lchain, na1 ) - endif -c l'arete n'est plus une arete simple de l'etoile - nosoar( lchain, na1 ) = -1 -c -c le sommet final de l'arete a rechercher ensuite - ns1 = ns2 - goto 20 - endif - endif -c -c verification - if( ns1 .ne. ns0 ) then -c arete non retrouvee : l'etoile ne se referme pas -c nblgrc(nrerr) = 3 -c kerr(1) = 'focftr: revoyez vos donnees' -c kerr(2) = 'les lignes fermees doivent etre disjointes' -c kerr(3) = 'verifiez si elles ne se coupent pas' -c call lereur - write(imprim,*) 'focftr: revoyez vos donnees' - write(imprim,*)'les lignes fermees doivent etre disjointes' - write(imprim,*)'verifiez si elles ne se coupent pas' - ierr = 14 - return - endif -c -c l'arete suivant la derniere arete du cf est la premiere du cf -c => realisation d'un chainage circulaire des aretes du cf - noarcf( 2, nbarcf ) = 1 -c -c destruction des triangles de l'etoile du tableau noartr -c ------------------------------------------------------- - do 50 i=1,nbtrcf -c le numero du triangle dans noartr - nt0 = notrcf( i ) -c l'arete 1 de nt0 devient nulle - noartr( 1, nt0 ) = 0 -c chainage de nt0 en tete du chainage des triangles vides de noartr - noartr( 2, nt0 ) = n1artr - n1artr = nt0 - 50 continue - end - - - subroutine int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x0, y0 ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : existence ou non d'une intersection a l'interieur -c ----- des 2 aretes ns1-ns2 et ns3-ns4 -c attention les intersections au sommet sont comptees -c -c entrees: -c -------- -c ns1,...ns4 : numero pxyd des 4 sommets -c pxyd : les coordonnees des sommets -c -c sortie : -c -------- -c linter : -1 si ns3-ns4 parallele a ns1 ns2 -c 0 si ns3-ns4 n'intersecte pas ns1-ns2 entre les aretes -c 1 si ns3-ns4 intersecte ns1-ns2 entre les aretes -c 2 si le point d'intersection est ns1 entre ns3-ns4 -c 3 si le point d'intersection est ns3 entre ns1-ns2 -c 4 si le point d'intersection est ns4 entre ns1-ns2 -c x0,y0 : 2 coordonnees du point d'intersection s'il existe(linter>=1) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc fevrier 1992 -c2345x7..............................................................012 - parameter ( epsmoi=-0.000001d0, eps=0.001d0, - % unmeps= 0.999d0, unpeps=1.000001d0 ) - double precision pxyd(3,*), x0, y0 - double precision x1,y1,x21,y21,d21,x43,y43,d43,d,x,y,p21,p43 -c - x1 = pxyd(1,ns1) - y1 = pxyd(2,ns1) - x21 = pxyd(1,ns2) - x1 - y21 = pxyd(2,ns2) - y1 - d21 = x21**2 + y21**2 -c - x43 = pxyd(1,ns4) - pxyd(1,ns3) - y43 = pxyd(2,ns4) - pxyd(2,ns3) - d43 = x43**2 + y43**2 -c -c les 2 aretes sont-elles jugees paralleles ? - d = x43 * y21 - y43 * x21 - if( d*d .le. 0.000001d0 * d21 * d43 ) then -c cote i parallele a ns1-ns2 - linter = -1 - return - endif -c -c les 2 coordonnees du point d'intersection - x =( x1*x43*y21-pxyd(1,ns3)*x21*y43-(y1-pxyd(2,ns3))*x21*x43)/d - y =(-y1*y43*x21+pxyd(2,ns3)*y21*x43+(x1-pxyd(1,ns3))*y21*y43)/d -c -c coordonnee barycentrique de x,y dans le repere ns1-ns2 - p21 = ( ( x - x1 ) * x21 + ( y - y1 ) * y21 ) / d21 -c coordonnee barycentrique de x,y dans le repere ns3-ns4 - p43 = ( (x - pxyd(1,ns3))* x43 + (y - pxyd(2,ns3)) * y43 ) / d43 -c -c - if( epsmoi .le. p21 .and. p21 .le. unpeps ) then -c x,y est entre ns1-ns2 - if( (p21 .le. eps) .and. - % (epsmoi .le. p43 .and. p43 .le. unpeps) ) then -c le point x,y est proche de ns1 et interne a ns3-ns4 - linter = 2 - x0 = pxyd(1,ns1) - y0 = pxyd(2,ns1) - return - else if( epsmoi .le. p43 .and. p43 .le. eps ) then -c le point x,y est proche de ns3 et entre ns1-ns2 - linter = 3 - x0 = pxyd(1,ns3) - y0 = pxyd(2,ns3) - return - else if( unmeps .le. p43 .and. p43 .le. unpeps ) then -c le point x,y est proche de ns4 et entre ns1-ns2 - linter = 4 - x0 = pxyd(1,ns4) - y0 = pxyd(2,ns4) - return - else if( eps .le. p43 .and. p43 .le. unmeps ) then -c le point x,y est entre ns3-ns4 - linter = 1 - x0 = x - y0 = y - return - endif - endif -c -c pas d'intersection a l'interieur des aretes - linter = 0 - end - - - subroutine tefoar( narete, nbarpi, pxyd, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, noarst, - % mxarcf, n1arcf, noarcf, larmin, notrcf, - % ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : forcer l'arete narete de nosoar dans la triangulation actuelle -c ----- triangulation frontale pour la reobtenir -c -c attention: le chainage lchain(=6) de nosoar devient actif -c durant la formation des contours fermes (cf) -c -c entrees: -c -------- -c narete : numero nosoar de l'arete frontaliere a forcer -c nbarpi : numero du dernier point interne impose par l'utilisateur -c pxyd : tableau des coordonnees 2d des points -c par point : x y distance_souhaitee -c -c mosoar : nombre maximal d'entiers par arete et -c indice dans nosoar de l'arete suivante dans le hachage -c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar -c attention: mxsoar>3*mxsomm obligatoire! -c moartr : nombre maximal d'entiers par arete du tableau noartr -c -c modifies: -c --------- -c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar -c chainage des vides suivant en 3 et precedant en 2 de nosoar -c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete, -c chainage des aretes frontalieres, chainage du hachage des aretes -c hachage des aretes = nosoar(1)+nosoar(2)*2 -c avec mxsoar>=3*mxsomm -c une arete i de nosoar est vide <=> nosoar(1,i)=0 et -c nosoar(2,arete vide)=l'arete vide qui precede -c nosoar(3,arete vide)=l'arete vide qui suit -c n1artr : numero du premier triangle vide dans le tableau noartr -c le chainage des triangles vides se fait sur noartr(2,.) -c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3 -c arete1 = 0 si triangle vide => arete2 = triangle vide suivant -c noarst : noarst(i) numero d'une arete de sommet i -c -c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf -c -c tableaux auxiliaires : -c ---------------------- -c n1arcf : tableau (0:mxarcf) auxiliaire -c noarcf : tableau (3,mxarcf) auxiliaire -c larmin : tableau (mxarcf) auxiliaire -c notrcf : tableau (1:mxarcf) auxiliaire -c -c sortie : -c -------- -c ierr : 0 si pas d'erreur -c 1 saturation des sommets -c 2 ns1 dans aucun triangle -c 9 tableau nosoar de taille insuffisante car trop d'aretes -c a probleme -c 10 un des tableaux n1arcf, noarcf notrcf est sature -c augmenter a l'appel mxarcf -c 11 algorithme defaillant -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc mars 1997 -c....................................................................012 - parameter (mxpitr=32) - common / unites / lecteu,imprim,intera,nunite(29) - logical tratri - common / dv2dco / tratri - double precision pxyd(3,*) - integer noartr(moartr,*), - % nosoar(mosoar,mxsoar), - % noarst(*), - % n1arcf(0:mxarcf), - % noarcf(3,mxarcf), - % larmin(mxarcf), - % notrcf(mxarcf) -c - integer lapitr(mxpitr) - double precision x1,y1,x2,y2,d12,d3,d4,x,y,d,dmin - integer nosotr(3), ns(2) - integer nacf(1:2), nacf1, nacf2 - equivalence (nacf(1),nacf1), (nacf(2),nacf2) -c -c traitement de cette arete perdue - ns1 = nosoar( 1, narete ) - ns2 = nosoar( 2, narete ) -c - if( tratri ) then -c les traces sont demandes -c call efface -c le cadre objet global en unites utilisateur - xx1 = min( pxyd(1,ns1), pxyd(1,ns2) ) - xx2 = max( pxyd(1,ns1), pxyd(1,ns2) ) - yy1 = min( pxyd(2,ns1), pxyd(2,ns2) ) - yy2 = max( pxyd(2,ns1), pxyd(2,ns2) ) - if( xx1 .ge. xx2 ) xx2 = xx1 + (yy2-yy1) - if( yy1 .ge. yy2 ) yy2 = yy1 + (xx2-xx1)*0.5 -c call isofenetre( xx1-(xx2-xx1), xx2+(xx2-xx1), -c % yy1-(yy2-yy1), yy2+(yy2-yy1) ) - endif -c -cccc trace de l'arete perdue -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -c -c le sommet ns2 est il correct? - na = noarst( ns2 ) - if( na .le. 0 ) then - write(imprim,*) 'tefoar: erreur sommet ',ns2,' sans arete' - ierr = 8 - return - endif - if( nosoar(4,na) .le. 0 ) then - write(imprim,*) 'tefoar: erreur sommet ',ns2, - % ' dans aucun triangle' - ierr = 8 - return - endif -c -c recherche du triangle voisin dans le sens indirect de rotation - nsens = -1 -c le premier passage: recherche dans le sens ns1->ns2 - ipas = 0 -c -c recherche des triangles intersectes par le segment ns1-ns2 -c ========================================================== - 3 x1 = pxyd(1,ns1) - y1 = pxyd(2,ns1) - x2 = pxyd(1,ns2) - y2 = pxyd(2,ns2) - d12 = (x2-x1)**2 + (y2-y1)**2 -c -c recherche du no local du sommet ns1 dans l'un de ses triangles - na01 = noarst( ns1 ) - if( na01 .le. 0 ) then - write(imprim,*) 'tefoar: sommet ',ns1,' sans arete' - ierr = 8 - return - endif - nt0 = nosoar(4,na01) - if( nt0 .le. 0 ) then - write(imprim,*) 'tefoar: sommet ',ns1,' dans aucun triangle' - ierr = 8 - return - endif -c -c le numero des 3 sommets du triangle nt0 dans le sens direct - 20 call nusotr( nt0, mosoar, nosoar, moartr, noartr, nosotr ) - do 22 na00=1,3 - if( nosotr(na00) .eq. ns1 ) goto 26 - 22 continue -c - 25 if( ipas .eq. 0 ) then -c le second passage: recherche dans le sens ns2->ns1 -c tentative d'inversion des 2 sommets extremites de l'arete a forcer - na00 = ns1 - ns1 = ns2 - ns2 = na00 - ipas = 1 - goto 3 - else -c les sens ns1->ns2 et ns2->ns1 ne donne pas de solution! - write(imprim,*)'tefoar:arete ',ns1,' - ',ns2,' a imposer' - write(imprim,*)'tefoar:anomalie sommet ',ns1, - % 'non dans le triangle de sommets ',(nosotr(i),i=1,3) - ierr = 11 - return - endif -c -c le numero des aretes suivante et precedente - 26 na0 = nosui3( na00 ) - na1 = nopre3( na00 ) - ns3 = nosotr( na0 ) - ns4 = nosotr( na1 ) -c -cccc trace du triangle nt0 et de l'arete perdue -ccc call mttrtr( pxyd, nt0, moartr, noartr, mosoar, nosoar, -ccc % ncblan, ncjaun ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -ccc call dvtrar( pxyd, ns3, ns4, ncbleu, nccyan ) -c -c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4 -c ------------------------------------------------------------ - call int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x1, y1 ) - if( linter .le. 0 ) then -c -c pas d'intersection: rotation autour du point ns1 -c pour trouver le triangle de l'autre cote de l'arete na01 - if( nsens .lt. 0 ) then -c sens indirect de rotation: l'arete de sommet ns1 - na01 = abs( noartr(na00,nt0) ) - else -c sens direct de rotation: l'arete de sommet ns1 qui precede - na01 = abs( noartr(na1,nt0) ) - endif -c le triangle de l'autre cote de l'arete na01 - if( nosoar(4,na01) .eq. nt0 ) then - nt0 = nosoar(5,na01) - else - nt0 = nosoar(4,na01) - endif - if( nt0 .gt. 0 ) goto 20 -c -c le parcours sort du domaine -c il faut tourner dans l'autre sens autour de ns1 - if( nsens .lt. 0 ) then - nsens = 1 - nt0 = noarst( ns1 ) - goto 20 - endif -c -c dans les 2 sens, pas d'intersection => impossible -c essai avec l'arete inversee ns1 <-> ns2 - if( ipas .eq. 0 ) goto 25 - write(imprim,*) 'tefoar: arete ',ns1,' ',ns2, - % ' sans intersection avec les triangles actuels' - write(imprim,*) 'revoyez les lignes du contour' - ierr = 11 - return - endif -c -c il existe une intersection avec l'arete opposee au sommet ns1 -c ============================================================= -c nbtrcf : nombre de triangles du cf - nbtrcf = 1 - notrcf( 1 ) = nt0 -c -c le triangle oppose a l'arete na0 de nt0 - 30 noar = abs( noartr(na0,nt0) ) - if( nosoar(4,noar) .eq. nt0 ) then - nt1 = nosoar(5,noar) - else - nt1 = nosoar(4,noar) - endif -c -cccc trace du triangle nt1 et de l'arete perdue -ccc call mttrtr( pxyd, nt1, moartr, noartr, mosoar, nosoar, -ccc % ncjaun, ncmage ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -c -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr ) -c -c le triangle nt1 contient il ns2 ? - do 32 j=1,3 - if( nosotr(j) .eq. ns2 ) goto 70 - 32 continue -c -c recherche de l'arete noar, na1 dans nt1 qui est l'arete na0 de nt0 - do 34 na1=1,3 - if( abs( noartr(na1,nt1) ) .eq. noar ) goto 35 - 34 continue -c -c trace du triangle nt1 et de l'arete perdue - 35 continue -ccc 35 call mttrtr( pxyd, nt1, moartr, noartr, mosoar, nosoar, -ccc % ncjaun, ncmage ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) -c -c recherche de l'intersection de ns1-ns2 avec les 2 autres aretes de nt1 -c ====================================================================== - na2 = na1 - do 50 i1 = 1,2 -c l'arete suivante - na2 = nosui3(na2) -c -c les 2 sommets de l'arete na2 de nt1 - noar = abs( noartr(na2,nt1) ) - ns3 = nosoar( 1, noar ) - ns4 = nosoar( 2, noar ) -ccc call dvtrar( pxyd, ns3, ns4, ncbleu, nccyan ) -c -c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4 -c ------------------------------------------------------------ - call int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x , y ) - if( linter .gt. 0 ) then -c -c les 2 aretes s'intersectent en (x,y) -c distance de (x,y) a ns3 et ns4 - d3 = (pxyd(1,ns3)-x)**2 + (pxyd(2,ns3)-y)**2 - d4 = (pxyd(1,ns4)-x)**2 + (pxyd(2,ns4)-y)**2 -c nsp est le point le plus proche de (x,y) - if( d3 .lt. d4 ) then - nsp = ns3 - d = d3 - else - nsp = ns4 - d = d4 - endif - if( d .gt. 1d-5*d12 ) goto 60 -c -c ici le sommet nsp est trop proche de l'arete perdue ns1-ns2 - if( nsp .le. nbarpi ) then -c point utilisateur ou frontalier non supprimable - ierr = 11 - write(imprim,*) 'pause dans tefoar 1', d, d3, d4, d12 - return - endif -c -c le sommet interne nsp est supprime en mettant tous les triangles -c l'ayant comme sommet dans la pile notrcf des triangles a supprimer -c ------------------------------------------------------------------ -ccc write(imprim,*) 'tefoar: le sommet ',nsp,' est supprime' -c construction de la liste des triangles de sommet nsp - call trp1st( nsp, noarst, mosoar, nosoar, moartr, noartr, - % mxpitr, nbt, lapitr ) - if( nbt .le. 0 ) then -c les triangles de sommet nsp ne forme pas une "boule" -c avec ce sommet nsp pour "centre" - write(imprim,*) - % 'tefoar: pas d''etoile de triangles autour du sommet',nsp -cccc trace des triangles de l'etoile du sommet nsp -ccc tratri = .true. -ccc call trpltr( nbt, lapitr, pxyd, -ccc % moartr, noartr, mosoar, nosoar, -ccc % ncroug, ncblan ) -ccc tratri = .false. - ierr = 11 - write(imprim,*) 'pause dans tefoar 2' - return - endif -c -c ajout des triangles de sommet ns1 a notrcf - nbtrc0 = nbtrcf - do 38 j=1,nbt - nt = lapitr(j) - do 37 k=nbtrcf,1,-1 - if( nt .eq. notrcf(k) ) goto 38 - 37 continue -c triangle ajoute - nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt -ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar, -ccc % ncjaun, ncmage ) -ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan ) - 38 continue -c -c ce sommet supprime n'appartient plus a aucun triangle - noarst( nsp ) = 0 -c -c ns2 est-il un sommet des triangles empiles? -c ------------------------------------------- - do 40 nt=nbtrc0+1,nbtrcf -c le triangle a supprimer nt - nt1 = notrcf( nt ) -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr) - do 39 k=1,3 -c le sommet k de nt1 - if( nosotr( k ) .eq. ns2 ) then -c but atteint - goto 80 - endif - 39 continue - 40 continue -c -c recherche du plus proche point d'intersection de ns1-ns2 -c par rapport a ns2 avec les aretes des triangles ajoutes - nt0 = 0 - dmin = d12 * 10000 - do 48 nt=nbtrc0+1,nbtrcf - nt1 = notrcf( nt ) -c le numero des 3 sommets du triangle nt1 dans le sens direct - call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr) - do 45 k=1,3 -c les 2 sommets de l'arete k de nt - ns3 = nosotr( k ) - ns4 = nosotr( nosui3(k) ) -c -c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4 -c ------------------------------------------------------------ - call int1sd( ns1, ns2, ns3, ns4, pxyd, - % linter, x , y ) - if( linter .gt. 0 ) then -c les 2 aretes s'intersectent en (x,y) - d = (x-x2)**2+(y-y2)**2 - if( d .lt. dmin ) then - nt0 = nt1 - na0 = k - dmin = d - endif - endif - 45 continue - 48 continue -c -c redemarrage avec le triangle nt0 et l'arete na0 - if( nt0 .gt. 0 ) goto 30 -c - write(imprim,*) 'tefoar: algorithme defaillant' - ierr = 11 - return - endif - 50 continue -c -c pas d'intersection differente de l'initiale => sommet sur ns1-ns2 -c rotation autour du sommet par l'arete suivant na1 - write(imprim,*) - write(imprim,*) 'tefoar 50: revoyez vos donnees' - write(imprim,*) 'les lignes fermees doivent etre disjointes' - write(imprim,*) 'verifiez si elles ne se coupent pas' - ierr = 13 - return -c -c cas sans probleme : intersection differente de celle initiale -c ================= ========================================= - 60 nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt1 -c passage au triangle suivant - na0 = na2 - nt0 = nt1 - goto 30 -c -c ---------------------------------------------------------- -c ici toutes les intersections de ns1-ns2 ont ete parcourues -c tous les triangles intersectes ou etendus forment les -c nbtrcf triangles du tableau notrcf -c ---------------------------------------------------------- - 70 nbtrcf = nbtrcf + 1 - notrcf( nbtrcf ) = nt1 -c -c formation du cf des aretes simples des triangles de notrcf -c et destruction des nbtrcf triangles du tableau noartr -c attention: le chainage lchain du tableau nosoar devient actif -c ============================================================= - 80 if( nbtrcf*3 .gt. mxarcf ) then - write(imprim,*) 'saturation du tableau noarcf' - ierr = 10 - return - endif -c - call focftr( nbtrcf, notrcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % nbarcf, n1arcf, noarcf, - % ierr ) - if( ierr .ne. 0 ) return -c -c chainage des aretes vides dans le tableau noarcf -c ------------------------------------------------ -c decalage de 2 aretes car 2 aretes sont necessaires ensuite pour -c integrer 2 fois l'arete perdue et former ainsi 2 cf -c comme nbtrcf*3 minore mxarcf il existe au moins 2 places vides -c derriere => pas de test de debordement - n1arcf(0) = nbarcf+3 - mmarcf = min(8*nbarcf,mxarcf) - do 90 i=nbarcf+3,mmarcf - noarcf(2,i) = i+1 - 90 continue - noarcf(2,mmarcf) = 0 -c -c reperage des sommets ns1 ns2 de l'arete perdue dans le cf -c --------------------------------------------------------- - ns1 = nosoar( 1, narete ) - ns2 = nosoar( 2, narete ) - ns(1) = ns1 - ns(2) = ns2 - do 120 i=1,2 -c la premiere arete dans noarcf du cf - na0 = n1arcf(1) - 110 if( noarcf(1,na0) .ne. ns(i) ) then -c passage a l'arete suivante - na0 = noarcf( 2, na0 ) - goto 110 - endif -c position dans noarcf du sommet i de l'arete perdue - nacf(i) = na0 - 120 continue -c -c formation des 2 cf chacun contenant l'arete ns1-ns2 -c --------------------------------------------------- -c sauvegarde de l'arete suivante de celle de sommet ns1 - na0 = noarcf( 2, nacf1 ) - nt1 = noarcf( 3, nacf1 ) -c -c le premier cf - n1arcf( 1 ) = nacf1 -c l'arete suivante dans le premier cf - noarcf( 2, nacf1 ) = nacf2 -c cette arete est celle perdue - noarcf( 3, nacf1 ) = narete -c -c le second cf -c l'arete doublee - n1 = nbarcf + 1 - n2 = nbarcf + 2 -c le premier sommet de la premiere arete du second cf - noarcf( 1, n1 ) = ns2 -c l'arete suivante dans le second cf - noarcf( 2, n1 ) = n2 -c cette arete est celle perdue - noarcf( 3, n1 ) = narete -c la seconde arete du second cf - noarcf( 1, n2 ) = ns1 - noarcf( 2, n2 ) = na0 - noarcf( 3, n2 ) = nt1 - n1arcf( 2 ) = n1 -c -c recherche du precedent de nacf2 - 130 na1 = noarcf( 2, na0 ) - if( na1 .ne. nacf2 ) then -c passage a l'arete suivante - na0 = na1 - goto 130 - endif -c na0 precede nacf2 => il precede n1 - noarcf( 2, na0 ) = n1 -c -c depart avec 2 cf - nbcf = 2 -c -c triangulation directe des 2 contours fermes -c l'arete ns1-ns2 devient une arete de la triangulation des 2 cf -c ============================================================== - call tridcf( nbcf, pxyd, noarst, - % mosoar, mxsoar, n1soar, nosoar, - % moartr, n1artr, noartr, - % mxarcf, n1arcf, noarcf, larmin, - % nbtrcf, notrcf, ierr ) - end - - - subroutine te4ste( nbsomm, mxsomm, pxyd, ntrp, letree, - & ierr ) -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c but : decouper un te ntrp de letree en 4 sous-triangles -c ----- eliminer les sommets de te trop proches des points -c -c entrees: -c -------- -c mxsomm : nombre maximal de points declarables dans pxyd -c ntrp : numero letree du triangle a decouper en 4 sous-triangles -c -c modifies : -c ---------- -c nbsomm : nombre actuel de points dans pxyd -c pxyd : tableau des coordonnees des points -c par point : x y distance_souhaitee -c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation -c letree(0,0) : no du 1-er te vide dans letree -c letree(0,1) : maximum du 1-er indice de letree (ici 8) -c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree) -c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle) -c si letree(0,.)>0 alors -c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j -c sinon -c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j -c 0 si pas de point -c ( j est alors une feuille de l'arbre ) -c letree(4,j) : no letree du sur-triangle du triangle j -c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle -c letree(6:8,j) : no pxyd des 3 sommets du triangle j -c -c sorties : -c --------- -c ierr : 0 si pas d'erreur, 51 saturation letree, 52 saturation pxyd -c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -c auteur : alain perronnet analyse numerique paris upmc juillet 1994 -c2345x7..............................................................012 - common / unites / lecteu,imprim,nunite(30) - integer letree(0:8,0:*) - double precision pxyd(3,mxsomm) - integer np(0:3),milieu(3) -c -c debut par l'arete 2 du triangle ntrp - i1 = 2 - i2 = 3 - do 30 i=1,3 -c -c le milieu de l'arete i1 existe t il deja ? - call n1trva( ntrp, i1, letree, noteva, niveau ) - if( noteva .gt. 0 ) then -c il existe un te voisin -c s'il existe 4 sous-triangles le milieu existe deja - if( letree(0,noteva) .gt. 0 ) then -c le milieu existe - nsot = letree(0,noteva) - milieu(i) = letree( 5+nopre3(i1), nsot ) - goto 25 - endif - endif -c -c le milieu n'existe pas. il est cree - nbsomm = nbsomm + 1 - if( nbsomm .gt. mxsomm ) then -c plus assez de place dans pxyd - write(imprim,*) 'te4ste: saturation pxyd' - write(imprim,*) - ierr = 52 - return - endif -c le milieu de l'arete i - milieu(i) = nbsomm -c -c ntrp est le triangle de milieux d'arete ces 3 sommets - ns1 = letree( 5+i1, ntrp ) - ns2 = letree( 5+i2, ntrp ) - pxyd(1,nbsomm) = ( pxyd(1,ns1) + pxyd(1,ns2) ) * 0.5 - pxyd(2,nbsomm) = ( pxyd(2,ns1) + pxyd(2,ns2) ) * 0.5 -c -c l'arete et milieu suivant - 25 i1 = i2 - i2 = nosui3( i2 ) - 30 continue -c - do 50 i=0,3 -c -c le premier triangle vide - nsot = letree(0,0) - if( nsot .le. 0 ) then -c manque de place. saturation letree - ierr = 51 - write(imprim,*) 'te4ste: saturation letree' - write(imprim,*) - return - endif -c -c mise a jour du premier te libre - letree(0,0) = letree(0,nsot) -c -c nsot est le i-eme sous triangle - letree(0,nsot) = 0 - letree(1,nsot) = 0 - letree(2,nsot) = 0 - letree(3,nsot) = 0 -c -c le numero des points et sous triangles dans ntrp - np(i) = -letree(i,ntrp) - letree(i,ntrp) = nsot -c -c le sommet commun avec le triangle ntrp - letree(5+i,nsot) = letree(5+i,ntrp) -c -c le sur-triangle et numero de sous-triangle de nsot -c a laisser ici car incorrect sinon pour i=0 - letree(4,nsot) = ntrp - letree(5,nsot) = i -c -c le sous-triangle du triangle - letree(i,ntrp) = nsot - 50 continue -c -c le numero des nouveaux sommets milieux - nsot = letree(0,ntrp) - letree(6,nsot) = milieu(1) - letree(7,nsot) = milieu(2) - letree(8,nsot) = milieu(3) -c - nsot = letree(1,ntrp) - letree(7,nsot) = milieu(3) - letree(8,nsot) = milieu(2) -c - nsot = letree(2,ntrp) - letree(6,nsot) = milieu(3) - letree(8,nsot) = milieu(1) -c - nsot = letree(3,ntrp) - letree(6,nsot) = milieu(2) - letree(7,nsot) = milieu(1) -c -c repartition des eventuels 4 points np dans ces 4 sous-triangles -c il y a obligatoirement suffisamment de place - do 110 i=0,3 - if( np(i) .gt. 0 ) then - nsot = notrpt( pxyd(1,np(i)), pxyd, ntrp, letree ) -c ajout du point - do 100 i1=0,3 - if( letree(i1,nsot) .eq. 0 ) then -c place libre a occuper - letree(i1,nsot) = -np(i) - goto 110 - endif - 100 continue - endif - 110 continue - end diff --git a/src/Makefile.in b/src/Makefile.in deleted file mode 100644 index c4bbfd85f..000000000 --- a/src/Makefile.in +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Author : Patrick GOLDBRONN (CEA) -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -@COMMENCE@ - -SUBDIRS = \ - SMDS SMESHDS Controls Driver DriverMED DriverDAT DriverUNV DriverSTL \ - SMESH SMESH_I OBJECT SMESHFiltersSelection SMESHGUI SMESH_SWIG \ - MEFISTO2 StdMeshers StdMeshers_I StdMeshersGUI - -@MODULE@ diff --git a/src/NETGEN/Makefile.in b/src/NETGEN/Makefile.in deleted file mode 100644 index fc2e0476a..000000000 --- a/src/NETGEN/Makefile.in +++ /dev/null @@ -1,152 +0,0 @@ -# -* Makefile *- -# -# Author : Nadir Bouhamou (CEA) -# Module : SMESH -# Date : 10/10/2003 -# -# - -# source path -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@ - -@COMMENCE@ - -# Libraries targets -LIB = libNETGEN.la - -# additionnal information to compil and link file -CPPFLAGS += -DSOLIDGEOM -DLINUX $(OCC_INCLUDES) -CXXFLAGS += -DSOLIDGEOM -DLINUX $(OCC_CXXFLAGS) - -LDFLAGS += $(OCC_KERNEL_LIBS) $(OCC_MODELER_LIBS) -lg2c - -NETGEN_LIBS_DIR=@NETGEN_LIBS_DIR@ - -LIB_OBJ_O = linopt.o \ - bfgs.o \ - linsearch.o \ - global.o \ - bisect.o \ - meshtool.o \ - refine.o \ - ruler3.o \ - improve3.o \ - adfront3.o \ - tetrarls.o \ - prism2rls.o \ - pyramidrls.o \ - pyramid2rls.o \ - netrule3.o \ - ruler2.o \ - meshclass.o \ - improve2.o \ - adfront2.o \ - netrule2.o \ - triarls.o \ - geomsearch.o \ - secondorder.o \ - meshtype.o \ - parser3.o \ - quadrls.o \ - specials.o \ - parser2.o \ - meshing2.o \ - meshing3.o \ - meshfunc.o \ - localh.o \ - improve2gen.o \ - delaunay.o \ - boundarylayer.o \ - msghandler.o \ - meshfunc2d.o \ - smoothing2.o \ - smoothing3.o \ - topology.o \ - curvedelems.o \ - clusters.o \ - zrefine.o \ - ngexception.o \ - geomtest3d.o \ - geom2d.o \ - geom3d.o \ - adtree.o \ - transform3d.o \ - geomfuncs.o \ - polynomial.o \ - densemat.o \ - vector.o \ - basemat.o \ - sparsmat.o \ - algprim.o \ - brick.o \ - manifold.o \ - bspline2d.o \ - meshsurf.o \ - csgeom.o \ - polyhedra.o \ - curve2d.o \ - singularref.o \ - edgeflw.o \ - solid.o \ - explicitcurve2d.o \ - specpoin.o \ - gencyl.o \ - revolution.o \ - genmesh.o \ - spline3d.o \ - surface.o \ - identify.o \ - triapprox.o \ - meshstlsurface.o \ - stlline.o \ - stltopology.o \ - stltool.o \ - stlgeom.o \ - stlgeomchart.o \ - stlgeommesh.o \ - table.o \ - optmem.o \ - spbita2d.o \ - hashtabl.o \ - sort.o \ - flags.o \ - seti.o \ - bitarray.o \ - array.o \ - symbolta.o \ - mystring.o \ - moveablemem.o \ - spline2d.o \ - splinegeometry2.o \ - ngnewdelete.o \ - nglib.o - -$(LIB_OBJ_O): - ar x $(NETGEN_LIBS_DIR)/libnginterface.a - ar x $(NETGEN_LIBS_DIR)/libcsg.a - ar x $(NETGEN_LIBS_DIR)/libgprim.a - ar x $(NETGEN_LIBS_DIR)/libmesh.a - ar x $(NETGEN_LIBS_DIR)/libopti.a - ar x $(NETGEN_LIBS_DIR)/libgen.a - ar x $(NETGEN_LIBS_DIR)/libla.a - ar x $(NETGEN_LIBS_DIR)/libstlgeom.a - ar x $(NETGEN_LIBS_DIR)/libgeom2d.a - rm -rf sgparser.o hprefinement.o parthreads.o writediffpack.o writepermas.o writeuser.o dynamicmem.o importsolution.o readuser.o writefeap.o writetecplot.o wuchemnitz.o extrusion.o writeabaqus.o writefluent.o writetochnog.o csgparser.o geom2dmesh.o - -LIB_OBJ_LO = $(LIB_OBJ_O:%.o=%.lo) - -#implicits rules - -.o.lo: - ln -s $< $@ || true - -@CONCLUDE@ - -$(LIB): $(LIB_OBJ_O) $(LIB_OBJ_LO) - @$(LT) --mode=link $(CXX) -rpath $(libdir) -o $@ $(CXXFLAGS) $(LIB_OBJ_LO) $(LDFLAGS) $(LIBS) - -mostlyclean: cleandep - -$(RM) $(LIB_OBJ_O) $(LIB_OBJ_LO) diff --git a/src/NETGEN/ReadMeForNgUsers b/src/NETGEN/ReadMeForNgUsers deleted file mode 100644 index 555eb9716..000000000 --- a/src/NETGEN/ReadMeForNgUsers +++ /dev/null @@ -1,102 +0,0 @@ -The Netgen 4.3 from the web location : http://www.hpfem.jku.at/netgen/ is used -in the SMESH Module of Salome2 distribution. - -How to build Netgen for Salome ------------------------------- - -Patch the official netgen 4.3 distribution: - -$ cd netgen43 -$ patch -p1 < patch_directory/netgen43ForSalome.patch - -Then run makeForSalome.sh: -$ sh makeForSalome.sh - - -Additional information for maintainers --------------------------------------- - -The SMESH Engine of SALOME2 (particularly the m4 file check_Netgen.m4) assume -that Netgen is installed in the directory as follow: - -prompt> ls - -bin/ cshrc_for_netgen doc/ include/ lib/ tutorials/ - -prompt> ls /bin - -LINUX/ - -prompt> ls /bin/LINUX/ - -demoapp/ ng ng.tcl ngtcltk/ startup.tcl - -prompt> ls /bin/LINUX/demoapp/ - -demoapp.tcl - -prompt> ls /bin/LINUX/ngtcltk/ - -dialog.tcl menustat.tcl ngicon.tcl parameters.tcl -drawing.tcl nghelp.tcl ngvisual.tcl variables.tcl - -prompt> ls /doc/ - -ng4.pdf usenetgen.ps - -prompt> ls /include/ - -nglib.h - -prompt> ls /lib/ - -LINUX/ - -prompt> ls /lib/LINUX/ - -libcsg.a libgeom2d.a libla.a libnginterface.a libstlgeom.a -libgen.a libgprim.a libmesh.a libopti.a libvis.a - -prompt> ls /tutorials/ - -boxcyl.geo cylinder.geo ficherea.geo part1.stl square.in2d -cone.geo cylsphere.geo hinge.stl sculpture.geo trafo.geo -cubeandspheres.geo demo2d.in2d lshape3d.geo shaft.geo twobricks.geo -cube.geo ellipsoid.geo manyholes.geo sphere.geo twocubes.geo -cubemcyl.geo ellipticcyl.geo matrix.geo sphereincube.geo twocyl.geo -cubemsphere.geo - -All *.tcl files are needed to control and initiate the Netgen mesher throughout its -MHI (Machine Human Interface)./bin/LINUX/ng is the Netgen -executable with its embarked MHI. All the libraries *.a should be compiled without -the option -DOPENGL which is only needed for the Netgen MHI. netgen43 is assumed to -be the directory downloaded from the above web location archive of Netgen. The library -/lib/LINUX/libnginterface.a should contain the objects -nglib.o (from netgen43/libsrc/interface/nglib.cpp) and ngnewdelete.o -(from netgen43/ngtcltk/ngnewdelete.cpp). - -To have that kind of distribution from the version in the above web location you -should first compile Netgen as suggested in the netgen43/README.INSTALL file. It will -then produce the executable ng linked statically with the libraries *.a. Then modify -the Makefiles to remove -DOPENGL from compiler flags list, add the objects nglib.o -and ngnewdelete.o to the library libnginterface.a and recompile the libraries only. - -From the above web location perhaps, you will have to alter some Netgen sources to -compile them; if you find any difficulties to do that, just ask me. - -Nadir - -******************************** -* Dr Nadir Bouhamou * -* Ingénieur-chercheur * -* Engineer-Researcher * -* * -* CEA Saclay * -* DEN/DM2S/SFME/LGLS * -* Bat 454 Pièce 5A * -* 91191 Gif-Sur-Yvette cédex * -* * -* Tél: +33 (0)1 69 08 73 07 * -* Fax: +33 (0)1 69 08 96 96 * -* email: nadir.bouhamou@cea.fr * -******************************** diff --git a/src/NETGEN/netgen43ForSalome.patch b/src/NETGEN/netgen43ForSalome.patch deleted file mode 100644 index 5e08d8804..000000000 --- a/src/NETGEN/netgen43ForSalome.patch +++ /dev/null @@ -1,221 +0,0 @@ -diff -N -r -u netgen43/libsrc/include/spline2d.hpp /tmp/netgen43/libsrc/include/spline2d.hpp ---- netgen43/libsrc/include/spline2d.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ /tmp/netgen43/libsrc/include/spline2d.hpp 2003-12-10 16:28:12.000000000 +0100 -@@ -0,0 +1 @@ -+#include "../geom2d/spline2d.hpp" -diff -N -r -u netgen43/libsrc/include/splinegeometry2.hpp /tmp/netgen43/libsrc/include/splinegeometry2.hpp ---- netgen43/libsrc/include/splinegeometry2.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ /tmp/netgen43/libsrc/include/splinegeometry2.hpp 2003-12-10 16:28:23.000000000 +0100 -@@ -0,0 +1 @@ -+#include "../geom2d/splinegeometry2.hpp" -diff -N -r -u netgen43/libsrc/interface/Makefile /tmp/netgen43/libsrc/interface/Makefile ---- netgen43/libsrc/interface/Makefile 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/interface/Makefile 2003-12-10 15:59:47.000000000 +0100 -@@ -1,4 +1,4 @@ --src = nginterface.cpp writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp -+src = writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp nglib.cpp ngnewdelete.cpp - # - lib = nginterface - libpath = libsrc/interface -diff -N -r -u netgen43/libsrc/interface/nglib.cpp /tmp/netgen43/libsrc/interface/nglib.cpp ---- netgen43/libsrc/interface/nglib.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/interface/nglib.cpp 2003-12-10 16:32:54.000000000 +0100 -@@ -23,6 +23,20 @@ - - #include "nglib.h" - -+namespace netgen -+{ -+ char geomfilename [100]; -+ -+ //Destination for messages, errors, ... -+ void Ng_PrintDest(const char * s) -+ { -+ (*mycout) << s << flush; -+ } -+ -+#include -+#include -+} -+ - using namespace netgen; - - // constants and types: -@@ -171,8 +185,6 @@ - // CSG Geometry - - // FlexLexer * lexer; --char geomfilename [100]; -- - - // 2D Meshing Functions: - -@@ -362,7 +374,18 @@ - cout << "e(" << readedges.Get(i) << "," << readedges.Get(i+1) << ")" << endl; - } - */ -- geo->AddEdges(readedges); -+ -+ ARRAY< Point<3> > readedges1; -+ -+ for (i = 1; i <= readedges.Size(); i++) -+ { -+ Point3d readedgesData = readedges.Get(i); -+ Point <3> readedges1Data = Point<3>(readedgesData.X(),readedgesData.Y(),readedgesData.Z()); -+ -+ readedges1.Append(readedges1Data); -+ } -+ -+ geo->AddEdges(readedges1); - } - - if (geo->GetStatus() == STLTopology::STL_GOOD || geo->GetStatus() == STLTopology::STL_WARNING) return NG_OK; -@@ -472,7 +495,14 @@ - n = Vec3d(nv[0],nv[1],nv[2]); - } - -- readtrias.Append(STLReadTriangle(apts,n)); -+ Point<3> apts1[3]; -+ apts1[0] = Point<3>(p1[0],p1[1],p1[2]); -+ apts1[1] = Point<3>(p2[0],p2[1],p2[2]); -+ apts1[2] = Point<3>(p3[0],p3[1],p3[2]); -+ -+ Vec<3> n1 = Vec<3>(n.X(),n.Y(),n.Z()); -+ -+ readtrias.Append(STLReadTriangle(apts1,n1)); - } - - // add (optional) edges: -@@ -487,30 +517,29 @@ - - // compatibility functions: - --void MyError (const char * ch) -+void netgen::MyError (const char * ch) - { - cerr << ch; - } - --//Destination for messages, errors, ... --void Ng_PrintDest(const char * s) --{ -- (*mycout) << s << flush; --} -- -- --double GetTime () -+double netgen::GetTime () - { - return 0; - } - --void ResetTime () -+void netgen::ResetTime () - { - ; - } - --void MyBeep (int i) -+void netgen::MyBeep (int i) - { - ; - } - -+void MeshFromSpline2D (SplineGeometry2d & geometry, -+ Mesh *& mesh, -+ MeshingParameters & mp) -+{ -+ MeshFromSpline2D (geometry, mesh, mp); -+} -diff -N -r -u netgen43/libsrc/makefile.mach.LINUX /tmp/netgen43/libsrc/makefile.mach.LINUX ---- netgen43/libsrc/makefile.mach.LINUX 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/makefile.mach.LINUX 2003-12-10 15:12:18.000000000 +0100 -@@ -14,7 +14,8 @@ - # - CFLAGS2 = - # pg stands for profiling - also in linkflags2 --CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX -DOPENGL -+#CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX -DOPENGL -+CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX - # -fomit-frame-pointer - # -ffast-math - # -diff -N -r -u netgen43/libsrc/meshing/improve2.cpp /tmp/netgen43/libsrc/meshing/improve2.cpp ---- netgen43/libsrc/meshing/improve2.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/meshing/improve2.cpp 2003-12-10 15:42:00.000000000 +0100 -@@ -3,7 +3,7 @@ - #include "meshing.hpp" - #include - --#include -+/*#include */ - - - namespace netgen -diff -N -r -u netgen43/libsrc/meshing/meshing2.cpp /tmp/netgen43/libsrc/meshing/meshing2.cpp ---- netgen43/libsrc/meshing/meshing2.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/meshing/meshing2.cpp 2003-12-10 15:34:35.000000000 +0100 -@@ -1785,7 +1785,7 @@ - - - #else --void glrender (int wait) -+void netgen::glrender (int wait) - { - ; - } -diff -N -r -u netgen43/libsrc/visualization/stlmeshing.cpp /tmp/netgen43/libsrc/visualization/stlmeshing.cpp ---- netgen43/libsrc/visualization/stlmeshing.cpp 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/libsrc/visualization/stlmeshing.cpp 2003-12-10 15:52:53.000000000 +0100 -@@ -5,7 +5,7 @@ - #include - - #include --#include -+/*#include */ - - namespace netgen - { -diff -N -r -u netgen43/Makefile /tmp/netgen43/Makefile ---- netgen43/Makefile 2003-05-07 16:01:43.000000000 +0200 -+++ /tmp/netgen43/Makefile 2003-12-10 15:11:41.000000000 +0100 -@@ -35,7 +35,8 @@ - .SUFFIXES: .cpp .o - # - # --CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include -DOPENGL -+#CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include -DOPENGL -+CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include - LINKFLAGS1 = -lGL -lGLU -lX11 -lXext -lXmu - # - CPLUSPLUSFLAGS = $(CPLUSPLUSFLAGS1) $(CPLUSPLUSFLAGS2) $(CPLUSPLUSFLAGS3) -diff -N -r -u netgen43/makeForSalome.sh /tmp/netgen43/makeForSalome.sh ---- netgen43/makeForSalome.sh 1970-01-01 01:00:00.000000000 +0100 -+++ /tmp/netgen43/makeForSalome.sh 2004-01-05 12:33:59.000000000 +0100 -@@ -0,0 +1,26 @@ -+#! /bin/sh -+cp ngtcltk/ngnewdelete.* libsrc/interface/ -+ -+MACHINE=LINUX -+export MACHINE -+make -C libsrc/csg -+make -C libsrc/general -+make -C libsrc/geom2d -+make -C libsrc/gprim -+make -C libsrc/interface -+make -C libsrc/linalg -+make -C libsrc/meshing -+make -C libsrc/opti -+make -C libsrc/stlgeom -+ -+if [ ! -d install ] ; then -+ mkdir install -+fi -+ -+cp -r lib install/ -+ -+if [ ! -d install/include ] ; then -+ mkdir install/include -+fi -+ -+cp libsrc/interface/nglib.h install/include diff --git a/src/NETGENPlugin/Makefile.in b/src/NETGENPlugin/Makefile.in deleted file mode 100644 index 577190928..000000000 --- a/src/NETGENPlugin/Makefile.in +++ /dev/null @@ -1,67 +0,0 @@ -# SMESH NETGENPlugin : implementaion of SMESH idl descriptions -# -# Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Author : Julia DOROVSKIKH -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl: - - -@COMMENCE@ - -EXPORT_PYSCRIPTS = - -# .po files to transform in .qm -PO_FILES = NETGENPlugin_icons.po - -# Libraries targets -LIB = libNETGENEngine.la -LIB_SRC = \ - NETGENPlugin_NETGEN_3D.cxx \ - NETGENPlugin_NETGEN_3D_i.cxx \ - NETGENPlugin_i.cxx - -LIB_SERVER_IDL = SMESH_NetgenAlgorithm.idl - -LIB_CLIENT_IDL = SMESH_Gen.idl SMESH_Mesh.idl SMESH_Group.idl - -# Executables targets -BIN = -BIN_SRC = - -# additionnal information to compil and link file -NETGEN_INCLUDES=@NETGEN_INCLUDES@ - -CPPFLAGS+= $(OCC_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ - -I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES) $(BOOST_CPPFLAGS) -CXXFLAGS+= $(OCC_CXXFLAGS) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ - -I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES) - -LDFLAGS+= $(HDF5_LIBS) -lSMESHimpl -lSMESHEngine -lStdMeshers -lStdMeshersEngine -lNETGEN -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome -lSalomeGenericObj - -@CONCLUDE@ diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx deleted file mode 100644 index 489d6822e..000000000 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : NETGENPlugin_NETGEN_3D_i.cxx -// Moved here from SMESH_NETGEN_3D_i.cxx -// Author : Nadir Bouhamou CEA -// Module : SMESH -// $Header$ - -using namespace std; -#include "NETGENPlugin_NETGEN_3D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i - * - * Constructor - */ -//============================================================================= - -NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_3D_Algo_i( thePOA ) -{ - MESSAGE( "NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i" ); - myBaseImpl = new ::NETGENPlugin_NETGEN_3D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i - * - * Destructor - */ -//============================================================================= - -NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i() -{ - MESSAGE( "NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i" ); -} - -//============================================================================= -/*! - * NETGENPlugin_NETGEN_3D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::NETGENPlugin_NETGEN_3D* NETGENPlugin_NETGEN_3D_i::GetImpl() -{ - MESSAGE( "NETGENPlugin_NETGEN_3D_i::GetImpl" ); - return ( ::NETGENPlugin_NETGEN_3D* )myBaseImpl; -} - diff --git a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx b/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx deleted file mode 100644 index 724fafa55..000000000 --- a/src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : NETGENPlugin_NETGEN_3D_i.hxx -// Moved here from SMESH_NETGEN_3D_i.hxx -// Author : Nadir Bouhamou CEA -// Module : SMESH -// $Header$ - -#ifndef _NETGENPlugin_NETGEN_3D_I_HXX_ -#define _NETGENPlugin_NETGEN_3D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_NetgenAlgorithm) - -#include "SMESH_3D_Algo_i.hxx" -#include "NETGENPlugin_NETGEN_3D.hxx" - -// ====================================================== -// NETGEN 3d algorithm -// ====================================================== -class NETGENPlugin_NETGEN_3D_i: - public virtual POA_NETGENPlugin::NETGENPlugin_NETGEN_3D, - public virtual SMESH_3D_Algo_i -{ -public: - // Constructor - NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~NETGENPlugin_NETGEN_3D_i(); - - // Get implementation - ::NETGENPlugin_NETGEN_3D* GetImpl(); -}; - -#endif diff --git a/src/NETGENPlugin/NETGENPlugin_i.cxx b/src/NETGENPlugin/NETGENPlugin_i.cxx deleted file mode 100644 index 7ec0e06f5..000000000 --- a/src/NETGENPlugin/NETGENPlugin_i.cxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH NETGENPlugin : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : NETGENPlugin.cxx -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_Hypothesis_i.hxx" -#include "SMESH_Gen_i.hxx" - -#include "utilities.h" - -#include "NETGENPlugin_NETGEN_3D_i.hxx" - -//============================================================================= -/*! - * - */ -//============================================================================= - -extern "C" -{ - GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypName) - { - MESSAGE("GetHypothesisCreator " << aHypName); - - GenericHypothesisCreator_i* aCreator = 0; - - // Hypotheses - - // Algorithms - if (strcmp(aHypName, "NETGEN_3D") == 0) - aCreator = new HypothesisCreator_i; - else ; - - return aCreator; - } -} diff --git a/src/NETGENPlugin/NETGENPlugin_icons.po b/src/NETGENPlugin/NETGENPlugin_icons.po deleted file mode 100644 index a3f6297d7..000000000 --- a/src/NETGENPlugin/NETGENPlugin_icons.po +++ /dev/null @@ -1,20 +0,0 @@ -# This is a Qt message file in .po format. Each msgid starts with -# a scope. This scope should *NOT* be translated - eg. "Foo::Bar" -# would be translated to "Pub", not "Foo::Pub". -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n" -"PO-Revision-Date: YYYY-MM-DD\n" -"Last-Translator: FULLNAME \n" -"Content-Type: text/plain; charset=iso-8859-1\n" - - -#----------------------------------------------------------- -# ObjectBrowser -#----------------------------------------------------------- - -#mesh_tree_algo_netgen -msgid "ICON_SMESH_TREE_ALGO_NETGEN_3D" -msgstr "mesh_tree_algo_tetra.png" -#msgstr "mesh_tree_algo_netgen.png" diff --git a/src/OBJECT/Makefile.in b/src/OBJECT/Makefile.in deleted file mode 100644 index 8cf070ccf..000000000 --- a/src/OBJECT/Makefile.in +++ /dev/null @@ -1,58 +0,0 @@ -# SMESH OBJECT : interactive object for SMESH visualization -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Module : SMESH - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl - -@COMMENCE@ - -EXPORT_HEADERS = SMESH_Actor.h SMESH_Object.h SMESH_ObjectDef.h SMESH_ActorUtils.h - - -# Libraries targets - -LIB = libSMESHObject.la -LIB_SRC = SMESH_Object.cxx SMESH_DeviceActor.cxx SMESH_Actor.cxx \ - SMESH_ExtractGeometry.cxx SMESH_ActorUtils.cxx - -LIB_CLIENT_IDL = SALOME_Exception.idl \ - SALOME_GenericObj.idl \ - SMESH_Mesh.idl \ - SMESH_Group.idl - - -# Executables targets -BIN = -BIN_SRC = - -CPPFLAGS+=$(OCC_INCLUDES) $(VTK_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome \ - $(BOOST_CPPFLAGS) $(QT_INCLUDES) -LDFLAGS+=$(OCC_KERNEL_LIBS) $(VTK_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -L${GUI_ROOT_DIR}/lib/salome -lSMDS \ - -lSalomeApp -lSalomeObject -lSMESHControls - -@CONCLUDE@ diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx deleted file mode 100644 index 3c5e2e0d0..000000000 --- a/src/OBJECT/SMESH_Actor.cxx +++ /dev/null @@ -1,1627 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Actor.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - - -#include "SMESH_ActorDef.h" -#include "SMESH_ActorUtils.h" -#include "SMESH_DeviceActor.h" -#include "SMESH_ControlsDef.hxx" -#include - -#include "SUIT_Session.h" -#include "SUIT_ResourceMgr.h" - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include "utilities.h" - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -static int aLineWidthInc = 2; -static int aPointSizeInc = 2; - - -SMESH_ActorDef* SMESH_ActorDef::New(){ - return new SMESH_ActorDef(); -} - - -SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear) -{ - SMESH_ActorDef* anActor = SMESH_ActorDef::New(); - if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){ - anActor->Delete(); - anActor = NULL; - } - if( anActor ) - anActor->UpdateScalarBar(); - return anActor; -} - - -SMESH_ActorDef::SMESH_ActorDef() -{ - if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<resourceMgr(); - if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) ) - myControlsPrecision = (long)SMESH::GetFloat( "SMESH", "controls_precision", -1 ); - - float aPointSize = SMESH::GetFloat("SMESH:node_size",3); - float aLineWidth = SMESH::GetFloat("SMESH:element_width",1); - - vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); - VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; - - //Definition 2D and 3D divices of the actor - //----------------------------------------- - float anRGB[3] = {1,1,1}; - mySurfaceProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); - mySurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] ); - - myBackSurfaceProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) ); - myBackSurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] ); - - my2DActor = SMESH_DeviceActor::New(); - my2DActor->SetUserMatrix(aMatrix); - my2DActor->PickableOff(); - my2DActor->SetProperty(mySurfaceProp); - my2DActor->SetBackfaceProperty(myBackSurfaceProp); - my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface); - aFilter = my2DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_TRIANGLE); - aFilter->RegisterCellsWithType(VTK_POLYGON); - aFilter->RegisterCellsWithType(VTK_QUAD); - - my3DActor = SMESH_DeviceActor::New(); - my3DActor->SetUserMatrix(aMatrix); - my3DActor->PickableOff(); - my3DActor->SetProperty(mySurfaceProp); - my3DActor->SetBackfaceProperty(myBackSurfaceProp); - my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface); - aFilter = my3DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_TETRA); - aFilter->RegisterCellsWithType(VTK_VOXEL); - aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); - aFilter->RegisterCellsWithType(VTK_WEDGE); - aFilter->RegisterCellsWithType(VTK_PYRAMID); - aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); - - //Definition 1D divice of the actor - //--------------------------------- - myEdgeProp = vtkProperty::New(); - myEdgeProp->SetAmbient(1.0); - myEdgeProp->SetDiffuse(0.0); - myEdgeProp->SetSpecular(0.0); - SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); - myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myEdgeProp->SetLineWidth(aLineWidth); - - my1DActor = SMESH_DeviceActor::New(); - my1DActor->SetUserMatrix(aMatrix); - my1DActor->PickableOff(); - my1DActor->SetHighlited(true); - my1DActor->SetProperty(myEdgeProp); - my1DActor->SetRepresentation(SMESH_DeviceActor::eSurface); - aFilter = my1DActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_LINE); - - my1DProp = vtkProperty::New(); - my1DProp->DeepCopy(myEdgeProp); - my1DProp->SetLineWidth(aLineWidth + aLineWidthInc); - my1DProp->SetPointSize(aPointSize); - - my1DExtProp = vtkProperty::New(); - my1DExtProp->DeepCopy(myEdgeProp); - anRGB[0] = 1 - anRGB[0]; - anRGB[1] = 1 - anRGB[1]; - anRGB[2] = 1 - anRGB[2]; - my1DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - my1DExtProp->SetLineWidth(aLineWidth + aLineWidthInc); - my1DExtProp->SetPointSize(aPointSize + aPointSizeInc); - - my1DExtActor = SMESH_DeviceActor::New(); - my1DExtActor->SetUserMatrix(aMatrix); - my1DExtActor->PickableOff(); - my1DExtActor->SetHighlited(true); - my1DExtActor->SetVisibility(false); - my1DExtActor->SetProperty(my1DExtProp); - my1DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe); - aFilter = my1DExtActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - aFilter->RegisterCellsWithType(VTK_LINE); - - - //Definition 0D divice of the actor - //--------------------------------- - myNodeProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) ); - myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myNodeProp->SetPointSize(aPointSize); - - myNodeActor = SMESH_DeviceActor::New(); - myNodeActor->SetUserMatrix(aMatrix); - myNodeActor->SetStoreClippingMapping(true); - myNodeActor->PickableOff(); - myNodeActor->SetVisibility(false); - myNodeActor->SetProperty(myNodeProp); - myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); - aFilter = myNodeActor->GetExtractUnstructuredGrid(); - aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); - - - //Definition of Pickable and Highlitable engines - //---------------------------------------------- - - myBaseActor = SMESH_DeviceActor::New(); - myBaseActor->SetUserMatrix(aMatrix); - myBaseActor->SetStoreGemetryMapping(true); - myBaseActor->GetProperty()->SetOpacity(0.0); - - myPickableActor = myBaseActor; - - myHighlightProp = vtkProperty::New(); - myHighlightProp->SetAmbient(1.0); - myHighlightProp->SetDiffuse(0.0); - myHighlightProp->SetSpecular(0.0); - SMESH::GetColor( "SMESH", "selection_object_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) ); - myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myHighlightProp->SetPointSize(aPointSize); - myHighlightProp->SetRepresentation(1); - - myPreselectProp = vtkProperty::New(); - myPreselectProp->SetAmbient(1.0); - myPreselectProp->SetDiffuse(0.0); - myPreselectProp->SetSpecular(0.0); - SMESH::GetColor( "SMESH", "highlight_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 255 ) ); - myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - myPreselectProp->SetPointSize(aPointSize); - myPreselectProp->SetRepresentation(1); - - myHighlitableActor = SMESH_DeviceActor::New(); - myHighlitableActor->SetUserMatrix(aMatrix); - myHighlitableActor->PickableOff(); - myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); - - SetShrinkFactor( SMESH::GetFloat( "SMESH:shrink_coeff", 0.75 ) ); - - myName = ""; - myIO = NULL; - - myControlMode = eNone; - myControlActor = my2DActor; - - //Definition of myScalarBarActor - //------------------------------ - myLookupTable = vtkLookupTable::New(); - //Fix for Bug PAL5195 - SMESH764: - //Controls - Aspect Ratio: incorrect colors of the best and worst values - myLookupTable->SetHueRange(0.667,0.0); - - myScalarBarActor = vtkScalarBarActor::New(); - myScalarBarActor->SetVisibility(false); - myScalarBarActor->SetLookupTable(myLookupTable); - - mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return; - - //Definition of points numbering pipeline - //--------------------------------------- - myPointsNumDataSet = vtkUnstructuredGrid::New(); - - myPtsMaskPoints = vtkMaskPoints::New(); - myPtsMaskPoints->SetInput(myPointsNumDataSet); - myPtsMaskPoints->SetOnRatio(1); - - myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New(); - myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput()); - myPtsSelectVisiblePoints->SelectInvisibleOff(); - myPtsSelectVisiblePoints->SetTolerance(0.1); - - myPtsLabeledDataMapper = vtkLabeledDataMapper::New(); - myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput()); - myPtsLabeledDataMapper->SetLabelFormat("%g"); - myPtsLabeledDataMapper->SetLabelModeToLabelScalars(); - - vtkTextProperty* aPtsTextProp = vtkTextProperty::New(); - aPtsTextProp->SetFontFamilyToTimes(); - static int aPointsFontSize = 10; - aPtsTextProp->SetFontSize(aPointsFontSize); - aPtsTextProp->SetBold(1); - aPtsTextProp->SetItalic(0); - aPtsTextProp->SetShadow(0); - myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp); - aPtsTextProp->Delete(); - - myEntityMode = eAllEntity; - - myIsPointsLabeled = false; - - myPointLabels = vtkActor2D::New(); - myPointLabels->SetMapper(myPtsLabeledDataMapper); - myPointLabels->GetProperty()->SetColor(1,1,1); - myPointLabels->SetVisibility(myIsPointsLabeled); - - - //Definition of cells numbering pipeline - //--------------------------------------- - myCellsNumDataSet = vtkUnstructuredGrid::New(); - - myCellCenters = vtkCellCenters::New(); - myCellCenters->SetInput(myCellsNumDataSet); - - myClsMaskPoints = vtkMaskPoints::New(); - myClsMaskPoints->SetInput(myCellCenters->GetOutput()); - myClsMaskPoints->SetOnRatio(1); - - myClsSelectVisiblePoints = vtkSelectVisiblePoints::New(); - myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput()); - myClsSelectVisiblePoints->SelectInvisibleOff(); - myClsSelectVisiblePoints->SetTolerance(0.1); - - myClsLabeledDataMapper = vtkLabeledDataMapper::New(); - myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput()); - myClsLabeledDataMapper->SetLabelFormat("%g"); - myClsLabeledDataMapper->SetLabelModeToLabelScalars(); - - vtkTextProperty* aClsTextProp = vtkTextProperty::New(); - aClsTextProp->SetFontFamilyToTimes(); - static int aCellsFontSize = 12; - aClsTextProp->SetFontSize(aCellsFontSize); - aClsTextProp->SetBold(1); - aClsTextProp->SetItalic(0); - aClsTextProp->SetShadow(0); - myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp); - aClsTextProp->Delete(); - - myIsCellsLabeled = false; - - myCellsLabels = vtkActor2D::New(); - myCellsLabels->SetMapper(myClsLabeledDataMapper); - myCellsLabels->GetProperty()->SetColor(0,1,0); - myCellsLabels->SetVisibility(myIsCellsLabeled); - - // Clipping planes - myImplicitBoolean = vtkImplicitBoolean::New(); - myImplicitBoolean->SetOperationTypeToIntersection(); -} - - -SMESH_ActorDef::~SMESH_ActorDef() -{ - if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<Delete(); - myLookupTable->Delete(); - - mySurfaceProp->Delete(); - myBackSurfaceProp->Delete(); - - myEdgeProp->Delete(); - myHighlightProp->Delete(); - myPreselectProp->Delete(); - - myNodeProp->Delete(); - - my1DProp->Delete(); - my1DActor->Delete(); - - my1DExtProp->Delete(); - my1DExtActor->Delete(); - - my2DActor->Delete(); - my3DActor->Delete(); - - myNodeActor->Delete(); - myBaseActor->Delete(); - - myHighlitableActor->Delete(); - - //Deleting of pints numbering pipeline - //--------------------------------------- - myPointsNumDataSet->Delete(); - - myPtsLabeledDataMapper->RemoveAllInputs(); - myPtsLabeledDataMapper->Delete(); - - myPtsSelectVisiblePoints->UnRegisterAllOutputs(); - myPtsSelectVisiblePoints->Delete(); - - myPtsMaskPoints->UnRegisterAllOutputs(); - myPtsMaskPoints->Delete(); - - myPointLabels->Delete(); - - - //Deleting of cells numbering pipeline - //--------------------------------------- - myCellsNumDataSet->Delete(); - - myClsLabeledDataMapper->RemoveAllInputs(); - myClsLabeledDataMapper->Delete(); - - myClsSelectVisiblePoints->UnRegisterAllOutputs(); - myClsSelectVisiblePoints->Delete(); - - myClsMaskPoints->UnRegisterAllOutputs(); - myClsMaskPoints->Delete(); - - myCellCenters->UnRegisterAllOutputs(); - myCellCenters->Delete(); - - myCellsLabels->Delete(); - - myImplicitBoolean->Delete(); - - myTimeStamp->Delete(); -} - - -void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) -{ - vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); - myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints(); - - if ( myIsPointsLabeled ) - { - myPointsNumDataSet->ShallowCopy(aGrid); - vtkDataSet *aDataSet = myPointsNumDataSet; - - int aNbElem = aDataSet->GetNumberOfPoints(); - - vtkIntArray *anArray = vtkIntArray::New(); - anArray->SetNumberOfValues( aNbElem ); - - for ( int anId = 0; anId < aNbElem; anId++ ) - { - int aSMDSId = myVisualObj->GetNodeObjId( anId ); - anArray->SetValue( anId, aSMDSId ); - } - - aDataSet->GetPointData()->SetScalars( anArray ); - anArray->Delete(); - myPtsMaskPoints->SetInput( aDataSet ); - myPointLabels->SetVisibility( GetVisibility() ); - } - else - { - myPointLabels->SetVisibility( false ); - } - SetRepresentation(GetRepresentation()); - myTimeStamp->Modified(); -} - - -void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled) -{ - vtkUnstructuredGrid* aGrid = GetUnstructuredGrid(); - myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints(); - if(myIsCellsLabeled){ - myCellsNumDataSet->ShallowCopy(aGrid); - vtkDataSet *aDataSet = myCellsNumDataSet; - int aNbElem = aDataSet->GetNumberOfCells(); - vtkIntArray *anArray = vtkIntArray::New(); - anArray->SetNumberOfValues(aNbElem); - for(int anId = 0; anId < aNbElem; anId++){ - int aSMDSId = myVisualObj->GetElemObjId(anId); - anArray->SetValue(anId,aSMDSId); - } - aDataSet->GetCellData()->SetScalars(anArray); - myCellCenters->SetInput(aDataSet); - myCellsLabels->SetVisibility(GetVisibility()); - }else{ - myCellsLabels->SetVisibility(false); - } - myTimeStamp->Modified(); -} - - -void -SMESH_ActorDef:: -SetControlMode(eControl theMode) -{ - SetControlMode(theMode,true); -} - - -void -SMESH_ActorDef:: -SetControlMode(eControl theMode, - bool theCheckEntityMode) -{ - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return; - - myControlMode = eNone; - theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false ); - - my1DActor->GetMapper()->SetScalarVisibility(false); - my2DActor->GetMapper()->SetScalarVisibility(false); - my3DActor->GetMapper()->SetScalarVisibility(false); - myScalarBarActor->SetVisibility(false); - - bool anIsScalarVisible = theMode > eNone; - - if(anIsScalarVisible){ - SMESH::Controls::FunctorPtr aFunctor; - switch(theMode){ - case eLength: - { - SMESH::Controls::Length* aControl = new SMESH::Controls::Length(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my1DActor; - break; - } - case eLength2D: - { - aFunctor.reset(new SMESH::Controls::Length2D()); - myControlActor = my2DActor; - break; - } - case eFreeBorders: - aFunctor.reset(new SMESH::Controls::FreeBorders()); - myControlActor = my1DActor; - break; - case eFreeEdges: - aFunctor.reset(new SMESH::Controls::FreeEdges()); - myControlActor = my2DActor; - break; - case eMultiConnection: - aFunctor.reset(new SMESH::Controls::MultiConnection()); - myControlActor = my1DActor; - break; - case eMultiConnection2D: - aFunctor.reset(new SMESH::Controls::MultiConnection2D()); - myControlActor = my2DActor; - break; - case eArea: - { - SMESH::Controls::Area* aControl = new SMESH::Controls::Area(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eTaper: - { - SMESH::Controls::Taper* aControl = new SMESH::Controls::Taper(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eAspectRatio: - { - SMESH::Controls::AspectRatio* aControl = new SMESH::Controls::AspectRatio(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eAspectRatio3D: - { - SMESH::Controls::AspectRatio3D* aControl = new SMESH::Controls::AspectRatio3D(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my3DActor; - break; - } - case eVolume3D: - { - SMESH::Controls::Volume* aControl = new SMESH::Controls::Volume(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my3DActor; - break; - } - case eMinimumAngle: - { - SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eWarping: - { - SMESH::Controls::Warping* aControl = new SMESH::Controls::Warping(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - case eSkew: - { - SMESH::Controls::Skew* aControl = new SMESH::Controls::Skew(); - aControl->SetPrecision( myControlsPrecision ); - aFunctor.reset( aControl ); - myControlActor = my2DActor; - break; - } - default: - return; - } - - vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); - if(aNbCells){ - myControlMode = theMode; - switch(myControlMode){ - case eFreeEdges: - case eFreeBorders: - my1DExtActor->SetExtControlMode(aFunctor); - break; - case eLength2D: - case eMultiConnection2D: - my1DExtActor->SetExtControlMode(aFunctor,myScalarBarActor,myLookupTable); - break; - default: - myControlActor->SetControlMode(aFunctor,myScalarBarActor,myLookupTable); - } - } - - if(theCheckEntityMode){ - if(myControlActor == my1DActor) - SetEntityMode(eEdges); - else if(myControlActor == my2DActor){ - switch(myControlMode){ - case eLength2D: - case eFreeEdges: - case eMultiConnection2D: - //SetEntityMode(eEdges); - SetEntityMode(eFaces); - break; - default: - SetEntityMode(eFaces); - } - }else if(myControlActor == my3DActor) - SetEntityMode(eVolumes); - } - - }else if(theCheckEntityMode){ - myEntityMode = eAllEntity; - } - - SetRepresentation(GetRepresentation()); - - myTimeStamp->Modified(); - Modified(); -} - - -void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){ - SALOME_Actor::AddToRender(theRenderer); - - theRenderer->AddActor(myNodeActor); - theRenderer->AddActor(myBaseActor); - - theRenderer->AddActor(my3DActor); - theRenderer->AddActor(my2DActor); - - theRenderer->AddActor(my1DActor); - theRenderer->AddActor(my1DExtActor); - - theRenderer->AddActor(myHighlitableActor); - - theRenderer->AddActor2D(myScalarBarActor); - - myPtsSelectVisiblePoints->SetRenderer(theRenderer); - myClsSelectVisiblePoints->SetRenderer(theRenderer); - - theRenderer->AddActor2D(myPointLabels); - theRenderer->AddActor2D(myCellsLabels); -} - -void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ - SALOME_Actor::RemoveFromRender(theRenderer); - - theRenderer->RemoveActor(myNodeActor); - theRenderer->RemoveActor(myBaseActor); - - theRenderer->RemoveActor(myHighlitableActor); - - theRenderer->RemoveActor(my1DActor); - theRenderer->RemoveActor(my1DExtActor); - - theRenderer->RemoveActor(my2DActor); - theRenderer->RemoveActor(my3DActor); - - theRenderer->RemoveActor(myScalarBarActor); - theRenderer->RemoveActor(myPointLabels); - theRenderer->RemoveActor(myCellsLabels); -} - - -bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear) -{ - Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry,"SMESH",theName); - setIO(anIO); - setName(theName); - - myVisualObj = theVisualObj; - myVisualObj->Update(theIsClear); - - myNodeActor->Init(myVisualObj,myImplicitBoolean); - myBaseActor->Init(myVisualObj,myImplicitBoolean); - - myHighlitableActor->Init(myVisualObj,myImplicitBoolean); - - my1DActor->Init(myVisualObj,myImplicitBoolean); - my1DExtActor->Init(myVisualObj,myImplicitBoolean); - - my2DActor->Init(myVisualObj,myImplicitBoolean); - my3DActor->Init(myVisualObj,myImplicitBoolean); - - my1DActor->GetMapper()->SetLookupTable(myLookupTable); - my1DExtActor->GetMapper()->SetLookupTable(myLookupTable); - - my2DActor->GetMapper()->SetLookupTable(myLookupTable); - my3DActor->GetMapper()->SetLookupTable(myLookupTable); - - float aFactor, aUnits; - my2DActor->GetPolygonOffsetParameters(aFactor,aUnits); - my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75); - - //SetIsShrunkable(theGrid->GetNumberOfCells() > 10); - SetIsShrunkable(true); - - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return false; - - int aMode = mgr->integerValue( "SMESH", "display_mode" ); - SetRepresentation(-1); - - if(aMode == 0){ - SetRepresentation(eEdge); - }else if(aMode == 1){ - SetRepresentation(eSurface); - }else if(aMode == 2){ - SetRepresentation(ePoint); - } - - if(aMode == 3){ - SetShrink(); - } - - myTimeStamp->Modified(); - Modified(); - return true; -} - - -float* SMESH_ActorDef::GetBounds(){ - return myNodeActor->GetBounds(); -} - - -vtkDataSet* SMESH_ActorDef::GetInput(){ - return GetUnstructuredGrid(); -} - - -void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){ - myNodeActor->SetTransform(theTransform); - myBaseActor->SetTransform(theTransform); - - myHighlitableActor->SetTransform(theTransform); - - my1DActor->SetTransform(theTransform); - my1DExtActor->SetTransform(theTransform); - - my2DActor->SetTransform(theTransform); - my3DActor->SetTransform(theTransform); - - Modified(); -} - - -void SMESH_ActorDef::SetMapper(vtkMapper* theMapper){ - vtkLODActor::SetMapper(theMapper); -} - - -void SMESH_ActorDef::ShallowCopy(vtkProp *prop){ - SALOME_Actor::ShallowCopy(prop); -} - - -vtkMapper* SMESH_ActorDef::GetMapper(){ - return myPickableActor->GetMapper(); -} - - -vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){ - return myVisualObj->GetUnstructuredGrid(); -} - - -bool SMESH_ActorDef::IsInfinitive(){ - vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid(); - aDataSet->Update(); - myIsInfinite = aDataSet->GetNumberOfCells() == 0 || - aDataSet->GetNumberOfCells() == 1 && - aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX; - return SALOME_Actor::IsInfinitive(); -} - - -void SMESH_ActorDef::SetIsShrunkable(bool theShrunkable){ - myIsShrinkable = theShrunkable; - Modified(); -} - -float SMESH_ActorDef::GetShrinkFactor(){ - return myBaseActor->GetShrinkFactor(); -} - -void SMESH_ActorDef::SetShrinkFactor(float theValue){ - myBaseActor->SetShrinkFactor(theValue); - - my1DActor->SetShrinkFactor(theValue); - my1DExtActor->SetShrinkFactor(theValue); - - my2DActor->SetShrinkFactor(theValue); - my3DActor->SetShrinkFactor(theValue); - - Modified(); -} - -void SMESH_ActorDef::SetShrink(){ - if(!myIsShrinkable) return; - - myBaseActor->SetShrink(); - - my1DActor->SetShrink(); - my1DExtActor->SetShrink(); - - my2DActor->SetShrink(); - my3DActor->SetShrink(); - - myIsShrunk = true; - Modified(); -} - -void SMESH_ActorDef::UnShrink(){ - if(!myIsShrunk) return; - - myBaseActor->UnShrink(); - - my1DActor->UnShrink(); - my1DExtActor->UnShrink(); - - my2DActor->UnShrink(); - my3DActor->UnShrink(); - - myIsShrunk = false; - Modified(); -} - - -int SMESH_ActorDef::GetNodeObjId(int theVtkID){ - return myPickableActor->GetNodeObjId(theVtkID); -} - -float* SMESH_ActorDef::GetNodeCoord(int theObjID){ - return myPickableActor->GetNodeCoord(theObjID); -} - - -int SMESH_ActorDef::GetElemObjId(int theVtkID){ - return myPickableActor->GetElemObjId(theVtkID); -} - -vtkCell* SMESH_ActorDef::GetElemCell(int theObjID){ - return myPickableActor->GetElemCell(theObjID); -} - - -void SMESH_ActorDef::SetVisibility(int theMode){ - SetVisibility(theMode,true); -} - - -void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ - SALOME_Actor::SetVisibility(theMode); - - myNodeActor->VisibilityOff(); - myBaseActor->VisibilityOff(); - - my1DActor->VisibilityOff(); - my1DExtActor->VisibilityOff(); - - my2DActor->VisibilityOff(); - my3DActor->VisibilityOff(); - - myScalarBarActor->VisibilityOff(); - myPointLabels->VisibilityOff(); - myCellsLabels->VisibilityOff(); - - if(GetVisibility()){ - if(theIsUpdateRepersentation) - SetRepresentation(GetRepresentation()); - - if(myControlMode != eNone){ - switch(myControlMode){ - case eFreeEdges: - case eFreeBorders: - my1DExtActor->VisibilityOn(); - break; - case eLength2D: - case eMultiConnection2D: - my1DExtActor->VisibilityOn(); - default: - if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) - myScalarBarActor->VisibilityOn(); - } - } - - if(myRepresentation != ePoint) - myPickableActor->VisibilityOn(); - else { - myNodeActor->VisibilityOn(); - } - - if(myEntityMode & eEdges){ - my1DActor->VisibilityOn(); - } - - if(myEntityMode & eFaces){ - my2DActor->VisibilityOn(); - } - - if(myEntityMode & eVolumes){ - my3DActor->VisibilityOn(); - } - - if(myIsPointsLabeled){ - myPointLabels->VisibilityOn(); - myNodeActor->VisibilityOn(); - } - - if(myIsCellsLabeled) - myCellsLabels->VisibilityOn(); - } - - Modified(); -} - - -void SMESH_ActorDef::SetEntityMode(unsigned int theMode){ - myEntityState = eAllEntity; - - if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)){ - myEntityState &= ~eEdges; - theMode &= ~eEdges; - } - - if(!myVisualObj->GetNbEntities(SMDSAbs_Face)){ - myEntityState &= ~eFaces; - theMode &= ~eFaces; - } - - if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)){ - myEntityState &= ~eVolumes; - theMode &= ~eVolumes; - } - - if(!theMode){ - if(myVisualObj->GetNbEntities(SMDSAbs_Edge)) - theMode |= eEdges; - - if(myVisualObj->GetNbEntities(SMDSAbs_Face)) - theMode |= eFaces; - - if(myVisualObj->GetNbEntities(SMDSAbs_Volume)) - theMode |= eVolumes; - } - - myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState); - - myEntityMode = theMode; - VTKViewer_ExtractUnstructuredGrid* aFilter = NULL; - aFilter = myBaseActor->GetExtractUnstructuredGrid(); - aFilter->ClearRegisteredCellsWithType(); - aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - - if(myEntityMode & eEdges){ - if (MYDEBUG) MESSAGE("EDGES"); - aFilter->RegisterCellsWithType(VTK_LINE); - } - - if(myEntityMode & eFaces){ - if (MYDEBUG) MESSAGE("FACES"); - aFilter->RegisterCellsWithType(VTK_TRIANGLE); - aFilter->RegisterCellsWithType(VTK_POLYGON); - aFilter->RegisterCellsWithType(VTK_QUAD); - } - - if(myEntityMode & eVolumes){ - if (MYDEBUG) MESSAGE("VOLUMES"); - aFilter->RegisterCellsWithType(VTK_TETRA); - aFilter->RegisterCellsWithType(VTK_VOXEL); - aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); - aFilter->RegisterCellsWithType(VTK_WEDGE); - aFilter->RegisterCellsWithType(VTK_PYRAMID); - aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET); - } - aFilter->Update(); - if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells()); - SetVisibility(GetVisibility(),false); -} - -void SMESH_ActorDef::SetRepresentation(int theMode){ - int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge); - int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face); - int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume); - if(theMode < 0){ - myRepresentation = eSurface; - if(!aNbFaces && !aNbVolumes && aNbEdges){ - myRepresentation = eEdge; - }else if(!aNbFaces && !aNbVolumes && !aNbEdges){ - myRepresentation = ePoint; - } - }else{ - switch(theMode){ - case eEdge: - if(!aNbFaces && !aNbVolumes && !aNbEdges) return; - break; - case eSurface: - if(!aNbFaces && !aNbVolumes) return; - break; - } - myRepresentation = theMode; - } - - if(!GetUnstructuredGrid()->GetNumberOfCells()) - myRepresentation = ePoint; - - if(myIsShrunk){ - if(myRepresentation == ePoint){ - UnShrink(); - myIsShrunk = true; - }else{ - SetShrink(); - } - } - - myPickableActor = myBaseActor; - myNodeActor->SetVisibility(false); - vtkProperty *aProp = NULL, *aBackProp = NULL; - SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1); - switch(myRepresentation){ - case ePoint: - myPickableActor = myNodeActor; - myNodeActor->SetVisibility(true); - - aProp = aBackProp = myNodeProp; - aReperesent = SMESH_DeviceActor::ePoint; - break; - case eEdge: - aProp = aBackProp = myEdgeProp; - aReperesent = SMESH_DeviceActor::eInsideframe; - break; - case eSurface: - aProp = mySurfaceProp; - aBackProp = myBackSurfaceProp; - aReperesent = SMESH_DeviceActor::eSurface; - break; - } - - my2DActor->SetProperty(aProp); - my2DActor->SetBackfaceProperty(aBackProp); - my2DActor->SetRepresentation(aReperesent); - - my3DActor->SetProperty(aProp); - my3DActor->SetBackfaceProperty(aBackProp); - my3DActor->SetRepresentation(aReperesent); - - my1DExtActor->SetVisibility(false); - - switch(myControlMode){ - case eLength: - case eMultiConnection: - aProp = aBackProp = my1DProp; - if(myRepresentation != ePoint) - aReperesent = SMESH_DeviceActor::eInsideframe; - break; - } - - my1DActor->SetProperty(aProp); - my1DActor->SetBackfaceProperty(aBackProp); - my1DActor->SetRepresentation(aReperesent); - - my1DExtActor->SetRepresentation(aReperesent); - - if(myIsPointsVisible) - myPickableActor = myNodeActor; - if(GetPointRepresentation()) - myNodeActor->SetVisibility(true); - - SetMapper(myPickableActor->GetMapper()); - - SetVisibility(GetVisibility(),false); - - Modified(); -} - - -void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){ - myIsPointsVisible = theIsPointsVisible; - SetRepresentation(GetRepresentation()); -} - -bool SMESH_ActorDef::GetPointRepresentation(){ - return myIsPointsVisible || myIsPointsLabeled; -} - - -void SMESH_ActorDef::UpdateHighlight(){ - myHighlitableActor->SetVisibility(false); - myHighlitableActor->SetHighlited(false); - - if(myIsHighlighted){ - myHighlitableActor->SetProperty(myHighlightProp); - }else if(myIsPreselected){ - myHighlitableActor->SetProperty(myPreselectProp); - } - - bool anIsVisible = GetVisibility(); - - if(myIsHighlighted || myIsPreselected){ - if(GetUnstructuredGrid()->GetNumberOfCells()){ - myHighlitableActor->SetHighlited(anIsVisible); - myHighlitableActor->SetVisibility(anIsVisible); - myHighlitableActor->GetExtractUnstructuredGrid()-> - SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells); - myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); - }else if(myRepresentation == ePoint || GetPointRepresentation()){ - myHighlitableActor->SetHighlited(anIsVisible); - myHighlitableActor->SetVisibility(anIsVisible); - myHighlitableActor->GetExtractUnstructuredGrid()-> - SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); - myHighlitableActor->SetRepresentation(SMESH_DeviceActor::ePoint); - } - } -} - - -void SMESH_ActorDef::highlight(bool theHighlight){ - myIsHighlighted = theHighlight; - UpdateHighlight(); -} - - -void SMESH_ActorDef::SetPreSelected(bool thePreselect){ - myIsPreselected = thePreselect; - UpdateHighlight(); -} - - -// From vtkFollower -int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp) -{ - if (myPickableActor->GetIsOpaque()) - { - vtkRenderer *ren = static_cast(vp); - this->Render(ren); - return 1; - } - return 0; -} - - -int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp) -{ - if (!myPickableActor->GetIsOpaque()) - { - vtkRenderer *ren = static_cast(vp); - this->Render(ren); - return 1; - } - return 0; -} - - -void SMESH_ActorDef::Render(vtkRenderer *ren){ - unsigned long aTime = myTimeStamp->GetMTime(); - unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); - unsigned long aClippingTime = myImplicitBoolean->GetMTime(); - if(anObjTime > aTime || aClippingTime > aTime) - Update(); -} - - -void SMESH_ActorDef::Update(){ - if(MYDEBUG) MESSAGE("SMESH_ActorDef::Update"); - - if(GetControlMode() != eNone) { - unsigned long aTime = myTimeStamp->GetMTime(); - unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime(); - if (anObjTime > aTime) - SetControlMode(GetControlMode(),false); - } - if(myIsPointsLabeled){ - SetPointsLabeled(myIsPointsLabeled); - } - if(myIsCellsLabeled){ - SetCellsLabeled(myIsCellsLabeled); - } - SetEntityMode(GetEntityMode()); - SetVisibility(GetVisibility()); - - myTimeStamp->Modified(); - Modified(); -} - - -void SMESH_ActorDef::ReleaseGraphicsResources(vtkWindow *renWin){ - SALOME_Actor::ReleaseGraphicsResources(renWin); - - myPickableActor->ReleaseGraphicsResources(renWin); -} - - -static void GetColor(vtkProperty *theProperty, float& r,float& g,float& b){ - float* aColor = theProperty->GetColor(); - r = aColor[0]; - g = aColor[1]; - b = aColor[2]; -} - - -void SMESH_ActorDef::SetOpacity(float theValue){ - mySurfaceProp->SetOpacity(theValue); - myBackSurfaceProp->SetOpacity(theValue); - myEdgeProp->SetOpacity(theValue); - myNodeProp->SetOpacity(theValue); - - my1DProp->SetOpacity(theValue); -} - - -float SMESH_ActorDef::GetOpacity(){ - return mySurfaceProp->GetOpacity(); -} - - -void SMESH_ActorDef::SetSufaceColor(float r,float g,float b){ - mySurfaceProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetSufaceColor(float& r,float& g,float& b){ - ::GetColor(mySurfaceProp,r,g,b); -} - -void SMESH_ActorDef::SetBackSufaceColor(float r,float g,float b){ - myBackSurfaceProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetBackSufaceColor(float& r,float& g,float& b){ - ::GetColor(myBackSurfaceProp,r,g,b); -} - -void SMESH_ActorDef::SetEdgeColor(float r,float g,float b){ - myEdgeProp->SetColor(r,g,b); - my1DProp->SetColor(r,g,b); - my1DExtProp->SetColor(1.0-r,1.0-g,1.0-b); - Modified(); -} - -void SMESH_ActorDef::GetEdgeColor(float& r,float& g,float& b){ - ::GetColor(myEdgeProp,r,g,b); -} - -void SMESH_ActorDef::SetNodeColor(float r,float g,float b){ - myNodeProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetNodeColor(float& r,float& g,float& b){ - ::GetColor(myNodeProp,r,g,b); -} - -void SMESH_ActorDef::SetHighlightColor(float r,float g,float b){ - myHighlightProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetHighlightColor(float& r,float& g,float& b){ - ::GetColor(myHighlightProp,r,g,b); -} - -void SMESH_ActorDef::SetPreHighlightColor(float r,float g,float b){ - myPreselectProp->SetColor(r,g,b); - Modified(); -} - -void SMESH_ActorDef::GetPreHighlightColor(float& r,float& g,float& b){ - ::GetColor(myPreselectProp,r,g,b); -} - - -float SMESH_ActorDef::GetLineWidth(){ - return myEdgeProp->GetLineWidth(); -} - - -void SMESH_ActorDef::SetLineWidth(float theVal){ - myEdgeProp->SetLineWidth(theVal); - - my1DProp->SetLineWidth(theVal + aLineWidthInc); - my1DExtProp->SetLineWidth(theVal + aLineWidthInc); - - Modified(); -} - - -void SMESH_ActorDef::SetNodeSize(float theVal){ - myNodeProp->SetPointSize(theVal); - myHighlightProp->SetPointSize(theVal); - myPreselectProp->SetPointSize(theVal); - - my1DProp->SetPointSize(theVal + aPointSizeInc); - my1DExtProp->SetPointSize(theVal + aPointSizeInc); - - Modified(); -} - -float SMESH_ActorDef::GetNodeSize(){ - return myNodeProp->GetPointSize(); -} - -int SMESH_ActorDef::GetObjDimension( const int theObjId ) -{ - return myVisualObj->GetElemDimension( theObjId ); -} - -bool -SMESH_ActorDef:: -IsImplicitFunctionUsed() const -{ - return myBaseActor->IsImplicitFunctionUsed(); -} - -void -SMESH_ActorDef:: -SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) -{ - myNodeActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - myBaseActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - - myHighlitableActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - - my1DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - my1DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - - my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); - my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed); -} - -vtkIdType -SMESH_ActorDef:: -AddClippingPlane(vtkPlane* thePlane) -{ - if(thePlane){ - myImplicitBoolean->GetFunction()->AddItem(thePlane); - myCippingPlaneCont.push_back(thePlane); - if(!IsImplicitFunctionUsed()) - SetImplicitFunctionUsed(true); - } - return myCippingPlaneCont.size(); -} - -void -SMESH_ActorDef:: -RemoveAllClippingPlanes() -{ - myImplicitBoolean->GetFunction()->RemoveAllItems(); - myImplicitBoolean->GetFunction()->Modified(); // VTK bug - myCippingPlaneCont.clear(); - SetImplicitFunctionUsed(false); -} - -vtkIdType -SMESH_ActorDef:: -GetNumberOfClippingPlanes() -{ - return myCippingPlaneCont.size(); -} - -vtkPlane* -SMESH_ActorDef:: -GetClippingPlane(vtkIdType theID) -{ - if(theID >= myCippingPlaneCont.size()) - return NULL; - return myCippingPlaneCont[theID].Get(); -} - - -static void ComputeBoundsParam(vtkDataSet* theDataSet, - float theDirection[3], float theMinPnt[3], - float& theMaxBoundPrj, float& theMinBoundPrj) -{ - float aBounds[6]; - theDataSet->GetBounds(aBounds); - - //Enlarge bounds in order to avoid conflicts of precision - for(int i = 0; i < 6; i += 2){ - static double EPS = 1.0E-3; - float aDelta = (aBounds[i+1] - aBounds[i])*EPS; - aBounds[i] -= aDelta; - aBounds[i+1] += aDelta; - } - - float aBoundPoints[8][3] = { {aBounds[0],aBounds[2],aBounds[4]}, - {aBounds[1],aBounds[2],aBounds[4]}, - {aBounds[0],aBounds[3],aBounds[4]}, - {aBounds[1],aBounds[3],aBounds[4]}, - {aBounds[0],aBounds[2],aBounds[5]}, - {aBounds[1],aBounds[2],aBounds[5]}, - {aBounds[0],aBounds[3],aBounds[5]}, - {aBounds[1],aBounds[3],aBounds[5]}}; - - int aMaxId = 0, aMinId = aMaxId; - theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); - theMinBoundPrj = theMaxBoundPrj; - for(int i = 1; i < 8; i++){ - float aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); - if(theMaxBoundPrj < aTmp){ - theMaxBoundPrj = aTmp; - aMaxId = i; - } - if(theMinBoundPrj > aTmp){ - theMinBoundPrj = aTmp; - aMinId = i; - } - } - float *aMinPnt = aBoundPoints[aMaxId]; - theMinPnt[0] = aMinPnt[0]; - theMinPnt[1] = aMinPnt[1]; - theMinPnt[2] = aMinPnt[2]; -} - - -static void DistanceToPosition(vtkDataSet* theDataSet, - float theDirection[3], float theDist, float thePos[3]) -{ - float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; - ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - float aLength = (aMaxBoundPrj-aMinBoundPrj)*theDist; - thePos[0] = aMinPnt[0]-theDirection[0]*aLength; - thePos[1] = aMinPnt[1]-theDirection[1]*aLength; - thePos[2] = aMinPnt[2]-theDirection[2]*aLength; -} - - -static void PositionToDistance(vtkDataSet* theDataSet, - float theDirection[3], float thePos[3], float& theDist) -{ - float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; - ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - float aPrj = vtkMath::Dot(theDirection,thePos); - theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj); -} - - -void SMESH_ActorDef::SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane) -{ - thePlane->SetNormal(theDir); - float anOrigin[3]; - ::DistanceToPosition(GetUnstructuredGrid(),theDir,theDist,anOrigin); - thePlane->SetOrigin(anOrigin); -} - - -void SMESH_ActorDef::GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane) -{ - thePlane->GetNormal(theDir); - - float anOrigin[3]; - thePlane->GetOrigin(anOrigin); - ::PositionToDistance(GetUnstructuredGrid(),theDir,anOrigin,theDist); -} - -void SMESH_ActorDef::UpdateScalarBar() -{ - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( !mgr ) - return; - - vtkTextProperty* aScalarBarTitleProp = vtkTextProperty::New(); - - QColor aTColor = mgr->colorValue( "SMESH", "scalar_bar_title_color", QColor( 255, 255, 255 ) ); - aScalarBarTitleProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. ); - - aScalarBarTitleProp->SetFontFamilyToArial(); - - if ( mgr->hasValue( "SMESH", "scalar_bar_title_font" ) ) - { - QFont f = mgr->fontValue( "SMESH", "scalar_bar_title_font" ); - if ( f.family() == "Arial" ) - aScalarBarTitleProp->SetFontFamilyToArial(); - else if ( f.family() == "Courier" ) - aScalarBarTitleProp->SetFontFamilyToCourier(); - else if ( f.family() == "Times" ) - aScalarBarTitleProp->SetFontFamilyToTimes(); - - if ( f.bold() ) - aScalarBarTitleProp->BoldOn(); - else - aScalarBarTitleProp->BoldOff(); - - if ( f.italic() ) - aScalarBarTitleProp->ItalicOn(); - else - aScalarBarTitleProp->ItalicOff(); - - if ( f.underline() ) - aScalarBarTitleProp->ShadowOn(); - else - aScalarBarTitleProp->ShadowOff(); - } - - myScalarBarActor->SetTitleTextProperty( aScalarBarTitleProp ); - aScalarBarTitleProp->Delete(); - - vtkTextProperty* aScalarBarLabelProp = vtkTextProperty::New(); - - aTColor = mgr->colorValue( "SMESH", "scalar_bar_label_color", QColor( 255, 255, 255 ) ); - aScalarBarLabelProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. ); - - aScalarBarLabelProp->SetFontFamilyToArial(); - if( mgr->hasValue( "SMESH", "scalar_bar_label_font" ) ) - { - QFont f = mgr->stringValue( "SMESH", "scalar_bar_label_font" ); - if( f.family() == "Arial" ) - aScalarBarLabelProp->SetFontFamilyToArial(); - else if( f.family() == "Courier" ) - aScalarBarLabelProp->SetFontFamilyToCourier(); - else if( f.family() == "Times" ) - aScalarBarLabelProp->SetFontFamilyToTimes(); - - if ( f.bold() ) - aScalarBarLabelProp->BoldOn(); - else - aScalarBarLabelProp->BoldOff(); - - if ( f.italic() ) - aScalarBarLabelProp->ItalicOn(); - else - aScalarBarLabelProp->ItalicOff(); - - if( f.underline() ) - aScalarBarLabelProp->ShadowOn(); - else - aScalarBarLabelProp->ShadowOff(); - } - - myScalarBarActor->SetLabelTextProperty( aScalarBarLabelProp ); - aScalarBarLabelProp->Delete(); - - bool horiz = ( mgr->integerValue( "SMESH", "scalar_bar_orientation" ) == 1 ); - QString name = QString( "scalar_bar_%1_" ).arg( horiz ? "horizontal" : "vertical" ); - if( horiz ) - myScalarBarActor->SetOrientationToHorizontal(); - else - myScalarBarActor->SetOrientationToVertical(); - - - float aXVal = horiz ? 0.20 : 0.01; - if( mgr->hasValue( "SMESH", name + "x" ) ) - aXVal = mgr->doubleValue( "SMESH", name + "x", aXVal ); - - float aYVal = horiz ? 0.01 : 0.1; - if( mgr->hasValue( "SMESH", name + "y" ) ) - aYVal = mgr->doubleValue( "SMESH", name + "y", aYVal ); - myScalarBarActor->SetPosition( aXVal, aYVal ); - - float aWVal = horiz ? 0.60 : 0.10; - if( mgr->hasValue( "SMESH", name + "width" ) ) - aWVal = mgr->doubleValue( "SMESH", name + "width", aWVal ); - myScalarBarActor->SetWidth( aWVal ); - - float aHVal = horiz ? 0.12 : 0.80; - if( mgr->hasValue( "SMESH", name + "height" ) ) - aHVal = mgr->doubleValue( "SMESH", name + "height", aHVal ); - myScalarBarActor->SetHeight( aHVal ); - - int anIntVal = 5; - if( mgr->hasValue( "SMESH", "scalar_bar_num_labels" ) ) - anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_labels", anIntVal ); - myScalarBarActor->SetNumberOfLabels( anIntVal == 0 ? 5: anIntVal ); - - anIntVal = 64; - if( mgr->hasValue( "SMESH", "scalar_bar_num_colors" ) ) - anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_colors", anIntVal ); - myScalarBarActor->SetMaximumNumberOfColors( anIntVal == 0 ? 64 : anIntVal ); - -} diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h deleted file mode 100644 index 7319914d7..000000000 --- a/src/OBJECT/SMESH_Actor.h +++ /dev/null @@ -1,121 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Actor.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_ACTOR_H -#define SMESH_ACTOR_H - -#include -#include "SMESH_Object.h" - -class vtkUnstructuredGrid; - -class vtkScalarBarActor; - -class vtkPlane; -class vtkImplicitBoolean; - -class SMESH_Actor: public SALOME_Actor -{ - static SMESH_Actor* New() { return NULL;} - - public: - vtkTypeMacro(SMESH_Actor,SALOME_Actor); - static SMESH_Actor* New(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear); - - virtual void SetSufaceColor(float r,float g,float b) = 0; - virtual void GetSufaceColor(float& r,float& g,float& b) = 0; - - virtual void SetBackSufaceColor(float r,float g,float b) = 0; - virtual void GetBackSufaceColor(float& r,float& g,float& b) = 0; - - virtual void SetEdgeColor(float r,float g,float b) = 0; - virtual void GetEdgeColor(float& r,float& g,float& b) = 0; - - virtual void SetNodeColor(float r,float g,float b) = 0; - virtual void GetNodeColor(float& r,float& g,float& b) = 0; - - virtual void SetHighlightColor(float r,float g,float b) = 0; - virtual void GetHighlightColor(float& r,float& g,float& b) = 0; - - virtual void SetPreHighlightColor(float r,float g,float b) = 0; - virtual void GetPreHighlightColor(float& r,float& g,float& b) = 0; - - virtual float GetLineWidth() = 0; - virtual void SetLineWidth(float theVal) = 0; - - virtual void SetNodeSize(float size) = 0; - virtual float GetNodeSize() = 0; - - enum EReperesent { ePoint, eEdge, eSurface}; - - enum EEntityMode { eEdges = 0x01, eFaces = 0x02, eVolumes = 0x04, eAllEntity = 0x07}; - virtual void SetEntityMode(unsigned int theMode) = 0; - virtual unsigned int GetEntityMode() const = 0; - - virtual void SetPointRepresentation(bool theIsPointsVisible) = 0; - virtual bool GetPointRepresentation() = 0; - - virtual vtkUnstructuredGrid* GetUnstructuredGrid() = 0; - - virtual void SetShrinkFactor(float theValue) = 0; - - virtual void SetPointsLabeled(bool theIsPointsLabeled) = 0; - virtual bool GetPointsLabeled() = 0; - - virtual void SetCellsLabeled(bool theIsCellsLabeled) = 0; - virtual bool GetCellsLabeled() = 0; - - enum eControl{eNone, eLength, eLength2D, eFreeBorders, eFreeEdges, eMultiConnection, - eArea, eTaper, eAspectRatio, eMinimumAngle, eWarping, eSkew, - eAspectRatio3D, eMultiConnection2D, eVolume3D}; - virtual void SetControlMode(eControl theMode) = 0; - virtual eControl GetControlMode() = 0; - - virtual vtkScalarBarActor* GetScalarBarActor() = 0; - - virtual void SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane) = 0; - virtual void GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane) = 0; - - virtual void RemoveAllClippingPlanes() = 0; - virtual vtkIdType GetNumberOfClippingPlanes() = 0; - virtual vtkPlane* GetClippingPlane(vtkIdType theID) = 0; - virtual vtkIdType AddClippingPlane(vtkPlane* thePlane) = 0; - - virtual TVisualObjPtr GetObject() = 0; - - virtual void SetControlsPrecision( const long ) = 0; - virtual long GetControlsPrecision() const = 0; - - virtual void UpdateScalarBar() = 0; -}; - - -#endif //SMESH_ACTOR_H diff --git a/src/OBJECT/SMESH_ActorDef.h b/src/OBJECT/SMESH_ActorDef.h deleted file mode 100644 index 7ed5149f1..000000000 --- a/src/OBJECT/SMESH_ActorDef.h +++ /dev/null @@ -1,277 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_ActorDef.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_ACTORDEF_H -#define SMESH_ACTORDEF_H - -#include "SMESH_Actor.h" -#include "SMESH_Object.h" - -#include - -template -class TVTKSmartPtr: public vtkSmartPointer -{ -public: - TVTKSmartPtr() {} - TVTKSmartPtr(T* r, bool theIsOwner = false): vtkSmartPointer(r) { - if(r && theIsOwner) - r->Delete(); - } - TVTKSmartPtr& operator()(T* r, bool theIsOwner = false){ - vtkSmartPointer::operator=(r); - if(r && theIsOwner) - r->Delete(); - return *this; - } - TVTKSmartPtr& operator=(T* r){ vtkSmartPointer::operator=(r); return *this;} - T* Get() const { return this->GetPointer();} -}; - - -class vtkProperty; -class vtkShrinkFilter; -class vtkPolyDataMapper; -class vtkUnstructuredGrid; -class vtkMergeFilter; -class vtkPolyData; - -class vtkMapper; -class vtkActor2D; -class vtkMaskPoints; -class vtkCellCenters; -class vtkLabeledDataMapper; -class vtkSelectVisiblePoints; - -class vtkScalarBarActor; -class vtkLookupTable; - -class vtkPlane; -class vtkImplicitBoolean; - -class vtkTimeStamp; - -class SMESH_DeviceActor; - - -class SMESH_ActorDef : public SMESH_Actor{ - friend class SMESH_VisualObj; - friend class SMESH_Actor; - - public: - vtkTypeMacro(SMESH_ActorDef,SMESH_Actor); - - virtual void ReleaseGraphicsResources(vtkWindow *renWin); - virtual int RenderOpaqueGeometry(vtkViewport *viewport); - virtual int RenderTranslucentGeometry(vtkViewport *viewport); - virtual void Render(vtkRenderer *ren); - - virtual void AddToRender(vtkRenderer* theRenderer); - virtual void RemoveFromRender(vtkRenderer* theRenderer); - - virtual bool hasHighlight() { return true; } - virtual void highlight(bool theHighlight); - virtual void SetPreSelected(bool thePreselect = false); - - virtual bool IsInfinitive(); - - virtual void SetOpacity(float theValue); - virtual float GetOpacity(); - - virtual void SetSufaceColor(float r,float g,float b); - virtual void GetSufaceColor(float& r,float& g,float& b); - - virtual void SetBackSufaceColor(float r,float g,float b); - virtual void GetBackSufaceColor(float& r,float& g,float& b); - - virtual void SetEdgeColor(float r,float g,float b); - virtual void GetEdgeColor(float& r,float& g,float& b); - - virtual void SetNodeColor(float r,float g,float b); - virtual void GetNodeColor(float& r,float& g,float& b); - - virtual void SetHighlightColor(float r,float g,float b); - virtual void GetHighlightColor(float& r,float& g,float& b); - - virtual void SetPreHighlightColor(float r,float g,float b); - virtual void GetPreHighlightColor(float& r,float& g,float& b); - - virtual float GetLineWidth(); - virtual void SetLineWidth(float theVal); - - virtual void SetNodeSize(float size) ; - virtual float GetNodeSize() ; - - virtual int GetNodeObjId(int theVtkID); - virtual float* GetNodeCoord(int theObjID); - - virtual int GetElemObjId(int theVtkID); - virtual vtkCell* GetElemCell(int theObjID); - - virtual int GetObjDimension( const int theObjId ); - - virtual void SetVisibility(int theMode); - void SetVisibility(int theMode, bool theIsUpdateRepersentation); - - virtual void SetRepresentation(int theMode); - - virtual unsigned int GetEntityMode() const { return myEntityMode;} - virtual void SetEntityMode(unsigned int theMode); - - virtual void SetPointRepresentation(bool theIsPointsVisible); - virtual bool GetPointRepresentation(); - - virtual float* GetBounds(); - virtual void SetTransform(VTKViewer_Transform* theTransform); - - virtual vtkUnstructuredGrid* GetUnstructuredGrid(); - virtual vtkDataSet* GetInput(); - virtual vtkMapper* GetMapper(); - - virtual float GetShrinkFactor(); - virtual void SetShrinkFactor(float theValue); - - virtual bool IsShrunkable() { return myIsShrinkable;} - virtual bool IsShrunk() { return myIsShrunk;} - virtual void SetShrink(); - virtual void UnShrink(); - - virtual void SetPointsLabeled(bool theIsPointsLabeled); - virtual bool GetPointsLabeled(){ return myIsPointsLabeled;} - - virtual void SetCellsLabeled(bool theIsCellsLabeled); - virtual bool GetCellsLabeled(){ return myIsCellsLabeled;} - - virtual void SetControlMode(eControl theMode); - virtual eControl GetControlMode(){ return myControlMode;} - - virtual vtkScalarBarActor* GetScalarBarActor(){ return myScalarBarActor;} - - virtual void SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane); - virtual void GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane); - - virtual void RemoveAllClippingPlanes(); - virtual vtkIdType GetNumberOfClippingPlanes(); - virtual vtkPlane* GetClippingPlane(vtkIdType theID); - virtual vtkIdType AddClippingPlane(vtkPlane* thePlane); - - virtual TVisualObjPtr GetObject() { return myVisualObj;} - - virtual void SetControlsPrecision( const long p ) { myControlsPrecision = p; } - virtual long GetControlsPrecision() const { return myControlsPrecision; } - - virtual void UpdateScalarBar(); - - protected: - void SetControlMode(eControl theMode, bool theCheckEntityMode); - void SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed); - bool IsImplicitFunctionUsed() const; - - TVisualObjPtr myVisualObj; - vtkTimeStamp* myTimeStamp; - - vtkScalarBarActor* myScalarBarActor; - vtkLookupTable* myLookupTable; - - vtkProperty* mySurfaceProp; - vtkProperty* myBackSurfaceProp; - vtkProperty* myEdgeProp; - vtkProperty* myNodeProp; - - SMESH_DeviceActor* myBaseActor; - SMESH_DeviceActor* myNodeActor; - SMESH_DeviceActor* myPickableActor; - - vtkProperty* myHighlightProp; - vtkProperty* myPreselectProp; - SMESH_DeviceActor* myHighlitableActor; - - eControl myControlMode; - SMESH_DeviceActor* my2DActor; - SMESH_DeviceActor* my3DActor; - SMESH_DeviceActor* myControlActor; - - vtkProperty* my1DProp; - SMESH_DeviceActor* my1DActor; - vtkProperty* my1DExtProp; - SMESH_DeviceActor* my1DExtActor; - - unsigned int myEntityMode; - unsigned int myEntityState; - bool myIsPointsVisible; - - bool myIsShrinkable; - bool myIsShrunk; - - bool myIsPointsLabeled; - vtkUnstructuredGrid* myPointsNumDataSet; - vtkActor2D *myPointLabels; - vtkMaskPoints* myPtsMaskPoints; - vtkLabeledDataMapper* myPtsLabeledDataMapper; - vtkSelectVisiblePoints* myPtsSelectVisiblePoints; - - bool myIsCellsLabeled; - vtkUnstructuredGrid* myCellsNumDataSet; - vtkActor2D *myCellsLabels; - vtkMaskPoints* myClsMaskPoints; - vtkCellCenters* myCellCenters; - vtkLabeledDataMapper* myClsLabeledDataMapper; - vtkSelectVisiblePoints* myClsSelectVisiblePoints; - - vtkImplicitBoolean* myImplicitBoolean; - typedef TVTKSmartPtr TPlanePtr; - typedef std::vector TCippingPlaneCont; - TCippingPlaneCont myCippingPlaneCont; - long myControlsPrecision; - - SMESH_ActorDef(); - ~SMESH_ActorDef(); - - bool Init(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear); - - void SetIsShrunkable(bool theShrunkable); - void UpdateHighlight(); - void Update(); - - private: - // hide the two parameter Render() method from the user and the compiler. - virtual void Render(vtkRenderer *, vtkMapper *) {}; - virtual void ShallowCopy(vtkProp *prop); - virtual void SetMapper(vtkMapper *); - static SMESH_ActorDef* New(); - - // Not implemented. - SMESH_ActorDef(const SMESH_ActorDef&); - void operator=(const SMESH_ActorDef&); -}; - - -#endif //SMESH_ACTORDEF_H diff --git a/src/OBJECT/SMESH_ActorUtils.cxx b/src/OBJECT/SMESH_ActorUtils.cxx deleted file mode 100644 index feee143db..000000000 --- a/src/OBJECT/SMESH_ActorUtils.cxx +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - - -#include "SMESH_ActorUtils.h" - -#include "SUIT_Tools.h" -#include "SUIT_Session.h" -#include "SUIT_ResourceMgr.h" - -#include "utilities.h" - -#include -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 1; -#else -static int MYDEBUG = 0; -#endif - -namespace SMESH{ - - float GetFloat( const QString& theValue, float theDefault ) - { - int pos = theValue.find( ":" ); - float val = theDefault; - if( pos>=0 ) - { - QString name = theValue.right( theValue.length()-pos-1 ), - sect = theValue.left( pos ); - if( !name.isEmpty() && !sect.isEmpty() ) - val = GetFloat( name, sect, theDefault ); - } - return val; - } - - float GetFloat( const QString& theValue, const QString& theSection, float theDefault ) - { - float val = theDefault; - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if( mgr ) - val = (float) mgr->doubleValue( theValue, theSection, theDefault ); - - return val; - } - - void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName){ - vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New(); - aWriter->SetFileName(theFileName); - aWriter->SetInput(theGrid); - if(theGrid->GetNumberOfCells()){ - aWriter->Write(); - } - aWriter->Delete(); - } - - QColor GetColor( const QString& theSect, const QString& theName, const QColor& def ) - { - QColor c = def; - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if ( mgr ) - c = mgr->colorValue( theSect, theName, def ); - return c; - } - - void GetColor( const QString& theSect, const QString& theName, int& r, int& g, int& b, const QColor& def ) - { - QColor c = def; - SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); - if ( mgr ) - c = mgr->colorValue( theSect, theName, def ); - - SUIT_Tools::rgbSet( SUIT_Tools::rgbSet( c ), r, g, b ); - } - - void GetColor( const QString& theSect, const QString& theName, float& r, float& g, float& b, const QColor& def ) - { - int ir( 0 ), ig( 0 ), ib( 0 ); - GetColor( theSect, theName, ir, ig, ib, def ); - r = ir / 255.; - g = ig / 255.; - b = ib / 255.; - } -} diff --git a/src/OBJECT/SMESH_ActorUtils.h b/src/OBJECT/SMESH_ActorUtils.h deleted file mode 100644 index f28e8d6c9..000000000 --- a/src/OBJECT/SMESH_ActorUtils.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SMESH_ACTORUTILS_H -#define SMESH_ACTORUTILS_H - -#include -#include - -class vtkUnstructuredGrid; - -namespace SMESH{ - - float GetFloat( const QString& theValue, float theDefault = 0 ); - float GetFloat( const QString& theName, const QString& theSection, float theDefault = 0 ); - - QColor GetColor( const QString& theSect, const QString& theName, const QColor&t = QColor() ); - void GetColor( const QString& theSect, const QString& theName, int&, int&, int&, const QColor&t = QColor() ); - void GetColor( const QString& theSect, const QString& theName, float&, float&, float&, const QColor&t = QColor() ); - - void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName); - -} - -#endif diff --git a/src/OBJECT/SMESH_DeviceActor.cxx b/src/OBJECT/SMESH_DeviceActor.cxx deleted file mode 100644 index 3548aaefe..000000000 --- a/src/OBJECT/SMESH_DeviceActor.cxx +++ /dev/null @@ -1,676 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_DeviceActor.cxx -// Author : -// Module : SMESH -// $Header$ - - -#include "SMESH_DeviceActor.h" -#include "SMESH_ExtractGeometry.h" -#include "SMESH_ControlsDef.hxx" -#include "SMESH_ActorUtils.h" - -#include -#include -#include -#include - -// VTK Includes -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "utilities.h" - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -using namespace std; - - -vtkStandardNewMacro(SMESH_DeviceActor); - - -SMESH_DeviceActor::SMESH_DeviceActor() -{ - if(MYDEBUG) MESSAGE("SMESH_DeviceActor - "<UseLookupTableScalarRangeOn(); - myMapper->SetColorModeToMapScalars(); - - myShrinkFilter = vtkShrinkFilter::New(); - - myStoreClippingMapping = false; - - myExtractGeometry = SMESH_ExtractGeometry::New(); - myExtractGeometry->SetReleaseDataFlag(true); - myIsImplicitFunctionUsed = false; - - myExtractUnstructuredGrid = VTKViewer_ExtractUnstructuredGrid::New(); - - myMergeFilter = vtkMergeFilter::New(); - - myGeomFilter = VTKViewer_GeometryFilter::New(); - - myTransformFilter = VTKViewer_TransformFilter::New(); - - for(int i = 0; i < 6; i++) - myPassFilter.push_back(VTKViewer_PassThroughFilter::New()); -} - - -SMESH_DeviceActor::~SMESH_DeviceActor(){ - if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<Delete(); - - myMapper->Delete(); - - myShrinkFilter->Delete(); - - myExtractUnstructuredGrid->Delete(); - - myMergeFilter->Delete(); - - myGeomFilter->Delete(); - - myExtractGeometry->Delete(); - - myTransformFilter->Delete(); - - for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){ - myPassFilter[i]->Delete(); - } -} - - -void -SMESH_DeviceActor:: -SetStoreGemetryMapping(bool theStoreMapping) -{ - myGeomFilter->SetStoreMapping(theStoreMapping); - SetStoreClippingMapping(theStoreMapping); -} - - -void -SMESH_DeviceActor:: -SetStoreClippingMapping(bool theStoreMapping) -{ - myStoreClippingMapping = theStoreMapping; - myExtractGeometry->SetStoreMapping(theStoreMapping && myIsImplicitFunctionUsed); - SetStoreIDMapping(theStoreMapping); -} - - -void -SMESH_DeviceActor:: -SetStoreIDMapping(bool theStoreMapping) -{ - myExtractUnstructuredGrid->SetStoreMapping(theStoreMapping); -} - - -void SMESH_DeviceActor::Init(TVisualObjPtr theVisualObj, - vtkImplicitBoolean* theImplicitBoolean) -{ - myVisualObj = theVisualObj; - myExtractGeometry->SetImplicitFunction(theImplicitBoolean); - SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); -} - - -void -SMESH_DeviceActor:: -SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed) -{ - int anId = 0; - if(theIsImplicitFunctionUsed) - myPassFilter[ anId ]->SetInput( myExtractGeometry->GetOutput() ); - else - myPassFilter[ anId ]->SetInput( myMergeFilter->GetOutput() ); - - myIsImplicitFunctionUsed = theIsImplicitFunctionUsed; - SetStoreClippingMapping(myStoreClippingMapping); -} - - -void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){ - if(theGrid){ - //myIsShrinkable = theGrid->GetNumberOfCells() > 10; - myIsShrinkable = true; - - myExtractUnstructuredGrid->SetInput(theGrid); - - myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput()); - - myExtractGeometry->SetInput(myMergeFilter->GetOutput()); - - int anId = 0; - SetImplicitFunctionUsed(myIsImplicitFunctionUsed); - myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 1 - myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 2 - myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 3 - myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - - anId++; // 4 - myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); - myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() ); - myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() ); - - anId++; // 5 - myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() ); - - vtkLODActor::SetMapper( myMapper ); - Modified(); - } -} - - -VTKViewer_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){ - return myExtractUnstructuredGrid; -} - - -vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){ - myExtractUnstructuredGrid->Update(); - return myExtractUnstructuredGrid->GetOutput(); -} - - -void SMESH_DeviceActor::SetControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable) -{ - bool anIsInitialized = theFunctor; - if(anIsInitialized){ - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - - SetStoreIDMapping(true); - myExtractUnstructuredGrid->Update(); - vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput(); - - aDataSet->ShallowCopy(aGrid); - - vtkDoubleArray *aScalars = vtkDoubleArray::New(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); - aScalars->SetNumberOfComponents(1); - aScalars->SetNumberOfTuples(aNbCells); - - myVisualObj->UpdateFunctor(theFunctor); - - using namespace SMESH::Controls; - if(NumericalFunctor* aNumericalFunctor = dynamic_cast(theFunctor.get())){ - for(vtkIdType i = 0; i < aNbCells; i++){ - vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i); - vtkIdType anObjId = myVisualObj->GetElemObjId(anId); - double aValue = aNumericalFunctor->GetValue(anObjId); - aScalars->SetValue(i,aValue); - } - }else if(Predicate* aPredicate = dynamic_cast(theFunctor.get())){ - for(vtkIdType i = 0; i < aNbCells; i++){ - vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i); - vtkIdType anObjId = myVisualObj->GetElemObjId(anId); - bool aValue = aPredicate->IsSatisfy(anObjId); - aScalars->SetValue(i,aValue); - } - } - - aDataSet->GetCellData()->SetScalars(aScalars); - aScalars->Delete(); - - theLookupTable->SetRange(aScalars->GetRange()); - theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); - aDataSet->Delete(); - } - GetMapper()->SetScalarVisibility(anIsInitialized); - theScalarBarActor->SetVisibility(anIsInitialized); -} - -void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable) -{ - bool anIsInitialized = theFunctor; - myExtractUnstructuredGrid->ClearRegisteredCells(); - myExtractUnstructuredGrid->ClearRegisteredCellsWithType(); - myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); - myVisualObj->UpdateFunctor(theFunctor); - - using namespace SMESH::Controls; - if (anIsInitialized){ - if (Length2D* aLength2D = dynamic_cast(theFunctor.get())){ - SMESH::Controls::Length2D::TValues aValues; - - aLength2D->GetValues(aValues); - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - - aDataSet->SetPoints(aGrid->GetPoints()); - - vtkIdType aNbCells = aValues.size(); - - vtkDoubleArray *aScalars = vtkDoubleArray::New(); - aScalars->SetNumberOfComponents(1); - aScalars->SetNumberOfTuples(aNbCells); - - vtkIdType aCellsSize = 3*aNbCells; - vtkCellArray* aConnectivity = vtkCellArray::New(); - aConnectivity->Allocate( aCellsSize, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds(2); - - Length2D::TValues::const_iterator anIter = aValues.begin(); - for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){ - const Length2D::Value& aValue = *anIter; - int aNode[2] = { - myVisualObj->GetNodeVTKId(aValue.myPntId[0]), - myVisualObj->GetNodeVTKId(aValue.myPntId[1]) - }; - if(aNode[0] >= 0 && aNode[1] >= 0){ - anIdList->SetId( 0, aNode[0] ); - anIdList->SetId( 1, aNode[1] ); - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_LINE ); - aScalars->SetValue(aVtkId,aValue.myLength); - } - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( aNbCells ); - - aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - - aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); - SetUnstructuredGrid(aDataSet); - - aDataSet->GetCellData()->SetScalars(aScalars); - aScalars->Delete(); - - theLookupTable->SetRange(aScalars->GetRange()); - theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); - aDataSet->Delete(); - } - else if (MultiConnection2D* aMultiConnection2D = dynamic_cast(theFunctor.get())){ - SMESH::Controls::MultiConnection2D::MValues aValues; - - aMultiConnection2D->GetValues(aValues); - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - aDataSet->SetPoints(aGrid->GetPoints()); - - vtkIdType aNbCells = aValues.size(); - vtkDoubleArray *aScalars = vtkDoubleArray::New(); - aScalars->SetNumberOfComponents(1); - aScalars->SetNumberOfTuples(aNbCells); - - vtkIdType aCellsSize = 3*aNbCells; - vtkCellArray* aConnectivity = vtkCellArray::New(); - aConnectivity->Allocate( aCellsSize, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds(2); - - MultiConnection2D::MValues::const_iterator anIter = aValues.begin(); - for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){ - const MultiConnection2D::Value& aValue = (*anIter).first; - int aNode[2] = { - myVisualObj->GetNodeVTKId(aValue.myPntId[0]), - myVisualObj->GetNodeVTKId(aValue.myPntId[1]) - }; - if(aNode[0] >= 0 && aNode[1] >= 0){ - anIdList->SetId( 0, aNode[0] ); - anIdList->SetId( 1, aNode[1] ); - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_LINE ); - aScalars->SetValue(aVtkId,(*anIter).second); - } - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( aNbCells ); - - aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - - aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); - SetUnstructuredGrid(aDataSet); - - aDataSet->GetCellData()->SetScalars(aScalars); - aScalars->Delete(); - - theLookupTable->SetRange(aScalars->GetRange()); - theLookupTable->Build(); - - myMergeFilter->SetScalars(aDataSet); - aDataSet->Delete(); - } - } - GetMapper()->SetScalarVisibility(anIsInitialized); - theScalarBarActor->SetVisibility(anIsInitialized); -} - -void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor) -{ - myExtractUnstructuredGrid->ClearRegisteredCells(); - myExtractUnstructuredGrid->ClearRegisteredCellsWithType(); - myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll); - myVisualObj->UpdateFunctor(theFunctor); - - using namespace SMESH::Controls; - if(FreeBorders* aFreeBorders = dynamic_cast(theFunctor.get())){ - myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - vtkIdType aNbCells = aGrid->GetNumberOfCells(); - for( vtkIdType i = 0; i < aNbCells; i++ ){ - vtkIdType anObjId = myVisualObj->GetElemObjId(i); - if(aFreeBorders->IsSatisfy(anObjId)) - myExtractUnstructuredGrid->RegisterCell(i); - } - if(!myExtractUnstructuredGrid->IsCellsRegistered()) - myExtractUnstructuredGrid->RegisterCell(-1); - SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); - }else if(FreeEdges* aFreeEdges = dynamic_cast(theFunctor.get())){ - SMESH::Controls::FreeEdges::TBorders aBorders; - aFreeEdges->GetBoreders(aBorders); - vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); - aDataSet->SetPoints(aGrid->GetPoints()); - - vtkIdType aNbCells = aBorders.size(); - vtkIdType aCellsSize = 3*aNbCells; - vtkCellArray* aConnectivity = vtkCellArray::New(); - aConnectivity->Allocate( aCellsSize, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() ); - - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds(2); - - FreeEdges::TBorders::const_iterator anIter = aBorders.begin(); - for(; anIter != aBorders.end(); anIter++){ - const FreeEdges::Border& aBorder = *anIter; - int aNode[2] = { - myVisualObj->GetNodeVTKId(aBorder.myPntId[0]), - myVisualObj->GetNodeVTKId(aBorder.myPntId[1]) - }; - //cout<<"aNode = "<= 0 && aNode[1] >= 0){ - anIdList->SetId( 0, aNode[0] ); - anIdList->SetId( 1, aNode[1] ); - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_LINE ); - } - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( aNbCells ); - - aConnectivity->InitTraversal(); - for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); - - aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); - - SetUnstructuredGrid(aDataSet); - aDataSet->Delete(); - } -} - - - - -unsigned long int SMESH_DeviceActor::GetMTime(){ - unsigned long mTime = this->Superclass::GetMTime(); - mTime = max(mTime,myExtractGeometry->GetMTime()); - mTime = max(mTime,myExtractUnstructuredGrid->GetMTime()); - mTime = max(mTime,myMergeFilter->GetMTime()); - mTime = max(mTime,myGeomFilter->GetMTime()); - mTime = max(mTime,myTransformFilter->GetMTime()); - return mTime; -} - - -void SMESH_DeviceActor::SetTransform(VTKViewer_Transform* theTransform){ - myTransformFilter->SetTransform(theTransform); -} - - -void SMESH_DeviceActor::SetShrink() { - if ( !myIsShrinkable ) return; - if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) - { - myShrinkFilter->SetInput( aDataSet ); - myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() ); - myIsShrunk = true; - } -} - -void SMESH_DeviceActor::UnShrink() { - if ( !myIsShrunk ) return; - if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() ) - { - myPassFilter[ 1 ]->SetInput( aDataSet ); - myPassFilter[ 1 ]->Modified(); - myIsShrunk = false; - Modified(); - } -} - - -void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){ - switch(theMode){ - case ePoint: - myGeomFilter->SetInside(true); - GetProperty()->SetRepresentation(0); - break; - case eInsideframe: - myGeomFilter->SetInside(true); - GetProperty()->SetRepresentation(1); - break; - default : - myGeomFilter->SetInside(false); - GetProperty()->SetRepresentation(theMode); - } - myRepresentation = theMode; - GetProperty()->Modified(); - myMapper->Modified(); - Modified(); -} - - -void SMESH_DeviceActor::SetVisibility(int theMode){ - if(!myExtractUnstructuredGrid->GetInput() || - GetUnstructuredGrid()->GetNumberOfCells()) - { - vtkLODActor::SetVisibility(theMode); - }else{ - vtkLODActor::SetVisibility(false); - } -} - - -int SMESH_DeviceActor::GetVisibility(){ - if(!GetUnstructuredGrid()->GetNumberOfCells()){ - vtkLODActor::SetVisibility(false); - } - return vtkLODActor::GetVisibility(); -} - - -int SMESH_DeviceActor::GetNodeObjId(int theVtkID){ - vtkIdType anID = theVtkID; - - if(IsImplicitFunctionUsed()) - anID = myExtractGeometry->GetNodeObjId(theVtkID); - - vtkIdType aRetID = myVisualObj->GetNodeObjId(anID); - if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "< -#include - -class vtkCell; -class vtkProperty; -class vtkMergeFilter; -class vtkShrinkFilter; -class vtkPolyDataMapper; -class vtkUnstructuredGrid; -class vtkScalarBarActor; -class vtkLookupTable; -class vtkImplicitBoolean; - -class VTKViewer_Transform; -class VTKViewer_TransformFilter; -class VTKViewer_PassThroughFilter; -class VTKViewer_ExtractUnstructuredGrid; - -class SMESH_ExtractGeometry; - - -class SMESH_DeviceActor: public vtkLODActor{ - friend class SMESH_ActorDef; - - public: - vtkTypeMacro(SMESH_DeviceActor,vtkLODActor); - static SMESH_DeviceActor* New(); - - void SetStoreClippingMapping(bool theStoreMapping); - void SetStoreGemetryMapping(bool theStoreMapping); - void SetStoreIDMapping(bool theStoreMapping); - - virtual int GetNodeObjId(int theVtkID); - virtual float* GetNodeCoord(int theObjID); - - virtual int GetElemObjId(int theVtkID); - virtual vtkCell* GetElemCell(int theObjID); - - virtual void SetTransform(VTKViewer_Transform* theTransform); - virtual unsigned long int GetMTime(); - - float GetShrinkFactor(); - void SetShrinkFactor(float value); - - bool IsShrunkable() { return myIsShrinkable;} - bool IsShrunk() { return myIsShrunk;} - void SetShrink(); - void UnShrink(); - - enum EReperesent { ePoint, eWireframe, eSurface, eInsideframe}; - EReperesent GetRepresentation(){ return myRepresentation;} - void SetRepresentation(EReperesent theMode); - - virtual void SetVisibility(int theMode); - virtual int GetVisibility(); - - VTKViewer_ExtractUnstructuredGrid* GetExtractUnstructuredGrid(); - vtkUnstructuredGrid* GetUnstructuredGrid(); - - void SetControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable); - void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable); - void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor); - - bool IsHighlited() { return myIsHighlited;} - void SetHighlited(bool theIsHighlited); - - virtual void Render(vtkRenderer *, vtkMapper *); - - void SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed); - bool IsImplicitFunctionUsed() const{ return myIsImplicitFunctionUsed;} - - protected: - void Init(TVisualObjPtr theVisualObj, vtkImplicitBoolean* theImplicitBoolean); - void SetUnstructuredGrid(vtkUnstructuredGrid* theGrid); - - vtkPolyDataMapper *myMapper; - TVisualObjPtr myVisualObj; - - vtkProperty *myProperty; - EReperesent myRepresentation; - - SMESH_ExtractGeometry* myExtractGeometry; - bool myIsImplicitFunctionUsed; - - vtkMergeFilter* myMergeFilter; - VTKViewer_ExtractUnstructuredGrid* myExtractUnstructuredGrid; - - bool myStoreClippingMapping; - VTKViewer_GeometryFilter *myGeomFilter; - VTKViewer_TransformFilter *myTransformFilter; - std::vector myPassFilter; - - vtkShrinkFilter* myShrinkFilter; - bool myIsShrinkable; - bool myIsShrunk; - - bool myIsHighlited; - - float myPolygonOffsetFactor; - float myPolygonOffsetUnits; - - void SetPolygonOffsetParameters(float factor, float units); - void GetPolygonOffsetParameters(float& factor, float& units){ - factor = myPolygonOffsetFactor; - units = myPolygonOffsetUnits; - } - - SMESH_DeviceActor(); - ~SMESH_DeviceActor(); - SMESH_DeviceActor(const SMESH_DeviceActor&); - void operator=(const SMESH_DeviceActor&); - -}; - - -#endif //SMESH_DEVICE_ACTOR_H diff --git a/src/OBJECT/SMESH_ExtractGeometry.cxx b/src/OBJECT/SMESH_ExtractGeometry.cxx deleted file mode 100644 index 84812a142..000000000 --- a/src/OBJECT/SMESH_ExtractGeometry.cxx +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - - -#include "SMESH_ExtractGeometry.h" - -#include "vtkCell.h" -#include "vtkCellData.h" -#include "vtkFloatArray.h" -#include "vtkIdList.h" -#include "vtkImplicitFunction.h" -#include "vtkObjectFactory.h" -#include "vtkPointData.h" -#include "vtkUnstructuredGrid.h" - -using namespace std; - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -#if defined __GNUC__ - #if __GNUC__ == 2 - #define __GNUC_2__ - #endif -#endif - - -vtkStandardNewMacro(SMESH_ExtractGeometry); - - -SMESH_ExtractGeometry::SMESH_ExtractGeometry() -{} - - -SMESH_ExtractGeometry::~SMESH_ExtractGeometry(){} - - -vtkIdType SMESH_ExtractGeometry::GetElemObjId(int theVtkID){ - if(myElemVTK2ObjIds.empty() || theVtkID > myElemVTK2ObjIds.size()) return -1; -#if defined __GNUC_2__ - return myElemVTK2ObjIds[theVtkID]; -#else - return myElemVTK2ObjIds.at(theVtkID); -#endif -} - - -vtkIdType SMESH_ExtractGeometry::GetNodeObjId(int theVtkID){ - if(myNodeVTK2ObjIds.empty() || theVtkID > myNodeVTK2ObjIds.size()) return -1; -#if defined __GNUC_2__ - return myNodeVTK2ObjIds[theVtkID]; -#else - return myNodeVTK2ObjIds.at(theVtkID); -#endif -} - - -void SMESH_ExtractGeometry::Execute() -{ - vtkIdType ptId, numPts, numCells, i, cellId, newCellId, newId, *pointMap; - vtkIdList *cellPts; - vtkCell *cell; - int numCellPts; - float *x; - float multiplier; - vtkPoints *newPts; - vtkIdList *newCellPts; - vtkDataSet *input = this->GetInput(); - vtkPointData *pd = input->GetPointData(); - vtkCellData *cd = input->GetCellData(); - vtkUnstructuredGrid *output = this->GetOutput(); - vtkPointData *outputPD = output->GetPointData(); - vtkCellData *outputCD = output->GetCellData(); - int npts; - numCells = input->GetNumberOfCells(); - numPts = input->GetNumberOfPoints(); - - vtkDebugMacro(<< "Extracting geometry"); - - if ( ! this->ImplicitFunction ) - { - vtkErrorMacro(<<"No implicit function specified"); - return; - } - - newCellPts = vtkIdList::New(); - newCellPts->Allocate(VTK_CELL_SIZE); - - if ( this->ExtractInside ) - { - multiplier = 1.0; - } - else - { - multiplier = -1.0; - } - - // Loop over all points determining whether they are inside the - // implicit function. Copy the points and point data if they are. - // - pointMap = new vtkIdType[numPts]; // maps old point ids into new - for (i=0; i < numPts; i++) - { - pointMap[i] = -1; - } - - output->Allocate(numCells/4); //allocate storage for geometry/topology - newPts = vtkPoints::New(); - newPts->Allocate(numPts/4,numPts); - outputPD->CopyAllocate(pd); - outputCD->CopyAllocate(cd); - vtkFloatArray *newScalars = NULL; - - if(myStoreMapping){ - myElemVTK2ObjIds.clear(); - myElemVTK2ObjIds.reserve(numCells); - myNodeVTK2ObjIds.clear(); - myNodeVTK2ObjIds.reserve(numPts); - } - - if ( ! this->ExtractBoundaryCells ) - { - for ( ptId=0; ptId < numPts; ptId++ ) - { - x = input->GetPoint(ptId); - if ( (this->ImplicitFunction->FunctionValue(x)*multiplier) < 0.0 ) - { - newId = newPts->InsertNextPoint(x); - pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); - outputPD->CopyData(pd,ptId,newId); - } - } - } - else - { - // To extract boundary cells, we have to create supplemental information - if ( this->ExtractBoundaryCells ) - { - float val; - newScalars = vtkFloatArray::New(); - newScalars->SetNumberOfValues(numPts); - - for (ptId=0; ptId < numPts; ptId++ ) - { - x = input->GetPoint(ptId); - val = this->ImplicitFunction->FunctionValue(x) * multiplier; - newScalars->SetValue(ptId, val); - if ( val < 0.0 ) - { - newId = newPts->InsertNextPoint(x); - pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); - outputPD->CopyData(pd,ptId,newId); - } - } - } - } - - // Now loop over all cells to see whether they are inside implicit - // function (or on boundary if ExtractBoundaryCells is on). - // - for (cellId=0; cellId < numCells; cellId++) - { - cell = input->GetCell(cellId); - cellPts = cell->GetPointIds(); - numCellPts = cell->GetNumberOfPoints(); - - newCellPts->Reset(); - if ( ! this->ExtractBoundaryCells ) //requires less work - { - for ( npts=0, i=0; i < numCellPts; i++, npts++) - { - ptId = cellPts->GetId(i); - if ( pointMap[ptId] < 0 ) - { - break; //this cell won't be inserted - } - else - { - newCellPts->InsertId(i,pointMap[ptId]); - } - } - } //if don't want to extract boundary cells - - else //want boundary cells - { - for ( npts=0, i=0; i < numCellPts; i++ ) - { - ptId = cellPts->GetId(i); - if ( newScalars->GetValue(ptId) <= 0.0 ) - { - npts++; - } - } - if ( npts > 0 ) - { - for ( i=0; i < numCellPts; i++ ) - { - ptId = cellPts->GetId(i); - if ( pointMap[ptId] < 0 ) - { - x = input->GetPoint(ptId); - newId = newPts->InsertNextPoint(x); - pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); - outputPD->CopyData(pd,ptId,newId); - } - newCellPts->InsertId(i,pointMap[ptId]); - } - }//a boundary or interior cell - }//if mapping boundary cells - - if ( npts >= numCellPts || (this->ExtractBoundaryCells && npts > 0) ) - { - newCellId = output->InsertNextCell(cell->GetCellType(),newCellPts); - myElemVTK2ObjIds.push_back(cellId); - outputCD->CopyData(cd,cellId,newCellId); - } - }//for all cells - - // Update ourselves and release memory - // - delete [] pointMap; - newCellPts->Delete(); - output->SetPoints(newPts); - newPts->Delete(); - - if ( this->ExtractBoundaryCells ) - { - newScalars->Delete(); - } - - output->Squeeze(); -} diff --git a/src/OBJECT/SMESH_ExtractGeometry.h b/src/OBJECT/SMESH_ExtractGeometry.h deleted file mode 100644 index 794229516..000000000 --- a/src/OBJECT/SMESH_ExtractGeometry.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SALOME_ExtractGeometry_HeaderFile -#define SALOME_ExtractGeometry_HeaderFile - -#include -#include - - -class SMESH_ExtractGeometry : public vtkExtractGeometry{ -public: - vtkTypeMacro(SMESH_ExtractGeometry,vtkExtractGeometry); - - static SMESH_ExtractGeometry *New(); - - void SetStoreMapping(bool theStoreMapping){ - myStoreMapping = theStoreMapping; - Modified(); - } - bool GetStoreMapping(){ return myStoreMapping;} - - virtual vtkIdType GetNodeObjId(int theVtkID); - virtual vtkIdType GetElemObjId(int theVtkID); - -protected: - SMESH_ExtractGeometry(); - ~SMESH_ExtractGeometry(); - - void Execute(); - -private: - bool myStoreMapping; - typedef std::vector TVectorId; - TVectorId myElemVTK2ObjIds; - TVectorId myNodeVTK2ObjIds; - - SMESH_ExtractGeometry(const SMESH_ExtractGeometry&); // Not implemented. - void operator=(const SMESH_ExtractGeometry&); // Not implemented. -}; - - -#endif - - diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx deleted file mode 100644 index 885ee3de3..000000000 --- a/src/OBJECT/SMESH_Object.cxx +++ /dev/null @@ -1,1270 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Grid.cxx -// Author : Nicolas REJNERI -// Module : SMESH - -#include "SMESH_ObjectDef.h" -#include "SMESH_ActorUtils.h" - -#include "SMDS_Mesh.hxx" -#include "SMESH_Actor.h" -#include "SMESH_ControlsDef.hxx" -#include - -#include CORBA_SERVER_HEADER(SALOME_Exception) - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include "utilities.h" - -using namespace std; - -#ifndef EXCEPTION -#define EXCEPTION(TYPE, MSG) {\ - std::ostringstream aStream;\ - aStream<<__FILE__<<"["<<__LINE__<<"]::"<FindNode(theId)) return anElem; - EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<FindElement(theId)) return anElem; - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot find a SMDS_MeshElement for ID = "<AddNodeWithID(aCoords[aCoordId], - aCoords[aCoordId+1], - aCoords[aCoordId+2], - anIndexes[anElemId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddNodeWithID for ID = "<AddEdgeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<AddFaceWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<AddFaceWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "< nodes_ids (aNbNodes); - for (int i = 0; i < aNbNodes; i++) { - nodes_ids[i] = anIndexes[anIndexId++]; - } - - SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId); - if (!anElem) - EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = " - << anElemId); - } - } - - - inline void AddTetrasWithID(SMDS_Mesh* theMesh, - SMESH::log_array_var& theSeq, - CORBA::Long theId) - { - const SMESH::long_array& anIndexes = theSeq[theId].indexes; - CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number; - if(5*aNbElems != anIndexes.length()) - EXCEPTION(runtime_error,"AddEdgeWithID - 5*aNbElems != anIndexes.length()"); - for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){ - SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId+5], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId+5], - anIndexes[anIndexId+6], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<AddVolumeWithID(anIndexes[anIndexId+1], - anIndexes[anIndexId+2], - anIndexes[anIndexId+3], - anIndexes[anIndexId+4], - anIndexes[anIndexId+5], - anIndexes[anIndexId+6], - anIndexes[anIndexId+7], - anIndexes[anIndexId+8], - anIndexes[anIndexId]); - if(!anElem) - EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "< nodes_ids (aNbNodes); - for (int i = 0; i < aNbNodes; i++) { - nodes_ids[i] = anIndexes[anIndexId++]; - } - - int aNbFaces = anIndexes[anIndexId++]; - std::vector quantities (aNbFaces); - for (int i = 0; i < aNbFaces; i++) { - quantities[i] = anIndexes[anIndexId++]; - } - - SMDS_MeshElement* anElem = - theMesh->AddPolyhedralVolumeWithID(nodes_ids, quantities, aFaceId); - if (!anElem) - EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolyhedralVolumeWithID for ID = " - << anElemId); - } - } - - - inline void ChangePolyhedronNodes (SMDS_Mesh* theMesh, - SMESH::log_array_var& theSeq, - CORBA::Long theId) - { - const SMESH::long_array& anIndexes = theSeq[theId].indexes; - CORBA::Long iind = 0, aNbElems = theSeq[theId].number; - - for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) - { - // find element - const SMDS_MeshElement* elem = FindElement(theMesh, anIndexes[iind++]); - // nb nodes - int nbNodes = anIndexes[iind++]; - // nodes - std::vector aNodes (nbNodes); - for (int iNode = 0; iNode < nbNodes; iNode++) { - aNodes[iNode] = FindNode(theMesh, anIndexes[iind++]); - } - // nb faces - int nbFaces = anIndexes[iind++]; - // quantities - std::vector quantities (nbFaces); - for (int iFace = 0; iFace < nbFaces; iFace++) { - quantities[iFace] = anIndexes[iind++]; - } - // change - theMesh->ChangePolyhedronNodes(elem, aNodes, quantities); - } - } - - -} -/* - Class : SMESH_VisualObjDef - Description : Base class for all mesh objects to be visuilised -*/ - -//================================================================================= -// function : getCellType -// purpose : Get type of VTK cell -//================================================================================= -static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, - const bool thePoly, - const int theNbNodes ) -{ - switch( theType ) - { - case SMDSAbs_Edge: - return theNbNodes == 2 ? VTK_LINE : VTK_EMPTY_CELL; - - case SMDSAbs_Face : - if (thePoly && theNbNodes>2 ) return VTK_POLYGON; - else if ( theNbNodes == 3 ) return VTK_TRIANGLE; - else if ( theNbNodes == 4 ) return VTK_QUAD; - else return VTK_EMPTY_CELL; - - case SMDSAbs_Volume: - if (thePoly && theNbNodes>3 ) return VTK_CONVEX_POINT_SET; - else if ( theNbNodes == 4 ) return VTK_TETRA; - else if ( theNbNodes == 5 ) return VTK_PYRAMID; - else if ( theNbNodes == 6 ) return VTK_WEDGE; - else if ( theNbNodes == 8 ) return VTK_HEXAHEDRON; - else return VTK_EMPTY_CELL; - - default: return VTK_EMPTY_CELL; - } -} - -//================================================================================= -// functions : SMESH_VisualObjDef -// purpose : Constructor -//================================================================================= -SMESH_VisualObjDef::SMESH_VisualObjDef() -{ - myGrid = vtkUnstructuredGrid::New(); -} -SMESH_VisualObjDef::~SMESH_VisualObjDef() -{ - if ( MYDEBUG ) - MESSAGE( "~SMESH_MeshObj - myGrid->GetReferenceCount() = " << myGrid->GetReferenceCount() ); - myGrid->Delete(); -} - -//================================================================================= -// functions : GetNodeObjId, GetNodeVTKId, GetElemObjId, GetElemVTKId -// purpose : Methods for retrieving VTK IDs by SMDS IDs and vice versa -//================================================================================= -vtkIdType SMESH_VisualObjDef::GetNodeObjId( int theVTKID ) -{ - return myVTK2SMDSNodes.find(theVTKID) == myVTK2SMDSNodes.end() ? -1 : myVTK2SMDSNodes[theVTKID]; -} - -vtkIdType SMESH_VisualObjDef::GetNodeVTKId( int theObjID ) -{ - return mySMDS2VTKNodes.find(theObjID) == mySMDS2VTKNodes.end() ? -1 : mySMDS2VTKNodes[theObjID]; -} - -vtkIdType SMESH_VisualObjDef::GetElemObjId( int theVTKID ) -{ - return myVTK2SMDSElems.find(theVTKID) == myVTK2SMDSElems.end() ? -1 : myVTK2SMDSElems[theVTKID]; -} - -vtkIdType SMESH_VisualObjDef::GetElemVTKId( int theObjID ) -{ - return mySMDS2VTKElems.find(theObjID) == mySMDS2VTKElems.end() ? -1 : mySMDS2VTKElems[theObjID]; -} - -//================================================================================= -// function : SMESH_VisualObjDef::createPoints -// purpose : Create points from nodes -//================================================================================= -void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints ) -{ - if ( thePoints == 0 ) - return; - - TEntityList aNodes; - vtkIdType nbNodes = GetEntities( SMDSAbs_Node, aNodes ); - thePoints->SetNumberOfPoints( nbNodes ); - - int nbPoints = 0; - - TEntityList::const_iterator anIter; - for ( anIter = aNodes.begin(); anIter != aNodes.end(); ++anIter ) - { - const SMDS_MeshNode* aNode = ( const SMDS_MeshNode* )(*anIter); - if ( aNode != 0 ) - { - thePoints->SetPoint( nbPoints, aNode->X(), aNode->Y(), aNode->Z() ); - int anId = aNode->GetID(); - mySMDS2VTKNodes.insert( TMapOfIds::value_type( anId, nbPoints ) ); - myVTK2SMDSNodes.insert( TMapOfIds::value_type( nbPoints, anId ) ); - nbPoints++; - } - } - - if ( nbPoints != nbNodes ) - thePoints->SetNumberOfPoints( nbPoints ); -} - -//================================================================================= -// function : buildPrs -// purpose : create VTK cells( fill unstructured grid ) -//================================================================================= -void SMESH_VisualObjDef::buildPrs() -{ - try - { - mySMDS2VTKNodes.clear(); - myVTK2SMDSNodes.clear(); - mySMDS2VTKElems.clear(); - myVTK2SMDSElems.clear(); - - if ( IsNodePrs() ) - buildNodePrs(); - else - buildElemPrs(); - } - catch( const std::exception& exc ) - { - INFOS("Follow exception was cought:\n\t"<GetNumberOfCells() = "<GetNumberOfCells() ); - if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" ); -} - -//================================================================================= -// function : buildNodePrs -// purpose : create VTK cells for nodes -//================================================================================= -void SMESH_VisualObjDef::buildNodePrs() -{ - vtkPoints* aPoints = vtkPoints::New(); - createPoints( aPoints ); - myGrid->SetPoints( aPoints ); - aPoints->Delete(); - - myGrid->SetCells( 0, 0, 0 ); - - // Create cells - /* - int nbPoints = aPoints->GetNumberOfPoints(); - vtkIdList *anIdList = vtkIdList::New(); - anIdList->SetNumberOfIds( 1 ); - - vtkCellArray *aCells = vtkCellArray::New(); - aCells->Allocate( 2 * nbPoints, 0 ); - - vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New(); - aCellTypesArray->SetNumberOfComponents( 1 ); - aCellTypesArray->Allocate( nbPoints ); - - for( vtkIdType aCellId = 0; aCellId < nbPoints; aCellId++ ) - { - anIdList->SetId( 0, aCellId ); - aCells->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_VERTEX ); - } - - vtkIntArray* aCellLocationsArray = vtkIntArray::New(); - aCellLocationsArray->SetNumberOfComponents( 1 ); - aCellLocationsArray->SetNumberOfTuples( nbPoints ); - - aCells->InitTraversal(); - for( vtkIdType i = 0, *pts, npts; aCells->GetNextCell( npts, pts ); i++ ) - aCellLocationsArray->SetValue( i, aCells->GetTraversalLocation( npts ) ); - - myGrid->SetCells( aCellTypesArray, aCellLocationsArray, aCells ); - - aCellLocationsArray->Delete(); - aCellTypesArray->Delete(); - aCells->Delete(); - anIdList->Delete(); - */ -} - -//================================================================================= -// function : buildElemPrs -// purpose : Create VTK cells for elements -//================================================================================= - -namespace{ - typedef std::vector TConnect; - - int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter, - TConnect& theConnect) - { - theConnect.clear(); - for(; theNodesIter->more();) - theConnect.push_back(theNodesIter->next()); - return theConnect.size(); - } - - inline - void SetId(vtkIdList *theIdList, - const SMESH_VisualObjDef::TMapOfIds& theSMDS2VTKNodes, - const TConnect& theConnect, - int thePosition, - int theId) - { - theIdList->SetId(thePosition,theSMDS2VTKNodes.find(theConnect[theId]->GetID())->second); - } - -} - - -void SMESH_VisualObjDef::buildElemPrs() -{ - // Create points - - vtkPoints* aPoints = vtkPoints::New(); - createPoints( aPoints ); - myGrid->SetPoints( aPoints ); - aPoints->Delete(); - - if ( MYDEBUG ) - MESSAGE("Update - myGrid->GetNumberOfPoints() = "<GetNumberOfPoints()); - - // Calculate cells size - - static SMDSAbs_ElementType aTypes[ 3 ] = { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume }; - - // get entity data - map nbEnts; - map anEnts; - - for ( int i = 0; i <= 2; i++ ) - nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] ); - - vtkIdType aCellsSize = 3 * nbEnts[ SMDSAbs_Edge ]; - - for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes - { - if ( nbEnts[ aTypes[ i ] ] ) - { - const TEntityList& aList = anEnts[ aTypes[ i ] ]; - TEntityList::const_iterator anIter; - for ( anIter = aList.begin(); anIter != aList.end(); ++anIter ) - aCellsSize += (*anIter)->NbNodes() + 1; - } - } - - vtkIdType aNbCells = nbEnts[ SMDSAbs_Edge ] + nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ]; - - if ( MYDEBUG ) - MESSAGE( "Update - aNbCells = "<_is_nil() = "<_is_nil()); - - myMeshServer = SMESH::SMESH_Mesh::_duplicate( theMesh ); - myMeshServer->Register(); - myMesh = new SMDS_Mesh(); -} - -//================================================================================= -// function : ~SMESH_MeshObj -// purpose : Destructor -//================================================================================= -SMESH_MeshObj::~SMESH_MeshObj() -{ - myMeshServer->Destroy(); - delete myMesh; -} - -//================================================================================= -// function : Update -// purpose : Update mesh and fill grid with new values if necessary -//================================================================================= -void SMESH_MeshObj::Update( int theIsClear ) -{ - // Update SMDS_Mesh on client part - - try - { - SMESH::log_array_var aSeq = myMeshServer->GetLog( theIsClear ); - CORBA::Long aLength = aSeq->length(); - - if( MYDEBUG ) MESSAGE( "Update: length of the script is "<RemoveNode( FindNode( myMesh, anIndexes[anElemId] ) ); - break; - - case SMESH::REMOVE_ELEMENT: - for( ; anElemId < aNbElems; anElemId++ ) - myMesh->RemoveElement( FindElement( myMesh, anIndexes[anElemId] ) ); - break; - - case SMESH::MOVE_NODE: - for(CORBA::Long aCoordId=0; anElemId < aNbElems; anElemId++, aCoordId+=3) - { - SMDS_MeshNode* node = - const_cast( FindNode( myMesh, anIndexes[anElemId] )); - node->setXYZ( aCoords[aCoordId], aCoords[aCoordId+1], aCoords[aCoordId+2] ); - } - break; - - case SMESH::CHANGE_ELEMENT_NODES: - for ( CORBA::Long i = 0; anElemId < aNbElems; anElemId++ ) - { - // find element - const SMDS_MeshElement* elem = FindElement( myMesh, anIndexes[i++] ); - // nb nodes - int nbNodes = anIndexes[i++]; - // nodes - //ASSERT( nbNodes < 9 ); - const SMDS_MeshNode* aNodes[ nbNodes ]; - for ( int iNode = 0; iNode < nbNodes; iNode++ ) - aNodes[ iNode ] = FindNode( myMesh, anIndexes[i++] ); - // change - myMesh->ChangeElementNodes( elem, aNodes, nbNodes ); - } - break; - - case SMESH::CHANGE_POLYHEDRON_NODES: - ChangePolyhedronNodes(myMesh, aSeq, anId); - break; - case SMESH::RENUMBER: - for(CORBA::Long i=0; anElemId < aNbElems; anElemId++, i+=3) - { - myMesh->Renumber( anIndexes[i], anIndexes[i+1], anIndexes[i+2] ); - } - break; - - default:; - } - } - } - catch ( SALOME::SALOME_Exception& exc ) - { - INFOS("Following exception was cought:\n\t"<NbNodes() = "<NbNodes()); - MESSAGE("Update - myMesh->NbEdges() = "<NbEdges()); - MESSAGE("Update - myMesh->NbFaces() = "<NbFaces()); - MESSAGE("Update - myMesh->NbVolumes() = "<NbVolumes()); - } - - // Fill unstructured grid - buildPrs(); -} - -//================================================================================= -// function : GetElemDimension -// purpose : Get dimension of element -//================================================================================= -int SMESH_MeshObj::GetElemDimension( const int theObjId ) -{ - const SMDS_MeshElement* anElem = myMesh->FindElement( theObjId ); - if ( anElem == 0 ) - return 0; - - int aType = anElem->GetType(); - switch ( aType ) - { - case SMDSAbs_Edge : return 1; - case SMDSAbs_Face : return 2; - case SMDSAbs_Volume: return 3; - default : return 0; - } -} - -//================================================================================= -// function : GetEntities -// purpose : Get entities of specified type. Return number of entities -//================================================================================= -int SMESH_MeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const -{ - switch ( theType ) - { - case SMDSAbs_Node: - { - return myMesh->NbNodes(); - } - break; - case SMDSAbs_Edge: - { - return myMesh->NbEdges(); - } - break; - case SMDSAbs_Face: - { - return myMesh->NbFaces(); - } - break; - case SMDSAbs_Volume: - { - return myMesh->NbVolumes(); - } - break; - default: - return 0; - break; - } -} - -int SMESH_MeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theObjs ) const -{ - theObjs.clear(); - - switch ( theType ) - { - case SMDSAbs_Node: - { - SMDS_NodeIteratorPtr anIter = myMesh->nodesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - case SMDSAbs_Edge: - { - SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - case SMDSAbs_Face: - { - SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - case SMDSAbs_Volume: - { - SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator(); - while ( anIter->more() ) theObjs.push_back( anIter->next() ); - } - break; - default: - break; - } - - return theObjs.size(); -} - -//================================================================================= -// function : UpdateFunctor -// purpose : Update functor in accordance with current mesh -//================================================================================= -void SMESH_MeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) -{ - theFunctor->SetMesh( GetMesh() ); -} - -//================================================================================= -// function : IsNodePrs -// purpose : Return true if node presentation is used -//================================================================================= -bool SMESH_MeshObj::IsNodePrs() const -{ - return myMesh->NbEdges() == 0 &&myMesh->NbFaces() == 0 &&myMesh->NbVolumes() == 0 ; -} - - -/* - Class : SMESH_SubMeshObj - Description : Base class for visualisation of submeshes and groups -*/ - -//================================================================================= -// function : SMESH_SubMeshObj -// purpose : Constructor -//================================================================================= -SMESH_SubMeshObj::SMESH_SubMeshObj( SMESH_MeshObj* theMeshObj ) -{ - if ( MYDEBUG ) MESSAGE( "SMESH_SubMeshObj - theMeshObj = " << theMeshObj ); - - myMeshObj = theMeshObj; -} - -SMESH_SubMeshObj::~SMESH_SubMeshObj() -{ -} - -//================================================================================= -// function : GetElemDimension -// purpose : Get dimension of element -//================================================================================= -int SMESH_SubMeshObj::GetElemDimension( const int theObjId ) -{ - return myMeshObj == 0 ? 0 : myMeshObj->GetElemDimension( theObjId ); -} - -//================================================================================= -// function : UpdateFunctor -// purpose : Update functor in accordance with current mesh -//================================================================================= -void SMESH_SubMeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) -{ - theFunctor->SetMesh( myMeshObj->GetMesh() ); -} - -//================================================================================= -// function : Update -// purpose : Update mesh object and fill grid with new values -//================================================================================= -void SMESH_SubMeshObj::Update( int theIsClear ) -{ - myMeshObj->Update( theIsClear ); - buildPrs(); -} - - -/* - Class : SMESH_GroupObj - Description : Class for visualisation of groups -*/ - -//================================================================================= -// function : SMESH_GroupObj -// purpose : Constructor -//================================================================================= -SMESH_GroupObj::SMESH_GroupObj( SMESH::SMESH_GroupBase_ptr theGroup, - SMESH_MeshObj* theMeshObj ) -: SMESH_SubMeshObj( theMeshObj ), - myGroupServer( SMESH::SMESH_GroupBase::_duplicate(theGroup) ) -{ - if ( MYDEBUG ) MESSAGE("SMESH_GroupObj - theGroup->_is_nil() = "<_is_nil()); - myGroupServer->Register(); -} - -SMESH_GroupObj::~SMESH_GroupObj() -{ - if ( MYDEBUG ) MESSAGE("~SMESH_GroupObj"); - myGroupServer->Destroy(); -} - -//================================================================================= -// function : IsNodePrs -// purpose : Return true if node presentation is used -//================================================================================= -bool SMESH_GroupObj::IsNodePrs() const -{ - return myGroupServer->GetType() == SMESH::NODE; -} - -//================================================================================= -// function : getNodesFromElems -// purpose : Retrieve nodes from elements -//================================================================================= -static int getNodesFromElems( SMESH::long_array_var& theElemIds, - const SMDS_Mesh* theMesh, - std::list& theResList ) -{ - set aNodeSet; - - for ( CORBA::Long i = 0, n = theElemIds->length(); i < n; i++ ) - { - const SMDS_MeshElement* anElem = theMesh->FindElement( theElemIds[ i ] ); - if ( anElem != 0 ) - { - SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); - while ( anIter->more() ) - { - const SMDS_MeshElement* aNode = anIter->next(); - if ( aNode != 0 ) - aNodeSet.insert( aNode ); - } - } - } - - set::const_iterator anIter; - for ( anIter = aNodeSet.begin(); anIter != aNodeSet.end(); ++anIter ) - theResList.push_back( *anIter ); - - return theResList.size(); -} - -//================================================================================= -// function : getPointers -// purpose : Get std::list from list of IDs -//================================================================================= -static int getPointers( const SMDSAbs_ElementType theRequestType, - SMESH::long_array_var& theElemIds, - const SMDS_Mesh* theMesh, - std::list& theResList ) -{ - for ( CORBA::Long i = 0, n = theElemIds->length(); i < n; i++ ) - { - const SMDS_MeshElement* anElem = theRequestType == SMDSAbs_Node - ? theMesh->FindNode( theElemIds[ i ] ) : theMesh->FindElement( theElemIds[ i ] ); - - if ( anElem != 0 ) - theResList.push_back( anElem ); - } - - return theResList.size(); -} - - -//================================================================================= -// function : GetEntities -// purpose : Get entities of specified type. Return number of entities -//================================================================================= -int SMESH_GroupObj::GetNbEntities( const SMDSAbs_ElementType theType) const -{ - if(SMDSAbs_ElementType(myGroupServer->GetType()) == theType){ - return myGroupServer->Size(); - } - return 0; -} - -int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const -{ - theResList.clear(); - SMDS_Mesh* aMesh = myMeshObj->GetMesh(); - - if ( myGroupServer->Size() == 0 || aMesh == 0 ) - return 0; - - SMDSAbs_ElementType aGrpType = SMDSAbs_ElementType(myGroupServer->GetType()); - SMESH::long_array_var anIds = myGroupServer->GetListOfID(); - - if ( aGrpType == theType ) - return getPointers( theType, anIds, aMesh, theResList ); - else if ( theType == SMDSAbs_Node ) - return getNodesFromElems( anIds, aMesh, theResList ); - else - return 0; -} - - - -/* - Class : SMESH_subMeshObj - Description : Class for visualisation of submeshes -*/ - -//================================================================================= -// function : SMESH_subMeshObj -// purpose : Constructor -//================================================================================= -SMESH_subMeshObj::SMESH_subMeshObj( SMESH::SMESH_subMesh_ptr theSubMesh, - SMESH_MeshObj* theMeshObj ) -: SMESH_SubMeshObj( theMeshObj ), - mySubMeshServer( SMESH::SMESH_subMesh::_duplicate( theSubMesh ) ) -{ - if ( MYDEBUG ) MESSAGE( "SMESH_subMeshObj - theSubMesh->_is_nil() = " << theSubMesh->_is_nil() ); - - mySubMeshServer->Register(); -} - -SMESH_subMeshObj::~SMESH_subMeshObj() -{ - if ( MYDEBUG ) MESSAGE( "~SMESH_subMeshObj" ); - mySubMeshServer->Destroy(); -} - -//================================================================================= -// function : GetEntities -// purpose : Get entities of specified type. Return number of entities -//================================================================================= -int SMESH_subMeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const -{ - switch ( theType ) - { - case SMDSAbs_Node: - { - return mySubMeshServer->GetNumberOfNodes( false ); - } - break; - case SMDSAbs_Edge: - case SMDSAbs_Face: - case SMDSAbs_Volume: - { - SMESH::long_array_var anIds = - mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); - return anIds->length(); - } - default: - return 0; - break; - } -} - -int SMESH_subMeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const -{ - theResList.clear(); - - SMDS_Mesh* aMesh = myMeshObj->GetMesh(); - if ( aMesh == 0 ) - return 0; - - bool isNodal = IsNodePrs(); - - if ( isNodal ) - { - if ( theType == SMDSAbs_Node ) - { - SMESH::long_array_var anIds = mySubMeshServer->GetNodesId(); - return getPointers( SMDSAbs_Node, anIds, aMesh, theResList ); - } - } - else - { - if ( theType == SMDSAbs_Node ) - { - SMESH::long_array_var anIds = mySubMeshServer->GetElementsId(); - return getNodesFromElems( anIds, aMesh, theResList ); - } - else - { - SMESH::long_array_var anIds = - mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); - return getPointers( theType, anIds, aMesh, theResList ); - } - } - - return 0; -} - -//================================================================================= -// function : IsNodePrs -// purpose : Return true if node presentation is used -//================================================================================= -bool SMESH_subMeshObj::IsNodePrs() const -{ - return mySubMeshServer->GetNumberOfElements() == 0; -} - - - - - - - - - - - - diff --git a/src/OBJECT/SMESH_Object.h b/src/OBJECT/SMESH_Object.h deleted file mode 100644 index aea4f778e..000000000 --- a/src/OBJECT/SMESH_Object.h +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Object.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_OBJECT_H -#define SMESH_OBJECT_H - -#include -#include - -#include "SMESH_Controls.hxx" -#include "SMDSAbs_ElementType.hxx" - -class SMDS_Mesh; -class vtkUnstructuredGrid; - -/* - Class : SMESH_VisualObj - Description : Base class for all mesh objects to be visuilised -*/ -class SMESH_VisualObj -{ -public: - virtual void Update( int theIsClear = true ) = 0; - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) = 0; - virtual int GetElemDimension( const int theObjId ) = 0; - - virtual int GetNbEntities( const SMDSAbs_ElementType theType) const = 0; - virtual SMDS_Mesh* GetMesh() const = 0; - - virtual bool GetEdgeNodes( const int theElemId, - const int theEdgeNum, - int& theNodeId1, - int& theNodeId2 ) const = 0; - - virtual vtkUnstructuredGrid* GetUnstructuredGrid() = 0; - - virtual vtkIdType GetNodeObjId( int theVTKID ) = 0; - virtual vtkIdType GetNodeVTKId( int theObjID ) = 0; - virtual vtkIdType GetElemObjId( int theVTKID ) = 0; - virtual vtkIdType GetElemVTKId( int theObjID ) = 0; -}; - -typedef boost::shared_ptr TVisualObjPtr; - -#endif diff --git a/src/OBJECT/SMESH_ObjectDef.h b/src/OBJECT/SMESH_ObjectDef.h deleted file mode 100644 index 134b47b10..000000000 --- a/src/OBJECT/SMESH_ObjectDef.h +++ /dev/null @@ -1,202 +0,0 @@ -// SMESH OBJECT : interactive object for SMESH visualization -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Object.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESH_OBJECTDEF_H -#define SMESH_OBJECTDEF_H - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Group) - -#include -#include - -#include "SMESH_Controls.hxx" -#include "SMESH_Object.h" - -class vtkPoints; -class SALOME_ExtractUnstructuredGrid; - -class SMESH_Actor; -class SMDS_MeshNode; -class SMDS_MeshElement; - -/* - Class : SMESH_VisualObj - Description : Base class for all mesh objects to be visuilised -*/ -class SMESH_VisualObjDef: public SMESH_VisualObj -{ -public: - typedef std::list TEntityList; - typedef std::map TMapOfIds; - - SMESH_VisualObjDef(); - virtual ~SMESH_VisualObjDef(); - - virtual void Update( int theIsClear = true ) = 0; - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) = 0; - virtual int GetElemDimension( const int theObjId ) = 0; - - virtual int GetNbEntities( const SMDSAbs_ElementType theType) const = 0; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const = 0; - virtual bool IsNodePrs() const = 0; - virtual SMDS_Mesh* GetMesh() const = 0; - - virtual bool GetEdgeNodes( const int theElemId, - const int theEdgeNum, - int& theNodeId1, - int& theNodeId2 ) const; - - virtual vtkUnstructuredGrid* GetUnstructuredGrid() { return myGrid; } - - virtual vtkIdType GetNodeObjId( int theVTKID ); - virtual vtkIdType GetNodeVTKId( int theObjID ); - virtual vtkIdType GetElemObjId( int theVTKID ); - virtual vtkIdType GetElemVTKId( int theObjID ); - -protected: - - void createPoints( vtkPoints* ); - void buildPrs(); - void buildNodePrs(); - void buildElemPrs(); - -private: - - TMapOfIds mySMDS2VTKNodes; - TMapOfIds myVTK2SMDSNodes; - TMapOfIds mySMDS2VTKElems; - TMapOfIds myVTK2SMDSElems; - - vtkUnstructuredGrid* myGrid; -}; - - -/* - Class : SMESH_MeshObj - Description : Class for visualisation of mesh -*/ - -class SMESH_MeshObj: public SMESH_VisualObjDef -{ -public: - - SMESH_MeshObj( SMESH::SMESH_Mesh_ptr ); - virtual ~SMESH_MeshObj(); - - virtual void Update( int theIsClear = true ); - - virtual int GetNbEntities( const SMDSAbs_ElementType) const; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const; - virtual bool IsNodePrs() const; - - virtual int GetElemDimension( const int theObjId ); - - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ); - - SMESH::SMESH_Mesh_ptr GetMeshServer() { return myMeshServer.in(); } - SMDS_Mesh* GetMesh() const { return myMesh; } - -protected: - - SMESH::SMESH_Mesh_var myMeshServer; - SMDS_Mesh* myMesh; -}; - - -/* - Class : SMESH_SubMeshObj - Description : Base class for visualisation of submeshes and groups -*/ - -class SMESH_SubMeshObj: public SMESH_VisualObjDef -{ -public: - - SMESH_SubMeshObj(SMESH_MeshObj* theMeshObj); - virtual ~SMESH_SubMeshObj(); - - virtual void Update( int theIsClear = true ); - - virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ); - virtual int GetElemDimension( const int theObjId ); - virtual SMDS_Mesh* GetMesh() const { return myMeshObj->GetMesh(); } - -protected: - - SMESH_MeshObj* myMeshObj; -}; - - -/* - Class : SMESH_GroupObj - Description : Class for visualisation of groups -*/ - -class SMESH_GroupObj: public SMESH_SubMeshObj -{ -public: - SMESH_GroupObj( SMESH::SMESH_GroupBase_ptr, SMESH_MeshObj* ); - virtual ~SMESH_GroupObj(); - - virtual int GetNbEntities( const SMDSAbs_ElementType) const; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const; - virtual bool IsNodePrs() const; - -private: - - SMESH::SMESH_GroupBase_var myGroupServer; -}; - - -/* - Class : SMESH_subMeshObj - Description : Class for visualisation of submeshes -*/ - -class SMESH_subMeshObj : public SMESH_SubMeshObj -{ -public: - - SMESH_subMeshObj( SMESH::SMESH_subMesh_ptr, - SMESH_MeshObj* ); - virtual ~SMESH_subMeshObj(); - - virtual int GetNbEntities( const SMDSAbs_ElementType) const; - virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const; - virtual bool IsNodePrs() const; - -protected: - - SMESH::SMESH_subMesh_var mySubMeshServer; -}; - - -#endif diff --git a/src/SMDS/Makefile.in b/src/SMDS/Makefile.in deleted file mode 100644 index e066e25e0..000000000 --- a/src/SMDS/Makefile.in +++ /dev/null @@ -1,143 +0,0 @@ -# SMESH SMDS : implementaion of Salome mesh data structure -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Author : Patrick GOLDBRONN (CEA) -# Module : SMESH - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl - - -@COMMENCE@ - -# Libraries targets - -LIB = libSMDS.la -LIB_SRC = \ - SMDS_MeshObject.cxx \ - SMDS_MeshElement.cxx \ - SMDS_Position.cxx \ - SMDS_EdgePosition.cxx \ - SMDS_FacePosition.cxx \ - SMDS_SpacePosition.cxx \ - SMDS_VertexPosition.cxx \ - SMDS_MeshNode.cxx \ - SMDS_MeshEdge.cxx \ - SMDS_MeshFace.cxx \ - SMDS_MeshVolume.cxx \ - SMDS_MeshElementIDFactory.cxx \ - SMDS_MeshGroup.cxx \ - SMDS_MeshIDFactory.cxx \ - SMDS_Mesh.cxx \ - SMDS_IteratorOfElements.cxx \ - SMDS_VolumeOfFaces.cxx \ - SMDS_VolumeOfNodes.cxx \ - SMDS_PolyhedralVolumeOfNodes.cxx \ - SMDS_FaceOfEdges.cxx \ - SMDS_FaceOfNodes.cxx \ - SMDS_PolygonalFaceOfNodes.cxx \ - SMDS_VolumeTool.cxx -# SMDS_Tria3OfNodes.cxx \ -# SMDS_HexahedronOfNodes.cxx - -#SMDSControl_BoundaryEdges.cxx \ -#SMDSControl_BoundaryFaces.cxx \ -#SMDSControl.cxx \ -#SMDSControl_MeshBoundary.cxx \ -#SMDSEdit_Transform.cxx \ -#SMDS_MeshNodeIDFactory.cxx \ -#SMDS_MeshPrism.cxx \ -#SMDS_MeshPyramid.cxx \ -#SMDS_MeshQuadrangle.cxx \ -#SMDS_MeshTetrahedron.cxx \ -#SMDS_MeshTriangle.cxx \ - - -LIB_CLIENT_IDL = -LIB_SERVER_IDL = - -# Executables targets -BIN = -BIN_SRC = -BIN_CLIENT_IDL = -BIN_SERVER_IDL = - -# header files -EXPORT_HEADERS= \ - SMDS_TypeOfPosition.hxx \ - SMDSAbs_ElementType.hxx \ - SMDS_EdgePosition.hxx \ - SMDS_ElemIterator.hxx \ - SMDS_FacePosition.hxx \ - SMDS_Mesh.hxx \ - SMDS_MeshEdge.hxx \ - SMDS_MeshElement.hxx \ - SMDS_MeshElementIDFactory.hxx \ - SMDS_MeshFace.hxx \ - SMDS_MeshGroup.hxx \ - SMDS_MeshIDFactory.hxx \ - SMDS_MeshNode.hxx \ - SMDS_MeshObject.hxx \ - SMDS_MeshVolume.hxx \ - SMDS_Position.hxx \ - SMDS_SpacePosition.hxx \ - SMDS_VertexPosition.hxx \ - SMDS_Iterator.hxx \ - SMDS_IteratorOfElements.hxx \ - SMDS_VolumeOfFaces.hxx \ - SMDS_VolumeOfNodes.hxx \ - SMDS_PolyhedralVolumeOfNodes.hxx \ - SMDS_FaceOfEdges.hxx \ - SMDS_FaceOfNodes.hxx \ - SMDS_PolygonalFaceOfNodes.hxx \ - SMDS_VolumeTool.hxx -# SMDS_Tria3OfNodes.hxx \ -# SMDS_HexahedronOfNodes.hxx - -#SMDSControl_BoundaryEdges.hxx \ -#SMDSControl_BoundaryFaces.hxx \ -#SMDSControl.hxx \ -#SMDSControl_MeshBoundary.hxx \ -#SMDSEdit_Transform.hxx \ -#SMDS_MeshPrism.hxx \ -#SMDS_MeshPyramid.hxx \ -#SMDS_MeshQuadrangle.hxx \ -#SMDS_MeshTetrahedron.hxx \ -#SMDS_MeshTriangle.hxx \ -#SMDS_MeshNodeIDFactory.hxx - -# additionnal information to compil and link file -CPPFLAGS += -I${KERNEL_ROOT_DIR}/include/salome $(OCC_INCLUDES) $(BOOST_CPPFLAGS) -CXXFLAGS += -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS += -L${KERNEL_ROOT_DIR}/lib/salome $(OCC_KERNEL_LIBS) - - -# additional file to be cleaned -MOSTLYCLEAN = -CLEAN = -DISTCLEAN = - -@CONCLUDE@ diff --git a/src/SMDS/SMDSAbs_ElementType.hxx b/src/SMDS/SMDSAbs_ElementType.hxx deleted file mode 100644 index c474a4e55..000000000 --- a/src/SMDS/SMDSAbs_ElementType.hxx +++ /dev/null @@ -1,41 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org or email : webmaster@opencascade.org -// -// -// -// File : SMDSAbs_ElementType.hxx -// Module : SMESH - -#ifndef _SMDSAbs_ElementType_HeaderFile -#define _SMDSAbs_ElementType_HeaderFile - -/////////////////////////////////////////////////////////////////////////////// -/// Type (node, edge, face or volume) of elements -/////////////////////////////////////////////////////////////////////////////// -enum SMDSAbs_ElementType -{ - SMDSAbs_All, - SMDSAbs_Node, - SMDSAbs_Edge, - SMDSAbs_Face, - SMDSAbs_Volume -}; - -#endif diff --git a/src/SMDS/SMDS_EdgePosition.cxx b/src/SMDS/SMDS_EdgePosition.cxx deleted file mode 100644 index 82c92b398..000000000 --- a/src/SMDS/SMDS_EdgePosition.cxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_EdgePosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_EdgePosition.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_EdgePosition -//purpose : -//======================================================================= - -SMDS_EdgePosition::SMDS_EdgePosition(const int aEdgeId, - const double aUParam):SMDS_Position(aEdgeId), myUParameter(aUParam) -{ -} - -//======================================================================= -//function : Coords -//purpose : -//======================================================================= - -const double *SMDS_EdgePosition::Coords() const -{ - static double origin[]={0,0,0}; - MESSAGE("SMDS_EdgePosition::Coords not implemented"); - return origin; -} - -/** -*/ -SMDS_TypeOfPosition SMDS_EdgePosition::GetTypeOfPosition() const -{ - return SMDS_TOP_EDGE; -} - -void SMDS_EdgePosition::SetUParameter(double aUparam) -{ - myUParameter = aUparam; -} - -//======================================================================= -//function : GetUParameter -//purpose : -//======================================================================= - -double SMDS_EdgePosition::GetUParameter() const -{ - return myUParameter; -} diff --git a/src/SMDS/SMDS_EdgePosition.hxx b/src/SMDS/SMDS_EdgePosition.hxx deleted file mode 100644 index fd297d3ab..000000000 --- a/src/SMDS/SMDS_EdgePosition.hxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_EdgePosition.hxx -// Module : SMESH - -#ifndef _SMDS_EdgePosition_HeaderFile -#define _SMDS_EdgePosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_EdgePosition:public SMDS_Position -{ - - public: - SMDS_EdgePosition(const int aEdgeId=0, const double aUParam=0); - const virtual double * Coords() const; - SMDS_TypeOfPosition GetTypeOfPosition() const; - void SetUParameter(double aUparam); - double GetUParameter() const; - - private: - - double myUParameter; - -}; - -#endif diff --git a/src/SMDS/SMDS_ElemIterator.hxx b/src/SMDS/SMDS_ElemIterator.hxx deleted file mode 100755 index c8432afdd..000000000 --- a/src/SMDS/SMDS_ElemIterator.hxx +++ /dev/null @@ -1,40 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshElement.hxx -// Module : SMESH -// Created: 12.01.05 18:02:52 -// Author: Michael Sazonov - -#ifndef SMDS_ElemIterator_HeaderFile -#define SMDS_ElemIterator_HeaderFile - -#include "SMDS_Iterator.hxx" -#include - -class SMDS_MeshElement; - -typedef SMDS_Iterator SMDS_ElemIterator; -typedef boost::shared_ptr > SMDS_ElemIteratorPtr; - -#endif diff --git a/src/SMDS/SMDS_FaceOfEdges.cxx b/src/SMDS/SMDS_FaceOfEdges.cxx deleted file mode 100644 index 640c55d30..000000000 --- a/src/SMDS/SMDS_FaceOfEdges.cxx +++ /dev/null @@ -1,157 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_FaceOfEdges.hxx" -#include "SMDS_IteratorOfElements.hxx" -#include "SMDS_MeshNode.hxx" - -using namespace std; - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= - -int SMDS_FaceOfEdges::NbEdges() const -{ - return myNbEdges; -} - -int SMDS_FaceOfEdges::NbFaces() const -{ - return 1; -} -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_FaceOfEdges::Print(ostream & OS) const -{ - OS << "face <" << GetID() << " > : "; - int i; - for (i = 0; i < NbEdges() - 1; i++) OS << myEdges[i] << ","; - OS << myEdges[i] << ") " << endl; -} - -SMDSAbs_ElementType SMDS_FaceOfEdges::GetType() const -{ - return SMDSAbs_Face; -} - -//======================================================================= -//function : elementsIterator -//purpose : -//======================================================================= - -class SMDS_FaceOfEdges_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshEdge* const *mySet; - int myLength; - int index; - public: - SMDS_FaceOfEdges_MyIterator(const SMDS_MeshEdge* const *s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index set1,set2; - SMDS_ElemIteratorPtr it; - const SMDS_MeshNode * n; - - it=f1.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set1.insert(*n); - } - - delete it; - it=f2.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set2.insert(*n); - } - - delete it; - return set1 - - -class SMDS_FaceOfEdges:public SMDS_MeshFace -{ - public: - void Print(std::ostream & OS) const; - SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1, - const SMDS_MeshEdge* edge2, - const SMDS_MeshEdge* edge3); - SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1, - const SMDS_MeshEdge* edge2, - const SMDS_MeshEdge* edge3, - const SMDS_MeshEdge* edge4); - - SMDSAbs_ElementType GetType() const; - int NbEdges() const; - int NbFaces() const; -// friend bool operator<(const SMDS_FaceOfEdges& e1, const SMDS_FaceOfEdges& e2); - - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - const SMDS_MeshEdge* myEdges[4]; - int myNbEdges; - -}; - -#endif diff --git a/src/SMDS/SMDS_FaceOfNodes.cxx b/src/SMDS/SMDS_FaceOfNodes.cxx deleted file mode 100644 index aa6870824..000000000 --- a/src/SMDS/SMDS_FaceOfNodes.cxx +++ /dev/null @@ -1,177 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_FaceOfNodes.hxx" -#include "SMDS_IteratorOfElements.hxx" -#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= - -int SMDS_FaceOfNodes::NbEdges() const -{ - return NbNodes(); -} - -int SMDS_FaceOfNodes::NbFaces() const -{ - return 1; -} - -int SMDS_FaceOfNodes::NbNodes() const -{ - return myNbNodes; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_FaceOfNodes::Print(ostream & OS) const -{ - OS << "face <" << GetID() << " > : "; - int i; - for (i = 0; i < NbNodes() - 1; i++) OS << myNodes[i] << ","; - OS << myNodes[i] << ") " << endl; -} - -//======================================================================= -//function : elementsIterator -//purpose : -//======================================================================= - -class SMDS_FaceOfNodes_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshNode* const *mySet; - int myLength; - int index; - public: - SMDS_FaceOfNodes_MyIterator(const SMDS_MeshNode* const *s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index set1,set2; - SMDS_ElemIteratorPtr it; - const SMDS_MeshNode * n; - - it=f1.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set1.insert(*n); - } - - delete it; - it=f2.nodesIterator(); - - while(it->more()) - { - n=static_cast(it->next()); - set2.insert(*n); - } - - delete it; - return set1 - -class SMDS_FaceOfNodes:public SMDS_MeshFace -{ - public: - void Print(std::ostream & OS) const; - SMDS_FaceOfNodes(const SMDS_MeshNode* node1, - const SMDS_MeshNode* node2, - const SMDS_MeshNode* node3); - SMDS_FaceOfNodes(const SMDS_MeshNode* node1, - const SMDS_MeshNode* node2, - const SMDS_MeshNode* node3, - const SMDS_MeshNode* node4); - bool ChangeNodes(const SMDS_MeshNode* nodes[], - const int nbNodes); - int NbEdges() const; - int NbFaces() const; - int NbNodes() const; - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - const SMDS_MeshNode* myNodes[4]; - int myNbNodes; - -}; - -#endif diff --git a/src/SMDS/SMDS_FacePosition.cxx b/src/SMDS/SMDS_FacePosition.cxx deleted file mode 100644 index c97e64f7a..000000000 --- a/src/SMDS/SMDS_FacePosition.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_FacePosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_FacePosition.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_FacePosition -//purpose : -//======================================================================= - -SMDS_FacePosition::SMDS_FacePosition(const int aEdgeId, - const double aUParam, - const double aVParam) - :SMDS_Position(aEdgeId), - myUParameter(aUParam),myVParameter(aVParam) -{ -} - -//======================================================================= -//function : Coords -//purpose : -//======================================================================= -const double *SMDS_FacePosition::Coords() const -{ - static double origin[]={0,0,0}; - MESSAGE("SMDS_EdgePosition::Coords not implemented"); - return origin; -} - -/** -*/ -SMDS_TypeOfPosition SMDS_FacePosition::GetTypeOfPosition() const -{ - return SMDS_TOP_FACE; -} - -void SMDS_FacePosition::SetUParameter(double aUparam) -{ - myUParameter = aUparam; -} - -//======================================================================= -//function : SetVParameter -//purpose : -//======================================================================= - -void SMDS_FacePosition::SetVParameter(double aVparam) -{ - myVParameter = aVparam; -} - -//======================================================================= -//function : GetUParameter -//purpose : -//======================================================================= - -double SMDS_FacePosition::GetUParameter() const -{ - return myUParameter; -} - -//======================================================================= -//function : GetVParameter -//purpose : -//======================================================================= - -double SMDS_FacePosition::GetVParameter() const -{ - return myVParameter; -} diff --git a/src/SMDS/SMDS_FacePosition.hxx b/src/SMDS/SMDS_FacePosition.hxx deleted file mode 100644 index 8ca74130f..000000000 --- a/src/SMDS/SMDS_FacePosition.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_FacePosition.hxx -// Module : SMESH - -#ifndef _SMDS_FacePosition_HeaderFile -#define _SMDS_FacePosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_FacePosition:public SMDS_Position -{ - - public: - SMDS_FacePosition(int aFaceId=0, double aUParam=0, - double aVParam=0); - const virtual double * Coords() const; - SMDS_TypeOfPosition GetTypeOfPosition() const; - void SetUParameter(double aUparam); - void SetVParameter(double aVparam); - double GetUParameter() const; - double GetVParameter() const; - - private: - double myUParameter; - double myVParameter; -}; -#endif diff --git a/src/SMDS/SMDS_Iterator.hxx b/src/SMDS/SMDS_Iterator.hxx deleted file mode 100644 index 264438c7d..000000000 --- a/src/SMDS/SMDS_Iterator.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _SMDS_Iterator_HeaderFile -#define _SMDS_Iterator_HeaderFile - -/////////////////////////////////////////////////////////////////////////////// -///Abstract class for iterators -///@author Jerome Robert -/////////////////////////////////////////////////////////////////////////////// -template class SMDS_Iterator -{ - public: - /// Return true if and only if there are other object in this iterator - virtual bool more()=0; - - /// Return the current object and step to the next one - virtual VALUE next()=0; - - /// Delete the current element and step to the next one - virtual void remove(){} - - /// Provide virtual destructor just for case if some derived iterator - /// must have a destructor - virtual ~SMDS_Iterator(){} -}; - -#endif diff --git a/src/SMDS/SMDS_IteratorOfElements.cxx b/src/SMDS/SMDS_IteratorOfElements.cxx deleted file mode 100644 index 472ae0d54..000000000 --- a/src/SMDS/SMDS_IteratorOfElements.cxx +++ /dev/null @@ -1,106 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_IteratorOfElements.hxx" - -bool SMDS_IteratorOfElements::subMore() -{ - if((t2Iterator.get()==NULL)||(!t2Iterator->more())) - { - if(t1Iterator->more()) - { - t2Iterator=t1Iterator->next()->elementsIterator(myType); - return subMore(); - } - else return false; - } - else return true; -} - -const SMDS_MeshElement * SMDS_IteratorOfElements::subNext() -{ - if((t2Iterator.get()==NULL)||(!t2Iterator->more())) - if(t1Iterator->more()) - t2Iterator=t1Iterator->next()->elementsIterator(myType); - return t2Iterator->next(); -} - -///////////////////////////////////////////////////////////////////////////// -/// Create an iterator which look for elements of type type which are linked -/// to the element element. it is the iterator to get connectivity of element -////////////////////////////////////////////////////////////////////////////// -SMDS_IteratorOfElements::SMDS_IteratorOfElements(const SMDS_MeshElement * element, - SMDSAbs_ElementType type, - const SMDS_ElemIteratorPtr& it) - : t1Iterator(it), - t2Iterator(SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL)), - myType(type), myElement(element), - myProxyElement(NULL) -{ - while(subMore()) - alreadyReturnedElements.insert(subNext()); - itAlreadyReturned= alreadyReturnedElements.begin(); - switch(myElement->GetType()) - { - case SMDSAbs_Node: - case SMDSAbs_Edge: myReverseIteration=true; break; - case SMDSAbs_Face: myReverseIteration=(type==SMDSAbs_Volume); break; - default: myReverseIteration=false; - } -} - -bool SMDS_IteratorOfElements::more() -{ - if(myProxyElement==NULL) - { - while(itAlreadyReturned!=alreadyReturnedElements.end()) - { - myProxyElement=*itAlreadyReturned; - itAlreadyReturned++; - - if(myReverseIteration) - { - SMDS_ElemIteratorPtr it= - myProxyElement->elementsIterator(myElement->GetType()); - while(it->more()) - { - if(it->next()==myElement) return true; - } - } - else return true; - } - myProxyElement=NULL; - return false; - } - else return true; -} - -const SMDS_MeshElement * SMDS_IteratorOfElements::next() -{ - more(); - const SMDS_MeshElement *e=myProxyElement; - myProxyElement=NULL; - return e; -} diff --git a/src/SMDS/SMDS_IteratorOfElements.hxx b/src/SMDS/SMDS_IteratorOfElements.hxx deleted file mode 100644 index faf777de9..000000000 --- a/src/SMDS/SMDS_IteratorOfElements.hxx +++ /dev/null @@ -1,52 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "SMDS_Iterator.hxx" -#include "SMDS_MeshElement.hxx" -#include - - -class SMDS_IteratorOfElements:public SMDS_ElemIterator -{ - public: -///////////////////////////////////////////////////////////////////////////// -/// Create an iterator which look for elements of type type which are linked -/// to the element element. it is the iterator to get connectivity of element -////////////////////////////////////////////////////////////////////////////// - SMDS_IteratorOfElements(const SMDS_MeshElement * element, - SMDSAbs_ElementType type, - const SMDS_ElemIteratorPtr& it); - bool more(); - const SMDS_MeshElement * next(); - - private: - SMDS_ElemIteratorPtr t2Iterator; - SMDS_ElemIteratorPtr t1Iterator; - SMDSAbs_ElementType myType; - const SMDS_MeshElement * myProxyElement; - const SMDS_MeshElement * myElement; - bool myReverseIteration; - - std::set alreadyReturnedElements; - std::set::iterator itAlreadyReturned; - bool subMore(); - const SMDS_MeshElement * subNext(); -}; diff --git a/src/SMDS/SMDS_Mesh.cxx b/src/SMDS/SMDS_Mesh.cxx deleted file mode 100644 index 6381e547e..000000000 --- a/src/SMDS/SMDS_Mesh.cxx +++ /dev/null @@ -1,2203 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "utilities.h" -#include "SMDS_Mesh.hxx" -#include "SMDS_VolumeOfNodes.hxx" -#include "SMDS_VolumeOfFaces.hxx" -#include "SMDS_FaceOfNodes.hxx" -#include "SMDS_FaceOfEdges.hxx" -#include "SMDS_PolyhedralVolumeOfNodes.hxx" -#include "SMDS_PolygonalFaceOfNodes.hxx" - -#include -#include -using namespace std; - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new mesh object -/////////////////////////////////////////////////////////////////////////////// -SMDS_Mesh::SMDS_Mesh() - :myParent(NULL), - myNodeIDFactory(new SMDS_MeshElementIDFactory()), - myElementIDFactory(new SMDS_MeshElementIDFactory()), - myHasConstructionEdges(false), myHasConstructionFaces(false), - myHasInverseElements(true) -{ -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new child mesh -/// Note that the tree structure of SMDS_Mesh seems to be unused in this version -/// (2003-09-08) of SMESH -/////////////////////////////////////////////////////////////////////////////// -SMDS_Mesh::SMDS_Mesh(SMDS_Mesh * parent) - :myParent(parent), myNodeIDFactory(parent->myNodeIDFactory), - myElementIDFactory(parent->myElementIDFactory), - myHasConstructionEdges(false), myHasConstructionFaces(false), - myHasInverseElements(true) -{ -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a submesh and add it to the current mesh -/////////////////////////////////////////////////////////////////////////////// - -SMDS_Mesh *SMDS_Mesh::AddSubMesh() -{ - SMDS_Mesh *submesh = new SMDS_Mesh(this); - myChildren.insert(myChildren.end(), submesh); - return submesh; -} - -/////////////////////////////////////////////////////////////////////////////// -///create a MeshNode and add it to the current Mesh -///An ID is automatically assigned to the node. -///@return : The created node -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshNode * SMDS_Mesh::AddNode(double x, double y, double z) -{ - return SMDS_Mesh::AddNodeWithID(x,y,z,myNodeIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///create a MeshNode and add it to the current Mesh -///@param ID : The ID of the MeshNode to create -///@return : The created node or NULL if a node with this ID already exists -/////////////////////////////////////////////////////////////////////////////// -SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID) -{ - // find the MeshNode corresponding to ID - const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID); - if(!node){ - SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z); - myNodes.Add(node); - myNodeIDFactory->BindID(ID,node); - return node; - }else - return NULL; -} - -/////////////////////////////////////////////////////////////////////////////// -/// create a MeshEdge and add it to the current Mesh -/// @return : The created MeshEdge -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int idnode1, int idnode2, int ID) -{ - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - if(!node1 || !node2) return NULL; - return SMDS_Mesh::AddEdgeWithID(node1, node2, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// create a MeshEdge and add it to the current Mesh -/// @return : The created MeshEdge -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - return SMDS_Mesh::AddEdgeWithID(node1, node2, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new edge and at it to the mesh -/// @param idnode1 ID of the first node -/// @param idnode2 ID of the second node -/// @param ID ID of the edge to create -/// @return The created edge or NULL if an element with this ID already exists or -/// if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID) -{ - SMDS_MeshEdge * edge=new SMDS_MeshEdge(n1,n2); - if(myElementIDFactory->BindID(ID, edge)) { - SMDS_MeshNode *node1,*node2; - node1=const_cast(n1); - node2=const_cast(n2); - node1->AddInverseElement(edge); - node2->AddInverseElement(edge); - myEdges.Add(edge); - return edge; - } - else { - delete edge; - return NULL; - } -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its nodes. An ID is automatically affected to the -/// Created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3) -{ - return SMDS_Mesh::AddFaceWithID(n1,n2,n3, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its nodes IDs -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, int ID) -{ - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - if(!node1 || !node2 || !node3) return NULL; - return SMDS_Mesh::AddFaceWithID(node1, node2, node3, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its nodes -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - int ID) -{ - SMDS_MeshFace * face=createTriangle(n1, n2, n3); - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes. An ID is automatically affected to the -/// created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - return SMDS_Mesh::AddFaceWithID(n1,n2,n3, n4, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes IDs -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - if(!node1 || !node2 || !node3 || !node4) return NULL; - return SMDS_Mesh::AddFaceWithID(node1, node2, node3, node4, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - SMDS_MeshFace * face=createQuadrangle(n1, n2, n3, n4); - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its edges. An ID is automatically assigned to the -/// Created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3) -{ - if (!hasConstructionEdges()) - return NULL; - return AddFaceWithID(e1,e2,e3, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its edges -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - int ID) -{ - if (!hasConstructionEdges()) - return NULL; - SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3); - myFaces.Add(face); - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its edges. An ID is automatically assigned to the -/// Created face -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4) -{ - if (!hasConstructionEdges()) - return NULL; - return AddFaceWithID(e1,e2,e3,e4, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its edges -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4, - int ID) -{ - if (!hasConstructionEdges()) - return NULL; - SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3,e4); - myFaces.Add(face); - - if (!registerElement(ID, face)) - { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron and add it to the mesh. -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron and add it to the mesh. -///@param ID The ID of the new volume -///@return The created tetrahedron or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - if(!node1 || !node2 || !node3 || !node4) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron and add it to the mesh. -///@param ID The ID of the new volume -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); - SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n4); - SMDS_MeshFace * f3=FindFaceOrCreate(n1,n3,n4); - SMDS_MeshFace * f4=FindFaceOrCreate(n2,n3,n4); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid and add it to the mesh. -///Nodes 1,2,3 and 4 define the base of the pyramid -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid and add it to the mesh. -///Nodes 1,2,3 and 4 define the base of the pyramid -///@param ID The ID of the new volume -///@return The created pyramid or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int idnode5, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - if(!node1 || !node2 || !node3 || !node4 || !node5) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid and add it to the mesh. -///Nodes 1,2,3 and 4 define the base of the pyramid -///@param ID The ID of the new volume -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); - SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n5); - SMDS_MeshFace * f3=FindFaceOrCreate(n2,n3,n5); - SMDS_MeshFace * f4=FindFaceOrCreate(n3,n4,n5); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism and add it to the mesh. -///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle. -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism and add it to the mesh. -///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle. -///@param ID The ID of the new volume -///@return The created prism or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int idnode5, - int idnode6, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); - if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism and add it to the mesh. -///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle. -///@param ID The ID of the new volume -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); - SMDS_MeshFace * f2=FindFaceOrCreate(n4,n5,n6); - SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n5,n2); - SMDS_MeshFace * f4=FindFaceOrCreate(n2,n5,n6,n3); - SMDS_MeshFace * f5=FindFaceOrCreate(n3,n6,n4,n1); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new hexahedron and add it to the mesh. -///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. -///@return The created hexahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new hexahedron and add it to the mesh. -///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. -///@param ID The ID of the new volume -///@return The created hexahedron or NULL if an element with this ID already -///exists or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, - int idnode2, - int idnode3, - int idnode4, - int idnode5, - int idnode6, - int idnode7, - int idnode8, - int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); - node7 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode7); - node8 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode8); - if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6 || !node7 || !node8) - return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, - node7, node8, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new hexahedron and add it to the mesh. -///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. -///@param ID The ID of the new volume -///@return The created prism or NULL if an element with this ID already exists -///or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, - int ID) -{ - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) { - SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); - SMDS_MeshFace * f2=FindFaceOrCreate(n5,n6,n7,n8); - SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n8,n5); - SMDS_MeshFace * f4=FindFaceOrCreate(n1,n2,n6,n5); - SMDS_MeshFace * f5=FindFaceOrCreate(n2,n3,n7,n6); - SMDS_MeshFace * f6=FindFaceOrCreate(n3,n4,n8,n7); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); - myVolumes.Add(volume); - } - else if(hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } - else { -// volume=new SMDS_HexahedronOfNodes(n1,n2,n3,n4,n5,n6,n7,n8); - volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron defined by its faces and add it to the mesh. -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4) -{ - if (!hasConstructionFaces()) - return NULL; - return AddVolumeWithID(f1,f2,f3,f4, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new tetrahedron defined by its faces and add it to the mesh. -///@param ID The ID of the new volume -///@return The created tetrahedron -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - int ID) -{ - if (!hasConstructionFaces()) - return NULL; - SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.Add(volume); - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid defined by its faces and add it to the mesh. -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5) -{ - if (!hasConstructionFaces()) - return NULL; - return AddVolumeWithID(f1,f2,f3,f4,f5, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new pyramid defined by its faces and add it to the mesh. -///@param ID The ID of the new volume -///@return The created pyramid -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - int ID) -{ - if (!hasConstructionFaces()) - return NULL; - SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); - myVolumes.Add(volume); - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism defined by its faces and add it to the mesh. -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6) -{ - if (!hasConstructionFaces()) - return NULL; - return AddVolumeWithID(f1,f2,f3,f4,f5,f6, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a new prism defined by its faces and add it to the mesh. -///@param ID The ID of the new volume -///@return The created prism -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6, - int ID) -{ - if (!hasConstructionFaces()) - return NULL; - SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); - myVolumes.Add(volume); - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a polygon defined by its nodes IDs -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (std::vector nodes_ids, - const int ID) -{ - int nbNodes = nodes_ids.size(); - std::vector nodes (nbNodes); - for (int i = 0; i < nbNodes; i++) { - nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]); - if (!nodes[i]) return NULL; - } - return SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a polygon defined by its nodes -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID - (std::vector nodes, - const int ID) -{ - SMDS_MeshFace * face; - - if (hasConstructionEdges()) - { - MESSAGE("Error : Not implemented"); - return NULL; - } - else - { - face = new SMDS_PolygonalFaceOfNodes(nodes); - myFaces.Add(face); - } - - if (!registerElement(ID, face)) { - RemoveElement(face, false); - face = NULL; - } - return face; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Add a polygon defined by its nodes. -/// An ID is automatically affected to the created face. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (std::vector nodes) -{ - return SMDS_Mesh::AddPolygonalFaceWithID(nodes, myElementIDFactory->GetFreeID()); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new polyhedral volume and add it to the mesh. -/// @param ID The ID of the new volume -/// @return The created volume or NULL if an element with this ID already exists -/// or if input nodes are not found. -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID - (std::vector nodes_ids, - std::vector quantities, - const int ID) -{ - int nbNodes = nodes_ids.size(); - std::vector nodes (nbNodes); - for (int i = 0; i < nbNodes; i++) { - nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]); - if (!nodes[i]) return NULL; - } - return SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new polyhedral volume and add it to the mesh. -/// @param ID The ID of the new volume -/// @return The created volume -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID - (std::vector nodes, - std::vector quantities, - const int ID) -{ - SMDS_MeshVolume* volume; - if (hasConstructionFaces()) { - MESSAGE("Error : Not implemented"); - return NULL; - } else if (hasConstructionEdges()) { - MESSAGE("Error : Not implemented"); - return NULL; - } else { - volume = new SMDS_PolyhedralVolumeOfNodes(nodes, quantities); - myVolumes.Add(volume); - } - - if (!registerElement(ID, volume)) { - RemoveElement(volume, false); - volume = NULL; - } - return volume; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create a new polyhedral volume and add it to the mesh. -/// @return The created volume -/////////////////////////////////////////////////////////////////////////////// - -SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolume - (std::vector nodes, - std::vector quantities) -{ - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID); - if (v == NULL) myElementIDFactory->ReleaseID(ID); - return v; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Registers element with the given ID, maintains inverse connections -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::registerElement(int ID, SMDS_MeshElement * element) -{ - if (myElementIDFactory->BindID(ID, element)) { - SMDS_ElemIteratorPtr it = element->nodesIterator(); - while (it->more()) { - SMDS_MeshNode *node = static_cast - (const_cast(it->next())); - node->AddInverseElement(element); - } - return true; - } - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the node whose ID is 'ID'. -/////////////////////////////////////////////////////////////////////////////// -const SMDS_MeshNode * SMDS_Mesh::FindNode(int ID) const -{ - return (const SMDS_MeshNode *)myNodeIDFactory->MeshElement(ID); -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a triangle and add it to the current mesh. This methode do not bind a -///ID to the create triangle. -/////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3) -{ - if(hasConstructionEdges()) - { - SMDS_MeshEdge *edge1, *edge2, *edge3; - edge1=FindEdgeOrCreate(node1,node2); - edge2=FindEdgeOrCreate(node2,node3); - edge3=FindEdgeOrCreate(node3,node1); - - SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3); - myFaces.Add(face); - return face; - } - else - { - SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3); - myFaces.Add(face); - return face; - } -} - -/////////////////////////////////////////////////////////////////////////////// -///Create a quadrangle and add it to the current mesh. This methode do not bind -///a ID to the create triangle. -/////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4) -{ - if(hasConstructionEdges()) - { - SMDS_MeshEdge *edge1, *edge2, *edge3, *edge4; - edge1=FindEdgeOrCreate(node1,node2); - edge2=FindEdgeOrCreate(node2,node3); - edge3=FindEdgeOrCreate(node3,node4); - edge4=FindEdgeOrCreate(node4,node1); - - SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3,edge4); - myFaces.Add(face); - return face; - } - else - { - SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3,node4); - myFaces.Add(face); - return face; - } -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove a node and all the elements which own this node -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveNode(const SMDS_MeshNode * node) -{ - RemoveElement(node, true); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove an edge and all the elements which own this edge -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveEdge(const SMDS_MeshEdge * edge) -{ - RemoveElement(edge,true); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove an face and all the elements which own this face -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveFace(const SMDS_MeshFace * face) -{ - RemoveElement(face, true); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Remove a volume -/////////////////////////////////////////////////////////////////////////////// - -void SMDS_Mesh::RemoveVolume(const SMDS_MeshVolume * volume) -{ - RemoveElement(volume, true); -} - -//======================================================================= -//function : RemoveFromParent -//purpose : -//======================================================================= - -bool SMDS_Mesh::RemoveFromParent() -{ - if (myParent==NULL) return false; - else return (myParent->RemoveSubMesh(this)); -} - -//======================================================================= -//function : RemoveSubMesh -//purpose : -//======================================================================= - -bool SMDS_Mesh::RemoveSubMesh(const SMDS_Mesh * aMesh) -{ - bool found = false; - - list::iterator itmsh=myChildren.begin(); - for (; itmsh!=myChildren.end() && !found; itmsh++) - { - SMDS_Mesh * submesh = *itmsh; - if (submesh == aMesh) - { - found = true; - myChildren.erase(itmsh); - } - } - - return found; -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, - const SMDS_MeshNode * nodes[], - const int nbnodes) -{ - // keep current nodes of elem - set oldNodes; - SMDS_ElemIteratorPtr itn = elem->nodesIterator(); - while(itn->more()) - oldNodes.insert( itn->next() ); - - // change nodes - bool Ok = false; - switch ( elem->GetType() ) - { - case SMDSAbs_Edge: { - if ( nbnodes == 2 ) { - const SMDS_MeshEdge* edge = dynamic_cast( elem ); - if ( edge ) - Ok = const_cast( edge )->ChangeNodes( nodes[0], nodes[1] ); - } - break; - } - case SMDSAbs_Face: { - const SMDS_FaceOfNodes* face = dynamic_cast( elem ); - if ( face ) { - Ok = const_cast( face )->ChangeNodes( nodes, nbnodes ); - } else { - /// ??? begin - const SMDS_PolygonalFaceOfNodes* face = dynamic_cast(elem); - if (face) { - Ok = const_cast(face)->ChangeNodes(nodes, nbnodes); - } - /// ??? end - } - break; - } - //case SMDSAbs_PolygonalFace: { - // const SMDS_PolygonalFaceOfNodes* face = dynamic_cast(elem); - // if (face) { - // Ok = const_cast(face)->ChangeNodes(nodes, nbnodes); - // } - // break; - //} - case SMDSAbs_Volume: { - const SMDS_VolumeOfNodes* vol = dynamic_cast( elem ); - if ( vol ) - Ok = const_cast( vol )->ChangeNodes( nodes, nbnodes ); - break; - } - default: - MESSAGE ( "WRONG ELEM TYPE"); - } - - if ( Ok ) { // update InverseElements - - // AddInverseElement to new nodes - for ( int i = 0; i < nbnodes; i++ ) - if ( oldNodes.find( nodes[i] ) == oldNodes.end() ) - // new node - const_cast( nodes[i] )->AddInverseElement( elem ); - else - // remove from oldNodes a node that remains in elem - oldNodes.erase( nodes[i] ); - - - // RemoveInverseElement from the nodes removed from elem - set::iterator it; - for ( it = oldNodes.begin(); it != oldNodes.end(); it++ ) - { - SMDS_MeshNode * n = static_cast - (const_cast( *it )); - n->RemoveInverseElement( elem ); - } - } - - //MESSAGE ( "::ChangeNodes() Ok = " << Ok); - - return Ok; -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : to change nodes of polyhedral volume -//======================================================================= -bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem, - std::vector nodes, - std::vector quantities) -{ - if (elem->GetType() != SMDSAbs_Volume) { - MESSAGE("WRONG ELEM TYPE"); - return false; - } - - const SMDS_PolyhedralVolumeOfNodes* vol = dynamic_cast(elem); - if (!vol) { - return false; - } - - // keep current nodes of elem - set oldNodes; - SMDS_ElemIteratorPtr itn = elem->nodesIterator(); - while (itn->more()) { - oldNodes.insert(itn->next()); - } - - // change nodes - bool Ok = const_cast(vol)->ChangeNodes(nodes, quantities); - if (!Ok) { - return false; - } - - // update InverseElements - - // AddInverseElement to new nodes - int nbnodes = nodes.size(); - for (int i = 0; i < nbnodes; i++) { - if (oldNodes.find(nodes[i]) == oldNodes.end()) { - // new node - const_cast(nodes[i])->AddInverseElement(elem); - } else { - // remove from oldNodes a node that remains in elem - oldNodes.erase(nodes[i]); - } - } - - // RemoveInverseElement from the nodes removed from elem - set::iterator it; - for (it = oldNodes.begin(); it != oldNodes.end(); it++) { - SMDS_MeshNode * n = static_cast - (const_cast( *it )); - n->RemoveInverseElement(elem); - } - - return Ok; -} - -//======================================================================= -//function : FindEdge -//purpose : -//======================================================================= - -const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2) const -{ - const SMDS_MeshNode * node1=FindNode(idnode1); - const SMDS_MeshNode * node2=FindNode(idnode2); - if((node1==NULL)||(node2==NULL)) return NULL; - return FindEdge(node1,node2); -} - -//#include "Profiler.h" -const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - const SMDS_MeshEdge * toReturn=NULL; - //PROFILER_Init(); - //PROFILER_Set(); - SMDS_ElemIteratorPtr it1=node1->edgesIterator(); - //PROFILER_Get(0); - //PROFILER_Set(); - while(it1->more()) - { - const SMDS_MeshEdge * e=static_cast - (it1->next()); - SMDS_ElemIteratorPtr it2=e->nodesIterator(); - while(it2->more()) - { - if(it2->next()->GetID()==node2->GetID()) - { - toReturn=e; - break; - } - } - } - //PROFILER_Get(1); - return toReturn; -} - - -SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - SMDS_MeshEdge * toReturn=NULL; - toReturn=const_cast(FindEdge(node1,node2)); - if(toReturn==NULL) - { - toReturn=new SMDS_MeshEdge(node1,node2); - myEdges.Add(toReturn); - } - return toReturn; -} - -//======================================================================= -//function : FindFace -//purpose : -//======================================================================= - -const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, - int idnode3) const -{ - const SMDS_MeshNode * node1=FindNode(idnode1); - const SMDS_MeshNode * node2=FindNode(idnode2); - const SMDS_MeshNode * node3=FindNode(idnode3); - if((node1==NULL)||(node2==NULL)||(node3==NULL)) return NULL; - return FindFace(node1, node2, node3); -} - -const SMDS_MeshFace* SMDS_Mesh::FindFace( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3) -{ - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - bool node2found, node3found; - - SMDS_ElemIteratorPtr it1=node1->facesIterator(); - while(it1->more()) - { - face=static_cast(it1->next()); - if(face->NbNodes()!=3) continue; - SMDS_ElemIteratorPtr it2=face->nodesIterator(); - node2found=false; - node3found=false; - while(it2->more()) - { - node=it2->next(); - if(node->GetID()==node2->GetID()) node2found=true; - if(node->GetID()==node3->GetID()) node3found=true; - } - if(node2found&&node3found) - return face; - } - return NULL; -} - -SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3) -{ - SMDS_MeshFace * toReturn=NULL; - toReturn=const_cast(FindFace(node1,node2,node3)); - if(toReturn==NULL) - { - toReturn=createTriangle(node1,node2,node3); - } - return toReturn; -} - -//======================================================================= -//function : FindFace -//purpose : -//======================================================================= - -const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, int idnode3, - int idnode4) const -{ - const SMDS_MeshNode * node1=FindNode(idnode1); - const SMDS_MeshNode * node2=FindNode(idnode2); - const SMDS_MeshNode * node3=FindNode(idnode3); - const SMDS_MeshNode * node4=FindNode(idnode4); - if((node1==NULL)||(node2==NULL)||(node3==NULL)||(node4==NULL)) return NULL; - return FindFace(node1, node2, node3, node4); -} - -const SMDS_MeshFace* SMDS_Mesh::FindFace( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3, - const SMDS_MeshNode *node4) -{ - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - bool node2found, node3found, node4found; - SMDS_ElemIteratorPtr it1=node1->facesIterator(); - while(it1->more()) - { - face=static_cast(it1->next()); - if(face->NbNodes()!=4) continue; - SMDS_ElemIteratorPtr it2=face->nodesIterator(); - node2found=false; - node3found=false; - node4found=false; - while(it2->more()) - { - node=it2->next(); - if(node->GetID()==node2->GetID()) node2found=true; - if(node->GetID()==node3->GetID()) node3found=true; - if(node->GetID()==node4->GetID()) node4found=true; - } - if(node2found&&node3found&&node4found) - return face; - } - return NULL; -} - -SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate( - const SMDS_MeshNode *node1, - const SMDS_MeshNode *node2, - const SMDS_MeshNode *node3, - const SMDS_MeshNode *node4) -{ - SMDS_MeshFace * toReturn=NULL; - toReturn=const_cast(FindFace(node1,node2,node3,node4)); - if(toReturn==NULL) - { - toReturn=createQuadrangle(node1,node2,node3,node4); - } - return toReturn; -} - -//======================================================================= -//function : FindElement -//purpose : -//======================================================================= - -const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const -{ - return myElementIDFactory->MeshElement(IDelem); -} - -//======================================================================= -//function : FindFace -//purpose : find polygon -//======================================================================= - -const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector nodes_ids) const -{ - int nbnodes = nodes_ids.size(); - std::vector poly_nodes (nbnodes); - for (int inode = 0; inode < nbnodes; inode++) { - const SMDS_MeshNode * node = FindNode(nodes_ids[inode]); - if (node == NULL) return NULL; - } - return FindFace(poly_nodes); -} - -const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector nodes) -{ - int nbNodes = nodes.size(); - if (nbNodes < 1) return NULL; - - bool isFound = true; - const SMDS_MeshFace * face; - set faces; - - for (int inode = 0; inode < nbNodes && isFound; inode++) { - set new_faces; - - SMDS_ElemIteratorPtr itF = nodes[inode]->facesIterator(); - while (itF->more()) { - face = static_cast(itF->next()); - if (face->NbNodes() == nbNodes) { - if (inode == 0 || faces.find(face) != faces.end()) { - new_faces.insert(face); - } - } - } - faces = new_faces; - if (new_faces.size() == 0) { - isFound = false; - } - } - - if (isFound) - return face; - - return NULL; -} - -//======================================================================= -//function : DumpNodes -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpNodes() const -{ - MESSAGE("dump nodes of mesh : "); - SMDS_NodeIteratorPtr itnode=nodesIterator(); - while(itnode->more()) MESSAGE(itnode->next()); -} - -//======================================================================= -//function : DumpEdges -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpEdges() const -{ - MESSAGE("dump edges of mesh : "); - SMDS_EdgeIteratorPtr itedge=edgesIterator(); - while(itedge->more()) MESSAGE(itedge->next()); -} - -//======================================================================= -//function : DumpFaces -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpFaces() const -{ - MESSAGE("dump faces of mesh : "); - SMDS_FaceIteratorPtr itface=facesIterator(); - while(itface->more()) MESSAGE(itface->next()); -} - -//======================================================================= -//function : DumpVolumes -//purpose : -//======================================================================= - -void SMDS_Mesh::DumpVolumes() const -{ - MESSAGE("dump volumes of mesh : "); - SMDS_VolumeIteratorPtr itvol=volumesIterator(); - while(itvol->more()) MESSAGE(itvol->next()); -} - -//======================================================================= -//function : DebugStats -//purpose : -//======================================================================= - -void SMDS_Mesh::DebugStats() const -{ - MESSAGE("Debug stats of mesh : "); - - MESSAGE("===== NODES ====="<more()) - { - const SMDS_MeshNode *node = itnode->next(); - - sizeofnodes += sizeof(*node); - - SMDS_ElemIteratorPtr it = node->GetInverseElementIterator(); - while(it->more()) - { - const SMDS_MeshElement *me = it->next(); - sizeofnodes += sizeof(me); - } - - } - - SMDS_FaceIteratorPtr itface=facesIterator(); - while(itface->more()) - { - const SMDS_MeshElement *face = itface->next(); - sizeoffaces += sizeof(*face); - - } - MESSAGE("total size of node elements = " << sizeofnodes);; - MESSAGE("total size of face elements = " << sizeoffaces);; - - //#endif -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of nodes -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbNodes() const -{ - return myNodes.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of edges (including construction edges) -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbEdges() const -{ - return myEdges.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of faces (including construction faces) -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbFaces() const -{ - return myFaces.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of volumes -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbVolumes() const -{ - return myVolumes.Size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of child mesh of this mesh. -/// Note that the tree structure of SMDS_Mesh seems to be unused in this version -/// (2003-09-08) of SMESH -/////////////////////////////////////////////////////////////////////////////// -int SMDS_Mesh::NbSubMesh() const -{ - return myChildren.size(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Destroy the mesh and all its elements -/// All pointer on elements owned by this mesh become illegals. -/////////////////////////////////////////////////////////////////////////////// -SMDS_Mesh::~SMDS_Mesh() -{ - list::iterator itc=myChildren.begin(); - while(itc!=myChildren.end()) - { - delete *itc; - itc++; - } - - SetOfNodes::Iterator itn(myNodes); - for (; itn.More(); itn.Next()) - delete itn.Value(); - - SetOfEdges::Iterator ite(myEdges); - for (; ite.More(); ite.Next()) - { - SMDS_MeshElement* elem = ite.Value(); - if(myParent!=NULL) - myElementIDFactory->ReleaseID(elem->GetID()); - delete elem; - } - - SetOfFaces::Iterator itf(myFaces); - for (; itf.More(); itf.Next()) - { - SMDS_MeshElement* elem = itf.Value(); - if(myParent!=NULL) - myElementIDFactory->ReleaseID(elem->GetID()); - delete elem; - } - - SetOfVolumes::Iterator itv(myVolumes); - for (; itv.More(); itv.Next()) - { - SMDS_MeshElement* elem = itv.Value(); - if(myParent!=NULL) - myElementIDFactory->ReleaseID(elem->GetID()); - delete elem; - } - - if(myParent==NULL) - { - delete myNodeIDFactory; - delete myElementIDFactory; - } -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return true if this mesh create faces with edges. -/// A false returned value mean that faces are created with nodes. A concequence -/// is, iteration on edges (SMDS_Element::edgesIterator) will be unavailable. -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::hasConstructionEdges() -{ - return myHasConstructionEdges; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return true if this mesh create volumes with faces -/// A false returned value mean that volumes are created with nodes or edges. -/// (see hasConstructionEdges) -/// A concequence is, iteration on faces (SMDS_Element::facesIterator) will be -/// unavailable. -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::hasConstructionFaces() -{ - return myHasConstructionFaces; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return true if nodes are linked to the finit elements, they are belonging to. -/// Currently, It always return true. -/////////////////////////////////////////////////////////////////////////////// -bool SMDS_Mesh::hasInverseElements() -{ - return myHasInverseElements; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Make this mesh creating construction edges (see hasConstructionEdges) -/// @param b true to have construction edges, else false. -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::setConstructionEdges(bool b) -{ - myHasConstructionEdges=b; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Make this mesh creating construction faces (see hasConstructionFaces) -/// @param b true to have construction faces, else false. -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::setConstructionFaces(bool b) -{ - myHasConstructionFaces=b; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Make this mesh creating link from nodes to elements (see hasInverseElements) -/// @param b true to link nodes to elements, else false. -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::setInverseElements(bool b) -{ - if(!b) MESSAGE("Error : inverseElement=false not implemented"); - myHasInverseElements=b; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return an iterator on nodes of the current mesh factory -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyNodeIterator:public SMDS_NodeIterator -{ - SMDS_ElemIteratorPtr myIterator; - public: - SMDS_Mesh_MyNodeIterator(const SMDS_ElemIteratorPtr& it):myIterator(it) - {} - - bool more() - { - return myIterator->more(); - } - - const SMDS_MeshNode* next() - { - return static_cast(myIterator->next()); - } -}; - -SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const -{ - return SMDS_NodeIteratorPtr - (new SMDS_Mesh_MyNodeIterator(myNodeIDFactory->elementsIterator())); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return an iterator on elements of the current mesh factory -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator() const -{ - return myElementIDFactory->elementsIterator(); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return an iterator on edges of the current mesh. -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyEdgeIterator:public SMDS_EdgeIterator -{ - typedef SMDS_Mesh::SetOfEdges SetOfEdges; - SetOfEdges::Iterator myIterator; - public: - SMDS_Mesh_MyEdgeIterator(const SetOfEdges& s):myIterator(s) - {} - - bool more() - { - while(myIterator.More()) - { - if(myIterator.Value()->GetID()!=-1) - return true; - myIterator.Next(); - } - return false; - } - - const SMDS_MeshEdge* next() - { - const SMDS_MeshEdge* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const -{ - return SMDS_EdgeIteratorPtr(new SMDS_Mesh_MyEdgeIterator(myEdges)); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return an iterator on faces of the current mesh. -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyFaceIterator:public SMDS_FaceIterator -{ - typedef SMDS_Mesh::SetOfFaces SetOfFaces; - SetOfFaces::Iterator myIterator; - public: - SMDS_Mesh_MyFaceIterator(const SetOfFaces& s):myIterator(s) - {} - - bool more() - { - while(myIterator.More()) - { - if(myIterator.Value()->GetID()!=-1) - return true; - myIterator.Next(); - } - return false; - } - - const SMDS_MeshFace* next() - { - const SMDS_MeshFace* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const -{ - return SMDS_FaceIteratorPtr(new SMDS_Mesh_MyFaceIterator(myFaces)); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return an iterator on volumes of the current mesh. -/////////////////////////////////////////////////////////////////////////////// -class SMDS_Mesh_MyVolumeIterator:public SMDS_VolumeIterator -{ - typedef SMDS_Mesh::SetOfVolumes SetOfVolumes; - SetOfVolumes::Iterator myIterator; - public: - SMDS_Mesh_MyVolumeIterator(const SetOfVolumes& s):myIterator(s) - {} - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshVolume* next() - { - const SMDS_MeshVolume* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator() const -{ - return SMDS_VolumeIteratorPtr(new SMDS_Mesh_MyVolumeIterator(myVolumes)); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Do intersection of sets (more than 2) -/////////////////////////////////////////////////////////////////////////////// -static set * intersectionOfSets( - set vs[], int numberOfSets) -{ - set* rsetA=new set(vs[0]); - set* rsetB; - - for(int i=0; i(); - set_intersection( - rsetA->begin(), rsetA->end(), - vs[i+1].begin(), vs[i+1].end(), - inserter(*rsetB, rsetB->begin())); - delete rsetA; - rsetA=rsetB; - } - return rsetA; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the list of finit elements owning the given element -/////////////////////////////////////////////////////////////////////////////// -static set * getFinitElements(const SMDS_MeshElement * element) -{ - int numberOfSets=element->NbNodes(); - set *initSet = new set[numberOfSets]; - - SMDS_ElemIteratorPtr itNodes=element->nodesIterator(); - - int i=0; - while(itNodes->more()) - { - const SMDS_MeshNode * n=static_cast(itNodes->next()); - SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator(); - - //initSet[i]=set(); - while(itFe->more()) - initSet[i].insert(itFe->next()); - - i++; - } - set *retSet=intersectionOfSets(initSet, numberOfSets); - delete [] initSet; - return retSet; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the list of nodes used only by the given elements -/////////////////////////////////////////////////////////////////////////////// -static set * getExclusiveNodes( - set& elements) -{ - set * toReturn=new set(); - set::iterator itElements=elements.begin(); - - while(itElements!=elements.end()) - { - SMDS_ElemIteratorPtr itNodes = (*itElements)->nodesIterator(); - itElements++; - - while(itNodes->more()) - { - const SMDS_MeshNode * n=static_cast(itNodes->next()); - SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator(); - set s; - while(itFe->more()) - s.insert(itFe->next()); - if(s==elements) toReturn->insert(n); - } - } - return toReturn; -} - -/////////////////////////////////////////////////////////////////////////////// -///Find the children of an element that are made of given nodes -///@param setOfChildren The set in which matching children will be inserted -///@param element The element were to search matching children -///@param nodes The nodes that the children must have to be selected -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren, - const SMDS_MeshElement * element, set& nodes) -{ - - switch(element->GetType()) - { - case SMDSAbs_Node: - MESSAGE("Internal Error: This should not append"); - break; - case SMDSAbs_Edge: - { - SMDS_ElemIteratorPtr itn=element->nodesIterator(); - while(itn->more()) - { - const SMDS_MeshElement * e=itn->next(); - if(nodes.find(e)!=nodes.end()) - { - setOfChildren.insert(element); - break; - } - } - } break; - case SMDSAbs_Face: - { - SMDS_ElemIteratorPtr itn=element->nodesIterator(); - while(itn->more()) - { - const SMDS_MeshElement * e=itn->next(); - if(nodes.find(e)!=nodes.end()) - { - setOfChildren.insert(element); - break; - } - } - if(hasConstructionEdges()) - { - SMDS_ElemIteratorPtr ite=element->edgesIterator(); - while(ite->more()) - addChildrenWithNodes(setOfChildren, ite->next(), nodes); - } - } break; - case SMDSAbs_Volume: - { - if(hasConstructionFaces()) - { - SMDS_ElemIteratorPtr ite=element->facesIterator(); - while(ite->more()) - addChildrenWithNodes(setOfChildren, ite->next(), nodes); - } - else if(hasConstructionEdges()) - { - SMDS_ElemIteratorPtr ite=element->edgesIterator(); - while(ite->more()) - addChildrenWithNodes(setOfChildren, ite->next(), nodes); - } - } - } -} - -/////////////////////////////////////////////////////////////////////////////// -///@param elem The element to delete -///@param removenodes if true remaining nodes will be removed -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, - const bool removenodes) -{ - list removedElems; - list removedNodes; - RemoveElement( elem, removedElems, removedNodes, removenodes ); -} - -/////////////////////////////////////////////////////////////////////////////// -///@param elem The element to delete -///@param removedElems contains all removed elements -///@param removedNodes contains all removed nodes -///@param removenodes if true remaining nodes will be removed -/////////////////////////////////////////////////////////////////////////////// -void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, - list& removedElems, - list& removedNodes, - bool removenodes) -{ - // get finite elements built on elem - set * s1; - if (!hasConstructionEdges() && elem->GetType() == SMDSAbs_Edge || - !hasConstructionFaces() && elem->GetType() == SMDSAbs_Face || - elem->GetType() == SMDSAbs_Volume) - { - s1 = new set(); - s1->insert(elem); - } - else - s1 = getFinitElements(elem); - - // get exclusive nodes (which would become free afterwards) - set * s2; - if (elem->GetType() == SMDSAbs_Node) // a node is removed - { - // do not remove nodes except elem - s2 = new set(); - s2->insert(elem); - removenodes = true; - } - else - s2 = getExclusiveNodes(*s1); - - // form the set of finite and construction elements to remove - set s3; - set::iterator it=s1->begin(); - while(it!=s1->end()) - { - addChildrenWithNodes(s3, *it ,*s2); - s3.insert(*it); - it++; - } - if(elem->GetType()!=SMDSAbs_Node) s3.insert(elem); - - // remove finite and construction elements - it=s3.begin(); - while(it!=s3.end()) - { - // Remove element from of its nodes - SMDS_ElemIteratorPtr itn=(*it)->nodesIterator(); - while(itn->more()) - { - SMDS_MeshNode * n = static_cast - (const_cast(itn->next())); - n->RemoveInverseElement( (*it) ); - } - - switch((*it)->GetType()) - { - case SMDSAbs_Node: - MESSAGE("Internal Error: This should not happen"); - break; - case SMDSAbs_Edge: - myEdges.Remove(static_cast - (const_cast(*it))); - break; - case SMDSAbs_Face: - myFaces.Remove(static_cast - (const_cast(*it))); - break; - case SMDSAbs_Volume: - myVolumes.Remove(static_cast - (const_cast(*it))); - break; - } - //MESSAGE( "SMDS: RM elem " << (*it)->GetID() ); - removedElems.push_back( (*it) ); - myElementIDFactory->ReleaseID((*it)->GetID()); - delete (*it); - it++; - } - - // remove exclusive (free) nodes - if(removenodes) - { - it=s2->begin(); - while(it!=s2->end()) - { - //MESSAGE( "SMDS: RM node " << (*it)->GetID() ); - myNodes.Remove(static_cast - (const_cast(*it))); - myNodeIDFactory->ReleaseID((*it)->GetID()); - removedNodes.push_back( (*it) ); - delete *it; - it++; - } - } - - delete s2; - delete s1; -} - -/*! - * Checks if the element is present in mesh. - * Useful to determine dead pointers. - */ -bool SMDS_Mesh::Contains (const SMDS_MeshElement* elem) const -{ - // we should not imply on validity of *elem, so iterate on containers - // of all types in the hope of finding somewhere there - SMDS_NodeIteratorPtr itn = nodesIterator(); - while (itn->more()) - if (elem == itn->next()) - return true; - SMDS_EdgeIteratorPtr ite = edgesIterator(); - while (ite->more()) - if (elem == ite->next()) - return true; - SMDS_FaceIteratorPtr itf = facesIterator(); - while (itf->more()) - if (elem == itf->next()) - return true; - SMDS_VolumeIteratorPtr itv = volumesIterator(); - while (itv->more()) - if (elem == itv->next()) - return true; - return false; -} - -//======================================================================= -//function : MaxNodeID -//purpose : -//======================================================================= - -int SMDS_Mesh::MaxNodeID() const -{ - return myNodeIDFactory->GetMaxID(); -} - -//======================================================================= -//function : MinNodeID -//purpose : -//======================================================================= - -int SMDS_Mesh::MinNodeID() const -{ - return myNodeIDFactory->GetMinID(); -} - -//======================================================================= -//function : MaxElementID -//purpose : -//======================================================================= - -int SMDS_Mesh::MaxElementID() const -{ - return myElementIDFactory->GetMaxID(); -} - -//======================================================================= -//function : MinElementID -//purpose : -//======================================================================= - -int SMDS_Mesh::MinElementID() const -{ - return myElementIDFactory->GetMinID(); -} - -//======================================================================= -//function : Renumber -//purpose : Renumber all nodes or elements. -//======================================================================= - -void SMDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - if ( deltaID == 0 ) - return; - - SMDS_MeshElementIDFactory * idFactory = - isNodes ? myNodeIDFactory : myElementIDFactory; - - // get existing elements in the order of ID increasing - map elemMap; - SMDS_ElemIteratorPtr idElemIt = idFactory->elementsIterator(); - while ( idElemIt->more() ) { - SMDS_MeshElement* elem = const_cast(idElemIt->next()); - int id = elem->GetID(); - elemMap.insert(map::value_type(id, elem)); - } - // release their ids - map::iterator elemIt = elemMap.begin(); - for ( ; elemIt != elemMap.end(); elemIt++ ) - { - int id = (*elemIt).first; - idFactory->ReleaseID( id ); - } - // set new IDs - int ID = startID; - elemIt = elemMap.begin(); - for ( ; elemIt != elemMap.end(); elemIt++ ) - { - idFactory->BindID( ID, (*elemIt).second ); - ID += deltaID; - } -} - -//======================================================================= -//function : GetElementType -//purpose : Return type of element or node with id -//======================================================================= - -SMDSAbs_ElementType SMDS_Mesh::GetElementType( const int id, const bool iselem ) const -{ - SMDS_MeshElement* elem = 0; - if( iselem ) - elem = myElementIDFactory->MeshElement( id ); - else - elem = myNodeIDFactory->MeshElement( id ); - - if( !elem ) - { - //throw SALOME_Exception(LOCALIZED ("this element isn't exist")); - return SMDSAbs_All; - } - else - return elem->GetType(); -} \ No newline at end of file diff --git a/src/SMDS/SMDS_Mesh.hxx b/src/SMDS/SMDS_Mesh.hxx deleted file mode 100644 index 612082ce4..000000000 --- a/src/SMDS/SMDS_Mesh.hxx +++ /dev/null @@ -1,362 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_Mesh.hxx -// Module : SMESH - -#ifndef _SMDS_Mesh_HeaderFile -#define _SMDS_Mesh_HeaderFile - -#include "SMDS_MeshNode.hxx" -#include "SMDS_MeshEdge.hxx" -#include "SMDS_MeshFace.hxx" -#include "SMDS_MeshVolume.hxx" -#include "SMDS_MeshElementIDFactory.hxx" -#include "SMDS_ElemIterator.hxx" -#include - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -#include -#include -#include - -typedef SMDS_Iterator SMDS_NodeIterator; -typedef boost::shared_ptr > SMDS_NodeIteratorPtr; -typedef SMDS_Iterator SMDS_EdgeIterator; -typedef boost::shared_ptr > SMDS_EdgeIteratorPtr; -typedef SMDS_Iterator SMDS_FaceIterator; -typedef boost::shared_ptr > SMDS_FaceIteratorPtr; -typedef SMDS_Iterator SMDS_VolumeIterator; -typedef boost::shared_ptr > SMDS_VolumeIteratorPtr; - -class SMDS_WNT_EXPORT SMDS_Mesh:public SMDS_MeshObject{ -public: - - SMDS_Mesh(); - - SMDS_NodeIteratorPtr nodesIterator() const; - SMDS_EdgeIteratorPtr edgesIterator() const; - SMDS_FaceIteratorPtr facesIterator() const; - SMDS_VolumeIteratorPtr volumesIterator() const; - SMDS_ElemIteratorPtr elementsIterator() const; - - SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const; - - SMDS_Mesh *AddSubMesh(); - - virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); - virtual SMDS_MeshNode* AddNode(double x, double y, double z); - - virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); - virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID); - virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - - virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID); - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3); - - virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID); - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3); - - virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4, int ID); - virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1, - const SMDS_MeshEdge * e2, - const SMDS_MeshEdge * e3, - const SMDS_MeshEdge * e4); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int n6, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6); - - virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int n6, int n7, int n8, int ID); - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, - int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8); - - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4); - - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5); - - virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6, int ID); - virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, - const SMDS_MeshFace * f2, - const SMDS_MeshFace * f3, - const SMDS_MeshFace * f4, - const SMDS_MeshFace * f5, - const SMDS_MeshFace * f6); - - virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes_ids, - const int ID); - - virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector nodes, - const int ID); - - virtual SMDS_MeshFace* AddPolygonalFace (std::vector nodes); - - virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID - (std::vector nodes_ids, - std::vector quantities, - const int ID); - - virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID - (std::vector nodes, - std::vector quantities, - const int ID); - - virtual SMDS_MeshVolume* AddPolyhedralVolume - (std::vector nodes, - std::vector quantities); - - virtual void RemoveElement(const SMDS_MeshElement * elem, - std::list& removedElems, - std::list& removedNodes, - const bool removenodes = false); - virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false); - virtual void RemoveNode(const SMDS_MeshNode * node); - virtual void RemoveEdge(const SMDS_MeshEdge * edge); - virtual void RemoveFace(const SMDS_MeshFace * face); - virtual void RemoveVolume(const SMDS_MeshVolume * volume); - - virtual bool RemoveFromParent(); - virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh); - - static bool ChangeElementNodes(const SMDS_MeshElement * elem, - const SMDS_MeshNode * nodes[], - const int nbnodes); - static bool ChangePolyhedronNodes(const SMDS_MeshElement * elem, - std::vector nodes, - std::vector quantities); - - virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1); - // Renumber all nodes or elements. - - const SMDS_MeshNode *FindNode(int idnode) const; - const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const; - const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const; - const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const; - const SMDS_MeshElement *FindElement(int IDelem) const; - static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3); - static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3, - const SMDS_MeshNode *n4); - - const SMDS_MeshFace *FindFace(std::vector nodes_ids) const; - static const SMDS_MeshFace* FindFace(std::vector nodes); - - int MaxNodeID() const; - int MinNodeID() const; - int MaxElementID() const; - int MinElementID() const; - - - int NbNodes() const; - int NbEdges() const; - int NbFaces() const; - int NbVolumes() const; - int NbSubMesh() const; - void DumpNodes() const; - void DumpEdges() const; - void DumpFaces() const; - void DumpVolumes() const; - void DebugStats() const; - SMDS_Mesh *boundaryFaces(); - SMDS_Mesh *boundaryEdges(); - virtual ~SMDS_Mesh(); - bool hasConstructionEdges(); - bool hasConstructionFaces(); - bool hasInverseElements(); - void setConstructionEdges(bool); - void setConstructionFaces(bool); - void setInverseElements(bool); - - /*! - * Checks if the element is present in mesh. - * Useful to determine dead pointers. - * Use this function for debug purpose only! Do not check in the code - * using it even in _DEBUG_ mode - */ - bool Contains (const SMDS_MeshElement* elem) const; - - typedef NCollection_Map SetOfNodes; - typedef NCollection_Map SetOfEdges; - typedef NCollection_Map SetOfFaces; - typedef NCollection_Map SetOfVolumes; - -private: - SMDS_Mesh(SMDS_Mesh * parent); - - SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3); - SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4); - SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3); - SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3, - const SMDS_MeshNode *n4); - - bool registerElement(int ID, SMDS_MeshElement * element); - - void addChildrenWithNodes(std::set& setOfChildren, - const SMDS_MeshElement * element, - std::set& nodes); - - // Fields PRIVATE - - SetOfNodes myNodes; - SetOfEdges myEdges; - SetOfFaces myFaces; - SetOfVolumes myVolumes; - SMDS_Mesh *myParent; - std::list myChildren; - SMDS_MeshElementIDFactory *myNodeIDFactory; - SMDS_MeshElementIDFactory *myElementIDFactory; - - bool myHasConstructionEdges; - bool myHasConstructionFaces; - bool myHasInverseElements; -}; - - -#endif diff --git a/src/SMDS/SMDS_MeshEdge.cxx b/src/SMDS/SMDS_MeshEdge.cxx deleted file mode 100644 index 66c8ae3d5..000000000 --- a/src/SMDS/SMDS_MeshEdge.cxx +++ /dev/null @@ -1,150 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshEdge.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshEdge.hxx" -#include "SMDS_IteratorOfElements.hxx" -#include "SMDS_MeshNode.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshEdge -//purpose : -//======================================================================= - -SMDS_MeshEdge::SMDS_MeshEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) -{ - myNodes[0]=node1; - myNodes[1]=node2; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_MeshEdge::Print(ostream & OS) const -{ - OS << "edge <" << GetID() << "> : (" << myNodes[0] << " , " << myNodes[1] << - ") " << endl; -} - -int SMDS_MeshEdge::NbNodes() const -{ - return 2; -} - -int SMDS_MeshEdge::NbEdges() const -{ - return 1; -} - -SMDSAbs_ElementType SMDS_MeshEdge::GetType() const -{ - return SMDSAbs_Edge; -} - -class SMDS_MeshEdge_MyNodeIterator:public SMDS_ElemIterator -{ - const SMDS_MeshNode *const* myNodes; - int myIndex; - public: - SMDS_MeshEdge_MyNodeIterator(const SMDS_MeshNode * const* nodes): - myNodes(nodes),myIndex(0) {} - - bool more() - { - return myIndex<2; - } - - const SMDS_MeshElement* next() - { - myIndex++; - return myNodes[myIndex-1]; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshEdge:: - elementsIterator(SMDSAbs_ElementType type) const -{ - switch(type) - { - case SMDSAbs_Edge: - return SMDS_MeshElement::elementsIterator(SMDSAbs_Edge); - case SMDSAbs_Node: - return SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes)); - default: - return SMDS_ElemIteratorPtr - (new SMDS_IteratorOfElements - (this,type, SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes)))); - } -} - -bool operator<(const SMDS_MeshEdge & e1, const SMDS_MeshEdge & e2) -{ - int id11=e1.myNodes[0]->GetID(); - int id21=e2.myNodes[0]->GetID(); - int id12=e1.myNodes[1]->GetID(); - int id22=e2.myNodes[1]->GetID(); - int tmp; - - if(id11>=id12) - { - tmp=id11; - id11=id12; - id12=tmp; - } - if(id21>=id22) - { - tmp=id21; - id21=id22; - id22=tmp; - } - - if(id11 - -class SMDS_MeshEdge:public SMDS_MeshElement -{ - - public: - SMDS_MeshEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2); - bool ChangeNodes(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2); - void Print(std::ostream & OS) const; - - SMDSAbs_ElementType GetType() const; - int NbNodes() const; - int NbEdges() const; - friend bool operator<(const SMDS_MeshEdge& e1, const SMDS_MeshEdge& e2); - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - const SMDS_MeshNode* myNodes[2]; - -}; -#endif diff --git a/src/SMDS/SMDS_MeshElement.cxx b/src/SMDS/SMDS_MeshElement.cxx deleted file mode 100644 index 8d4d9b75d..000000000 --- a/src/SMDS/SMDS_MeshElement.cxx +++ /dev/null @@ -1,194 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_MeshEdge.hxx" -#include "SMDS_MeshFace.hxx" -#include "SMDS_MeshVolume.hxx" -#include "utilities.h" - -using namespace std; - -SMDS_MeshElement::SMDS_MeshElement(int ID):myID(ID) -{ -} - -void SMDS_MeshElement::Print(ostream & OS) const -{ - OS << "dump of mesh element" << endl; -} - -ostream & operator <<(ostream & OS, const SMDS_MeshElement * ME) -{ - ME->Print(OS); - return OS; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on nodes owned by the element. -/// This method call elementsIterator(). -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_MeshElement::nodesIterator() const -{ - return elementsIterator(SMDSAbs_Node); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on edges linked with or owned by the element. -/// This method call elementsIterator(). -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_MeshElement::edgesIterator() const -{ - return elementsIterator(SMDSAbs_Edge); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Create an iterator which iterate on faces linked with or owned by the element. -/// This method call elementsIterator(). -/////////////////////////////////////////////////////////////////////////////// -SMDS_ElemIteratorPtr SMDS_MeshElement::facesIterator() const -{ - return elementsIterator(SMDSAbs_Face); -} - -/////////////////////////////////////////////////////////////////////////////// -///Return The number of nodes owned by the current element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::NbNodes() const -{ - int nbnodes=0; - SMDS_ElemIteratorPtr it=nodesIterator(); - while(it->more()) - { - it->next(); - nbnodes++; - } - return nbnodes; -} - -/////////////////////////////////////////////////////////////////////////////// -///Return the number of edges owned by or linked with the current element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::NbEdges() const -{ - int nbedges=0; - SMDS_ElemIteratorPtr it=edgesIterator(); - while(it->more()) - { - it->next(); - nbedges++; - } - return nbedges; -} - -/////////////////////////////////////////////////////////////////////////////// -///Return the number of faces owned by or linked with the current element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::NbFaces() const -{ - int nbfaces=0; - SMDS_ElemIteratorPtr it=facesIterator(); - while(it->more()) - { - it->next(); - nbfaces++; - } - return nbfaces; -} - -/////////////////////////////////////////////////////////////////////////////// -///Create an iterator which iterate on elements linked with the current element. -///@param type The of elements on which you want to iterate -///@return A smart pointer to iterator, you are not to take care of freeing memory -/////////////////////////////////////////////////////////////////////////////// -class SMDS_MeshElement_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshElement * myElement; - bool myMore; - public: - SMDS_MeshElement_MyIterator(const SMDS_MeshElement * element): - myElement(element),myMore(true) {} - - bool more() - { - return myMore; - } - - const SMDS_MeshElement* next() - { - myMore=false; - return myElement; - } -}; -SMDS_ElemIteratorPtr SMDS_MeshElement:: - elementsIterator(SMDSAbs_ElementType type) const -{ - /** @todo Check that iterator in the child classes return elements - in the same order for each different implementation (i.e: SMDS_VolumeOfNodes - and SMDS_VolumeOfFaces */ - - if(type==GetType()) - return SMDS_ElemIteratorPtr(new SMDS_MeshElement_MyIterator(this)); - else - { - MESSAGE("Iterator not implemented"); - return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL); - } -} - -/////////////////////////////////////////////////////////////////////////////// -///Return the ID of the element -/////////////////////////////////////////////////////////////////////////////// -int SMDS_MeshElement::GetID() const -{ - return myID; -} - -bool operator<(const SMDS_MeshElement& e1, const SMDS_MeshElement& e2) -{ - if(e1.GetType()!=e2.GetType()) return false; - switch(e1.GetType()) - { - case SMDSAbs_Node: - return static_cast(e1) < - static_cast(e2); - - case SMDSAbs_Edge: - return static_cast(e1) < - static_cast(e2); - - case SMDSAbs_Face: - return static_cast(e1) < - static_cast(e2); - - case SMDSAbs_Volume: - return static_cast(e1) < - static_cast(e2); - - default : MESSAGE("Internal Error"); - } - return false; -} diff --git a/src/SMDS/SMDS_MeshElement.hxx b/src/SMDS/SMDS_MeshElement.hxx deleted file mode 100644 index 73870b707..000000000 --- a/src/SMDS/SMDS_MeshElement.hxx +++ /dev/null @@ -1,87 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshElement.hxx -// Module : SMESH - -#ifndef _SMDS_MeshElement_HeaderFile -#define _SMDS_MeshElement_HeaderFile - -#include "SMDSAbs_ElementType.hxx" -#include "SMDS_MeshObject.hxx" -#include "SMDS_ElemIterator.hxx" -#include "SMDS_MeshElementIDFactory.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -#include -#include - -class SMDS_MeshNode; -class SMDS_MeshEdge; -class SMDS_MeshFace; - -/////////////////////////////////////////////////////////////////////////////// -/// Base class for elements -/////////////////////////////////////////////////////////////////////////////// -class SMDS_WNT_EXPORT SMDS_MeshElement:public SMDS_MeshObject -{ - - public: - SMDS_ElemIteratorPtr nodesIterator() const; - SMDS_ElemIteratorPtr edgesIterator() const; - SMDS_ElemIteratorPtr facesIterator() const; - virtual SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - virtual int NbNodes() const; - virtual int NbEdges() const; - virtual int NbFaces() const; - int GetID() const; - - ///Return the type of the current element - virtual SMDSAbs_ElementType GetType() const = 0; - virtual bool IsPoly() const { return false; }; - - friend std::ostream & operator <<(std::ostream & OS, const SMDS_MeshElement *); - friend bool SMDS_MeshElementIDFactory::BindID(int ID,SMDS_MeshElement*elem); - - protected: - SMDS_MeshElement(int ID=-1); - virtual void Print(std::ostream & OS) const; - - private: - int myID; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshElementIDFactory.cxx b/src/SMDS/SMDS_MeshElementIDFactory.cxx deleted file mode 100644 index 8fc09230b..000000000 --- a/src/SMDS/SMDS_MeshElementIDFactory.cxx +++ /dev/null @@ -1,169 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshElementIDFactory.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshElementIDFactory.hxx" -#include "SMDS_MeshElement.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshElementIDFactory -//purpose : -//======================================================================= -SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory(): - SMDS_MeshIDFactory(), - myMin(0), myMax(0) -{ -} - -//======================================================================= -//function : BindID -//purpose : -//======================================================================= -bool SMDS_MeshElementIDFactory::BindID(int ID, SMDS_MeshElement * elem) -{ - if (myIDElements.IsBound(ID)) - return false; - myIDElements.Bind(ID,elem); - elem->myID=ID; - updateMinMax (ID); - return true; -} - -//======================================================================= -//function : MeshElement -//purpose : -//======================================================================= -SMDS_MeshElement* SMDS_MeshElementIDFactory::MeshElement(int ID) -{ - if (!myIDElements.IsBound(ID)) - return NULL; - return myIDElements.Find(ID); -} - - -//======================================================================= -//function : GetFreeID -//purpose : -//======================================================================= -int SMDS_MeshElementIDFactory::GetFreeID() -{ - int ID; - do { - ID = SMDS_MeshIDFactory::GetFreeID(); - } while (myIDElements.IsBound(ID)); - return ID; -} - -//======================================================================= -//function : ReleaseID -//purpose : -//======================================================================= -void SMDS_MeshElementIDFactory::ReleaseID(const int ID) -{ - myIDElements.UnBind(ID); - SMDS_MeshIDFactory::ReleaseID(ID); - if (ID == myMax) - myMax = 0; - if (ID == myMin) - myMin = 0; -} - -//======================================================================= -//function : GetMaxID -//purpose : -//======================================================================= - -int SMDS_MeshElementIDFactory::GetMaxID() const -{ - if (myMax == 0) - updateMinMax(); - return myMax; -} - -//======================================================================= -//function : GetMinID -//purpose : -//======================================================================= - -int SMDS_MeshElementIDFactory::GetMinID() const -{ - if (myMin == 0) - updateMinMax(); - return myMin; -} - -//======================================================================= -//function : updateMinMax -//purpose : -//======================================================================= - -void SMDS_MeshElementIDFactory::updateMinMax() const -{ - myMin = IntegerLast(); - myMax = 0; - SMDS_IdElementMap::Iterator it(myIDElements); - for (; it.More(); it.Next()) - updateMinMax (it.Key()); - if (myMin == IntegerLast()) - myMin = 0; -} - -//======================================================================= -//function : elementsIterator -//purpose : Return an iterator on elements of the factory -//======================================================================= - -class SMDS_Fact_MyElemIterator:public SMDS_ElemIterator -{ - SMDS_IdElementMap::Iterator myIterator; - public: - SMDS_Fact_MyElemIterator(const SMDS_IdElementMap& s):myIterator(s) - {} - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current = myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshElementIDFactory::elementsIterator() const -{ - return SMDS_ElemIteratorPtr - (new SMDS_Fact_MyElemIterator(myIDElements)); -} diff --git a/src/SMDS/SMDS_MeshElementIDFactory.hxx b/src/SMDS/SMDS_MeshElementIDFactory.hxx deleted file mode 100644 index 526bcb5a0..000000000 --- a/src/SMDS/SMDS_MeshElementIDFactory.hxx +++ /dev/null @@ -1,63 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshElementIDFactory.hxx -// Module : SMESH - -#ifndef _SMDS_MeshElementIDFactory_HeaderFile -#define _SMDS_MeshElementIDFactory_HeaderFile - -#include "SMDS_MeshIDFactory.hxx" -#include "SMDS_ElemIterator.hxx" - -#include - -class SMDS_MeshElement; - -typedef NCollection_DataMap SMDS_IdElementMap; - -class SMDS_MeshElementIDFactory:public SMDS_MeshIDFactory -{ -public: - SMDS_MeshElementIDFactory(); - bool BindID(int ID, SMDS_MeshElement * elem); - SMDS_MeshElement * MeshElement(int ID); - virtual int GetFreeID(); - virtual void ReleaseID(int ID); - int GetMaxID() const; - int GetMinID() const; - SMDS_ElemIteratorPtr elementsIterator() const; -private: - void updateMinMax() const; - void updateMinMax(int id) const - { - if (id > myMax) myMax = id; - if (id < myMin) myMin = id; - } - - SMDS_IdElementMap myIDElements; - mutable int myMin, myMax; - -}; - -#endif diff --git a/src/SMDS/SMDS_MeshFace.cxx b/src/SMDS/SMDS_MeshFace.cxx deleted file mode 100644 index b7014293a..000000000 --- a/src/SMDS/SMDS_MeshFace.cxx +++ /dev/null @@ -1,27 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include "SMDS_MeshFace.hxx" - -SMDSAbs_ElementType SMDS_MeshFace::GetType() const -{ - return SMDSAbs_Face; -} diff --git a/src/SMDS/SMDS_MeshFace.hxx b/src/SMDS/SMDS_MeshFace.hxx deleted file mode 100644 index 36f2fa542..000000000 --- a/src/SMDS/SMDS_MeshFace.hxx +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshFace.hxx -// Module : SMESH - -#ifndef _SMDS_MeshFace_HeaderFile -#define _SMDS_MeshFace_HeaderFile - -#include "SMDS_MeshElement.hxx" - -class SMDS_MeshFace:public SMDS_MeshElement -{ - public: - SMDSAbs_ElementType GetType() const; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshGroup.cxx b/src/SMDS/SMDS_MeshGroup.cxx deleted file mode 100644 index 0cb481c50..000000000 --- a/src/SMDS/SMDS_MeshGroup.cxx +++ /dev/null @@ -1,163 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org or email : webmaster@opencascade.org -// -// -// -// File : SMDS_MeshGroup.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshGroup.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshGroup -//purpose : -//======================================================================= - -SMDS_MeshGroup::SMDS_MeshGroup(const SMDS_Mesh * theMesh, - const SMDSAbs_ElementType theType) - :myMesh(theMesh),myType(theType), myParent(NULL) -{ -} - -//======================================================================= -//function : SMDS_MeshGroup -//purpose : -//======================================================================= - -SMDS_MeshGroup::SMDS_MeshGroup(SMDS_MeshGroup * theParent, - const SMDSAbs_ElementType theType) - :myMesh(theParent->myMesh),myType(theType), myParent(theParent) -{ -} - -//======================================================================= -//function : AddSubGroup -//purpose : -//======================================================================= - -const SMDS_MeshGroup *SMDS_MeshGroup::AddSubGroup - (const SMDSAbs_ElementType theType) -{ - const SMDS_MeshGroup * subgroup = new SMDS_MeshGroup(this,theType); - myChildren.insert(myChildren.end(),subgroup); - return subgroup; -} - -//======================================================================= -//function : RemoveSubGroup -//purpose : -//======================================================================= - -bool SMDS_MeshGroup::RemoveSubGroup(const SMDS_MeshGroup * theGroup) -{ - bool found = false; - list::iterator itgroup; - for(itgroup=myChildren.begin(); itgroup!=myChildren.end(); itgroup++) - { - const SMDS_MeshGroup* subgroup=*itgroup; - if (subgroup == theGroup) - { - found = true; - myChildren.erase(itgroup); - } - } - - return found; -} - -//======================================================================= -//function : RemoveFromParent -//purpose : -//======================================================================= - -bool SMDS_MeshGroup::RemoveFromParent() -{ - - if (myParent==NULL) return false; - else - { - return (myParent->RemoveSubGroup(this)); - } -} -//======================================================================= -//function : Clear -//purpose : -//======================================================================= - -void SMDS_MeshGroup::Clear() -{ - myElements.clear(); - myType = SMDSAbs_All; -} - -//======================================================================= -//function : Add -//purpose : -//======================================================================= - -void SMDS_MeshGroup::Add(const SMDS_MeshElement * theElem) -{ - // the type of the group is determined by the first element added - if (myElements.empty()) myType = theElem->GetType(); - else if (theElem->GetType() != myType) - MESSAGE("SMDS_MeshGroup::Add : Type Mismatch "<GetType()<<"!="< - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_MeshGroup:public SMDS_MeshObject -{ - public: - SMDS_MeshGroup(const SMDS_Mesh * theMesh, - const SMDSAbs_ElementType theType = SMDSAbs_All); - const SMDS_MeshGroup * AddSubGroup - (const SMDSAbs_ElementType theType = SMDSAbs_All); - virtual bool RemoveSubGroup(const SMDS_MeshGroup* theGroup); - virtual bool RemoveFromParent(); - - const SMDS_Mesh* GetMesh() const { return myMesh; } - - void SetType (const SMDSAbs_ElementType theType); - void Clear(); - void Add(const SMDS_MeshElement * theElem); - void Remove(const SMDS_MeshElement * theElem); - bool IsEmpty() const { return myElements.empty(); } - int Extent() const { return myElements.size(); } - - SMDSAbs_ElementType GetType() const { return myType; } - - bool Contains(const SMDS_MeshElement * theElem) const; - - void InitIterator() const - { const_cast(myIterator) = myElements.begin(); } - - bool More() const { return myIterator != myElements.end(); } - - const SMDS_MeshElement* Next() const - { return *(const_cast(myIterator))++; } - - private: - SMDS_MeshGroup(SMDS_MeshGroup* theParent, - const SMDSAbs_ElementType theType = SMDSAbs_All); - - typedef std::set::const_iterator TIterator; - const SMDS_Mesh * myMesh; - SMDSAbs_ElementType myType; - std::set myElements; - SMDS_MeshGroup * myParent; - std::list myChildren; - TIterator myIterator; -}; -#endif diff --git a/src/SMDS/SMDS_MeshIDFactory.cxx b/src/SMDS/SMDS_MeshIDFactory.cxx deleted file mode 100644 index 536b2f783..000000000 --- a/src/SMDS/SMDS_MeshIDFactory.cxx +++ /dev/null @@ -1,83 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshIDFactory.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - - -#include "SMDS_MeshIDFactory.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshIDFactory -//purpose : -//======================================================================= - -SMDS_MeshIDFactory::SMDS_MeshIDFactory():myMaxID(0) -{ -} - -int SMDS_MeshIDFactory::GetFreeID() -{ - if (myPoolOfID.empty()) return ++myMaxID; - else - { - set::iterator i = myPoolOfID.begin(); - int ID = *i;//myPoolOfID.top(); - myPoolOfID.erase( i );//myPoolOfID.pop(); - return ID; - } -} - -//======================================================================= -//function : ReleaseID -//purpose : -//======================================================================= -void SMDS_MeshIDFactory::ReleaseID(const int ID) -{ - if ( ID > 0 ) - { - if ( ID < myMaxID ) - { - myPoolOfID.insert(ID); - } - else if ( ID == myMaxID ) - { - --myMaxID; - if ( !myPoolOfID.empty() ) // assure that myMaxID is not in myPoolOfID - { - set::iterator i = --myPoolOfID.end(); - while ( i != myPoolOfID.begin() && myMaxID == *i ) { - --myMaxID; --i; - } - if ( myMaxID == *i ) - --myMaxID; // begin of myPoolOfID reached - else - ++i; - myPoolOfID.erase( i, myPoolOfID.end() ); - } - } - } -} diff --git a/src/SMDS/SMDS_MeshIDFactory.hxx b/src/SMDS/SMDS_MeshIDFactory.hxx deleted file mode 100644 index 8a6425ac2..000000000 --- a/src/SMDS/SMDS_MeshIDFactory.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshIDFactory.hxx -// Module : SMESH - -#ifndef _SMDS_MeshIDFactory_HeaderFile -#define _SMDS_MeshIDFactory_HeaderFile - -#include "SMDS_MeshObject.hxx" -#include - - -class SMDS_MeshIDFactory:public SMDS_MeshObject -{ - public: - virtual int GetFreeID(); - virtual void ReleaseID(int ID); - - protected: - SMDS_MeshIDFactory(); - int myMaxID; - std::set myPoolOfID; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshNode.cxx b/src/SMDS/SMDS_MeshNode.cxx deleted file mode 100644 index 06ab12173..000000000 --- a/src/SMDS/SMDS_MeshNode.cxx +++ /dev/null @@ -1,246 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_MeshNode.hxx" -#include "SMDS_SpacePosition.hxx" -#include "SMDS_IteratorOfElements.hxx" - -using namespace std; - -//======================================================================= -//function : SMDS_MeshNode -//purpose : -//======================================================================= - -SMDS_MeshNode::SMDS_MeshNode(double x, double y, double z): - myX(x), myY(y), myZ(z), - myPosition(SMDS_SpacePosition::originSpacePosition()) -{ -} - -//======================================================================= -//function : RemoveInverseElement -//purpose : -//======================================================================= - -void SMDS_MeshNode::RemoveInverseElement(const SMDS_MeshElement * parent) -{ - NCollection_List::Iterator it(myInverseElements); - while (it.More()) { - const SMDS_MeshElement* elem = it.Value(); - if (elem == parent) - myInverseElements.Remove(it); - else - it.Next(); - } -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_MeshNode::Print(ostream & OS) const -{ - OS << "Node <" << GetID() << "> : X = " << myX << " Y = " - << myY << " Z = " << myZ << endl; -} - -//======================================================================= -//function : SetPosition -//purpose : -//======================================================================= - -void SMDS_MeshNode::SetPosition(const SMDS_PositionPtr& aPos) -{ - myPosition = aPos; -} - -//======================================================================= -//function : GetPosition -//purpose : -//======================================================================= - -const SMDS_PositionPtr& SMDS_MeshNode::GetPosition() const -{ - return myPosition; -} - -class SMDS_MeshNode_MyInvIterator:public SMDS_ElemIterator -{ - NCollection_List::Iterator myIterator; - public: - SMDS_MeshNode_MyInvIterator(const NCollection_List& s): - myIterator(s) - {} - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current=myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshNode:: - GetInverseElementIterator() const -{ - return SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyInvIterator(myInverseElements)); -} - -// Same as GetInverseElementIterator but the create iterator only return -// wanted type elements. -class SMDS_MeshNode_MyIterator:public SMDS_ElemIterator -{ - NCollection_List mySet; - NCollection_List::Iterator myIterator; - public: - SMDS_MeshNode_MyIterator(SMDSAbs_ElementType type, - const NCollection_List& s) - { - const SMDS_MeshElement * e; - bool toInsert; - NCollection_List::Iterator it(s); - for(; it.More(); it.Next()) - { - e=it.Value(); - switch(type) - { - case SMDSAbs_Edge: toInsert=true; break; - case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break; - case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break; - } - if(toInsert) mySet.Append(e); - } - myIterator.Init(mySet); - } - - bool more() - { - return myIterator.More() != Standard_False; - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current=myIterator.Value(); - myIterator.Next(); - return current; - } -}; - -SMDS_ElemIteratorPtr SMDS_MeshNode:: - elementsIterator(SMDSAbs_ElementType type) const -{ - if(type==SMDSAbs_Node) - return SMDS_MeshElement::elementsIterator(SMDSAbs_Node); - else - return SMDS_ElemIteratorPtr - (new SMDS_IteratorOfElements - (this,type, - SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyIterator(type, myInverseElements)))); -} - -int SMDS_MeshNode::NbNodes() const -{ - return 1; -} - -double SMDS_MeshNode::X() const -{ - return myX; -} - -double SMDS_MeshNode::Y() const -{ - return myY; -} - -double SMDS_MeshNode::Z() const -{ - return myZ; -} - -void SMDS_MeshNode::setXYZ(double x, double y, double z) -{ - myX=x; - myY=y; - myZ=z; -} - -SMDSAbs_ElementType SMDS_MeshNode::GetType() const -{ - return SMDSAbs_Node; -} - -//======================================================================= -//function : AddInverseElement -//purpose : -//======================================================================= -void SMDS_MeshNode::AddInverseElement(const SMDS_MeshElement* ME) -{ - NCollection_List::Iterator it(myInverseElements); - for (; it.More(); it.Next()) { - const SMDS_MeshElement* elem = it.Value(); - if (elem == ME) - return; - } - myInverseElements.Append(ME); -} - -//======================================================================= -//function : ClearInverseElements -//purpose : -//======================================================================= -void SMDS_MeshNode::ClearInverseElements() -{ - myInverseElements.Clear(); -} - -bool SMDS_MeshNode::emptyInverseElements() -{ - return myInverseElements.IsEmpty() != Standard_False; -} - -/////////////////////////////////////////////////////////////////////////////// -/// To be used with STL set -/////////////////////////////////////////////////////////////////////////////// -bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2) -{ - return e1.GetID() - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_MeshNode:public SMDS_MeshElement -{ - - public: - SMDS_MeshNode(double x, double y, double z); - void Print(std::ostream & OS) const; - double X() const; - double Y() const; - double Z() const; - void AddInverseElement(const SMDS_MeshElement * ME); - void RemoveInverseElement(const SMDS_MeshElement * parent); - void ClearInverseElements(); - bool emptyInverseElements(); - SMDS_ElemIteratorPtr GetInverseElementIterator() const; - void SetPosition(const SMDS_PositionPtr& aPos); - const SMDS_PositionPtr& GetPosition() const; - SMDSAbs_ElementType GetType() const; - int NbNodes() const; - void setXYZ(double x, double y, double z); - friend bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2); - - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - - private: - double myX, myY, myZ; - SMDS_PositionPtr myPosition; - NCollection_List myInverseElements; -}; - -#endif diff --git a/src/SMDS/SMDS_MeshObject.cxx b/src/SMDS/SMDS_MeshObject.cxx deleted file mode 100644 index b822b8098..000000000 --- a/src/SMDS/SMDS_MeshObject.cxx +++ /dev/null @@ -1,28 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshObject.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_MeshObject.hxx" diff --git a/src/SMDS/SMDS_MeshObject.hxx b/src/SMDS/SMDS_MeshObject.hxx deleted file mode 100644 index f734309cf..000000000 --- a/src/SMDS/SMDS_MeshObject.hxx +++ /dev/null @@ -1,48 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshObject.hxx -// Module : SMESH - -#ifndef _SMDS_MeshObject_HeaderFile -#define _SMDS_MeshObject_HeaderFile - - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_MeshObject -{ - public: - virtual ~SMDS_MeshObject() {} -}; -#endif diff --git a/src/SMDS/SMDS_MeshVolume.cxx b/src/SMDS/SMDS_MeshVolume.cxx deleted file mode 100644 index 561f0dccb..000000000 --- a/src/SMDS/SMDS_MeshVolume.cxx +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshVolume.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_MeshVolume.hxx" -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -SMDSAbs_ElementType SMDS_MeshVolume::GetType() const -{ - return SMDSAbs_Volume; -} - diff --git a/src/SMDS/SMDS_MeshVolume.hxx b/src/SMDS/SMDS_MeshVolume.hxx deleted file mode 100644 index c543c3001..000000000 --- a/src/SMDS/SMDS_MeshVolume.hxx +++ /dev/null @@ -1,38 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_MeshVolume.hxx -// Module : SMESH - -#ifndef _SMDS_MeshVolume_HeaderFile -#define _SMDS_MeshVolume_HeaderFile - -#include "SMDS_MeshElement.hxx" - -class SMDS_MeshVolume:public SMDS_MeshElement -{ - - public: - SMDSAbs_ElementType GetType() const; -}; -#endif diff --git a/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx b/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx deleted file mode 100644 index 38abf18c2..000000000 --- a/src/SMDS/SMDS_PolygonalFaceOfNodes.cxx +++ /dev/null @@ -1,174 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_PolygonalFaceOfNodes.hxx" - -#include "SMDS_IteratorOfElements.hxx" -//#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : Constructor -//purpose : -//======================================================================= -SMDS_PolygonalFaceOfNodes::SMDS_PolygonalFaceOfNodes - (std::vector nodes) -{ - myNodes = nodes; -} - -//======================================================================= -//function : GetType -//purpose : -//======================================================================= -SMDSAbs_ElementType SMDS_PolygonalFaceOfNodes::GetType() const -{ - return SMDSAbs_Face; - //return SMDSAbs_PolygonalFace; -} - -//======================================================================= -//function : ChangeNodes -//purpose : -//======================================================================= -bool SMDS_PolygonalFaceOfNodes::ChangeNodes (std::vector nodes) -{ - if (nodes.size() < 3) - return false; - - myNodes = nodes; - - return true; -} - -//======================================================================= -//function : ChangeNodes -//purpose : to support the same interface, as SMDS_FaceOfNodes -//======================================================================= -bool SMDS_PolygonalFaceOfNodes::ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes) -{ - if (nbNodes < 3) - return false; - - myNodes.resize(nbNodes); - int i = 0; - for (; i < nbNodes; i++) { - myNodes[i] = nodes[i]; - } - - return true; -} - -//======================================================================= -//function : NbNodes -//purpose : -//======================================================================= -int SMDS_PolygonalFaceOfNodes::NbNodes() const -{ - return myNodes.size(); -} - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= -int SMDS_PolygonalFaceOfNodes::NbEdges() const -{ - return NbNodes(); -} - -//======================================================================= -//function : NbFaces -//purpose : -//======================================================================= -int SMDS_PolygonalFaceOfNodes::NbFaces() const -{ - return 1; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= -void SMDS_PolygonalFaceOfNodes::Print(ostream & OS) const -{ - OS << "polygonal face <" << GetID() << " > : "; - int i, nbNodes = myNodes.size(); - for (i = 0; i < nbNodes - 1; i++) - OS << myNodes[i] << ","; - OS << myNodes[i] << ") " << endl; -} - -//======================================================================= -//function : elementsIterator -//purpose : -//======================================================================= -class SMDS_PolygonalFaceOfNodes_MyIterator:public SMDS_ElemIterator -{ - //const SMDS_MeshNode* const *mySet; - const std::vector mySet; - //int myLength; - int index; - public: - //SMDS_PolygonalFaceOfNodes_MyIterator(const SMDS_MeshNode* const *s, int l): - // mySet(s),myLength(l),index(0) {} - SMDS_PolygonalFaceOfNodes_MyIterator(const std::vector s): - mySet(s),index(0) {} - - bool more() - { - return index < mySet.size(); - } - - const SMDS_MeshElement* next() - { - index++; - return mySet[index-1]; - } -}; - -SMDS_ElemIteratorPtr SMDS_PolygonalFaceOfNodes::elementsIterator - (SMDSAbs_ElementType type) const -{ - switch(type) - { - case SMDSAbs_Face: - return SMDS_MeshElement::elementsIterator(SMDSAbs_Face); - case SMDSAbs_Node: - return SMDS_ElemIteratorPtr(new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes)); - case SMDSAbs_Edge: - MESSAGE("Error : edge iterator for SMDS_PolygonalFaceOfNodes not implemented"); - break; - default: - return SMDS_ElemIteratorPtr - (new SMDS_IteratorOfElements - (this,type,SMDS_ElemIteratorPtr - (new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes)))); - } - return SMDS_ElemIteratorPtr(); -} diff --git a/src/SMDS/SMDS_PolygonalFaceOfNodes.hxx b/src/SMDS/SMDS_PolygonalFaceOfNodes.hxx deleted file mode 100644 index 567746259..000000000 --- a/src/SMDS/SMDS_PolygonalFaceOfNodes.hxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef _SMDS_PolygonalFaceOfNodes_HeaderFile -#define _SMDS_PolygonalFaceOfNodes_HeaderFile - -#include "SMDS_MeshFace.hxx" -//#include "SMDS_FaceOfNodes.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_Iterator.hxx" - -#include - -//class SMDS_PolygonalFaceOfNodes:public SMDS_FaceOfNodes -class SMDS_PolygonalFaceOfNodes:public SMDS_MeshFace -{ - public: - SMDS_PolygonalFaceOfNodes (std::vector nodes); - - virtual SMDSAbs_ElementType GetType() const; - virtual bool IsPoly() const { return true; }; - - bool ChangeNodes (std::vector nodes); - - bool ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes); - // to support the same interface, as SMDS_FaceOfNodes - - virtual int NbNodes() const; - virtual int NbEdges() const; - virtual int NbFaces() const; - - virtual void Print (std::ostream & OS) const; - - protected: - virtual SMDS_ElemIteratorPtr elementsIterator (SMDSAbs_ElementType type) const; - - private: - std::vector myNodes; -}; - -#endif diff --git a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx b/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx deleted file mode 100644 index 84ce2134d..000000000 --- a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx +++ /dev/null @@ -1,190 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_PolyhedralVolumeOfNodes.hxx" -#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -#include - -using namespace std; - -//======================================================================= -//function : Constructor -//purpose : Create a volume of many faces -//======================================================================= -SMDS_PolyhedralVolumeOfNodes::SMDS_PolyhedralVolumeOfNodes - (std::vector nodes, - std::vector quantities) -: SMDS_VolumeOfNodes(NULL, NULL, NULL, NULL) -{ - ChangeNodes(nodes, quantities); -} - -//======================================================================= -//function : GetType -//purpose : -//======================================================================= -SMDSAbs_ElementType SMDS_PolyhedralVolumeOfNodes::GetType() const -{ -// return SMDSAbs_PolyhedralVolume; - return SMDSAbs_Volume; -} - -//======================================================================= -//function : ChangeNodes -//purpose : -//======================================================================= -bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (std::vector nodes, - std::vector quantities) -{ - myNodesByFaces = nodes; - myQuantities = quantities; - - // Init fields of parent class - int aNbNodes = 0; - std::set aSet; - int nodes_len = nodes.size(); - for (int j = 0; j < nodes_len; j++) { - if (aSet.find(nodes[j]) == aSet.end()) { - aSet.insert(nodes[j]); - aNbNodes++; - } - } - - int k = 0; -#ifndef WNT - const SMDS_MeshNode* aNodes [aNbNodes]; -#else - const SMDS_MeshNode** aNodes = (const SMDS_MeshNode **)new SMDS_MeshNode*[aNbNodes]; -#endif - std::set::iterator anIter = aSet.begin(); - for (; anIter != aSet.end(); anIter++, k++) { - aNodes[k] = *anIter; - } - - //SMDS_VolumeOfNodes::ChangeNodes(aNodes, aNbNodes); - delete [] myNodes; - //myNbNodes = nodes.size(); - myNbNodes = aNbNodes; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - for (int i = 0; i < myNbNodes; i++) { - //myNodes[i] = nodes[i]; - myNodes[i] = aNodes[i]; - } - -#ifdef WNT - delete [] aNodes; -#endif - - return true; -} - -//======================================================================= -//function : NbEdges -//purpose : -//======================================================================= -int SMDS_PolyhedralVolumeOfNodes::NbEdges() const -{ - int nbEdges = 0; - - for (int ifa = 0; ifa < myQuantities.size(); ifa++) { - nbEdges += myQuantities[ifa]; - } - nbEdges /= 2; - - return nbEdges; -} - -//======================================================================= -//function : NbFaces -//purpose : -//======================================================================= -int SMDS_PolyhedralVolumeOfNodes::NbFaces() const -{ - return myQuantities.size(); -} - -//======================================================================= -//function : NbFaceNodes -//purpose : -//======================================================================= -int SMDS_PolyhedralVolumeOfNodes::NbFaceNodes (const int face_ind) const -{ - if (face_ind < 1 || myQuantities.size() < face_ind) - return 0; - return myQuantities[face_ind - 1]; -} - -//======================================================================= -//function : GetFaceNode -//purpose : -//======================================================================= -const SMDS_MeshNode* SMDS_PolyhedralVolumeOfNodes::GetFaceNode (const int face_ind, - const int node_ind) const -{ - if (node_ind < 1 || NbFaceNodes(face_ind) < node_ind) - return NULL; - - int i, first_node = 0; - for (i = 0; i < face_ind - 1; i++) { - first_node += myQuantities[i]; - } - - return myNodesByFaces[first_node + node_ind - 1]; -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= -void SMDS_PolyhedralVolumeOfNodes::Print (ostream & OS) const -{ - OS << "polyhedral volume <" << GetID() << "> : "; - - int faces_len = myQuantities.size(); - //int nodes_len = myNodesByFaces.size(); - int cur_first_node = 0; - - int i, j; - for (i = 0; i < faces_len; i++) { - OS << "face_" << i << " ("; - for (j = 0; j < myQuantities[i] - 1; j++) { - OS << myNodesByFaces[cur_first_node + j] << ","; - } - OS << myNodesByFaces[cur_first_node + j] << ") "; - cur_first_node += myQuantities[i]; - } -} - -//======================================================================= -//function : ChangeNodes -//purpose : usage disabled -//======================================================================= -bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes) -{ - return false; -} diff --git a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx b/src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx deleted file mode 100644 index baecaf339..000000000 --- a/src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx +++ /dev/null @@ -1,77 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_PolyhedralVolumeOfNodes.hxx -// Module : SMESH - -#ifndef _SMDS_PolyhedralVolumeOfNodes_HeaderFile -#define _SMDS_PolyhedralVolumeOfNodes_HeaderFile - -#include "SMDS_VolumeOfNodes.hxx" - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif -class SMDS_WNT_EXPORT SMDS_PolyhedralVolumeOfNodes:public SMDS_VolumeOfNodes -{ - public: - SMDS_PolyhedralVolumeOfNodes (std::vector nodes, - std::vector quantities); - - //virtual ~SMDS_PolyhedralVolumeOfNodes(); - - virtual SMDSAbs_ElementType GetType() const; - virtual bool IsPoly() const { return true; }; - - bool ChangeNodes (std::vector nodes, - std::vector quantities); - - //virtual int NbNodes() const; - virtual int NbEdges() const; - virtual int NbFaces() const; - - int NbFaceNodes (const int face_ind) const; - // 1 <= face_ind <= NbFaces() - - const SMDS_MeshNode* GetFaceNode (const int face_ind, const int node_ind) const; - // 1 <= face_ind <= NbFaces() - // 1 <= node_ind <= NbFaceNodes() - - virtual void Print (std::ostream & OS) const; - - protected: - //virtual SMDS_ElemIteratorPtr elementsIterator (SMDSAbs_ElementType type) const; - - private: - // usage disabled - bool ChangeNodes (const SMDS_MeshNode* nodes[], - const int nbNodes); - - private: - std::vector myNodesByFaces; - std::vector myQuantities; -}; - -#endif diff --git a/src/SMDS/SMDS_Position.cxx b/src/SMDS/SMDS_Position.cxx deleted file mode 100644 index 926aa4bf9..000000000 --- a/src/SMDS/SMDS_Position.cxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_Position.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_Position.hxx" - -//======================================================================= -//function : SMDS_Position -//purpose : -//======================================================================= - -SMDS_Position::SMDS_Position(int aShapeId) :myShapeId(aShapeId) -{ -} - -//======================================================================= -//function : SetShapeId -//purpose : -//======================================================================= - -void SMDS_Position::SetShapeId(int aShapeId) -{ - myShapeId = aShapeId; -} - -//======================================================================= -//function : GetShapeId -//purpose : -//======================================================================= - -int SMDS_Position::GetShapeId() const -{ - return myShapeId; -} - -//======================================================================= -//function : GetDim -//purpose : -//======================================================================= - -int SMDS_Position::GetDim() const -{ -// switch ( GetTypeOfPosition() ) { -// case SMDS_TOP_UNSPEC: return -1; -// case SMDS_TOP_VERTEX: return 0; -// case SMDS_TOP_EDGE: return 1; -// case SMDS_TOP_FACE: return 2; -// case SMDS_TOP_3DSPACE: return 3; -// } - return GetTypeOfPosition(); -} - - diff --git a/src/SMDS/SMDS_Position.hxx b/src/SMDS/SMDS_Position.hxx deleted file mode 100644 index 9b11dc6f9..000000000 --- a/src/SMDS/SMDS_Position.hxx +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_Position.hxx -// Module : SMESH - -#ifndef _SMDS_Position_HeaderFile -#define _SMDS_Position_HeaderFile - -#include "SMDS_TypeOfPosition.hxx" -#include - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_Position; -typedef boost::shared_ptr SMDS_PositionPtr; - - -class SMDS_WNT_EXPORT SMDS_Position -{ - - public: - const virtual double * Coords() const = 0; - virtual SMDS_TypeOfPosition GetTypeOfPosition() const = 0; - virtual int GetDim() const; - void SetShapeId(int aShapeId); - int GetShapeId() const; - virtual ~SMDS_Position() {} - - protected: - SMDS_Position(int aShapeId); - - private: - int myShapeId; -}; - - -#endif diff --git a/src/SMDS/SMDS_SpacePosition.cxx b/src/SMDS/SMDS_SpacePosition.cxx deleted file mode 100644 index 7ce582f91..000000000 --- a/src/SMDS/SMDS_SpacePosition.cxx +++ /dev/null @@ -1,59 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_SpacePosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_SpacePosition.hxx" - -//======================================================================= -//function : SMDS_SpacePosition -//purpose : -//======================================================================= - -SMDS_SpacePosition::SMDS_SpacePosition(double x, double y, double z): - SMDS_Position(0) -{ - myCoords[0]=x; - myCoords[1]=y; - myCoords[2]=z; -} - -/** -*/ -SMDS_TypeOfPosition SMDS_SpacePosition::GetTypeOfPosition() const -{ - return SMDS_TOP_3DSPACE; -} - -const double * SMDS_SpacePosition::Coords() const -{ - return myCoords; -} - -SMDS_PositionPtr SMDS_SpacePosition::originSpacePosition() -{ - static SMDS_PositionPtr staticpos (new SMDS_SpacePosition()); - return staticpos; -} diff --git a/src/SMDS/SMDS_SpacePosition.hxx b/src/SMDS/SMDS_SpacePosition.hxx deleted file mode 100644 index f4c7bff1a..000000000 --- a/src/SMDS/SMDS_SpacePosition.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_SpacePosition.hxx -// Module : SMESH - -#ifndef _SMDS_SpacePosition_HeaderFile -#define _SMDS_SpacePosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_SpacePosition:public SMDS_Position -{ - - public: - SMDS_SpacePosition(double x=0, double y=0, double z=0); - const virtual double * Coords() const; - virtual inline SMDS_TypeOfPosition GetTypeOfPosition() const; - inline void SetCoords(const double x, const double y, const double z); - static SMDS_PositionPtr originSpacePosition(); - private: - double myCoords[3]; -}; - -#endif diff --git a/src/SMDS/SMDS_TypeOfPosition.hxx b/src/SMDS/SMDS_TypeOfPosition.hxx deleted file mode 100644 index 8c0631bfc..000000000 --- a/src/SMDS/SMDS_TypeOfPosition.hxx +++ /dev/null @@ -1,39 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_TypeOfPosition.hxx -// Module : SMESH - -#ifndef _SMDS_TypeOfPosition_HeaderFile -#define _SMDS_TypeOfPosition_HeaderFile - -enum SMDS_TypeOfPosition // Value is equal to shape dimention -{ - SMDS_TOP_UNSPEC = -1, - SMDS_TOP_VERTEX = 0, - SMDS_TOP_EDGE = 1, - SMDS_TOP_FACE = 2, - SMDS_TOP_3DSPACE = 3 -}; - -#endif diff --git a/src/SMDS/SMDS_VertexPosition.cxx b/src/SMDS/SMDS_VertexPosition.cxx deleted file mode 100644 index 022f76ad3..000000000 --- a/src/SMDS/SMDS_VertexPosition.cxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_VertexPosition.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#include "SMDS_VertexPosition.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : SMDS_VertexPosition -//purpose : -//======================================================================= - -SMDS_VertexPosition:: SMDS_VertexPosition(const int aVertexId) - :SMDS_Position(aVertexId) -{ -} - -//======================================================================= -//function : Coords -//purpose : -//======================================================================= - -const double *SMDS_VertexPosition::Coords() const -{ - const static double origin[]={0,0,0}; - MESSAGE("SMDS_VertexPosition::Coords not implemented"); - return origin; -} - - -SMDS_TypeOfPosition SMDS_VertexPosition::GetTypeOfPosition() const -{ - return SMDS_TOP_VERTEX; -} diff --git a/src/SMDS/SMDS_VertexPosition.hxx b/src/SMDS/SMDS_VertexPosition.hxx deleted file mode 100644 index 68c1e3a58..000000000 --- a/src/SMDS/SMDS_VertexPosition.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_VertexPosition.hxx -// Module : SMESH - -#ifndef _SMDS_VertexPosition_HeaderFile -#define _SMDS_VertexPosition_HeaderFile - -#include "SMDS_Position.hxx" - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -class SMDS_WNT_EXPORT SMDS_VertexPosition:public SMDS_Position -{ - - public: - SMDS_TypeOfPosition GetTypeOfPosition() const; - SMDS_VertexPosition(int aVertexId=0); - const double *Coords() const; -}; - -#endif diff --git a/src/SMDS/SMDS_VolumeOfFaces.cxx b/src/SMDS/SMDS_VolumeOfFaces.cxx deleted file mode 100644 index 51e71f86c..000000000 --- a/src/SMDS/SMDS_VolumeOfFaces.cxx +++ /dev/null @@ -1,138 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMDS_VolumeOfFaces.cxx -// Author : Jean-Michel BOULCOURT -// Module : SMESH - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_VolumeOfFaces.hxx" -#include "SMDS_IteratorOfElements.hxx" - -using namespace std; - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_VolumeOfFaces::Print(ostream & OS) const -{ - OS << "volume <" << GetID() << "> : "; - int i; - for (i = 0; i < NbFaces()-1; ++i) OS << myFaces[i] << ","; - OS << myFaces[i]<< ") " << endl; -} - - -int SMDS_VolumeOfFaces::NbFaces() const -{ - return myNbFaces; -} - -class SMDS_VolumeOfFaces_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshFace* const *mySet; - int myLength; - int index; - public: - SMDS_VolumeOfFaces_MyIterator(const SMDS_MeshFace* const *s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index - - -class SMDS_VolumeOfFaces:public SMDS_MeshVolume -{ - - public: - SMDS_VolumeOfFaces(const SMDS_MeshFace * face1, - const SMDS_MeshFace * face2, - const SMDS_MeshFace * face3, - const SMDS_MeshFace * face4); - SMDS_VolumeOfFaces(const SMDS_MeshFace * face1, - const SMDS_MeshFace * face2, - const SMDS_MeshFace * face3, - const SMDS_MeshFace * face4, - const SMDS_MeshFace * face5); - SMDS_VolumeOfFaces(const SMDS_MeshFace * face1, - const SMDS_MeshFace * face2, - const SMDS_MeshFace * face3, - const SMDS_MeshFace * face4, - const SMDS_MeshFace * face5, - const SMDS_MeshFace * face6); - - void Print(std::ostream & OS) const; - - int NbFaces() const; - - protected: - SMDS_ElemIteratorPtr - elementsIterator(SMDSAbs_ElementType type) const; - const SMDS_MeshFace * myFaces[6]; - int myNbFaces; -}; -#endif diff --git a/src/SMDS/SMDS_VolumeOfNodes.cxx b/src/SMDS/SMDS_VolumeOfNodes.cxx deleted file mode 100644 index cd893f484..000000000 --- a/src/SMDS/SMDS_VolumeOfNodes.cxx +++ /dev/null @@ -1,212 +0,0 @@ -// SMESH SMDS : implementaion of Salome mesh data structure -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifdef _MSC_VER -#pragma warning(disable:4786) -#endif - -#include "SMDS_VolumeOfNodes.hxx" -#include "SMDS_MeshNode.hxx" -#include "utilities.h" - -using namespace std; - -/////////////////////////////////////////////////////////////////////////////// -/// Create an hexahedron. node 1,2,3,4 and 5,6,7,8 are quadrangle and -/// 5,1 and 7,3 are an edges. -/////////////////////////////////////////////////////////////////////////////// -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4, - const SMDS_MeshNode * node5, - const SMDS_MeshNode * node6, - const SMDS_MeshNode * node7, - const SMDS_MeshNode * node8) -{ - myNbNodes = 8; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; - myNodes[4]=node5; - myNodes[5]=node6; - myNodes[6]=node7; - myNodes[7]=node8; -} - -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4) -{ - myNbNodes = 4; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; -} - -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4, - const SMDS_MeshNode * node5) -{ - myNbNodes = 5; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; - myNodes[4]=node5; -} - -SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3, - const SMDS_MeshNode * node4, - const SMDS_MeshNode * node5, - const SMDS_MeshNode * node6) -{ - myNbNodes = 6; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - myNodes[0]=node1; - myNodes[1]=node2; - myNodes[2]=node3; - myNodes[3]=node4; - myNodes[4]=node5; - myNodes[5]=node6; -} - -bool SMDS_VolumeOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[], - const int nbNodes) -{ - if (nbNodes < 4 || nbNodes > 8 || nbNodes == 7) - return false; - - delete [] myNodes; - myNbNodes = nbNodes; - myNodes = new const SMDS_MeshNode* [myNbNodes]; - for ( int i = 0; i < nbNodes; i++ ) - myNodes[ i ] = nodes [ i ]; - - return true; -} - -SMDS_VolumeOfNodes::~SMDS_VolumeOfNodes() -{ - if (myNodes != NULL) { - delete [] myNodes; - myNodes = NULL; - } -} - -//======================================================================= -//function : Print -//purpose : -//======================================================================= - -void SMDS_VolumeOfNodes::Print(ostream & OS) const -{ - OS << "volume <" << GetID() << "> : "; - int i; - for (i = 0; i < NbNodes(); ++i) OS << myNodes[i] << ","; - OS << myNodes[NbNodes()-1]<< ") " << endl; -} - -int SMDS_VolumeOfNodes::NbFaces() const -{ - switch(NbNodes()) - { - case 4: return 4; - case 5: return 5; - case 6: return 5; - case 8: return 6; - default: MESSAGE("invalid number of nodes"); - } - return 0; -} - -int SMDS_VolumeOfNodes::NbNodes() const -{ - return myNbNodes; -} - -int SMDS_VolumeOfNodes::NbEdges() const -{ - switch(NbNodes()) - { - case 4: return 6; - case 5: return 8; - case 6: return 9; - case 8: return 12; - default: MESSAGE("invalid number of nodes"); - } - return 0; -} - -class SMDS_VolumeOfNodes_MyIterator:public SMDS_ElemIterator -{ - const SMDS_MeshNode* const* mySet; - int myLength; - int index; - public: - SMDS_VolumeOfNodes_MyIterator(const SMDS_MeshNode* const* s, int l): - mySet(s),myLength(l),index(0) {} - - bool more() - { - return index -#include - -//#ifdef WNT -//#include -//#else -//#define SALOME_WNT_EXPORT -//#endif - -#if defined WNT && defined WIN32 && defined SMDS_EXPORTS -#define SMDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMDS_WNT_EXPORT -#endif - -// ========================================================================= -// -// Class providing topological and other information about SMDS_MeshVolume: -// allows iteration on faces or, to be precise, on nodes of volume sides; -// provides info on nodes connection etc. -// -// ========================================================================= - -class SMDS_WNT_EXPORT SMDS_VolumeTool -{ - public: - - enum VolumeType { UNKNOWN = -1, TETRA = 0, PYRAM, PENTA, HEXA, POLYHEDA }; - - SMDS_VolumeTool (); - ~SMDS_VolumeTool (); - SMDS_VolumeTool (const SMDS_MeshElement* theVolume); - - bool Set (const SMDS_MeshElement* theVolume); - // Set volume. - // Return false if theVolume is not of type SMDSAbs_Volume - - // ----------------------- - // general info - // ----------------------- - - VolumeType GetVolumeType() const; - - bool IsForward() const { return myVolForward; } - // Check volume orientation. can be changed by Inverse(). - // See node order of forward volumes at the file bottom - - void Inverse(); - // Change nodes order as if the volume changes its orientation: - // top and bottom faces are reversed. - // Result of IsForward() and methods returning nodes change - - const SMDS_MeshNode** GetNodes() { return myVolumeNodes; } - // Return array of volume nodes - - int NbNodes() { return myVolumeNbNodes; } - // Return array of volume nodes - - double GetSize() const; - // Return element volume - - bool GetBaryCenter (double & X, double & Y, double & Z) const; - - - // ----------------------- - // info on node connection - // ----------------------- - - bool IsLinked (const SMDS_MeshNode* theNode1, - const SMDS_MeshNode* theNode2) const; - // Return true if theNode1 is linked with theNode2. - - bool IsLinked (const int theNode1Index, - const int theNode2Index) const; - // Return true if the node with theNode1Index is linked - // with the node with theNode2Index - - int GetNodeIndex(const SMDS_MeshNode* theNode) const; - // Return an index of theNode - - // ------------- - // info on faces - // ------------- - - void SetExternalNormal (); - // Node order in faces will be so that faces normals are external. - - int NbFaces() const { return myNbFaces; } - // Return number of faces of the volume. In the following - // methods 0 <= faceIndex < NbFaces() - - int NbFaceNodes( int faceIndex ); - // Return number of nodes in the array of face nodes - - const int* GetFaceNodesIndices( int faceIndex ); - // Return the array of face nodes indices - // To comfort link iteration, the array - // length == NbFaceNodes( faceIndex ) + 1 and - // the last node index == the first one. - - const SMDS_MeshNode** GetFaceNodes( int faceIndex ); - // Return the array of face nodes. - // To comfort link iteration, the array - // length == NbFaceNodes( faceIndex ) + 1 and - // the last node == the first one. - // WARNING: do not modify the array, some methods - // work basing on its contents - - bool GetFaceNodes (int faceIndex, - std::set& theFaceNodes ); - // Return a set of face nodes. - - bool IsFaceExternal( int faceIndex ); - // Check normal orientation of a face. - // SetExternalNormal() is taken into account. - - bool IsFreeFace( int faceIndex ); - // Check that all volumes built on the face nodes lays on one side - - bool GetFaceNormal (int faceIndex, double & X, double & Y, double & Z); - // Return a normal to a face - - double GetFaceArea( int faceIndex ); - // Return face area - - int GetOppFaceIndex( int faceIndex ) const; - // Return index of the opposite face if it exists, else -1. - - int GetFaceIndex( const std::set& theFaceNodes ); - // Return index of a face formed by theFaceNodes. - // Return -1 if a face not found - - //int GetFaceIndex( const std::set& theFaceNodesIndices ); - // Return index of a face formed by theFaceNodesIndices - // Return -1 if a face not found - - // ------------------------ - // static methods for faces - // ------------------------ - - static VolumeType GetType(int nbNodes); - // return VolumeType by nb of nodes in a volume - - static int NbFaces( VolumeType type ); - // return nb of faces by volume type - - static const int* GetFaceNodesIndices(VolumeType type, - int faceIndex, - bool external); - // Return the array of face nodes indices - // To comfort link iteration, the array - // length == NbFaceNodes( faceIndex ) + 1 and - // the last node index == the first one. - - static int NbFaceNodes(VolumeType type, - int faceIndex ); - // Return number of nodes in the array of face nodes - - private: - - bool setFace( int faceIndex ); - - const SMDS_MeshElement* myVolume; - const SMDS_PolyhedralVolumeOfNodes* myPolyedre; - - bool myVolForward; - int myNbFaces; - int myVolumeNbNodes; - const SMDS_MeshNode** myVolumeNodes; - - bool myExternalFaces; - - int myCurFace; - int myFaceNbNodes; - int* myFaceNodeIndices; - const SMDS_MeshNode** myFaceNodes; - -}; -#endif - - -/////////////////////////////////////////////////////////////////////////// -// -// ORDER OF NODES OF FORWARD ELEMENT -// -/////////////////////////////////////////////////////////////////////////// -/* -// N3 -// + -// /|\ -// / | \ -// / | \ -// N0 +---|---+ N1 TETRAHEDRON -// \ | / -// \ | / -// \ | / -// \|/ -// + -// N2 - -// + N4 -// /|\ -// / | \ -// / | \ -// / | \ -// N3 +---------+ N5 -// | | | -// | + N1 | -// | / \ | PENTAHEDRON -// | / \ | -// | / \ | -// |/ \| -// N0 +---------+ N2 - -// N5+----------+N6 -// /| /| -// / | / | -// / | / | -// N4+----------+N7 | -// | | | | HEXAHEDRON -// | | | | -// | | | | -// | N1+------|---+N2 -// | / | / -// | / | / -// |/ |/ -// N0+----------+N3 -// -*/ diff --git a/src/SMESH/SMESH_1D_Algo.cxx b/src/SMESH/SMESH_1D_Algo.cxx deleted file mode 100644 index 37567a536..000000000 --- a/src/SMESH/SMESH_1D_Algo.cxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_1D_Algo.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_1D_Algo.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Algo(hypId, studyId, gen) -{ -// _compatibleHypothesis.push_back("hypothese_1D_bidon"); - _type = ALGO_1D; - gen->_map1D_Algo[hypId] = this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_1D_Algo::~SMESH_1D_Algo() -{ -} - diff --git a/src/SMESH/SMESH_1D_Algo.hxx b/src/SMESH/SMESH_1D_Algo.hxx deleted file mode 100644 index 378ed7545..000000000 --- a/src/SMESH/SMESH_1D_Algo.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_1D_Algo.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_1D_ALGO_HXX_ -#define _SMESH_1D_ALGO_HXX_ - -#include "SMESH_Algo.hxx" - -class SMESH_1D_Algo: - public SMESH_Algo -{ -public: - SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_1D_Algo(); -}; - -#endif diff --git a/src/SMESH/SMESH_2D_Algo.cxx b/src/SMESH/SMESH_2D_Algo.cxx deleted file mode 100644 index d1084f7d4..000000000 --- a/src/SMESH/SMESH_2D_Algo.cxx +++ /dev/null @@ -1,92 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_2D_Algo.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_2D_Algo.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Algo(hypId, studyId, gen) -{ -// _compatibleHypothesis.push_back("hypothese_2D_bidon"); - _type = ALGO_2D; - gen->_map2D_Algo[hypId] = this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_2D_Algo::~SMESH_2D_Algo() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_2D_Algo::NumberOfWires(const TopoDS_Shape& S) -{ - int i = 0; - for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next()) - i++; - return i; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_2D_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W) -{ - int nbPoints = 0; - for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) - { - const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); - int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes(); - //SCRUTE(nb); - nbPoints += nb +1; // internal points plus 1 vertex of 2 (last point ?) - } - //SCRUTE(nbPoints); - return nbPoints; -} diff --git a/src/SMESH/SMESH_2D_Algo.hxx b/src/SMESH/SMESH_2D_Algo.hxx deleted file mode 100644 index 5c904e22e..000000000 --- a/src/SMESH/SMESH_2D_Algo.hxx +++ /dev/null @@ -1,46 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_2D_Algo.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_2D_ALGO_HXX_ -#define _SMESH_2D_ALGO_HXX_ - -#include "SMESH_Algo.hxx" -#include - -class SMESH_2D_Algo: - public SMESH_Algo -{ -public: - SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_2D_Algo(); - - int NumberOfWires(const TopoDS_Shape& S); - int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W); -}; - -#endif diff --git a/src/SMESH/SMESH_3D_Algo.cxx b/src/SMESH/SMESH_3D_Algo.cxx deleted file mode 100644 index d42680f62..000000000 --- a/src/SMESH/SMESH_3D_Algo.cxx +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_3D_Algo.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_3D_Algo.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Algo(hypId, studyId, gen) -{ -// _compatibleHypothesis.push_back("hypothese_3D_bidon"); - _type = ALGO_3D; - gen->_map3D_Algo[hypId] = this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_3D_Algo::~SMESH_3D_Algo() -{ -} diff --git a/src/SMESH/SMESH_3D_Algo.hxx b/src/SMESH/SMESH_3D_Algo.hxx deleted file mode 100644 index 62621ce3c..000000000 --- a/src/SMESH/SMESH_3D_Algo.hxx +++ /dev/null @@ -1,42 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_3D_Algo.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_3D_ALGO_HXX_ -#define _SMESH_3D_ALGO_HXX_ - -#include "SMESH_Algo.hxx" - -class SMESH_3D_Algo: - public SMESH_Algo -{ -public: - SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_3D_Algo(); -}; - -#endif diff --git a/src/SMESH/SMESH_Block.cxx b/src/SMESH/SMESH_Block.cxx deleted file mode 100644 index 431208fcf..000000000 --- a/src/SMESH/SMESH_Block.cxx +++ /dev/null @@ -1,1391 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -// File : SMESH_Pattern.hxx -// Created : Mon Aug 2 10:30:00 2004 -// Author : Edward AGAPOV (eap) - -#include "SMESH_Block.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SMDS_MeshNode.hxx" -#include "SMDS_MeshVolume.hxx" -#include "SMDS_VolumeTool.hxx" -#include "utilities.h" - -#include - -using namespace std; - -#define SQRT_FUNC 1 - -//======================================================================= -//function : SMESH_Block::TEdge::GetU -//purpose : -//======================================================================= - -double SMESH_Block::TEdge::GetU( const gp_XYZ& theParams ) const -{ - double u = theParams.Coord( myCoordInd ); - if ( myC3d.IsNull() ) // if mesh block - return u; - return ( 1 - u ) * myFirst + u * myLast; -} - -//======================================================================= -//function : SMESH_Block::TEdge::Point -//purpose : -//======================================================================= - -gp_XYZ SMESH_Block::TEdge::Point( const gp_XYZ& theParams ) const -{ - double u = GetU( theParams ); - - if ( myC3d.IsNull() ) // if mesh block - return myNodes[0] * ( 1 - u ) + myNodes[1] * u; - - gp_XYZ p = myC3d->Value( u ).XYZ(); - if ( myTrsf.Form() != gp_Identity ) - myTrsf.Transforms( p ); - return p; -} - -//======================================================================= -//function : SMESH_Block::TFace::GetCoefs -//purpose : return coefficients for addition of [0-3]-th edge and vertex -//======================================================================= - -void SMESH_Block::TFace::GetCoefs(int iE, - const gp_XYZ& theParams, - double& Ecoef, - double& Vcoef ) const -{ - double dU = theParams.Coord( GetUInd() ); - double dV = theParams.Coord( GetVInd() ); - switch ( iE ) { - case 0: - Ecoef = ( 1 - dV ); // u0 - Vcoef = ( 1 - dU ) * ( 1 - dV ); break; // 00 - case 1: - Ecoef = dV; // u1 - Vcoef = dU * ( 1 - dV ); break; // 10 - case 2: - Ecoef = ( 1 - dU ); // 0v - Vcoef = dU * dV ; break; // 11 - case 3: - Ecoef = dU ; // 1v - Vcoef = ( 1 - dU ) * dV ; break; // 01 - default: ASSERT(0); - } -} - -//======================================================================= -//function : SMESH_Block::TFace::GetUV -//purpose : -//======================================================================= - -gp_XY SMESH_Block::TFace::GetUV( const gp_XYZ& theParams ) const -{ - gp_XY uv(0.,0.); - for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges - { - double Ecoef = 0, Vcoef = 0; - GetCoefs( iE, theParams, Ecoef, Vcoef ); - // edge addition - double u = theParams.Coord( myCoordInd[ iE ] ); - u = ( 1 - u ) * myFirst[ iE ] + u * myLast[ iE ]; - uv += Ecoef * myC2d[ iE ]->Value( u ).XY(); - // corner addition - uv -= Vcoef * myCorner[ iE ]; - } - return uv; -} - -//======================================================================= -//function : SMESH_Block::TFace::Point -//purpose : -//======================================================================= - -gp_XYZ SMESH_Block::TFace::Point( const gp_XYZ& theParams ) const -{ - gp_XYZ p(0.,0.,0.); - if ( myS.IsNull() ) // if mesh block - { - for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges - { - double Ecoef = 0, Vcoef = 0; - GetCoefs( iE, theParams, Ecoef, Vcoef ); - // edge addition - double u = theParams.Coord( myCoordInd[ iE ] ); - int i1 = 0, i2 = 1; - switch ( iE ) { - case 1: i1 = 3; i2 = 2; break; - case 2: i1 = 1; i2 = 2; break; - case 3: i1 = 0; i2 = 3; break; - } - p += Ecoef * ( myNodes[ i1 ] * ( 1 - u ) + myNodes[ i2 ] * u ); - // corner addition - p -= Vcoef * myNodes[ iE ]; - } - - } - else // shape block - { - gp_XY uv = GetUV( theParams ); - p = myS->Value( uv.X(), uv.Y() ).XYZ(); - if ( myTrsf.Form() != gp_Identity ) - myTrsf.Transforms( p ); - } - return p; -} - -//======================================================================= -//function : GetShapeCoef -//purpose : -//======================================================================= - -double* SMESH_Block::GetShapeCoef (const int theShapeID) -{ - static double shapeCoef[][3] = { - // V000, V100, V010, V110 - { -1,-1,-1 }, { 1,-1,-1 }, { -1, 1,-1 }, { 1, 1,-1 }, - // V001, V101, V011, V111, - { -1,-1, 1 }, { 1,-1, 1 }, { -1, 1, 1 }, { 1, 1, 1 }, - // Ex00, Ex10, Ex01, Ex11, - { 0,-1,-1 }, { 0, 1,-1 }, { 0,-1, 1 }, { 0, 1, 1 }, - // E0y0, E1y0, E0y1, E1y1, - { -1, 0,-1 }, { 1, 0,-1 }, { -1, 0, 1 }, { 1, 0, 1 }, - // E00z, E10z, E01z, E11z, - { -1,-1, 0 }, { 1,-1, 0 }, { -1, 1, 0 }, { 1, 1, 0 }, - // Fxy0, Fxy1, Fx0z, Fx1z, F0yz, F1yz, - { 0, 0,-1 }, { 0, 0, 1 }, { 0,-1, 0 }, { 0, 1, 0 }, { -1, 0, 0 }, { 1, 0, 0 }, - // ID_Shell - { 0, 0, 0 } - }; - if ( theShapeID < ID_V000 || theShapeID > ID_F1yz ) - return shapeCoef[ ID_Shell - 1 ]; - - return shapeCoef[ theShapeID - 1 ]; -} - -//======================================================================= -//function : ShellPoint -//purpose : return coordinates of a point in shell -//======================================================================= - -bool SMESH_Block::ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const -{ - thePoint.SetCoord( 0., 0., 0. ); - for ( int shapeID = ID_V000; shapeID < ID_Shell; shapeID++ ) - { - // coef - double* coefs = GetShapeCoef( shapeID ); - double k = 1; - for ( int iCoef = 0; iCoef < 3; iCoef++ ) { - if ( coefs[ iCoef ] != 0 ) { - if ( coefs[ iCoef ] < 0 ) - k *= ( 1. - theParams.Coord( iCoef + 1 )); - else - k *= theParams.Coord( iCoef + 1 ); - } - } - // point on a shape - gp_XYZ Ps; - if ( shapeID < ID_Ex00 ) // vertex - VertexPoint( shapeID, Ps ); - else if ( shapeID < ID_Fxy0 ) { // edge - EdgePoint( shapeID, theParams, Ps ); - k = -k; - } else // face - FacePoint( shapeID, theParams, Ps ); - - thePoint += k * Ps; - } - return true; -} - -//======================================================================= -//function : ShellPoint -//purpose : computes coordinates of a point in shell by points on sub-shapes; -// thePointOnShape[ subShapeID ] must be a point on a subShape -//======================================================================= - -bool SMESH_Block::ShellPoint(const gp_XYZ& theParams, - const vector& thePointOnShape, - gp_XYZ& thePoint ) -{ - if ( thePointOnShape.size() < ID_F1yz ) - return false; - - double x = theParams.X(), y = theParams.Y(), z = theParams.Z(); - double x1 = 1. - x, y1 = 1. - y, z1 = 1. - z; - const vector& p = thePointOnShape; - - thePoint = - x1 * p[ID_F0yz] + x * p[ID_F1yz] - + y1 * p[ID_Fx0z] + y * p[ID_Fx1z] - + z1 * p[ID_Fxy0] + z * p[ID_Fxy1] - + x1 * (y1 * (z1 * p[ID_V000] + z * p[ID_V001]) - + y * (z1 * p[ID_V010] + z * p[ID_V011])) - + x * (y1 * (z1 * p[ID_V100] + z * p[ID_V101]) - + y * (z1 * p[ID_V110] + z * p[ID_V111])); - thePoint -= - x1 * (y1 * p[ID_E00z] + y * p[ID_E01z]) - + x * (y1 * p[ID_E10z] + y * p[ID_E11z]) - + y1 * (z1 * p[ID_Ex00] + z * p[ID_Ex01]) - + y * (z1 * p[ID_Ex10] + z * p[ID_Ex11]) - + z1 * (x1 * p[ID_E0y0] + x * p[ID_E1y0]) - + z * (x1 * p[ID_E0y1] + x * p[ID_E1y1]); - - return true; -} - -//======================================================================= -//function : NbVariables -//purpose : -//======================================================================= - -Standard_Integer SMESH_Block::NbVariables() const -{ - return 3; -} - -//======================================================================= -//function : NbEquations -//purpose : -//======================================================================= - -Standard_Integer SMESH_Block::NbEquations() const -{ - return 1; -} - -//======================================================================= -//function : Value -//purpose : -//======================================================================= - -Standard_Boolean SMESH_Block::Value(const math_Vector& theXYZ, math_Vector& theFxyz) -{ - gp_XYZ P, params( theXYZ(1), theXYZ(2), theXYZ(3) ); - if ( params.IsEqual( myParam, DBL_MIN )) { // same param - theFxyz( 1 ) = myValues[ 0 ]; - } - else { - ShellPoint( params, P ); - gp_Vec dP( P - myPoint ); - theFxyz(1) = SQRT_FUNC ? dP.SquareMagnitude() : dP.Magnitude(); - } - return true; -} - -//======================================================================= -//function : Derivatives -//purpose : -//======================================================================= - -Standard_Boolean SMESH_Block::Derivatives(const math_Vector& XYZ,math_Matrix& Df) -{ - MESSAGE( "SMESH_Block::Derivatives()"); - math_Vector F(1,3); - return Values(XYZ,F,Df); -} - -//======================================================================= -//function : Values -//purpose : -//======================================================================= - -Standard_Boolean SMESH_Block::Values(const math_Vector& theXYZ, - math_Vector& theFxyz, - math_Matrix& theDf) -{ -// MESSAGE( endl<<"SMESH_Block::Values( "< DBL_MIN ) - dPi /= mag; - drv[ iP - 1 ] = dPi; - } - for ( int iP = 0; iP < 3; iP++ ) { - if ( iP == myFaceIndex ) - theDf( 1, iP + 1 ) = myFaceParam; - else { - // like IntAna_IntConicQuad::Perform (const gp_Lin& L, const gp_Pln& P) - // where L is (P -> myPoint), P is defined by the 2 other derivative direction - int iPrev = ( iP ? iP - 1 : 2 ); - int iNext = ( iP == 2 ? 0 : iP + 1 ); - gp_Vec plnNorm = drv[ iPrev ].Crossed( drv [ iNext ] ); - double Direc = plnNorm * drv[ iP ]; - if ( Abs(Direc) <= DBL_MIN ) - theDf( 1, iP + 1 ) = dP * drv[ iP ]; - else { - double Dis = plnNorm * P - plnNorm * myPoint; - theDf( 1, iP + 1 ) = Dis/Direc; - } - } - } - //myNbIterations +=3; // how many time call ShellPoint() - - // store better values - myParam = params; - myValues[0]= theFxyz(1); - myValues[1]= theDf(1,1); - myValues[2]= theDf(1,2); - myValues[3]= theDf(1,3); - -// SCRUTE( theFxyz(1) ); -// SCRUTE( theDf( 1,1 )); -// SCRUTE( theDf( 1,2 )); -// SCRUTE( theDf( 1,3 )); - } - - return true; -} - -//======================================================================= -//function : ComputeParameters -//purpose : compute point parameters in the block -//======================================================================= - -bool SMESH_Block::ComputeParameters(const gp_Pnt& thePoint, - gp_XYZ& theParams, - const int theShapeID) -{ - if ( VertexParameters( theShapeID, theParams )) - return true; - - if ( IsEdgeID( theShapeID )) { - TEdge& e = myEdge[ theShapeID - ID_Ex00 ]; - GeomAdaptor_Curve curve( e.myC3d ); - double f = Min( e.myFirst, e.myLast ), l = Max( e.myFirst, e.myLast ); - Extrema_ExtPC anExtPC( thePoint, curve, f, l ); - int i, nb = anExtPC.IsDone() ? anExtPC.NbExt() : 0; - for ( i = 1; i <= nb; i++ ) { - if ( anExtPC.IsMin( i )) - return EdgeParameters( theShapeID, anExtPC.Point( i ).Parameter(), theParams ); - } - return false; - } - -// MESSAGE( endl<<"SMESH_Block::ComputeParameters( " -// < zero ) { - par = v0P.Dot( v01 ) / len2; - if ( par < 0 || par > 1 ) { - needGrid = true; - break; - } - } - start( iParam ) += par; - } - start( iParam ) /= 4.; - } - if ( needGrid ) { - // compute nodes of 3 x 3 x 3 grid - int iNode = 0; - for ( double x = 0.25; x < 0.9; x += 0.25 ) - for ( double y = 0.25; y < 0.9; y += 0.25 ) - for ( double z = 0.25; z < 0.9; z += 0.25 ) { - TxyzPair & prmPtn = my3x3x3GridNodes[ iNode++ ]; - prmPtn.first.SetCoord( x, y, z ); - ShellPoint( prmPtn.first, prmPtn.second ); - } - myGridComputed = true; - } - } - if ( myGridComputed ) { - double minDist = DBL_MAX; - gp_XYZ* bestParam = 0; - for ( int iNode = 0; iNode < 27; iNode++ ) { - TxyzPair & prmPtn = my3x3x3GridNodes[ iNode ]; - double dist = ( thePoint.XYZ() - prmPtn.second ).SquareModulus(); - if ( dist < minDist ) { - minDist = dist; - bestParam = & prmPtn.first; - } - } - start( 1 ) = bestParam->X(); - start( 2 ) = bestParam->Y(); - start( 3 ) = bestParam->Z(); - } - - int myFaceIndex = -1; - if ( isOnFace ) { - // put a point on the face - for ( int iCoord = 0; iCoord < 3; iCoord++ ) - if ( coef[ iCoord ] ) { - myFaceIndex = iCoord; - myFaceParam = ( coef[ myFaceIndex ] < 0.5 ) ? 0.0 : 1.0; - start( iCoord + 1 ) = myFaceParam; - } - } - math_Vector low ( 1, 3, 0.0 ); - math_Vector up ( 1, 3, 1.0 ); - math_Vector tol ( 1, 3, 1e-4 ); - math_FunctionSetRoot paramSearch( *this, tol ); - - int nbLoops = 0; - while ( myValues[0] > 1e-1 && nbLoops++ < 10 ) { - paramSearch.Perform ( *this, start, low, up ); - if ( !paramSearch.IsDone() ) { - //MESSAGE( " !paramSearch.IsDone() " ); - } - else { - //MESSAGE( " NB ITERATIONS: " << paramSearch.NbIterations() ); - } - start( 1 ) = myParam.X(); - start( 2 ) = myParam.Y(); - start( 3 ) = myParam.Z(); - //MESSAGE( "Distance: " << ( SQRT_FUNC ? sqrt(myValues[0]) : myValues[0] )); - } -// MESSAGE( endl << myParam.X() << " " << myParam.Y() << " " << myParam.Z() << endl); -// mySumDist += myValues[0]; -// MESSAGE( " TOTAL NB ITERATIONS: " << myNbIterations << -// " DIST: " << ( SQRT_FUNC ? sqrt(mySumDist) : mySumDist )); - - - theParams = myParam; - - return true; -} - -//======================================================================= -//function : VertexParameters -//purpose : return parameters of a vertex given by TShapeID -//======================================================================= - -bool SMESH_Block::VertexParameters(const int theVertexID, gp_XYZ& theParams) -{ - switch ( theVertexID ) { - case ID_V000: theParams.SetCoord(0., 0., 0.); return true; - case ID_V100: theParams.SetCoord(1., 0., 0.); return true; - case ID_V110: theParams.SetCoord(1., 1., 0.); return true; - case ID_V010: theParams.SetCoord(0., 1., 0.); return true; - default:; - } - return false; -} - -//======================================================================= -//function : EdgeParameters -//purpose : return parameters of a point given by theU on edge -//======================================================================= - -bool SMESH_Block::EdgeParameters(const int theEdgeID, const double theU, gp_XYZ& theParams) -{ - if ( IsEdgeID( theEdgeID )) { - vector< int > vertexVec; - GetEdgeVertexIDs( theEdgeID, vertexVec ); - VertexParameters( vertexVec[0], theParams ); - TEdge& e = myEdge[ theEdgeID - ID_Ex00 ]; - double param = ( theU - e.myFirst ) / ( e.myLast - e.myFirst ); - theParams.SetCoord( e.myCoordInd, param ); - return true; - } - return false; -} - -//======================================================================= -//function : GetStateNumber -//purpose : -//======================================================================= - -Standard_Integer SMESH_Block::GetStateNumber () -{ -// MESSAGE( endl<<"SMESH_Block::GetStateNumber( "< 26 || id < 0 ) { - MESSAGE( "GetShapeIDByParams() = " << id - <<" "<< theCoord.X() <<" "<< theCoord.Y() <<" "<< theCoord.Z() ); - } - - return id + 1; // shape ids start at 1 -} - - -//======================================================================= -//function : getOrderedEdges -//purpose : return nb wires and a list of oredered edges -//======================================================================= - -static int getOrderedEdges (const TopoDS_Face& theFace, - const TopoDS_Vertex& theFirstVertex, - list< TopoDS_Edge >& theEdges, - list< int > & theNbVertexInWires) -{ - // put wires in a list, so that an outer wire comes first - list aWireList; - TopoDS_Wire anOuterWire = BRepTools::OuterWire( theFace ); - aWireList.push_back( anOuterWire ); - for ( TopoDS_Iterator wIt (theFace); wIt.More(); wIt.Next() ) - if ( !anOuterWire.IsSame( wIt.Value() )) - aWireList.push_back( TopoDS::Wire( wIt.Value() )); - - // loop on edges of wires - theNbVertexInWires.clear(); - list::iterator wlIt = aWireList.begin(); - for ( ; wlIt != aWireList.end(); wlIt++ ) - { - int iE; - BRepTools_WireExplorer wExp( *wlIt, theFace ); - for ( iE = 0; wExp.More(); wExp.Next(), iE++ ) - { - TopoDS_Edge edge = wExp.Current(); - edge = TopoDS::Edge( edge.Oriented( wExp.Orientation() )); - theEdges.push_back( edge ); - } - theNbVertexInWires.push_back( iE ); - iE = 0; - if ( wlIt == aWireList.begin() && theEdges.size() > 1 ) { // the outer wire - // orient closed edges - list< TopoDS_Edge >::iterator eIt, eIt2; - for ( eIt = theEdges.begin(); eIt != theEdges.end(); eIt++ ) - { - TopoDS_Edge& edge = *eIt; - if ( TopExp::FirstVertex( edge ).IsSame( TopExp::LastVertex( edge ) )) - { - eIt2 = eIt; - bool isNext = ( eIt2 == theEdges.begin() ); - TopoDS_Edge edge2 = isNext ? *(++eIt2) : *(--eIt2); - double f1,l1,f2,l2; - Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface( edge, theFace, f1,l1 ); - Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface( edge2, theFace, f2,l2 ); - gp_Pnt2d pf = c1->Value( edge.Orientation() == TopAbs_FORWARD ? f1 : l1 ); - gp_Pnt2d pl = c1->Value( edge.Orientation() == TopAbs_FORWARD ? l1 : f1 ); - bool isFirst = ( edge2.Orientation() == TopAbs_FORWARD ? isNext : !isNext ); - gp_Pnt2d p2 = c2->Value( isFirst ? f2 : l2 ); - isFirst = ( p2.SquareDistance( pf ) < p2.SquareDistance( pl )); - if ( isNext ? isFirst : !isFirst ) - edge.Reverse(); - } - } - // rotate theEdges until it begins from theFirstVertex - if ( ! theFirstVertex.IsNull() ) - while ( !theFirstVertex.IsSame( TopExp::FirstVertex( theEdges.front(), true ))) - { - theEdges.splice(theEdges.end(), theEdges, - theEdges.begin(), ++ theEdges.begin()); - if ( iE++ > theNbVertexInWires.back() ) - break; // break infinite loop - } - } - } - - return aWireList.size(); -} - -//======================================================================= -//function : LoadMeshBlock -//purpose : prepare to work with theVolume -//======================================================================= - -#define gpXYZ(n) gp_XYZ(n->X(),n->Y(),n->Z()) - -bool SMESH_Block::LoadMeshBlock(const SMDS_MeshVolume* theVolume, - const int theNode000Index, - const int theNode001Index, - vector& theOrderedNodes) -{ - MESSAGE(" ::LoadMeshBlock()"); - - myNbIterations = 0; - mySumDist = 0; - myGridComputed = false; - - SMDS_VolumeTool vTool; - if (!vTool.Set( theVolume ) || vTool.NbNodes() != 8 || - !vTool.IsLinked( theNode000Index, theNode001Index )) { - MESSAGE(" Bad arguments "); - return false; - } - vTool.SetExternalNormal(); - // In terms of indices used for access to nodes and faces in SMDS_VolumeTool: - int V000, V100, V010, V110, V001, V101, V011, V111; // 8 vertices - int Fxy0, Fxy1; // bottom and top faces - // vertices of faces - vector vFxy0, vFxy1; - - V000 = theNode000Index; - V001 = theNode001Index; - - // get faces sharing V000 and V001 - list fV000, fV001; - int i, iF, iE, iN; - for ( iF = 0; iF < vTool.NbFaces(); ++iF ) { - const int* nid = vTool.GetFaceNodesIndices( iF ); - for ( iN = 0; iN < 4; ++iN ) - if ( nid[ iN ] == V000 ) { - fV000.push_back( iF ); - } else if ( nid[ iN ] == V001 ) { - fV001.push_back( iF ); - } - } - - // find the bottom (Fxy0), the top (Fxy1) faces - list::iterator fIt1, fIt2, Fxy0Pos; - for ( fIt1 = fV000.begin(); fIt1 != fV000.end(); fIt1++) { - fIt2 = std::find( fV001.begin(), fV001.end(), *fIt1 ); - if ( fIt2 != fV001.end() ) { // *fIt1 is in the both lists - fV001.erase( fIt2 ); // erase Fx0z or F0yz from fV001 - } else { // *fIt1 is in fV000 only - Fxy0Pos = fIt1; // points to Fxy0 - } - } - Fxy0 = *Fxy0Pos; - Fxy1 = fV001.front(); - const SMDS_MeshNode** nn = vTool.GetNodes(); - - // find bottom veritices, their order is that a face normal is external - vFxy0.resize(4); - const int* nid = vTool.GetFaceNodesIndices( Fxy0 ); - for ( i = 0; i < 4; ++i ) - if ( nid[ i ] == V000 ) - break; - for ( iN = 0; iN < 4; ++iN, ++i ) { - if ( i == 4 ) i = 0; - vFxy0[ iN ] = nid[ i ]; - } - // find top veritices, their order is that a face normal is external - vFxy1.resize(4); - nid = vTool.GetFaceNodesIndices( Fxy1 ); - for ( i = 0; i < 4; ++i ) - if ( nid[ i ] == V001 ) - break; - for ( iN = 0; iN < 4; ++iN, ++i ) { - if ( i == 4 ) i = 0; - vFxy1[ iN ] = nid[ i ]; - } - // find indices of the rest veritices - V100 = vFxy0[3]; - V010 = vFxy0[1]; - V110 = vFxy0[2]; - V101 = vFxy1[1]; - V011 = vFxy1[3]; - V111 = vFxy1[2]; - - // set points coordinates - myPnt[ ID_V000 - 1 ] = gpXYZ( nn[ V000 ] ); - myPnt[ ID_V100 - 1 ] = gpXYZ( nn[ V100 ] ); - myPnt[ ID_V010 - 1 ] = gpXYZ( nn[ V010 ] ); - myPnt[ ID_V110 - 1 ] = gpXYZ( nn[ V110 ] ); - myPnt[ ID_V001 - 1 ] = gpXYZ( nn[ V001 ] ); - myPnt[ ID_V101 - 1 ] = gpXYZ( nn[ V101 ] ); - myPnt[ ID_V011 - 1 ] = gpXYZ( nn[ V011 ] ); - myPnt[ ID_V111 - 1 ] = gpXYZ( nn[ V111 ] ); - - // fill theOrderedNodes - theOrderedNodes.resize( 8 ); - theOrderedNodes[ 0 ] = nn[ V000 ]; - theOrderedNodes[ 1 ] = nn[ V100 ]; - theOrderedNodes[ 2 ] = nn[ V010 ]; - theOrderedNodes[ 3 ] = nn[ V110 ]; - theOrderedNodes[ 4 ] = nn[ V001 ]; - theOrderedNodes[ 5 ] = nn[ V101 ]; - theOrderedNodes[ 6 ] = nn[ V011 ]; - theOrderedNodes[ 7 ] = nn[ V111 ]; - - // fill edges - myEdge[ ID_Ex00 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ]; - myEdge[ ID_Ex00 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V100 - 1 ]; - - myEdge[ ID_Ex10 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V010 - 1 ]; - myEdge[ ID_Ex10 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V110 - 1 ]; - - myEdge[ ID_Ex01 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V001 - 1 ]; - myEdge[ ID_Ex01 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V101 - 1 ]; - - myEdge[ ID_Ex11 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V011 - 1 ]; - myEdge[ ID_Ex11 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ]; - - myEdge[ ID_E0y0 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ]; - myEdge[ ID_E0y0 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V010 - 1 ]; - - myEdge[ ID_E1y0 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V100 - 1 ]; - myEdge[ ID_E1y0 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V110 - 1 ]; - - myEdge[ ID_E0y1 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V001 - 1 ]; - myEdge[ ID_E0y1 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V011 - 1 ]; - - myEdge[ ID_E1y1 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V101 - 1 ]; - myEdge[ ID_E1y1 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ]; - - myEdge[ ID_E00z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ]; - myEdge[ ID_E00z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V001 - 1 ]; - - myEdge[ ID_E10z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V100 - 1 ]; - myEdge[ ID_E10z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V101 - 1 ]; - - myEdge[ ID_E01z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V010 - 1 ]; - myEdge[ ID_E01z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V011 - 1 ]; - - myEdge[ ID_E11z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V110 - 1 ]; - myEdge[ ID_E11z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ]; - - for ( iE = ID_Ex00; iE <= ID_E11z; ++iE ) - myEdge[ iE - ID_Ex00 ].myCoordInd = GetCoordIndOnEdge( iE ); - - // fill faces corners - for ( iF = ID_Fxy0; iF < ID_Shell; ++iF ) - { - TFace& tFace = myFace[ iF - ID_Fxy0 ]; - vector< int > edgeIdVec(4, -1); - GetFaceEdgesIDs( iF, edgeIdVec ); - tFace.myNodes[ 0 ] = myEdge[ edgeIdVec [ 0 ] - ID_Ex00 ].myNodes[ 1 ]; - tFace.myNodes[ 1 ] = myEdge[ edgeIdVec [ 0 ] - ID_Ex00 ].myNodes[ 0 ]; - tFace.myNodes[ 2 ] = myEdge[ edgeIdVec [ 1 ] - ID_Ex00 ].myNodes[ 0 ]; - tFace.myNodes[ 3 ] = myEdge[ edgeIdVec [ 1 ] - ID_Ex00 ].myNodes[ 1 ]; - tFace.myCoordInd[ 0 ] = GetCoordIndOnEdge( edgeIdVec[ 0 ] ); - tFace.myCoordInd[ 1 ] = GetCoordIndOnEdge( edgeIdVec[ 1 ] ); - tFace.myCoordInd[ 2 ] = GetCoordIndOnEdge( edgeIdVec[ 2 ] ); - tFace.myCoordInd[ 3 ] = GetCoordIndOnEdge( edgeIdVec[ 3 ] ); - } - - return true; -} - -//======================================================================= -//function : LoadBlockShapes -//purpose : add sub-shapes of theBlock to theShapeIDMap so that they get -// IDs acoording to enum TShapeID -//======================================================================= - -bool SMESH_Block::LoadBlockShapes(const TopoDS_Shell& theShell, - const TopoDS_Vertex& theVertex000, - const TopoDS_Vertex& theVertex001, - TopTools_IndexedMapOfOrientedShape& theShapeIDMap ) -{ - MESSAGE(" ::LoadBlockShapes()"); - - myShell = theShell; - myNbIterations = 0; - mySumDist = 0; - myGridComputed = false; - - // 8 vertices - TopoDS_Shape V000, V100, V010, V110, V001, V101, V011, V111; - // 12 edges - TopoDS_Shape Ex00, Ex10, Ex01, Ex11; - TopoDS_Shape E0y0, E1y0, E0y1, E1y1; - TopoDS_Shape E00z, E10z, E01z, E11z; - // 6 faces - TopoDS_Shape Fxy0, Fx0z, F0yz, Fxy1, Fx1z, F1yz; - - // nb of faces bound to a vertex in TopTools_IndexedDataMapOfShapeListOfShape - // filled by TopExp::MapShapesAndAncestors() - const int NB_FACES_BY_VERTEX = 6; - - TopTools_IndexedDataMapOfShapeListOfShape vfMap; - TopExp::MapShapesAndAncestors( myShell, TopAbs_VERTEX, TopAbs_FACE, vfMap ); - if ( vfMap.Extent() != 8 ) { - MESSAGE(" Wrong nb of vertices in the block: " << vfMap.Extent() ); - return false; - } - - V000 = theVertex000; - V001 = theVertex001; - - if ( V000.IsNull() ) { - // find vertex 000 - the one with smallest coordinates - double minVal = DBL_MAX, minX, val; - for ( int i = 1; i <= 8; i++ ) { - const TopoDS_Vertex& v = TopoDS::Vertex( vfMap.FindKey( i )); - gp_Pnt P = BRep_Tool::Pnt( v ); - val = P.X() + P.Y() + P.Z(); - if ( val < minVal || ( val == minVal && P.X() < minX )) { - V000 = v; - minVal = val; - minX = P.X(); - } - } - // find vertex 001 - the one on the most vertical edge passing through V000 - TopTools_IndexedDataMapOfShapeListOfShape veMap; - TopExp::MapShapesAndAncestors( myShell, TopAbs_VERTEX, TopAbs_EDGE, veMap ); - gp_Vec dir001 = gp::DZ(); - gp_Pnt p000 = BRep_Tool::Pnt( TopoDS::Vertex( V000 )); - double maxVal = -DBL_MAX; - TopTools_ListIteratorOfListOfShape eIt ( veMap.FindFromKey( V000 )); - for ( ; eIt.More(); eIt.Next() ) { - const TopoDS_Edge& e = TopoDS::Edge( eIt.Value() ); - TopoDS_Vertex v = TopExp::FirstVertex( e ); - if ( v.IsSame( V000 )) - v = TopExp::LastVertex( e ); - val = dir001 * gp_Vec( p000, BRep_Tool::Pnt( v )).Normalized(); - if ( val > maxVal ) { - V001 = v; - maxVal = val; - } - } - } - - // find the bottom (Fxy0), Fx0z and F0yz faces - - const TopTools_ListOfShape& f000List = vfMap.FindFromKey( V000 ); - const TopTools_ListOfShape& f001List = vfMap.FindFromKey( V001 ); - if (f000List.Extent() != NB_FACES_BY_VERTEX || - f001List.Extent() != NB_FACES_BY_VERTEX ) { - MESSAGE(" LoadBlockShapes() " << f000List.Extent() << " " << f001List.Extent()); - return false; - } - TopTools_ListIteratorOfListOfShape f001It, f000It ( f000List ); - int i, j, iFound1, iFound2; - for ( j = 0; f000It.More(); f000It.Next(), j++ ) - { - if ( NB_FACES_BY_VERTEX == 6 && j % 2 ) continue; // each face encounters twice - const TopoDS_Shape& F = f000It.Value(); - for ( i = 0, f001It.Initialize( f001List ); f001It.More(); f001It.Next(), i++ ) { - if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice - if ( F.IsSame( f001It.Value() )) - break; - } - if ( f001It.More() ) // Fx0z or F0yz found - if ( Fx0z.IsNull() ) { - Fx0z = F; - iFound1 = i; - } else { - F0yz = F; - iFound2 = i; - } - else // F is the bottom face - Fxy0 = F; - } - if ( Fxy0.IsNull() || Fx0z.IsNull() || F0yz.IsNull() ) { - MESSAGE( Fxy0.IsNull() <<" "<< Fx0z.IsNull() <<" "<< F0yz.IsNull() ); - return false; - } - - // choose the top face (Fxy1) - for ( i = 0, f001It.Initialize( f001List ); f001It.More(); f001It.Next(), i++ ) { - if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice - if ( i != iFound1 && i != iFound2 ) - break; - } - Fxy1 = f001It.Value(); - if ( Fxy1.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - - // find bottom edges and veritices - list< TopoDS_Edge > eList; - list< int > nbVertexInWires; - getOrderedEdges( TopoDS::Face( Fxy0 ), TopoDS::Vertex( V000 ), eList, nbVertexInWires ); - if ( nbVertexInWires.size() != 1 || nbVertexInWires.front() != 4 ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - list< TopoDS_Edge >::iterator elIt = eList.begin(); - for ( i = 0; elIt != eList.end(); elIt++, i++ ) - switch ( i ) { - case 0: E0y0 = *elIt; V010 = TopExp::LastVertex( *elIt, true ); break; - case 1: Ex10 = *elIt; V110 = TopExp::LastVertex( *elIt, true ); break; - case 2: E1y0 = *elIt; V100 = TopExp::LastVertex( *elIt, true ); break; - case 3: Ex00 = *elIt; break; - default:; - } - if ( i != 4 || E0y0.IsNull() || Ex10.IsNull() || E1y0.IsNull() || Ex00.IsNull() ) { - MESSAGE(" LoadBlockShapes() error, eList.size()=" << eList.size()); - return false; - } - - - // find top edges and veritices - eList.clear(); - getOrderedEdges( TopoDS::Face( Fxy1 ), TopoDS::Vertex( V001 ), eList, nbVertexInWires ); - if ( nbVertexInWires.size() != 1 || nbVertexInWires.front() != 4 ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - for ( i = 0, elIt = eList.begin(); elIt != eList.end(); elIt++, i++ ) - switch ( i ) { - case 0: Ex01 = *elIt; V101 = TopExp::LastVertex( *elIt, true ); break; - case 1: E1y1 = *elIt; V111 = TopExp::LastVertex( *elIt, true ); break; - case 2: Ex11 = *elIt; V011 = TopExp::LastVertex( *elIt, true ); break; - case 3: E0y1 = *elIt; break; - default:; - } - if ( i != 4 || Ex01.IsNull() || E1y1.IsNull() || Ex11.IsNull() || E0y1.IsNull() ) { - MESSAGE(" LoadBlockShapes() error, eList.size()=" << eList.size()); - return false; - } - - // swap Fx0z and F0yz if necessary - TopExp_Explorer exp( Fx0z, TopAbs_VERTEX ); - for ( ; exp.More(); exp.Next() ) // Fx0z shares V101 and V100 - if ( V101.IsSame( exp.Current() ) || V100.IsSame( exp.Current() )) - break; // V101 or V100 found - if ( !exp.More() ) { // not found - TopoDS_Shape f = Fx0z; Fx0z = F0yz; F0yz = f; - } - - // find Fx1z and F1yz faces - const TopTools_ListOfShape& f111List = vfMap.FindFromKey( V111 ); - const TopTools_ListOfShape& f110List = vfMap.FindFromKey( V110 ); - if (f111List.Extent() != NB_FACES_BY_VERTEX || - f110List.Extent() != NB_FACES_BY_VERTEX ) { - MESSAGE(" LoadBlockShapes() " << f111List.Extent() << " " << f110List.Extent()); - return false; - } - TopTools_ListIteratorOfListOfShape f111It, f110It ( f110List); - for ( j = 0 ; f110It.More(); f110It.Next(), j++ ) { - if ( NB_FACES_BY_VERTEX == 6 && j % 2 ) continue; // each face encounters twice - const TopoDS_Shape& F = f110It.Value(); - for ( i = 0, f111It.Initialize( f111List ); f111It.More(); f111It.Next(), i++ ) { - if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice - if ( F.IsSame( f111It.Value() )) { // Fx1z or F1yz found - if ( Fx1z.IsNull() ) - Fx1z = F; - else - F1yz = F; - } - } - } - if ( Fx1z.IsNull() || F1yz.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - - // swap Fx1z and F1yz if necessary - for ( exp.Init( Fx1z, TopAbs_VERTEX ); exp.More(); exp.Next() ) - if ( V010.IsSame( exp.Current() ) || V011.IsSame( exp.Current() )) - break; - if ( !exp.More() ) { - TopoDS_Shape f = Fx1z; Fx1z = F1yz; F1yz = f; - } - - // find vertical edges - for ( exp.Init( Fx0z, TopAbs_EDGE ); exp.More(); exp.Next() ) { - const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() ); - const TopoDS_Shape& vFirst = TopExp::FirstVertex( edge, true ); - if ( vFirst.IsSame( V001 )) - E00z = edge; - else if ( vFirst.IsSame( V100 )) - E10z = edge; - } - if ( E00z.IsNull() || E10z.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - for ( exp.Init( Fx1z, TopAbs_EDGE ); exp.More(); exp.Next() ) { - const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() ); - const TopoDS_Shape& vFirst = TopExp::FirstVertex( edge, true ); - if ( vFirst.IsSame( V111 )) - E11z = edge; - else if ( vFirst.IsSame( V010 )) - E01z = edge; - } - if ( E01z.IsNull() || E11z.IsNull() ) { - MESSAGE(" LoadBlockShapes() error "); - return false; - } - - // load shapes in theShapeIDMap - - theShapeIDMap.Clear(); - - theShapeIDMap.Add(V000.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V100.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V010.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V110.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V001.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V101.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V011.Oriented( TopAbs_FORWARD )); - theShapeIDMap.Add(V111.Oriented( TopAbs_FORWARD )); - - theShapeIDMap.Add(Ex00); - theShapeIDMap.Add(Ex10); - theShapeIDMap.Add(Ex01); - theShapeIDMap.Add(Ex11); - - theShapeIDMap.Add(E0y0); - theShapeIDMap.Add(E1y0); - theShapeIDMap.Add(E0y1); - theShapeIDMap.Add(E1y1); - - theShapeIDMap.Add(E00z); - theShapeIDMap.Add(E10z); - theShapeIDMap.Add(E01z); - theShapeIDMap.Add(E11z); - - theShapeIDMap.Add(Fxy0); - theShapeIDMap.Add(Fxy1); - theShapeIDMap.Add(Fx0z); - theShapeIDMap.Add(Fx1z); - theShapeIDMap.Add(F0yz); - theShapeIDMap.Add(F1yz); - - theShapeIDMap.Add(myShell); - - if ( theShapeIDMap.Extent() != 27 ) { - MESSAGE("LoadBlockShapes() " << theShapeIDMap.Extent() ); - return false; - } - - // store shapes geometry - for ( int shapeID = 1; shapeID < theShapeIDMap.Extent(); shapeID++ ) - { - const TopoDS_Shape& S = theShapeIDMap( shapeID ); - switch ( S.ShapeType() ) - { - case TopAbs_VERTEX: { - - if ( shapeID > ID_V111 ) { - MESSAGE(" shapeID =" << shapeID ); - return false; - } - myPnt[ shapeID - ID_V000 ] = - BRep_Tool::Pnt( TopoDS::Vertex( S )).XYZ(); - break; - } - case TopAbs_EDGE: { - - const TopoDS_Edge& edge = TopoDS::Edge( S ); - if ( shapeID < ID_Ex00 || shapeID > ID_E11z || edge.IsNull() ) { - MESSAGE(" shapeID =" << shapeID ); - return false; - } - TEdge& tEdge = myEdge[ shapeID - ID_Ex00 ]; - tEdge.myCoordInd = GetCoordIndOnEdge( shapeID ); - TopLoc_Location loc; - tEdge.myC3d = BRep_Tool::Curve( edge, loc, tEdge.myFirst, tEdge.myLast ); - if ( !IsForwardEdge( edge, theShapeIDMap )) - Swap( tEdge.myFirst, tEdge.myLast ); - tEdge.myTrsf = loc; - break; - } - case TopAbs_FACE: { - - const TopoDS_Face& face = TopoDS::Face( S ); - if ( shapeID < ID_Fxy0 || shapeID > ID_F1yz || face.IsNull() ) { - MESSAGE(" shapeID =" << shapeID ); - return false; - } - TFace& tFace = myFace[ shapeID - ID_Fxy0 ]; - // pcurves - vector< int > edgeIdVec(4, -1); - GetFaceEdgesIDs( shapeID, edgeIdVec ); - for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges - { - const TopoDS_Edge& edge = TopoDS::Edge( theShapeIDMap( edgeIdVec[ iE ])); - tFace.myCoordInd[ iE ] = GetCoordIndOnEdge( edgeIdVec[ iE ] ); - tFace.myC2d[ iE ] = - BRep_Tool::CurveOnSurface( edge, face, tFace.myFirst[iE], tFace.myLast[iE] ); - if ( !IsForwardEdge( edge, theShapeIDMap )) - Swap( tFace.myFirst[ iE ], tFace.myLast[ iE ] ); - } - // 2d corners - tFace.myCorner[ 0 ] = tFace.myC2d[ 0 ]->Value( tFace.myFirst[0] ).XY(); - tFace.myCorner[ 1 ] = tFace.myC2d[ 0 ]->Value( tFace.myLast[0] ).XY(); - tFace.myCorner[ 2 ] = tFace.myC2d[ 1 ]->Value( tFace.myLast[1] ).XY(); - tFace.myCorner[ 3 ] = tFace.myC2d[ 1 ]->Value( tFace.myFirst[1] ).XY(); - // sufrace - TopLoc_Location loc; - tFace.myS = BRep_Tool::Surface( face, loc ); - tFace.myTrsf = loc; - break; - } - default: break; - } - } // loop on shapes in theShapeIDMap - - return true; -} - -//======================================================================= -//function : GetFaceEdgesIDs -//purpose : return edges IDs in the order u0, u1, 0v, 1v -// u0 means "|| u, v == 0" -//======================================================================= - -void SMESH_Block::GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec ) -{ - edgeVec.resize( 4 ); - switch ( faceID ) { - case ID_Fxy0: - edgeVec[ 0 ] = ID_Ex00; - edgeVec[ 1 ] = ID_Ex10; - edgeVec[ 2 ] = ID_E0y0; - edgeVec[ 3 ] = ID_E1y0; - break; - case ID_Fxy1: - edgeVec[ 0 ] = ID_Ex01; - edgeVec[ 1 ] = ID_Ex11; - edgeVec[ 2 ] = ID_E0y1; - edgeVec[ 3 ] = ID_E1y1; - break; - case ID_Fx0z: - edgeVec[ 0 ] = ID_Ex00; - edgeVec[ 1 ] = ID_Ex01; - edgeVec[ 2 ] = ID_E00z; - edgeVec[ 3 ] = ID_E10z; - break; - case ID_Fx1z: - edgeVec[ 0 ] = ID_Ex10; - edgeVec[ 1 ] = ID_Ex11; - edgeVec[ 2 ] = ID_E01z; - edgeVec[ 3 ] = ID_E11z; - break; - case ID_F0yz: - edgeVec[ 0 ] = ID_E0y0; - edgeVec[ 1 ] = ID_E0y1; - edgeVec[ 2 ] = ID_E00z; - edgeVec[ 3 ] = ID_E01z; - break; - case ID_F1yz: - edgeVec[ 0 ] = ID_E1y0; - edgeVec[ 1 ] = ID_E1y1; - edgeVec[ 2 ] = ID_E10z; - edgeVec[ 3 ] = ID_E11z; - break; - default: - MESSAGE(" GetFaceEdgesIDs(), wrong face ID: " << faceID ); - } -} - -//======================================================================= -//function : GetEdgeVertexIDs -//purpose : return vertex IDs of an edge -//======================================================================= - -void SMESH_Block::GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec ) -{ - vertexVec.resize( 2 ); - switch ( edgeID ) { - - case ID_Ex00: - vertexVec[ 0 ] = ID_V000; - vertexVec[ 1 ] = ID_V100; - break; - case ID_Ex10: - vertexVec[ 0 ] = ID_V010; - vertexVec[ 1 ] = ID_V110; - break; - case ID_Ex01: - vertexVec[ 0 ] = ID_V001; - vertexVec[ 1 ] = ID_V101; - break; - case ID_Ex11: - vertexVec[ 0 ] = ID_V011; - vertexVec[ 1 ] = ID_V111; - break; - - case ID_E0y0: - vertexVec[ 0 ] = ID_V000; - vertexVec[ 1 ] = ID_V010; - break; - case ID_E1y0: - vertexVec[ 0 ] = ID_V100; - vertexVec[ 1 ] = ID_V110; - break; - case ID_E0y1: - vertexVec[ 0 ] = ID_V001; - vertexVec[ 1 ] = ID_V011; - break; - case ID_E1y1: - vertexVec[ 0 ] = ID_V101; - vertexVec[ 1 ] = ID_V111; - break; - - case ID_E00z: - vertexVec[ 0 ] = ID_V000; - vertexVec[ 1 ] = ID_V001; - break; - case ID_E10z: - vertexVec[ 0 ] = ID_V100; - vertexVec[ 1 ] = ID_V101; - break; - case ID_E01z: - vertexVec[ 0 ] = ID_V010; - vertexVec[ 1 ] = ID_V011; - break; - case ID_E11z: - vertexVec[ 0 ] = ID_V110; - vertexVec[ 1 ] = ID_V111; - break; - default: - MESSAGE(" GetEdgeVertexIDs(), wrong edge ID: " << edgeID ); - } -} - diff --git a/src/SMESH/SMESH_Block.hxx b/src/SMESH/SMESH_Block.hxx deleted file mode 100644 index 155104866..000000000 --- a/src/SMESH/SMESH_Block.hxx +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -// File : SMESH_Block.hxx -// Created : Tue Nov 30 12:42:18 2004 -// Author : Edward AGAPOV (eap) - - -#ifndef SMESH_Block_HeaderFile -#define SMESH_Block_HeaderFile - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -class SMDS_MeshVolume; -class SMDS_MeshNode; - -// ========================================================= -// class calculating coordinates of 3D points by normalized -// parameters inside the block and vice versa -// ========================================================= - -class SMESH_Block: public math_FunctionSetWithDerivatives -{ - public: - enum TShapeID { // ids of the block sub-shapes - ID_NONE = 0, - - ID_V000 = 1, ID_V100, ID_V010, ID_V110, ID_V001, ID_V101, ID_V011, ID_V111, - - ID_Ex00, ID_Ex10, ID_Ex01, ID_Ex11, - ID_E0y0, ID_E1y0, ID_E0y1, ID_E1y1, - ID_E00z, ID_E10z, ID_E01z, ID_E11z, - - ID_Fxy0, ID_Fxy1, ID_Fx0z, ID_Fx1z, ID_F0yz, ID_F1yz, - - ID_Shell - }; - - - public: // methods about ids of the block sub-shapes - - static int NbVertices() { return 8; } - static int NbEdges() { return 12; } - static int NbFaces() { return 6; } - static int NbSubShapes() { return ID_Shell; } - // to avoid magic numbers when allocating memory for subshapes - - static inline bool IsVertexID( int theShapeID ) - { return ( theShapeID >= ID_V000 && theShapeID <= ID_V111 ); } - - static inline bool IsEdgeID( int theShapeID ) - { return ( theShapeID >= ID_Ex00 && theShapeID <= ID_E11z ); } - - static inline bool IsFaceID( int theShapeID ) - { return ( theShapeID >= ID_Fxy0 && theShapeID <= ID_F1yz ); } - - static int ShapeIndex( int theShapeID ) - { - if ( IsVertexID( theShapeID )) return theShapeID - ID_V000; - if ( IsEdgeID( theShapeID )) return theShapeID - ID_Ex00; - if ( IsFaceID( theShapeID )) return theShapeID - ID_Fxy0; - return 0; - } - // return index [0-...] for each type of sub-shapes, - // for example : - // ShapeIndex( ID_Ex00 ) == 0 - // ShapeIndex( ID_Ex10 ) == 1 - - static void GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec ); - // return edges IDs of a face in the order u0, u1, 0v, 1v - - static void GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec ); - // return vertex IDs of an edge - - static int GetCoordIndOnEdge (const int theEdgeID) - { return (theEdgeID < ID_E0y0) ? 1 : (theEdgeID < ID_E00z) ? 2 : 3; } - // return an index of a coordinate which varies along the edge - - static double* GetShapeCoef (const int theShapeID); - // for theShapeID( TShapeID ), returns 3 coefficients used - // to compute an addition of an on-theShape point to coordinates - // of an in-shell point. If an in-shell point has parameters (Px,Py,Pz), - // then the addition of a point P is computed as P*kx*ky*kz and ki is - // defined by the returned coef like this: - // ki = (coef[i] == 0) ? 1 : (coef[i] < 0) ? 1 - Pi : Pi - - static int GetShapeIDByParams ( const gp_XYZ& theParams ); - // define an id of the block sub-shape by point parameters - - static ostream& DumpShapeID (const int theBlockShapeID, ostream& stream); - // DEBUG: dump an id of a block sub-shape - - - public: // initialization - - SMESH_Block (): myNbIterations(0), mySumDist(0.) {} - - bool LoadBlockShapes(const TopoDS_Shell& theShell, - const TopoDS_Vertex& theVertex000, - const TopoDS_Vertex& theVertex001, - TopTools_IndexedMapOfOrientedShape& theShapeIDMap ); - // add sub-shapes of theBlock to theShapeIDMap so that they get - // IDs acoording to enum TShapeID - - bool LoadMeshBlock(const SMDS_MeshVolume* theVolume, - const int theNode000Index, - const int theNode001Index, - vector& theOrderedNodes); - // prepare to work with theVolume and - // return nodes in the order of TShapeID enum - - - public: // define coordinates by parameters - - bool VertexPoint( const int theVertexID, gp_XYZ& thePoint ) const { - if ( !IsVertexID( theVertexID )) return false; - thePoint = myPnt[ theVertexID - ID_V000 ]; return true; - } - // return vertex coordinates, parameters are defined by theVertexID - - bool EdgePoint( const int theEdgeID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const { - if ( !IsEdgeID( theEdgeID )) return false; - thePoint = myEdge[ theEdgeID - ID_Ex00 ].Point( theParams ); return true; - } - // return coordinates of a point on edge - - bool FacePoint( const int theFaceID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const { - if ( !IsFaceID ( theFaceID )) return false; - thePoint = myFace[ theFaceID - ID_Fxy0 ].Point( theParams ); return true; - } - // return coordinates of a point on face - - bool ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const; - // return coordinates of a point in shell - - static bool ShellPoint(const gp_XYZ& theParams, - const vector& thePointOnShape, - gp_XYZ& thePoint ); - // computes coordinates of a point in shell by points on sub-shapes; - // thePointOnShape[ subShapeID ] must be a point on a subShape; - // thePointOnShape.size() == ID_Shell, thePointOnShape[0] not used - - - public: // define parameters by coordinates - - bool ComputeParameters (const gp_Pnt& thePoint, - gp_XYZ& theParams, - const int theShapeID = ID_Shell); - // compute point parameters in the block. - // Note: for edges, it is better to use EdgeParameters() - - bool VertexParameters(const int theVertexID, gp_XYZ& theParams); - // return parameters of a vertex given by TShapeID - - bool EdgeParameters(const int theEdgeID, const double theU, gp_XYZ& theParams); - // return parameters of a point given by theU on edge - - - public: // services - - static bool IsForwardEdge (const TopoDS_Edge & theEdge, - TopTools_IndexedMapOfOrientedShape& theShapeIDMap) { - int v1ID = theShapeIDMap.FindIndex( TopExp::FirstVertex( theEdge ).Oriented( TopAbs_FORWARD )); - int v2ID = theShapeIDMap.FindIndex( TopExp::LastVertex( theEdge ).Oriented( TopAbs_FORWARD )); - return ( v1ID < v2ID ); - } - // Return true if an in-block parameter increases along theEdge curve - - static void Swap(double& a, double& b) { double tmp = a; a = b; b = tmp; } - - - public: - // methods of math_FunctionSetWithDerivatives used internally - // to define parameters by coordinates - Standard_Integer NbVariables() const; - Standard_Integer NbEquations() const; - Standard_Boolean Value(const math_Vector& X,math_Vector& F) ; - Standard_Boolean Derivatives(const math_Vector& X,math_Matrix& D) ; - Standard_Boolean Values(const math_Vector& X,math_Vector& F,math_Matrix& D) ; - Standard_Integer GetStateNumber (); - - private: - - struct TEdge { - int myCoordInd; - double myFirst; - double myLast; - Handle(Geom_Curve) myC3d; - gp_Trsf myTrsf; - double GetU( const gp_XYZ& theParams ) const; - gp_XYZ Point( const gp_XYZ& theParams ) const; - // if mesh volume - gp_XYZ myNodes[2]; - }; - - struct TFace { - // 4 edges in the order u0, u1, 0v, 1v - int myCoordInd[ 4 ]; - double myFirst [ 4 ]; - double myLast [ 4 ]; - Handle(Geom2d_Curve) myC2d [ 4 ]; - // 4 corner points in the order 00, 10, 11, 01 - gp_XY myCorner [ 4 ]; - // surface - Handle(Geom_Surface) myS; - gp_Trsf myTrsf; - gp_XY GetUV( const gp_XYZ& theParams ) const; - gp_XYZ Point( const gp_XYZ& theParams ) const; - int GetUInd() const { return myCoordInd[ 0 ]; } - int GetVInd() const { return myCoordInd[ 2 ]; } - void GetCoefs( int i, const gp_XYZ& theParams, double& eCoef, double& vCoef ) const; - // if mesh volume - gp_XYZ myNodes[4]; - }; - - TopoDS_Shell myShell; - // geometry in the order as in TShapeID: - // 8 vertices - gp_XYZ myPnt[ 8 ]; - // 12 edges - TEdge myEdge[ 12 ]; - // 6 faces - TFace myFace[ 6 ]; - - // for param computation - - int myFaceIndex; - double myFaceParam; - int myNbIterations; - double mySumDist; - - gp_XYZ myPoint; // the given point - gp_XYZ myParam; // the best parameters guess - double myValues[ 4 ]; // values computed at myParam - - typedef pair TxyzPair; - TxyzPair my3x3x3GridNodes[ 27 ]; - bool myGridComputed; -}; - - -#endif diff --git a/src/SMESH/SMESH_Group.cxx b/src/SMESH/SMESH_Group.cxx deleted file mode 100644 index 49cade122..000000000 --- a/src/SMESH/SMESH_Group.cxx +++ /dev/null @@ -1,66 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group.cxx -// Author : Michael Sazonov (OCC) -// Module : SMESH -// $Header$ - -#include "SMESH_Group.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESHDS_Group.hxx" -#include "SMESHDS_GroupOnGeom.hxx" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group::SMESH_Group (int theID, - const SMESH_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const char* theName, - const TopoDS_Shape& theShape) - : myName(theName) -{ - if ( theShape.IsNull() ) - myGroupDS = new SMESHDS_Group (theID, - const_cast(theMesh)->GetMeshDS(), - theType); - else - myGroupDS = new SMESHDS_GroupOnGeom (theID, - const_cast(theMesh)->GetMeshDS(), - theType, - theShape); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group::~SMESH_Group () -{ - delete myGroupDS; -} diff --git a/src/SMESH/SMESH_Group.hxx b/src/SMESH/SMESH_Group.hxx deleted file mode 100644 index 26493e4e0..000000000 --- a/src/SMESH/SMESH_Group.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group.hxx -// Author : Michael Sazonov (OCC) -// Module : SMESH -// $Header$ - -#ifndef _SMESH_Group_HeaderFile -#define _SMESH_Group_HeaderFile - -#include -#include -#include - - -class SMESHDS_GroupBase; -class SMESH_Mesh; - -class SMESH_Group -{ - public: - - SMESH_Group (int theID, - const SMESH_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const char* theName, - const TopoDS_Shape& theShape = TopoDS_Shape()); - ~SMESH_Group (); - - void SetName (const char* theName) { myName = theName; } - - const char* GetName () const { return myName.c_str(); } - - SMESHDS_GroupBase * GetGroupDS () { return myGroupDS; } - - private: - SMESH_Group (const SMESH_Group& theOther); - // prohibited copy constructor - SMESH_Group& operator = (const SMESH_Group& theOther); - // prohibited assign operator - - SMESHDS_GroupBase * myGroupDS; - std::string myName; - -}; - -#endif diff --git a/src/SMESH/SMESH_HypoFilter.cxx b/src/SMESH/SMESH_HypoFilter.cxx deleted file mode 100644 index ff14016d8..000000000 --- a/src/SMESH/SMESH_HypoFilter.cxx +++ /dev/null @@ -1,305 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_HypoFilter.cxx -// Module : SMESH -// $Header$ - -#include "SMESH_HypoFilter.hxx" - -#include "SMESH_Hypothesis.hxx" -#include "SMESH_subMesh.hxx" - -using namespace std; - - -//======================================================================= -//function : NamePredicate::Value -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::NamePredicate::IsOk (const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& /*aShape*/ ) const -{ - return ( _name == aHyp->GetName() ); -} - -//======================================================================= -//function : TypePredicate::Value -//purpose : -//======================================================================= - -int SMESH_HypoFilter::TypePredicate::Value( const SMESH_Hypothesis* aHyp ) const -{ - return aHyp->GetType(); -}; - -//======================================================================= -//function : DimPredicate::Value -//purpose : -//======================================================================= - -int SMESH_HypoFilter::DimPredicate::Value( const SMESH_Hypothesis* aHyp ) const -{ - return aHyp->GetDim(); -} - -//======================================================================= -//function : ApplicablePredicate::IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::ApplicablePredicate::IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& /*aShape*/) const -{ - return SMESH_subMesh::IsApplicableHypotesis( aHyp, (TopAbs_ShapeEnum)_shapeType ); -}; - -//======================================================================= -//function : ApplicablePredicate::ApplicablePredicate -//purpose : -//======================================================================= - -SMESH_HypoFilter::ApplicablePredicate::ApplicablePredicate( const TopoDS_Shape& theShape ) -{ - _shapeType = ( theShape.IsNull() ? TopAbs_SHAPE : theShape.ShapeType()); -} - -//======================================================================= -//function : InstancePredicate::IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::InstancePredicate::IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& /*aShape*/) const -{ - return _hypo == aHyp; -} - -//======================================================================= -//function : IsAssignedToPredicate::IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::IsAssignedToPredicate::IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const -{ - return ( !_mainShape.IsNull() && !aShape.IsNull() && _mainShape.IsSame( aShape )); -} - -//======================================================================= -//function : SMESH_HypoFilter -//purpose : -//======================================================================= - -SMESH_HypoFilter::SMESH_HypoFilter() -{ -} - -//======================================================================= -//function : SMESH_HypoFilter -//purpose : -//======================================================================= - -SMESH_HypoFilter::SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate ) -{ - add( notNagate ? AND : AND_NOT, aPredicate ); -} - -//======================================================================= -//function : And -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::And( SMESH_HypoPredicate* aPredicate ) -{ - add( AND, aPredicate ); - return *this; -} - -//======================================================================= -//function : AndNot -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::AndNot( SMESH_HypoPredicate* aPredicate ) -{ - add( AND_NOT, aPredicate ); - return *this; -} - -//======================================================================= -//function : Or -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::Or( SMESH_HypoPredicate* aPredicate ) -{ - add( OR, aPredicate ); - return *this; -} - -//======================================================================= -//function : OrNot -//purpose : Return predicates -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::OrNot( SMESH_HypoPredicate* aPredicate ) -{ - add( OR_NOT, aPredicate ); - return *this; -} - -//======================================================================= -//function : Is -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::Is(const SMESH_Hypothesis* theHypo) -{ - return new InstancePredicate( theHypo ); -} - -//======================================================================= -//function : IsAlgo -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::IsAlgo() -{ - return new TypePredicate( MORE, SMESHDS_Hypothesis::PARAM_ALGO ); -} - -//======================================================================= -//function : IsGlobal -//purpose : -//======================================================================= - - SMESH_HypoPredicate* SMESH_HypoFilter::IsGlobal(const TopoDS_Shape& theMainShape) -{ - return new IsAssignedToPredicate( theMainShape ); -} - -//======================================================================= -//function : IsAssignedTo -//purpose : -//======================================================================= - - SMESH_HypoPredicate* SMESH_HypoFilter::IsAssignedTo(const TopoDS_Shape& theShape) -{ - return new IsAssignedToPredicate( theShape ); -} - -//======================================================================= -//function : HasName -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::HasName(const string & theName) -{ - return new NamePredicate( theName ); -} - -//======================================================================= -//function : HasDim -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::HasDim(const int theDim) -{ - return new DimPredicate( EQUAL, theDim ); -} - -//======================================================================= -//function : IsApplicableTo -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::IsApplicableTo(const TopoDS_Shape& theShape) -{ - return new ApplicablePredicate( theShape ); -} - -//======================================================================= -//function : HasType -//purpose : -//======================================================================= - -SMESH_HypoPredicate* SMESH_HypoFilter::HasType(const int theHypType) -{ - return new TypePredicate( EQUAL, theHypType ); -} - -//======================================================================= -//function : IsOk -//purpose : -//======================================================================= - -bool SMESH_HypoFilter::IsOk (const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const -{ - if ( myPredicates.empty() ) - return true; - - bool ok = ( myPredicates.front()->_logical_op <= AND_NOT ); - list::const_iterator pred = myPredicates.begin(); - for ( ; pred != myPredicates.end(); ++pred ) - { - bool ok2 = (*pred)->IsOk( aHyp, aShape ); - switch ( (*pred)->_logical_op ) { - case AND: ok = ok && ok2; break; - case AND_NOT: ok = ok && !ok2; break; - case OR: ok = ok || ok2; break; - case OR_NOT: ok = ok || !ok2; break; - default:; - } - } - return ok; -} - -//======================================================================= -//function : Init -//purpose : -//======================================================================= - -SMESH_HypoFilter & SMESH_HypoFilter::Init ( SMESH_HypoPredicate* aPredicate, bool notNagate ) -{ - list::const_iterator pred = myPredicates.begin(); - for ( ; pred != myPredicates.end(); ++pred ) - delete *pred; - - add( notNagate ? AND : AND_NOT, aPredicate ); - return *this; -} - - -//======================================================================= -//function : IsOk -//purpose : -//======================================================================= - -SMESH_HypoFilter::~SMESH_HypoFilter() -{ - Init(0); -} - diff --git a/src/SMESH/SMESH_HypoFilter.hxx b/src/SMESH/SMESH_HypoFilter.hxx deleted file mode 100644 index 6bc34bf53..000000000 --- a/src/SMESH/SMESH_HypoFilter.hxx +++ /dev/null @@ -1,164 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_HypoFilter.hxx -// Module : SMESH -// $Header$ - - -#ifndef SMESH_HypoFilter_HeaderFile -#define SMESH_HypoFilter_HeaderFile - -// =========================== -// Filter of SMESH_Hypothesis -// =========================== - -#include -#include -#include - -class SMESH_HypoFilter; -class SMESH_Hypothesis; - -class SMESH_HypoPredicate { - public: - virtual bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const = 0; - // check aHyp or/and aShape it is assigned to - virtual ~SMESH_HypoPredicate() {} - private: - int _logical_op; - friend class SMESH_HypoFilter; -}; - -class SMESH_HypoFilter: public SMESH_HypoPredicate -{ - public: - // Create and add predicates. - // Added predicates will be destroyed by filter when it dies - SMESH_HypoFilter(); - SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate = true ); - // notNagate==false means !aPredicate->IsOk() - SMESH_HypoFilter & Init ( SMESH_HypoPredicate* aPredicate, bool notNagate = true ); - SMESH_HypoFilter & And ( SMESH_HypoPredicate* aPredicate ); - SMESH_HypoFilter & AndNot( SMESH_HypoPredicate* aPredicate ); - SMESH_HypoFilter & Or ( SMESH_HypoPredicate* aPredicate ); - SMESH_HypoFilter & OrNot ( SMESH_HypoPredicate* aPredicate ); - - // Create predicates - static SMESH_HypoPredicate* IsAlgo(); - static SMESH_HypoPredicate* IsApplicableTo(const TopoDS_Shape& theShape); - static SMESH_HypoPredicate* IsAssignedTo(const TopoDS_Shape& theShape); - static SMESH_HypoPredicate* Is(const SMESH_Hypothesis* theHypo); - static SMESH_HypoPredicate* IsGlobal(const TopoDS_Shape& theMainShape); - static SMESH_HypoPredicate* HasName(const std::string & theName); - static SMESH_HypoPredicate* HasDim(const int theDim); - static SMESH_HypoPredicate* HasType(const int theHypType); - - bool IsOk (const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - // check aHyp or/and aShape it is assigned to - - ~SMESH_HypoFilter(); - - - protected: - // fields - - std::list myPredicates; - - // private methods - - enum Logical { AND, AND_NOT, OR, OR_NOT }; - enum Comparison { EQUAL, NOT_EQUAL, MORE, LESS }; - - SMESH_HypoFilter(const SMESH_HypoFilter& other){} - - void add( Logical bool_op, SMESH_HypoPredicate* pred ) - { - if ( pred ) { - pred->_logical_op = bool_op; - myPredicates.push_back( pred ); - } - } - - // predicates implementation - - template - struct templPredicate: public SMESH_HypoPredicate { - Comparison _comp; - TValue _val; - virtual TValue Value(const SMESH_Hypothesis* aHyp) const = 0; - virtual bool IsOk(const SMESH_Hypothesis* aHyp, const TopoDS_Shape& ) const - { - if ( _comp == EQUAL ) return _val == Value( aHyp ); - else if ( _comp == NOT_EQUAL ) return _val != Value( aHyp ); - else if ( _comp == MORE ) return _val < Value( aHyp ); - else return _val > Value( aHyp ); - } - }; - - struct NamePredicate : public SMESH_HypoPredicate { - std::string _name; - NamePredicate( std::string name ): _name(name){} - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - - struct TypePredicate : public templPredicate< int > { - TypePredicate( Comparison comp, int hypType ) - { _comp = comp; _val = hypType; } - int Value( const SMESH_Hypothesis* aHyp ) const; - }; - - struct DimPredicate : public templPredicate< int > { - DimPredicate( Comparison comp, int dim ) - { _comp = comp; _val = dim; } - int Value( const SMESH_Hypothesis* aHyp ) const; - }; - - struct ApplicablePredicate : public SMESH_HypoPredicate { - int _shapeType; - ApplicablePredicate( const TopoDS_Shape& theShape ); - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - - struct InstancePredicate : public SMESH_HypoPredicate { - const SMESH_Hypothesis* _hypo; - InstancePredicate( const SMESH_Hypothesis* hypo ):_hypo(hypo){} - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - - struct IsAssignedToPredicate : public SMESH_HypoPredicate { - TopoDS_Shape _mainShape; - IsAssignedToPredicate( const TopoDS_Shape& mainShape ):_mainShape(mainShape){} - bool IsOk(const SMESH_Hypothesis* aHyp, - const TopoDS_Shape& aShape) const; - }; - -}; - - -#endif diff --git a/src/SMESH/SMESH_Hypothesis.cxx b/src/SMESH/SMESH_Hypothesis.cxx deleted file mode 100644 index 0107c3e36..000000000 --- a/src/SMESH/SMESH_Hypothesis.cxx +++ /dev/null @@ -1,162 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Hypothesis.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -using namespace std; -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_subMesh.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::SMESH_Hypothesis(int hypId, - int studyId, - SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId) -{ - //MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis"); - _gen = gen; - _studyId = studyId; - StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId); - myStudyContext->mapHypothesis[_hypId] = this; - _type = PARAM_ALGO; - _shapeType = 0; // to be set by algo with TopAbs_Enum - _param_algo_dim = -1; // to be set by algo parameter -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::~SMESH_Hypothesis() -{ - MESSAGE("SMESH_Hypothesis::~SMESH_Hypothesis"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Hypothesis::GetDim() const -{ - int dim = -1; - switch (_type) - { - case ALGO_1D: dim = 1; break; - case ALGO_2D: dim = 2; break; - case ALGO_3D: dim = 3; break; - case PARAM_ALGO: dim = _param_algo_dim; break; - } - return dim; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Hypothesis::GetShapeType() const -{ - return _shapeType; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Hypothesis::GetStudyId() const -{ - return _studyId; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Hypothesis::NotifySubMeshesHypothesisModification() -{ - MESSAGE("SMESH_Hypothesis::NotifySubMeshesHypothesisModification"); - - // for all meshes in study - - StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId); - map::iterator itm; - for (itm = myStudyContext->mapMesh.begin(); - itm != myStudyContext->mapMesh.end(); - itm++) - { - SMESH_Mesh* mesh = (*itm).second; - const list& subMeshes = - mesh->GetSubMeshUsingHypothesis(this); - - //for all subMeshes using hypothesis - - list::const_iterator its; - for (its = subMeshes.begin(); its != subMeshes.end(); its++) - (*its)->ComputeStateEngine(SMESH_subMesh::MODIF_HYP); - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const char* SMESH_Hypothesis::GetLibName() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetLibName"); -// SCRUTE(_LibName); -// SCRUTE(&_LibName); - return _libName.c_str(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Hypothesis::SetLibName(const char* theLibName) -{ -// MESSAGE("SMESHDS_Hypothesis::SetLibName"); - _libName = string(theLibName); -} diff --git a/src/SMESH/SMESH_Hypothesis.hxx b/src/SMESH/SMESH_Hypothesis.hxx deleted file mode 100644 index 1d881a680..000000000 --- a/src/SMESH/SMESH_Hypothesis.hxx +++ /dev/null @@ -1,74 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Hypothesis.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HYPOTHESIS_HXX_ -#define _SMESH_HYPOTHESIS_HXX_ - -#include "SMESHDS_Hypothesis.hxx" - -class SMESH_Gen; - -class SMESH_Hypothesis: public SMESHDS_Hypothesis -{ -public: - enum Hypothesis_Status // in the order of severity - { - HYP_OK, - HYP_MISSING, // algo misses a hypothesis - HYP_CONCURENT, // several applicable hypotheses - HYP_BAD_PARAMETER,// hypothesis has a bad parameter value - HYP_UNKNOWN_FATAL,// --- all statuses below should be considered as fatal - // for Add/RemoveHypothesis operations - HYP_INCOMPATIBLE, // hypothesis does not fit algo - HYP_NOTCONFORM, // not conform mesh is produced appling a hypothesis - HYP_ALREADY_EXIST,// such hypothesis already exist - HYP_BAD_DIM // bad dimension - }; - static bool IsStatusFatal(Hypothesis_Status theStatus) - { return theStatus >= HYP_UNKNOWN_FATAL; } - - SMESH_Hypothesis(int hypId, int studyId, SMESH_Gen* gen); - virtual ~SMESH_Hypothesis(); - int GetDim() const; - int GetStudyId() const; - void NotifySubMeshesHypothesisModification(); - int GetShapeType() const; - const char* GetLibName() const; - void SetLibName(const char* theLibName); - -protected: - SMESH_Gen* _gen; - int _studyId; - int _shapeType; - int _param_algo_dim; - -private: - std::string _libName; -}; - -#endif diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx deleted file mode 100644 index ffd77cd55..000000000 --- a/src/SMESH/SMESH_Mesh.cxx +++ /dev/null @@ -1,1430 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Mesh.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Group.hxx" -#include "SMESH_HypoFilter.hxx" -#include "SMESHDS_Group.hxx" -#include "SMESHDS_Script.hxx" -#include "SMESHDS_GroupOnGeom.hxx" -#include "SMDS_MeshVolume.hxx" - -#include "utilities.h" - -#include "DriverMED_W_SMESHDS_Mesh.h" -#include "DriverDAT_W_SMDS_Mesh.h" -#include "DriverUNV_W_SMDS_Mesh.h" -#include "DriverSTL_W_SMDS_Mesh.h" - -#include "DriverMED_R_SMESHDS_Mesh.h" -#include "DriverUNV_R_SMDS_Mesh.h" -#include "DriverSTL_R_SMDS_Mesh.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "Utils_ExceptHandlers.hxx" - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Mesh::SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, SMESHDS_Document * myDocument) -: _groupId( 0 ) -{ - INFOS("SMESH_Mesh::SMESH_Mesh(int localId)"); - _id = localId; - _studyId = studyId; - _gen = gen; - _myDocument = myDocument; - _idDoc = _myDocument->NewMesh(); - _myMeshDS = _myDocument->GetMesh(_idDoc); - _isShapeToMesh = false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Mesh::~SMESH_Mesh() -{ - INFOS("SMESH_Mesh::~SMESH_Mesh"); - - // delete groups - map < int, SMESH_Group * >::iterator itg; - for (itg = _mapGroup.begin(); itg != _mapGroup.end(); itg++) { - SMESH_Group *aGroup = (*itg).second; - delete aGroup; - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape) -{ - if(MYDEBUG) MESSAGE("SMESH_Mesh::ShapeToMesh"); - - if ( !_myMeshDS->ShapeToMesh().IsNull() && aShape.IsNull() ) - { - // removal of a shape to mesh, delete objects referring to sub-shapes: - // - sub-meshes - map ::iterator i_sm = _mapSubMesh.begin(); - for ( ; i_sm != _mapSubMesh.end(); ++i_sm ) - delete i_sm->second; - _mapSubMesh.clear(); - // - groups on geometry - map ::iterator i_gr = _mapGroup.begin(); - while ( i_gr != _mapGroup.end() ) { - if ( dynamic_cast( i_gr->second->GetGroupDS() )) { - _myMeshDS->RemoveGroup( i_gr->second->GetGroupDS() ); - delete i_gr->second; - _mapGroup.erase( i_gr++ ); - } - else - i_gr++; - } - _mapPropagationChains.Clear(); - } - else - { - if (_isShapeToMesh) - throw SALOME_Exception(LOCALIZED ("a shape to mesh has already been defined")); - } - _isShapeToMesh = true; - _myMeshDS->ShapeToMesh(aShape); - - // fill _mapAncestors - _mapAncestors.Clear(); - int desType, ancType; - for ( desType = TopAbs_EDGE; desType > TopAbs_COMPOUND; desType-- ) - for ( ancType = desType - 1; ancType >= TopAbs_COMPOUND; ancType-- ) - TopExp::MapShapesAndAncestors ( aShape, - (TopAbs_ShapeEnum) desType, - (TopAbs_ShapeEnum) ancType, - _mapAncestors ); - - // NRI : 24/02/03 - //EAP: 1/9/04 TopExp::MapShapes(aShape, _subShapes); USE the same map of _myMeshDS -} - -//======================================================================= -//function : UNVToMesh -//purpose : -//======================================================================= - -int SMESH_Mesh::UNVToMesh(const char* theFileName) -{ - if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); - MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); - MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); - MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); - } - return 1; -} - -//======================================================================= -//function : MEDToMesh -//purpose : -//======================================================================= - -int SMESH_Mesh::MEDToMesh(const char* theFileName, const char* theMeshName) -{ - if(MYDEBUG) MESSAGE("MEDToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); - MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); - MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); - MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); - } - - // Reading groups (sub-meshes are out of scope of MED import functionality) - list aGroupNames = myReader.GetGroupNamesAndTypes(); - if(MYDEBUG) MESSAGE("MEDToMesh - Nb groups = "<::iterator name_type = aGroupNames.begin(); - for ( ; name_type != aGroupNames.end(); name_type++ ) { - SMESH_Group* aGroup = AddGroup( name_type->second, name_type->first.c_str(), anId ); - if ( aGroup ) { - if(MYDEBUG) MESSAGE("MEDToMesh - group added: "<first.c_str()); - SMESHDS_Group* aGroupDS = dynamic_cast( aGroup->GetGroupDS() ); - if ( aGroupDS ) { - aGroupDS->SetStoreName( name_type->first.c_str() ); - myReader.GetGroup( aGroupDS ); - } - } - } - return (int) status; -} - -//======================================================================= -//function : STLToMesh -//purpose : -//======================================================================= - -int SMESH_Mesh::STLToMesh(const char* theFileName) -{ - if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<NbNodes() = "<<_myMeshDS->NbNodes()); - MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); - MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); - MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); - } - return 1; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::Hypothesis_Status - SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, - int anHypId ) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::AddHypothesis"); - - SMESH_subMesh *subMesh = GetSubMesh(aSubShape); - SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); - if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) // group of sub-shapes and maybe of not sub- - { - MESSAGE("AddHypothesis() to complex submesh"); - // return the worst but not fatal state of all group memebers - SMESH_Hypothesis::Hypothesis_Status aBestRet, aWorstNotFatal, ret; - aBestRet = SMESH_Hypothesis::HYP_BAD_DIM; - aWorstNotFatal = SMESH_Hypothesis::HYP_OK; - for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next()) - { - if ( !GetMeshDS()->ShapeToIndex( itS.Value() )) - continue; // not sub-shape - ret = AddHypothesis( itS.Value(), anHypId ); - if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal ) - aWorstNotFatal = ret; - if ( ret < aBestRet ) - aBestRet = ret; - } - if ( SMESH_Hypothesis::IsStatusFatal( aBestRet )) - return aBestRet; - return aWorstNotFatal; - } - - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - { - if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis"); - if(MYDEBUG) { - SCRUTE(_studyId); - SCRUTE(anHypId); - } - throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - } - - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - MESSAGE( "SMESH_Mesh::AddHypothesis " << anHyp->GetName() ); - - bool isGlobalHyp = IsMainShape( aSubShape ); - - // NotConformAllowed can be only global - if ( !isGlobalHyp ) - { - string hypName = anHyp->GetName(); - if ( hypName == "NotConformAllowed" ) - { - if(MYDEBUG) MESSAGE( "Hypotesis can be only global" ); - return SMESH_Hypothesis::HYP_INCOMPATIBLE; - } - } - - // shape - - int event; - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::ADD_HYP; - else - event = SMESH_subMesh::ADD_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); - - // subShapes - if (!SMESH_Hypothesis::IsStatusFatal(ret) && - !subMesh->IsApplicableHypotesis( anHyp )) // is added on father - { - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::ADD_FATHER_HYP; - else - event = SMESH_subMesh::ADD_FATHER_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret2 = - subMesh->SubMeshesAlgoStateEngine(event, anHyp); - if (ret2 > ret) - ret = ret2; - - // check concurent hypotheses on ansestors - if (ret < SMESH_Hypothesis::HYP_CONCURENT && !isGlobalHyp ) - { - const map < int, SMESH_subMesh * >& smMap = subMesh->DependsOn(); - map < int, SMESH_subMesh * >::const_iterator smIt = smMap.begin(); - for ( ; smIt != smMap.end(); smIt++ ) { - if ( smIt->second->IsApplicableHypotesis( anHyp )) { - ret2 = smIt->second->CheckConcurentHypothesis( anHyp->GetType() ); - if (ret2 > ret) { - ret = ret2; - break; - } - } - } - } - } - - if(MYDEBUG) subMesh->DumpAlgoState(true); - SCRUTE(ret); - return ret; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Hypothesis::Hypothesis_Status - SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, - int anHypId)throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::RemoveHypothesis"); - - SMESH_subMesh *subMesh = GetSubMesh(aSubShape); - SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); - if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) - { - // return the worst but not fatal state of all group memebers - SMESH_Hypothesis::Hypothesis_Status aBestRet, aWorstNotFatal, ret; - aBestRet = SMESH_Hypothesis::HYP_BAD_DIM; - aWorstNotFatal = SMESH_Hypothesis::HYP_OK; - for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next()) - { - if ( !GetMeshDS()->ShapeToIndex( itS.Value() )) - continue; // not sub-shape - ret = RemoveHypothesis( itS.Value(), anHypId ); - if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal ) - aWorstNotFatal = ret; - if ( ret < aBestRet ) - aBestRet = ret; - } - if ( SMESH_Hypothesis::IsStatusFatal( aBestRet )) - return aBestRet; - return aWorstNotFatal; - } - - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - int hypType = anHyp->GetType(); - if(MYDEBUG) SCRUTE(hypType); - int event; - - // shape - - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::REMOVE_HYP; - else - event = SMESH_subMesh::REMOVE_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); - - // there may appear concurrent hyps that were covered by the removed hyp - if (ret < SMESH_Hypothesis::HYP_CONCURENT && - subMesh->IsApplicableHypotesis( anHyp ) && - subMesh->CheckConcurentHypothesis( anHyp->GetType() ) != SMESH_Hypothesis::HYP_OK) - ret = SMESH_Hypothesis::HYP_CONCURENT; - - // subShapes - if (!SMESH_Hypothesis::IsStatusFatal(ret) && - !subMesh->IsApplicableHypotesis( anHyp )) // is removed from father - { - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::REMOVE_FATHER_HYP; - else - event = SMESH_subMesh::REMOVE_FATHER_ALGO; - SMESH_Hypothesis::Hypothesis_Status ret2 = - subMesh->SubMeshesAlgoStateEngine(event, anHyp); - if (ret2 > ret) // more severe - ret = ret2; - - // check concurent hypotheses on ansestors - if (ret < SMESH_Hypothesis::HYP_CONCURENT && !IsMainShape( aSubShape ) ) - { - const map < int, SMESH_subMesh * >& smMap = subMesh->DependsOn(); - map < int, SMESH_subMesh * >::const_iterator smIt = smMap.begin(); - for ( ; smIt != smMap.end(); smIt++ ) { - if ( smIt->second->IsApplicableHypotesis( anHyp )) { - ret2 = smIt->second->CheckConcurentHypothesis( anHyp->GetType() ); - if (ret2 > ret) { - ret = ret2; - break; - } - } - } - } - } - - if(MYDEBUG) subMesh->DumpAlgoState(true); - if(MYDEBUG) SCRUTE(ret); - return ret; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Mesh * SMESH_Mesh::GetMeshDS() -{ - return _myMeshDS; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const list& -SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->GetHypothesis(aSubShape); -} - -//======================================================================= -//function : GetHypothesis -//purpose : -//======================================================================= - -const SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - const bool andAncestors) const -{ - { - const list& hypList = _myMeshDS->GetHypothesis(aSubShape); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) { - const SMESH_Hypothesis * h = static_cast( *hyp ); - if ( aFilter.IsOk( h, aSubShape)) - return h; - } - } - if ( andAncestors ) - { - TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape )); - for (; it.More(); it.Next() ) - { - const list& hypList = _myMeshDS->GetHypothesis(it.Value()); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) { - const SMESH_Hypothesis * h = static_cast( *hyp ); - if (aFilter.IsOk( h, it.Value() )) - return h; - } - } - } - return 0; -} - -//======================================================================= -//function : GetHypotheses -//purpose : -//======================================================================= - -bool SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - list & aHypList, - const bool andAncestors) const -{ - int nbHyp = 0; - { - const list& hypList = _myMeshDS->GetHypothesis(aSubShape); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) - if ( aFilter.IsOk (static_cast( *hyp ), aSubShape)) { - aHypList.push_back( *hyp ); - nbHyp++; - } - } - // get hypos from shape of one type only: if any hypo is found on edge, do - // not look up on faces - if ( !nbHyp && andAncestors ) - { - TopTools_MapOfShape map; - TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape )); - int shapeType = it.More() ? it.Value().ShapeType() : TopAbs_SHAPE; - for (; it.More(); it.Next() ) - { - if ( nbHyp && shapeType != it.Value().ShapeType() ) - break; - shapeType = it.Value().ShapeType(); - if ( !map.Add( it.Value() )) - continue; - const list& hypList = _myMeshDS->GetHypothesis(it.Value()); - list::const_iterator hyp = hypList.begin(); - for ( ; hyp != hypList.end(); hyp++ ) - if (aFilter.IsOk( static_cast( *hyp ), it.Value() )) { - aHypList.push_back( *hyp ); - nbHyp++; - } - } - } - return nbHyp; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const list & SMESH_Mesh::GetLog() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::GetLog"); - return _myMeshDS->GetScript()->GetCommands(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESH_Mesh::ClearLog() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::ClearLog"); - _myMeshDS->GetScript()->Clear(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESH_Mesh::GetId() -{ - if(MYDEBUG) MESSAGE("SMESH_Mesh::GetId"); - return _id; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Gen *SMESH_Mesh::GetGen() -{ - return _gen; -} - -//============================================================================= -/*! - * Get or Create the SMESH_subMesh object implementation - */ -//============================================================================= - -SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - SMESH_subMesh *aSubMesh; - int index = _myMeshDS->ShapeToIndex(aSubShape); - - // for submeshes on GEOM Group - if ( !index && aSubShape.ShapeType() == TopAbs_COMPOUND ) { - TopoDS_Iterator it( aSubShape ); - if ( it.More() ) - index = _myMeshDS->AddCompoundSubmesh( aSubShape, it.Value().ShapeType() ); - } - - if (_mapSubMesh.find(index) != _mapSubMesh.end()) - { - aSubMesh = _mapSubMesh[index]; - } - else - { - aSubMesh = new SMESH_subMesh(index, this, _myMeshDS, aSubShape); - _mapSubMesh[index] = aSubMesh; - } - return aSubMesh; -} - -//============================================================================= -/*! - * Get the SMESH_subMesh object implementation. Dont create it, return null - * if it does not exist. - */ -//============================================================================= - -SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const TopoDS_Shape & aSubShape) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - bool isFound = false; - SMESH_subMesh *aSubMesh = NULL; - - int index = _myMeshDS->ShapeToIndex(aSubShape); - if (_mapSubMesh.find(index) != _mapSubMesh.end()) - { - aSubMesh = _mapSubMesh[index]; - isFound = true; - } - if (!isFound) - aSubMesh = NULL; - return aSubMesh; -} - -//============================================================================= -/*! - * Get the SMESH_subMesh object implementation. Dont create it, return null - * if it does not exist. - */ -//============================================================================= - -SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const int aShapeID) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - - map ::iterator i_sm = _mapSubMesh.find(aShapeID); - if (i_sm == _mapSubMesh.end()) - return NULL; - return i_sm->second; -} - -//======================================================================= -//function : IsUsedHypothesis -//purpose : Return True if anHyp is used to mesh aSubShape -//======================================================================= - -bool SMESH_Mesh::IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, - const TopoDS_Shape & aSubShape) -{ - SMESH_Hypothesis* hyp = static_cast(anHyp); - // check if anHyp is applicable to aSubShape - SMESH_subMesh * subMesh = GetSubMeshContaining( aSubShape ); - if ( !subMesh || !subMesh->IsApplicableHypotesis( hyp )) - return false; - - SMESH_Algo *algo = _gen->GetAlgo(*this, aSubShape); - - // algorithm - if (anHyp->GetType() > SMESHDS_Hypothesis::PARAM_ALGO) - return ( anHyp == algo ); - - // algorithm parameter - if (algo) - { - // look trough hypotheses used by algo - const list &usedHyps = - algo->GetUsedHypothesis(*this, aSubShape); - return ( find( usedHyps.begin(), usedHyps.end(), anHyp ) != usedHyps.end() ); - } - - // look through all assigned hypotheses - SMESH_HypoFilter filter( SMESH_HypoFilter::Is( hyp )); - return GetHypothesis( aSubShape, filter, true ); -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -const list < SMESH_subMesh * >& - SMESH_Mesh::GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) -throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - if(MYDEBUG) MESSAGE("SMESH_Mesh::GetSubMeshUsingHypothesis"); - map < int, SMESH_subMesh * >::iterator itsm; - _subMeshesUsingHypothesisList.clear(); - for (itsm = _mapSubMesh.begin(); itsm != _mapSubMesh.end(); itsm++) - { - SMESH_subMesh *aSubMesh = (*itsm).second; - if ( IsUsedHypothesis ( anHyp, aSubMesh->GetSubShape() )) - _subMeshesUsingHypothesisList.push_back(aSubMesh); - } - return _subMeshesUsingHypothesisList; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Mesh::ExportMED(const char *file, - const char* theMeshName, - bool theAutoGroups, - int theVersion) - throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverMED_W_SMESHDS_Mesh myWriter; - myWriter.SetFile ( file, MED::EVersion(theVersion) ); - myWriter.SetMesh ( _myMeshDS ); - if ( !theMeshName ) - myWriter.SetMeshId ( _idDoc ); - else { - myWriter.SetMeshId ( -1 ); - myWriter.SetMeshName( theMeshName ); - } - - if ( theAutoGroups ) { - myWriter.AddGroupOfNodes(); - myWriter.AddGroupOfEdges(); - myWriter.AddGroupOfFaces(); - myWriter.AddGroupOfVolumes(); - } - - for ( map::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) { - SMESH_Group* aGroup = it->second; - SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS(); - if ( aGroupDS ) { - aGroupDS->SetStoreName( aGroup->GetName() ); - myWriter.AddGroup( aGroupDS ); - } - } - - myWriter.Perform(); -} - -void SMESH_Mesh::ExportDAT(const char *file) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverDAT_W_SMDS_Mesh myWriter; - myWriter.SetFile(string(file)); - myWriter.SetMesh(_myMeshDS); - myWriter.SetMeshId(_idDoc); - myWriter.Perform(); -} - -void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverUNV_W_SMDS_Mesh myWriter; - myWriter.SetFile(string(file)); - myWriter.SetMesh(_myMeshDS); - myWriter.SetMeshId(_idDoc); - myWriter.Perform(); -} - -void SMESH_Mesh::ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - DriverSTL_W_SMDS_Mesh myWriter; - myWriter.SetFile(string(file)); - myWriter.SetIsAscii( isascii ); - myWriter.SetMesh(_myMeshDS); - myWriter.SetMeshId(_idDoc); - myWriter.Perform(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbNodes() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbNodes(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbEdges() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbEdges(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbFaces() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbFaces(); -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of 3 nodes faces in the mesh. This method run in O(n) -/////////////////////////////////////////////////////////////////////////////// -int SMESH_Mesh::NbTriangles() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - //while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++; - const SMDS_MeshFace * curFace; - while (itFaces->more()) { - curFace = itFaces->next(); - if (!curFace->IsPoly() && curFace->NbNodes() == 3) Nb++; - } - return Nb; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of 4 nodes faces in the mesh. This method run in O(n) -/////////////////////////////////////////////////////////////////////////////// -int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - //while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++; - const SMDS_MeshFace * curFace; - while (itFaces->more()) { - curFace = itFaces->next(); - if (!curFace->IsPoly() && curFace->NbNodes() == 4) Nb++; - } - return Nb; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the number of polygonal faces in the mesh. This method run in O(n) -/////////////////////////////////////////////////////////////////////////////// -int SMESH_Mesh::NbPolygons() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_FaceIteratorPtr itFaces = _myMeshDS->facesIterator(); - while (itFaces->more()) - if (itFaces->next()->IsPoly()) Nb++; - return Nb; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbVolumes() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbVolumes(); -} - -int SMESH_Mesh::NbTetras() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==4) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 4) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbHexas() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==8) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 8) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbPyramids() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==5) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 5) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbPrisms() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==6) Nb++; - const SMDS_MeshVolume * curVolume; - while (itVolumes->more()) { - curVolume = itVolumes->next(); - if (!curVolume->IsPoly() && curVolume->NbNodes() == 6) Nb++; - } - return Nb; -} - -int SMESH_Mesh::NbPolyhedrons() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - int Nb = 0; - SMDS_VolumeIteratorPtr itVolumes = _myMeshDS->volumesIterator(); - while (itVolumes->more()) - if (itVolumes->next()->IsPoly()) Nb++; - return Nb; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -int SMESH_Mesh::NbSubMesh() throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - return _myMeshDS->NbSubMesh(); -} - -//======================================================================= -//function : IsNotConformAllowed -//purpose : check if a hypothesis alowing notconform mesh is present -//======================================================================= - -bool SMESH_Mesh::IsNotConformAllowed() const -{ - if(MYDEBUG) MESSAGE("SMESH_Mesh::IsNotConformAllowed"); - - SMESH_HypoFilter filter( SMESH_HypoFilter::HasName( "NotConformAllowed" )); - return GetHypothesis( _myMeshDS->ShapeToMesh(), filter, false ); -} - -//======================================================================= -//function : IsMainShape -//purpose : -//======================================================================= - -bool SMESH_Mesh::IsMainShape(const TopoDS_Shape& theShape) const -{ - return theShape.IsSame(_myMeshDS->ShapeToMesh() ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType, - const char* theName, - int& theId, - const TopoDS_Shape& theShape) -{ - if (_mapGroup.find(_groupId) != _mapGroup.end()) - return NULL; - theId = _groupId; - SMESH_Group* aGroup = new SMESH_Group (theId, this, theType, theName, theShape); - GetMeshDS()->AddGroup( aGroup->GetGroupDS() ); - _mapGroup[_groupId++] = aGroup; - return aGroup; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_Group* SMESH_Mesh::GetGroup (const int theGroupID) -{ - if (_mapGroup.find(theGroupID) == _mapGroup.end()) - return NULL; - return _mapGroup[theGroupID]; -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -list SMESH_Mesh::GetGroupIds() -{ - list anIds; - for ( map::const_iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) - anIds.push_back( it->first ); - - return anIds; -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Mesh::RemoveGroup (const int theGroupID) -{ - if (_mapGroup.find(theGroupID) == _mapGroup.end()) - return; - GetMeshDS()->RemoveGroup( _mapGroup[theGroupID]->GetGroupDS() ); - _mapGroup.erase (theGroupID); - delete _mapGroup[theGroupID]; -} - -//============================================================================= -/*! - * IsLocal1DHypothesis - * Returns a local 1D hypothesis used for theEdge - */ -//============================================================================= -const SMESH_Hypothesis* SMESH_Mesh::IsLocal1DHypothesis (const TopoDS_Shape& theEdge) -{ - SMESH_HypoFilter hypo ( SMESH_HypoFilter::HasDim( 1 )); - hypo.AndNot( hypo.IsAlgo() ).AndNot( hypo.IsAssignedTo( GetMeshDS()->ShapeToMesh() )); - - return GetHypothesis( theEdge, hypo, true ); -} - -//============================================================================= -/*! - * IsPropagationHypothesis - */ -//============================================================================= -bool SMESH_Mesh::IsPropagationHypothesis (const TopoDS_Shape& theEdge) -{ - return _mapPropagationChains.Contains(theEdge); -} - -//============================================================================= -/*! - * IsPropagatedHypothesis - */ -//============================================================================= -bool SMESH_Mesh::IsPropagatedHypothesis (const TopoDS_Shape& theEdge, - TopoDS_Shape& theMainEdge) -{ - int nbChains = _mapPropagationChains.Extent(); - for (int i = 1; i <= nbChains; i++) { - //const TopTools_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i); - const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i); - if (aChain.Contains(theEdge)) { - theMainEdge = _mapPropagationChains.FindKey(i); - return true; - } - } - - return false; -} -//============================================================================= -/*! - * IsReversedInChain - */ -//============================================================================= - -bool SMESH_Mesh::IsReversedInChain (const TopoDS_Shape& theEdge, - const TopoDS_Shape& theMainEdge) -{ - if ( !theMainEdge.IsNull() && !theEdge.IsNull() && - _mapPropagationChains.Contains( theMainEdge )) - { - const SMESH_IndexedMapOfShape& aChain = - _mapPropagationChains.FindFromKey( theMainEdge ); - int index = aChain.FindIndex( theEdge ); - if ( index ) - return aChain(index).Orientation() == TopAbs_REVERSED; - } - return false; -} - -//============================================================================= -/*! - * CleanMeshOnPropagationChain - */ -//============================================================================= -void SMESH_Mesh::CleanMeshOnPropagationChain (const TopoDS_Shape& theMainEdge) -{ - const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromKey(theMainEdge); - int i, nbEdges = aChain.Extent(); - for (i = 1; i <= nbEdges; i++) { - TopoDS_Shape anEdge = aChain.FindKey(i); - SMESH_subMesh *subMesh = GetSubMesh(anEdge); - SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS(); - if (subMeshDS && subMeshDS->NbElements() > 0) { - subMesh->ComputeStateEngine(SMESH_subMesh::CLEANDEP); - } - } -} - -//============================================================================= -/*! - * RebuildPropagationChains - * Rebuild all existing propagation chains. - * Have to be used, if 1D hypothesis have been assigned/removed to/from any edge - */ -//============================================================================= -bool SMESH_Mesh::RebuildPropagationChains() -{ - bool ret = true; - - // Clean all chains, because they can be not up-to-date - int i, nbChains = _mapPropagationChains.Extent(); - for (i = 1; i <= nbChains; i++) { - TopoDS_Shape aMainEdge = _mapPropagationChains.FindKey(i); - CleanMeshOnPropagationChain(aMainEdge); - _mapPropagationChains.ChangeFromIndex(i).Clear(); - } - - // Build all chains - for (i = 1; i <= nbChains; i++) { - TopoDS_Shape aMainEdge = _mapPropagationChains.FindKey(i); - if (!BuildPropagationChain(aMainEdge)) - ret = false; - CleanMeshOnPropagationChain(aMainEdge); - } - - return ret; -} - -//============================================================================= -/*! - * RemovePropagationChain - * Have to be used, if Propagation hypothesis is removed from - */ -//============================================================================= -bool SMESH_Mesh::RemovePropagationChain (const TopoDS_Shape& theMainEdge) -{ - if (!_mapPropagationChains.Contains(theMainEdge)) - return false; - - // Clean mesh elements and nodes, built on the chain - CleanMeshOnPropagationChain(theMainEdge); - - // Clean the chain - _mapPropagationChains.ChangeFromKey(theMainEdge).Clear(); - - // Remove the chain from the map - int i = _mapPropagationChains.FindIndex(theMainEdge); - if ( i == _mapPropagationChains.Extent() ) - _mapPropagationChains.RemoveLast(); - else { - TopoDS_Vertex anEmptyShape; - BRep_Builder BB; - BB.MakeVertex(anEmptyShape, gp_Pnt(0,0,0), 0.1); - SMESH_IndexedMapOfShape anEmptyMap; - _mapPropagationChains.Substitute(i, anEmptyShape, anEmptyMap); - } - - return true; -} - -//============================================================================= -/*! - * BuildPropagationChain - */ -//============================================================================= -bool SMESH_Mesh::BuildPropagationChain (const TopoDS_Shape& theMainEdge) -{ - if (theMainEdge.ShapeType() != TopAbs_EDGE) return true; - - // Add new chain, if there is no - if (!_mapPropagationChains.Contains(theMainEdge)) { - SMESH_IndexedMapOfShape aNewChain; - _mapPropagationChains.Add(theMainEdge, aNewChain); - } - - // Check presence of 1D hypothesis to be propagated - const SMESH_Hypothesis* aMainHyp = IsLocal1DHypothesis(theMainEdge); - if (!aMainHyp) { - MESSAGE("Warning: There is no 1D hypothesis to propagate. Please, assign."); - return true; - } - - // Edges, on which the 1D hypothesis will be propagated from - SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.ChangeFromKey(theMainEdge); - if (aChain.Extent() > 0) { - CleanMeshOnPropagationChain(theMainEdge); - aChain.Clear(); - } - - // At first put in the chain - aChain.Add(theMainEdge); - - // List of edges, added to chain on the previous cycle pass - TopTools_ListOfShape listPrevEdges; - listPrevEdges.Append(theMainEdge.Oriented( TopAbs_FORWARD )); - -// 5____4____3____4____5____6 -// | | | | | | -// | | | | | | -// 4____3____2____3____4____5 -// | | | | | | Number in the each knot of -// | | | | | | grid indicates cycle pass, -// 3____2____1____2____3____4 on which corresponding edge -// | | | | | | (perpendicular to the plane -// | | | | | | of view) will be found. -// 2____1____0____1____2____3 -// | | | | | | -// | | | | | | -// 3____2____1____2____3____4 - - // Collect all edges pass by pass - while (listPrevEdges.Extent() > 0) { - // List of edges, added to chain on this cycle pass - TopTools_ListOfShape listCurEdges; - - // Find the next portion of edges - TopTools_ListIteratorOfListOfShape itE (listPrevEdges); - for (; itE.More(); itE.Next()) { - TopoDS_Shape anE = itE.Value(); - - // Iterate on faces, having edge - TopTools_ListIteratorOfListOfShape itA (GetAncestors(anE)); - for (; itA.More(); itA.Next()) { - TopoDS_Shape aW = itA.Value(); - - // There are objects of different type among the ancestors of edge - if (aW.ShapeType() == TopAbs_WIRE) { - TopoDS_Shape anOppE; - - BRepTools_WireExplorer aWE (TopoDS::Wire(aW)); - Standard_Integer nb = 1, found = 0; - TopTools_Array1OfShape anEdges (1,4); - for (; aWE.More(); aWE.Next(), nb++) { - if (nb > 4) { - found = 0; - break; - } - anEdges(nb) = aWE.Current(); - if (!_mapAncestors.Contains(anEdges(nb))) { - MESSAGE("WIRE EXPLORER HAVE GIVEN AN INVALID EDGE !!!"); - break; - } - if (anEdges(nb).IsSame(anE)) found = nb; - } - - if (nb == 5 && found > 0) { - // Quadrangle face found, get an opposite edge - Standard_Integer opp = found + 2; - if (opp > 4) opp -= 4; - anOppE = anEdges(opp); - - // add anOppE to aChain if ... - if (!aChain.Contains(anOppE)) { // ... anOppE is not in aChain - if (!IsLocal1DHypothesis(anOppE)) { // ... no other 1d hyp on anOppE - TopoDS_Shape aMainEdgeForOppEdge; // ... no other hyp is propagated to anOppE - if (!IsPropagatedHypothesis(anOppE, aMainEdgeForOppEdge)) - { - // Add found edge to the chain oriented so that to - // have it co-directed with a forward MainEdge - TopAbs_Orientation ori = anE.Orientation(); - if ( anEdges(opp).Orientation() == anEdges(found).Orientation() ) - ori = TopAbs::Reverse( ori ); - anOppE.Orientation( ori ); - aChain.Add(anOppE); - listCurEdges.Append(anOppE); - } - else { - // Collision! - MESSAGE("Error: Collision between propagated hypotheses"); - CleanMeshOnPropagationChain(theMainEdge); - aChain.Clear(); - return ( aMainHyp == IsLocal1DHypothesis(aMainEdgeForOppEdge) ); - } - } - } - } // if (nb == 5 && found > 0) - } // if (aF.ShapeType() == TopAbs_WIRE) - } // for (; itF.More(); itF.Next()) - } // for (; itE.More(); itE.Next()) - - listPrevEdges = listCurEdges; - } // while (listPrevEdges.Extent() > 0) - - CleanMeshOnPropagationChain(theMainEdge); - return true; -} - -//======================================================================= -//function : GetAncestors -//purpose : return list of ancestors of theSubShape in the order -// that lower dimention shapes come first. -//======================================================================= - -const TopTools_ListOfShape& SMESH_Mesh::GetAncestors(const TopoDS_Shape& theS) const -{ - if ( _mapAncestors.Contains( theS ) ) - return _mapAncestors.FindFromKey( theS ); - - static TopTools_ListOfShape emptyList; - return emptyList; -} - -//======================================================================= -//function : Dump -//purpose : dumps contents of mesh to stream [ debug purposes ] -//======================================================================= -ostream& SMESH_Mesh::Dump(ostream& save) -{ - save << "========================== Dump contents of mesh ==========================" << endl; - save << "1) Total number of nodes: " << NbNodes() << endl; - save << "2) Total number of edges: " << NbEdges() << endl; - save << "3) Total number of faces: " << NbFaces() << endl; - if ( NbFaces() > 0 ) { - int nb3 = NbTriangles(); - int nb4 = NbQuadrangles(); - save << "3.1.) Number of triangles: " << nb3 << endl; - save << "3.2.) Number of quadrangles: " << nb4 << endl; - if ( nb3 + nb4 != NbFaces() ) { - map myFaceMap; - SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); - while( itFaces->more( ) ) { - int nbNodes = itFaces->next()->NbNodes(); - if ( myFaceMap.find( nbNodes ) == myFaceMap.end() ) - myFaceMap[ nbNodes ] = 0; - myFaceMap[ nbNodes ] = myFaceMap[ nbNodes ] + 1; - } - save << "3.3.) Faces in detail: " << endl; - map ::iterator itF; - for (itF = myFaceMap.begin(); itF != myFaceMap.end(); itF++) - save << "--> nb nodes: " << itF->first << " - nb elemens: " << itF->second << endl; - } - } - save << "4) Total number of volumes: " << NbVolumes() << endl; - if ( NbVolumes() > 0 ) { - int nb8 = NbHexas(); - int nb4 = NbTetras(); - int nb5 = NbPyramids(); - int nb6 = NbPrisms(); - save << "4.1.) Number of hexahedrons: " << nb8 << endl; - save << "4.2.) Number of tetrahedrons: " << nb4 << endl; - save << "4.3.) Number of prisms: " << nb6 << endl; - save << "4.4.) Number of pyramides: " << nb5 << endl; - if ( nb8 + nb4 + nb5 + nb6 != NbVolumes() ) { - map myVolumesMap; - SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); - while( itVolumes->more( ) ) { - int nbNodes = itVolumes->next()->NbNodes(); - if ( myVolumesMap.find( nbNodes ) == myVolumesMap.end() ) - myVolumesMap[ nbNodes ] = 0; - myVolumesMap[ nbNodes ] = myVolumesMap[ nbNodes ] + 1; - } - save << "4.5.) Volumes in detail: " << endl; - map ::iterator itV; - for (itV = myVolumesMap.begin(); itV != myVolumesMap.end(); itV++) - save << "--> nb nodes: " << itV->first << " - nb elemens: " << itV->second << endl; - } - } - save << "===========================================================================" << endl; - return save; -} - -//======================================================================= -//function : GetElementType -//purpose : Returns type of mesh element with certain id -//======================================================================= -SMDSAbs_ElementType SMESH_Mesh::GetElementType( const int id, const bool iselem ) -{ - return _myMeshDS->GetElementType( id, iselem ); -} diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx deleted file mode 100644 index 5054e0038..000000000 --- a/src/SMESH/SMESH_Mesh.hxx +++ /dev/null @@ -1,256 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Mesh.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MESH_HXX_ -#define _SMESH_MESH_HXX_ - -#include "SMESH_Hypothesis.hxx" -//#include "SMESH_subMesh.hxx" - -#include "SMESHDS_Document.hxx" -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_Command.hxx" -#include "SMDSAbs_ElementType.hxx" - -//#include "NMTTools_IndexedDataMapOfShapeIndexedMapOfShape.hxx" -#include "SMESH_IndexedDataMapOfShapeIndexedMapOfShape.hxx" - -#include "Utils_SALOME_Exception.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -class SMESH_Gen; -class SMESH_Group; -class TopTools_ListOfShape; -class SMESH_subMesh; -class SMESH_HypoFilter; - -//typedef NMTTools_IndexedDataMapOfShapeIndexedMapOfShape IndexedMapOfChain; -typedef SMESH_IndexedDataMapOfShapeIndexedMapOfShape IndexedMapOfChain; - -class SMESH_Mesh -{ - SMESH_Mesh(); - SMESH_Mesh(const SMESH_Mesh&); -public: - SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, - SMESHDS_Document * myDocument); - - virtual ~SMESH_Mesh(); - - void ShapeToMesh(const TopoDS_Shape & aShape); - - int UNVToMesh(const char* theFileName); - /*! - * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value - */ - int MEDToMesh(const char* theFileName, const char* theMeshName); - - int STLToMesh(const char* theFileName); - - SMESH_Hypothesis::Hypothesis_Status - AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId) - throw(SALOME_Exception); - - SMESH_Hypothesis::Hypothesis_Status - RemoveHypothesis(const TopoDS_Shape & aSubShape, int anHypId) - throw(SALOME_Exception); - - const list & - GetHypothesisList(const TopoDS_Shape & aSubShape) const - throw(SALOME_Exception); - - const SMESH_Hypothesis * GetHypothesis(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - const bool andAncestors) const; - - bool GetHypotheses(const TopoDS_Shape & aSubShape, - const SMESH_HypoFilter& aFilter, - list & aHypList, - const bool andAncestors) const; - - const list & GetLog() throw(SALOME_Exception); - - void ClearLog() throw(SALOME_Exception); - - int GetId(); - - SMESHDS_Mesh * GetMeshDS(); - - SMESH_Gen *GetGen(); - - SMESH_subMesh *GetSubMesh(const TopoDS_Shape & aSubShape) - throw(SALOME_Exception); - - SMESH_subMesh *GetSubMeshContaining(const TopoDS_Shape & aSubShape) - throw(SALOME_Exception); - - SMESH_subMesh *GetSubMeshContaining(const int aShapeID) - throw(SALOME_Exception); - - const list < SMESH_subMesh * >& - GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) - throw(SALOME_Exception); - - bool IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, - const TopoDS_Shape & aSubShape); - // Return True if anHyp is used to mesh aSubShape - - bool IsNotConformAllowed() const; - // check if a hypothesis alowing notconform mesh is present - - bool IsMainShape(const TopoDS_Shape& theShape) const; - - const TopTools_ListOfShape& GetAncestors(const TopoDS_Shape& theSubShape) const; - // return list of ancestors of theSubShape in the order - // that lower dimention shapes come first. - - void ExportMED(const char *file, - const char* theMeshName = NULL, - bool theAutoGroups = true, - int theVersion = 0) - throw(SALOME_Exception); - - void ExportDAT(const char *file) throw(SALOME_Exception); - void ExportUNV(const char *file) throw(SALOME_Exception); - void ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception); - - int NbNodes() throw(SALOME_Exception); - - int NbEdges() throw(SALOME_Exception); - - int NbFaces() throw(SALOME_Exception); - - int NbTriangles() throw(SALOME_Exception); - - int NbQuadrangles() throw(SALOME_Exception); - - int NbPolygons() throw(SALOME_Exception); - - int NbVolumes() throw(SALOME_Exception); - - int NbTetras() throw(SALOME_Exception); - - int NbHexas() throw(SALOME_Exception); - - int NbPyramids() throw(SALOME_Exception); - - int NbPrisms() throw(SALOME_Exception); - - int NbPolyhedrons() throw(SALOME_Exception); - - int NbSubMesh() throw(SALOME_Exception); - - int NbGroup() const { return _mapGroup.size(); } - - SMESH_Group* AddGroup (const SMDSAbs_ElementType theType, - const char* theName, - int& theId, - const TopoDS_Shape& theShape=TopoDS_Shape()); - - SMESH_Group* GetGroup (const int theGroupID); - - list GetGroupIds(); - - void RemoveGroup (const int theGroupID); - - // Propagation hypothesis management - - const SMESH_Hypothesis* IsLocal1DHypothesis (const TopoDS_Shape& theEdge); - // Returns a local 1D hypothesis used for theEdge. - - bool IsPropagationHypothesis (const TopoDS_Shape& theEdge); - // Returns true, if a local Propagation hypothesis is set directly on - - bool IsPropagatedHypothesis (const TopoDS_Shape& theEdge, - TopoDS_Shape& theMainEdge); - // Returns true, if a local 1D hypothesis is - // propagated on from some other edge. - // Returns through the edge, from - // which the 1D hypothesis is propagated on - - bool IsReversedInChain (const TopoDS_Shape& theEdge, - const TopoDS_Shape& theMainEdge); - // Returns true if theEdge should be reversed to be - // co-directed with theMainEdge - - bool RebuildPropagationChains(); - bool RemovePropagationChain (const TopoDS_Shape& theMainEdge); - bool BuildPropagationChain (const TopoDS_Shape& theMainEdge); - - SMDSAbs_ElementType GetElementType( const int id, const bool iselem ); - - // - - ostream& Dump(ostream & save); - -private: - // Propagation hypothesis management - void CleanMeshOnPropagationChain(const TopoDS_Shape& theMainEdge); - // - -private: - int _id; // id given by creator (unique within the creator instance) - int _studyId; - int _idDoc; // id given by SMESHDS_Document - int _groupId; // id generator for group objects - bool _isShapeToMesh;// set to true when a shape is given (only once) - list _subMeshesUsingHypothesisList; - SMESHDS_Document * _myDocument; - SMESHDS_Mesh * _myMeshDS; - map _mapSubMesh; - map _mapGroup; - SMESH_Gen * _gen; - - TopTools_IndexedDataMapOfShapeListOfShape _mapAncestors; - - IndexedMapOfChain _mapPropagationChains; // Propagation hypothesis management -}; - -#endif diff --git a/src/SMESH/SMESH_subMesh.hxx b/src/SMESH/SMESH_subMesh.hxx deleted file mode 100644 index 8251c6b94..000000000 --- a/src/SMESH/SMESH_subMesh.hxx +++ /dev/null @@ -1,182 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_subMesh.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_SUBMESH_HXX_ -#define _SMESH_SUBMESH_HXX_ - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" -#include -#include -#include - -#include -#include -#include - -class SMESH_Mesh; -class SMESH_Hypothesis; -class SMESH_Algo; -class SMESH_Gen; - -class SMESH_subMesh -{ - public: - SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, - const TopoDS_Shape & aSubShape); - virtual ~ SMESH_subMesh(); - - int GetId() const; - - // bool Contains(const TopoDS_Shape & aSubShape) - // throw (SALOME_Exception); - - SMESH_Mesh* GetFather() { return _father; } - - SMESHDS_SubMesh * GetSubMeshDS(); - - SMESHDS_SubMesh* CreateSubMeshDS(); - // Explicit SMESHDS_SubMesh creation method, required for persistence mechanism - - SMESH_subMesh *GetFirstToCompute(); - - const map < int, SMESH_subMesh * >&DependsOn(); - //const map < int, SMESH_subMesh * >&Dependants(); - - const TopoDS_Shape & GetSubShape(); - -// bool _vertexSet; // only for vertex subMesh, set to false for dim > 0 - - enum compute_state - { - NOT_READY, READY_TO_COMPUTE, - COMPUTE_OK, FAILED_TO_COMPUTE - }; - enum algo_state - { - NO_ALGO, MISSING_HYP, HYP_OK - }; - enum algo_event - { - ADD_HYP, ADD_ALGO, - REMOVE_HYP, REMOVE_ALGO, - ADD_FATHER_HYP, ADD_FATHER_ALGO, - REMOVE_FATHER_HYP, REMOVE_FATHER_ALGO - }; - enum compute_event - { - MODIF_HYP, MODIF_ALGO_STATE, COMPUTE, - CLEAN, CLEANDEP, SUBMESH_COMPUTED, SUBMESH_RESTORED, - MESH_ENTITY_REMOVED, CHECK_COMPUTE_STATE - }; - - SMESH_Hypothesis::Hypothesis_Status - AlgoStateEngine(int event, SMESH_Hypothesis * anHyp); - - SMESH_Hypothesis::Hypothesis_Status - SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp); - - int GetAlgoState() { return _algoState; } - - void DumpAlgoState(bool isMain); - - bool ComputeStateEngine(int event); - - int GetComputeState() - { - return _computeState; - }; - - bool IsConform(const SMESH_Algo* theAlgo); - // check if a conform mesh will be produced by the Algo - - bool CanAddHypothesis(const SMESH_Hypothesis* theHypothesis) const; - // return true if theHypothesis can be attached to me: - // its dimention is checked - - static bool IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis, - const TopAbs_ShapeEnum theShapeType); - - bool IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis) const - { return IsApplicableHypotesis( theHypothesis, _subShape.ShapeType() ); } - // return true if theHypothesis can be used to mesh me: - // its shape type is checked - - SMESH_Hypothesis::Hypothesis_Status CheckConcurentHypothesis (const int theHypType); - // check if there are several applicable hypothesis on fathers - - protected: - void InsertDependence(const TopoDS_Shape aSubShape); - - bool SubMeshesComputed(); - - bool SubMeshesReady(); - - void RemoveSubMeshElementsAndNodes(); - void UpdateDependantsState(const compute_event theEvent); - void UpdateSubMeshState(const compute_state theState); - void ComputeSubMeshStateEngine(int event); - void CleanDependants(); - void CleanDependsOn(); - void SetAlgoState(int state); - - bool IsMeshComputed() const; - // check if _subMeshDS contains mesh elements - - TopoDS_Shape GetCollection(SMESH_Gen * theGen, SMESH_Algo* theAlgo); - // return a shape containing all sub-shapes of the MainShape that can be - // meshed at once along with _subShape - - bool ApplyToCollection (SMESH_Algo* theAlgo, - const TopoDS_Shape& theCollection); - // Apply theAlgo to all subshapes in theCollection - - const SMESH_Hypothesis* GetSimilarAttached(const TopoDS_Shape& theShape, - const SMESH_Hypothesis * theHyp, - const int theHypType = 0); - // return a hypothesis attached to theShape. - // If theHyp is provided, similar but not same hypotheses - // is returned; else an applicable ones having theHypType - // is returned - - TopoDS_Shape _subShape; - SMESHDS_Mesh * _meshDS; - SMESHDS_SubMesh * _subMeshDS; - int _Id; - SMESH_Mesh *_father; - map < int, SMESH_subMesh * >_mapDepend; - bool _dependenceAnalysed; - - int _algoState; - int _computeState; - -}; - -#endif diff --git a/src/SMESHDS/Makefile.in b/src/SMESHDS/Makefile.in deleted file mode 100644 index 50d4fa742..000000000 --- a/src/SMESHDS/Makefile.in +++ /dev/null @@ -1,83 +0,0 @@ -# SMESH SMESHDS : management of mesh data and SMESH document -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Author : Patrick GOLDBRONN (CEA) -# Module : SMESH - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl - - -@COMMENCE@ - -# Libraries targets - -LIB = libSMESHDS.la -LIB_SRC = \ - SMESHDS_Document.cxx \ - SMESHDS_Hypothesis.cxx \ - SMESHDS_Script.cxx \ - SMESHDS_Command.cxx \ - SMESHDS_SubMesh.cxx \ - SMESHDS_Mesh.cxx \ - SMESHDS_GroupBase.cxx \ - SMESHDS_Group.cxx \ - SMESHDS_GroupOnGeom.cxx - -LIB_CLIENT_IDL = -LIB_SERVER_IDL = - -# Executables targets -BIN = -BIN_SRC = -BIN_CLIENT_IDL = -BIN_SERVER_IDL = - -# header files -EXPORT_HEADERS= \ - SMESHDS_Document.hxx \ - SMESHDS_Hypothesis.hxx \ - SMESHDS_Mesh.hxx \ - SMESHDS_Script.hxx \ - SMESHDS_Command.hxx \ - SMESHDS_CommandType.hxx \ - SMESHDS_SubMesh.hxx \ - SMESHDS_GroupBase.hxx \ - SMESHDS_Group.hxx \ - SMESHDS_GroupOnGeom.hxx - -# additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) -CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS += $(OCC_KERNEL_LIBS) -lSMDS - - -# additional file to be cleaned -MOSTLYCLEAN = -CLEAN = -DISTCLEAN = - -@CONCLUDE@ diff --git a/src/SMESHDS/SMESHDS_Command.cxx b/src/SMESHDS/SMESHDS_Command.cxx deleted file mode 100644 index b55b5af1c..000000000 --- a/src/SMESHDS/SMESHDS_Command.cxx +++ /dev/null @@ -1,410 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Command.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Command.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : -//purpose : -//======================================================================= -SMESHDS_Command::SMESHDS_Command(const SMESHDS_CommandType aType):myType(aType), -myNumber(0) -{ -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddNode(int NewNodeID, double x, double y, double z) -{ - if (!myType == SMESHDS_AddNode) - { - MESSAGE("SMESHDS_Command::AddNode : Bad Type"); - return; - } - myIntegers.push_back(NewNodeID); - myReals.push_back(x); - myReals.push_back(y); - myReals.push_back(z); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::MoveNode(int NodeID, double x, double y, double z) -{ - if (!myType == SMESHDS_MoveNode) - { - MESSAGE("SMESHDS_Command::MoveNode : Bad Type"); - return; - } - myIntegers.push_back(NodeID); - myReals.push_back(x); - myReals.push_back(y); - myReals.push_back(z); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddEdge(int NewEdgeID, int idnode1, int idnode2) -{ - if (!myType == SMESHDS_AddEdge) - { - MESSAGE("SMESHDS_Command::AddEdge : Bad Type"); - return; - } - myIntegers.push_back(NewEdgeID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddFace(int NewFaceID, - int idnode1, int idnode2, int idnode3) -{ - if (!myType == SMESHDS_AddTriangle) - { - MESSAGE("SMESHDS_Command::AddFace : Bad Type"); - return; - } - myIntegers.push_back(NewFaceID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddFace(int NewFaceID, - int idnode1, int idnode2, int idnode3, int idnode4) -{ - if (!myType == SMESHDS_AddQuadrangle) - { - MESSAGE("SMESHDS_Command::AddFace : Bad Type"); - return; - } - myIntegers.push_back(NewFaceID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, int idnode2, int idnode3, int idnode4) -{ - if (!myType == SMESHDS_AddTetrahedron) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, int idnode2, int idnode3, int idnode4, int idnode5) -{ - if (!myType == SMESHDS_AddPyramid) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myIntegers.push_back(idnode5); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, - int idnode2, int idnode3, int idnode4, int idnode5, int idnode6) -{ - if (!myType == SMESHDS_AddPrism) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myIntegers.push_back(idnode5); - myIntegers.push_back(idnode6); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::AddVolume(int NewVolID, - int idnode1, - int idnode2, - int idnode3, - int idnode4, int idnode5, int idnode6, int idnode7, int idnode8) -{ - if (!myType == SMESHDS_AddHexahedron) - { - MESSAGE("SMESHDS_Command::AddVolume : Bad Type"); - return; - } - myIntegers.push_back(NewVolID); - myIntegers.push_back(idnode1); - myIntegers.push_back(idnode2); - myIntegers.push_back(idnode3); - myIntegers.push_back(idnode4); - myIntegers.push_back(idnode5); - myIntegers.push_back(idnode6); - myIntegers.push_back(idnode7); - myIntegers.push_back(idnode8); - myNumber++; -} - -//======================================================================= -//function : AddPolygonalFace -//purpose : -//======================================================================= -void SMESHDS_Command::AddPolygonalFace (const int ElementID, - std::vector nodes_ids) -{ - if (!myType == SMESHDS_AddPolygon) { - MESSAGE("SMESHDS_Command::AddPolygonalFace : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - - int i, nbNodes = nodes_ids.size(); - myIntegers.push_back(nbNodes); - for (i = 0; i < nbNodes; i++) { - myIntegers.push_back(nodes_ids[i]); - } - - myNumber++; -} - -//======================================================================= -//function : AddPolyhedralVolume -//purpose : -//======================================================================= -void SMESHDS_Command::AddPolyhedralVolume (const int ElementID, - std::vector nodes_ids, - std::vector quantities) -{ - if (!myType == SMESHDS_AddPolyhedron) { - MESSAGE("SMESHDS_Command::AddPolyhedralVolume : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - - int i, nbNodes = nodes_ids.size(); - myIntegers.push_back(nbNodes); - for (i = 0; i < nbNodes; i++) { - myIntegers.push_back(nodes_ids[i]); - } - - int nbFaces = quantities.size(); - myIntegers.push_back(nbFaces); - for (i = 0; i < nbFaces; i++) { - myIntegers.push_back(quantities[i]); - } - - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::RemoveNode(int NodeID) -{ - if (!myType == SMESHDS_RemoveNode) - { - MESSAGE("SMESHDS_Command::RemoveNode : Bad Type"); - return; - } - myIntegers.push_back(NodeID); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Command::RemoveElement(int ElementID) -{ - if (!myType == SMESHDS_RemoveElement) - { - MESSAGE("SMESHDS_Command::RemoveElement : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - myNumber++; -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -void SMESHDS_Command::ChangeElementNodes(int ElementID, int nodes[], int nbnodes) -{ - if (!myType == SMESHDS_ChangeElementNodes) - { - MESSAGE("SMESHDS_Command::ChangeElementNodes : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - myIntegers.push_back(nbnodes); - for ( int i = 0; i < nbnodes; i++ ) - myIntegers.push_back( nodes[ i ] ); - - myNumber++; -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : -//======================================================================= -void SMESHDS_Command::ChangePolyhedronNodes (const int ElementID, - std::vector nodes_ids, - std::vector quantities) -{ - if (myType != SMESHDS_ChangePolyhedronNodes) - { - MESSAGE("SMESHDS_Command::ChangePolyhedronNodes : Bad Type"); - return; - } - myIntegers.push_back(ElementID); - - int i, nbNodes = nodes_ids.size(); - myIntegers.push_back(nbNodes); - for (i = 0; i < nbNodes; i++) { - myIntegers.push_back(nodes_ids[i]); - } - - int nbFaces = quantities.size(); - myIntegers.push_back(nbFaces); - for (i = 0; i < nbFaces; i++) { - myIntegers.push_back(quantities[i]); - } - - myNumber++; -} - -//======================================================================= -//function : Renumber -//purpose : -//======================================================================= - -void SMESHDS_Command::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - if (!myType == SMESHDS_Renumber) - { - MESSAGE("SMESHDS_Command::Renumber : Bad Type"); - return; - } - myIntegers.push_back(isNodes); - myIntegers.push_back(startID); - myIntegers.push_back(deltaID); - myNumber++; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -SMESHDS_CommandType SMESHDS_Command::GetType() -{ - return myType; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -int SMESHDS_Command::GetNumber() -{ - return myNumber; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -const list < int >&SMESHDS_Command::GetIndexes() -{ - return myIntegers; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -const list < double >&SMESHDS_Command::GetCoords() -{ - return myReals; -} diff --git a/src/SMESHDS/SMESHDS_Command.hxx b/src/SMESHDS/SMESHDS_Command.hxx deleted file mode 100644 index 3ecd762f3..000000000 --- a/src/SMESHDS/SMESHDS_Command.hxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Command.hxx -// Module : SMESH - -#ifndef _SMESHDS_Command_HeaderFile -#define _SMESHDS_Command_HeaderFile - -#include "SMESHDS_CommandType.hxx" -#include -#include - -class SMESHDS_Command -{ - - public: - SMESHDS_Command(const SMESHDS_CommandType aType); - void AddNode(int NewNodeID, double x, double y, double z); - void AddEdge(int NewEdgeID, int idnode1, int idnode2); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6, int idnode7, int idnode8); - void AddPolygonalFace (const int ElementID, - std::vector nodes_ids); - void AddPolyhedralVolume (const int ElementID, - std::vector nodes_ids, - std::vector quantities); - void MoveNode(int NewNodeID, double x, double y, double z); - void RemoveNode(int NodeID); - void RemoveElement(int ElementID); - void ChangeElementNodes(int ElementID, int nodes[], int nbnodes); - void ChangePolyhedronNodes(const int ElementID, - std::vector nodes_ids, - std::vector quantities); - void Renumber (const bool isNodes, const int startID, const int deltaID); - SMESHDS_CommandType GetType(); - int GetNumber(); - const std::list & GetIndexes(); - const std::list & GetCoords(); - ~SMESHDS_Command(); - private: - SMESHDS_CommandType myType; - int myNumber; - std::list myReals; - std::list myIntegers; -}; -#endif diff --git a/src/SMESHDS/SMESHDS_CommandType.hxx b/src/SMESHDS/SMESHDS_CommandType.hxx deleted file mode 100644 index f2c505b1f..000000000 --- a/src/SMESHDS/SMESHDS_CommandType.hxx +++ /dev/null @@ -1,52 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_CommandType.hxx -// Module : SMESH - -#ifndef _SMESHDS_CommandType_HeaderFile -#define _SMESHDS_CommandType_HeaderFile - -//#include - -enum SMESHDS_CommandType { - SMESHDS_AddNode, - SMESHDS_AddEdge, - SMESHDS_AddTriangle, - SMESHDS_AddQuadrangle, - SMESHDS_AddPolygon, - SMESHDS_AddTetrahedron, - SMESHDS_AddPyramid, - SMESHDS_AddPrism, - SMESHDS_AddHexahedron, - SMESHDS_AddPolyhedron, - SMESHDS_RemoveNode, - SMESHDS_RemoveElement, - SMESHDS_MoveNode, - SMESHDS_ChangeElementNodes, - SMESHDS_ChangePolyhedronNodes, - SMESHDS_Renumber -}; - - -#endif diff --git a/src/SMESHDS/SMESHDS_Document.cxx b/src/SMESHDS/SMESHDS_Document.cxx deleted file mode 100644 index f533a72a7..000000000 --- a/src/SMESHDS/SMESHDS_Document.cxx +++ /dev/null @@ -1,192 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Document.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Document.hxx" -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : Create -//purpose : -//======================================================================= -SMESHDS_Document::SMESHDS_Document(int UserID):myUserID(UserID) -{ -} - -//======================================================================= -//function : NewMesh -//purpose : -//======================================================================= -int SMESHDS_Document::NewMesh() -{ - static int NewMeshID = 0; - NewMeshID++; - SMESHDS_Mesh *aNewMesh = new SMESHDS_Mesh(NewMeshID); - myMeshes[NewMeshID] = aNewMesh; - return NewMeshID; -} - -//======================================================================= -//function : GetMesh -//purpose : -//======================================================================= -SMESHDS_Mesh *SMESHDS_Document::GetMesh(int MeshID) -{ - map::iterator it=myMeshes.find(MeshID); - if (it==myMeshes.end()) - { - MESSAGE("SMESHDS_Document::GetMesh : ID not found"); - return NULL; - } - else return (*it).second; -} - -//======================================================================= -//function : RemoveMesh -//purpose : -//======================================================================= -void SMESHDS_Document::RemoveMesh(int MeshID) -{ - map::iterator it=myMeshes.find(MeshID); - if (it==myMeshes.end()) - MESSAGE("SMESHDS_Document::RemoveMesh : ID not found"); - myMeshes.erase(it); -} - -//======================================================================= -//function : AddHypothesis -//purpose : -//======================================================================= -void SMESHDS_Document::AddHypothesis(SMESHDS_Hypothesis * H) -{ - myHypothesis[H->GetID()]=H; -} - -//======================================================================= -//function : GetHypothesis -//purpose : -//======================================================================= -SMESHDS_Hypothesis * SMESHDS_Document::GetHypothesis(int HypID) -{ - map::iterator it=myHypothesis.find(HypID); - if (it==myHypothesis.end()) - { - MESSAGE("SMESHDS_Document::GetHypothesis : ID not found"); - return NULL; - } - else return (*it).second; -} - -//======================================================================= -//function : RemoveHypothesis -//purpose : -//======================================================================= -void SMESHDS_Document::RemoveHypothesis(int HypID) -{ - map::iterator it=myHypothesis.find(HypID); - if (it==myHypothesis.end()) - MESSAGE("SMESHDS_Document::RemoveHypothesis : ID not found"); - myHypothesis.erase(it); -} - -//======================================================================= -//function : NbMeshes -//purpose : -//======================================================================= -int SMESHDS_Document::NbMeshes() -{ - return myMeshes.size(); -} - -//======================================================================= -//function : NbHypothesis -//purpose : -//======================================================================= -int SMESHDS_Document::NbHypothesis() -{ - return myHypothesis.size(); -} - -//======================================================================= -//function : InitMeshesIterator -//purpose : -//======================================================================= -void SMESHDS_Document::InitMeshesIterator() -{ - myMeshesIt=myMeshes.begin(); -} - -//======================================================================= -//function : NextMesh -//purpose : -//======================================================================= -SMESHDS_Mesh * SMESHDS_Document::NextMesh() -{ - SMESHDS_Mesh * toReturn=(*myMeshesIt).second; - myMeshesIt++; - return toReturn; -} - -//======================================================================= -//function : MoreMesh -//purpose : -//======================================================================= -bool SMESHDS_Document::MoreMesh() -{ - return myMeshesIt!=myMeshes.end(); -} - -//======================================================================= -//function : InitHypothesisIterator -//purpose : -//======================================================================= -void SMESHDS_Document::InitHypothesisIterator() -{ - myHypothesisIt=myHypothesis.begin(); -} - -//======================================================================= -//function : NextMesh -//purpose : -//======================================================================= -SMESHDS_Hypothesis * SMESHDS_Document::NextHypothesis() -{ - SMESHDS_Hypothesis * toReturn=(*myHypothesisIt).second; - myHypothesisIt++; - return toReturn; -} - -//======================================================================= -//function : MoreMesh -//purpose : -//======================================================================= -bool SMESHDS_Document::MoreHypothesis() -{ - return myHypothesisIt!=myHypothesis.end(); -} diff --git a/src/SMESHDS/SMESHDS_Document.hxx b/src/SMESHDS/SMESHDS_Document.hxx deleted file mode 100644 index e95269f11..000000000 --- a/src/SMESHDS/SMESHDS_Document.hxx +++ /dev/null @@ -1,63 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Document.hxx -// Module : SMESH - -#ifndef _SMESHDS_Document_HeaderFile -#define _SMESHDS_Document_HeaderFile - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_Hypothesis.hxx" -#include - - -class SMESHDS_Document -{ - public: - SMESHDS_Document(int UserID); - int NewMesh(); - void RemoveMesh(int MeshID); - SMESHDS_Mesh * GetMesh(int MeshID); - void AddHypothesis(SMESHDS_Hypothesis * H); - void RemoveHypothesis(int HypID); - SMESHDS_Hypothesis * GetHypothesis(int HypID); - int NbMeshes(); - int NbHypothesis(); - void InitMeshesIterator(); - SMESHDS_Mesh * NextMesh(); - bool MoreMesh(); - void InitHypothesisIterator(); - SMESHDS_Hypothesis * NextHypothesis(); - bool MoreHypothesis(); - ~SMESHDS_Document(); - - private: - int myUserID; - std::map myMeshes; - std::map myHypothesis; - std::map::iterator myMeshesIt; - std::map::iterator myHypothesisIt; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_Group.cxx b/src/SMESHDS/SMESHDS_Group.cxx deleted file mode 100644 index 9c7dfa4a9..000000000 --- a/src/SMESHDS/SMESHDS_Group.cxx +++ /dev/null @@ -1,164 +0,0 @@ -// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.cxx -// Module : SMESH -// $Header$ - -#include "SMESHDS_Group.hxx" -#include "SMESHDS_Mesh.hxx" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Group::SMESHDS_Group (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType) - : SMESHDS_GroupBase(theID,theMesh,theType), - myGroup(theMesh,theType) -{ -} - -//======================================================================= -//function : Extent -//purpose : -//======================================================================= - -int SMESHDS_Group::Extent() -{ - return myGroup.Extent(); -} - -//======================================================================= -//function : IsEmpty -//purpose : -//======================================================================= - -bool SMESHDS_Group::IsEmpty() -{ - return myGroup.IsEmpty(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESHDS_Group::Contains (const int theID) -{ - const SMDS_MeshElement* aElem = findInMesh (theID); - if (aElem) - return myGroup.Contains(aElem); - return false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESHDS_Group::Add (const int theID) -{ - const SMDS_MeshElement* aElem = findInMesh (theID); - if (!aElem || myGroup.Contains(aElem)) - return false; - - if (myGroup.IsEmpty()) - SetType( aElem->GetType() ); - - myGroup.Add (aElem); - resetIterator(); - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESHDS_Group::Remove (const int theID) -{ - const SMDS_MeshElement* aElem = findInMesh (theID); - if (!aElem || !myGroup.Contains(aElem)) - return false; - myGroup.Remove (aElem); - resetIterator(); - return true; -} - -//======================================================================= -//function : Clear -//purpose : -//======================================================================= - -void SMESHDS_Group::Clear() -{ - myGroup.Clear(); - resetIterator(); -} - -// ===================== -// class MyGroupIterator -// ===================== - -class MyGroupIterator: public SMDS_ElemIterator -{ - const SMDS_MeshGroup& myGroup; - public: - MyGroupIterator(const SMDS_MeshGroup& group): myGroup(group) { myGroup.InitIterator(); } - bool more() { return myGroup.More(); } - const SMDS_MeshElement* next() { return myGroup.Next(); } -}; - -//======================================================================= -//function : GetElements -//purpose : -//======================================================================= - -SMDS_ElemIteratorPtr SMESHDS_Group::GetElements() -{ - return SMDS_ElemIteratorPtr( new MyGroupIterator ( myGroup )); -} - -//======================================================================= -//function : SetType -//purpose : -//======================================================================= - -void SMESHDS_Group::SetType(SMDSAbs_ElementType theType) -{ - if ( myGroup.IsEmpty() || GetType() == SMDSAbs_All ) { - SMESHDS_GroupBase::SetType( theType ); - myGroup.SetType ( theType ); - } - else - SMESHDS_GroupBase::SetType( myGroup.GetType() ); -} - diff --git a/src/SMESHDS/SMESHDS_Group.hxx b/src/SMESHDS/SMESHDS_Group.hxx deleted file mode 100644 index b318a0f97..000000000 --- a/src/SMESHDS/SMESHDS_Group.hxx +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_Group_HeaderFile -#define _SMESHDS_Group_HeaderFile - -#include -#include "SMESHDS_GroupBase.hxx" -#include "SMDS_MeshGroup.hxx" - -class SMESHDS_Mesh; - -class SMESHDS_Group : public SMESHDS_GroupBase -{ - public: - - SMESHDS_Group (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType); - - virtual void SetType(SMDSAbs_ElementType theType); - - virtual int Extent(); - - virtual bool IsEmpty(); - - virtual bool Contains (const int theID); - - virtual SMDS_ElemIteratorPtr GetElements(); - - bool SMESHDS_Group::Add (const int theID); - - bool SMESHDS_Group::Remove (const int theID); - - void Clear(); - - SMDS_MeshGroup& SMDSGroup() { return myGroup; } - - private: - - SMDS_MeshGroup myGroup; - -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_GroupBase.cxx b/src/SMESHDS/SMESHDS_GroupBase.cxx deleted file mode 100644 index c4adcc53b..000000000 --- a/src/SMESHDS/SMESHDS_GroupBase.cxx +++ /dev/null @@ -1,150 +0,0 @@ -// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.cxx -// Module : SMESH -// $Header$ - -#include "SMESHDS_GroupBase.hxx" -#include "SMESHDS_Mesh.hxx" - -#include "utilities.h" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_GroupBase::SMESHDS_GroupBase (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType): - myID(theID), myMesh(theMesh), myType(theType), myStoreName(""), - myCurIndex(0), myCurID(-1) -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESHDS_GroupBase::GetID (const int theIndex) -{ - if (myCurIndex < 1 || myCurIndex > theIndex) { - myIterator = GetElements(); - myCurIndex = 0; - myCurID = -1; - } - while (myCurIndex < theIndex && myIterator->more()) { - myCurIndex++; - myCurID = myIterator->next()->GetID(); - } - return myCurIndex == theIndex ? myCurID : -1; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const SMDS_MeshElement* SMESHDS_GroupBase::findInMesh (const int theID) const -{ - SMDSAbs_ElementType aType = GetType(); - const SMDS_MeshElement* aElem = NULL; - if (aType == SMDSAbs_Node) { - aElem = GetMesh()->FindNode(theID); - } - else if (aType != SMDSAbs_All) { - aElem = GetMesh()->FindElement(theID); - if (aElem && aType != aElem->GetType()) - aElem = NULL; - } - return aElem; -} - -//============================================================================= -/*! - * Internal method: resets cached iterator, should be called by ancestors - * when they are modified (ex: Add() or Remove() ) - */ -//============================================================================= -void SMESHDS_GroupBase::resetIterator() -{ - myCurIndex = 0; - myCurID = -1; -} - -//======================================================================= -//function : Extent -//purpose : -//======================================================================= - -int SMESHDS_GroupBase::Extent() -{ - SMDS_ElemIteratorPtr it = GetElements(); - int nb = 0; - if ( it ) - for ( ; it->more(); it->next() ) - nb++; - return nb; -} - -//======================================================================= -//function : IsEmpty -//purpose : -//======================================================================= - -bool SMESHDS_GroupBase::IsEmpty() -{ - SMDS_ElemIteratorPtr it = GetElements(); - return ( !it || !it->more() ); -} - -//======================================================================= -//function : Contains -//purpose : -//======================================================================= - -bool SMESHDS_GroupBase::Contains (const int theID) -{ - SMDS_ElemIteratorPtr it = GetElements(); - bool contains = false; - if ( it ) - while ( !contains && it->more() ) - contains = ( it->next()->GetID() == theID ); - return contains; -} - -//======================================================================= -//function : SetType -//purpose : -//======================================================================= - -void SMESHDS_GroupBase::SetType(SMDSAbs_ElementType theType) -{ - myType = theType; -} diff --git a/src/SMESHDS/SMESHDS_GroupBase.hxx b/src/SMESHDS/SMESHDS_GroupBase.hxx deleted file mode 100644 index a7aa87ced..000000000 --- a/src/SMESHDS/SMESHDS_GroupBase.hxx +++ /dev/null @@ -1,90 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Group.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_GroupBase_HeaderFile -#define _SMESHDS_GroupBase_HeaderFile - -#include -#include "SMDSAbs_ElementType.hxx" -#include "SMDS_MeshElement.hxx" - -class SMESHDS_Mesh; - -class SMESHDS_GroupBase -{ - public: - - SMESHDS_GroupBase (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType); - - int GetID() const { return myID; } - - const SMESHDS_Mesh* GetMesh() const { return myMesh; } - - virtual void SetType(SMDSAbs_ElementType theType); - - SMDSAbs_ElementType GetType() const { return myType; } - - void SetStoreName (const char* theName) { myStoreName = theName; } - - const char* GetStoreName () const { return myStoreName.c_str(); } - - virtual int Extent(); - - virtual bool IsEmpty(); - - virtual bool Contains (const int theID); - - virtual SMDS_ElemIteratorPtr GetElements() = 0; - - int GetID (const int theIndex); - // use it for iterations 1..Extent() - - virtual ~SMESHDS_GroupBase() {} - - protected: - const SMDS_MeshElement* findInMesh (const int theID) const; - void resetIterator(); - - private: - SMESHDS_GroupBase (const SMESHDS_GroupBase& theOther); - // prohibited copy constructor - SMESHDS_GroupBase& operator = (const SMESHDS_GroupBase& theOther); - // prohibited assign operator - - int myID; - const SMESHDS_Mesh* myMesh; - SMDSAbs_ElementType myType; - std::string myStoreName; - // for GetID() - int myCurIndex; - int myCurID; - SMDS_ElemIteratorPtr myIterator; - -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_GroupOnGeom.cxx b/src/SMESHDS/SMESHDS_GroupOnGeom.cxx deleted file mode 100644 index 187357a67..000000000 --- a/src/SMESHDS/SMESHDS_GroupOnGeom.cxx +++ /dev/null @@ -1,112 +0,0 @@ -// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_GroupOnGeom.cxx -// Module : SMESH -// $Header$ - -#include "SMESHDS_GroupOnGeom.hxx" -#include "SMESHDS_Mesh.hxx" -#include "utilities.h" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_GroupOnGeom::SMESHDS_GroupOnGeom (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const TopoDS_Shape& theShape) - : SMESHDS_GroupBase(theID,theMesh,theType), myShape(theShape) -{ - SMESHDS_Mesh* aMesh = const_cast(theMesh); - mySubMesh = aMesh->MeshElements( aMesh->AddCompoundSubmesh( theShape )); -} - -// ===================== -// class MyGroupIterator -// ===================== - -class MyIterator: public SMDS_ElemIterator -{ - SMDSAbs_ElementType myType; - SMDS_ElemIteratorPtr myElemIt; - SMDS_NodeIteratorPtr myNodeIt; - const SMDS_MeshElement* myElem; - public: - MyIterator(SMDSAbs_ElementType type, const SMESHDS_SubMesh* subMesh) - : myType(type), myElem(0) - { - if ( subMesh ) - if ( myType == SMDSAbs_Node ) - myNodeIt = subMesh->GetNodes(); - else { - myElemIt = subMesh->GetElements(); - next(); - } - } - bool more() - { - if ( myType == SMDSAbs_Node && myNodeIt ) - return myNodeIt->more(); - return ( myElem != 0 ); - } - const SMDS_MeshElement* next() - { - if ( myType == SMDSAbs_Node && myNodeIt ) - return myNodeIt->next(); - const SMDS_MeshElement* res = myElem; - myElem = 0; - while ( myElemIt && myElemIt->more() ) { - myElem = myElemIt->next(); - if ( myElem && myElem->GetType() == myType ) - break; - else - myElem = 0; - } - return res; - } -}; - -//======================================================================= -//function : GetElements -//purpose : -//======================================================================= - -SMDS_ElemIteratorPtr SMESHDS_GroupOnGeom::GetElements() -{ - return SMDS_ElemIteratorPtr( new MyIterator ( GetType(), mySubMesh )); -} - -//======================================================================= -//function : Contains -//purpose : -//======================================================================= - -bool SMESHDS_GroupOnGeom::Contains (const int theID) -{ - return mySubMesh->Contains( findInMesh( theID )); -} diff --git a/src/SMESHDS/SMESHDS_GroupOnGeom.hxx b/src/SMESHDS/SMESHDS_GroupOnGeom.hxx deleted file mode 100644 index 6a514e2f1..000000000 --- a/src/SMESHDS/SMESHDS_GroupOnGeom.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_GroupOnGeom.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_GroupOnGeom_HeaderFile -#define _SMESHDS_GroupOnGeom_HeaderFile - -#include "SMESHDS_GroupBase.hxx" -#include - -class SMESHDS_SubMesh; - -class SMESHDS_GroupOnGeom: public SMESHDS_GroupBase -{ - public: - - SMESHDS_GroupOnGeom (const int theID, - const SMESHDS_Mesh* theMesh, - const SMDSAbs_ElementType theType, - const TopoDS_Shape& theShape); - - TopoDS_Shape GetShape() const { return myShape; } - - virtual bool Contains (const int theID); - - virtual SMDS_ElemIteratorPtr GetElements(); - - private: - - TopoDS_Shape myShape; - const SMESHDS_SubMesh* mySubMesh; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_Hypothesis.cxx b/src/SMESHDS/SMESHDS_Hypothesis.cxx deleted file mode 100644 index 29501c440..000000000 --- a/src/SMESHDS/SMESHDS_Hypothesis.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Hypothesis.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#include "SMESHDS_Hypothesis.hxx" - -using namespace std; - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Hypothesis::SMESHDS_Hypothesis(int hypId) -{ -// MESSAGE("SMESHDS_Hypothesis::SMESHDS_Hypothesis"); - _hypId = hypId; - _name = "generic"; -// SCRUTE(_name); -// SCRUTE(_hypId); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESHDS_Hypothesis::~SMESHDS_Hypothesis() -{ -// MESSAGE("SMESHDS_Hypothesis::~SMESHDS_Hypothesis"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -const char* SMESHDS_Hypothesis::GetName() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetName"); -// SCRUTE(_name); -// SCRUTE(&_name); - return _name.c_str(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESHDS_Hypothesis::GetID() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetId"); -// SCRUTE(_hypId); - return _hypId; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int SMESHDS_Hypothesis::GetType() const -{ -// MESSAGE("SMESHDS_Hypothesis::GetType"); -// SCRUTE(_type); - return _type; -} - diff --git a/src/SMESHDS/SMESHDS_Hypothesis.hxx b/src/SMESHDS/SMESHDS_Hypothesis.hxx deleted file mode 100644 index 9fb413fbd..000000000 --- a/src/SMESHDS/SMESHDS_Hypothesis.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Hypothesis.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESHDS_HYPOTHESIS_HXX_ -#define _SMESHDS_HYPOTHESIS_HXX_ - -#include -#include - -class SMESHDS_Hypothesis -{ -public: - SMESHDS_Hypothesis(int hypId); - virtual ~SMESHDS_Hypothesis(); - - const char* GetName() const; - int GetID() const; - int GetType() const; - - virtual std::ostream & SaveTo(std::ostream & save)=0; - virtual std::istream & LoadFrom(std::istream & load)=0; - -enum hypothesis_type {PARAM_ALGO, ALGO, ALGO_1D, ALGO_2D, ALGO_3D}; - -protected: - std::string _name; - int _hypId; - int _type; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx deleted file mode 100644 index 5f92232dd..000000000 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ /dev/null @@ -1,1065 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Mesh.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Mesh.hxx" - -#include "SMESHDS_Group.hxx" -#include "SMDS_VertexPosition.hxx" -#include "SMDS_EdgePosition.hxx" -#include "SMDS_FacePosition.hxx" -#include "SMESHDS_GroupOnGeom.hxx" -#include -#include -#include - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : Create -//purpose : -//======================================================================= -SMESHDS_Mesh::SMESHDS_Mesh(int MeshID):myMeshID(MeshID) -{ - myScript = new SMESHDS_Script(); -} - -//======================================================================= -//function : ShapeToMesh -//purpose : -//======================================================================= -void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S) -{ - if ( !myShape.IsNull() && S.IsNull() ) - { - // removal of a shape to mesh, delete ... - // - hypotheses - myShapeToHypothesis.clear(); - // - shape indices in SMDS_Position of nodes - map::iterator i_sub = myShapeIndexToSubMesh.begin(); - for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) { - if ( !i_sub->second->IsComplexSubmesh() ) { - SMDS_NodeIteratorPtr nIt = i_sub->second->GetNodes(); - while ( nIt->more() ) - nIt->next()->GetPosition()->SetShapeId( 0 ); - } - } - // - sub-meshes - myIndexToShape.Clear(); - myShapeIndexToSubMesh.clear(); - // - groups on geometry - set::iterator gr = myGroups.begin(); - while ( gr != myGroups.end() ) { - if ( dynamic_cast( *gr )) - myGroups.erase( gr++ ); - else - gr++; - } - } - else { - myShape = S; - if ( !S.IsNull() ) - TopExp::MapShapes(myShape, myIndexToShape); - } -} - -//======================================================================= -//function : AddHypothesis -//purpose : -//======================================================================= - -bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS, - const SMESHDS_Hypothesis * H) -{ - list& alist=myShapeToHypothesis[SS]; - - //Check if the Hypothesis is still present - list::iterator ith=alist.begin(); - - for (; ith!=alist.end(); ith++) - if (H == *ith) return false; - - alist.push_back(H); - return true; -} - -//======================================================================= -//function : RemoveHypothesis -//purpose : -//======================================================================= - -bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S, - const SMESHDS_Hypothesis * H) -{ - ShapeToHypothesis::iterator its=myShapeToHypothesis.find(S); - if(its!=myShapeToHypothesis.end()) - { - list::iterator ith=(*its).second.begin(); - - for (; ith!=(*its).second.end(); ith++) - if (H == *ith) - { - (*its).second.erase(ith); - return true; - } - } - return false; -} - -//======================================================================= -//function : AddNode -//purpose : -//======================================================================= -SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z){ - SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z); - if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z); - return node; -} - -SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, int ID){ - SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID); - if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z); - return node; -} - -//======================================================================= -//function : MoveNode -//purpose : -//======================================================================= -void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z) -{ - SMDS_MeshNode * node=const_cast(n); - node->setXYZ(x,y,z); - myScript->MoveNode(n->GetID(), x, y, z); -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, - const SMDS_MeshNode * nodes[], - const int nbnodes) -{ - if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes )) - return false; - - vector IDs( nbnodes ); - for ( int i = 0; i < nbnodes; i++ ) - IDs [ i ] = nodes[ i ]->GetID(); - myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes); - - return true; -} - -//======================================================================= -//function : ChangePolygonNodes -//purpose : -//======================================================================= -bool SMESHDS_Mesh::ChangePolygonNodes - (const SMDS_MeshElement * elem, - vector nodes) -{ - ASSERT(nodes.size() > 3); - - return ChangeElementNodes(elem, &nodes[0], nodes.size()); -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : -//======================================================================= -bool SMESHDS_Mesh::ChangePolyhedronNodes - (const SMDS_MeshElement * elem, - std::vector nodes, - std::vector quantities) -{ - ASSERT(nodes.size() > 3); - - if (!SMDS_Mesh::ChangePolyhedronNodes(elem, nodes, quantities)) - return false; - - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities); - - return true; -} - -//======================================================================= -//function : Renumber -//purpose : -//======================================================================= - -void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - SMDS_Mesh::Renumber( isNodes, startID, deltaID ); - myScript->Renumber( isNodes, startID, deltaID ); -} - -//======================================================================= -//function :AddEdgeWithID -//purpose : -//======================================================================= -SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID) -{ - SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID); - if(anElem) myScript->AddEdge(ID,n1,n2); - return anElem; -} - -SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID) -{ - return AddEdgeWithID(n1->GetID(), - n2->GetID(), - ID); -} - -SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2) -{ - SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2); - if(anElem) myScript->AddEdge(anElem->GetID(), - n1->GetID(), - n2->GetID()); - return anElem; -} - -//======================================================================= -//function :AddFace -//purpose : -//======================================================================= -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID); - if(anElem) myScript->AddFace(ID,n1,n2,n3); - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - int ID) -{ - return AddFaceWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - ID); -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3); - if(anElem) myScript->AddFace(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID()); - return anElem; -} - -//======================================================================= -//function :AddFace -//purpose : -//======================================================================= -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID); - if(anElem) myScript->AddFace(ID, n1, n2, n3, n4); - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - return AddFaceWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - ID); -} - -SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4); - if(anElem) myScript->AddFace(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID) -{ - SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID()); - return anElem; -} - -//======================================================================= -//function :AddVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID) -{ - SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID); - if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8); - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, - int ID) -{ - return AddVolumeWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID(), - n7->GetID(), - n8->GetID(), - ID); -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8); - if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), - n2->GetID(), - n3->GetID(), - n4->GetID(), - n5->GetID(), - n6->GetID(), - n7->GetID(), - n8->GetID()); - return anElem; -} - -//======================================================================= -//function : AddPolygonalFace -//purpose : -//======================================================================= -SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (std::vector nodes_ids, - const int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID); - if (anElem) { - myScript->AddPolygonalFace(ID, nodes_ids); - } - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID - (std::vector nodes, - const int ID) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolygonalFace(ID, nodes_ids); - } - return anElem; -} - -SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFace - (std::vector nodes) -{ - SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolygonalFace(anElem->GetID(), nodes_ids); - } - return anElem; -} - -//======================================================================= -//function : AddPolyhedralVolume -//purpose : -//======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (std::vector nodes_ids, - std::vector quantities, - const int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID); - if (anElem) { - myScript->AddPolyhedralVolume(ID, nodes_ids, quantities); - } - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID - (std::vector nodes, - std::vector quantities, - const int ID) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolyhedralVolume(ID, nodes_ids, quantities); - } - return anElem; -} - -SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume - (std::vector nodes, - std::vector quantities) -{ - SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities); - if (anElem) { - int i, len = nodes.size(); - std::vector nodes_ids (len); - for (i = 0; i < len; i++) { - nodes_ids[i] = nodes[i]->GetID(); - } - myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities); - } - return anElem; -} - -//======================================================================= -//function : removeFromContainers -//purpose : -//======================================================================= - -static void removeFromContainers (map & theSubMeshes, - set& theGroups, - list & theElems, - const bool isNode) -{ - if ( theElems.empty() ) - return; - - // Rm from group - // Element can belong to several groups - if ( !theGroups.empty() ) - { - set::iterator GrIt = theGroups.begin(); - for ( ; GrIt != theGroups.end(); GrIt++ ) - { - SMESHDS_Group* group = dynamic_cast( *GrIt ); - if ( !group || group->IsEmpty() ) continue; - - list::iterator elIt = theElems.begin(); - for ( ; elIt != theElems.end(); elIt++ ) - { - group->SMDSGroup().Remove( *elIt ); - if ( group->IsEmpty() ) break; - } - } - } - - // Rm from sub-meshes - // Element should belong to only one sub-mesh - map::iterator SubIt = theSubMeshes.begin(); - for ( ; SubIt != theSubMeshes.end(); SubIt++ ) - { - int size = isNode ? (*SubIt).second->NbNodes() : (*SubIt).second->NbElements(); - if ( size == 0 ) continue; - - list::iterator elIt = theElems.begin(); - while ( elIt != theElems.end() ) - { - bool removed = false; - if ( isNode ) - removed = (*SubIt).second->RemoveNode( static_cast (*elIt) ); - else - removed = (*SubIt).second->RemoveElement( *elIt ); - - if (removed) - { - elIt = theElems.erase( elIt ); - if ( theElems.empty() ) - return; // all elements are found and removed - } - else - { - elIt++ ; - } - } - } -} - -//======================================================================= -//function : RemoveNode -//purpose : -//======================================================================= -void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) -{ - myScript->RemoveNode(n->GetID()); - - list removedElems; - list removedNodes; - - SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true ); - - removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false ); - removeFromContainers( myShapeIndexToSubMesh, myGroups, removedNodes, true ); -} - -//======================================================================= -//function : RemoveElement -//purpose : -//======================================================================== -void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) -{ - if (elt->GetType() == SMDSAbs_Node) - { - RemoveNode( static_cast( elt )); - return; - } - - myScript->RemoveElement(elt->GetID()); - - list removedElems; - list removedNodes; - - SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false); - - removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false ); -} - -//======================================================================= -//function : SetNodeOnVolume -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, - const TopoDS_Shell & S) -{ - SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) ); -} -//======================================================================= -//function : SetNodeOnVolume -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode, - const TopoDS_Solid & S) -{ - SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) ); -} - -//======================================================================= -//function : SetNodeOnFace -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode, - const TopoDS_Face & S, - double u, - double v) -{ - SetNodeOnFace( aNode, myIndexToShape.FindIndex(S), u, v ); -} - -//======================================================================= -//function : SetNodeOnEdge -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode, - const TopoDS_Edge & S, - double u) -{ - SetNodeOnEdge( aNode, myIndexToShape.FindIndex(S), u ); -} - -//======================================================================= -//function : SetNodeOnVertex -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode, - const TopoDS_Vertex & S) -{ - SetNodeOnVertex( aNode, myIndexToShape.FindIndex(S)); -} - -//======================================================================= -//function : UnSetNodeOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode) -{ - MESSAGE("not implemented"); -} - -//======================================================================= -//function : SetMeshElementOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement, - const TopoDS_Shape & S) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = myIndexToShape.FindIndex(S); - - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); - - myShapeIndexToSubMesh[Index]->AddElement(anElement); -} - -//======================================================================= -//function : UnSetMeshElementOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh:: -UnSetMeshElementOnShape(const SMDS_MeshElement * anElement, - const TopoDS_Shape & S) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = myIndexToShape.FindIndex(S); - - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]->RemoveElement(anElement); -} - -//======================================================================= -//function : ShapeToMesh -//purpose : -//======================================================================= -TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const -{ - return myShape; -} - -//======================================================================= -//function : IsGroupOfSubShapes -//purpose : return true if at least one subshape of theShape is a subshape -// of myShape or theShape == myShape -//======================================================================= - -bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const -{ - if ( myShape.IsSame( theShape )) - return true; - - for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() ) { - if (myIndexToShape.Contains( it.Value() ) || - IsGroupOfSubShapes( it.Value() )) - return true; - } - - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given -/// TopoDS_Shape is unknown -/////////////////////////////////////////////////////////////////////////////// -SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - int Index = ShapeToIndex(S); - TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index); - if (anIter != myShapeIndexToSubMesh.end()) - return anIter->second; - else - return NULL; -} - -/////////////////////////////////////////////////////////////////////////////// -/// Return the sub mesh by Id of shape it is linked to -/////////////////////////////////////////////////////////////////////////////// -SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - return myShapeIndexToSubMesh[Index]; - else - return NULL; -} - -//======================================================================= -//function : SubMeshIndices -//purpose : -//======================================================================= -list SMESHDS_Mesh::SubMeshIndices() -{ - list anIndices; - std::map::iterator anIter = myShapeIndexToSubMesh.begin(); - for (; anIter != myShapeIndexToSubMesh.end(); anIter++) { - anIndices.push_back((*anIter).first); - } - return anIndices; -} - -//======================================================================= -//function : GetHypothesis -//purpose : -//======================================================================= - -const list& SMESHDS_Mesh::GetHypothesis( - const TopoDS_Shape & S) const -{ - if (myShapeToHypothesis.find(S)!=myShapeToHypothesis.end()) - return myShapeToHypothesis.find(S)->second; - - static list empty; - return empty; -} - -//======================================================================= -//function : GetScript -//purpose : -//======================================================================= -SMESHDS_Script* SMESHDS_Mesh::GetScript() -{ - return myScript; -} - -//======================================================================= -//function : ClearScript -//purpose : -//======================================================================= -void SMESHDS_Mesh::ClearScript() -{ - myScript->Clear(); -} - -//======================================================================= -//function : HasMeshElements -//purpose : -//======================================================================= -bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S) -{ - if (myShape.IsNull()) MESSAGE("myShape is NULL"); - int Index = myIndexToShape.FindIndex(S); - return myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end(); -} - -//======================================================================= -//function : HasHypothesis -//purpose : -//======================================================================= -bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S) -{ - return myShapeToHypothesis.find(S)!=myShapeToHypothesis.end(); -} - -//======================================================================= -//function : NewSubMesh -//purpose : -//======================================================================= -SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index) -{ - SMESHDS_SubMesh* SM = 0; - TShapeIndexToSubMesh::iterator anIter = myShapeIndexToSubMesh.find(Index); - if (anIter == myShapeIndexToSubMesh.end()) - { - SM = new SMESHDS_SubMesh(); - myShapeIndexToSubMesh[Index]=SM; - } - else - SM = anIter->second; - return SM; -} - -//======================================================================= -//function : AddCompoundSubmesh -//purpose : -//======================================================================= - -int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, - TopAbs_ShapeEnum type) -{ - int aMainIndex = 0; - if ( IsGroupOfSubShapes( S ) || (S.ShapeType() == TopAbs_VERTEX && myIndexToShape.Contains(S)) ) - { - aMainIndex = myIndexToShape.Add( S ); - bool all = ( type == TopAbs_SHAPE ); - if ( all ) // corresponding simple submesh may exist - aMainIndex = -aMainIndex; - //MESSAGE("AddCompoundSubmesh index = " << aMainIndex ); - SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex ); - if ( !aNewSub->IsComplexSubmesh() ) // is empty - { - int shapeType = all ? myShape.ShapeType() : type; - int typeLimit = all ? TopAbs_VERTEX : type; - for ( ; shapeType <= typeLimit; shapeType++ ) - { - TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType )); - for ( ; exp.More(); exp.Next() ) - { - int index = myIndexToShape.FindIndex( exp.Current() ); - if ( index ) - aNewSub->AddSubMesh( NewSubMesh( index )); - } - } - } - } - return aMainIndex; -} - -//======================================================================= -//function : IndexToShape -//purpose : -//======================================================================= -TopoDS_Shape SMESHDS_Mesh::IndexToShape(int ShapeIndex) -{ - return myIndexToShape.FindKey(ShapeIndex); -} - -//======================================================================= -//function : ShapeToIndex -//purpose : -//======================================================================= -int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const -{ - if (myShape.IsNull()) - MESSAGE("myShape is NULL"); - - int index = myIndexToShape.FindIndex(S); - - return index; -} - -//======================================================================= -//function : SetNodeOnVolume -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index) -{ - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetNodeOnFace -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index, double u, double v) -{ - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, u, v))); - - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetNodeOnEdge -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode, - int Index, - double u) -{ - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, u))); - - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetNodeOnVertex -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index) -{ - //Set Position on Node - aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index))); - - addNodeToSubmesh( aNode, Index ); -} - -//======================================================================= -//function : SetMeshElementOnShape -//purpose : -//======================================================================= -void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement, - int Index) -{ - if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) - myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh(); - - myShapeIndexToSubMesh[Index]->AddElement(anElement); -} - -SMESHDS_Mesh::~SMESHDS_Mesh() -{ -} diff --git a/src/SMESHDS/SMESHDS_Script.cxx b/src/SMESHDS/SMESHDS_Script.cxx deleted file mode 100644 index 369ab4697..000000000 --- a/src/SMESHDS/SMESHDS_Script.cxx +++ /dev/null @@ -1,247 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Script.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_Script.hxx" - -using namespace std; - -//======================================================================= -//function : getCommand -//purpose : -//======================================================================= -SMESHDS_Command* SMESHDS_Script::getCommand(const SMESHDS_CommandType aType) -{ - SMESHDS_Command* com; - if (myCommands.empty()) - { - com = new SMESHDS_Command(aType); - myCommands.insert(myCommands.end(),com); - } - else - { - com = myCommands.back(); - if (com->GetType() != aType) - { - com = new SMESHDS_Command(aType); - myCommands.insert(myCommands.end(),com); - } - } - return com; -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddNode(int NewNodeID, double x, double y, double z) -{ - getCommand(SMESHDS_AddNode)->AddNode(NewNodeID, x, y, z); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddEdge(int NewEdgeID, int idnode1, int idnode2) -{ - getCommand(SMESHDS_AddEdge)->AddEdge(NewEdgeID, idnode1, idnode2); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddFace(int NewFaceID, - int idnode1, int idnode2, int idnode3) -{ - getCommand(SMESHDS_AddTriangle)->AddFace(NewFaceID, - idnode1, idnode2, idnode3); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddFace(int NewFaceID, - int idnode1, int idnode2, - int idnode3, int idnode4) -{ - getCommand(SMESHDS_AddQuadrangle)->AddFace(NewFaceID, - idnode1, idnode2, - idnode3, idnode4); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, - int idnode3, int idnode4) -{ - getCommand(SMESHDS_AddTetrahedron)->AddVolume(NewID, - idnode1, idnode2, - idnode3, idnode4); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, - int idnode3, int idnode4, int idnode5) -{ - getCommand(SMESHDS_AddPyramid)->AddVolume(NewID, - idnode1, idnode2, - idnode3, idnode4, idnode5); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6) -{ - getCommand(SMESHDS_AddPrism)->AddVolume(NewID, - idnode1, idnode2, idnode3, - idnode4, idnode5, idnode6); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::AddVolume(int NewID, - int idnode1, int idnode2, int idnode3, int idnode4, - int idnode5, int idnode6, int idnode7, int idnode8) -{ - getCommand(SMESHDS_AddHexahedron)->AddVolume(NewID, - idnode1, idnode2, idnode3, idnode4, - idnode5, idnode6, idnode7, idnode8); -} - -//======================================================================= -//function : AddPolygonalFace -//purpose : -//======================================================================= -void SMESHDS_Script::AddPolygonalFace (int NewFaceID, std::vector nodes_ids) -{ - getCommand(SMESHDS_AddPolygon)->AddPolygonalFace(NewFaceID, nodes_ids); -} - -//======================================================================= -//function : AddPolyhedralVolume -//purpose : -//======================================================================= -void SMESHDS_Script::AddPolyhedralVolume (int NewID, - std::vector nodes_ids, - std::vector quantities) -{ - getCommand(SMESHDS_AddPolyhedron)->AddPolyhedralVolume - (NewID, nodes_ids, quantities); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::MoveNode(int NewNodeID, double x, double y, double z) -{ - getCommand(SMESHDS_MoveNode)->MoveNode(NewNodeID, x, y, z); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::RemoveNode(int ID) -{ - getCommand(SMESHDS_RemoveNode)->RemoveNode(ID); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::RemoveElement(int ElementID) -{ - getCommand(SMESHDS_RemoveElement)->RemoveElement(ElementID); -} - -//======================================================================= -//function : ChangeElementNodes -//purpose : -//======================================================================= - -void SMESHDS_Script::ChangeElementNodes(int ElementID, int nodes[], int nbnodes) -{ - getCommand(SMESHDS_ChangeElementNodes)->ChangeElementNodes( ElementID, nodes, nbnodes ); -} - -//======================================================================= -//function : ChangePolyhedronNodes -//purpose : -//======================================================================= -void SMESHDS_Script::ChangePolyhedronNodes (const int ElementID, - std::vector nodes_ids, - std::vector quantities) -{ - getCommand(SMESHDS_ChangePolyhedronNodes)->ChangePolyhedronNodes - (ElementID, nodes_ids, quantities); -} - -//======================================================================= -//function : Renumber -//purpose : -//======================================================================= - -void SMESHDS_Script::Renumber (const bool isNodes, const int startID, const int deltaID) -{ - getCommand(SMESHDS_Renumber)->Renumber( isNodes, startID, deltaID ); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -void SMESHDS_Script::Clear() -{ - myCommands.clear(); -} - -//======================================================================= -//function : -//purpose : -//======================================================================= -const list& SMESHDS_Script::GetCommands() -{ - return myCommands; -} diff --git a/src/SMESHDS/SMESHDS_Script.hxx b/src/SMESHDS/SMESHDS_Script.hxx deleted file mode 100644 index 3874facfc..000000000 --- a/src/SMESHDS/SMESHDS_Script.hxx +++ /dev/null @@ -1,77 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_Script.hxx -// Module : SMESH - -#ifndef _SMESHDS_Script_HeaderFile -#define _SMESHDS_Script_HeaderFile - -#include "SMESHDS_Command.hxx" - -#include -#include - - -class SMESHDS_Script -{ - public: - void AddNode(int NewNodeID, double x, double y, double z); - void AddEdge(int NewEdgeID, int idnode1, int idnode2); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3); - void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6); - void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3, - int idnode4, int idnode5, int idnode6, int idnode7, int idnode8); - - void AddPolygonalFace (const int NewFaceID, - std::vector nodes_ids); - void AddPolyhedralVolume (const int NewVolID, - std::vector nodes_ids, - std::vector quantities); - - void MoveNode(int NewNodeID, double x, double y, double z); - void RemoveNode(int NodeID); - void RemoveElement(int ElementID); - void ChangeElementNodes(int ElementID, int nodes[], int nbnodes); - void ChangePolyhedronNodes(const int ElementID, - std::vector nodes_ids, - std::vector quantities); - void Renumber (const bool isNodes, const int startID, const int deltaID); - void Clear(); - const std::list & GetCommands(); - ~SMESHDS_Script(); - - private: - SMESHDS_Command* getCommand(const SMESHDS_CommandType aType); - - std::list myCommands; -}; - -#endif diff --git a/src/SMESHDS/SMESHDS_SubMesh.cxx b/src/SMESHDS/SMESHDS_SubMesh.cxx deleted file mode 100644 index 5bdbfc6a4..000000000 --- a/src/SMESHDS/SMESHDS_SubMesh.cxx +++ /dev/null @@ -1,299 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_SubMesh.cxx -// Author : Yves FRICAUD, OCC -// Module : SMESH -// $Header: - -#include "SMESHDS_SubMesh.hxx" - -#include "utilities.h" - -using namespace std; - -//======================================================================= -//function : AddElement -//purpose : -//======================================================================= -void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) -{ - if ( !IsComplexSubmesh() ) - myElements.insert(ME); -} - -//======================================================================= -//function : RemoveElement -//purpose : -//======================================================================= -bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME) -{ - if ( !IsComplexSubmesh() && NbElements() ) - return myElements.erase(ME); - - return false; -} - -//======================================================================= -//function : AddNode -//purpose : -//======================================================================= -void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N) -{ - if ( !IsComplexSubmesh() ) - myNodes.insert(N); -} - -//======================================================================= -//function : RemoveNode -//purpose : -//======================================================================= - -bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N) -{ - if ( !IsComplexSubmesh() && NbNodes() ) - return myNodes.erase(N); - - return false; -} - -//======================================================================= -//function : NbElements -//purpose : -//======================================================================= -int SMESHDS_SubMesh::NbElements() const -{ - if ( !IsComplexSubmesh() ) - return myElements.size(); - - int nbElems = 0; -#ifndef WNT - set::iterator it = mySubMeshes.begin(); -#else - set::const_iterator it = mySubMeshes.begin(); -#endif - for ( ; it != mySubMeshes.end(); it++ ) - nbElems += (*it)->NbElements(); - - return nbElems; -} - -//======================================================================= -//function : NbNodes -//purpose : -//======================================================================= - -int SMESHDS_SubMesh::NbNodes() const -{ - if ( !IsComplexSubmesh() ) - return myNodes.size(); - - int nbElems = 0; -#ifndef WNT - set::iterator it = mySubMeshes.begin(); -#else - set::const_iterator it = mySubMeshes.begin(); -#endif - for ( ; it != mySubMeshes.end(); it++ ) - nbElems += (*it)->NbNodes(); - - return nbElems; -} - -// ===================== -// class MySetIterator -// ===================== - -template class MySetIterator:public SMDS_Iterator -{ - typedef const set TSet; - typename TSet::const_iterator myIt; - TSet& mySet; - - public: - MySetIterator(const set& s):mySet(s), myIt(s.begin()) - { - } - - bool more() - { - return myIt!=mySet.end(); - } - const T* next() - { - const T* t=*myIt; - myIt++; - return t; - } -}; - -// ===================== -// class MyIterator -// ===================== - -template class MyIterator : public SMDS_Iterator -{ - public: - MyIterator (const set& theSubMeshes) - : mySubMeshes( theSubMeshes ), mySubIt( theSubMeshes.begin() ), myMore(false) - {} - bool more() - { - while (( !myElemIt.get() || !myElemIt->more() ) && - mySubIt != mySubMeshes.end()) - { - myElemIt = getElements(*mySubIt); - mySubIt++; - } - myMore = myElemIt.get() && myElemIt->more(); - return myMore; - } - VALUE next() - { - VALUE elem = 0; - if ( myMore ) - elem = myElemIt->next(); - return elem; - } - protected: - virtual boost::shared_ptr< SMDS_Iterator > - getElements(const SMESHDS_SubMesh*) const = 0; - - private: - bool myMore; - const set& mySubMeshes; - set::const_iterator mySubIt; - boost::shared_ptr< SMDS_Iterator > myElemIt; -}; - -// ===================== -// class MyElemIterator -// ===================== - -class MyElemIterator: public MyIterator -{ - public: - MyElemIterator (const set& theSubMeshes) - :MyIterator( theSubMeshes ) {} - SMDS_ElemIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const - { return theSubMesh->GetElements(); } -}; - -// ===================== -// class MyNodeIterator -// ===================== - -class MyNodeIterator: public MyIterator -{ - public: - MyNodeIterator (const set& theSubMeshes) - :MyIterator( theSubMeshes ) {} - SMDS_NodeIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const - { return theSubMesh->GetNodes(); } -}; - -//======================================================================= -//function : GetElements -//purpose : -//======================================================================= - -SMDS_ElemIteratorPtr SMESHDS_SubMesh::GetElements() const -{ - if ( IsComplexSubmesh() ) - return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes )); - - return SMDS_ElemIteratorPtr(new MySetIterator(myElements)); -} - -//======================================================================= -//function : GetNodes -//purpose : -//======================================================================= - -SMDS_NodeIteratorPtr SMESHDS_SubMesh::GetNodes() const -{ - if ( IsComplexSubmesh() ) - return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes )); - - return SMDS_NodeIteratorPtr(new MySetIterator(myNodes)); -} - -//======================================================================= -//function : Contains -//purpose : check if elem or node is in -//======================================================================= - -bool SMESHDS_SubMesh::Contains(const SMDS_MeshElement * ME) const -{ - // DO NOT TRY TO FIND A REMOVED ELEMENT !! - if ( !ME ) - return false; - - if ( IsComplexSubmesh() ) - { - set::const_iterator aSubIt = mySubMeshes.begin(); - for ( ; aSubIt != mySubMeshes.end(); aSubIt++ ) - if ( (*aSubIt)->Contains( ME )) - return true; - return false; - } - - if ( ME->GetType() == SMDSAbs_Node ) - { - const SMDS_MeshNode* n = static_cast( ME ); - return ( myNodes.find( n ) != myNodes.end() ); - } - - return ( myElements.find( ME ) != myElements.end() ); -} - -//======================================================================= -//function : AddSubMesh -//purpose : -//======================================================================= - -void SMESHDS_SubMesh::AddSubMesh( const SMESHDS_SubMesh* theSubMesh ) -{ - ASSERT( theSubMesh ); - mySubMeshes.insert( theSubMesh ); -} - -//======================================================================= -//function : RemoveSubMesh -//purpose : -//======================================================================= - -bool SMESHDS_SubMesh::RemoveSubMesh( const SMESHDS_SubMesh* theSubMesh ) -{ - return mySubMeshes.erase( theSubMesh ); -} - -//======================================================================= -//function : ContainsSubMesh -//purpose : -//======================================================================= - -bool SMESHDS_SubMesh::ContainsSubMesh( const SMESHDS_SubMesh* theSubMesh ) const -{ - return mySubMeshes.find( theSubMesh ) != mySubMeshes.end(); -} diff --git a/src/SMESHDS/SMESHDS_SubMesh.hxx b/src/SMESHDS/SMESHDS_SubMesh.hxx deleted file mode 100644 index ac3cd1c3f..000000000 --- a/src/SMESHDS/SMESHDS_SubMesh.hxx +++ /dev/null @@ -1,69 +0,0 @@ -// SMESH SMESHDS : management of mesh data and SMESH document -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHDS_SubMesh.hxx -// Module : SMESH - -#ifndef _SMESHDS_SubMesh_HeaderFile -#define _SMESHDS_SubMesh_HeaderFile - -#include "SMDS_Mesh.hxx" -#include - -#if defined WNT && defined WIN32 && defined SMESHDS_EXPORTS -#define SMESHDS_WNT_EXPORT __declspec( dllexport ) -#else -#define SMESHDS_WNT_EXPORT -#endif - -class SMESHDS_WNT_EXPORT SMESHDS_SubMesh -{ - public: - - bool IsComplexSubmesh() const { return !mySubMeshes.empty(); } - - // if !IsComplexSubmesh() - void AddElement(const SMDS_MeshElement * ME); - bool RemoveElement(const SMDS_MeshElement * ME); // ret true if ME was in - void AddNode(const SMDS_MeshNode * ME); - bool RemoveNode(const SMDS_MeshNode * ME); // ret true if ME was in - - // if IsComplexSubmesh() - void AddSubMesh( const SMESHDS_SubMesh* theSubMesh ); - bool RemoveSubMesh( const SMESHDS_SubMesh* theSubMesh ); - bool ContainsSubMesh( const SMESHDS_SubMesh* theSubMesh ) const; - - // for both types - int NbElements() const; - SMDS_ElemIteratorPtr GetElements() const; - int NbNodes() const; - SMDS_NodeIteratorPtr GetNodes() const; - bool Contains(const SMDS_MeshElement * ME) const; // check if elem or node is in - - private: - //const SMDS_Mesh * myMesh; - std::set myElements; - std::set myNodes; - std::set mySubMeshes; -}; -#endif diff --git a/src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx b/src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx deleted file mode 100644 index 79db47025..000000000 --- a/src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx +++ /dev/null @@ -1,89 +0,0 @@ -// File generated by CPPExt (Transient) -// -// Copyright (C) 1991,1995 by -// -// MATRA DATAVISION, FRANCE -// -// This software is furnished in accordance with the terms and conditions -// of the contract and with the inclusion of the above copyright notice. -// This software or any other copy thereof may not be provided or otherwise -// be made available to any other person. No title to an ownership of the -// software is hereby transferred. -// -// At the termination of the contract, the software and all copies of this -// software must be deleted. - -#ifndef _Handle_SMESH_TypeFilter_HeaderFile -#define _Handle_SMESH_TypeFilter_HeaderFile - -#ifndef _Standard_Macro_HeaderFile -#include -#endif -#ifndef _Standard_HeaderFile -#include -#endif - -#ifndef _Handle_SALOME_Filter_HeaderFile -#include "Handle_SALOME_Filter.hxx" -#endif - -class Standard_Transient; -class Handle_Standard_Type; -class Handle(SALOME_Filter); -class SMESH_TypeFilter; -Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(SMESH_TypeFilter); - -class Handle(SMESH_TypeFilter) : public Handle(SALOME_Filter) { - public: - inline void* operator new(size_t,void* anAddress) - { - return anAddress; - } - inline void* operator new(size_t size) - { - return Standard::Allocate(size); - } - inline void operator delete(void *anAddress) - { - if (anAddress) Standard::Free((Standard_Address&)anAddress); - } -// inline void operator delete(void *anAddress, size_t size) -// { -// if (anAddress) Standard::Free((Standard_Address&)anAddress,size); -// } - Handle(SMESH_TypeFilter)():Handle(SALOME_Filter)() {} - Handle(SMESH_TypeFilter)(const Handle(SMESH_TypeFilter)& aHandle) : Handle(SALOME_Filter)(aHandle) - { - } - - Handle(SMESH_TypeFilter)(const SMESH_TypeFilter* anItem) : Handle(SALOME_Filter)((SALOME_Filter *)anItem) - { - } - - Handle(SMESH_TypeFilter)& operator=(const Handle(SMESH_TypeFilter)& aHandle) - { - Assign(aHandle.Access()); - return *this; - } - - Handle(SMESH_TypeFilter)& operator=(const SMESH_TypeFilter* anItem) - { - Assign((Standard_Transient *)anItem); - return *this; - } - - SMESH_TypeFilter* operator->() - { - return (SMESH_TypeFilter *)ControlAccess(); - } - - SMESH_TypeFilter* operator->() const - { - return (SMESH_TypeFilter *)ControlAccess(); - } - - Standard_EXPORT ~Handle(SMESH_TypeFilter)(); - - Standard_EXPORT static const Handle(SMESH_TypeFilter) DownCast(const Handle(Standard_Transient)& AnObject); -}; -#endif diff --git a/src/SMESHFiltersSelection/SMESH_TypeFilter.ixx b/src/SMESHFiltersSelection/SMESH_TypeFilter.ixx deleted file mode 100644 index a01d02ee0..000000000 --- a/src/SMESHFiltersSelection/SMESH_TypeFilter.ixx +++ /dev/null @@ -1,71 +0,0 @@ -// File generated by CPPExt (Transient) -// Copyright (C) 1991,1995 by -// -// MATRA DATAVISION, FRANCE -// -// This software is furnished in accordance with the terms and conditions -// of the contract and with the inclusion of the above copyright notice. -// This software or any other copy thereof may not be provided or otherwise -// be made available to any other person. No title to an ownership of the -// software is hereby transferred. -// -// At the termination of the contract, the software and all copies of this -// software must be deleted. -// -#include "SMESH_TypeFilter.jxx" - -#ifndef _Standard_TypeMismatch_HeaderFile -#include -#endif - -SMESH_TypeFilter::~SMESH_TypeFilter() {} - - - -Standard_EXPORT Handle_Standard_Type& SMESH_TypeFilter_Type_() -{ - - static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_Filter); - if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_Filter); - static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared); - if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared); - static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient); - if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient); - - - static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL}; - static Handle_Standard_Type _aType = new Standard_Type("SMESH_TypeFilter", - sizeof(SMESH_TypeFilter), - 1, - (Standard_Address)_Ancestors, - (Standard_Address)NULL); - - return _aType; -} - - -// DownCast method -// allow safe downcasting -// -const Handle(SMESH_TypeFilter) Handle(SMESH_TypeFilter)::DownCast(const Handle(Standard_Transient)& AnObject) -{ - Handle(SMESH_TypeFilter) _anOtherObject; - - if (!AnObject.IsNull()) { - if (AnObject->IsKind(STANDARD_TYPE(SMESH_TypeFilter))) { - _anOtherObject = Handle(SMESH_TypeFilter)((Handle(SMESH_TypeFilter)&)AnObject); - } - } - - return _anOtherObject ; -} -const Handle(Standard_Type)& SMESH_TypeFilter::DynamicType() const -{ - return STANDARD_TYPE(SMESH_TypeFilter) ; -} -Standard_Boolean SMESH_TypeFilter::IsKind(const Handle(Standard_Type)& AType) const -{ - return (STANDARD_TYPE(SMESH_TypeFilter) == AType || SALOME_Filter::IsKind(AType)); -} -Handle_SMESH_TypeFilter::~Handle_SMESH_TypeFilter() {} - diff --git a/src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h b/src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h deleted file mode 100644 index e2bb65a67..000000000 --- a/src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h +++ /dev/null @@ -1,94 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_CreateHypothesesDlg.h -// Author : Julia DOROVSKIKH -// Module : SMESH -// $Header$ - -#ifndef DIALOGBOX_CREATE_HYPOTHESES_H -#define DIALOGBOX_CREATE_HYPOTHESES_H - -// QT Includes -#include -#include -#include - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(GEOM_Gen) -#include CORBA_SERVER_HEADER(SMESH_Mesh) - -#include -#include - -class QButtonGroup; -class QGroupBox; -class QPushButton; -class QListView; -class QListViewItem; -class SMESHGUI; - -//================================================================================= -// class : SMESHGUI_CreateHypothesesDlg -// purpose : -//================================================================================= -class SMESHGUI_CreateHypothesesDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_CreateHypothesesDlg (SMESHGUI*, - const char* name = 0, - bool modal = FALSE, - bool isAlgo = FALSE); - ~SMESHGUI_CreateHypothesesDlg (); - -private: - - void Init() ; - void closeEvent( QCloseEvent* e ) ; - void enterEvent ( QEvent * ) ; - - void InitAlgoDefinition(); - - SMESHGUI* mySMESHGUI; - bool myIsAlgo; - - QGroupBox* GroupButtons; - QPushButton* buttonCancel; - QPushButton* buttonApply; - - QGroupBox* GroupAlgorithms; - QListView* ListAlgoDefinition; - -private slots: - - void ClickOnCancel(); - void ClickOnApply(); - void ActivateThisDialog() ; - - void onSelectionChanged(); - void onDoubleClicked(QListViewItem*); -}; - -#endif // DIALOGBOX_CREATE_HYPOTHESES_H diff --git a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx b/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx deleted file mode 100644 index c2d0185b6..000000000 --- a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx +++ /dev/null @@ -1,963 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_EditHypothesesDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_EditHypothesesDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_GEOMGenUtils.h" -#include "SMESHGUI_HypothesesUtils.h" - -#include "SMESH_TypeFilter.hxx" -#include "SMESH_NumberFilter.hxx" - -#include "SALOME_ListIO.hxx" -#include "SALOME_ListIteratorOfListIO.hxx" - -#include "SALOMEDSClient_Study.hxx" -#include "SALOMEDSClient_AttributeIOR.hxx" -#include "SALOMEDSClient_AttributeName.hxx" - -#include "SUIT_Session.h" -#include "SUIT_OverrideCursor.h" -#include "SUIT_Operation.h" -#include "SUIT_Desktop.h" - -#include "utilities.h" - -#include "SVTK_ViewModel.h" - -// QT Includes -#include -#include -#include -#include -#include -#include - -using namespace std; - -//VRV: porting on Qt 3.0.5 -#if QT_VERSION >= 0x030005 -#include -#endif -//VRV: porting on Qt 3.0.5 - -class ListBoxIOR : public QListBoxText -{ -public: - enum { RTTI_IOR = 1000 }; - -public: - ListBoxIOR (QListBox* listbox, - const char* ior, - const QString& text = QString::null) - : QListBoxText(listbox, text), myIOR(ior) {} - virtual ~ListBoxIOR() {}; - virtual int rtti() const { return RTTI_IOR; } - const char* GetIOR() { return myIOR.c_str(); } - -private: - string myIOR; -}; - -#define ALLOW_CHANGE_SHAPE 0 - -int findItem (QListBox* listBox, const string& ior) -{ - for (int i = 0; i < listBox->count(); i++) { - if (listBox->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(listBox->item(i)); - if (anItem && ior == string(anItem->GetIOR())) - return i; - } - } - return -1; -} - -//================================================================================= -// function : SMESHGUI_EditHypothesesDlg() -// purpose : Constructs a SMESHGUI_EditHypothesesDlg which is a child of 'parent', with the -// name 'name' and widget flags set to 'f'. -// The dialog will by default be modeless, unless you set 'modal' to -// TRUE to construct a modal dialog. -//================================================================================= -SMESHGUI_EditHypothesesDlg::SMESHGUI_EditHypothesesDlg (SMESHGUI* theModule, const char* name, - bool modal, WFlags fl) - : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu | WDestructiveClose), - myImportedMesh(false), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) -{ - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - if (!name) - setName("SMESHGUI_EditHypothesesDlg"); - setCaption(tr("SMESH_EDIT_HYPOTHESES")); - setSizeGripEnabled(TRUE); - QGridLayout* SMESHGUI_EditHypothesesDlgLayout = new QGridLayout(this); - SMESHGUI_EditHypothesesDlgLayout->setSpacing(6); - SMESHGUI_EditHypothesesDlgLayout->setMargin(11); - - /***************************************************************/ - GroupC1 = new QGroupBox(tr("SMESH_ARGUMENTS"), this, "GroupC1"); - GroupC1->setColumnLayout(0, Qt::Vertical); - GroupC1->layout()->setSpacing(0); - GroupC1->layout()->setMargin(0); - QGridLayout* GroupC1Layout = new QGridLayout(GroupC1->layout()); - GroupC1Layout->setAlignment(Qt::AlignTop); - GroupC1Layout->setSpacing(6); - GroupC1Layout->setMargin(11); - - TextLabelC1A1 = new QLabel(tr("SMESH_OBJECT_MESHorSUBMESH"), GroupC1, "TextLabelC1A1"); - GroupC1Layout->addWidget(TextLabelC1A1, 0, 0); - SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1"); - SelectButtonC1A1->setPixmap(image0); - GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1); - LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1"); - LineEditC1A1->setReadOnly(true); - GroupC1Layout->addWidget(LineEditC1A1, 0, 2); - - TextLabelC1A2 = new QLabel(tr("SMESH_OBJECT_GEOM"), GroupC1, "TextLabelC1A2"); - GroupC1Layout->addWidget(TextLabelC1A2, 1, 0); - SelectButtonC1A2 = new QPushButton(GroupC1, "SelectButtonC1A2"); - SelectButtonC1A2->setPixmap(image0); - SelectButtonC1A2->setToggleButton(FALSE); - GroupC1Layout->addWidget(SelectButtonC1A2, 1, 1); - LineEditC1A2 = new QLineEdit(GroupC1, "LineEditC1A2"); - LineEditC1A2->setReadOnly(true); - GroupC1Layout->addWidget(LineEditC1A2, 1, 2); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupC1, 0, 0); - - /***************************************************************/ - GroupHypotheses = new QGroupBox(tr("SMESH_HYPOTHESES"), this, "GroupHypotheses"); - GroupHypotheses->setColumnLayout(0, Qt::Vertical); - GroupHypotheses->layout()->setSpacing(0); - GroupHypotheses->layout()->setMargin(0); - QGridLayout* grid_3 = new QGridLayout(GroupHypotheses->layout()); - grid_3->setAlignment(Qt::AlignTop); - grid_3->setSpacing(6); - grid_3->setMargin(11); - - TextHypDefinition = new QLabel(tr("SMESH_AVAILABLE"), GroupHypotheses, "TextHypDefinition"); - grid_3->addWidget(TextHypDefinition, 0, 0); - - ListHypDefinition = new QListBox(GroupHypotheses, "ListHypDefinition"); - ListHypDefinition->setMinimumSize(100, 100); - grid_3->addWidget(ListHypDefinition, 1, 0); - - TextHypAssignation = new QLabel(tr("SMESH_EDIT_USED"), GroupHypotheses, "TextHypAssignation"); - grid_3->addWidget(TextHypAssignation, 0, 1); - - ListHypAssignation = new QListBox(GroupHypotheses, "ListHypAssignation"); - ListHypAssignation->setMinimumSize(100, 100); - grid_3->addWidget(ListHypAssignation, 1, 1); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupHypotheses, 1, 0); - - /***************************************************************/ - GroupAlgorithms = new QGroupBox(tr("SMESH_ADD_ALGORITHM"), this, "GroupAlgorithms"); - GroupAlgorithms->setColumnLayout(0, Qt::Vertical); - GroupAlgorithms->layout()->setSpacing(0); - GroupAlgorithms->layout()->setMargin(0); - QGridLayout* grid_4 = new QGridLayout(GroupAlgorithms->layout()); - grid_4->setAlignment(Qt::AlignTop); - grid_4->setSpacing(6); - grid_4->setMargin(11); - - TextAlgoDefinition = new QLabel(tr("SMESH_AVAILABLE"), GroupAlgorithms, "TextAlgoDefinition"); - grid_4->addWidget(TextAlgoDefinition, 0, 0); - - ListAlgoDefinition = new QListBox(GroupAlgorithms, "ListAlgoDefinition"); - ListAlgoDefinition->setMinimumSize(100, 100); - grid_4->addWidget(ListAlgoDefinition, 1, 0); - - TextAlgoAssignation = new QLabel(tr("SMESH_EDIT_USED"), GroupAlgorithms, "TextAlgoAssignation"); - grid_4->addWidget(TextAlgoAssignation, 0, 1); - - ListAlgoAssignation = new QListBox(GroupAlgorithms, "ListAlgoAssignation"); - ListAlgoAssignation ->setMinimumSize(100, 100); - grid_4->addWidget(ListAlgoAssignation, 1, 1); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupAlgorithms, 2, 0); - - /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - - buttonOk = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons, "buttonOk"); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(FALSE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - - buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons, "buttonApply"); - buttonApply->setAutoDefault(TRUE); - buttonApply->setDefault(FALSE); - GroupButtonsLayout->addWidget(buttonApply, 0, 1); - - GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2); - - buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons, "buttonCancel"); - buttonCancel->setAutoDefault(TRUE); - buttonCancel->setDefault(TRUE); - buttonCancel->setEnabled(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - - SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupButtons, 4, 0); - - /***************************************************************/ - Init(); -} - -//================================================================================= -// function : ~SMESHGUI_EditHypothesesDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_EditHypothesesDlg::~SMESHGUI_EditHypothesesDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::Init() -{ - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - - InitHypDefinition(); - InitAlgoDefinition(); - - //myGeomFilter = new SALOME_TypeFilter ("GEOM"); - TColStd_MapOfInteger allTypesMap; - for (int i = 0; i < 10; i++) - allTypesMap.Add(i); - myGeomFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, 0, allTypesMap); - myMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); - - myGeomShape = GEOM::GEOM_Object::_nil(); - myMesh = SMESH::SMESH_Mesh::_nil(); - mySubMesh = SMESH::SMESH_subMesh::_nil(); - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - - connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(SelectButtonC1A2, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - - connect(ListHypAssignation, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(removeItem(QListBoxItem*))); - connect(ListAlgoAssignation, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(removeItem(QListBoxItem*))); - - connect(ListHypDefinition, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(addItem(QListBoxItem*))); - connect(ListAlgoDefinition, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(addItem(QListBoxItem*))); - - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); - - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - mySelectionMgr->clearFilters(); - mySelectionMgr->installFilter(myMeshOrSubMeshFilter); - - SelectionIntoArgument(); - - UpdateControlState(); -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::ClickOnOk() -{ - if (ClickOnApply()) - ClickOnCancel(); -} - -//================================================================================= -// function : ClickOnApply() -// purpose : -//================================================================================= -bool SMESHGUI_EditHypothesesDlg::ClickOnApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return false; - - bool aRes = false; - - SUIT_OverrideCursor wc; - - SUIT_Operation* op = new SUIT_Operation - (SUIT_Session::session()->activeApplication()); - - // start transaction - op->start(); - - if (!myMesh->_is_nil()) - aRes = StoreMesh(); - else if (!mySubMesh->_is_nil()) - aRes = StoreSubMesh(); - - if (true/*aRes*/) { // abort desynchronizes contents of a Study and a mesh on server - // commit transaction - op->commit(); - InitHypAssignation(); - InitAlgoAssignation(); - } else { - // abort transaction - op->abort(); - } - - UpdateControlState(); - mySMESHGUI->updateObjBrowser(); - - return aRes; -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::ClickOnCancel() -{ - close(); -} - -//================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case -//================================================================================= -void SMESHGUI_EditHypothesesDlg::SelectionIntoArgument() -{ - QString aString = ""; - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); - - int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString); - - if (myEditCurrentArgument == LineEditC1A1) { - if (nbSel != 1) { - myMesh = SMESH::SMESH_Mesh::_nil(); - mySubMesh = SMESH::SMESH_subMesh::_nil(); - aString = ""; - } else { - Handle(SALOME_InteractiveObject) IO = aList.First(); - myMesh = SMESH::IObjectToInterface(IO); - if (myMesh->_is_nil()) { - mySubMesh = SMESH::IObjectToInterface(IO); - if (mySubMesh->_is_nil()) { - aString = ""; - } - } - } - myEditCurrentArgument->setText(aString); - - // InitGeom() will try to retrieve a shape from myMesh or mySubMesh - myGeomShape = GEOM::GEOM_Object::_nil(); - InitGeom(); - - myImportedMesh = myGeomShape->_is_nil(); - - InitHypAssignation(); - InitAlgoAssignation(); - - } else if (myEditCurrentArgument == LineEditC1A2) { - if (nbSel != 1) { - myGeomShape = GEOM::GEOM_Object::_nil(); - } else { - Handle(SALOME_InteractiveObject) IO = aList.First(); - myGeomShape = SMESH::IObjectToInterface(IO); - } - InitGeom(); - } - - UpdateControlState(); -} - -//================================================================================= -// function : SetEditCurrentArgument() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::SetEditCurrentArgument() -{ - QPushButton* send = (QPushButton*)sender(); - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - mySelectionMgr->clearFilters(); - mySelectionMgr->installFilter(myMeshOrSubMeshFilter); - } else if (send == SelectButtonC1A2) { - LineEditC1A2->setFocus(); - myEditCurrentArgument = LineEditC1A2; - mySelectionMgr->clearFilters(); - mySelectionMgr->installFilter(myGeomFilter); - } - SelectionIntoArgument(); -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::DeactivateActiveDialog() -{ - if (GroupC1->isEnabled()) { - disconnect(mySelectionMgr, 0, this, 0); - GroupC1->setEnabled(false); - GroupButtons->setEnabled(false); - } -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::ActivateThisDialog() -{ - mySMESHGUI->EmitSignalDeactivateDialog(); - GroupC1->setEnabled(true); - GroupButtons->setEnabled(true); - connect (mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); -} - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::enterEvent (QEvent*) -{ - if (!GroupC1->isEnabled()) - ActivateThisDialog(); -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::closeEvent (QCloseEvent* e) -{ - disconnect(mySelectionMgr, 0, this, 0); - mySMESHGUI->ResetState(); - mySelectionMgr->clearFilters(); - QDialog::closeEvent(e); -} - -//======================================================================= -// function : IsOld() -// purpose : -//======================================================================= -bool SMESHGUI_EditHypothesesDlg::IsOld (QListBoxItem* hypItem) -{ - if (hypItem->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* hyp = (ListBoxIOR*) hypItem; - return (myMapOldHypos.find(hyp->GetIOR()) != myMapOldHypos.end() || - myMapOldAlgos.find(hyp->GetIOR()) != myMapOldAlgos.end()); - } - - return false; -} - -//================================================================================= -// function : removeItem() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::removeItem (QListBoxItem* item) -{ - const QObject* aSender = sender(); - - if (!item) return; - - if (aSender == ListHypAssignation) { - myNbModification += IsOld(item) ? 1 : -1; - ListHypAssignation->removeItem(ListHypAssignation->index(item)); - } - else if (aSender == ListAlgoAssignation) { - myNbModification += IsOld(item) ? 1 : -1; - ListAlgoAssignation->removeItem(ListAlgoAssignation->index(item)); - } - - UpdateControlState(); -} - -//================================================================================= -// function : addItem() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::addItem (QListBoxItem* item) -{ - const QObject* aSender = sender(); - - if (!item) return; - - ListBoxIOR* i = 0; - if (item->rtti() == ListBoxIOR::RTTI_IOR) - i = (ListBoxIOR*)item; - if (!i) return; - - bool isFound = false; - - ListBoxIOR* anItem; - if (aSender == ListHypDefinition) { - for (int j = 0, n = ListHypAssignation->count(); !isFound && j < n; j++) { - if (ListHypAssignation->item(j)->rtti() == ListBoxIOR::RTTI_IOR) { - anItem = (ListBoxIOR*)ListHypAssignation->item(j); - isFound = !strcmp(anItem->GetIOR(), i->GetIOR()); - } - } - if (!isFound) - anItem = new ListBoxIOR (ListHypAssignation, - CORBA::string_dup(i->GetIOR()), - CORBA::string_dup(i->text().latin1())); - - } else if (aSender == ListAlgoDefinition) { - for (int j = 0, n = ListAlgoAssignation->count(); !isFound && j < n; j++) { - if (ListAlgoAssignation->item(j)->rtti() == ListBoxIOR::RTTI_IOR) { - anItem = (ListBoxIOR*)ListAlgoAssignation->item(j); - isFound = !strcmp(anItem->GetIOR(), i->GetIOR()); - } - } - if (!isFound) - anItem = new ListBoxIOR (ListAlgoAssignation, - CORBA::string_dup(i->GetIOR()), - CORBA::string_dup(i->text().latin1())); - } else { - } - - if (!isFound) - myNbModification += IsOld(item) ? -1 : 1; - - UpdateControlState(); -} - -//================================================================================= -// function : InitHypDefinition() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitHypDefinition() -{ - ListHypDefinition->clear(); - - _PTR(SComponent) father = SMESH::GetActiveStudyDocument()->FindComponent("SMESH"); - if (!father) - return; - - _PTR(SObject) HypothesisRoot; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - //int Tag_HypothesisRoot = 1; - if (father->FindSubObject(1, HypothesisRoot)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(HypothesisRoot); - ListBoxIOR* anItem; - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (Obj->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - anItem = new ListBoxIOR (ListHypDefinition, - anIOR->Value().c_str(), - aName->Value().c_str()); - } - } - } - } -} - -//================================================================================= -// function : InitHypAssignation() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitHypAssignation() -{ - myNbModification = 0; - - myMapOldHypos.clear(); - ListHypAssignation->clear(); - if (myImportedMesh) - return; - - _PTR(SObject) aMorSM, AHR, aRef; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - if (!myMesh->_is_nil()) - aMorSM = SMESH::FindSObject(myMesh); - else if (!mySubMesh->_is_nil()) - aMorSM = SMESH::FindSObject(mySubMesh); - - if (aMorSM && aMorSM->FindSubObject(2, AHR)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->ReferencedObject(aRef)) { - if (aRef->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (aRef->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - ListBoxIOR* anItem = new ListBoxIOR (ListHypAssignation, - anIOR->Value().c_str(), - aName->Value().c_str()); - myMapOldHypos[ anIOR->Value() ] = ListHypAssignation->index(anItem); - } - } - } - } - } -} - -//================================================================================= -// function : InitAlgoDefinition() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitAlgoDefinition() -{ - ListAlgoDefinition->clear(); - - _PTR(SComponent) father = SMESH::GetActiveStudyDocument()->FindComponent("SMESH"); - if (!father) - return; - - _PTR(SObject) AlgorithmsRoot; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - if (father->FindSubObject (2, AlgorithmsRoot)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(AlgorithmsRoot); - ListBoxIOR* anItem; - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (Obj->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - anItem = new ListBoxIOR (ListAlgoDefinition, - anIOR->Value().c_str(), - aName->Value().c_str()); - } - } - } - } -} - -//================================================================================= -// function : InitAlgoAssignation() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitAlgoAssignation() -{ - myMapOldAlgos.clear(); - ListAlgoAssignation->clear(); - if (myImportedMesh) - return; - - _PTR(SObject) aMorSM, AHR, aRef; - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - _PTR(AttributeIOR) anIOR; - - if (!myMesh->_is_nil()) - aMorSM = SMESH::FindSObject(myMesh); - else if (!mySubMesh->_is_nil()) - aMorSM = SMESH::FindSObject(mySubMesh); - - if (aMorSM && aMorSM->FindSubObject(3, AHR)) { - _PTR(ChildIterator) it = - SMESH::GetActiveStudyDocument()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - _PTR(SObject) Obj = it->Value(); - if (Obj->ReferencedObject(aRef)) { - if (aRef->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - if (aRef->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = anAttr; - ListBoxIOR* anItem = new ListBoxIOR (ListAlgoAssignation, - anIOR->Value().c_str(), - aName->Value().c_str()); - myMapOldAlgos[ anIOR->Value() ] = ListAlgoAssignation->index(anItem); - } - } - } - } - } -} - -//================================================================================= -// function : InitGeom() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::InitGeom() -{ - LineEditC1A2->setText(""); - - if (myGeomShape->_is_nil() && !myMesh->_is_nil()) { - _PTR(SObject) aMesh = SMESH::FindSObject(myMesh); - if (aMesh) - myGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMesh); - } - if (myGeomShape->_is_nil() && !mySubMesh->_is_nil()) { - _PTR(SObject) aSubMesh = SMESH::FindSObject(mySubMesh); - if (aSubMesh) - myGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aSubMesh); - } - - _PTR(GenericAttribute) anAttr; - _PTR(AttributeName) aName; - if (!myGeomShape->_is_nil() && (!myMesh->_is_nil() || !mySubMesh->_is_nil())) { - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - //_PTR(SObject) aSO = aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(myGeomShape)); - _PTR(SObject) aSO = aStudy->FindObjectID(myGeomShape->GetStudyEntry()); - if (aSO) { - if (aSO->FindAttribute(anAttr, "AttributeName")) { - aName = anAttr; - LineEditC1A2->setText(QString(aName->Value().c_str())); - } - } - } -} - -//================================================================================= -// function : UpdateControlState() -// purpose : -//================================================================================= -void SMESHGUI_EditHypothesesDlg::UpdateControlState() -{ - // asl the check of "count" is commented because of PAL9787 - bool isEnabled = (!myMesh->_is_nil() && !myGeomShape->_is_nil() /*&& - ListHypAssignation->count() && ListAlgoAssignation->count()*/ ) - || - (!mySubMesh->_is_nil() && !myGeomShape->_is_nil() /*&& - (ListHypAssignation->count() || ListAlgoAssignation->count())*/); - - buttonOk ->setEnabled(myNbModification && isEnabled && !myImportedMesh); - buttonApply->setEnabled(myNbModification && isEnabled && !myImportedMesh); - - SelectButtonC1A2 ->setEnabled(ALLOW_CHANGE_SHAPE && !myImportedMesh); - LineEditC1A2 ->setEnabled(ALLOW_CHANGE_SHAPE && !myImportedMesh); - ListHypDefinition ->setEnabled(!myImportedMesh); - ListHypAssignation ->setEnabled(!myImportedMesh); - ListAlgoDefinition ->setEnabled(!myImportedMesh); - ListAlgoAssignation->setEnabled(!myImportedMesh); -} - -//================================================================================= -// function : StoreMesh() -// purpose : -//================================================================================= -bool SMESHGUI_EditHypothesesDlg::StoreMesh() -{ - MapIOR anOldHypos, aNewHypos; - if (myGeomShape->_is_nil()) - return false; - - // 1. Check whether the geometric shape has changed - _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh); - GEOM::GEOM_Object_var aIniGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMeshSO); - bool bShapeChanged = aIniGeomShape->_is_nil() || - !aIniGeomShape->_is_equivalent(myGeomShape); - if (bShapeChanged) { - // VSR : TODO : Set new shape - not supported yet by SMESH engine - // 1. remove all old hypotheses and algorithms and also submeshes - // 2. set new shape - } - - int nbFail = 0; - MapIOR::iterator it; - - // 2. remove not used hypotheses from the mesh - for (it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it) { - string ior = it->first; - int index = findItem(ListHypAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aMeshSO, aHyp)) - nbFail++; - } - } - } - - // 3. remove not used algorithms from the mesh - for (it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it) { - string ior = it->first; - int index = findItem(ListAlgoAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aMeshSO, aHyp)) - nbFail++; - } - } - } - - // 4. Add new algorithms - for (int i = 0; i < ListAlgoAssignation->count(); i++) { - if (ListAlgoAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListAlgoAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldAlgos.find(ior) == myMapOldAlgos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::AddHypothesisOnMesh(myMesh, aHyp)) - nbFail++; - } - } - } - } - } - - // 5. Add new hypotheses - for (int i = 0; i < ListHypAssignation->count(); i++) { - if (ListHypAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListHypAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldHypos.find(ior) == myMapOldHypos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = - SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::AddHypothesisOnMesh(myMesh, aHyp)) - nbFail++; - } - } - } - } - } - return (nbFail == 0); -} - -//================================================================================= -// function : StoreSubMesh() -// purpose : -//================================================================================= -bool SMESHGUI_EditHypothesesDlg::StoreSubMesh() -{ - MapIOR anOldHypos, aNewHypos; - if (myGeomShape->_is_nil()) - return false; - - // 1. Check whether the geometric shape has changed - _PTR(SObject) aSubMeshSO = SMESH::FindSObject(mySubMesh); - GEOM::GEOM_Object_var aIniGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aSubMeshSO); - bool bShapeChanged = aIniGeomShape->_is_nil() || !aIniGeomShape->_is_equivalent(myGeomShape); - if (bShapeChanged) { - // VSR : TODO : Set new shape - not supported yet by engine - // 1. remove all old hypotheses and algorithms - // 2. set new shape - } - int nbFail = 0; - MapIOR::iterator it; - - // 2. remove not used hypotheses from the submesh - for (it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it) { - string ior = it->first; - int index = findItem(ListHypAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()) { - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aSubMeshSO, aHyp)) - nbFail++; - } - } - } - - // 3. remove not used algorithms from the submesh - for (it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it) { - string ior = it->first; - int index = findItem(ListAlgoAssignation, ior); - if (index < 0) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()){ - if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aSubMeshSO, aHyp)) - nbFail++; - } - } - } - - // 4. Add new algorithms - for (int i = 0; i < ListAlgoAssignation->count(); i++) { - if (ListAlgoAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListAlgoAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldAlgos.find(ior) == myMapOldAlgos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()){ - if (!SMESH::AddHypothesisOnSubMesh(mySubMesh, aHyp)) - nbFail++; - } - } - } - } - } - - // 5. Add new hypotheses - for (int i = 0; i < ListHypAssignation->count(); i++) { - if (ListHypAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) { - ListBoxIOR* anItem = (ListBoxIOR*)(ListHypAssignation->item(i)); - if (anItem) { - string ior = anItem->GetIOR(); - if (myMapOldHypos.find(ior) == myMapOldHypos.end()) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface(ior.c_str()); - if (!aHyp->_is_nil()){ - if (!SMESH::AddHypothesisOnSubMesh(mySubMesh, aHyp)) - nbFail++; - } - } - } - } - } - return (nbFail == 0); -} diff --git a/src/SMESHGUI/SMESHGUI_Filter.cxx b/src/SMESHGUI/SMESHGUI_Filter.cxx deleted file mode 100755 index 19b3fcb1a..000000000 --- a/src/SMESHGUI/SMESHGUI_Filter.cxx +++ /dev/null @@ -1,497 +0,0 @@ -// SMESHGUI_PredicateFilter : Filters for VTK viewer -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Filter.cxx -// Author : Sergey LITONIN -// Module : SMESH - -#include "SMESHGUI_Filter.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" - -#include "SMESH_Actor.h" -#include "SMDS_Mesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDSAbs_ElementType.hxx" - -// OCCT Includes -#include -#include - -// VTK Includes -#include - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_Filter, VTKViewer_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_PredicateFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_TriangleFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_FacesFilter, SMESHGUI_Filter) - -IMPLEMENT_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter) -IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_VolumesFilter, SMESHGUI_Filter) - -/* - Class : SMESHGUI_PredicateFilter - Description : Selection filter for VTK viewer. This class aggregate object - of SMESH_Predicate class and uses it for verification of criterion -*/ - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter() -{ -} - -SMESHGUI_PredicateFilter::~SMESHGUI_PredicateFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::IsValid -// Purpose : Verify whether entry id satisfies to criterion of the filter -//======================================================================= -bool SMESHGUI_PredicateFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 || myPred->_is_nil() ) - return false; - - SMESH_Actor* anActor = dynamic_cast( myActor ); - if ( !anActor || anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - SMESH::ElementType anElemType = myPred->GetElementType(); - int aMeshId = anElemType == SMESH::NODE ? anActor->GetNodeObjId( theCellId ) - : anActor->GetElemObjId( theCellId ); - - // if type of element != type of predicate return true because - // this predicate is not intended for filtering sush elements - const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( aMeshId ) - : aMesh->FindElement( aMeshId ); - if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() ) - return true; - - return myPred->IsSatisfy( aMeshId ); -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::IsValid -// Purpose : Verify whether entry id satisfies to criterion of the filter -//======================================================================= -bool SMESHGUI_PredicateFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 || myPred->_is_nil() ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - SMESH::ElementType anElemType = myPred->GetElementType(); - - // if type of element != type of predicate return true because - // this predicate is not intended for filtering sush elements - const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( theObjId ) - : aMesh->FindElement( theObjId ); - if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() ) - return true; - - return myPred->IsSatisfy( theObjId ); -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_PredicateFilter::IsNodeFilter() const -{ - return GetId() == SMESHGUI_NodeFilter; -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SetPredicate -// Purpose : Set new pridicate to the filter -//======================================================================= -void SMESHGUI_PredicateFilter::SetPredicate( SMESH::Predicate_ptr thePred ) -{ - myPred = SMESH::Predicate::_duplicate( thePred ); -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SetActor -// Purpose : Set new actor -//======================================================================= -void SMESHGUI_PredicateFilter::SetActor( SALOME_Actor* theActor ) -{ - if ( myActor == theActor ) - return; - SMESHGUI_Filter::SetActor( theActor ); - - if ( myActor != 0 && !myPred->_is_nil() ) - { - SALOME_Actor* sActor = dynamic_cast( myActor ); - Handle(SALOME_InteractiveObject) anIO; - if( sActor ) - anIO = sActor->getIO(); - if ( !anIO.IsNull() ) - { - SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface(anIO); - if(!aMesh->_is_nil()) - myPred->SetMesh(aMesh); - } - } -} - -//======================================================================= -// name : SMESHGUI_PredicateFilter::SetActor -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_PredicateFilter::GetId() const -{ - if ( myPred->GetElementType() == SMESH::NODE ) return SMESHGUI_NodeFilter; - else if ( myPred->GetElementType() == SMESH::EDGE ) return SMESHGUI_EdgeFilter; - else if ( myPred->GetElementType() == SMESH::FACE ) return SMESHGUI_FaceFilter; - else if ( myPred->GetElementType() == SMESH::VOLUME ) return SMESHGUI_VolumeFilter; - else if ( myPred->GetElementType() == SMESH::ALL ) return SMESHGUI_AllElementsFilter; - else return SMESHGUI_UnknownFilter; -} - - -/* - Class : SMESHGUI_QuadrangleFilter - Description : Verify whether selected cell is quadranle -*/ - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_QuadrangleFilter::~SMESHGUI_QuadrangleFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::IsValid -// Purpose : Verify whether selected cell is quadranle -//======================================================================= -bool SMESHGUI_QuadrangleFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4; -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::IsValid -// Purpose : Verify whether selected cell is quadranle -//======================================================================= -bool SMESHGUI_QuadrangleFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4; -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::SetActor -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_QuadrangleFilter::GetId() const -{ - return SMESHGUI_QuadFilter; -} - -//======================================================================= -// name : SMESHGUI_QuadrangleFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_QuadrangleFilter::IsNodeFilter() const -{ - return false; -} - - -/* - Class : SMESHGUI_TriangleFilter - Description : Verify whether selected cell is triangle -*/ - - -//======================================================================= -// name : SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_TriangleFilter::~SMESHGUI_TriangleFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::IsValid -// Purpose : Verify whether selected cell is triangle -//======================================================================= -bool SMESHGUI_TriangleFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3; -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::IsValid -// Purpose : Verify whether selected cell is triangle -//======================================================================= -bool SMESHGUI_TriangleFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3; -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::SetActor -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_TriangleFilter::GetId() const -{ - return SMESHGUI_TriaFilter; -} - -//======================================================================= -// name : SMESHGUI_TriangleFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_TriangleFilter::IsNodeFilter() const -{ - return false; -} - -/* - Class : SMESHGUI_FacesFilter - Description : Verify whether selected cell is any face -*/ - - -//======================================================================= -// name : SMESHGUI_FacesFilter::SMESHGUI_FacesFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_FacesFilter::SMESHGUI_FacesFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_FacesFilter::~SMESHGUI_FacesFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::IsValid -// Purpose : Verify whether selected cell is face -//======================================================================= -bool SMESHGUI_FacesFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Face; -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::IsValid -// Purpose : Verify whether selected cell is face -//======================================================================= -bool SMESHGUI_FacesFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Face; -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::GetId -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_FacesFilter::GetId() const -{ - return SMESHGUI_FaceFilter; -} - -//======================================================================= -// name : SMESHGUI_FacesFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_FacesFilter::IsNodeFilter() const -{ - return false; -} - - -/* - Class : SMESHGUI_VolumesFilter - Description : Verify whether selected cell is any volume -*/ - - -//======================================================================= -// name : SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter -// Purpose : Constructor -//======================================================================= -SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter() -: SMESHGUI_Filter() -{ -} - -SMESHGUI_VolumesFilter::~SMESHGUI_VolumesFilter() -{ -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::IsValid -// Purpose : Verify whether selected cell is volume -//======================================================================= -bool SMESHGUI_VolumesFilter::IsValid( const int theCellId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) ); - - return anElem && anElem->GetType() == SMDSAbs_Volume; -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::IsValid -// Purpose : Verify whether selected cell is volume -//======================================================================= -bool SMESHGUI_VolumesFilter::IsObjValid( const int theObjId ) const -{ - if ( myActor == 0 ) - return false; - - SMESH_Actor* anActor = ( SMESH_Actor* )myActor; - if ( anActor->GetObject() == 0 ) - return false; - - SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh(); - const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId ); - - return anElem && anElem->GetType() == SMDSAbs_Volume; -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::GetId -// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType -// enumeration. All filters must have different ids -//======================================================================= -int SMESHGUI_VolumesFilter::GetId() const -{ - return SMESHGUI_VolumeFilter; -} - -//======================================================================= -// name : SMESHGUI_VolumesFilter::IsNodeFilter -// Purpose : Returns true if filter is intended for nodes -//======================================================================= -bool SMESHGUI_VolumesFilter::IsNodeFilter() const -{ - return false; -} diff --git a/src/SMESHGUI/SMESHGUI_Filter.h b/src/SMESHGUI/SMESHGUI_Filter.h deleted file mode 100755 index 0114f38b8..000000000 --- a/src/SMESHGUI/SMESHGUI_Filter.h +++ /dev/null @@ -1,191 +0,0 @@ -// SMESHGUI_Filter : Filters for VTK viewer -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Filter.h -// Author : Sergey LITONIN -// Module : SMESH - -#ifndef SMESHGUI_Filter_HeaderFile -#define SMESHGUI_Filter_HeaderFile - -#include "VTKViewer_Filter.h" - -#include -#include CORBA_SERVER_HEADER(SMESH_Filter) - -class SALOME_Actor; - -enum SMESHGUI_FilterType -{ - SMESHGUI_UnknownFilter = -1, - SMESHGUI_NodeFilter = 0, - SMESHGUI_EdgeFilter = 1, - SMESHGUI_FaceFilter = 2, - SMESHGUI_VolumeFilter = 3, - SMESHGUI_AllElementsFilter = 4, - SMESHGUI_QuadFilter = 5, - SMESHGUI_TriaFilter = 6, - SMESHGUI_LastFilter -}; - -/* - Class : SMESHGUI_Filter - Description : Base class for SMESH selection filters for VTK viewer. -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter) - -class SMESHGUI_Filter : public VTKViewer_Filter -{ - -public: - - virtual bool IsObjValid( const int theObjId ) const = 0; -public: - DEFINE_STANDARD_RTTI(SMESHGUI_Filter) -}; - -/* - Class : SMESHGUI_PredicateFilter - Description : Selection filter for VTK viewer. This class aggregate object - of SMESH_Predicate class and uses it for verification of criterion -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter) - -class SMESHGUI_PredicateFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_PredicateFilter(); - virtual ~SMESHGUI_PredicateFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - void SetPredicate( SMESH::Predicate_ptr ); - - void SetActor( SALOME_Actor* ); - -private: - - SMESH::Predicate_var myPred; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_PredicateFilter) -}; - -/* - Class : SMESHGUI_QuadrangleFilter - Description : Verify whether selected cell is quadranle -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter) - -class SMESHGUI_QuadrangleFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_QuadrangleFilter(); - virtual ~SMESHGUI_QuadrangleFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_QuadrangleFilter) -}; - -/* - Class : SMESHGUI_TriangleFilter - Description : Verify whether selected cell is triangle -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter) - -class SMESHGUI_TriangleFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_TriangleFilter(); - virtual ~SMESHGUI_TriangleFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_TriangleFilter) -}; - -/* - Class : SMESHGUI_FacesFilter - Description : Verify whether selected cell is any face -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter) - -class SMESHGUI_FacesFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_FacesFilter(); - virtual ~SMESHGUI_FacesFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_FacesFilter) -}; - -/* - Class : SMESHGUI_VolumesFilter - Description : Verify whether selected cell is any volume -*/ - -DEFINE_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter) - -class SMESHGUI_VolumesFilter : public SMESHGUI_Filter -{ - -public: - SMESHGUI_VolumesFilter(); - virtual ~SMESHGUI_VolumesFilter(); - - virtual bool IsValid( const int theCellId ) const; - virtual bool IsObjValid( const int theObjId ) const; - virtual int GetId() const; - virtual bool IsNodeFilter() const; - -public: - DEFINE_STANDARD_RTTI(SMESHGUI_VolumesFilter) -}; - -#endif diff --git a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx deleted file mode 100644 index a6e560ffa..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx +++ /dev/null @@ -1,1133 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_FilterLibraryDlg.cxx -// Author : Sergey LITONIN -// Module : SMESH - -#include "SMESHGUI_FilterLibraryDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_FilterUtils.h" - -#include "SUIT_Session.h" -#include "SUIT_Desktop.h" -#include "SUIT_FileDlg.h" - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define SPACING 5 -#define MARGIN 10 - -/*! - * Class : SMESHGUI_FilterLibraryDlg::Dialog - * Description : Dialog for opening filter library - */ - -class SMESHGUI_FilterLibraryDlg::Dialog : public SUIT_FileDlg -{ - public: - Dialog(QWidget* theParent, const bool theToOpen); - virtual ~Dialog(); - - protected: - virtual bool acceptData(); -}; - -SMESHGUI_FilterLibraryDlg::Dialog::Dialog (QWidget* theParent, - const bool theToOpen) - : SUIT_FileDlg(theParent, theToOpen) -{ -} - -SMESHGUI_FilterLibraryDlg::Dialog::~Dialog() -{ -} - -bool SMESHGUI_FilterLibraryDlg::Dialog::acceptData() -{ -// if (mode() != QFileDialogP::AnyFile) -// return SUIT_FileDlg::acceptData(); - - return true; -} - -/*! - * Class : SMESHGUI_FilterLibraryDlg - * Description : Dialog to specify filters for VTK viewer - */ - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg -// Purpose : Constructor -//======================================================================= -SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule, - QWidget* parent, - const QValueList& theTypes, - const int theMode, - const char* theName) - : QDialog( parent, theName, true, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - construct(theTypes, theMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg -// Purpose : Constructor -//======================================================================= -SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule, - QWidget* parent, - const int theType, - const int theMode, - const char* theName) - : QDialog( parent, theName, true, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - QValueList aTypes; - aTypes.append(theType); - construct(aTypes, theMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::construct -// Purpose : Construct dialog (called by constructor) -//======================================================================= -void SMESHGUI_FilterLibraryDlg::construct (const QValueList& theTypes, - const int theMode) -{ - myTypes = theTypes; - myMode = theMode; - - QVBoxLayout* aDlgLay = new QVBoxLayout(this, MARGIN, SPACING); - - myMainFrame = createMainFrame (this); - QFrame* aBtnFrame = createButtonFrame(this); - - aDlgLay->addWidget(myMainFrame); - aDlgLay->addWidget(aBtnFrame); - - aDlgLay->setStretchFactor(myMainFrame, 1); - - Init(myTypes, myMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::createMainFrame -// Purpose : Create frame containing dialog's input fields -//======================================================================= -QFrame* SMESHGUI_FilterLibraryDlg::createMainFrame (QWidget* theParent) -{ - QGroupBox* aMainFrame = new QGroupBox(1, Qt::Horizontal, theParent); - aMainFrame->setFrameStyle(QFrame::NoFrame); - aMainFrame->setInsideMargin(0); - - // library name - - QGroupBox* aGrp = new QGroupBox(1, Qt::Vertical, aMainFrame); - aGrp->setFrameStyle(QFrame::NoFrame); - aGrp->setInsideMargin(0); - - new QLabel(tr("LIBRARY_FILE"), aGrp); - myFileName = new QLineEdit(aGrp); - myOpenBtn = new QPushButton(aGrp); - myOpenBtn->setPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap( - "SUIT", tr("ICON_FILE_OPEN"))); - - // filters list box - - aGrp = new QGroupBox(1, Qt::Vertical, tr("FILTER_NAMES"), aMainFrame); - QFrame* aFrame = new QFrame(aGrp); - myListBox = new QListBox(aFrame); - myAddBtn = new QPushButton(tr("ADD"), aFrame); - myDeleteBtn = new QPushButton(tr("DELETE"), aFrame); - - QGridLayout* aLay = new QGridLayout(aFrame, 3, 2, 0, 5); - aLay->addMultiCellWidget(myListBox, 0, 2, 0, 0); - aLay->addWidget(myAddBtn, 0, 1); - aLay->addWidget(myDeleteBtn, 1, 1); - QSpacerItem* aVSpacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding); - aLay->addItem(aVSpacer, 2, 1); - - // filter name - - myNameGrp = new QGroupBox(1, Qt::Vertical, aMainFrame); - myNameGrp->setFrameStyle(QFrame::NoFrame); - myNameGrp->setInsideMargin(0); - new QLabel(tr("FILTER_NAME"), myNameGrp); - myName = new QLineEdit(myNameGrp); - - // table - - myTable = new SMESHGUI_FilterTable( mySMESHGUI, aMainFrame, myTypes); - myTable->SetEditable(myMode == EDIT); - myTable->SetLibsEnabled(false); - - myListBox->setMinimumHeight((int)(myTable->sizeHint().height() * 0.5)); - myListBox->setRowMode(QListBox::FitToWidth); - myListBox->setSelectionMode(QListBox::Single); - - myOpenBtn->setAutoDefault(false); - myAddBtn->setAutoDefault(false); - myDeleteBtn->setAutoDefault(false); - - // connect signals and slots - - connect(myFileName, SIGNAL(returnPressed()), this, SLOT(onReturnPressed())); - connect(myOpenBtn , SIGNAL(clicked()), this, SLOT(onBrowse())); - - connect(myListBox, SIGNAL(highlighted(const QString&)), - this, SLOT(onFilterChanged(const QString&))); - - connect(myAddBtn, SIGNAL(clicked()), this, SLOT(onAddBtnPressed())); - connect(myDeleteBtn, SIGNAL(clicked()), this, SLOT(onDeleteBtnPressed())); - - connect(myName, SIGNAL(textChanged(const QString&)), - this, SLOT(onFilterNameChanged(const QString&))); - - connect(myTable, SIGNAL(EntityTypeChanged(const int)), - this, SLOT(onEntityTypeChanged(const int))); - - connect(myTable, SIGNAL(NeedValidation()), this, SLOT(onNeedValidation())); - - return aMainFrame; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::createButtonFrame -// Purpose : Create frame containing buttons -//======================================================================= -QFrame* SMESHGUI_FilterLibraryDlg::createButtonFrame (QWidget* theParent) -{ - QGroupBox* aGrp = new QGroupBox(1, Qt::Vertical, theParent); - - myButtons[ BTN_OK ] = new QPushButton(tr("SMESH_BUT_OK" ), aGrp); - myButtons[ BTN_Apply ] = new QPushButton(tr("SMESH_BUT_APPLY"), aGrp); - - QLabel* aLbl = new QLabel(aGrp); - aLbl->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - - myButtons[ BTN_Cancel ] = new QPushButton(tr("SMESH_BUT_CANCEL"), aGrp); - myButtons[ BTN_Close ] = new QPushButton(tr("SMESH_BUT_CLOSE"), aGrp); - - connect(myButtons[ BTN_OK ], SIGNAL(clicked()), SLOT(onOk())); - connect(myButtons[ BTN_Cancel ], SIGNAL(clicked()), SLOT(onClose())); - connect(myButtons[ BTN_Close ], SIGNAL(clicked()), SLOT(onClose())); - connect(myButtons[ BTN_Apply ], SIGNAL(clicked()), SLOT(onApply())); - - QMap::iterator anIter; - for (anIter = myButtons.begin(); anIter != myButtons.end(); ++anIter) - anIter.data()->setAutoDefault(false); - - updateMainButtons(); - - return aGrp; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::updateMainButtons -// Purpose : Update visibility of main buttons (OK, Cancel, Close ...) -//======================================================================= -void SMESHGUI_FilterLibraryDlg::updateMainButtons() -{ - if (myTypes.count() == 1) { - myButtons[ BTN_Cancel ]->show(); - myButtons[ BTN_Apply ]->hide(); - myButtons[ BTN_Close ]->hide(); - } else { - myButtons[ BTN_Cancel ]->hide(); - myButtons[ BTN_Apply ]->show(); - myButtons[ BTN_Close ]->show(); - } -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg -// Purpose : Destructor -//======================================================================= -SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg() -{ -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::Init -// Purpose : Init dialog fields, connect signals and slots, show dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::Init (const int type, const int theMode) -{ - QValueList aTypes; - aTypes.append(type); - Init(aTypes, theMode); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::Init -// Purpose : Init dialog fields, connect signals and slots, show dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::Init (const QValueList& theTypes, - const int theMode) -{ - myMode = theMode; - myTypes = theTypes; - myTable->Init(theTypes); - myCurrFilterName = ""; - myCurrFilter = -1; - myListBox->clear(); - myName->clear(); - myTable->Clear(); - - updateControlsVisibility(); - setEnabled(true); - - connect( mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate())); - connect( mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose())); - - if (myMode == ADD_TO) - { - setCaption(tr("ADD_TO_TLT")); - if (myFileName->text().isEmpty()) - myFileName->setText(getDefaultLibraryName()); - processNewLibrary(); - } - else if (myMode == COPY_FROM) - { - setCaption(tr("COPY_FROM_TLT")); - if (myFileName->text().isEmpty()) - myFileName->setText(getDefaultLibraryName()); - processNewLibrary(); - if (myListBox->count() > 0) - myListBox->setCurrentItem(0); - } - else - { - setCaption(tr("EDIT_LIB_TLT")); - if (myFileName->text().isEmpty()) - myFileName->setText(getDefaultLibraryName()); - processNewLibrary(); - if (myListBox->count() > 0) - myListBox->setCurrentItem(0); - } - - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - - this->show(); - - updateMainButtons(); - isPermissionValid(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::updateControlsVisibility -// Purpose : Update visibility of controls in accordance with myMode -//======================================================================= -void SMESHGUI_FilterLibraryDlg::updateControlsVisibility() -{ - if (myMode == ADD_TO) - { - myNameGrp->show(); - myNameGrp->setEnabled(true); - myAddBtn->hide(); - myDeleteBtn->hide(); - myTable->SetEditable(false); - } - else if (myMode == COPY_FROM) - { - myNameGrp->hide(); - myNameGrp->setEnabled(false); - myAddBtn->hide(); - myDeleteBtn->hide(); - myTable->SetEditable(false); - } - else if (myMode == EDIT) - { - myNameGrp->show(); - myNameGrp->setEnabled(true); - myAddBtn->show(); - myDeleteBtn->show(); - myTable->SetEditable(true); - } - - qApp->processEvents(); - updateGeometry(); - adjustSize(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onApply -// Purpose : SLOT called when "Apply" button pressed. -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::onApply() -{ - if (!isValid(true) || !isPermissionValid(false)) - return false; - - if (myLibrary->_is_nil()) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok); - return false; - } - - const char* aName = myFileName->text().latin1(); - if (strcmp(myLibrary->GetFileName(), aName) != 0) - myLibrary->SetFileName(aName); - - bool aResult = false; - - if (myMode == COPY_FROM || myListBox->count() == 0) { - aResult = true; - } else if (myMode == EDIT || myMode == ADD_TO) { - SMESH::Filter_var aFilter = createFilter(); - if (!myLibrary->Replace(myCurrFilterName, myName->text(), aFilter.in())) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_EDITING"), QMessageBox::Ok); - aResult = false; - } - else - aResult = true; - } - - if (aResult && myMode != COPY_FROM) - aResult = myLibrary->Save(); - - if (aResult) { - char* aFileName = myLibrary->GetFileName(); - getDefaultLibraryName() = QString(aFileName); - delete aFileName; - } else if (myMode != COPY_FROM) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_SAVING"), QMessageBox::Ok); - } else { - } - - return aResult; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onOk -// Purpose : SLOT called when "Ok" button pressed. -// Assign filters VTK viewer and close dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onOk() -{ - if (onApply()) - { - disconnect( mySMESHGUI, 0, this, 0); - mySMESHGUI->ResetState(); - accept(); - } -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onClose -// Purpose : SLOT called when "Close" button pressed. Close dialog -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onClose() -{ - disconnect( mySMESHGUI, 0, this, 0); - mySMESHGUI->ResetState(); - reject(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onDeactivate -// Purpose : SLOT called when dialog must be deativated -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onDeactivate() -{ - setEnabled(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::enterEvent -// Purpose : Event filter -//======================================================================= -void SMESHGUI_FilterLibraryDlg::enterEvent(QEvent*) -{ - setEnabled(true); -} - -//================================================================================= -// function : closeEvent() -// purpose : Close dialog -//================================================================================= -void SMESHGUI_FilterLibraryDlg::closeEvent(QCloseEvent* e) -{ - onClose(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getFileName -// Purpose : Get file name -//======================================================================= -QString SMESHGUI_FilterLibraryDlg::getFileName() const -{ - return myFileName != 0 ? myFileName->text() : QString(""); -} - -//================================================================ -// Function : setFileName -// Purpose : Set file name to line edit -//================================================================ -void SMESHGUI_FilterLibraryDlg::setFileName(const QString& txt, const bool autoExt) -{ - if (myFileName == 0) - return; - myFileName->setText(autoExt ? autoExtension(txt) : txt); -} - -//================================================================ -// Function : autoExtension -// Purpose : Append extension to the file name -//================================================================ -QString SMESHGUI_FilterLibraryDlg::autoExtension(const QString& theFileName) const -{ - QString anExt = theFileName.section('.', -1); - return anExt != "xml" && anExt != "XML" ? theFileName + ".xml" : theFileName; -} - -//================================================================ -// Function : filterWildCards -// Purpose : -//================================================================ -QStringList SMESHGUI_FilterLibraryDlg::filterWildCards(const QString& theFilter) const -{ - QStringList res; - - int b = theFilter.findRev("("); - int e = theFilter.findRev(")"); - if (b != -1 && e != -1) - { - QString content = theFilter.mid(b + 1, e - b - 1).stripWhiteSpace(); - QStringList lst = QStringList::split(" ", content); - for (QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it) - if ((*it).find(".") != -1) - res.append((*it).stripWhiteSpace()); - } - return res; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::prepareFilters -// Purpose : Prepare filters for dialog -//======================================================================= -QStringList SMESHGUI_FilterLibraryDlg::prepareFilters() const -{ - static QStringList aList; - if (aList.isEmpty()) - { - aList.append(tr("XML_FILT")); - //aList.append(tr("ALL_FILES_FILTER")); - } - - return aList; -} - -//================================================================ -// Function : onBrowse -// Purpose : SLOT. Display "Open file" dialog for chosing library name -//================================================================ -void SMESHGUI_FilterLibraryDlg::onBrowse() -{ - Dialog* aDlg = new Dialog(this, true); - aDlg->setCaption(tr("OPEN_LIBRARY")); - - //aDlg->setMode(myMode == COPY_FROM ? QFileDialogP::ExistingFile : QFileDialogP::AnyFile); - aDlg->setMode(myMode == COPY_FROM ? QFileDialog::ExistingFile : QFileDialog::AnyFile); - aDlg->setFilters(prepareFilters()); - aDlg->setSelection(getFileName()); - - QPushButton* anOkBtn = (QPushButton*)aDlg->child("OK", "QPushButton"); - if (anOkBtn != 0) - anOkBtn->setText(tr("SMESH_BUT_OK")); - - if (aDlg->exec() != Accepted) - return; - - QString fName = aDlg->selectedFile(); - - if (fName.isEmpty()) - return; - - if (QFileInfo(fName).extension().isEmpty()) - fName = autoExtension(fName); - - fName = QDir::convertSeparators(fName); - QString prev = QDir::convertSeparators(getFileName()); - - if (prev == fName) - return; - - setFileName(fName); - - QString aName = myListBox->text(myListBox->count() - 1); - processNewLibrary(); - - if (myMode == ADD_TO) - { - myTable->Copy((SMESHGUI_FilterTable*)parentWidget()); - myCurrFilterName = ""; - myCurrFilter = -1; - addFilterToLib(aName); - } - - isPermissionValid(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::processNewLibrary -// Purpose : SLOT. Calleds when file name changed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::processNewLibrary() -{ - SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager(); - if (aFilterMgr->_is_nil()) - return; - - myLibrary = aFilterMgr->LoadLibrary(autoExtension(getFileName())); - if (myLibrary->_is_nil()) { - if (myMode == COPY_FROM) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_LOAD"), QMessageBox::Ok); - return; - } else { - myLibrary = aFilterMgr->CreateLibrary(); - myLibrary->SetFileName(getFileName().latin1()); - } - } - - updateList(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::updateList -// Purpose : Fill list box with filter names -//======================================================================= -void SMESHGUI_FilterLibraryDlg::updateList() -{ - QStringList aList; - SMESH::string_array_var aNames = myLibrary->GetNames((SMESH::ElementType)myTable->GetType()); - for (int i = 0, n = aNames->length(); i < n; i++) - aList.append(QString(aNames[ i ])); - myListBox->clear(); - myListBox->insertStringList(aList); - if (myListBox->count() == 0) - { - myTable->Clear(myTable->GetType()); - myName->clear(); - myName->setEnabled(false); - myTable->SetEnabled(false); - } - else - { - myName->setEnabled(true); - myTable->SetEnabled(true); - if (myListBox->count()) - { - myCurrFilterName = ""; - myListBox->setCurrentItem(0); - } - } -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::isNameValid -// Purpose : Verify validity if entered data -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::isNameValid(const bool theMess) const -{ - // verify validity of filter name - if (myName->isEnabled() && !myCurrFilterName.isEmpty()) { - QString aCurrName = myName->text(); - if (aCurrName.isEmpty()) { - if (theMess) - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("EMPTY_FILTER_NAME"), QMessageBox::Ok); - return false; - } - - SMESH::string_array_var aNames = myLibrary->GetAllNames(); - for (int f = 0, n = aNames->length(); f < n; f++) { - if (aNames[ f ] == aCurrName && aNames[ f ] != myCurrFilterName) { - if (theMess) - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("ERROR_FILTER_NAME"), QMessageBox::Ok); - return false; - } - } - } - - return true; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::isPermissionValid -// Purpose : Verify write permission on file -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::isPermissionValid(const bool theIsExistingOnly) -{ - if (myMode == COPY_FROM) - return true; - - // Verify write permission - bool isWritable = false; - - QString fName(myFileName->text()); - if (QFileInfo(fName).extension().isEmpty()) - fName = autoExtension(fName); - - fName = QDir::convertSeparators(fName); - - if (QFileInfo(fName).exists()) { - isWritable = QFileInfo(fName).isWritable(); - } else if (!theIsExistingOnly) { - QFileInfo aDirInfo(QFileInfo(fName).dirPath(true)); - isWritable = aDirInfo.isWritable(); - /*if (QDir(QFileInfo(fName).dirPath(true)).exists() || - QDir().mkdir(QFileInfo(fName).dirPath(true))) - { - QFile aFile(fName); - if (aFile.open(IO_WriteOnly)) - isWritable = true; - else - aFile.close(); - } - */ - } else { - isWritable = true; - } - - if (!isWritable) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("NO_PERMISSION"), QMessageBox::Ok); - return false; - } - - return true; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::isValid -// Purpose : Verify validity if entered data -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::isValid(const bool theMess) const -{ - // verify validity of table - if (!myTable->IsValid(theMess) || !isNameValid(theMess)) - return false; - else - return true; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onFilterChanged -// Purpose : SLOT. Called when selected filter of library changed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onFilterChanged(const QString& theName) -{ - if (myLibrary->_is_nil()) - return; - - // Save parameters of filter if it was changed - - if (!myCurrFilterName.isEmpty() && myTable->IsEditable()) - { - if (!isValid(true)) - { - myListBox->blockSignals(true); - myListBox->setCurrentItem(myCurrFilter); - myListBox->blockSignals(false); - return; - } - - SMESH::Filter_var aFilter = createFilter(); - myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter); - } - - // Fill table with filter parameters - - SMESH::Filter_var aFilter = myLibrary->Copy(theName); - myCurrFilterName = theName; - myCurrFilter = myListBox->currentItem(); - myName->setText(theName); - - - SMESH::Filter::Criteria_var aCriteria; - - myTable->Clear(myTable->GetType()); - - if (!aFilter->GetCriteria(aCriteria)) - return; - - for (int i = 0, n = aCriteria->length(); i < n; i++) - myTable->AddCriterion(aCriteria[ i ], myTable->GetType()); - - myTable->Update(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onReturnPressed -// Purpose : SLOT. Called when enter button is pressed in library name field -// Reload library -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onReturnPressed() -{ - QString aName = myListBox->text(myListBox->count() - 1); - - processNewLibrary(); - - if (myMode == ADD_TO) - { - myTable->Copy((SMESHGUI_FilterTable*)parentWidget()); - myCurrFilterName = ""; - myCurrFilter = -1; - addFilterToLib(aName); - } - - isPermissionValid(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::enableMainButtons -// Purpose : Update state of "OK", "Cancel" buttons -//======================================================================= -void SMESHGUI_FilterLibraryDlg::enableMainButtons() -{ - /*bool isEnabled = isValid(false); - if (myButtons.contains(BTN_OK)) - myButtons[ BTN_OK ]->setEnabled(isEnabled); - else if (myButtons.contains(BTN_Apply)) - myButtons[ BTN_OK ]->setEnabled(isEnabled); - if (myButtons.contains(BTN_Cancel)) - myButtons[ BTN_Cancel ]->setEnabled(isEnabled); - else if (myButtons.contains(BTN_Close)) - myButtons[ BTN_Cancel ]->setEnabled(isEnabled); - */ -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::createFilter -// Purpose : Cerate filter in accordance with library -//======================================================================= -SMESH::Filter_ptr SMESHGUI_FilterLibraryDlg::createFilter(const int theType) -{ - int n = myTable->NumRows(theType); - - SMESH::Filter::Criteria_var aCriteria = new SMESH::Filter::Criteria; - aCriteria->length(n); - - for (int i = 0; i < n; i++) - { - SMESH::Filter::Criterion aCriterion = SMESHGUI_FilterDlg::createCriterion(); - myTable->GetCriterion(i, aCriterion); - aCriteria[ i ] = aCriterion; - } - - SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager(); - SMESH::Filter_var aFilter = aFilterMgr->CreateFilter(); - aFilter->SetCriteria(aCriteria.in()); - - return aFilter._retn(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onAddBtnPressed -// Purpose : SLOT. Called when "Add" button pressed -// Add new filter to the end of library -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onAddBtnPressed() -{ - // Save parameters of filter if it was changed - if (!myCurrFilterName.isEmpty() && myTable->IsEditable()) - { - if (!isValid(true)) - return; - - SMESH::Filter_var aFilter = createFilter(); - myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter); - } - - addFilterToLib(getDefaultFilterName()); -} - -//======================================================================= -// name : onAddBtnPressed() -// Purpose : SLOT. Called when "Add" button pressed -// Add new filter to the end of library -//======================================================================= -void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName) -{ - if (myLibrary->_is_nil()) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok); - return; - } - - // create filter - SMESH::Filter_var aFilter = createFilter(); - - // if name of filter already exist in the library assign default name for the filter - QString aName(theName); - SMESH::string_array_var aNames = myLibrary->GetAllNames(); - for (int i = 0, n = aNames->length(); i < n; i++) - if (aName == QString(aNames[ i ])) - { - aName = getDefaultFilterName(); - break; - } - - // add new filter in library - bool aResult = !aFilter->GetPredicate()->_is_nil() - ? myLibrary->Add(aName.latin1(), aFilter) - : myLibrary->AddEmpty(aName.latin1(), (SMESH::ElementType)myTable->GetType()); - - if (!aResult) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_ADDING"), QMessageBox::Ok); - } - - updateList(); - myCurrFilterName = ""; - myCurrFilter = -1; - setSelected(aName); - - if (theName != aName) - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WARNING"), - tr("ASSIGN_NEW_NAME").arg(theName).arg(aName), QMessageBox::Ok); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getDefaultLibraryName -// Purpose : Get default library name -//======================================================================= -QString& SMESHGUI_FilterLibraryDlg::getDefaultLibraryName() const -{ - static QString aName; - if (aName.isEmpty()) - { - QString aHomeDir = QDir(QDir::home()).absPath(); - aName = aHomeDir + "/" + tr ("LIB_NAME"); - } - return aName; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getDefaultFilterName -// Purpose : Create default filter name -//======================================================================= -QString SMESHGUI_FilterLibraryDlg::getDefaultFilterName() const -{ - QString aName; - - if (myTable->GetType() == SMESH::NODE) - aName = tr("NODE"); - else if (myTable->GetType() == SMESH::EDGE) - aName = tr("EDGE"); - else if (myTable->GetType() == SMESH::FACE) - aName = tr("FACE"); - else if (myTable->GetType() == SMESH::VOLUME) - aName = tr("VOLUME"); - else if (myTable->GetType() == SMESH::ALL) - aName = tr("ELEMENT"); - else - aName = tr("SELECTION"); - - aName += tr("FILTER"); - - - QMap< QString, int > anAllNames; - SMESH::string_array_var aNames = myLibrary->GetAllNames(); - for(int i = 0, n = aNames->length(); i < n; i++) - anAllNames[ QString(aNames[ i ]) ] = -1; - - bool isNotValid = true; - int k = 1; - QString aNewName; - while (isNotValid) - { - isNotValid = false; - aNewName = aName + "_" + QString("%1").arg(k); - if (anAllNames.contains(aNewName)) - { - isNotValid = true; - k++; - } - } - - return aNewName; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::setSelected -// Purpose : set selected item in list box containing filters -//======================================================================= -bool SMESHGUI_FilterLibraryDlg::setSelected(const QString& theName) -{ - int anIndex = getIndex(theName); - if (anIndex != -1) - { - myListBox->setCurrentItem(anIndex); - myCurrFilterName = theName; - myCurrFilter = anIndex; - } - return anIndex != -1; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::getIndex -// Purpose : Get index of the filter in list box -//======================================================================= -int SMESHGUI_FilterLibraryDlg::getIndex(const QString& theName) const -{ - for (int i = 0, n = myListBox->count(); i < n; i++) - if (myListBox->text(i) == theName) - return i; - return -1; -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed -// Purpose : SLOT. Called when "Delete" button pressed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed() -{ - if (myLibrary->_is_nil()) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok); - return; - } - - int anIndex = getIndex(myCurrFilterName); - - if (anIndex == -1 || !myLibrary->Delete(myCurrFilterName.latin1())) { - QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_DELETING"), QMessageBox::Ok); - } else { - myCurrFilterName = ""; - myCurrFilter = -1; - myListBox->removeItem(anIndex); - - if (anIndex >= 1) - myListBox->setSelected(anIndex - 1, true); - else if (anIndex == 0 && myListBox->count() > 0) - myListBox->setSelected(0, true); - else - myTable->Clear(); - } - - myTable->SetEnabled(myListBox->count() > 0); - if (myListBox->count() == 0) { - myName->setText(""); - myName->setEnabled(false); - } -} - -//======================================================================= -// name : onFilterNameChanged() -// Purpose : SLOT. Called when name of filter changed -// Change filter name in list box -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onFilterNameChanged (const QString& theName) -{ - int aCurrItem = myListBox->currentItem(); - if (aCurrItem == -1) - return; - - myListBox->blockSignals(true); - myListBox->changeItem(theName, aCurrItem); - myListBox->blockSignals(false); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::SetTable -// Purpose : Set table -//======================================================================= -void SMESHGUI_FilterLibraryDlg::SetTable(const SMESHGUI_FilterTable* theTable) -{ - myTable->Copy(theTable); - myName->setText(getDefaultFilterName()); - addFilterToLib(myName->text()); - myTable->Update(); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::GetTable -// Purpose : Get table -//======================================================================= -const SMESHGUI_FilterTable* SMESHGUI_FilterLibraryDlg::GetTable() const -{ - return myTable; -} - - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onEntityTypeChanged -// Purpose : SLOT. Called when entiyt type changed -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onEntityTypeChanged(const int theType) -{ - if (myLibrary->_is_nil()) - return; - - myName->clear(); - myCurrFilterName = ""; - myCurrFilter = -1; - updateList(); - if (myListBox->count()) - myListBox->setCurrentItem(0); -} - -//======================================================================= -// name : SMESHGUI_FilterLibraryDlg::onNeedValidation -// Purpose : -//======================================================================= -void SMESHGUI_FilterLibraryDlg::onNeedValidation() -{ - if (!myCurrFilterName.isEmpty()) - { - bool valid = isValid(true); - myTable->SetValidity(valid); - - if (valid) - { - SMESH::Filter_var aFilter = createFilter(myTable->GetType()); - myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter); - } - } -} diff --git a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h b/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h deleted file mode 100644 index 8fbc6f998..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h +++ /dev/null @@ -1,157 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_FilterLibraryDlg.h -// Author : Sergey LITONIN -// Module : SMESH - - -#ifndef SMESHGUI_FilterLibraryDlg_H -#define SMESHGUI_FilterLibraryDlg_H - -#include -#include - -#include -#include CORBA_SERVER_HEADER(SMESH_Filter) - -class QCloseEvent; -class QListBox; -class QFrame; -class QEvent; -class QLineEdit; -class QPushButton; -class QGroupBox; - -/* - Class : SMESHGUI_FilterLibraryDlg - Description : Dialog to specify filters for VTK viewer -*/ - -class SMESHGUI_FilterLibraryDlg : public QDialog -{ - Q_OBJECT - - // Buttons - enum { BTN_OK, BTN_Cancel, BTN_Apply, BTN_Close }; - - class Dialog; - -public: - - // Mode - enum { ADD_TO, COPY_FROM, EDIT }; - -public: - - SMESHGUI_FilterLibraryDlg( SMESHGUI*, - QWidget*, - const QValueList& types, - const int mode, - const char* name = 0 ); - - SMESHGUI_FilterLibraryDlg( SMESHGUI*, - QWidget*, - const int type, - const int mode, - const char* name = 0 ); - - virtual ~SMESHGUI_FilterLibraryDlg(); - - void Init( const QValueList& types, const int theMode ); - void Init( const int type, const int theMode ); - - const SMESHGUI_FilterTable* GetTable() const; - void SetTable( const SMESHGUI_FilterTable* ); - -private: - - void closeEvent( QCloseEvent* e ) ; - void enterEvent ( QEvent * ) ; - -private slots: - - void onOk(); - bool onApply(); - void onClose(); - - void onDeactivate(); - - void onBrowse(); - void onReturnPressed(); - void onFilterChanged( const QString& ); - void onAddBtnPressed(); - void onDeleteBtnPressed(); - void onFilterNameChanged( const QString& ); - void onEntityTypeChanged( const int ); - void onNeedValidation(); - -private: - - void construct( const QValueList& types, const int mode ); - QFrame* createButtonFrame( QWidget* ); - QFrame* createMainFrame ( QWidget* ); - bool isValid( const bool theMess = true ) const; - bool isNameValid( const bool theMess = true ) const; - SMESH::Filter_ptr createFilter( const int theType = -1 ); - QStringList prepareFilters() const; - QString autoExtension( const QString& ) const; - bool setSelected( const QString& ); - int getIndex( const QString& ) const; - void updateControlsVisibility(); - void updateMainButtons(); - void enableMainButtons(); - void processNewLibrary(); - QString getFileName() const; - void setFileName( const QString& txt, const bool autoExtension = true ); - QStringList filterWildCards( const QString& theFilter ) const; - QString& getDefaultLibraryName() const; - QString getDefaultFilterName() const; - void addFilterToLib( const QString& name ); - void updateList(); - bool isPermissionValid( const bool theIsExistingOnly ); - -private: - - QFrame* myMainFrame; - QMap myButtons; - SMESHGUI_FilterTable* myTable; - QLineEdit* myFileName; - QPushButton* myOpenBtn; - QListBox* myListBox; - QPushButton* myAddBtn; - QPushButton* myDeleteBtn; - QGroupBox* myNameGrp; - QLineEdit* myName; - SMESHGUI* mySMESHGUI; - - QValueList myTypes; - int myMode; - - SMESH::FilterLibrary_var myLibrary; - QString myCurrFilterName; - int myCurrFilter; - -}; - -#endif diff --git a/src/SMESHGUI/SMESHGUI_FilterUtils.cxx b/src/SMESHGUI/SMESHGUI_FilterUtils.cxx deleted file mode 100644 index e5c529f16..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterUtils.cxx +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - - -#include "SMESHGUI_FilterUtils.h" - -#include "SMESHGUI.h" - -#include "utilities.h" - -namespace SMESH -{ - SMESH::FilterManager_var& GetFilterManager() - { - static SMESH::FilterManager_var aFilterManager; - if (CORBA::is_nil(aFilterManager)) { - aFilterManager = SMESHGUI::GetSMESHGen()->CreateFilterManager(); - } - return aFilterManager; - } -} diff --git a/src/SMESHGUI/SMESHGUI_FilterUtils.h b/src/SMESHGUI/SMESHGUI_FilterUtils.h deleted file mode 100644 index 6b8c75862..000000000 --- a/src/SMESHGUI/SMESHGUI_FilterUtils.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SMESHGUI_FilterUtils_HeaderFile -#define SMESHGUI_FilterUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Filter) - - -namespace SMESH{ - - SMESH::FilterManager_var& GetFilterManager(); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx deleted file mode 100644 index c9ffc82e6..000000000 --- a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#include - -#include "SMESHGUI_GEOMGenUtils.h" -#include "SMESHGUI_Utils.h" - -#include - -#include -#include -#include - -#include CORBA_CLIENT_HEADER(SMESH_Mesh) - - -namespace SMESH { - - GEOM::GEOM_Gen_var GetGEOMGen() - { - static GEOM::GEOM_Gen_var aGEOMGen; - - if(CORBA::is_nil(aGEOMGen)) - aGEOMGen = GeometryGUI::GetGeomGen(); - return aGEOMGen; - } - - GEOM::GEOM_Object_var GetShapeOnMeshOrSubMesh(_PTR(SObject) theMeshOrSubmesh) - { - SALOMEDS_SObject* aMeshOrSubmesh = _CAST(SObject,theMeshOrSubmesh); - if(aMeshOrSubmesh) { - CORBA::Object_var Obj = aMeshOrSubmesh->GetObject(); - if ( !CORBA::is_nil( Obj ) ) { - SMESH::SMESH_Mesh_var aMesh = - SObjectToInterface( theMeshOrSubmesh ); - if ( !aMesh->_is_nil() ) - return aMesh->GetShapeToMesh(); - SMESH::SMESH_subMesh_var aSubmesh = - SObjectToInterface( theMeshOrSubmesh ); - if ( !aSubmesh->_is_nil() ) - return aSubmesh->GetSubShape(); - } - } - return GEOM::GEOM_Object::_nil(); - } - - GEOM::GEOM_Object_ptr GetGeom (_PTR(SObject) theSO) - { - if (!theSO) - return GEOM::GEOM_Object::_nil(); - - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - if (!aStudy) - return GEOM::GEOM_Object::_nil(); - - _PTR(ChildIterator) anIter (aStudy->NewChildIterator(theSO)); - for (; anIter->More(); anIter->Next()) { - _PTR(SObject) aSObject = anIter->Value(); - _PTR(SObject) aRefSOClient; - GEOM::GEOM_Object_var aMeshShape; - - if (aSObject->ReferencedObject(aRefSOClient)) { - SALOMEDS_SObject* aRefSO = _CAST(SObject,aRefSOClient); - aMeshShape = GEOM::GEOM_Object::_narrow(aRefSO->GetObject()); - } else { - SALOMEDS_SObject* aSO = _CAST(SObject,aSObject); - aMeshShape = GEOM::GEOM_Object::_narrow(aSO->GetObject()); - } - - if (!aMeshShape->_is_nil()) - return aMeshShape._retn(); - } - return GEOM::GEOM_Object::_nil(); - } -} diff --git a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.h b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.h deleted file mode 100644 index 6f2ccb9b3..000000000 --- a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SMESHGUI_GEOMGenUtils_HeaderFile -#define SMESHGUI_GEOMGenUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(GEOM_Gen) - -#include "SALOMEDSClient_definitions.hxx" - -class SALOMEDSClient_SObject; - -namespace SMESH -{ - GEOM::GEOM_Gen_var GetGEOMGen(); - - GEOM::GEOM_Object_var GetShapeOnMeshOrSubMesh (_PTR(SObject) theSObject); - - GEOM::GEOM_Object_ptr GetGeom (_PTR(SObject) theSO); -} - -#endif diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx deleted file mode 100644 index 9bf9e43f5..000000000 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx +++ /dev/null @@ -1,1448 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_GroupDlg.cxx -// Author : Natalia KOPNOVA -// Module : SMESH -// $Header$ - -#include "SMESHGUI_GroupDlg.h" -#include "SMESHGUI_FilterDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_GroupUtils.h" -#include "SMESHGUI_FilterUtils.h" -#include "SMESHGUI_GEOMGenUtils.h" - -#include "SMESH_TypeFilter.hxx" -#include "SMESH_Actor.h" -#include "GEOMBase.h" - -#include "SUIT_Desktop.h" -#include "SUIT_ResourceMgr.h" - -#include "SalomeApp_Tools.h" -#include "SALOMEDSClient_Study.hxx" -#include "SALOME_ListIO.hxx" -#include "SALOME_ListIteratorOfListIO.hxx" - -#include "SVTK_ViewWindow.h" -#include "SVTK_Selector.h" - -#include "utilities.h" - -// OCCT Includes -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// STL includes -#include -#include - -using namespace std; - -//================================================================================= -// function : SMESHGUI_GroupDlg() -// purpose : -//================================================================================= -SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name, - SMESH::SMESH_Mesh_ptr theMesh, bool modal, WFlags fl) - : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu | WDestructiveClose), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myIsBusy( false ), - myActor( 0 ) -{ - if (!name) setName("SMESHGUI_GroupDlg"); - initDialog(true); - if (!theMesh->_is_nil()) - init(theMesh); - else { - mySelectSubMesh->setEnabled(false); - mySelectGroup->setEnabled(false); - myGeomGroupBtn->setEnabled(false); - myGeomGroupLine->setEnabled(false); - } - - mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); - - /* Move widget on the botton right corner of main widget */ - int x, y ; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg() -// purpose : -//================================================================================= -SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name, - SMESH::SMESH_Group_ptr theGroup, bool modal, WFlags fl) - : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | - WStyle_Title | WStyle_SysMenu | WDestructiveClose), - mySMESHGUI( theModule ), - mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), - myIsBusy( false ) -{ - if (!name) setName("SMESHGUI_GroupDlg"); - - mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector(); - - initDialog(false); - if (!theGroup->_is_nil()) - init(theGroup); - else { - mySelectSubMesh->setEnabled(false); - mySelectGroup->setEnabled(false); - - myCurrentLineEdit = myMeshGroupLine; - setSelectionMode(5); - } - - /* Move widget on the botton right corner of main widget */ - int x, y ; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::initDialog(bool create) -{ - myFilterDlg = 0; - myCreate = create; - myCurrentLineEdit = 0; - - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - - if (create) - setCaption(tr("SMESH_CREATE_GROUP_TITLE")); - else - setCaption(tr("SMESH_EDIT_GROUP_TITLE")); - - setSizeGripEnabled(TRUE); - - QGridLayout* aMainLayout = new QGridLayout(this, 7, 3, 11, 6); - - /***************************************************************/ - QLabel* meshGroupLab = new QLabel(this, "mesh/group label"); - if (create) - meshGroupLab->setText(tr("SMESH_MESH")); - else - meshGroupLab->setText(tr("SMESH_GROUP")); - myMeshGroupBtn = new QPushButton(this, "mesh/group button"); - myMeshGroupBtn->setPixmap(image0); - myMeshGroupLine = new QLineEdit(this, "mesh/group line"); - myMeshGroupLine->setReadOnly(true); - - /***************************************************************/ - myTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Group types"); - myTypeGroup->setTitle(tr("SMESH_ELEMENTS_TYPE")); - myTypeGroup->setExclusive(true); - - QStringList types; - types.append(tr("MESH_NODE")); - types.append(tr("SMESH_EDGE")); - types.append(tr("SMESH_FACE")); - types.append(tr("SMESH_VOLUME")); - QRadioButton* rb; - for (int i = 0; i < types.count(); i++) { - rb = new QRadioButton(types[i], myTypeGroup); - } - myTypeGroup->setEnabled(create); - myTypeId = -1; - - /***************************************************************/ - QLabel* aName = new QLabel(this, "name label"); - aName->setText(tr("SMESH_NAME")); - aName->setMinimumSize(50,0); - myName = new QLineEdit(this, "name"); - - /***************************************************************/ - myGrpTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Type of group"); - myGrpTypeGroup->setTitle(tr("SMESH_GROUP_TYPE")); - myGrpTypeGroup->setExclusive(true); - QRadioButton* rb1 = new QRadioButton( tr("SMESH_GROUP_STANDALONE"), myGrpTypeGroup); - QRadioButton* rb2 = new QRadioButton( tr("SMESH_GROUP_GEOMETRY"), myGrpTypeGroup); - myGrpTypeGroup->setEnabled(create); - myGrpTypeId = -1; - - /***************************************************************/ - myWGStack = new QWidgetStack( this, "widget stack"); - QWidget* wg1 = new QFrame( myWGStack, "first widget" ); - QWidget* wg2 = new QFrame( myWGStack, "second widget" ); - - /***************************************************************/ - QGroupBox* aContentBox = new QGroupBox(1, Qt::Horizontal, wg1, "content box"); - aContentBox->setTitle(tr("SMESH_CONTENT")); - QFrame* aContent = new QFrame(aContentBox, "content"); - QGridLayout* aLayout = new QGridLayout(aContent, 7, 4); - aLayout->setSpacing(6); - aLayout->setAutoAdd(false); - - QLabel* aLabel = new QLabel(aContent, "elements label"); - aLabel->setText(tr("SMESH_ID_ELEMENTS")); - myElements = new QListBox(aContent, "elements list"); - myElements->setSelectionMode(QListBox::Extended); - - myFilter = new QPushButton(aContent, "filter"); - myFilter->setText(tr("SMESH_BUT_FILTER")); - QPushButton* aAddBtn = new QPushButton(aContent, "add"); - aAddBtn->setText(tr("SMESH_BUT_ADD")); - QPushButton* aRemoveBtn = new QPushButton(aContent, "remove"); - aRemoveBtn->setText(tr("SMESH_BUT_REMOVE")); - QPushButton* aSortBtn = new QPushButton(aContent, "sort"); - aSortBtn->setText(tr("SMESH_BUT_SORT")); - - aLayout->addWidget(aLabel, 0, 0); - aLayout->addMultiCellWidget(myElements, 1, 6, 0, 0); - aLayout->addWidget(myFilter, 1, 2); - aLayout->addWidget(aAddBtn, 3, 2); - aLayout->addWidget(aRemoveBtn, 4, 2); - aLayout->addWidget(aSortBtn, 6, 2); - - aLayout->setColStretch(0, 1); - aLayout->addColSpacing(1, 20); - aLayout->addColSpacing(3, 20); - aLayout->setRowStretch(2, 1); - aLayout->setRowStretch(5, 1); - - /***************************************************************/ - QGroupBox* aSelectBox = new QGroupBox(3, Qt::Horizontal, wg1, "select box"); - aSelectBox->setTitle(tr("SMESH_SELECT_FROM")); - - mySelectSubMesh = new QCheckBox(aSelectBox, "submesh checkbox"); - mySelectSubMesh->setText(tr("SMESH_SUBMESH")); - mySelectSubMesh->setMinimumSize(50, 0); - mySubMeshBtn = new QPushButton(aSelectBox, "submesh button"); - mySubMeshBtn->setText(""); - mySubMeshBtn->setPixmap(image0); - mySubMeshLine = new QLineEdit(aSelectBox, "submesh line"); - mySubMeshLine->setReadOnly(true); - onSelectSubMesh(false); - - mySelectGroup = new QCheckBox(aSelectBox, "group checkbox"); - mySelectGroup->setText(tr("SMESH_GROUP")); - mySelectGroup->setMinimumSize(50, 0); - myGroupBtn = new QPushButton(aSelectBox, "group button"); - myGroupBtn->setText(""); - myGroupBtn->setPixmap(image0); - myGroupLine = new QLineEdit(aSelectBox, "group line"); - myGroupLine->setReadOnly(true); - onSelectGroup(false); - - /***************************************************************/ - QGridLayout* wg1Layout = new QGridLayout( wg1, 3, 1, 0, 6 ); - wg1Layout->addWidget(aContentBox, 0, 0); - wg1Layout->addWidget(aSelectBox, 1, 0); - wg1Layout->setRowStretch(2, 5); - - /***************************************************************/ - QLabel* geomObject = new QLabel(wg2, "geometry object label"); - geomObject->setText(tr("SMESH_OBJECT_GEOM")); - myGeomGroupBtn = new QPushButton(wg2, "geometry group button"); - myGeomGroupBtn->setText(""); - myGeomGroupBtn->setPixmap(image0); - myGeomGroupLine = new QLineEdit(wg2, "geometry group line"); - myGeomGroupLine->setReadOnly(true); //VSR ??? - onSelectGeomGroup(false); - - /***************************************************************/ - QGridLayout* wg2Layout = new QGridLayout( wg2, 2, 3, 0, 6 ); - wg2Layout->addWidget(geomObject, 0, 0); - wg2Layout->addWidget(myGeomGroupBtn, 0, 1); - wg2Layout->addWidget(myGeomGroupLine,0, 2); - wg2Layout->setRowStretch(1, 5); - - /***************************************************************/ - QVBoxLayout* dumb = new QVBoxLayout(myWGStack); - dumb->addWidget(wg1); - dumb->addWidget(wg2); - myWGStack->addWidget( wg1, myGrpTypeGroup->id(rb1) ); - myWGStack->addWidget( wg2, myGrpTypeGroup->id(rb2) ); - - /***************************************************************/ - QFrame* aButtons = new QFrame(this, "button box"); - aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken); - QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6); - aBtnLayout->setAutoAdd(false); - - QPushButton* aOKBtn = new QPushButton(aButtons, "ok"); - aOKBtn->setText(tr("SMESH_BUT_OK")); - aOKBtn->setAutoDefault(true); - aOKBtn->setDefault(true); - QPushButton* aApplyBtn = new QPushButton(aButtons, "apply"); - aApplyBtn->setText(tr("SMESH_BUT_APPLY")); - aApplyBtn->setAutoDefault(true); - QPushButton* aCloseBtn = new QPushButton(aButtons, "close"); - aCloseBtn->setText(tr("SMESH_BUT_CLOSE")); - aCloseBtn->setAutoDefault(true); - - aBtnLayout->addWidget(aOKBtn); - aBtnLayout->addWidget(aApplyBtn); - aBtnLayout->addStretch(); - aBtnLayout->addWidget(aCloseBtn); - - /***************************************************************/ - aMainLayout->addWidget(meshGroupLab, 0, 0); - aMainLayout->addWidget(myMeshGroupBtn, 0, 1); - aMainLayout->addWidget(myMeshGroupLine, 0, 2); - aMainLayout->addMultiCellWidget(myTypeGroup, 1, 1, 0, 2); - aMainLayout->addWidget(aName, 2, 0); - aMainLayout->addWidget(myName, 2, 2); - aMainLayout->addMultiCellWidget(myGrpTypeGroup, 3, 3, 0, 2); - aMainLayout->addMultiCellWidget(myWGStack, 4, 4, 0, 2); - aMainLayout->setRowStretch( 5, 5 ); - aMainLayout->addMultiCellWidget(aButtons, 6, 6, 0, 2); - - /* signals and slots connections */ - connect(myMeshGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - - connect(myGrpTypeGroup, SIGNAL(clicked(int)), this, SLOT(onGrpTypeChanged(int))); - - connect(myTypeGroup, SIGNAL(clicked(int)), this, SLOT(onTypeChanged(int))); - - connect(myName, SIGNAL(textChanged(const QString&)), this, SLOT(onNameChanged(const QString&))); - connect(myElements, SIGNAL(selectionChanged()), this, SLOT(onListSelectionChanged())); - - connect(myFilter, SIGNAL(clicked()), this, SLOT(setFilters())); - connect(aAddBtn, SIGNAL(clicked()), this, SLOT(onAdd())); - connect(aRemoveBtn, SIGNAL(clicked()), this, SLOT(onRemove())); - connect(aSortBtn, SIGNAL(clicked()), this, SLOT(onSort())); - - connect(mySelectSubMesh, SIGNAL(toggled(bool)), this, SLOT(onSelectSubMesh(bool))); - connect(mySelectGroup, SIGNAL(toggled(bool)), this, SLOT(onSelectGroup(bool))); - connect(mySubMeshBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - connect(myGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - connect(myGeomGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); - - connect(aOKBtn, SIGNAL(clicked()), this, SLOT(onOK())); - connect(aApplyBtn, SIGNAL(clicked()), this, SLOT(onApply())); - connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(onClose())); - - /* Init selection */ - mySMESHGUI->SetActiveDialogBox(this); - mySMESHGUI->SetState(800); - - mySelectionMode = -1; - myMeshFilter = new SMESH_TypeFilter(MESH); - mySubMeshFilter = new SMESH_TypeFilter(SUBMESH); - myGroupFilter = new SMESH_TypeFilter(GROUP); - - connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onDeactivate())); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onClose())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged())); - - myGrpTypeGroup->setButton(myGrpTypeGroup->id(rb1)); // VSR !!! - onGrpTypeChanged(myGrpTypeGroup->id(rb1)); // VSR!!! - - if (myMesh->_is_nil() ) - myTypeGroup->setButton(0); - - updateButtons(); -} - -//================================================================================= -// function : ~SMESHGUI_GroupDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_GroupDlg::~SMESHGUI_GroupDlg() -{ - // no need to delete child widgets, Qt does it all for us - if ( myFilterDlg != 0 ) - { - myFilterDlg->reparent( 0, QPoint() ); - delete myFilterDlg; - } -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::init (SMESH::SMESH_Mesh_ptr theMesh) -{ - mySelectionMgr->installFilter(myMeshFilter); - - /* init data from current selection */ - myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh); - myGroup = SMESH::SMESH_Group::_nil(); - - myActor = SMESH::FindActorByObject(myMesh); - SMESH::SetPickable(myActor); - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - if( !aList.IsEmpty() ) - { - QString aName = aList.First()->getName(); - myMeshGroupLine->setText(aName) ; - myMeshGroupLine->home( false ); - } - - myCurrentLineEdit = 0; - - myTypeGroup->setButton(0); - onTypeChanged(0); -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::init (SMESH::SMESH_Group_ptr theGroup) -{ - myMesh = theGroup->GetMesh(); - myGroup = SMESH::SMESH_Group::_duplicate(theGroup); - - myActor = SMESH::FindActorByObject(myMesh); - if ( !myActor ) - myActor = SMESH::FindActorByObject(myGroup); - SMESH::SetPickable(myActor); - - int aType = 0; - switch(theGroup->GetType()) { - case SMESH::NODE: aType= 0; break; - case SMESH::EDGE: aType = 1; break; - case SMESH::FACE: aType = 2; break; - case SMESH::VOLUME: aType = 3; break; - } - - myName->setText(myGroup->GetName()); - myName->home(false); - myMeshGroupLine->setText(myGroup->GetName()); - - myCurrentLineEdit = 0; - myTypeGroup->setButton(aType); - myElements->clear(); - setSelectionMode(aType); - myTypeId = aType; - - myIdList.clear(); - if (!theGroup->IsEmpty()) { - SMESH::long_array_var anElements = myGroup->GetListOfID(); - int k = anElements->length(); - for (int i = 0; i < k; i++) { - myIdList.append(anElements[i]); - myElements->insertItem(QString::number(anElements[i])); - } - myElements->selectAll(true); - } -} - -//================================================================================= -// function : updateButtons() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::updateButtons() -{ - bool enable; - - if (myGrpTypeId == 0) - enable = !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0; - else if (myGrpTypeId == 1) - enable = !myName->text().stripWhiteSpace().isEmpty() && !CORBA::is_nil( myGeomGroup ); - QPushButton* aBtn; - aBtn = (QPushButton*) child("ok", "QPushButton"); - if (aBtn) aBtn->setEnabled(enable); - aBtn = (QPushButton*) child("apply", "QPushButton"); - if (aBtn) aBtn->setEnabled(enable); -} - -//================================================================================= -// function : onNameChanged() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onNameChanged (const QString& text) -{ - updateButtons(); -} - -//================================================================================= -// function : onTypeChanged() -// purpose : Group elements type radio button management -//================================================================================= -void SMESHGUI_GroupDlg::onTypeChanged (int id) -{ - if (myTypeId != id) { - myElements->clear(); - if (myCurrentLineEdit == 0) - setSelectionMode(id); - } - myTypeId = id; -} - -//================================================================================= -// function : onGrpTypeChanged() -// purpose : Group type radio button management -//================================================================================= -void SMESHGUI_GroupDlg::onGrpTypeChanged (int id) -{ - if (myGrpTypeId != id) { - myWGStack->raiseWidget( id ); - onSelectGeomGroup(id == 1); - } - myGrpTypeId = id; -} - -//================================================================================= -// function : setSelectionMode() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_GroupDlg::setSelectionMode (int theMode) -{ - // PAL7314 - if (myMesh->_is_nil()) - return; - - if (mySelectionMode != theMode) { - mySelectionMgr->clearSelected(); - mySelectionMgr->clearFilters(); - SMESH::SetPointRepresentation(false); - if (theMode < 4) { - switch (theMode) { - case 0: - if (myActor) - myActor->SetPointRepresentation(true); - else - SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - break; - case 1: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - break; - case 2: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - break; - default: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(VolumeSelection); - } - } else { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - if (theMode == 4) - mySelectionMgr->installFilter(mySubMeshFilter); - else if (theMode == 5) - mySelectionMgr->installFilter(myGroupFilter); - else if (theMode == 6) - mySelectionMgr->installFilter(myMeshFilter); - } - mySelectionMode = theMode; - } -} - -//================================================================================= -// function : onApply() -// purpose : -//================================================================================= -bool SMESHGUI_GroupDlg::onApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return false; - - if (myGrpTypeId == 0 && - !myName->text().stripWhiteSpace().isEmpty() && - myElements->count() > 0) { - mySelectionMgr->clearSelected(); - if (myGroup->_is_nil()) { - SMESH::ElementType aType = SMESH::ALL; - switch(myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - SMESH::long_array_var anIdList = new SMESH::long_array; - int i, k = myElements->count(); - anIdList->length(k); - QListBoxItem* anItem; - for (i = 0, anItem = myElements->firstItem(); anItem != 0; i++, anItem = anItem->next()) { - anIdList[i] = anItem->text().toInt(); - } - - myGroup = SMESH::AddGroup(myMesh, aType, myName->text()); - myGroup->Add(anIdList.inout()); - - /* init for next operation */ - myName->setText(""); - myElements->clear(); - myGroup = SMESH::SMESH_Group::_nil(); - - } else { - myGroup->SetName(myName->text()); - - QValueList aAddList; - QValueList::iterator anIt; - QListBoxItem* anItem; - - for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) { - int anId = anItem->text().toInt(); - if ((anIt = myIdList.find(anId)) == myIdList.end()) - aAddList.append(anId); - else - myIdList.remove(anIt); - } - if (!aAddList.empty()) { - SMESH::long_array_var anIdList = new SMESH::long_array; - anIdList->length(aAddList.count()); - int i; - for (i = 0, anIt = aAddList.begin(); anIt != aAddList.end(); anIt++, i++) - anIdList[i] = *anIt; - myGroup->Add(anIdList.inout()); - } - if (!myIdList.empty()) { - SMESH::long_array_var anIdList = new SMESH::long_array; - anIdList->length(myIdList.count()); - int i; - for (i = 0, anIt = myIdList.begin(); anIt != myIdList.end(); anIt++, i++) - anIdList[i] = *anIt; - myGroup->Remove(anIdList.inout()); - } - /* init for next operation */ - myIdList.clear(); - for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) - myIdList.append(anItem->text().toInt()); - } - - mySMESHGUI->updateObjBrowser(true); - SMESH::UpdateView(); // asv: fix of BUG PAL5515 - mySelectionMgr->clearSelected(); - return true; - } else if (myGrpTypeId == 1 && - !myName->text().stripWhiteSpace().isEmpty() && - !CORBA::is_nil(myGeomGroup)) - { - SMESH::ElementType aType = SMESH::ALL; - switch (myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - GEOM::GEOM_IGroupOperations_var aGroupOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); - - SMESH::SMESH_GroupOnGeom_var aGroupOnGeom = - myMesh->CreateGroupFromGEOM(aType, myName->text(),myGeomGroup); - - mySMESHGUI->updateObjBrowser(true); - mySelectionMgr->clearSelected(); - /* init for next operation */ - myName->setText(""); - return true; - } - - return false; -} - -//================================================================================= -// function : onOK() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onOK() -{ - if ( onApply() ) - onClose(); -} - -//================================================================================= -// function : onListSelectionChanged() -// purpose : Called when selection in element list is changed -//================================================================================= -void SMESHGUI_GroupDlg::onListSelectionChanged() -{ - // MESSAGE("SMESHGUI_GroupDlg::onListSelectionChanged(); myActor = " << myActor); - if( myIsBusy || !myActor) return; - myIsBusy = true; - - if (myCurrentLineEdit == 0) { - mySelectionMgr->clearSelected(); - TColStd_MapOfInteger aIndexes; - QListBoxItem* anItem; - for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) { - if (anItem->isSelected()) { - int anId = anItem->text().toInt(); - aIndexes.Add(anId); - } - } - mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, false); - SALOME_ListIO aList; - aList.Append(myActor->getIO()); - mySelectionMgr->setSelectedObjects(aList,false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); - } - myIsBusy = false; -} - -//================================================================================= -// function : onObjectSelectionChanged() -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onObjectSelectionChanged() -{ - if ( myIsBusy || !isEnabled()) return; - myIsBusy = true; - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - int aNbSel = aList.Extent(); - myElements->clearSelection(); - - if (myCurrentLineEdit) { - myCurrentLineEdit->setText(""); - QString aString = ""; - - if (myCurrentLineEdit == myMeshGroupLine) { - mySelectSubMesh->setEnabled(false); - mySelectGroup->setEnabled(false); - myGroupLine->setText(""); - mySubMeshLine->setText(""); - - myGeomGroupBtn->setEnabled(false); - myGeomGroupLine->setEnabled(false); - myGeomGroupLine->setText(""); - if (!myCreate) - myName->setText(""); - - myElements->clear(); - - if (aNbSel != 1 ) { - myGroup = SMESH::SMESH_Group::_nil(); - myMesh = SMESH::SMESH_Mesh::_nil(); - myIsBusy = false; - return; - } - Handle(SALOME_InteractiveObject) IO = aList.First(); - - if (myCreate) { - myMesh = SMESH::IObjectToInterface(IO); - if (myMesh->_is_nil()) - { - myIsBusy = false; - return; - } - myGroup = SMESH::SMESH_Group::_nil(); - - myActor = SMESH::FindActorByObject(myMesh); - SMESH::SetPickable(myActor); - - aString = aList.First()->getName(); - myMeshGroupLine->setText(aString) ; - myMeshGroupLine->home( false ); - - mySelectSubMesh->setEnabled(true); - mySelectGroup->setEnabled(true); - myGeomGroupBtn->setEnabled(true); - myGeomGroupLine->setEnabled(true); - updateButtons(); - } else { - SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(IO); - if (aGroup->_is_nil()) - { - myIsBusy = false; - return; - } - myIsBusy = false; - myCurrentLineEdit = 0; - init(aGroup); - myIsBusy = true; - mySelectSubMesh->setEnabled(true); - mySelectGroup->setEnabled(true); - myGeomGroupBtn->setEnabled(true); - myGeomGroupLine->setEnabled(true); - } - myCurrentLineEdit = 0; - myIsBusy = false; - if (!myCreate) - return; - - if (myTypeId == -1) - onTypeChanged(0); - else { - myElements->clear(); - setSelectionMode(myTypeId); - } - - myIsBusy = false; - return; - - } else if (myCurrentLineEdit == myGeomGroupLine) { - if (aNbSel != 1) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - - Standard_Boolean testResult = Standard_False; - myGeomGroup = GEOMBase::ConvertIOinGEOMObject(aList.First(), testResult); - - // Check if the object is a geometry group - if (!testResult || CORBA::is_nil(myGeomGroup)) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - // Check if group constructed on the same shape as a mesh or on its child - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - GEOM::GEOM_IGroupOperations_var anOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); - - // The main shape of the group - GEOM::GEOM_Object_var aGroupMainShape; - if (myGeomGroup->GetType() == 37) - aGroupMainShape = anOp->GetMainShape(myGeomGroup); - else - aGroupMainShape = GEOM::GEOM_Object::_duplicate(myGeomGroup); - _PTR(SObject) aGroupMainShapeSO = - //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(aGroupMainShape)); - aStudy->FindObjectIOR(aGroupMainShape->GetStudyEntry()); - - // The mesh SObject - _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh); - if (!aMeshSO) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - _PTR(SObject) anObj, aRef; - bool isRefOrSubShape = false; - if (aMeshSO->FindSubObject(1, anObj) && anObj->ReferencedObject(aRef)) { - //if (strcmp(aRef->GetID(), aGroupMainShapeSO->GetID()) == 0) { - if (aRef->GetID() == aGroupMainShapeSO->GetID()) { - isRefOrSubShape = true; - } else { - _PTR(SObject) aFather = aGroupMainShapeSO->GetFather(); - _PTR(SComponent) aComponent = aGroupMainShapeSO->GetFatherComponent(); - //while (!isRefOrSubShape && strcmp(aFather->GetID(), aComponent->GetID()) != 0) { - while (!isRefOrSubShape && aFather->GetID() != aComponent->GetID()) { - //if (strcmp(aRef->GetID(), aFather->GetID()) == 0) - if (aRef->GetID() == aFather->GetID()) - isRefOrSubShape = true; - else - aFather = aFather->GetFather(); - } - } - } - if (!isRefOrSubShape) { - myGeomGroup = GEOM::GEOM_Object::_nil(); - myIsBusy = false; - return; - } - } - - if(aNbSel >= 1) { - if(aNbSel > 1) { - if(myCurrentLineEdit == mySubMeshLine) - aString = tr("SMESH_SUBMESH_SELECTED").arg(aNbSel); - else if(myCurrentLineEdit == myGroupLine || myCurrentLineEdit == myGeomGroupLine) - aString = tr("SMESH_GROUP_SELECTED").arg(aNbSel); - } else { - aString = aList.First()->getName(); - } - } - - myCurrentLineEdit->setText(aString); - myCurrentLineEdit->home(false); - - updateButtons(); - - } else { - if (aNbSel == 1 && myActor ) { - QString aListStr = ""; - int aNbItems = 0; - if (myTypeId == 0) { - aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); - } else { - aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); - } - if (aNbItems > 0) { - QStringList anElements = QStringList::split(" ", aListStr); - QListBoxItem* anItem = 0; - for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { - anItem = myElements->findItem(*it, Qt::ExactMatch); - if (anItem) myElements->setSelected(anItem, true); - } - } - } - } - - if (!myActor) { - if (!myGroup->_is_nil()) - myActor = SMESH::FindActorByObject(myGroup); - else - myActor = SMESH::FindActorByObject(myMesh); - } - - myIsBusy = false; -} - -//================================================================================= -// function : onSelectSubMesh() -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onSelectSubMesh(bool on) -{ - if (on) { - if (mySelectGroup->isChecked()) { - mySelectGroup->setChecked(false); - } - //VSR: else if (mySelectGeomGroup->isChecked()) { - //VSR: mySelectGeomGroup->setChecked(false); - //VSR: } - myCurrentLineEdit = mySubMeshLine; - setSelectionMode(4); - } - else { - mySubMeshLine->setText(""); - myCurrentLineEdit = 0; - if (myTypeId != -1) - setSelectionMode(myTypeId); - } - mySubMeshBtn->setEnabled(on); - mySubMeshLine->setEnabled(on); -} - - -//================================================================================= -// function : (onSelectGroup) -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onSelectGroup(bool on) -{ - if (on) { - if (mySelectSubMesh->isChecked()) { - mySelectSubMesh->setChecked(false); - } - myCurrentLineEdit = myGroupLine; - setSelectionMode(5); - } - else { - myGroupLine->setText(""); - myCurrentLineEdit = 0; - if (myTypeId != -1) - setSelectionMode(myTypeId); - } - myGroupBtn->setEnabled(on); - myGroupLine->setEnabled(on); -} - - -//================================================================================= -// function : (onSelectGeomGroup) -// purpose : Called when selection in 3D view or ObjectBrowser is changed -//================================================================================= -void SMESHGUI_GroupDlg::onSelectGeomGroup(bool on) -{ - if (on) { - if (mySelectSubMesh->isChecked()) { - mySelectSubMesh->setChecked(false); - } - else if (mySelectGroup->isChecked()) { - mySelectGroup->setChecked(false); - } - myCurrentLineEdit = myGeomGroupLine; - setSelectionMode(7); - } - else { - myGeomGroupLine->setText(""); - myCurrentLineEdit = 0; - if (myTypeId != -1) - setSelectionMode(myTypeId); - } -} - - -//================================================================================= -// function : setCurrentSelection() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::setCurrentSelection() -{ - QPushButton* send = (QPushButton*)sender(); - myCurrentLineEdit = 0; - if (send == myMeshGroupBtn) { - myCurrentLineEdit = myMeshGroupLine; - if (myCreate) - setSelectionMode(6); - else - setSelectionMode(5); - onObjectSelectionChanged(); - } - else if (send == mySubMeshBtn) { - myCurrentLineEdit = mySubMeshLine; - onObjectSelectionChanged(); - } - else if (send == myGroupBtn) { - myCurrentLineEdit = myGroupLine; - onObjectSelectionChanged(); - } - else if (send == myGeomGroupBtn) { - myCurrentLineEdit = myGeomGroupLine; - setSelectionMode(7); - onObjectSelectionChanged(); - } -} - - -//================================================================================= -// function : setFilters() -// purpose : SLOT. Called when "Filter" button pressed. -//================================================================================= -void SMESHGUI_GroupDlg::setFilters() -{ - SMESH::ElementType aType = SMESH::ALL; - switch ( myTypeId ) - { - case 0 : aType = SMESH::NODE; break; - case 1 : aType = SMESH::EDGE; break; - case 2 : aType = SMESH::FACE; break; - case 3 : aType = SMESH::VOLUME; break; - default: return; - } - - if ( myFilterDlg == 0 ) - { - myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, aType ); - connect( myFilterDlg, SIGNAL( Accepted() ), SLOT( onFilterAccepted() ) ); - } - else - myFilterDlg->Init( aType ); - - myFilterDlg->SetSelection(); - myFilterDlg->SetMesh( myMesh ); - myFilterDlg->SetSourceWg( myElements ); - - myFilterDlg->show(); -} - -//================================================================================= -// function : onFilterAccepted() -// purpose : SLOT. Called when Filter dlg closed with OK button. -// Uncheck "Select submesh" and "Select group" checkboxes -//================================================================================= -void SMESHGUI_GroupDlg::onFilterAccepted() -{ - if ( mySelectSubMesh->isChecked() || mySelectGroup->isChecked() ) - { - mySelectionMode = myTypeId; - mySelectSubMesh->setChecked( false ); - mySelectGroup->setChecked( false ); - } -} - -//================================================================================= -// function : onAdd() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onAdd() -{ - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - int aNbSel = aList.Extent(); - - if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return; - - myIsBusy = true; - - SMESH::ElementType aType = SMESH::ALL; - switch(myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - - if (myCurrentLineEdit == 0) { - //if (aNbSel != 1) { myIsBusy = false; return; } - QString aListStr = ""; - int aNbItems = 0; - if (myTypeId == 0) { - aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); - } - else { - aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); - } - if (aNbItems > 0) { - QStringList anElements = QStringList::split(" ", aListStr); - QListBoxItem* anItem = 0; - for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { - anItem = myElements->findItem(*it, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(*it); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - } else if (myCurrentLineEdit == mySubMeshLine) { - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_subMesh_var aSubMesh = - SMESH::IObjectToInterface(anIt.Value()); - if (!aSubMesh->_is_nil()) { - // check if mesh is the same - if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) { - try { - SMESH::long_array_var anElements = aSubMesh->GetElementsByType(aType); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - catch (const SALOME::SALOME_Exception& ex) { - SalomeApp_Tools::QtCatchCorbaException(ex); - } - } - } - } - mySelectSubMesh->setChecked(false); - myIsBusy = false; - onListSelectionChanged(); - - } else if (myCurrentLineEdit == myGroupLine) { - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_Group_var aGroup = - SMESH::IObjectToInterface(anIt.Value()); - if (!aGroup->_is_nil()) { - // check if mesh is the same - if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { - SMESH::long_array_var anElements = aGroup->GetListOfID(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - } - } - mySelectGroup->setChecked(false); - myIsBusy = false; - onListSelectionChanged(); - - } else if (myCurrentLineEdit == myGeomGroupLine && !CORBA::is_nil(myGeomGroup)) { - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - GEOM::GEOM_IGroupOperations_var aGroupOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); - - SMESH::ElementType aGroupType = SMESH::ALL; - switch(aGroupOp->GetType(myGeomGroup)) { - case 7: aGroupType = SMESH::NODE; break; - case 6: aGroupType = SMESH::EDGE; break; - case 4: aGroupType = SMESH::FACE; break; - case 2: aGroupType = SMESH::VOLUME; break; - default: myIsBusy = false; return; - } - - if (aGroupType == aType) { - _PTR(SObject) aGroupSO = - //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(myGeomGroup)); - aStudy->FindObjectIOR(myGeomGroup->GetStudyEntry()); - // Construct filter - SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager(); - SMESH::Filter_var aFilter = aFilterMgr->CreateFilter(); - SMESH::BelongToGeom_var aBelongToGeom = aFilterMgr->CreateBelongToGeom();; - aBelongToGeom->SetGeom(myGeomGroup); - aBelongToGeom->SetShapeName(aGroupSO->GetName().c_str()); - aBelongToGeom->SetElementType(aType); - aFilter->SetPredicate(aBelongToGeom); - - SMESH::long_array_var anElements = aFilter->GetElementsId(myMesh); - - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - anItem = myElements->findItem(aText, Qt::ExactMatch); - if (!anItem) { - anItem = new QListBoxText(aText); - myElements->insertItem(anItem); - } - myElements->setSelected(anItem, true); - } - } - - //VSR: mySelectGeomGroup->setChecked(false); - myIsBusy = false; - onListSelectionChanged(); - } - myIsBusy = false; - // mySelectionMgr->clearSelected(); - updateButtons(); -} - -//================================================================================= -// function : onRemove() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onRemove() -{ - myIsBusy = true; - if (myCurrentLineEdit == 0) { - for (int i = myElements->count(); i > 0; i--) { - if (myElements->isSelected(i-1)) { - myElements->removeItem(i-1); - } - } - } else { - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - int aNbSel = aList.Extent(); - - if (aNbSel == 0) { myIsBusy = false; return; } - - SMESH::ElementType aType = SMESH::ALL; - switch(myTypeId) { - case 0: aType = SMESH::NODE; break; - case 1: aType = SMESH::EDGE; break; - case 2: aType = SMESH::FACE; break; - case 3: aType = SMESH::VOLUME; break; - } - - if (myCurrentLineEdit == mySubMeshLine) { - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(anIt.Value()); - if (!aSubMesh->_is_nil()) { - // check if mesh is the same - if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) { - if (aType == SMESH::NODE) { - try { - SMESH::long_array_var anElements = aSubMesh->GetNodesId(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch); - if (anItem) delete anItem; - } - } - catch (const SALOME::SALOME_Exception& ex) { - SalomeApp_Tools::QtCatchCorbaException(ex); - } - } - else { - try { - SMESH::long_array_var anElements = aSubMesh->GetElementsId(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch); - if (anItem) delete anItem; - } - } - catch (const SALOME::SALOME_Exception& ex) { - SalomeApp_Tools::QtCatchCorbaException(ex); - } - } - } - } - } - } - else if (myCurrentLineEdit == myGroupLine) { - Standard_Boolean aRes; - //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects()); - SALOME_ListIO aList; - mySelectionMgr->selectedObjects( aList ); - - SALOME_ListIteratorOfListIO anIt (aList); - for (; anIt.More(); anIt.Next()) { - SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(anIt.Value()); - if (aRes && !aGroup->_is_nil()) { - // check if mesh is the same - if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) { - SMESH::long_array_var anElements = aGroup->GetListOfID(); - int k = anElements->length(); - QListBoxItem* anItem = 0; - for (int i = 0; i < k; i++) { - anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch); - if (anItem) delete anItem; - } - } - } - } - } - } - myIsBusy = false; - updateButtons(); -} - -//================================================================================= -// function : onSort() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::onSort() -{ - // PAL5412: sorts items in ascending by "string" value - // myElements->sort(true); - // myElements->update(); - int i, k = myElements->count(); - if (k > 0) { - myIsBusy = true; - QStringList aSelected; - std::vector anArray(k); - // QMemArray anArray(k); - QListBoxItem* anItem; - // fill the array - for (anItem = myElements->firstItem(), i = 0; anItem != 0; anItem = anItem->next(), i++) { - anArray[i] = anItem->text().toInt(); - if (anItem->isSelected()) - aSelected.append(anItem->text()); - } - // sort & update list - std::sort(anArray.begin(), anArray.end()); - // anArray.sort(); - myElements->clear(); - for (i = 0; i < k; i++) { - myElements->insertItem(QString::number(anArray[i])); - } - for (QStringList::iterator it = aSelected.begin(); it != aSelected.end(); ++it) { - anItem = myElements->findItem(*it, Qt::ExactMatch); - if (anItem) myElements->setSelected(anItem, true); - } - myIsBusy = false; - } -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_GroupDlg::closeEvent (QCloseEvent*) -{ - onClose(); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg::onClose -// purpose : SLOT called when "Close" button pressed. Close dialog -//================================================================================= -void SMESHGUI_GroupDlg::onClose() -{ - if (SMESH::GetCurrentVtkView()) { - SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters - SMESH::SetPointRepresentation(false); - SMESH::SetPickable(); - } - - mySelectionMgr->clearSelected(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->clearFilters(); - mySMESHGUI->ResetState(); - - reject(); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg::onDeactivate -// purpose : SLOT called when dialog must be deativated -//================================================================================= -void SMESHGUI_GroupDlg::onDeactivate() -{ - mySMESHGUI->ResetState(); - setEnabled(false); -} - -//================================================================================= -// function : SMESHGUI_GroupDlg::enterEvent -// purpose : Event filter -//================================================================================= -void SMESHGUI_GroupDlg::enterEvent (QEvent*) -{ - if (!isEnabled()) { - mySMESHGUI->EmitSignalDeactivateDialog(); - setEnabled(true); - mySelectionMode = -1; - setSelectionMode(myTypeId); - //mySMESHGUI->SetActiveDialogBox((QDialog*)this); - mySMESHGUI->SetActiveDialogBox(this); - mySMESHGUI->SetState(800); - } -} - -//================================================================================= -// function : hideEvent -// purpose : caused by ESC key -//================================================================================= -void SMESHGUI_GroupDlg::hideEvent (QHideEvent*) -{ - if (!isMinimized()) - onClose(); -} diff --git a/src/SMESHGUI/SMESHGUI_GroupUtils.cxx b/src/SMESHGUI/SMESHGUI_GroupUtils.cxx deleted file mode 100644 index d2aa17f3a..000000000 --- a/src/SMESHGUI/SMESHGUI_GroupUtils.cxx +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - - -#include "SMESHGUI_GroupUtils.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" - -#include "SUIT_Session.h" -#include "SalomeApp_Application.h" -#include "SalomeApp_Tools.h" - -#include "OB_Browser.h" - -namespace SMESH -{ - - SMESH::SMESH_Group_var AddGroup( SMESH::SMESH_Mesh_ptr theMesh, - SMESH::ElementType theType, - const char* theGroupName ) - { - SMESH::SMESH_Group_var aGroup; - try { - if ( !theMesh->_is_nil() ) - aGroup = theMesh->CreateGroup( theType, theGroupName ); - } - catch( const SALOME::SALOME_Exception& S_ex ) { - SalomeApp_Tools::QtCatchCorbaException( S_ex ); - } - //SalomeApp_Application* app = - // dynamic_cast(SUIT_Session::session()->activeApplication()); - //if (app) app->objectBrowser()->updateTree(); - SMESHGUI::GetSMESHGUI()->updateObjBrowser(); - return aGroup._retn(); - } -} diff --git a/src/SMESHGUI/SMESHGUI_GroupUtils.h b/src/SMESHGUI/SMESHGUI_GroupUtils.h deleted file mode 100644 index 9cd9783c1..000000000 --- a/src/SMESHGUI/SMESHGUI_GroupUtils.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SMESHGUI_GroupUtils_HeaderFile -#define SMESHGUI_GroupUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Group) - - -namespace SMESH{ - - SMESH::SMESH_Group_var AddGroup(SMESH::SMESH_Mesh_ptr theMesh, - SMESH::ElementType theType, - const char* theGroupName); -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_IdValidator.h b/src/SMESHGUI/SMESHGUI_IdValidator.h deleted file mode 100644 index 680dacba8..000000000 --- a/src/SMESHGUI/SMESHGUI_IdValidator.h +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_IdValidator.h -// Author : Edward AGAPOV -// Module : SMESH -// $Header: /dn05/salome/PAL/SMESH/SMESH_SRC/src/SMESHGUI/SMESHGUI_IdValidator.h - -#ifndef SMESHGUI_IdValidator_HeaderFile -#define SMESHGUI_IdValidator_HeaderFile - -#include - -// validator for manual input of Ids - -class SMESHGUI_IdValidator: public QValidator -{ - public: - - SMESHGUI_IdValidator(QWidget * parent, const char * name = 0, const int maxNbId = 0): - QValidator(parent,name), myMaxNbId(maxNbId) {} - - State validate ( QString & text, int & pos) const - { - text.replace( QRegExp(" *[^0-9]+ *"), " " ); - if ( myMaxNbId && text.length() > myMaxNbId) { // truncate extra ids - int ind = 0, nbId = 0; - while ( ind < text.length() ) { - if ( text.at( ind ) != ' ' ) { - if ( ++nbId > myMaxNbId ) { - text.truncate( ind ); - break; - } - ind = text.find( ' ', ind ); - if ( ind < 0 ) break; - } - ind++; - } - } - if ( pos > text.length() ) - pos = text.length(); - return Acceptable; - } - - private: - int myMaxNbId; -}; - -#endif diff --git a/src/SMESHGUI/SMESHGUI_MeshUtils.cxx b/src/SMESHGUI/SMESHGUI_MeshUtils.cxx deleted file mode 100644 index 9c8d313c6..000000000 --- a/src/SMESHGUI/SMESHGUI_MeshUtils.cxx +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - - -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_Utils.h" - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Group) - -namespace SMESH -{ - - SMESH_Mesh_var GetMeshByIO(const Handle(SALOME_InteractiveObject)& theIO) - { - CORBA::Object_var anObj = IObjectToObject(theIO); - if(!CORBA::is_nil(anObj)){ - SMESH_Mesh_var aMesh = SMESH_Mesh::_narrow(anObj); - if(!CORBA::is_nil(aMesh)) - return aMesh; - SMESH_GroupBase_var aGroup = SMESH_GroupBase::_narrow(anObj); - if(!CORBA::is_nil(aGroup)) - return aGroup->GetMesh(); - SMESH_subMesh_var aSubMesh = SMESH_subMesh::_narrow(anObj); - if(!CORBA::is_nil(aSubMesh)) - return aSubMesh->GetFather(); - } - return SMESH_Mesh::_nil(); - } - -} diff --git a/src/SMESHGUI/SMESHGUI_MeshUtils.h b/src/SMESHGUI/SMESHGUI_MeshUtils.h deleted file mode 100644 index 011de3404..000000000 --- a/src/SMESHGUI/SMESHGUI_MeshUtils.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SMESHGUI_MeshUtils_HeaderFile -#define SMESHGUI_MeshUtils_HeaderFile - -#include "SALOME_InteractiveObject.hxx" - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Mesh) - - -namespace SMESH{ - - SMESH_Mesh_var GetMeshByIO(const Handle(SALOME_InteractiveObject)& theIO); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_PatternUtils.cxx b/src/SMESHGUI/SMESHGUI_PatternUtils.cxx deleted file mode 100644 index 718162f2b..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternUtils.cxx +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - - -#include "SMESHGUI_PatternUtils.h" - -#include "SMESHGUI.h" - -namespace SMESH { - - SMESH::SMESH_Pattern_var GetPattern() - { - return SMESHGUI::GetSMESHGen()->GetPattern(); - } -} diff --git a/src/SMESHGUI/SMESHGUI_PatternUtils.h b/src/SMESHGUI/SMESHGUI_PatternUtils.h deleted file mode 100644 index fb09d01d9..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternUtils.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SMESHGUI_PatternUtils_HeaderFile -#define SMESHGUI_PatternUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Pattern) - - -namespace SMESH{ - - SMESH::SMESH_Pattern_var GetPattern(); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_PatternWidget.cxx b/src/SMESHGUI/SMESHGUI_PatternWidget.cxx deleted file mode 100644 index 178800a62..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternWidget.cxx +++ /dev/null @@ -1,165 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_PatternWidget.cxx -// Author : Michael ZORIN -// Module : SMESH -// $Header: - -#include "SMESHGUI_PatternWidget.h" - -//Qt includes -#include -#include - - -//================================================================================= -// class : SMESHGUI_PatternWidget() -// purpose : -//================================================================================= -SMESHGUI_PatternWidget::SMESHGUI_PatternWidget (QWidget* parent, const char* name, WFlags fl) - : QFrame(parent, name, WStyle_Customize) -{ - myMinU = myMinV = myMaxU = myMaxV = 0; - setMinimumHeight(150); - repaint(); -} - -//================================================================================= -// function : ~SMESHGUI_PatternWidget() -// purpose : -//================================================================================= -SMESHGUI_PatternWidget::~SMESHGUI_PatternWidget() -{ -} - -//================================================================================= -// function : SetPoints() -// purpose : -//================================================================================= -void SMESHGUI_PatternWidget::SetPoints (PointVector thePoints, - QValueVector theKeys, - ConnectivityVector theConnections) -{ - myPoints = thePoints; - myKeys = theKeys; - myConnections = theConnections; - - if (!thePoints.size()) - return; - - myMinU = myMaxU = (thePoints[0]).x; - myMinV = myMaxV = (thePoints[0]).y; - double x, y; - - for (int i = 1; i < thePoints.size(); i++) { - x = (thePoints[i]).x; - y = (thePoints[i]).y; - - if (myMinU > x) - myMinU = x; - if (myMaxU < x) - myMaxU = x; - if (myMinV > y) - myMinV = y; - if (myMaxV < y) - myMaxV = y; - } - - repaint(); -} - -static const int Shift = 4; // shift of the point number from point -static const int Border = 20; - -//================================================================================= -// function : paintEvent() -// purpose : -//================================================================================= -void SMESHGUI_PatternWidget::paintEvent (QPaintEvent*) -{ - QPainter paint (this); - paint.setBrush(Qt::SolidPattern); - - //Draw points - const int aRadius = 3; // radius of a point - - for (int i = 0; i < myKeys.size() && i < myPoints.size(); i++) { - SMESH::PointStruct aPoint = myPoints[ myKeys[i] ]; - QPoint aQPnt = MapCoords(aPoint.x, aPoint.y); - - paint.drawPie(aQPnt.x() - aRadius, aQPnt.y() - aRadius, aRadius*2, aRadius*2, 5760, 5760); - paint.drawText(aQPnt.x() + Shift, aQPnt.y() - Shift, QString::number(i+1)); - } - - //Draw lines - for (int i = 0; i < myConnections.size(); i++) { - QValueVector aCVector = myConnections[i]; - - if (aCVector.size() == 0) - continue; - - SMESH::PointStruct aPoint = myPoints[ aCVector[0] ]; - const QPoint aBeginPnt = MapCoords(aPoint.x, aPoint.y); - QPoint aFirstPnt = aBeginPnt, aSecondPnt; - - for (int j = 1; j < aCVector.size(); j++) { - aPoint = myPoints[ aCVector[j] ]; - aSecondPnt = MapCoords(aPoint.x, aPoint.y); - paint.drawLine(aFirstPnt, aSecondPnt); - aFirstPnt = aSecondPnt; - } - - paint.drawLine(aBeginPnt, aSecondPnt); - } -} - -//================================================================================= -// function : MapCoords() -// purpose : -//================================================================================= -QPoint SMESHGUI_PatternWidget::MapCoords (const double u, const double v) -{ - int aWidth = width() - 2*Border; - int aHeight = height() - 2*Border; - - double aUBound = myMaxU - myMinU; - double aVBound = myMaxV - myMinV; - - double aUScale = aWidth/aUBound; - double aVScale = aHeight/aVBound; - - double aScale; - aUScale <= aVScale ? aScale = aUScale : aScale = aVScale; - - double aUMiddle = (myMaxU + myMinU)/2; - double aVMiddle = (myMaxV + myMinV)/2; - - int x = int(aWidth/2 + (u - aUMiddle)*aScale + Border - Shift); - - int y = int(aHeight/2 + (aVMiddle - v)*aScale + Border + Shift); - - QPoint aPoint = QPoint(x, y); - - return aPoint; -} diff --git a/src/SMESHGUI/SMESHGUI_PatternWidget.h b/src/SMESHGUI/SMESHGUI_PatternWidget.h deleted file mode 100644 index ddab7433b..000000000 --- a/src/SMESHGUI/SMESHGUI_PatternWidget.h +++ /dev/null @@ -1,74 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_PatternWidget.h -// Author : Michael ZORIN -// Module : SMESH -// $Header: - -#ifndef WIDGET_PATTERN_H -#define WIDGET_PATTERN_H - -#include -#include - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) - -typedef QValueVector PointVector; -typedef QValueVector< QValueVector > ConnectivityVector; - -class QPoint; - -//================================================================================= -// class : SMESHGUI_PatternWidget -// purpose : -//================================================================================= -class SMESHGUI_PatternWidget : public QFrame -{ - Q_OBJECT - -public: - SMESHGUI_PatternWidget( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); - - ~SMESHGUI_PatternWidget(); - - void SetPoints( PointVector thePoints, QValueVector theKeys, ConnectivityVector theConnections ); - -private : - PointVector myPoints; - QValueVector myKeys; - ConnectivityVector myConnections; - - double myMinU, myMaxU, myMinV, myMaxV; - -private slots: - -protected: - void paintEvent( QPaintEvent * ); - QPoint MapCoords( const double u, const double v ); -}; - -#endif // WIDGET_PATTERN_H - diff --git a/src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx b/src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx deleted file mode 100755 index b589e15d3..000000000 --- a/src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx +++ /dev/null @@ -1,202 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_PrecisionDlg.cxx -// Author : Sergey LITONIN -// Module : SMESH - -#include "SMESHGUI_PrecisionDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_Utils.h" - -#include "SUIT_Desktop.h" -#include "SUIT_ResourceMgr.h" - -#include -#include -#include -#include -#include -#include - -#define SPACING 5 -#define MARGIN 10 -#define DEFAULT_VAL 10 -#define RANGE 128 - -/*! - * Class : SMESHGUI_PrecisionDlg - * Description : Dialog to specify precision of mesh quality controls - */ - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::SMESHGUI_PrecisionDlg -// Purpose : Constructor -//======================================================================= -SMESHGUI_PrecisionDlg::SMESHGUI_PrecisionDlg ( SMESHGUI* theModule ) - : QDialog( SMESH::GetDesktop( theModule ), "SMESHGUI_PrecisionDlg", true, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - setCaption(tr("CAPTION")); - - QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING); - - QFrame* aMainFrame = createMainFrame (this); - QFrame* aBtnFrame = createButtonFrame(this); - - aDlgLay->addWidget(aMainFrame); - aDlgLay->addWidget(aBtnFrame); - - aDlgLay->setStretchFactor(aMainFrame, 1); - - setMinimumWidth((int)(QFontMetrics(font()).width(tr("CAPTION")) * 1.5)); - - Init(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::~SMESHGUI_PrecisionDlg -// Purpose : Destructor -//======================================================================= -SMESHGUI_PrecisionDlg::~SMESHGUI_PrecisionDlg() -{ -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::createButtonFrame -// Purpose : Create frame containing buttons -//======================================================================= -QFrame* SMESHGUI_PrecisionDlg::createButtonFrame (QWidget* theParent) -{ - QGroupBox* aGrp = new QGroupBox (1, Qt::Vertical, theParent); - aGrp->setFrameStyle(QFrame::NoFrame); - aGrp->setInsideMargin(0); - - myOKBtn = new QPushButton (tr("SMESH_BUT_OK"), aGrp); - - QLabel* aLbl = new QLabel (aGrp); - aLbl->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - - myCancelBtn = new QPushButton (tr("SMESH_BUT_CANCEL"), aGrp); - - connect(myOKBtn, SIGNAL(clicked()), SLOT(onOk())); - connect(myCancelBtn, SIGNAL(clicked()), SLOT(onClose())); - - return aGrp; -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg:: createMainFrame -// Purpose : Create frame containing dialog's input fields -//======================================================================= -QFrame* SMESHGUI_PrecisionDlg::createMainFrame (QWidget* theParent) -{ - QGroupBox* aGrp = new QGroupBox(2, Qt::Horizontal, theParent); - new QLabel (tr("PRECISION"), aGrp); - mySpinBox = new QSpinBox (0, RANGE, 1, aGrp); - myNotUseChk = new QCheckBox (tr("NOT_USE"), aGrp); - - connect(myNotUseChk, SIGNAL(toggled(bool)), SLOT(onNotUse())); - - return aGrp; -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::Init -// Purpose : Initialize dialog fields -//======================================================================= -void SMESHGUI_PrecisionDlg::Init() -{ - bool isOk = false; - int aVal = DEFAULT_VAL; - SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); - if (mgr && mgr->hasValue("SMESH", "controls_precision")) { - QString aStr = mgr->stringValue("SMESH", "controls_precision"); - aVal = aStr.toInt(&isOk); - } - - mySpinBox->setValue(isOk ? aVal : DEFAULT_VAL); - myNotUseChk->setChecked(!isOk); - - onNotUse(); - - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose())); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::onOk -// Purpose : SLOT. Called when OK button pressed -//======================================================================= -void SMESHGUI_PrecisionDlg::onOk() -{ - SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); - if (myNotUseChk->isChecked()) { - if (mgr) { - mgr->remove("SMESH", "controls_precision"); - } - SMESH::SetControlsPrecision(-1); - } else { - mySpinBox->clearFocus(); - int aVal = mySpinBox->value(); - if (mgr) { - mgr->setValue("SMESH", "controls_precision", QString("%1").arg(aVal)); - } - SMESH::SetControlsPrecision(aVal); - } - - disconnect(mySMESHGUI, 0, this, 0); - mySMESHGUI->ResetState() ; - accept(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::onClose -// Purpose : SLOT. Called when "Cancel" button pressed -//======================================================================= -void SMESHGUI_PrecisionDlg::onClose() -{ - disconnect( mySMESHGUI, 0, this, 0); - reject(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::closeEvent -// Purpose : -//======================================================================= -void SMESHGUI_PrecisionDlg::closeEvent (QCloseEvent*) -{ - onClose(); -} - -//======================================================================= -// name : SMESHGUI_PrecisionDlg::onNotUse -// Purpose : SLOT. Called when state of "Do not use" check box changed -//======================================================================= -void SMESHGUI_PrecisionDlg::onNotUse() -{ - mySpinBox->setEnabled(!myNotUseChk->isChecked()); -} diff --git a/src/SMESHGUI/SMESHGUI_PrecisionDlg.h b/src/SMESHGUI/SMESHGUI_PrecisionDlg.h deleted file mode 100755 index 976db3091..000000000 --- a/src/SMESHGUI/SMESHGUI_PrecisionDlg.h +++ /dev/null @@ -1,97 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_PrecisionDlg.h -// Author : Sergey LITONIN -// Module : SMESH - - -#ifndef SMESHGUI_PrecisionDlg_H -#define SMESHGUI_PrecisionDlg_H - -#include - -class QSpinBox; -class QPushButton; -class QCheckBox; -class QFrame; -class SMESHGUI; - -/* - Class : SMESHGUI_PrecisionDlg - Description : Dialog to specify precision of mesh quality controls -*/ - -class SMESHGUI_PrecisionDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_PrecisionDlg( SMESHGUI* ); - - virtual ~SMESHGUI_PrecisionDlg(); - - void Init(); - -private slots: - - void onOk(); - void onClose(); - void onNotUse(); - -private: - - QFrame* createButtonFrame( QWidget* ); - QFrame* createMainFrame( QWidget* ); - void closeEvent( QCloseEvent* ); - -private: - SMESHGUI* mySMESHGUI; - QSpinBox* mySpinBox; - QPushButton* myOKBtn; - QPushButton* myCancelBtn; - QCheckBox* myNotUseChk; - -}; - -#endif - - - - - - - - - - - - - - - - - - - - diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx deleted file mode 100644 index d51137871..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx +++ /dev/null @@ -1,396 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Preferences_ColorDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_Preferences_ColorDlg.h" -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" - -#include "utilities.h" - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SUIT_Desktop.h" - -using namespace std; - -//================================================================================= -// function : SMESHGUI_Preferences_ColorDlg() -// purpose : Constructs a SMESHGUI_Preferences_ColorDlg which is a child -// of 'parent', with the name 'name' and widget flags set to 'f' -// The dialog will by default be modeless, unless you -// set'modal' to TRUE to construct a modal dialog. -//================================================================================= -SMESHGUI_Preferences_ColorDlg::SMESHGUI_Preferences_ColorDlg( SMESHGUI* theModule, const char* name) - : QDialog( SMESH::GetDesktop( theModule ), name, true, WStyle_Customize | - WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - if (!name) - setName("SMESHGUI_Preferences_ColorDlg"); - setCaption(tr("Preferences - Set Color")); - setSizeGripEnabled(TRUE); - QGridLayout* SMESHGUI_Preferences_ColorDlgLayout = new QGridLayout(this); - SMESHGUI_Preferences_ColorDlgLayout->setSpacing(6); - SMESHGUI_Preferences_ColorDlgLayout->setMargin(11); - - ButtonGroup1 = new QButtonGroup(tr("Elements"), this, "ButtonGroup1"); - ButtonGroup1->setColumnLayout(0, Qt::Vertical); - ButtonGroup1->layout()->setSpacing(0); - ButtonGroup1->layout()->setMargin(0); - QGridLayout* ButtonGroup1Layout = new QGridLayout(ButtonGroup1->layout()); - ButtonGroup1Layout->setAlignment(Qt::AlignTop); - ButtonGroup1Layout->setSpacing(6); - ButtonGroup1Layout->setMargin(11); - - TextLabel_Fill = new QLabel(tr("Fill"), ButtonGroup1, "TextLabel_2D_Fill"); - ButtonGroup1Layout->addWidget(TextLabel_Fill, 0, 0); - - btnFillColor = new QPushButton(ButtonGroup1, "btnFillColor"); - btnFillColor->setFixedSize(QSize(25, 25)); - ButtonGroup1Layout->addWidget(btnFillColor, 0, 1); - - TextLabel_Outine = new QLabel(tr("Outline"), ButtonGroup1, "TextLabel_2D_Outine"); - ButtonGroup1Layout->addWidget(TextLabel_Outine, 0, 2); - - btnOutlineColor = new QPushButton(ButtonGroup1, "btnOutlineColor"); - btnOutlineColor->setFixedSize(QSize(25, 25)); - ButtonGroup1Layout->addWidget(btnOutlineColor, 0, 3); - - TextLabel_Width = new QLabel(tr("Width"), ButtonGroup1, "TextLabel_2D_Width"); - ButtonGroup1Layout->addWidget(TextLabel_Width, 0, 4); - - SpinBox_Width = new QSpinBox(0, 5, 1, ButtonGroup1, "SpinBox_Width"); - SpinBox_Width->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - SpinBox_Width->setWrapping(FALSE); - SpinBox_Width->setButtonSymbols(QSpinBox::PlusMinus); - ButtonGroup1Layout->addWidget(SpinBox_Width, 0, 5); - - TextLabel_BackFace = new QLabel(tr("Back Face"), ButtonGroup1, "TextLabel_BackFace"); - ButtonGroup1Layout->addWidget(TextLabel_BackFace, 1, 0); - - btnBackFaceColor = new QPushButton(ButtonGroup1, "btnBackFaceColor"); - btnBackFaceColor->setFixedSize(QSize(25, 25)); - ButtonGroup1Layout->addWidget(btnBackFaceColor, 1, 1); - - TextLabel_ShrinkCoeff = new QLabel(tr("Shrink coef."), ButtonGroup1, "TextLabel_ShrinkCoeff"); - ButtonGroup1Layout->addWidget(TextLabel_ShrinkCoeff, 2, 0); - - SpinBox_Shrink = new QSpinBox(20, 100, 1, ButtonGroup1, "SpinBox_Shrink"); - SpinBox_Shrink->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - SpinBox_Shrink->setButtonSymbols(QSpinBox::PlusMinus); - ButtonGroup1Layout->addMultiCellWidget(SpinBox_Shrink, 2, 2, 1, 5); - - SMESHGUI_Preferences_ColorDlgLayout->addWidget(ButtonGroup1, 0, 0); - - ButtonGroup2 = new QButtonGroup(tr("Nodes"), this, "ButtonGroup2"); - ButtonGroup2->setColumnLayout(0, Qt::Vertical); - ButtonGroup2->layout()->setSpacing(0); - ButtonGroup2->layout()->setMargin(0); - QGridLayout* ButtonGroup2Layout = new QGridLayout(ButtonGroup2->layout()); - ButtonGroup2Layout->setAlignment(Qt::AlignTop); - ButtonGroup2Layout->setSpacing(6); - ButtonGroup2Layout->setMargin(11); - - TextLabel_Nodes_Color = new QLabel(tr("Color"), ButtonGroup2, "TextLabel_Nodes_Color"); - ButtonGroup2Layout->addWidget(TextLabel_Nodes_Color, 0, 0); - - btnNodeColor = new QPushButton(ButtonGroup2, "btnNodeColor"); - btnNodeColor->setFixedSize(QSize(25, 25)); - ButtonGroup2Layout->addWidget(btnNodeColor, 0, 1); - - TextLabel_Nodes_Size = new QLabel(tr("Size"), ButtonGroup2, "TextLabel_Nodes_Size"); - ButtonGroup2Layout->addWidget(TextLabel_Nodes_Size, 0, 2); - - SpinBox_Nodes_Size = new QSpinBox(0, 5, 1, ButtonGroup2, "SpinBox_Nodes_Size"); - SpinBox_Nodes_Size->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - SpinBox_Nodes_Size->setWrapping(FALSE); - SpinBox_Nodes_Size->setButtonSymbols(QSpinBox::PlusMinus); - ButtonGroup2Layout->addWidget(SpinBox_Nodes_Size, 0, 3); - - SMESHGUI_Preferences_ColorDlgLayout->addWidget(ButtonGroup2, 1, 0); - - GroupButtons = new QButtonGroup(this, "GroupButtons"); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - - buttonOk = new QPushButton(tr("&OK"), GroupButtons, "buttonOk"); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - - GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 1); - - buttonCancel = new QPushButton(tr("&Cancel"), GroupButtons, "buttonCancel"); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 2); - - SMESHGUI_Preferences_ColorDlgLayout->addWidget(GroupButtons, 2, 0); - - Init(); -} - -//================================================================================= -// function : ~SMESHGUI_Preferences_ColorDlg() -// purpose : Destructor -//================================================================================= -SMESHGUI_Preferences_ColorDlg::~SMESHGUI_Preferences_ColorDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::Init() -{ - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - - connect(btnFillColor, SIGNAL(clicked()), this, SLOT(SelectFillColor())); - connect(btnOutlineColor, SIGNAL(clicked()), this, SLOT(SelectOutlineColor())); - connect(btnNodeColor, SIGNAL(clicked()), this, SLOT(SelectNodeColor())); - connect(btnBackFaceColor, SIGNAL(clicked()), this, SLOT(SelectBackFaceColor())); - - connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - - /* Move widget on the botton right corner of main widget */ - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : SelectFillColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectFillColor() -{ - QColor color = btnFillColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnFillColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnFillColor->setPalette(pal); - } -} - -//================================================================================= -// function : SelectBackFaceColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectBackFaceColor() -{ - QColor color = btnBackFaceColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnBackFaceColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnBackFaceColor->setPalette(pal); - } -} - -//================================================================================= -// function : SelectOutlineColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectOutlineColor() -{ - QColor color = btnOutlineColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnOutlineColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnOutlineColor->setPalette(pal); - } -} - -//================================================================================= -// function : SelectNodeColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SelectNodeColor() -{ - QColor color = btnNodeColor->palette().active().button(); - color = QColorDialog::getColor(color); - if (color.isValid()) { - QPalette pal = btnNodeColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnNodeColor->setPalette(pal); - } -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::ClickOnOk() -{ - mySMESHGUI->ResetState(); - accept(); -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::ClickOnCancel() -{ - mySMESHGUI->ResetState(); - reject(); -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::DeactivateActiveDialog() -{ -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::closeEvent (QCloseEvent*) -{ - this->ClickOnCancel(); /* same than click on cancel button */ -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::ActivateThisDialog() -{ - /* Emit a signal to deactivate any active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog(); -} - -//================================================================================= -// function : SetColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SetColor (int type, QColor color) -{ - switch (type) { - case 1 : // fill - { - QPalette pal = btnFillColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnFillColor->setPalette(pal); - break; - } - case 2 : // outline - { - QPalette pal = btnOutlineColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnOutlineColor->setPalette(pal); - break; - } - case 3 : // node - { - QPalette pal = btnNodeColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnNodeColor->setPalette(pal); - break; - } - case 4 : // back face - { - QPalette pal = btnBackFaceColor->palette(); - pal.setColor(QColorGroup::Button, color); - btnBackFaceColor->setPalette(pal); - break; - } - } -} - -//================================================================================= -// function : GetColor() -// purpose : -//================================================================================= -QColor SMESHGUI_Preferences_ColorDlg::GetColor (int type) -{ - QColor color; - switch (type) { - case 1 : color = btnFillColor->palette().active().button(); break; // fill - case 2 : color = btnOutlineColor->palette().active().button(); break; // outline - case 3 : color = btnNodeColor->palette().active().button(); break; // node - case 4 : color = btnBackFaceColor->palette().active().button(); break; // back face - } - return color; -} - -//================================================================================= -// function : SetIntValue() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_ColorDlg::SetIntValue (int type, int value) -{ - switch (type) { - case 1 : SpinBox_Width->setValue(value); break; // width - case 2 : SpinBox_Nodes_Size->setValue(value); break; // nodes size = value; break; - case 3 : SpinBox_Shrink->setValue(value); break; // shrink coeff - } -} - -//================================================================================= -// function : GetIntValue() -// purpose : -//================================================================================= -int SMESHGUI_Preferences_ColorDlg::GetIntValue (int type) -{ - int res = 0; - switch (type) { - case 1 : res = SpinBox_Width->value(); break; // width - case 2 : res = SpinBox_Nodes_Size->value(); break; // nodes size - case 3 : res = SpinBox_Shrink->value(); break; // shrink coeff - } - return res; -} diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h deleted file mode 100644 index 43702b2ac..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h +++ /dev/null @@ -1,105 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Preferences_ColorDlg.h -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef SMESHGUI_PREFERENCES_COLORDLG_H -#define SMESHGUI_PREFERENCES_COLORDLG_H - -// SALOME Includes -//#include "SUIT_Config.h" -//#include "SUIT_Settings.h" - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Gen) - -// QT Includes -#include - -class QButtonGroup; -class QFrame; -class QLabel; -class QPushButton; -class QSpinBox; -class QColor; -class SMESHGUI; - -class SMESHGUI_Preferences_ColorDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_Preferences_ColorDlg( SMESHGUI*, const char* name = 0 ); - ~SMESHGUI_Preferences_ColorDlg(); - - void SetColor(int type, QColor color); - QColor GetColor(int type); - void SetIntValue(int type, int value); - int GetIntValue(int type); - -private: - void closeEvent( QCloseEvent* e ) ; - void Init(); - -private slots: -// void RadioButtonClicked(int radioButtonId); - void ClickOnOk(); - void ClickOnCancel(); - void DeactivateActiveDialog() ; - void ActivateThisDialog() ; - - void SelectFillColor(); - void SelectBackFaceColor(); - void SelectOutlineColor(); - void SelectNodeColor(); - -private: - SMESH::SMESH_Gen_var myCompMesh ; - SMESHGUI* mySMESHGUI ; - - QButtonGroup* ButtonGroup1; - QLabel* TextLabel_Fill; - QPushButton* btnFillColor; - QLabel* TextLabel_Outine; - QPushButton* btnOutlineColor; - QLabel* TextLabel_Width; - QSpinBox* SpinBox_Width; - QLabel* TextLabel_BackFace; - QPushButton* btnBackFaceColor; - QLabel* TextLabel_ShrinkCoeff; - QSpinBox* SpinBox_Shrink; - QButtonGroup* ButtonGroup2; - QLabel* TextLabel_Nodes_Color; - QPushButton* btnNodeColor; - QLabel* TextLabel_Nodes_Size; - QSpinBox* SpinBox_Nodes_Size; - QButtonGroup* GroupButtons; - QPushButton* buttonOk; - QPushButton* buttonCancel; -}; - -#endif // SMESHGUI_PREFERENCES_COLORDLG_H diff --git a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx deleted file mode 100644 index 7606ccf2b..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx +++ /dev/null @@ -1,314 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Preferences_SelectionDlg.cxx -// Author : Natalia KOPNOVA -// Module : SMESH -// $Header$ - -#include "SMESHGUI_Preferences_SelectionDlg.h" -#include "SMESHGUI.h" - -#include "SMESHGUI_Utils.h" - -#include "SUIT_Desktop.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_LineEdit -// purpose : -//================================================================================= -SMESHGUI_LineEdit::SMESHGUI_LineEdit(QWidget* parent, const char *name) - : QLineEdit(parent, name) -{ -} - -SMESHGUI_LineEdit::SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char *name) - : QLineEdit(text, parent, name) -{ -} - -void SMESHGUI_LineEdit::focusOutEvent(QFocusEvent* e) -{ - const QValidator* aVal = validator(); - QString aText = text(); - int aCurPos = cursorPosition(); - if (aVal && aVal->validate(aText, aCurPos) != QValidator::Acceptable) { - QString aValid = aText; - aVal->fixup(aValid); - if (aText != aValid) { - setText(aValid); - update(); - return; - } - } - QLineEdit::focusOutEvent(e); -} - - -//================================================================================= -// class : SMESHGUI_DoubleValidator -// purpose : -//================================================================================= -SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(QObject * parent, const char *name) - : QDoubleValidator(parent, name) -{ -} - -SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(double bottom, double top, int decimals, - QObject * parent, const char *name) - : QDoubleValidator(bottom, top, decimals, parent, name) -{ -} - -void SMESHGUI_DoubleValidator::fixup(QString& theText) const -{ - bool ok; - double aValue = theText.toDouble(&ok); - if (ok) { - if (aValue < bottom()) - theText = QString::number(bottom(), 'g', decimals()); - if (aValue > top()) - theText = QString::number(top(), 'g', decimals()); - } -} - - -//================================================================================= -// class : SMESHGUI_Preferences_SelectionDlg() -// purpose : -//================================================================================= -SMESHGUI_Preferences_SelectionDlg::SMESHGUI_Preferences_SelectionDlg( SMESHGUI* theModule, const char* name ) - : QDialog( SMESH::GetDesktop( theModule ), name, true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ), - mySMESHGUI( theModule ) -{ - if ( !name ) setName( "SMESHGUI_Preferences_SelectionDlg" ); - setCaption( tr( "SMESH_PREF_SELECTION" ) ); - - QVBoxLayout* aMainLayout = new QVBoxLayout(this, 11, 6); - QLabel* aLabel; - - /***************************************************************/ - QGroupBox* aSelectBox = new QGroupBox(4, Qt::Horizontal, this, "selection"); - aSelectBox->setTitle(tr("SMESH_SELECTION")); - - aLabel = new QLabel(aSelectBox, "selection color label"); - aLabel->setText(tr("SMESH_OUTLINE_COLOR")); - myColor[2] = new QPushButton(aSelectBox, "outline color"); - myColor[2]->setFixedSize(QSize(25, 25)); - - aSelectBox->addSpace(0); - aSelectBox->addSpace(0); - - aLabel = new QLabel(aSelectBox, "selection color label"); - aLabel->setText(tr("SMESH_ELEMENTS_COLOR")); - myColor[1] = new QPushButton(aSelectBox, "elements color"); - myColor[1]->setFixedSize(QSize(25, 25)); - - aLabel = new QLabel(aSelectBox, "selection width label"); - aLabel->setText(tr("SMESH_WIDTH")); - myWidth[1] = new QSpinBox(0, 5, 1, aSelectBox, "selection width"); - myWidth[1]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - myWidth[1]->setButtonSymbols(QSpinBox::PlusMinus); - myWidth[1]->setMinimumWidth(50); - - /***************************************************************/ - QGroupBox* aPreSelectBox = new QGroupBox(1, Qt::Vertical, this, "preselection"); - aPreSelectBox->setTitle(tr("SMESH_PRESELECTION")); - - aLabel = new QLabel(aPreSelectBox, "preselection color label"); - aLabel->setText(tr("SMESH_HILIGHT_COLOR")); - myColor[0] = new QPushButton(aPreSelectBox, "preselection color"); - myColor[0]->setFixedSize(QSize(25, 25)); - - aLabel = new QLabel(aPreSelectBox, "preselection width label"); - aLabel->setText(tr("SMESH_WIDTH")); - myWidth[0] = new QSpinBox(0, 5, 1, aPreSelectBox, "preselection width"); - myWidth[0]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - myWidth[0]->setButtonSymbols(QSpinBox::PlusMinus); - myWidth[0]->setMinimumWidth(50); - - /***************************************************************/ - QGroupBox* aPrecisionBox = new QGroupBox(1, Qt::Vertical, this, "preselection"); - aPrecisionBox->setTitle(tr("SMESH_PRECISION")); - QDoubleValidator* aValidator = new SMESHGUI_DoubleValidator(aPrecisionBox); - aValidator->setBottom(0.001); - aValidator->setDecimals(6); - - aLabel = new QLabel(aPrecisionBox, "node tol label"); - aLabel->setText(tr("SMESH_NODES")); - myPrecision[0] = new SMESHGUI_LineEdit(aPrecisionBox, "node precision"); - myPrecision[0]->setValidator(aValidator); - - aLabel = new QLabel(aPrecisionBox, "item tol label"); - aLabel->setText(tr("SMESH_ELEMENTS")); - myPrecision[1] = new SMESHGUI_LineEdit(aPrecisionBox, "item precision"); - myPrecision[1]->setValidator(aValidator); - - /***************************************************************/ - QFrame* aButtons = new QFrame(this, "button box"); - aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken); - QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6); - aBtnLayout->setAutoAdd(false); - - QPushButton* aOKBtn = new QPushButton(aButtons, "ok"); - aOKBtn->setText(tr("SMESH_BUT_OK")); - aOKBtn->setAutoDefault(true); - aOKBtn->setDefault(true); - QPushButton* aCloseBtn = new QPushButton(aButtons, "close"); - aCloseBtn->setText(tr("SMESH_BUT_CLOSE")); - aCloseBtn->setAutoDefault(true); - - aBtnLayout->addWidget(aOKBtn); - aBtnLayout->addStretch(); - aBtnLayout->addWidget(aCloseBtn); - - /***************************************************************/ - aMainLayout->addWidget(aSelectBox); - aMainLayout->addWidget(aPreSelectBox); - aMainLayout->addWidget(aPrecisionBox); - aMainLayout->addWidget(aButtons); - - for (int i = 0; i < 3; i++) - connect(myColor[i], SIGNAL(clicked()), this, SLOT(onSelectColor())); - - connect(aOKBtn, SIGNAL(clicked()), this, SLOT(accept())); - connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(reject())); - - /* Move widget on the botton right corner of main widget */ - int x, y ; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); -} - -//================================================================================= -// function : ~SMESHGUI_Preferences_SelectionDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_Preferences_SelectionDlg::~SMESHGUI_Preferences_SelectionDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::closeEvent( QCloseEvent* e ) -{ - reject(); -} - -//================================================================================= -// function : onSelectColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::onSelectColor() -{ - QPushButton* aSender = (QPushButton*)sender(); - QColor aColor = aSender->palette().active().button(); - aColor = QColorDialog::getColor(aColor, this); - if (aColor.isValid()) { - QPalette aPal = aSender->palette(); - aPal.setColor(QColorGroup::Button, aColor); - aSender->setPalette(aPal); - } -} - -//================================================================================= -// function : SetColor() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::SetColor(int type, QColor color) -{ - if (type > 0 && type <= 3) { - QPalette aPal = myColor[type-1]->palette(); - aPal.setColor(QColorGroup::Button, color); - myColor[type-1]->setPalette(aPal); - } -} - -//================================================================================= -// function : GetColor() -// purpose : -//================================================================================= -QColor SMESHGUI_Preferences_SelectionDlg::GetColor(int type) -{ - QColor aColor; - if (type > 0 && type <= 3) - aColor = myColor[type-1]->palette().active().button(); - return aColor; -} - -//================================================================================= -// function : SetWidth() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::SetWidth(int type, int value) -{ - if (type > 0 && type <= 2) - myWidth[type-1]->setValue(value); -} - -//================================================================================= -// function : GetWidth() -// purpose : -//================================================================================= -int SMESHGUI_Preferences_SelectionDlg::GetWidth(int type) -{ - if (type > 0 && type <= 2) - return myWidth[type-1]->value(); - return 0; -} - -//================================================================================= -// function : SetPrecision() -// purpose : -//================================================================================= -void SMESHGUI_Preferences_SelectionDlg::SetPrecision(int type, double value) -{ - if (type > 0 && type <= 2) - myPrecision[type-1]->setText(QString::number(value)); -} - -//================================================================================= -// function : GetPrecision() -// purpose : -//================================================================================= -double SMESHGUI_Preferences_SelectionDlg::GetPrecision(int type) -{ - if (type > 0 && type <= 2) - return myPrecision[type-1]->text().toDouble(); - return 0; -} diff --git a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h deleted file mode 100644 index 07b7a644a..000000000 --- a/src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h +++ /dev/null @@ -1,99 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platorm.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Preferences_SelectionDlg.h -// Author : Natalia KOPNOVA -// Module : SMESH -// $Header$ - -#ifndef SMESHGUI_PREFERENCES_SELECTIONDLG_H -#define SMESHGUI_PREFERENCES_SELECTIONDLG_H - - -// QT Includes -#include -#include -#include - -class QPushButton; -class QSpinBox; -class QColor; -class SMESHGUI; - -class SMESHGUI_LineEdit : public QLineEdit -{ - Q_OBJECT - - public: - SMESHGUI_LineEdit(QWidget* parent, const char* name = 0); - SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char* name = 0); - - ~SMESHGUI_LineEdit() {}; - - protected: - void focusOutEvent(QFocusEvent* e); -}; - -class SMESHGUI_DoubleValidator : public QDoubleValidator -{ - Q_OBJECT - - public: - SMESHGUI_DoubleValidator(QObject* parent, const char* name = 0); - SMESHGUI_DoubleValidator(double bottom, double top, int decimals, - QObject* parent, const char* name = 0); - - ~SMESHGUI_DoubleValidator() {}; - - void fixup(QString& text) const; -}; - -class SMESHGUI_Preferences_SelectionDlg : public QDialog -{ - Q_OBJECT - -public: - SMESHGUI_Preferences_SelectionDlg( SMESHGUI*, const char* name = 0 ); - ~SMESHGUI_Preferences_SelectionDlg(); - - void SetColor(int type, QColor color); - QColor GetColor(int type); - void SetWidth(int type, int value); - int GetWidth(int type); - void SetPrecision(int type, double value); - double GetPrecision(int type); - -private: - void closeEvent( QCloseEvent* e ) ; - -private slots: - void onSelectColor(); - -private: - SMESHGUI* mySMESHGUI; - QPushButton* myColor[3]; - QSpinBox* myWidth[2]; - QLineEdit* myPrecision[2]; -}; - -#endif // SMESHGUI_PREFERENCES_SELECTIONDLG_H diff --git a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx deleted file mode 100644 index 16529726e..000000000 --- a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx +++ /dev/null @@ -1,486 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_RemoveElementsDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_RemoveElementsDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_IdValidator.h" - -#include "SMESH_Actor.h" -#include "SMDS_Mesh.hxx" - -#include "SUIT_ResourceMgr.h" -#include "SUIT_Desktop.h" - -#include "SVTK_Selector.h" -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" -#include "SALOME_ListIO.hxx" - -#include "utilities.h" - -// OCCT Includes -#include -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_RemoveElementsDlg() -// purpose : -//================================================================================= -SMESHGUI_RemoveElementsDlg -::SMESHGUI_RemoveElementsDlg (SMESHGUI* theModule, - const char* name, - bool modal, - WFlags fl) - : QDialog(SMESH::GetDesktop(theModule), - name, - modal, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), - mySelector(SMESH::GetViewWindow(theModule)->GetSelector()), - mySelectionMgr(SMESH::GetSelectionMgr(theModule)), - mySMESHGUI(theModule), - myBusy(false) -{ - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_REM_ELEMENT"))); - QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - - if (!name) - setName("SMESHGUI_RemoveElementsDlg"); - resize(303, 185); - setCaption(tr("SMESH_REMOVE_ELEMENTS_TITLE")); - setSizeGripEnabled(TRUE); - SMESHGUI_RemoveElementsDlgLayout = new QGridLayout(this); - SMESHGUI_RemoveElementsDlgLayout->setSpacing(6); - SMESHGUI_RemoveElementsDlgLayout->setMargin(11); - - /***************************************************************/ - GroupConstructors = new QButtonGroup(this, "GroupConstructors"); - GroupConstructors->setTitle(tr("SMESH_ELEMENTS" )); - GroupConstructors->setExclusive(TRUE); - GroupConstructors->setColumnLayout(0, Qt::Vertical); - GroupConstructors->layout()->setSpacing(0); - GroupConstructors->layout()->setMargin(0); - GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout()); - GroupConstructorsLayout->setAlignment(Qt::AlignTop); - GroupConstructorsLayout->setSpacing(6); - GroupConstructorsLayout->setMargin(11); - Constructor1 = new QRadioButton(GroupConstructors, "Constructor1"); - Constructor1->setText(tr("" )); - Constructor1->setPixmap(image0); - Constructor1->setChecked(TRUE); - Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth())); - Constructor1->setMinimumSize(QSize(50, 0)); - GroupConstructorsLayout->addWidget(Constructor1, 0, 0); - QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupConstructorsLayout->addItem(spacer, 0, 1); - SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupConstructors, 0, 0); - - /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setGeometry(QRect(10, 10, 281, 48)); - GroupButtons->setTitle(tr("" )); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - buttonCancel = new QPushButton(GroupButtons, "buttonCancel"); - buttonCancel->setText(tr("SMESH_BUT_CLOSE" )); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - buttonApply = new QPushButton(GroupButtons, "buttonApply"); - buttonApply->setText(tr("SMESH_BUT_APPLY" )); - buttonApply->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonApply, 0, 1); - QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupButtonsLayout->addItem(spacer_9, 0, 2); - buttonOk = new QPushButton(GroupButtons, "buttonOk"); - buttonOk->setText(tr("SMESH_BUT_OK" )); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupButtons, 2, 0); - - /***************************************************************/ - GroupC1 = new QGroupBox(this, "GroupC1"); - GroupC1->setTitle(tr("SMESH_REMOVE" )); - GroupC1->setMinimumSize(QSize(0, 0)); - GroupC1->setFrameShape(QGroupBox::Box); - GroupC1->setFrameShadow(QGroupBox::Sunken); - GroupC1->setColumnLayout(0, Qt::Vertical); - GroupC1->layout()->setSpacing(0); - GroupC1->layout()->setMargin(0); - GroupC1Layout = new QGridLayout(GroupC1->layout()); - GroupC1Layout->setAlignment(Qt::AlignTop); - GroupC1Layout->setSpacing(6); - GroupC1Layout->setMargin(11); - TextLabelC1A1 = new QLabel(GroupC1, "TextLabelC1A1"); - TextLabelC1A1->setText(tr("SMESH_ID_ELEMENTS" )); - TextLabelC1A1->setMinimumSize(QSize(50, 0)); - TextLabelC1A1->setFrameShape(QLabel::NoFrame); - TextLabelC1A1->setFrameShadow(QLabel::Plain); - GroupC1Layout->addWidget(TextLabelC1A1, 0, 0); - SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1"); - SelectButtonC1A1->setText(tr("" )); - SelectButtonC1A1->setPixmap(image1); - SelectButtonC1A1->setToggleButton(FALSE); - GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1); - LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1"); - LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, "validator")); - GroupC1Layout->addWidget(LineEditC1A1, 0, 2); - SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupC1, 1, 0); - - Init(); /* Initialisations */ -} - -//================================================================================= -// function : ~SMESHGUI_RemoveElementsDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_RemoveElementsDlg::~SMESHGUI_RemoveElementsDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::Init() -{ - GroupC1->show(); - myConstructorId = 0; - Constructor1->setChecked(TRUE); - myEditCurrentArgument = LineEditC1A1; - - myNbOkElements = false; - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - myActor = 0; - myBusy = false; - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); - - connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); - - /* Move widget on the botton right corner of main widget */ - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); /* displays Dialog */ - - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); - - SelectionIntoArgument(); -} - -//================================================================================= -// function : ConstructorsClicked() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ConstructorsClicked (int) -{ -} - -//================================================================================= -// function : ClickOnApply() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ClickOnApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return; - if (myNbOkElements) { - QStringList aListId = QStringList::split(" ", myEditCurrentArgument->text(), false); - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(aListId.count()); - for (int i = 0; i < aListId.count(); i++) - anArrayOfIdeces[i] = aListId[ i ].toInt(); - - bool aResult = false; - try { - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - aResult = aMeshEditor->RemoveElements(anArrayOfIdeces.inout()); - } catch (...) { - } - - if (aResult) { - myEditCurrentArgument->clear(); - SMESH::UpdateView(); - } - } -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ClickOnOk() -{ - this->ClickOnApply(); - this->ClickOnCancel(); - - return; -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ClickOnCancel() -{ - mySelectionMgr->clearSelected(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - disconnect(mySelectionMgr, 0, this, 0); - mySMESHGUI->ResetState(); - reject(); - return; -} - -//======================================================================= -//function : onTextChange -//purpose : -//======================================================================= -void SMESHGUI_RemoveElementsDlg::onTextChange (const QString& theNewText) -{ - if (myBusy) - return; - myBusy = true; - - myNbOkElements = 0; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // hilight entered elements - if(myActor){ - if(SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh()){ - Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); - - TColStd_MapOfInteger newIndices; - - QStringList aListId = QStringList::split(" ", theNewText, false); - for (int i = 0; i < aListId.count(); i++) { - if(const SMDS_MeshElement *anElem = aMesh->FindElement(aListId[i].toInt())) { - newIndices.Add(anElem->GetID()); - myNbOkElements++; - } - } - - mySelector->AddOrRemoveIndex(anIO,newIndices,false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight(anIO,true,true); - } - } - - if (myNbOkElements) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); - } - - myBusy = false; -} - -//================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case -//================================================================================= -void SMESHGUI_RemoveElementsDlg::SelectionIntoArgument() -{ - if (myBusy) return; - - // clear - - myNbOkElements = false; - myActor = 0; - - myBusy = true; - myEditCurrentArgument->setText(""); - myBusy = false; - - if (!GroupButtons->isEnabled()) // inactive - return; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // get selected mesh - - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); - - int nbSel = aList.Extent(); - if (nbSel != 1) - return; - - Handle(SALOME_InteractiveObject) anIO = aList.First(); - myMesh = SMESH::GetMeshByIO(anIO); - if (myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByEntry(anIO->getEntry()); - if (!myActor) - return; - - // get selected nodes - QString aString = ""; - int nbElems = SMESH::GetNameOfSelectedElements(mySelector,anIO,aString); - if(nbElems < 1) - return; - myBusy = true; - myEditCurrentArgument->setText(aString); - myBusy = false; - - // OK - - myNbOkElements = nbElems; - - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); -} - -//================================================================================= -// function : SetEditCurrentArgument() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::SetEditCurrentArgument() -{ - QPushButton* send = (QPushButton*)sender(); - switch (myConstructorId) - { - case 0: /* default constructor */ - { - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - } - SelectionIntoArgument(); - break; - } - } - return; -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::DeactivateActiveDialog() -{ - if (GroupConstructors->isEnabled()) { - GroupConstructors->setEnabled(false); - GroupC1->setEnabled(false); - GroupButtons->setEnabled(false); - mySMESHGUI->ResetState(); // ?? - mySMESHGUI->SetActiveDialogBox(0); // ?? - } -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::ActivateThisDialog() -{ - /* Emit a signal to deactivate the active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog(); - - GroupConstructors->setEnabled(true); - GroupC1->setEnabled(true); - GroupButtons->setEnabled(true); - - mySMESHGUI->SetActiveDialogBox((QDialog*)this); // ?? - - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - - SelectionIntoArgument(); // ?? -} - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::enterEvent (QEvent*) -{ - if (!GroupConstructors->isEnabled()) - ActivateThisDialog(); -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveElementsDlg::closeEvent (QCloseEvent*) -{ - /* same than click on cancel button */ - this->ClickOnCancel(); - return; -} - -//======================================================================= -//function : hideEvent -//purpose : caused by ESC key -//======================================================================= -void SMESHGUI_RemoveElementsDlg::hideEvent (QHideEvent * e) -{ - if (!isMinimized()) - ClickOnCancel(); -} diff --git a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx deleted file mode 100644 index 5e9261eb1..000000000 --- a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx +++ /dev/null @@ -1,489 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_RemoveNodesDlg.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_RemoveNodesDlg.h" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_VTKUtils.h" -#include "SMESHGUI_MeshUtils.h" -#include "SMESHGUI_IdValidator.h" - -#include "SMESH_Actor.h" -#include "SMDS_Mesh.hxx" - -#include "SUIT_ResourceMgr.h" -#include "SUIT_Desktop.h" - -#include "SVTK_Selector.h" -#include "SVTK_ViewModel.h" -#include "SVTK_ViewWindow.h" -#include "SALOME_ListIO.hxx" - -#include "utilities.h" - -// OCCT Includes -#include -#include - -// QT Includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_RemoveNodesDlg() -// purpose : -//================================================================================= -SMESHGUI_RemoveNodesDlg -::SMESHGUI_RemoveNodesDlg(SMESHGUI* theModule, - const char* name, - bool modal, - WFlags fl) - : QDialog(SMESH::GetDesktop(theModule), - name, - modal, - WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose), - mySelector(SMESH::GetViewWindow(theModule)->GetSelector()), - mySelectionMgr(SMESH::GetSelectionMgr(theModule)), - mySMESHGUI(theModule), - myBusy(false) -{ - QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_REM_NODE"))); - QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT"))); - - if (!name) - setName("SMESHGUI_RemoveNodesDlg"); - resize(303, 185); - setCaption(tr("SMESH_REMOVE_NODES_TITLE" )); - setSizeGripEnabled(TRUE); - SMESHGUI_RemoveNodesDlgLayout = new QGridLayout(this); - SMESHGUI_RemoveNodesDlgLayout->setSpacing(6); - SMESHGUI_RemoveNodesDlgLayout->setMargin(11); - - /***************************************************************/ - GroupConstructors = new QButtonGroup(this, "GroupConstructors"); - GroupConstructors->setTitle(tr("SMESH_NODES" )); - GroupConstructors->setExclusive(TRUE); - GroupConstructors->setColumnLayout(0, Qt::Vertical); - GroupConstructors->layout()->setSpacing(0); - GroupConstructors->layout()->setMargin(0); - GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout()); - GroupConstructorsLayout->setAlignment(Qt::AlignTop); - GroupConstructorsLayout->setSpacing(6); - GroupConstructorsLayout->setMargin(11); - Constructor1 = new QRadioButton(GroupConstructors, "Constructor1"); - Constructor1->setText(tr("" )); - Constructor1->setPixmap(image0); - Constructor1->setChecked(TRUE); - Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth())); - Constructor1->setMinimumSize(QSize(50, 0)); - GroupConstructorsLayout->addWidget(Constructor1, 0, 0); - QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupConstructorsLayout->addItem(spacer, 0, 1); - SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupConstructors, 0, 0); - - /***************************************************************/ - GroupButtons = new QGroupBox(this, "GroupButtons"); - GroupButtons->setGeometry(QRect(10, 10, 281, 48)); - GroupButtons->setTitle(tr("" )); - GroupButtons->setColumnLayout(0, Qt::Vertical); - GroupButtons->layout()->setSpacing(0); - GroupButtons->layout()->setMargin(0); - GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); - GroupButtonsLayout->setAlignment(Qt::AlignTop); - GroupButtonsLayout->setSpacing(6); - GroupButtonsLayout->setMargin(11); - buttonCancel = new QPushButton(GroupButtons, "buttonCancel"); - buttonCancel->setText(tr("SMESH_BUT_CLOSE" )); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 3); - buttonApply = new QPushButton(GroupButtons, "buttonApply"); - buttonApply->setText(tr("SMESH_BUT_APPLY" )); - buttonApply->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonApply, 0, 1); - QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - GroupButtonsLayout->addItem(spacer_9, 0, 2); - buttonOk = new QPushButton(GroupButtons, "buttonOk"); - buttonOk->setText(tr("SMESH_BUT_OK" )); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupButtons, 2, 0); - - /***************************************************************/ - GroupC1 = new QGroupBox(this, "GroupC1"); - GroupC1->setTitle(tr("SMESH_REMOVE" )); - GroupC1->setMinimumSize(QSize(0, 0)); - GroupC1->setFrameShape(QGroupBox::Box); - GroupC1->setFrameShadow(QGroupBox::Sunken); - GroupC1->setColumnLayout(0, Qt::Vertical); - GroupC1->layout()->setSpacing(0); - GroupC1->layout()->setMargin(0); - GroupC1Layout = new QGridLayout(GroupC1->layout()); - GroupC1Layout->setAlignment(Qt::AlignTop); - GroupC1Layout->setSpacing(6); - GroupC1Layout->setMargin(11); - TextLabelC1A1 = new QLabel(GroupC1, "TextLabelC1A1"); - TextLabelC1A1->setText(tr("SMESH_ID_NODES" )); - TextLabelC1A1->setMinimumSize(QSize(50, 0)); - TextLabelC1A1->setFrameShape(QLabel::NoFrame); - TextLabelC1A1->setFrameShadow(QLabel::Plain); - GroupC1Layout->addWidget(TextLabelC1A1, 0, 0); - SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1"); - SelectButtonC1A1->setText(tr("" )); - SelectButtonC1A1->setPixmap(image1); - SelectButtonC1A1->setToggleButton(FALSE); - GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1); - LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1"); - LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, "validator")); - GroupC1Layout->addWidget(LineEditC1A1, 0, 2); - SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupC1, 1, 0); - - Init(); /* Initialisations */ -} - -//================================================================================= -// function : ~SMESHGUI_RemoveNodesDlg() -// purpose : Destroys the object and frees any allocated resources -//================================================================================= -SMESHGUI_RemoveNodesDlg::~SMESHGUI_RemoveNodesDlg() -{ - // no need to delete child widgets, Qt does it all for us -} - -//================================================================================= -// function : Init() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::Init() -{ - GroupC1->show(); - myConstructorId = 0; - Constructor1->setChecked(TRUE); - myEditCurrentArgument = LineEditC1A1; - - myNbOkNodes = 0; - mySMESHGUI->SetActiveDialogBox((QDialog*)this); - myActor = 0; - myBusy = false; - - /* signals and slots connections */ - connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); - connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int))); - - connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument())); - connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); - /* to close dialog if study change */ - connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); - - /* Move widget on the botton right corner of main widget */ - int x, y; - mySMESHGUI->DefineDlgPosition(this, x, y); - this->move(x, y); - this->show(); /* displays Dialog */ - - SMESH::SetPointRepresentation(true); - - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - - SelectionIntoArgument(); -} - -//================================================================================= -// function : ConstructorsClicked() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ConstructorsClicked (int) -{ -} - -//================================================================================= -// function : ClickOnApply() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ClickOnApply() -{ - if (mySMESHGUI->isActiveStudyLocked()) - return; - - if (myNbOkNodes) { - QStringList aListId = QStringList::split(" ", myEditCurrentArgument->text(), false); - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(aListId.count()); - for (int i = 0; i < aListId.count(); i++) - anArrayOfIdeces[i] = aListId[ i ].toInt(); - - bool aResult = false; - try { - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - aResult = aMeshEditor->RemoveNodes(anArrayOfIdeces.inout()); - } catch(...) { - } - - if (aResult) { - myEditCurrentArgument->clear(); - SMESH::UpdateView(); - } - - SMESH::SetPointRepresentation(true); - } -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ClickOnOk() -{ - ClickOnApply(); - ClickOnCancel(); -} - -//================================================================================= -// function : ClickOnCancel() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ClickOnCancel() -{ - mySelectionMgr->clearSelected(); - SMESH::SetPointRepresentation(false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - disconnect(mySelectionMgr, 0, this, 0); - mySMESHGUI->ResetState(); - reject(); -} - -//======================================================================= -//function : onTextChange -//purpose : -//======================================================================= -void SMESHGUI_RemoveNodesDlg::onTextChange (const QString& theNewText) -{ - if (myBusy) return; - myBusy = true; - - myNbOkNodes = 0; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // hilight entered nodes - if(myActor){ - if(SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh()){ - Handle(SALOME_InteractiveObject) anIO = myActor->getIO(); - - TColStd_MapOfInteger newIndices; - - QStringList aListId = QStringList::split(" ", theNewText, false); - for (int i = 0; i < aListId.count(); i++) { - if (const SMDS_MeshNode *aNode = aMesh->FindNode(aListId[i].toInt())) { - newIndices.Add(aNode->GetID()); - myNbOkNodes++; - } - } - - mySelector->AddOrRemoveIndex(anIO,newIndices,false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight(anIO,true,true); - } - } - - if (myNbOkNodes) { - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); - } - - myBusy = false; -} - -//================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection as changed or other case -//================================================================================= -void SMESHGUI_RemoveNodesDlg::SelectionIntoArgument() -{ - if (myBusy) return; - - // clear - - myNbOkNodes = false; - myActor = 0; - - myBusy = true; - myEditCurrentArgument->setText(""); - myBusy = false; - - if (!GroupButtons->isEnabled()) // inactive - return; - - buttonOk->setEnabled(false); - buttonApply->setEnabled(false); - - // get selected mesh - SALOME_ListIO aList; - mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); - - int nbSel = aList.Extent(); - if (nbSel != 1) - return; - - Handle(SALOME_InteractiveObject) anIO = aList.First(); - myMesh = SMESH::GetMeshByIO(anIO); - if (myMesh->_is_nil()) - return; - - myActor = SMESH::FindActorByEntry(anIO->getEntry()); - if (!myActor) - return; - - // get selected nodes - - QString aString = ""; - int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,anIO,aString); - if(nbNodes < 1) - return; - myBusy = true; - myEditCurrentArgument->setText(aString); - myBusy = false; - - // OK - - myNbOkNodes = true; - - buttonOk->setEnabled(true); - buttonApply->setEnabled(true); -} - -//================================================================================= -// function : SetEditCurrentArgument() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::SetEditCurrentArgument() -{ - QPushButton* send = (QPushButton*)sender(); - switch (myConstructorId) - { - case 0: /* default constructor */ - { - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; - } - SelectionIntoArgument(); - break; - } - } - return; -} - -//================================================================================= -// function : DeactivateActiveDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::DeactivateActiveDialog() -{ - if (GroupConstructors->isEnabled()) { - GroupConstructors->setEnabled(false); - GroupC1->setEnabled(false); - GroupButtons->setEnabled(false); - mySMESHGUI->ResetState(); // ?? - mySMESHGUI->SetActiveDialogBox(0); // ?? - } -} - -//================================================================================= -// function : ActivateThisDialog() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::ActivateThisDialog() -{ - /* Emit a signal to deactivate the active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog(); - - GroupConstructors->setEnabled(true); - GroupC1->setEnabled(true); - GroupButtons->setEnabled(true); - - mySMESHGUI->SetActiveDialogBox((QDialog*)this); // ?? - - SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - - SelectionIntoArgument(); // ?? -} - -//================================================================================= -// function : enterEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::enterEvent (QEvent*) -{ - if (!GroupConstructors->isEnabled()) - ActivateThisDialog(); -} - -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void SMESHGUI_RemoveNodesDlg::closeEvent (QCloseEvent*) -{ - /* same than click on cancel button */ - this->ClickOnCancel(); - return; -} - -//======================================================================= -//function : hideEvent -//purpose : caused by ESC key -//======================================================================= -void SMESHGUI_RemoveNodesDlg::hideEvent (QHideEvent * e) -{ - if (!isMinimized()) - ClickOnCancel(); -} diff --git a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx b/src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx deleted file mode 100644 index ddfe9fbd8..000000000 --- a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - - -#include "QAD_Desktop.h" - -#include "SMESHGUI_SMESHGenUtils.h" - -#include "SALOMEconfig.h" -#include CORBA_CLIENT_HEADER(SALOMEDS) - -namespace SMESH -{ - - SMESH::SMESH_Gen_var GetSMESHGen() - { - static SMESH::SMESH_Gen_var aSMESHGen; - if(CORBA::is_nil(aSMESHGen)){ - if(QAD_Desktop* aDesktop = QAD_Application::getDesktop()){ - Engines::Component_var aComponent = aDesktop->getEngine("FactoryServer","SMESH"); - aSMESHGen = SMESH::SMESH_Gen::_narrow(aComponent); - } - } - return aSMESHGen; - } - -} diff --git a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.h b/src/SMESHGUI/SMESHGUI_SMESHGenUtils.h deleted file mode 100644 index 54a8d4374..000000000 --- a/src/SMESHGUI/SMESHGUI_SMESHGenUtils.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -#ifndef SMESHGUI_SMESHGenUtils_HeaderFile -#define SMESHGUI_SMESHGenUtils_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Gen) - - -namespace SMESH -{ - - SMESH::SMESH_Gen_var GetSMESHGen(); - -} - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_SpinBox.cxx b/src/SMESHGUI/SMESHGUI_SpinBox.cxx deleted file mode 100644 index 54c247a80..000000000 --- a/src/SMESHGUI/SMESHGUI_SpinBox.cxx +++ /dev/null @@ -1,101 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_SpinBox.cxx -// Author : Lucien PIGNOLONI -// Module : SMESH -// $Header$ - -#include "SMESHGUI_SpinBox.h" -#include "SMESHGUI.h" - -#include -#include - -using namespace std; - -//================================================================================= -// class : SMESHGUI_SpinBox() -// purpose : constructor of specific widget accepting floats in double precision. -//================================================================================= -SMESHGUI_SpinBox::SMESHGUI_SpinBox (QWidget* parent, const char* name) - : QtxDblSpinBox(parent, name) -{ -} - -//================================================================================= -// function : SetStep() [SLOT] -// purpose : -//================================================================================= -void SMESHGUI_SpinBox::SetStep (double newStep) -{ - setLineStep(newStep); -} - -//================================================================================= -// function : ~SMESHGUI_SpinBox() -// purpose : destructor -//================================================================================= -SMESHGUI_SpinBox::~SMESHGUI_SpinBox() -{ -} - -//================================================================================= -// function : SetValue() -// purpose : -//================================================================================= -void SMESHGUI_SpinBox::SetValue (double v) -{ - setValue(v); - editor()->setCursorPosition( 0 ); -} - -//================================================================================= -// function : GetValue() -// purpose : returns a double -//================================================================================= -double SMESHGUI_SpinBox::GetValue() -{ - return value(); -} - -//================================================================================= -// function : GetString() -// purpose : returns a QString -//================================================================================= -QString SMESHGUI_SpinBox::GetString() -{ - return cleanText(); -} - -//================================================================================= -// function : RangeStepAndValidator() -// purpose : -//================================================================================= -void SMESHGUI_SpinBox::RangeStepAndValidator - (double min, double max, double step, unsigned short decimals) -{ - setRange(min, max); - setLineStep(step); - ((QDoubleValidator*)validator())->setRange(min, max, decimals); -} diff --git a/src/SMESHGUI/SMESHGUI_SpinBox.h b/src/SMESHGUI/SMESHGUI_SpinBox.h deleted file mode 100644 index 8655e4dfb..000000000 --- a/src/SMESHGUI/SMESHGUI_SpinBox.h +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_SpinBox.h -// Author : Lucien PIGNOLONI -// Module : SMESH -// $Header$ - -#ifndef SMESH_SPINBOX_H -#define SMESH_SPINBOX_H - -#include - -//================================================================================= -// class : SMESHGUI_SpinBox -// purpose : Derivated from QtxDblSpinBox class -//================================================================================= -class SMESHGUI_SpinBox : public QtxDblSpinBox -{ - Q_OBJECT - -public: - SMESHGUI_SpinBox (QWidget* parent, const char* name = 0); - ~SMESHGUI_SpinBox(); - - void RangeStepAndValidator (double min = -1000000.0, - double max = +1000000.0, - double step = 100.0, - unsigned short decimals = 3); - void SetValue (double v); - double GetValue(); - QString GetString(); - QLineEdit* editor() { return QtxDblSpinBox::editor(); } - -public slots: - void SetStep (double newStep); -}; -#endif // SMESH_SPINBOX_H diff --git a/src/SMESHGUI/SMESHGUI_Swig.cxx b/src/SMESHGUI/SMESHGUI_Swig.cxx deleted file mode 100644 index d8a0805e3..000000000 --- a/src/SMESHGUI/SMESHGUI_Swig.cxx +++ /dev/null @@ -1,485 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Swig.cxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESHGUI_Swig.hxx" - -#include "Utils_ORB_INIT.hxx" -#include "Utils_SINGLETON.hxx" - -#include "SMESHGUI.h" -#include "SMESHGUI_Utils.h" -#include "SMESHGUI_GEOMGenUtils.h" - -// SALOME Includes -#include "SUIT_ResourceMgr.h" -#include "SUIT_Session.h" - -#include "SALOMEDS_SObject.hxx" - -#include "SalomeApp_Application.h" - -#include "utilities.h" - -// Open CASCADE Includes -#include - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SMESH_Gen) -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -static CORBA::ORB_var _orb; - -static CORBA::Object_ptr StringToObject (const char* ior) -{ - return _orb->string_to_object(ior); -} - -SMESH_Swig::SMESH_Swig() -{ - MESSAGE("Constructeur"); - setOrb(); -} - -void SMESH_Swig::Init(int studyID) -{ - MESSAGE("Init"); - SMESH::SMESH_Gen_var CompMesh = SMESHGUI::GetSMESHGen(); - GEOM::GEOM_Gen_var CompGeom = SMESH::GetGEOMGen(); - - SUIT_ResourceMgr* resMgr = SMESHGUI::resourceMgr(); - if ( resMgr ) { - resMgr->loadLanguage( QString::null, "en" ); - /*QString msg; - if (!resMgr->loadResources( "SMESH", msg )) - MESSAGE ( msg )*/ - } - - SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ); - if( !app ) - return; - - CORBA::Object_var obj = app->namingService()->Resolve("/myStudyManager"); - SALOMEDS::StudyManager_var myStudyMgr = SALOMEDS::StudyManager::_narrow(obj); - myStudy = myStudyMgr->GetStudyByID(studyID); - - CompMesh->SetCurrentStudy( myStudy.in() ); - - myStudyBuilder = myStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributePixMap_var aPixmap; - - // See return value of SMESH::SMESH_Gen::ComponentDataType() - SALOMEDS::SComponent_var father = myStudy->FindComponent("SMESH"); - - if (father->_is_nil()) { - bool aLocked = myStudy->GetProperties()->IsLocked(); - if (aLocked) myStudy->GetProperties()->SetLocked(false); - father = myStudyBuilder->NewComponent("SMESH"); - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - //NRI aName->SetValue(QObject::tr("SMESH_MEN_COMPONENT")); - SMESHGUI* gui = SMESHGUI::GetSMESHGUI(); //SRN: BugID IPAL9186, load a SMESH gui if it hasn't been loaded - if(!gui) { - SalomeApp_Application* app = dynamic_cast(SUIT_Session::session()->activeApplication()); - if(app) { - CAM_Module* module = app->module( "Mesh" ); - if(!module) module = app->loadModule("Mesh"); - gui = dynamic_cast( module ); - } - else { - MESSAGE("Can't find the application"); - } - } //SRN: BugID IPAL9186: end of a fix - aName->SetValue( gui->moduleName() ); - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" ); - myStudyBuilder->DefineComponentInstance(father, CompMesh ); - if (aLocked) myStudy->GetProperties()->SetLocked(true); - } - mySComponentMesh = SALOMEDS::SComponent::_narrow( father ); - - // Tags definition - Tag_HypothesisRoot = 1; - Tag_AlgorithmsRoot = 2; - - Tag_RefOnShape = 1; - Tag_RefOnAppliedHypothesis = 2; - Tag_RefOnAppliedAlgorithms = 3; - - Tag_SubMeshOnVertex = 4; - Tag_SubMeshOnEdge = 5; - Tag_SubMeshOnFace = 6; - Tag_SubMeshOnSolid = 7; - Tag_SubMeshOnCompound = 8; -} - -SMESH_Swig::~SMESH_Swig() -{ - MESSAGE("Destructeur"); -} - -const char* SMESH_Swig::AddNewMesh(const char* IOR) -{ - MESSAGE("AddNewMesh"); - - // VSR: added temporarily - to be removed - objects are published automatically by engine - SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); - if ( !SO->_is_nil() ) - return SO->GetID(); - - //Find or Create Hypothesis root - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - SALOMEDS::SObject_var HypothesisRoot; - if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) { - HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - SALOMEDS::SObject_var AlgorithmsRoot; - if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) { - AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - // Add New Mesh - SALOMEDS::SObject_var newMesh = myStudyBuilder->NewObject(mySComponentMesh); - anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IOR); - return SALOMEDS::SObject::_narrow( newMesh )->GetID(); -} - -const char* SMESH_Swig::AddNewHypothesis(const char* IOR) -{ - MESSAGE("AddNewHypothesis"); - - // VSR: added temporarily - to be removed - objects are published automatically by engine - SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); - if ( !SO->_is_nil() ) - return SO->GetID(); - - //Find or Create Hypothesis root - SALOMEDS::SObject_var HypothesisRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) { - HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - } - // Add New Hypothesis - SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) ); - QString aType = H->GetName(); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_" + aType ); -// if ( aType.compare("LocalLength") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_LENGTH" ); -// else if ( aType.compare("NumberOfSegments") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_SEGMENT" ); -// else if ( aType.compare("MaxElementArea") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_AREA" ); -// else if ( aType.compare("MaxElementVolume") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_VOLUME" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IOR); - return SALOMEDS::SObject::_narrow(newHypo)->GetID(); -} - -const char* SMESH_Swig::AddNewAlgorithms(const char* IOR) -{ - MESSAGE("AddNewAlgorithms"); - - // VSR: added temporarily - to be removed - objects are published automatically by engine - SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); - if ( !SO->_is_nil() ) - return SO->GetID(); - - //Find or Create Algorithms root - SALOMEDS::SObject_var AlgorithmsRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) { - AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - } - // Add New Algorithms - SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) ); - QString aType = H->GetName(); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_" + aType ); -// if ( aType.compare("Regular_1D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_REGULAR" ); -// else if ( aType.compare("MEFISTO_2D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_MEFISTO" ); -// else if ( aType.compare("Quadrangle_2D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_QUAD" ); -// else if ( aType.compare("Hexa_3D") == 0 ) -// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_HEXA" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IOR); - return SALOMEDS::SObject::_narrow(newHypo)->GetID(); -} - -void SMESH_Swig::SetShape(const char* ShapeEntry, const char* MeshEntry) -{ - SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( MeshEntry ); - SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( ShapeEntry ); - - if ( !SO_MorSM->_is_nil() && !SO_GeomShape->_is_nil() ) { - SALOMEDS::SObject_var SO = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnShape); - myStudyBuilder->Addreference (SO,SO_GeomShape); - } -} - -void SMESH_Swig::SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry) -{ - SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry ); - SALOMEDS::SObject_var SO_Hypothesis = myStudy->FindObjectID( Hypothesis_Entry ); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if ( !SO_MorSM->_is_nil() && !SO_Hypothesis->_is_nil() ) { - - //Find or Create Applied Hypothesis root - SALOMEDS::SObject_var AHR; - if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedHypothesis, AHR)) { - AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - } - SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR); - myStudyBuilder->Addreference (SO,SO_Hypothesis); - } -} - -void SMESH_Swig::SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry) -{ - SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry ); - SALOMEDS::SObject_var SO_Algorithms = myStudy->FindObjectID( Algorithms_Entry ); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if ( !SO_MorSM->_is_nil() && !SO_Algorithms->_is_nil() ) { - //Find or Create Applied Algorithms root - SALOMEDS::SObject_var AHR; - if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedAlgorithms, AHR)) { - AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_ALGORIHTMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - } - SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR); - myStudyBuilder->Addreference (SO,SO_Algorithms); - } -} - -void SMESH_Swig::UnSetHypothesis(const char* Applied_Hypothesis_Entry ) -{ - SALOMEDS::SObject_var SO_Applied_Hypothesis = myStudy->FindObjectID( Applied_Hypothesis_Entry ); - if ( !SO_Applied_Hypothesis->_is_nil() ) - myStudyBuilder->RemoveObject(SO_Applied_Hypothesis); -} - -const char* SMESH_Swig::AddSubMesh(const char* SO_Mesh_Entry, const char* SM_IOR, int ST) -{ - SALOMEDS::SObject_var SO_Mesh = myStudy->FindObjectID( SO_Mesh_Entry ); - if ( !SO_Mesh->_is_nil() ) { - - long Tag_Shape ; - Standard_CString Name; - - if (ST == TopAbs_SOLID) {Tag_Shape = Tag_SubMeshOnSolid; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnSolid"));} - else if (ST == TopAbs_FACE) {Tag_Shape = Tag_SubMeshOnFace; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnFace"));} - else if (ST == TopAbs_EDGE) {Tag_Shape = Tag_SubMeshOnEdge; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnEdge"));} - else if (ST == TopAbs_VERTEX){Tag_Shape = Tag_SubMeshOnVertex; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnVertex"));} - else { - Tag_Shape = Tag_SubMeshOnCompound; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnCompound")); - } - SALOMEDS::SObject_var SubmeshesRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - if (!SO_Mesh->FindSubObject (Tag_Shape,SubmeshesRoot )) { - SubmeshesRoot = myStudyBuilder->NewObjectToTag (SO_Mesh, Tag_Shape); - anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(Name); - anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - free(Name); - - SALOMEDS::SObject_var SO = myStudyBuilder->NewObject (SubmeshesRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(SM_IOR); - return SALOMEDS::SObject::_narrow( SO )->GetID(); - } - return ""; -} - -const char* SMESH_Swig::AddSubMeshOnShape(const char* Mesh_Entry, const char* GeomShape_Entry, - const char* SM_IOR, int ST) -{ - SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( GeomShape_Entry ); - if ( !SO_GeomShape->_is_nil() ) { - const char * SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST); - SALOMEDS::SObject_var SO_SM = myStudy->FindObjectID( SM_Entry ); - if ( !SO_SM->_is_nil() ) { - SetShape (GeomShape_Entry, SM_Entry); - return SALOMEDS::SObject::_narrow( SO_SM )->GetID(); - } - } - return ""; -} - -void SMESH_Swig::CreateAndDisplayActor( const char* Mesh_Entry ) -{ - // SMESH_Actor* Mesh = smeshGUI->ReadScript(aM); -} - -void SMESH_Swig::SetName(const char* Entry, const char* Name) -{ - SALOMEDS::SObject_var SO = myStudy->FindObjectID( Entry ); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - if ( !SO->_is_nil() ) { - anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(Name); - } -} - -void SMESH_Swig::setOrb() -{ - try { - ORB_INIT &init = *SINGLETON_::Instance(); - ASSERT(SINGLETON_::IsAlreadyExisting()); - _orb = init( 0 , 0 ); - } catch (...) { - INFOS("internal error : orb not found"); - _orb = 0; - } - ASSERT(! CORBA::is_nil(_orb)); -} - -//================================================================================ -/*! - * \brief Set mesh icon according to compute status - * \param Mesh_Entry - entry of a mesh - * \param isComputed - is mesh computed or not - */ -//================================================================================ - -void SMESH_Swig::SetMeshIcon(const char* Mesh_Entry, const bool isComputed) -{ - SALOMEDS::SObject_var mesh_var = myStudy->FindObjectID( Mesh_Entry ); - if ( !mesh_var->_is_nil() ) { - _PTR(SObject) mesh = _PTR(SObject)(new SALOMEDS_SObject( mesh_var )); - if ( mesh ) - SMESH::ModifiedMesh( mesh, isComputed ); - } -} diff --git a/src/SMESHGUI/SMESHGUI_Swig.hxx b/src/SMESHGUI/SMESHGUI_Swig.hxx deleted file mode 100644 index e1b2ebcbc..000000000 --- a/src/SMESHGUI/SMESHGUI_Swig.hxx +++ /dev/null @@ -1,94 +0,0 @@ -// SMESH SMESH : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Swig.hxx -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -#ifndef _SMESHGUI_SWIG_HXX_ -#define _SMESHGUI_SWIG_HXX_ - -// IDL Headers -#include -#include CORBA_SERVER_HEADER(SALOMEDS) -#include CORBA_SERVER_HEADER(SALOMEDS_Attributes) - -class SMESH_Swig -{ -public: - SMESH_Swig(); - ~SMESH_Swig(); - - static void setOrb(); - - void Init(int studyID); - - const char* AddNewMesh(const char* IOR); - - const char* AddNewHypothesis(const char* IOR); - const char* AddNewAlgorithms(const char* IOR); - - void SetShape(const char* ShapeEntry, const char* MeshEntry); - - void SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry); - void SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry); - - void UnSetHypothesis(const char* Applied_Hypothesis_Entry ); - - const char* AddSubMesh (const char* Mesh_Entry, const char* SM_IOR, int ST); - const char* AddSubMeshOnShape (const char* Mesh_Entry, const char* GeomShape_Entry, const char* SM_IOR, int ST); - - void CreateAndDisplayActor( const char* Mesh_Entry ); - - void SetName(const char* Entry, const char* Name); - - /*! - * \brief Set mesh icon according to compute status - * \param Mesh_Entry - entry of a mesh - * \param isComputed - is mesh computed or not - */ - void SetMeshIcon(const char* Mesh_Entry, const bool isComputed); - -private: - SALOMEDS::Study_var myStudy; - SALOMEDS::StudyBuilder_var myStudyBuilder; - SALOMEDS::SComponent_var mySComponentMesh; - - // Tags definition - long Tag_HypothesisRoot; - long Tag_AlgorithmsRoot; - - long Tag_RefOnShape; - long Tag_RefOnAppliedHypothesis; - long Tag_RefOnAppliedAlgorithms; - - long Tag_SubMeshOnVertex; - long Tag_SubMeshOnEdge; - long Tag_SubMeshOnFace; - long Tag_SubMeshOnSolid; - long Tag_SubMeshOnCompound; -}; - - -#endif diff --git a/src/SMESHGUI/SMESHGUI_Swig.i b/src/SMESHGUI/SMESHGUI_Swig.i deleted file mode 100644 index 2a99fe192..000000000 --- a/src/SMESHGUI/SMESHGUI_Swig.i +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMESHGUI : GUI for SMESH component -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESHGUI_Swig.i -// Author : Nicolas REJNERI -// Module : SMESH -// $Header$ - -%{ -#include "SMESHGUI_Swig.hxx" -%} - -%include "typemaps.i" - -class SMESH_Swig -{ - public: - SMESH_Swig(); - ~SMESH_Swig(); - - void Init(int studyID); - - const char* AddNewMesh(const char* IOR); - const char* AddNewHypothesis(const char* IOR); - const char* AddNewAlgorithms(const char* IOR); - - void SetShape(const char* ShapeEntry, const char* MeshEntry); - - void SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry); - void SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry); - - void UnSetHypothesis(const char* Applied_Hypothesis_Entry ); - - const char* AddSubMesh (const char* Mesh_Entry, const char* SM_IOR, int ST); - const char* AddSubMeshOnShape (const char* Mesh_Entry, const char* GeomShape_Entry, const char* SM_IOR, int ST); - - void SetName(const char* Entry, const char* Name); - - void SetMeshIcon(const char* Mesh_Entry, const bool isComputed); -}; diff --git a/src/SMESHGUI/SMESH_icons.po b/src/SMESHGUI/SMESH_icons.po deleted file mode 100644 index 60dff5a19..000000000 --- a/src/SMESHGUI/SMESH_icons.po +++ /dev/null @@ -1,222 +0,0 @@ -# This is a Qt message file in .po format. Each msgid starts with -# a scope. This scope should *NOT* be translated - eg. "Foo::Bar" -# would be translated to "Pub", not "Foo::Pub". -msgid "" -msgstr "" -"Project-Id-Version: PROJECT VERSION\n" -"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n" -"PO-Revision-Date: YYYY-MM-DD\n" -"Last-Translator: FULLNAME \n" -"Content-Type: text/plain; charset=iso-8859-1\n" - - -#----------------------------------------------------------- -# Divers Mesh -#----------------------------------------------------------- - -#ObjectBrowser Icon -msgid "ICON_OBJBROWSER_SMESH" -msgstr "mesh.png" - -#Select Icon -msgid "ICON_SELECT" -msgstr "select1.png" - -#Mesh Init -msgid "ICON_DLG_INIT_MESH" -msgstr "mesh_init.png" - -# -msgid "ICON_DLG_ADD_SUBMESH" -msgstr "mesh_add_sub.png" - -#Move Node -msgid "ICON_DLG_MOVE_NODE" -msgstr "mesh_move_node.png" - -#Remove Node -msgid "ICON_DLG_REM_NODE" -msgstr "mesh_rem_node.png" - -#Remove Element -msgid "ICON_DLG_REM_ELEMENT" -msgstr "mesh_rem_element.png" - -#Orientation -msgid "ICON_DLG_MESH_ORIENTATION" -msgstr "mesh_orientation.png" - -# -msgid "ICON_DLG_MESH_DIAGONAL" -msgstr "mesh_diagonal.png" - -#Connectivity -msgid "ICON_DLG_CONNECTIVITY" -msgstr "mesh_connectivity.png" - -#Smoothing -msgid "ICON_DLG_SMOOTHING" -msgstr "mesh_smoothing.png" - -#Renumbering nodes -msgid "ICON_DLG_RENUMBERING_NODES" -msgstr "mesh_renumbering_nodes.png" - -#Renumbering elements -msgid "ICON_DLG_RENUMBERING_ELEMENTS" -msgstr "mesh_renumbering_elements.png" - -#Rotation -msgid "ICON_DLG_ROTATION" -msgstr "mesh_rotation.png" - -#Translation by vector -msgid "ICON_SMESH_TRANSLATION_VECTOR" -msgstr "mesh_translation_vector.png" - -#Translation by two points -msgid "ICON_SMESH_TRANSLATION_POINTS" -msgstr "mesh_translation_points.png" - -#Symmetry by point -msgid "ICON_SMESH_SYMMETRY_POINT" -msgstr "mesh_symmetry_point.png" - -#Symmetry by axis -msgid "ICON_SMESH_SYMMETRY_AXIS" -msgstr "mesh_symmetry_axis.png" - -#Symmetry by plane -msgid "ICON_SMESH_SYMMETRY_PLANE" -msgstr "mesh_symmetry_plane.png" - -#Sew free borders -msgid "ICON_SMESH_SEWING_FREEBORDERS" -msgstr "mesh_sew_freeborders.png" - -#Sew conform free borders -msgid "ICON_SMESH_SEWING_CONFORM_FREEBORDERS" -msgstr "mesh_sew_conform_freeborders.png" - -#Sew border to side -msgid "ICON_SMESH_SEWING_BORDERTOSIDE" -msgstr "mesh_sew_bordertoside.png" - -#Sew side elements -msgid "ICON_SMESH_SEWING_SIDEELEMENTS" -msgstr "mesh_sew_sideelements.png" - -#Merge nodes -msgid "ICON_SMESH_MERGE_NODES" -msgstr "mesh_merge_nodes.png" - -#----------------------------------------------------------- -# Hypothesis -#----------------------------------------------------------- - -#Set Algo -msgid "ICON_DLG_ADD_ALGORITHM" -msgstr "mesh_set_algo.png" - -#Set Hypo -msgid "ICON_DLG_ADD_HYPOTHESIS" -msgstr "mesh_set_hypo.png" - -#Edit Hypo. -msgid "ICON_DLG_EDIT_MESH" -msgstr "mesh_edit.png" - - -#----------------------------------------------------------- -# Elements -#----------------------------------------------------------- - -#Vertex -msgid "ICON_DLG_NODE" -msgstr "mesh_vertex.png" - -#Line -msgid "ICON_DLG_EDGE" -msgstr "mesh_line.png" - -#triangle -msgid "ICON_DLG_TRIANGLE" -msgstr "mesh_triangle.png" - -#Quadrangle -msgid "ICON_DLG_QUADRANGLE" -msgstr "mesh_quad.png" - -#triangle -msgid "ICON_DLG_TETRAS" -msgstr "mesh_tetra.png" - -#Quadrangle -msgid "ICON_DLG_HEXAS" -msgstr "mesh_hexa.png" - - -#----------------------------------------------------------- -# ObjectBrowser -#----------------------------------------------------------- - -#mesh_tree_mesh -msgid "ICON_SMESH_TREE_MESH" -msgstr "mesh_tree_mesh.png" - -#mesh_tree_group -msgid "ICON_SMESH_TREE_GROUP" -msgstr "mesh_tree_group.png" - -#mesh_tree_algo -msgid "ICON_SMESH_TREE_ALGO" -msgstr "mesh_tree_algo.png" - -#mesh_tree_hypo -msgid "ICON_SMESH_TREE_HYPO" -msgstr "mesh_tree_hypo.png" - -#mesh_tree_mesh_warn -msgid "ICON_SMESH_TREE_MESH_WARN" -msgstr "mesh_tree_mesh_warn.png" - -#mesh_tree_mesh -msgid "ICON_SMESH_TREE_MESH_IMPORTED" -msgstr "mesh_tree_importedmesh.png" - - -#----------------------------------------------------------- -# Group -#----------------------------------------------------------- - -msgid "ICON_EDIT_GROUP" -msgstr "mesh_edit_group.png" - -msgid "ICON_CONSTRUCT_GROUP" -msgstr "mesh_make_group.png" - -#----------------------------------------------------------- -# Mesh pattern -#----------------------------------------------------------- - -msgid "ICON_PATTERN_2d" -msgstr "mesh_algo_mefisto.png" - -msgid "ICON_PATTERN_3d" -msgstr "mesh_algo_hexa.png" - -msgid "ICON_PATTERN_SAMPLE_2D" -msgstr "pattern_sample_2d.png" - -msgid "ICON_PATTERN_SAMPLE_3D" -msgstr "pattern_sample_3D.png" - -#----------------------------------------------------------- -# Add/Remove buttons -#----------------------------------------------------------- - -msgid "ICON_APPEND" -msgstr "mesh_add.png" - -msgid "ICON_REMOVE" -msgstr "mesh_remove.png" \ No newline at end of file diff --git a/src/SMESH_I/SMESH.hxx b/src/SMESH_I/SMESH.hxx deleted file mode 100644 index ea68b0445..000000000 --- a/src/SMESH_I/SMESH.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH.hxx -// Author : Michael ZORIN -// Module : SMESH -// $Header: - -#ifndef _SMESH_SMESH_HXX_ -#define _SMESH_SMESH_HXX_ - -// Tags definition -enum { - // Top level - Tag_HypothesisRoot = 1, // hypotheses root - Tag_AlgorithmsRoot = 2, // algorithms root - // Mesh/Submesh - Tag_RefOnShape = 1, // references to shape - Tag_RefOnAppliedHypothesis = 2, // applied hypotheses root - Tag_RefOnAppliedAlgorithms = 3, // applied algorithms root - // Mesh only - Tag_SubMeshOnVertex = 4, // sub-meshes roots by type - Tag_SubMeshOnEdge = 5, // ... - Tag_SubMeshOnWire = 6, // ... - Tag_SubMeshOnFace = 7, // ... - Tag_SubMeshOnShell = 8, // ... - Tag_SubMeshOnSolid = 9, // ... - Tag_SubMeshOnCompound = 10, // ... - Tag_NodeGroups = 11, // Group roots by type - Tag_EdgeGroups = 12, // ... - Tag_FaceGroups = 13, // ... - Tag_VolumeGroups = 14 // ... -}; - -#endif - diff --git a/src/SMESH_I/SMESHEngine.cxx b/src/SMESH_I/SMESHEngine.cxx deleted file mode 100644 index fc1bd440b..000000000 --- a/src/SMESH_I/SMESHEngine.cxx +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org - -int main(int argc, char** argv) -{ - return 1; -} diff --git a/src/SMESH_I/SMESH_1D_Algo_i.cxx b/src/SMESH_I/SMESH_1D_Algo_i.cxx deleted file mode 100644 index 06f621dc9..000000000 --- a/src/SMESH_I/SMESH_1D_Algo_i.cxx +++ /dev/null @@ -1,89 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_1D_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_1D_Algo_i.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_1D_Algo_i::SMESH_1D_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_1D_Algo_i::SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ) -{ - MESSAGE( "SMESH_1D_Algo_i::SMESH_1D_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_1D_Algo_i::~SMESH_1D_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_1D_Algo_i::~SMESH_1D_Algo_i() -{ - MESSAGE( "SMESH_1D_Algo_i::~SMESH_1D_Algo_i" ); -} - -//================================================================================ -/*! - * \brief Verify whether algorithm supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean SMESH_1D_Algo_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_1D; -} - - - - - - - - - - - - - - diff --git a/src/SMESH_I/SMESH_1D_Algo_i.hxx b/src/SMESH_I/SMESH_1D_Algo_i.hxx deleted file mode 100644 index 1112a4019..000000000 --- a/src/SMESH_I/SMESH_1D_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_1D_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_1D_ALGO_I_HXX_ -#define _SMESH_1D_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Algo_i.hxx" - -// ====================================================== -// Generic 1D algorithm -// ====================================================== -class SMESH_1D_Algo_i: - public virtual POA_SMESH::SMESH_1D_Algo, - public virtual SMESH_Algo_i -{ -protected: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_1D_Algo_i(); - - // Verify whether algorithm supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/SMESH_I/SMESH_2D_Algo_i.cxx b/src/SMESH_I/SMESH_2D_Algo_i.cxx deleted file mode 100644 index 00744eea4..000000000 --- a/src/SMESH_I/SMESH_2D_Algo_i.cxx +++ /dev/null @@ -1,75 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_2D_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_2D_Algo_i.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_2D_Algo_i::SMESH_2D_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_2D_Algo_i::SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ) -{ - MESSAGE( "SMESH_2D_Algo_i::SMESH_2D_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_2D_Algo_i::~SMESH_2D_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_2D_Algo_i::~SMESH_2D_Algo_i() -{ - MESSAGE( "SMESH_2D_Algo_i::~SMESH_2D_Algo_i" ); -} - -//================================================================================ -/*! - * \brief Verify whether algorithm supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean SMESH_2D_Algo_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_2D; -} diff --git a/src/SMESH_I/SMESH_2D_Algo_i.hxx b/src/SMESH_I/SMESH_2D_Algo_i.hxx deleted file mode 100644 index 58664c9cf..000000000 --- a/src/SMESH_I/SMESH_2D_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_2D_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_2D_ALGO_I_HXX_ -#define _SMESH_2D_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Algo_i.hxx" - -// ====================================================== -// Generic 2D algorithm -// ====================================================== -class SMESH_2D_Algo_i: - public virtual POA_SMESH::SMESH_2D_Algo, - public virtual SMESH_Algo_i -{ -protected: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_2D_Algo_i(); - - // Verify whether algorithm supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/SMESH_I/SMESH_3D_Algo_i.cxx b/src/SMESH_I/SMESH_3D_Algo_i.cxx deleted file mode 100644 index 14276fe12..000000000 --- a/src/SMESH_I/SMESH_3D_Algo_i.cxx +++ /dev/null @@ -1,76 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_3D_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_3D_Algo_i.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_3D_Algo_i::SMESH_3D_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_3D_Algo_i::SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ) -{ - MESSAGE( "SMESH_3D_Algo_i::SMESH_3D_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_3D_Algo_i::~SMESH_3D_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_3D_Algo_i::~SMESH_3D_Algo_i() -{ - MESSAGE( "SMESH_3D_Algo_i::~SMESH_3D_Algo_i" ); -} - -//================================================================================ -/*! - * \brief Verify whether algorithm supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean SMESH_3D_Algo_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_3D; -} - diff --git a/src/SMESH_I/SMESH_3D_Algo_i.hxx b/src/SMESH_I/SMESH_3D_Algo_i.hxx deleted file mode 100644 index 8589e166a..000000000 --- a/src/SMESH_I/SMESH_3D_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_3D_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_3D_ALGO_I_HXX_ -#define _SMESH_3D_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Algo_i.hxx" - -// ====================================================== -// Generic 3D algorithm -// ====================================================== -class SMESH_3D_Algo_i: - public virtual POA_SMESH::SMESH_3D_Algo, - public virtual SMESH_Algo_i -{ -protected: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_3D_Algo_i(); - - // Verify whether algorithm supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/SMESH_I/SMESH_Algo_i.cxx b/src/SMESH_I/SMESH_Algo_i.cxx deleted file mode 100644 index a57df7bef..000000000 --- a/src/SMESH_I/SMESH_Algo_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Algo_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_Algo_i.hxx" -#include "SMESH_Algo.hxx" - -#include "utilities.h" - -#include -#include - -//============================================================================= -/*! - * SMESH_Algo_i::SMESH_Algo_i - * - * Constructor - */ -//============================================================================= - -SMESH_Algo_i::SMESH_Algo_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE( "SMESH_Algo_i::SMESH_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_Algo_i::~SMESH_Algo_i - * - * Destructor - */ -//============================================================================= - -SMESH_Algo_i::~SMESH_Algo_i() -{ - MESSAGE( "SMESH_Algo_i::~SMESH_Algo_i" ); -} - -//============================================================================= -/*! - * SMESH_Algo_i::GetCompatibleHypothesis - * - * Gets list of compatible hypotheses - */ -//============================================================================= - -SMESH::ListOfHypothesisName* SMESH_Algo_i::GetCompatibleHypothesis() -{ - MESSAGE( "SMESH_Algo_i::GetCompatibleHypothesis" ); - SMESH::ListOfHypothesisName_var listOfHypothesis = new SMESH::ListOfHypothesisName; - const vector& hypList = ( ( ::SMESH_Algo* )myBaseImpl )->GetCompatibleHypothesis(); - int nbHyp = hypList.size(); - listOfHypothesis->length( nbHyp ); - for ( int i = 0; i < nbHyp; i++ ) { - listOfHypothesis[ i ] = CORBA::string_dup( hypList[ i ].c_str() ); - } - return listOfHypothesis._retn(); -} diff --git a/src/SMESH_I/SMESH_Algo_i.hxx b/src/SMESH_I/SMESH_Algo_i.hxx deleted file mode 100644 index 21630ec8a..000000000 --- a/src/SMESH_I/SMESH_Algo_i.hxx +++ /dev/null @@ -1,56 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Algo_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_ALGO_I_HXX_ -#define _SMESH_ALGO_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Hypothesis_i.hxx" - -// ====================================================== -// Generic algorithm -// ====================================================== -class SMESH_Algo_i: - public virtual POA_SMESH::SMESH_Algo, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_Algo_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_Algo_i(); - - // Gets list of compatible hypotheses - SMESH::ListOfHypothesisName* GetCompatibleHypothesis(); -}; - -#endif diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx deleted file mode 100644 index d3c645941..000000000 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ /dev/null @@ -1,845 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// File : SMESH_Gen_i_1.cxx -// Created : Thu Oct 21 17:24:06 2004 -// Author : Edward AGAPOV (eap) -// Module : SMESH -// $Header: - -#include "SMESH_Gen_i.hxx" - -#include "SMESH_Mesh_i.hxx" -#include "SMESH_Hypothesis_i.hxx" -#include "SMESH_Algo_i.hxx" -#include "SMESH_Group_i.hxx" - -#include "SMESH.hxx" - -#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) - -#include "utilities.h" -#include "Utils_ExceptHandlers.hxx" - -#include - -#ifdef _DEBUG_ -static int MYDEBUG = 0; -#else -static int MYDEBUG = 0; -#endif - -//============================================================================= -/*! - * Get...Tag [ static ] - * - * Methods which determine SMESH data model structure - */ -//============================================================================= - -long SMESH_Gen_i::GetHypothesisRootTag() -{ - return Tag_HypothesisRoot; -} - -long SMESH_Gen_i::GetAlgorithmsRootTag() -{ - return Tag_AlgorithmsRoot; -} - -long SMESH_Gen_i::GetRefOnShapeTag() -{ - return Tag_RefOnShape; -} - -long SMESH_Gen_i::GetRefOnAppliedHypothesisTag() -{ - return Tag_RefOnAppliedHypothesis; -} - -long SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag() -{ - return Tag_RefOnAppliedAlgorithms; -} - -long SMESH_Gen_i::GetSubMeshOnVertexTag() -{ - return Tag_SubMeshOnVertex; -} - -long SMESH_Gen_i::GetSubMeshOnEdgeTag() -{ - return Tag_SubMeshOnEdge; -} - -long SMESH_Gen_i::GetSubMeshOnFaceTag() -{ - return Tag_SubMeshOnFace; -} - -long SMESH_Gen_i::GetSubMeshOnSolidTag() -{ - return Tag_SubMeshOnSolid; -} - -long SMESH_Gen_i::GetSubMeshOnCompoundTag() -{ - return Tag_SubMeshOnCompound; -} - -long SMESH_Gen_i::GetSubMeshOnWireTag() -{ - return Tag_SubMeshOnWire; -} - -long SMESH_Gen_i::GetSubMeshOnShellTag() -{ - return Tag_SubMeshOnShell; -} - -long SMESH_Gen_i::GetNodeGroupsTag() -{ - return Tag_NodeGroups; -} - -long SMESH_Gen_i::GetEdgeGroupsTag() -{ - return Tag_EdgeGroups; -} - -long SMESH_Gen_i::GetFaceGroupsTag() -{ - return Tag_FaceGroups; -} - -long SMESH_Gen_i::GetVolumeGroupsTag() -{ - return Tag_VolumeGroups; -} - -//============================================================================= -/*! - * SMESH_Gen_i::CanPublishInStudy - * - * Returns true if object can be published in the study - */ -//============================================================================= - -bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) -{ - if(MYDEBUG) MESSAGE("CanPublishInStudy - "<_is_nil() ) - return true; - - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(theIOR); - if( !aSubMesh->_is_nil() ) - return true; - - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow(theIOR); - if( !aHyp->_is_nil() ) - return true; - - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(theIOR); - if( !aGroup->_is_nil() ) - return true; - - if(MYDEBUG) MESSAGE("CanPublishInStudy--CANT"); - return false; -} - -//======================================================================= -//function : ObjectToSObject -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::ObjectToSObject(SALOMEDS::Study_ptr theStudy, - CORBA::Object_ptr theObject) -{ - SALOMEDS::SObject_var aSO; - if ( !CORBA::is_nil( theStudy ) && !CORBA::is_nil( theObject )) - aSO = theStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( theObject ) ); - return aSO._retn(); -} - -//======================================================================= -//function : objectToServant -//purpose : -//======================================================================= - -template static inline T* objectToServant( CORBA::Object_ptr theIOR ) -{ - return dynamic_cast( SMESH_Gen_i::GetServant( theIOR ).in() ); -} - -//======================================================================= -//function : ShapeToGeomObject -//purpose : -//======================================================================= - -GEOM::GEOM_Object_ptr SMESH_Gen_i::ShapeToGeomObject (const TopoDS_Shape& theShape ) -{ - GEOM::GEOM_Object_var aShapeObj; - if ( !theShape.IsNull() ) { - GEOM_Client* aClient = GetShapeReader(); - TCollection_AsciiString IOR; - if ( aClient && aClient->Find( theShape, IOR )) - aShapeObj = GEOM::GEOM_Object::_narrow - ( GetORB()->string_to_object( IOR.ToCString() ) ); - } - return aShapeObj._retn(); -} - -//======================================================================= -//function : GeomObjectToShape -//purpose : -//======================================================================= - -TopoDS_Shape SMESH_Gen_i::GeomObjectToShape(GEOM::GEOM_Object_ptr theGeomObject) -{ - TopoDS_Shape S; - if ( !theGeomObject->_is_nil() ) { - GEOM_Client* aClient = GetShapeReader(); - GEOM::GEOM_Gen_var aGeomEngine = GetGeomEngine(); - if ( aClient && !aGeomEngine->_is_nil () ) - S = aClient->GetShape( aGeomEngine, theGeomObject ); - } - return S; -} - -//======================================================================= -//function : publish -//purpose : -//======================================================================= - -static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy, - CORBA::Object_ptr theIOR, - SALOMEDS::SObject_ptr theFatherObject, - const int theTag = 0, - const char* thePixMap = 0, - const bool theSelectable = true) -{ - SALOMEDS::SObject_var SO = SMESH_Gen_i::ObjectToSObject( theStudy, theIOR ); - SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - if ( SO->_is_nil() ) { - if ( theTag == 0 ) - SO = aStudyBuilder->NewObject( theFatherObject ); - else if ( !theFatherObject->FindSubObject( theTag, SO )) - SO = aStudyBuilder->NewObjectToTag( theFatherObject, theTag ); - } - - SALOMEDS::GenericAttribute_var anAttr; - if ( !CORBA::is_nil( theIOR )) { - anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeIOR" ); - SALOMEDS::AttributeIOR::_narrow(anAttr)->SetValue - ( SMESH_Gen_i::GetORB()->object_to_string( theIOR ) ); - } - if ( thePixMap ) { - anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributePixMap" ); - SALOMEDS::AttributePixMap::_narrow( anAttr )->SetPixMap( thePixMap ); - } - if ( !theSelectable ) { - anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeSelectable" ); - SALOMEDS::AttributeSelectable::_narrow( anAttr )->SetSelectable( false ); - } - return SO._retn(); -} - -//======================================================================= -//function : setName -//purpose : -//======================================================================= - -void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject, - const char* theName, - const char* theDefaultName) -{ - if ( !theSObject->_is_nil() ) { - SALOMEDS::StudyBuilder_var aStudyBuilder = theSObject->GetStudy()->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr = - aStudyBuilder->FindOrCreateAttribute( theSObject, "AttributeName" ); - SALOMEDS::AttributeName_var aNameAttr = SALOMEDS::AttributeName::_narrow( anAttr ); - if ( theName && strlen( theName ) != 0 ) - aNameAttr->SetValue( theName ); - else { - CORBA::String_var curName = CORBA::string_dup( aNameAttr->Value() ); - if ( strlen( curName ) == 0 ) { - TCollection_AsciiString aName( (char*) theDefaultName ); - aName += TCollection_AsciiString("_") + TCollection_AsciiString( theSObject->Tag() ); - aNameAttr->SetValue( aName.ToCString() ); - } - } - } -} - -//======================================================================= -//function : addReference -//purpose : -//======================================================================= - -static void addReference (SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theToObject, - int theTag = 0) -{ - SALOMEDS::SObject_var aToObjSO = SMESH_Gen_i::ObjectToSObject( theStudy, theToObject ); - if ( !aToObjSO->_is_nil() && !theSObject->_is_nil() ) { - SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - SALOMEDS::SObject_var aReferenceSO; - if ( !theTag ) { - bool isReferred = false; - SALOMEDS::ChildIterator_var anIter = theStudy->NewChildIterator( theSObject ); - for ( ; !isReferred && anIter->More(); anIter->Next() ) { - if ( anIter->Value()->ReferencedObject( aReferenceSO ) && - strcmp( aReferenceSO->GetID(), aToObjSO->GetID() ) == 0 ) - isReferred = true; - } - if ( !isReferred ) { - aReferenceSO = aStudyBuilder->NewObject( theSObject ); - aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); - } - } - else { - if ( !theSObject->FindSubObject( theTag, aReferenceSO )) - aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag ); - aStudyBuilder->Addreference( aReferenceSO, aToObjSO ); - } - } -} - -//============================================================================= -/*! - * SMESH_Gen_i::PublishInStudy - * - * Publish object in the study - */ -//============================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theIOR, - const char* theName) - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - SALOMEDS::SObject_var aSO; - if ( CORBA::is_nil( theStudy ) || CORBA::is_nil( theIOR )) - return aSO._retn(); - if(MYDEBUG) MESSAGE("PublishInStudy"); - - // Publishing a mesh - SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( theIOR ); - if( !aMesh->_is_nil() ) - aSO = PublishMesh( theStudy, aMesh, theName ); - - // Publishing a sub-mesh - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( theIOR ); - if( aSO->_is_nil() && !aSubMesh->_is_nil() ) { - GEOM::GEOM_Object_var aShapeObject = aSubMesh->GetSubShape(); - aMesh = aSubMesh->GetFather(); - aSO = PublishSubMesh( theStudy, aMesh, aSubMesh, aShapeObject, theName ); - } - - // Publishing a hypothesis or algorithm - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( theIOR ); - if ( aSO->_is_nil() && !aHyp->_is_nil() ) - aSO = PublishHypothesis( theStudy, aHyp ); - - // Publishing a group - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(theIOR); - if ( aSO->_is_nil() && !aGroup->_is_nil() ) { - GEOM::GEOM_Object_var aShapeObject; - aMesh = aGroup->GetMesh(); - aSO = PublishGroup( theStudy, aMesh, aGroup, aShapeObject, theName ); - } - if(MYDEBUG) MESSAGE("PublishInStudy_END"); - - return aSO._retn(); -} - -//======================================================================= -//function : PublishComponent -//purpose : -//======================================================================= - -SALOMEDS::SComponent_ptr SMESH_Gen_i::PublishComponent(SALOMEDS::Study_ptr theStudy) -{ - if ( CORBA::is_nil( theStudy )) - return SALOMEDS::SComponent::_nil(); - if(MYDEBUG) MESSAGE("PublishComponent"); - - SALOMEDS::SComponent_var father = - SALOMEDS::SComponent::_narrow( theStudy->FindComponent( ComponentDataType() ) ); - if ( !CORBA::is_nil( father ) ) - return father._retn(); - - SALOME_ModuleCatalog::ModuleCatalog_var aCat = - SALOME_ModuleCatalog::ModuleCatalog::_narrow( GetNS()->Resolve("/Kernel/ModulCatalog") ); - if ( CORBA::is_nil( aCat ) ) - return father._retn(); - - SALOME_ModuleCatalog::Acomponent_var aComp = aCat->GetComponent( ComponentDataType() ); - if ( CORBA::is_nil( aComp ) ) - return father._retn(); - - SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - father = aStudyBuilder->NewComponent( ComponentDataType() ); - aStudyBuilder->DefineComponentInstance( father, SMESH_Gen::_this() ); - anAttr = aStudyBuilder->FindOrCreateAttribute( father, "AttributePixMap" ); - aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); - aPixmap ->SetPixMap( "ICON_OBJBROWSER_SMESH" ); - SetName( father, aComp->componentusername(), "MESH" ); - if(MYDEBUG) MESSAGE("PublishComponent--END"); - - return father._retn(); -} - -//============================================================================= -/*! - * findMaxChildTag [ static internal ] - * - * Finds maximum child tag for the given object - */ -//============================================================================= - -static long findMaxChildTag( SALOMEDS::SObject_ptr theSObject ) -{ - long aTag = 0; - if ( !theSObject->_is_nil() ) { - SALOMEDS::Study_var aStudy = theSObject->GetStudy(); - if ( !aStudy->_is_nil() ) { - SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( theSObject ); - for ( ; anIter->More(); anIter->Next() ) { - long nTag = anIter->Value()->Tag(); - if ( nTag > aTag ) - aTag = nTag; - } - } - } - return aTag; -} - -//======================================================================= -//function : PublishMesh -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - const char* theName) -{ - if ( CORBA::is_nil( theStudy ) || - CORBA::is_nil( theMesh )) - return SALOMEDS::SComponent::_nil(); - if(MYDEBUG) MESSAGE("PublishMesh--IN"); - - // find or publish a mesh - - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) - { - SALOMEDS::SComponent_var father = PublishComponent( theStudy ); - if ( father->_is_nil() ) - return aMeshSO._retn(); - - // Find correct free tag - long aTag = findMaxChildTag( father.in() ); - if ( aTag <= GetAlgorithmsRootTag() ) - aTag = GetAlgorithmsRootTag() + 1; - else - aTag++; - - aMeshSO = publish (theStudy, theMesh, father, aTag, "ICON_SMESH_TREE_MESH_WARN" ); - if ( aMeshSO->_is_nil() ) - return aMeshSO._retn(); - } - SetName( aMeshSO, theName, "Mesh" ); - - // Add shape reference - - GEOM::GEOM_Object_var aShapeObject = theMesh->GetShapeToMesh(); - if ( !CORBA::is_nil( aShapeObject )) { - addReference( theStudy, aMeshSO, aShapeObject, GetRefOnShapeTag() ); - - // Publish global hypotheses - - SMESH::ListOfHypothesis * hypList = theMesh->GetHypothesisList( aShapeObject ); - if ( hypList ) - for ( int i = 0; i < hypList->length(); i++ ) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( (*hypList)[ i ]); - PublishHypothesis( theStudy, aHyp ); - AddHypothesisToShape( theStudy, theMesh, aShapeObject, aHyp ); - } - } - - // Publish submeshes - - SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); - if ( !mesh_i ) - return aMeshSO._retn(); - map& subMap = mesh_i->_mapSubMesh_i; - map::iterator subIt = subMap.begin(); - for ( ; subIt != subMap.end(); subIt++ ) { - SMESH::SMESH_subMesh_ptr aSubMesh = (*subIt).second->_this(); - if ( !CORBA::is_nil( aSubMesh )) { - aShapeObject = aSubMesh->GetSubShape(); - PublishSubMesh( theStudy, theMesh, aSubMesh, aShapeObject ); - } - } - - // Publish groups - const map& grMap = mesh_i->getGroups(); - map::const_iterator it = grMap.begin(); - for ( ; it != grMap.end(); it++ ) - { - SMESH::SMESH_GroupBase_ptr aGroup = (*it).second; - if ( !aGroup->_is_nil() ) { - GEOM::GEOM_Object_var aShapeObj; - SMESH::SMESH_GroupOnGeom_var aGeomGroup = - SMESH::SMESH_GroupOnGeom::_narrow( aGroup ); - if ( !aGeomGroup->_is_nil() ) - aShapeObj = aGeomGroup->GetShape(); - PublishGroup( theStudy, theMesh, aGroup, aShapeObj ); - } - } - - if(MYDEBUG) MESSAGE("PublishMesh_END"); - return aMeshSO._retn(); -} - -//======================================================================= -//function : PublishSubMesh -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishSubMesh (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - SMESH::SMESH_subMesh_ptr theSubMesh, - GEOM::GEOM_Object_ptr theShapeObject, - const char* theName) -{ - if (theStudy->_is_nil() || theMesh->_is_nil() || - theSubMesh->_is_nil() || theShapeObject->_is_nil() ) - return SALOMEDS::SObject::_nil(); - - SALOMEDS::SObject_var aSubMeshSO = ObjectToSObject( theStudy, theSubMesh ); - if ( aSubMeshSO->_is_nil() ) - { - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) { - aMeshSO = PublishMesh( theStudy, theMesh ); - if ( aMeshSO->_is_nil()) - return SALOMEDS::SObject::_nil(); - } - // Find submesh sub-tree tag - long aRootTag; - char* aRootName = ""; - switch ( theShapeObject->GetShapeType() ) { - case GEOM::VERTEX: - aRootTag = GetSubMeshOnVertexTag(); - aRootName = "SubMeshes on Vertex"; - break; - case GEOM::EDGE: - aRootTag = GetSubMeshOnEdgeTag(); - aRootName = "SubMeshes on Edge"; - break; - case GEOM::WIRE: - aRootTag = GetSubMeshOnWireTag(); - aRootName = "SubMeshes on Wire"; - break; - case GEOM::FACE: - aRootTag = GetSubMeshOnFaceTag(); - aRootName = "SubMeshes on Face"; - break; - case GEOM::SHELL: - aRootTag = GetSubMeshOnShellTag(); - aRootName = "SubMeshes on Shell"; - break; - case GEOM::SOLID: - aRootTag = GetSubMeshOnSolidTag(); - aRootName = "SubMeshes on Solid"; - break; - default: - aRootTag = GetSubMeshOnCompoundTag(); - aRootName = "SubMeshes on Compound"; - break; - } - - // Find or create submesh root - SALOMEDS::SObject_var aRootSO = publish (theStudy, CORBA::Object::_nil(), - aMeshSO, aRootTag, 0, false ); - SetName( aRootSO, aRootName ); - - // Add new submesh to corresponding sub-tree - aSubMeshSO = publish (theStudy, theSubMesh, aRootSO, 0, "ICON_SMESH_TREE_MESH_WARN"); - if ( aSubMeshSO->_is_nil() ) - return aSubMeshSO._retn(); - } - SetName( aSubMeshSO, theName, "SubMesh" ); - - // Add reference to theShapeObject - - addReference( theStudy, aSubMeshSO, theShapeObject, 1 ); - - // Publish hypothesis - - SMESH::ListOfHypothesis * hypList = theMesh->GetHypothesisList( theShapeObject ); - if ( hypList ) - for ( int i = 0; i < hypList->length(); i++ ) { - SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( (*hypList)[ i ]); - PublishHypothesis( theStudy, aHyp ); - AddHypothesisToShape( theStudy, theMesh, theShapeObject, aHyp ); - } - - return aSubMeshSO._retn(); -} - -//======================================================================= -//function : PublishGroup -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESH_Gen_i::PublishGroup (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - SMESH::SMESH_GroupBase_ptr theGroup, - GEOM::GEOM_Object_ptr theShapeObject, - const char* theName) -{ - if (theStudy->_is_nil() || theMesh->_is_nil() || theGroup->_is_nil() ) - return SALOMEDS::SObject::_nil(); - - SALOMEDS::SObject_var aGroupSO = ObjectToSObject( theStudy, theGroup ); - if ( aGroupSO->_is_nil() ) - { - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) { - aMeshSO = PublishInStudy( theStudy, SALOMEDS::SObject::_nil(), theMesh, ""); - if ( aMeshSO->_is_nil()) - return SALOMEDS::SObject::_nil(); - } - int aType = (int)theGroup->GetType(); - const char* aRootNames[] = { - "Compound Groups", "Groups of Nodes", - "Groups of Edges", "Groups of Faces", "Groups of Volumes" }; - - // Currently, groups with heterogenous content are not supported - if ( aType != SMESH::ALL ) { - long aRootTag = GetNodeGroupsTag() + aType - 1; - - // Find or create groups root - SALOMEDS::SObject_var aRootSO = publish (theStudy, CORBA::Object::_nil(), - aMeshSO, aRootTag, 0, false ); - if ( aType < 5 ) - SetName( aRootSO, aRootNames[aType] ); - - // Add new group to corresponding sub-tree - aGroupSO = publish (theStudy, theGroup, aRootSO, 0, "ICON_SMESH_TREE_GROUP" ); - } - if ( aGroupSO->_is_nil() ) - return aGroupSO._retn(); - } - - SetName( aGroupSO, theName, "Group" ); - - //Add reference to geometry - if ( !theShapeObject->_is_nil() ) - addReference( theStudy, aGroupSO, theShapeObject, 1 ); - - return aGroupSO._retn(); -} - -//======================================================================= -//function : PublishHypothesis -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr - SMESH_Gen_i::PublishHypothesis (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Hypothesis_ptr theHyp, - const char* theName) -{ - if(MYDEBUG) MESSAGE("PublishHypothesis") - if (theStudy->_is_nil() || theHyp->_is_nil()) - return SALOMEDS::SObject::_nil(); - - SALOMEDS::SObject_var aHypSO = ObjectToSObject( theStudy, theHyp ); - if ( aHypSO->_is_nil() ) - { - SALOMEDS::SComponent_var father = PublishComponent( theStudy ); - if ( father->_is_nil() ) - return aHypSO._retn(); - - //Find or Create Hypothesis root - bool isAlgo = ( !SMESH::SMESH_Algo::_narrow( theHyp )->_is_nil() ); - int aRootTag = isAlgo ? GetAlgorithmsRootTag() : GetHypothesisRootTag(); - SALOMEDS::SObject_var aRootSO = - publish (theStudy, CORBA::Object::_nil(),father, aRootTag, - isAlgo ? "ICON_SMESH_TREE_ALGO" : "ICON_SMESH_TREE_HYPO", false); - SetName( aRootSO, isAlgo ? "Algorithms" : "Hypotheses" ); - - // Add New Hypothesis - string aPmName = isAlgo ? "ICON_SMESH_TREE_ALGO_" : "ICON_SMESH_TREE_HYPO_"; - aPmName += theHyp->GetName(); - aHypSO = publish( theStudy, theHyp, aRootSO, 0, aPmName.c_str() ); - } - - if ( !aHypSO->_is_nil() ) { - CORBA::String_var aHypName = CORBA::string_dup( theHyp->GetName() ); - SetName( aHypSO, theName, aHypName ); - } - - if(MYDEBUG) MESSAGE("PublishHypothesis--END") - return aHypSO._retn(); -} - -//======================================================================= -//function : GetMeshOrSubmeshByShape -//purpose : -//======================================================================= - -SALOMEDS::SObject_ptr - SMESH_Gen_i::GetMeshOrSubmeshByShape (SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShape) -{ - if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape") - SALOMEDS::SObject_var aMeshOrSubMesh; - if ( theShape->_is_nil() || theMesh->_is_nil() ) - return aMeshOrSubMesh._retn(); - - TopoDS_Shape aShape = GeomObjectToShape( theShape ); - SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); - - if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { - SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS(); - if ( aShape.IsSame( meshDS->ShapeToMesh() )) - aMeshOrSubMesh = ObjectToSObject( theStudy, theMesh ); - else { - int shapeID = meshDS->ShapeToIndex( aShape ); - SMESH::SMESH_subMesh_var aSubMesh = mesh_i->getSubMesh(shapeID); - if ( !aSubMesh->_is_nil() ) - aMeshOrSubMesh = ObjectToSObject( theStudy, aSubMesh ); - } - } - if(MYDEBUG) MESSAGE("GetMeshOrSubmeshByShape--END") - return aMeshOrSubMesh._retn(); -} - -//======================================================================= -//function : AddHypothesisToShape -//purpose : -//======================================================================= - -bool SMESH_Gen_i::AddHypothesisToShape(SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShape, - SMESH::SMESH_Hypothesis_ptr theHyp) -{ - if(MYDEBUG) MESSAGE("AddHypothesisToShape") - if (theStudy->_is_nil() || theMesh->_is_nil() || - theHyp->_is_nil() || theShape->_is_nil() ) - return false; - - SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh ); - if ( aMeshSO->_is_nil() ) - aMeshSO = PublishMesh( theStudy, theMesh ); - SALOMEDS::SObject_var aHypSO = PublishHypothesis( theStudy, theHyp ); - if ( aMeshSO->_is_nil() || aHypSO->_is_nil()) - return false; - - // Find a mesh or submesh refering to theShape - SALOMEDS::SObject_var aMeshOrSubMesh = - GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); - if ( aMeshOrSubMesh->_is_nil() ) - { - // publish submesh - TopoDS_Shape aShape = GeomObjectToShape( theShape ); - SMESH_Mesh_i* mesh_i = objectToServant( theMesh ); - if ( !aShape.IsNull() && mesh_i && mesh_i->GetImpl().GetMeshDS() ) { - SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS(); - int shapeID = meshDS->ShapeToIndex( aShape ); - SMESH::SMESH_subMesh_var aSubMesh = mesh_i->getSubMesh(shapeID); - aMeshOrSubMesh = PublishSubMesh( theStudy, theMesh, aSubMesh, theShape ); - } - if ( aMeshOrSubMesh->_is_nil() ) - return false; - } - - //Find or Create Applied Hypothesis root - bool aIsAlgo = !SMESH::SMESH_Algo::_narrow( theHyp )->_is_nil(); - SALOMEDS::SObject_var AHR = - publish (theStudy, CORBA::Object::_nil(), aMeshOrSubMesh, - aIsAlgo ? GetRefOnAppliedAlgorithmsTag() : GetRefOnAppliedHypothesisTag(), - aIsAlgo ? "ICON_SMESH_TREE_ALGO" : "ICON_SMESH_TREE_HYPO", false); - SetName( AHR, aIsAlgo ? "Applied algorithms" : "Applied hypotheses" ); - if ( AHR->_is_nil() ) - return false; - - addReference( theStudy, AHR, theHyp ); - if(MYDEBUG) MESSAGE("AddHypothesisToShape--END") - return true; -} - -//======================================================================= -//function : RemoveHypothesisFromShape -//purpose : -//======================================================================= - -bool SMESH_Gen_i::RemoveHypothesisFromShape(SALOMEDS::Study_ptr theStudy, - SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShape, - SMESH::SMESH_Hypothesis_ptr theHyp) -{ - if (theStudy->_is_nil() || theMesh->_is_nil() || - theHyp->_is_nil() || theShape->_is_nil() ) - return false; - - SALOMEDS::SObject_var aHypSO = ObjectToSObject( theStudy, theHyp ); - if ( aHypSO->_is_nil() ) - return false; - - // Find a mesh or submesh refering to theShape - SALOMEDS::SObject_var aMeshOrSubMesh = - GetMeshOrSubmeshByShape( theStudy, theMesh, theShape ); - if ( aMeshOrSubMesh->_is_nil() ) - return false; - - // Find and remove a reference to aHypSO - SALOMEDS::SObject_var aRef, anObj; - CORBA::String_var anID = CORBA::string_dup( aHypSO->GetID() ); - SALOMEDS::ChildIterator_var it = theStudy->NewChildIterator( aMeshOrSubMesh ); - for ( it->InitEx( true ); it->More(); it->Next() ) { - anObj = it->Value(); - if (anObj->ReferencedObject( aRef ) && strcmp( aRef->GetID(), anID ) == 0 ) { - theStudy->NewBuilder()->RemoveObject( anObj ); - break; - } - } - return true; -} - diff --git a/src/SMESH_I/SMESH_Group_i.hxx b/src/SMESH_I/SMESH_Group_i.hxx deleted file mode 100644 index e9801b258..000000000 --- a/src/SMESH_I/SMESH_Group_i.hxx +++ /dev/null @@ -1,115 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2004 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Group_i.hxx -// Author : Sergey ANIKIN, OCC -// Module : SMESH -// $Header$ - - -#ifndef SMESH_Group_i_HeaderFile -#define SMESH_Group_i_HeaderFile - -#include -#include CORBA_SERVER_HEADER(SMESH_Group) -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_CLIENT_HEADER(GEOM_Gen) - -#include "SALOME_GenericObj_i.hh" - -class SMESH_Mesh_i; -class SMESH_Group; -class SMESHDS_GroupBase; - -// =========== -// Group Base -// =========== -class SMESH_GroupBase_i: - public virtual POA_SMESH::SMESH_GroupBase, - public virtual SALOME::GenericObj_i -{ - public: - SMESH_GroupBase_i(PortableServer::POA_ptr thePOA, - SMESH_Mesh_i* theMeshServant, - const int theLocalID ); - virtual ~SMESH_GroupBase_i(); - - // CORBA interface implementation - void SetName(const char* name); - char* GetName(); - SMESH::ElementType GetType(); - CORBA::Long Size(); - CORBA::Boolean IsEmpty(); - CORBA::Boolean Contains(CORBA::Long elem_id); - CORBA::Long GetID(CORBA::Long elem_index); - SMESH::long_array* GetListOfID(); - SMESH::SMESH_Mesh_ptr GetMesh(); - - // Inherited from SMESH_IDSource interface - virtual SMESH::long_array* GetIDs(); - - // Internal C++ interface - int GetLocalID() const { return myLocalID; } - SMESH_Mesh_i* GetMeshServant() const { return myMeshServant; } - SMESH_Group* GetSmeshGroup() const; - SMESHDS_GroupBase* GetGroupDS() const; - -private: - SMESH_Mesh_i* myMeshServant; - int myLocalID; -}; - -// ====== -// Group -// ====== - -class SMESH_Group_i: - public virtual POA_SMESH::SMESH_Group, - public SMESH_GroupBase_i -{ - public: - SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ); - - // CORBA interface implementation - void Clear(); - CORBA::Long Add( const SMESH::long_array& theIDs ); - CORBA::Long Remove( const SMESH::long_array& theIDs ); - - CORBA::Long AddByPredicate( SMESH::Predicate_ptr thePredicate ); - CORBA::Long RemoveByPredicate( SMESH::Predicate_ptr thePredicate ); -}; - -// ========================= -// Group linked to geometry -// ========================= - -class SMESH_GroupOnGeom_i: - public virtual POA_SMESH::SMESH_GroupOnGeom, - public SMESH_GroupBase_i -{ - public: - SMESH_GroupOnGeom_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID ); - - // CORBA interface implementation - GEOM::GEOM_Object_ptr GetShape(); -}; -#endif diff --git a/src/SMESH_I/SMESH_Hypothesis_i.cxx b/src/SMESH_I/SMESH_Hypothesis_i.cxx deleted file mode 100644 index d5cdce9fb..000000000 --- a/src/SMESH_I/SMESH_Hypothesis_i.cxx +++ /dev/null @@ -1,181 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Hypothesis_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include -#include -#include "SMESH_Hypothesis_i.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * SMESH_Hypothesis_i::SMESH_Hypothesis_i - * - * Constructor - */ -//============================================================================= - -SMESH_Hypothesis_i::SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA ) - : SALOME::GenericObj_i( thePOA ) -{ - MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Début" ); - myBaseImpl = 0; - // _CS_gbo This instruction fails - // thePOA->activate_object( this ); - // _CS_gbo I keep the POA reference to activate the object in the future. - myPOA = thePOA; - - MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Fin" ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::Activate() - * - * Activation of the object - */ -//============================================================================= -void SMESH_Hypothesis_i::Activate() { - myPOA->activate_object( this ); -} - -//============================================================================= -/*! - * SMESH_Hypothesis_i::~SMESH_Hypothesis_i - * - * Destructor - */ -//============================================================================= - -SMESH_Hypothesis_i::~SMESH_Hypothesis_i() -{ - MESSAGE( "SMESH_Hypothesis_i::~SMESH_Hypothesis_i" ); - if ( myBaseImpl ) - delete myBaseImpl; -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetName - * - * Get type name of hypothesis - */ -//============================================================================= - -char* SMESH_Hypothesis_i::GetName() -{ - MESSAGE( "SMESH_Hypothesis_i::GetName" ); - return CORBA::string_dup( myBaseImpl->GetName() ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetLibName - * - * Get plugin library name of hypothesis (required by persistency mechanism) - */ -//============================================================================= - -char* SMESH_Hypothesis_i::GetLibName() -{ - MESSAGE( "SMESH_Hypothesis_i::GetLibName" ); - return CORBA::string_dup( myBaseImpl->GetLibName() ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::SetLibName - * - * Set plugin library name of hypothesis (required by persistency mechanism) - */ -//============================================================================= - -void SMESH_Hypothesis_i::SetLibName(const char* theLibName) -{ - MESSAGE( "SMESH_Hypothesis_i::SetLibName" ); - myBaseImpl->SetLibName( theLibName ); -}; - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetId - * - * Get unique id of hypothesis - */ -//============================================================================= - -CORBA::Long SMESH_Hypothesis_i::GetId() -{ - MESSAGE( "SMESH_Hypothesis_i::GetId" ); - return myBaseImpl->GetID(); -} - -//============================================================================= -/*! - * SMESH_Hypothesis_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::SMESH_Hypothesis* SMESH_Hypothesis_i::GetImpl() -{ - MESSAGE( "SMESH_Hypothesis_i::GetImpl" ); - return myBaseImpl; -} - -//============================================================================= -/*! - * SMESH_Hypothesis_i::SaveTo - * - * Persistence: Dumps parameters to the string stream - */ -//============================================================================= - -char* SMESH_Hypothesis_i::SaveTo() -{ - MESSAGE( "SMESH_Hypothesis_i::SaveTo" ); - std::ostringstream os; - myBaseImpl->SaveTo( os ); - return CORBA::string_dup( os.str().c_str() ); -} - -//============================================================================= -/*! -* SMESH_Hypothesis_i::LoadFrom -* -* Persistence: Restores parameters from string -*/ -//============================================================================= - -void SMESH_Hypothesis_i::LoadFrom( const char* theStream ) -{ - MESSAGE( "SMESH_Hypothesis_i::LoadFrom" ); - std::istringstream is( theStream ); - myBaseImpl->LoadFrom( is ); -} diff --git a/src/SMESH_I/SMESH_Hypothesis_i.hxx b/src/SMESH_I/SMESH_Hypothesis_i.hxx deleted file mode 100644 index df89d82c8..000000000 --- a/src/SMESH_I/SMESH_Hypothesis_i.hxx +++ /dev/null @@ -1,115 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Hypothesis_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HYPOTHESIS_I_HXX_ -#define _SMESH_HYPOTHESIS_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) - -#include "SMESH_Hypothesis.hxx" -#include "SALOME_GenericObj_i.hh" - -#include "SMESH_Gen.hxx" - -// ====================================================== -// Generic hypothesis -// ====================================================== -class SMESH_Hypothesis_i: - public virtual POA_SMESH::SMESH_Hypothesis, - public virtual SALOME::GenericObj_i -{ -public: - // Constructor : placed in protected section to prohibit creation of generic class instance - SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA ); - -public: - // Destructor - virtual ~SMESH_Hypothesis_i(); - - // Get type name of hypothesis - char* GetName(); - - // Get plugin library name of hypothesis - char* GetLibName(); - - // Set plugin library name of hypothesis - void SetLibName( const char* theLibName ); - - // Get unique id of hypothesis - CORBA::Long GetId(); - - // Get implementation - ::SMESH_Hypothesis* GetImpl(); - - // _CS_gbo_ Activate the object using the POA - void Activate(); - - // Persistence - virtual char* SaveTo(); - virtual void LoadFrom( const char* theStream ); - -protected: - ::SMESH_Hypothesis* myBaseImpl; // base hypothesis implementation - - // _CS_gbo_070505 To keep the reference and delayed the activation - // in the methode Activate(). - PortableServer::POA_ptr myPOA; -}; - -// ====================================================== -// Generic hypothesis creator -// ====================================================== -class GenericHypothesisCreator_i -{ -public: - // Create a hypothesis - virtual SMESH_Hypothesis_i* Create(PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl) = 0; -}; - -//============================================================================= -// -// Specific Hypothesis Creators are generated with a template which inherits a -// generic hypothesis creator. Each creator returns an hypothesis of the type -// given in the template. -// -//============================================================================= -template class HypothesisCreator_i: public GenericHypothesisCreator_i -{ -public: - virtual SMESH_Hypothesis_i* Create (PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl) - { - return new T (thePOA, theStudyId, theGenImpl); - }; -}; - -#endif diff --git a/src/SMESH_I/SMESH_MEDFamily_i.cxx b/src/SMESH_I/SMESH_MEDFamily_i.cxx deleted file mode 100644 index 6e2508962..000000000 --- a/src/SMESH_I/SMESH_MEDFamily_i.cxx +++ /dev/null @@ -1,300 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_MEDFamily_i.cxx -// Module : SMESH - -using namespace std; -#include "SMESH_MEDFamily_i.hxx" -#include "utilities.h" -#include "Utils_CorbaException.hxx" - -//============================================================================= -/*! - * Default constructor - */ -//============================================================================= -SMESH_MEDFamily_i::SMESH_MEDFamily_i() -{ - BEGIN_OF("Default Constructor SMESH_MEDFamily_i"); - END_OF("Default Constructor SMESH_MEDFamily_i"); -} -//============================================================================= -/*! - * constructor par recopie - */ -//============================================================================= -SMESH_MEDFamily_i::SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f): - SMESH_MEDSupport_i(f._subMesh_i,f._name,f._description,f._entity), - _subMesh_i(f._subMesh_i), - _identifier(f._identifier), - _numberOfAttribute(f._numberOfAttribute), - _numberOfGroup(f._numberOfGroup), - _attributeValue(f._attributeValue) -{ - BEGIN_OF("Copy Constructor SMESH_MEDFamily_i"); - _attributeDescription=new string[_numberOfAttribute]; - for (int i=0;i<_numberOfAttribute;i++) { - _attributeDescription[i]=f._attributeDescription[i]; - }; - _groupName=new string[_numberOfGroup]; - for (int i=0;i<_numberOfAttribute;i++) { - _groupName[i]=f._groupName[i]; - }; - END_OF("Copy Constructor SMESH_MEDFamily_i"); -} -//============================================================================= -/*! - * Destructor - */ -//============================================================================= -SMESH_MEDFamily_i::~SMESH_MEDFamily_i() -{ -} -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDFamily_i::SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm, - string name, string description, SALOME_MED::medEntityMesh entity): - SMESH_MEDSupport_i( sm, name, description, entity ), - - _subMesh_i(sm), - _identifier(identifier), - _numberOfAttribute(0), - _attributeIdentifier((int*)NULL), - _attributeValue((int*)NULL), - _attributeDescription((string*)NULL), - _numberOfGroup(0), - _groupName((string*)NULL) -{ - BEGIN_OF("Constructor SMESH_MEDFamily_i"); - END_OF("Constructor SMESH_MEDFamily_i"); -} -//============================================================================= -/*! - * CORBA: Accessor for Family's Identifier - */ -//============================================================================= - -CORBA::Long SMESH_MEDFamily_i::getIdentifier() -throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - return _identifier; - -} -//============================================================================= -/*! - * CORBA: Accessor for number of attributes - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getNumberOfAttributes() -throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - return _numberOfAttribute; -} -//============================================================================= -/*! - * CORBA: Accessor for attributes identifiers - */ -//============================================================================= -SALOME_MED::long_array* SMESH_MEDFamily_i::getAttributesIdentifiers() -throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - }; - - SALOME_MED::long_array_var myseq= new SALOME_MED::long_array; - myseq->length(_numberOfAttribute); - for (int i=0;i<_numberOfAttribute;i++) - { - myseq[i]=_attributeIdentifier[i]; - }; - return myseq._retn(); - -} -//============================================================================= -/*! - * CORBA: Accessor for attribute identifier I - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getAttributeIdentifier(CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - }; - ASSERT (i <= _numberOfAttribute); - return _attributeIdentifier[i]; -} -//============================================================================= -/*! - * CORBA: Accessor for attributes values - */ -//============================================================================= -SALOME_MED::long_array* SMESH_MEDFamily_i::getAttributesValues() - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - }; - - SALOME_MED::long_array_var myseq= new SALOME_MED::long_array; - myseq->length(_numberOfAttribute); - for (int i=0;i<_numberOfAttribute;i++) - { - myseq[i]=_attributeValue[i]; - }; - return myseq._retn(); -} -//============================================================================= -/*! - * CORBA: Accessor for attribute value I - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getAttributeValue(CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - } - - ASSERT (i <= _numberOfAttribute); - return _attributeValue[i]; -} -//============================================================================= -/*! - * CORBA: Accessor for attributes desriptions - */ -//============================================================================= -SALOME_MED::string_array * SMESH_MEDFamily_i::getAttributesDescriptions() - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - } - SALOME_MED::string_array_var myseq = new SALOME_MED::string_array; - for (int i=0;i<_numberOfAttribute;i++) - { - myseq[i]=CORBA::string_dup(_attributeDescription[i].c_str()); - } - return myseq._retn(); -} -//============================================================================= -/*! - * CORBA: Accessor for attribute description i - */ -//============================================================================= -char * SMESH_MEDFamily_i::getAttributeDescription( CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); - if (_numberOfAttribute == 0) - { - MESSAGE("Les familles SMESH n ont pas d attribut"); - THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); - } - ASSERT (i <= _numberOfAttribute); - return CORBA::string_dup(_attributeDescription[i].c_str()); -} -//============================================================================= -/*! - * CORBA: Accessor for the number of groups - */ -//============================================================================= -CORBA::Long SMESH_MEDFamily_i::getNumberOfGroups() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return 0; -} -//============================================================================= -/*! - * CORBA: Accessor for the name of the group i - */ -//============================================================================= -char * SMESH_MEDFamily_i::getGroupName( CORBA::Long i) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} -//============================================================================= -/*! - * CORBA: Accessor for all the groups name - */ -//============================================================================= -SALOME_MED::string_array* SMESH_MEDFamily_i::getGroupsNames() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} diff --git a/src/SMESH_I/SMESH_MEDFamily_i.hxx b/src/SMESH_I/SMESH_MEDFamily_i.hxx deleted file mode 100644 index eeeef51ee..000000000 --- a/src/SMESH_I/SMESH_MEDFamily_i.hxx +++ /dev/null @@ -1,90 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_MEDFamily_i.hxx -// Module : SMESH - -#ifndef SMESH_MED_FAMILY_I_HXX_ -#define SMESH_MED_FAMILY_I_HXX_ - -#include "SMESH_MEDSupport_i.hxx" - -#include - -class SMESH_MEDFamily_i: - public virtual POA_SALOME_MED::FAMILY, - public virtual SMESH_MEDSupport_i -{ -protected : - SMESH_MEDFamily_i(); - ~SMESH_MEDFamily_i(); - - ::SMESH_subMesh_i* _subMesh_i; - - // Values - int _identifier; - int _numberOfAttribute; - int * _attributeIdentifier; - int * _attributeValue; - string * _attributeDescription; - int _numberOfGroup ; - string * _groupName ; - - -public : - - // Constructors and associated internal methods - SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm, - string name, string description, SALOME_MED::medEntityMesh entity ); - SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f); - - // IDL Methods - void setProtocol(SALOME::TypeOfCommunication typ) {} - void release() {} - SALOME::SenderInt_ptr getSenderForNumber(long int) {return SALOME::SenderInt::_nil();} - SALOME::SenderInt_ptr getSenderForNumberIndex() {return SALOME::SenderInt::_nil();} - - CORBA::Long getIdentifier() - throw (SALOME::SALOME_Exception); - CORBA::Long getNumberOfAttributes() - throw (SALOME::SALOME_Exception); - SALOME_MED::long_array* getAttributesIdentifiers() - throw (SALOME::SALOME_Exception); - CORBA::Long getAttributeIdentifier(CORBA::Long i) - throw (SALOME::SALOME_Exception); - SALOME_MED::long_array* getAttributesValues() - throw (SALOME::SALOME_Exception); - CORBA::Long getAttributeValue(CORBA::Long i) - throw (SALOME::SALOME_Exception); - SALOME_MED::string_array* getAttributesDescriptions() - throw (SALOME::SALOME_Exception); - char* getAttributeDescription( CORBA::Long i) - throw (SALOME::SALOME_Exception); - CORBA::Long getNumberOfGroups() - throw (SALOME::SALOME_Exception); - char * getGroupName( CORBA::Long i) - throw (SALOME::SALOME_Exception); - SALOME_MED::string_array* getGroupsNames() - throw (SALOME::SALOME_Exception); -}; -#endif /* MED_FAMILY_I_HXX_ */ diff --git a/src/SMESH_I/SMESH_MEDMesh_i.cxx b/src/SMESH_I/SMESH_MEDMesh_i.cxx deleted file mode 100644 index 3f1c017d4..000000000 --- a/src/SMESH_I/SMESH_MEDMesh_i.cxx +++ /dev/null @@ -1,1206 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_MEDMesh_i.cxx -// Module : SMESH - -#include "SMESH_MEDMesh_i.hxx" -#include "SMESH_Mesh_i.hxx" - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_SubMesh.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "utilities.h" -#include "Utils_CorbaException.hxx" - -#include "SMESH_MEDSupport_i.hxx" -#include "SMESH_MEDFamily_i.hxx" - -# include "Utils_ORB_INIT.hxx" -# include "Utils_SINGLETON.hxx" -# include "Utils_ExceptHandlers.hxx" - -extern "C" -{ -#include -} - -using namespace std; - -//============================================================================= -/*! - * Default constructor - */ -//============================================================================= -// PN Est-ce un const ? -SMESH_MEDMesh_i::SMESH_MEDMesh_i() -{ - BEGIN_OF("Default Constructor SMESH_MEDMesh_i"); - END_OF("Default Constructor SMESH_MEDMesh_i"); -} - -//============================================================================= -/*! - * Destructor - */ -//============================================================================= -SMESH_MEDMesh_i::~SMESH_MEDMesh_i() -{ -} - -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""), - _compte(false), - _creeFamily(false), - _famIdent(0), - _indexElts(0), - _indexEnts(0) -{ - BEGIN_OF("Constructor SMESH_MEDMesh_i"); - - _mesh_i = m_i; - _meshDS = _mesh_i->GetImpl().GetMeshDS(); - - END_OF("Constructor SMESH_MEDMesh_i"); -} - -//============================================================================= -/*! - * CORBA: Accessor for Name - */ -//============================================================================= -char *SMESH_MEDMesh_i::getName() throw(SALOME::SALOME_Exception) -{ - if (_meshDS == NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - - try - { - // A COMPLETER PAR LE NOM DU MAILLAGE - //return CORBA::string_dup(_mesh_i->getName().c_str()); - return CORBA::string_dup("toto"); - } - catch(...) - { - MESSAGE("Exception en accedant au nom"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for corbaindex cuisine interne - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA: Accessor for Space Dimension - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()throw(SALOME::SALOME_Exception) -{ - // PN : Il semblerait que la dimension soit fixee a 3 - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - return 3; -} - -//============================================================================= -/*! - * CORBA: Accessor for Mesh Dimension - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getMeshDimension()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - // PN : Il semblerait que la dimension soit fixee a 3 - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - return 3; -} -//============================================================================= -/*! - * CORBA: Accessor for the boolean _isAGrid - */ -//============================================================================= -CORBA::Boolean SMESH_MEDMesh_i::getIsAGrid() throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return false; -} -//============================================================================= -/*! - * CORBA: Accessor for the connectivities, to see if they exist - */ -//============================================================================= -CORBA::Boolean -SMESH_MEDMesh_i::existConnectivity(SALOME_MED::medConnectivity connectivityType, - SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!!!! IMPLEMENTED BUT ONLY PARTIALLY !!!!!!"); - - - return false; - -} -//============================================================================= -/*! - * CORBA: Accessor for Coordinate - */ -//============================================================================= -CORBA::Double SMESH_MEDMesh_i::getCoordinate(CORBA::Long Number, CORBA::Long Axis) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return 0.0; -} -//============================================================================= -/*! - * CORBA: Accessor for Coordinates System - */ -//============================================================================= -char *SMESH_MEDMesh_i::getCoordinatesSystem() throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - // PN : En dur. Non encore prevu - try - { - string systcoo = "CARTESIEN"; - return CORBA::string_dup(systcoo.c_str()); - } - catch(...) - { - MESSAGE("Exception en accedant au maillage"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for Coordinates - */ -//============================================================================= -SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates( - SALOME_MED::medModeSwitch typeSwitch) throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::double_array_var myseq = new SALOME_MED::double_array; - try - { - // PN : En dur - int spaceDimension = 3; - int nbNodes = _meshDS->NbNodes(); - SCRUTE(nbNodes); - myseq->length(nbNodes * spaceDimension); - int i = 0; - - SMDS_NodeIteratorPtr itNodes=_meshDS->nodesIterator(); - while(itNodes->more()) - { - const SMDS_MeshNode* node = itNodes->next(); - - if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE) - { - myseq[i * 3] = node->X(); - myseq[i * 3 + 1] = node->Y(); - myseq[i * 3 + 2] = node->Z(); - SCRUTE(myseq[i * 3]); - SCRUTE(myseq[i * 3 + 1]); - SCRUTE(myseq[i * 3 + 2]); - } - else - { - ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE); - myseq[i] = node->X(); - myseq[i + nbNodes] = node->Y(); - myseq[i + (nbNodes * 2)] = node->Z(); - SCRUTE(myseq[i]); - SCRUTE(myseq[i + nbNodes]); - SCRUTE(myseq[i + (nbNodes * 2)]); - } - i++; - } - } - catch(...) - { - MESSAGE("Exception en accedant aux coordonnees"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Accessor for Coordinates Names - */ -//============================================================================= -SALOME_MED::string_array * - SMESH_MEDMesh_i::getCoordinatesNames()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::string_array_var myseq = new SALOME_MED::string_array; - try - { - // PN : en dur - int spaceDimension = 3; - myseq->length(spaceDimension); - myseq[0] = CORBA::string_dup("x"); - myseq[1] = CORBA::string_dup("y"); - myseq[2] = CORBA::string_dup("z"); - } - catch(...) - { - MESSAGE("Exception en accedant aux noms des coordonnees"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); - -} - -//============================================================================= -/*! - * CORBA: Accessor for Coordinates Units - */ -//============================================================================= -SALOME_MED::string_array * - SMESH_MEDMesh_i::getCoordinatesUnits()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::string_array_var myseq = new SALOME_MED::string_array; - try - { - // PN : en dur - int spaceDimension = 3; - myseq->length(spaceDimension); - myseq[0] = CORBA::string_dup("m"); - myseq[1] = CORBA::string_dup("m"); - myseq[2] = CORBA::string_dup("m"); - } - catch(...) - { - MESSAGE("Exception en accedant aux unites des coordonnees"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Accessor for Number of Nodes - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - try - { - return _meshDS->NbNodes(); - } - catch(...) - { - MESSAGE("Exception en accedant au nombre de noeuds"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for number of Types - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity) -throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - try - { - if (!_compte) - calculeNbElts(); - int retour = 0; - if (_mapNbTypes.find(entity) != _mapNbTypes.end()) - retour = _mapNbTypes[entity]; - return retour; - } - catch(...) - { - MESSAGE("Exception en accedant au nombre de Types"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for existing geometry element types - * Not implemented for MED_ALL_ENTITIES - */ -//============================================================================= -SALOME_MED::medGeometryElement_array * - SMESH_MEDMesh_i::getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME:: - SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - if (entity == SALOME_MED::MED_ALL_ENTITIES) - THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES", - SALOME::BAD_PARAM); - if (!_compte) - calculeNbElts(); - SALOME_MED::medGeometryElement_array_var myseq = - new SALOME_MED::medGeometryElement_array; - try - { - if (_mapNbTypes.find(entity) == _mapNbTypes.end()) - THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh", - SALOME::BAD_PARAM); - int nbTypes = _mapNbTypes[entity]; - - myseq->length(nbTypes); - - if (_mapIndToVectTypes.find(entity) == _mapIndToVectTypes.end()) - THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh", - SALOME::INTERNAL_ERROR); - - int index = _mapIndToVectTypes[entity]; - ASSERT(_TypesId[index].size() != 0); - int i = 0; - vector < SALOME_MED::medGeometryElement >::iterator it; - for (it = _TypesId[index].begin(); it != _TypesId[index].end(); it++) - { - myseq[i++] = *it; - }; - } - catch(...) - { - MESSAGE("Exception en accedant aux differents types"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Returns number of elements of type medGeometryElement - * Not implemented for MED_ALL_ELEMENTS - * implemented for MED_ALL_ENTITIES - * - * Dans cette implementation, il n est pas prevu de tenir compte du entity - * qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED:: - medEntityMesh entity, - SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - if (geomElement == SALOME_MED::MED_ALL_ELEMENTS) - THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ELEMENTS", - SALOME::BAD_PARAM); - if (!_compte) - calculeNbElts(); - - try - { - int retour = 0; - if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end()) - { - int index = _mapIndToSeqElts[geomElement]; - - retour = _seq_elemId[index]->length(); - } - return retour; - } - catch(...) - { - MESSAGE("Exception en accedant au nombre d élements"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", - SALOME::INTERNAL_ERROR); - } -} - -//============================================================================= -/*! - * CORBA: Accessor for connectivities - */ -//============================================================================= -SALOME_MED::long_array * -SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch, - SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - if (mode != SALOME_MED::MED_NODAL) - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - if (typeSwitch == SALOME_MED::MED_NO_INTERLACE) - THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented", SALOME::BAD_PARAM); - if (!_compte) - calculeNbElts(); - - // Faut-il renvoyer un pointeur vide ??? - if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end()) - THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh", - SALOME::BAD_PARAM); - - int index = _mapIndToSeqElts[geomElement]; - - return _seq_elemId[index]._retn(); -} - -//============================================================================= -/*! - * CORBA: Accessor for connectivities - */ -//============================================================================= -SALOME_MED::long_array * -SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity) - throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: Find an element corresponding to the given connectivity - */ -//============================================================================= -CORBA::Long -SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement type, - const SALOME_MED::long_array & connectivity) - throw(SALOME::SALOME_Exception) -{ - const char *LOC = "getElementNumber "; - MESSAGE(LOC << "Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return -1; -} - -//============================================================================= -/*! - * CORBA: Accessor for Ascendant connectivities - * not implemented for MED_ALL_ENTITIES and MED_MAILLE - */ -//============================================================================= -SALOME_MED::long_array * - SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED:: - medConnectivity mode) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: Accessor for connectivities - */ -//============================================================================= -SALOME_MED::long_array * - SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED:: - medConnectivity mode) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: Returns number of families within the mesh - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED:: - medEntityMesh entity) throw(SALOME::SALOME_Exception) -{ - if (_creeFamily == false) - createFamilies(); - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - return _families.size(); -} - -//============================================================================= -/*! - * CORBA: Returns number of groups within the mesh - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity) -throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - MESSAGE(" Pas d implementation des groupes dans SMESH"); - return 0; -} - -//============================================================================= -/*! - * CORBA: Returns references for families within the mesh - */ -//============================================================================= -SALOME_MED::Family_array * - SMESH_MEDMesh_i::getFamilies(SALOME_MED:: - medEntityMesh entity) throw(SALOME::SALOME_Exception) -{ - if (_creeFamily == false) - createFamilies(); - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array; - int nbfam = _families.size(); - myseq->length(nbfam); - int i = 0; - vector < SALOME_MED::FAMILY_ptr >::iterator it; - for (it = _families.begin(); it != _families.end(); it++) - { - myseq[i++] = *it; - }; - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Returns references for family i within the mesh - */ -//============================================================================= -SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED:: - medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - if (_creeFamily == false) - createFamilies(); - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - - SCRUTE(_families[i]->getName()); - MESSAGE(" SMESH_MEDMesh_i::getFamily " << i) return _families[i]; -} - -//============================================================================= -/*! - * CORBA: Returns references for groups within the mesh - */ -//============================================================================= -SALOME_MED::Group_array * - SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME:: - SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - MESSAGE(" Pas d implementation des groupes dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA: Returns references for group i within the mesh - */ -//============================================================================= -SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED:: - medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - if (_mesh_i == 0) - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - MESSAGE(" Pas d implementation des groupes dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM); -} -//============================================================================= -/*! - * CORBA: Returns references for the global numbering index - */ -//============================================================================= -SALOME_MED::long_array* -SMESH_MEDMesh_i::getGlobalNumberingIndex(SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * CORBA: Returns references for the support of boundary elements of type - * entity - */ -//============================================================================= -SALOME_MED::SUPPORT_ptr -SMESH_MEDMesh_i::getBoundaryElements(SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * CORBA: Returns references for the support of the skin of the support - * mySupport3D - */ -//============================================================================= -SALOME_MED::SUPPORT_ptr -SMESH_MEDMesh_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: - */ -//============================================================================= -SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * CORBA: add the Mesh in the StudyManager - * PN Pas Implemente - */ -//============================================================================= -void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy, - SALOME_MED::MESH_ptr myIor) throw(SALOME::SALOME_Exception) -{ - BEGIN_OF("MED_Mesh_i::addInStudy"); - if (_meshId != "") - { - MESSAGE("Mesh already in Study"); - THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study", - SALOME::BAD_PARAM); - }; - - /* - * SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder(); - * - * // Create SComponent labelled 'MED' if it doesn't already exit - * SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED"); - * if ( CORBA::is_nil(medfather) ) - * { - * MESSAGE("Add Component MED"); - * medfather = myBuilder->NewComponent("MED"); - * //myBuilder->AddAttribute (medfather,SALOMEDS::Name,"MED"); - * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow( - * myBuilder->FindOrCreateAttribute(medfather, "AttributeName")); - * aName->SetValue("MED"); - * - * myBuilder->DefineComponentInstance(medfather,myIor); - * - * } ; - * - * MESSAGE("Add a mesh Object under MED"); - * myBuilder->NewCommand(); - * SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfather); - * - * ORB_INIT &init = *SINGLETON_::Instance() ; - * ASSERT(SINGLETON_::IsAlreadyExisting()) ; - * CORBA::ORB_var &orb = init(0,0); - * string iorStr = orb->object_to_string(myIor); - * //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.c_str()); - * SALOMEDS::AttributeIOR_var aIOR = SALOMEDS::AttributeIOR::_narrow( - * myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR")); - * aIOR->SetValue(iorStr.c_str()); - * - * //myBuilder->AddAttribute(newObj,SALOMEDS::Name,_mesh_i->getName().c_str()); - * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow( - * myBuilder->FindOrCreateAttribute(newObj, "AttributeName")); - * aName->SetValue(_mesh_i->getName().c_str()); - * - * _meshId = newObj->GetID(); - * myBuilder->CommitCommand(); - * - */ - END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)"); -} - -//============================================================================= -/*! - * CORBA: write mesh in a med file - */ -//============================================================================= -void SMESH_MEDMesh_i::write(CORBA::Long i, const char *driverMeshName) -throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA: read mesh in a med file - */ -//============================================================================= -void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA : release driver - */ -//============================================================================= -void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); -} - -//============================================================================= -/*! - * CORBA : attach driver - */ -//============================================================================= -CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType, - const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; -} - -//============================================================================= -/*! - * Calcule le Nb d'elements par entite geometrique - */ -//============================================================================= -void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) -{ - if (!_compte) - { - _compte = true; - - _mapNbTypes[SALOME_MED::MED_NODE] = 1; - // On compte les aretes MED_SEG2 ou MED_SEG3 - // On range les elements dans les vecteurs correspondants - - _mapIndToSeqElts[SALOME_MED::MED_SEG2] = _indexElts++; - _mapIndToSeqElts[SALOME_MED::MED_SEG3] = _indexElts++; - _mapIndToVectTypes[SALOME_MED::MED_EDGE] = _indexEnts++; - - int trouveSeg2 = 0; - int trouveSeg3 = 0; - SALOME_MED::medGeometryElement medElement; - - SMDS_EdgeIteratorPtr itEdges=_meshDS->edgesIterator(); - while(itEdges->more()) - { - const SMDS_MeshEdge* elem = itEdges->next(); - int nb_of_nodes = elem->NbNodes(); - - switch (nb_of_nodes) - { - case 2: - { - medElement = SALOME_MED::MED_SEG2; - if (trouveSeg2 == 0) - { - trouveSeg2 = 1; - _TypesId[SALOME_MED::MED_EDGE]. - push_back(SALOME_MED::MED_SEG2); - } - break; - } - case 3: - { - medElement = SALOME_MED::MED_SEG3; - if (trouveSeg3 == 0) - { - trouveSeg3 = 1; - _TypesId[SALOME_MED::MED_EDGE]. - push_back(SALOME_MED::MED_SEG3); - } - break; - } - } - int index = _mapIndToSeqElts[medElement]; - SCRUTE(index); - // Traitement de l arete - - int longueur = _seq_elemId[index]->length(); - _seq_elemId[index]->length(longueur + nb_of_nodes); - - SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); - - for(int k=0; itn->more(); k++) - _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - } - - _mapNbTypes[SALOME_MED::MED_EDGE] = trouveSeg2 + trouveSeg3; - - // On compte les faces MED_TRIA3, MED_HEXA8, MED_TRIA6 - // On range les elements dans les vecteurs correspondants - int trouveTria3 = 0; - int trouveTria6 = 0; - int trouveQuad4 = 0; - - _mapIndToSeqElts[SALOME_MED::MED_TRIA3] = _indexElts++; - _mapIndToSeqElts[SALOME_MED::MED_TRIA6] = _indexElts++; - _mapIndToSeqElts[SALOME_MED::MED_QUAD4] = _indexElts++; - _mapIndToVectTypes[SALOME_MED::MED_FACE] = _indexEnts++; - - SMDS_FaceIteratorPtr itFaces=_meshDS->facesIterator(); - while(itFaces->more()) - { - const SMDS_MeshFace * elem = itFaces->next(); - int nb_of_nodes = elem->NbNodes(); - - switch (nb_of_nodes) - { - case 3: - { - medElement = SALOME_MED::MED_TRIA3; - if (trouveTria3 == 0) - { - trouveTria3 = 1; - _TypesId[SALOME_MED::MED_FACE]. - push_back(SALOME_MED::MED_TRIA3); - } - break; - } - case 4: - { - medElement = SALOME_MED::MED_QUAD4; - if (trouveQuad4 == 0) - { - trouveQuad4 = 1; - _TypesId[SALOME_MED::MED_FACE]. - push_back(SALOME_MED::MED_QUAD4); - } - break; - } - case 6: - { - medElement = SALOME_MED::MED_TRIA6; - if (trouveTria6 == 0) - { - trouveTria6 = 1; - _TypesId[SALOME_MED::MED_FACE]. - push_back(SALOME_MED::MED_TRIA6); - } - break; - } - } - int index = _mapIndToSeqElts[medElement]; - SCRUTE(index); - - // Traitement de la face - // Attention La numérotation des noeuds Med commence a 1 - - int longueur = _seq_elemId[index]->length(); - _seq_elemId[index]->length(longueur + nb_of_nodes); - - SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); - - for(int k=0; itn->more(); k++) - _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - } //itFaces - - _mapNbTypes[SALOME_MED::MED_FACE] = - trouveTria3 + trouveTria6 + trouveQuad4; - - _mapIndToSeqElts[SALOME_MED::MED_HEXA8] = _indexElts++; - _mapIndToVectTypes[SALOME_MED::MED_CELL] = _indexEnts++; - int index = _mapIndToSeqElts[medElement]; - - int trouveHexa8 = 0; - - SMDS_VolumeIteratorPtr itVolumes=_meshDS->volumesIterator(); - while(itVolumes->more()) - { - const SMDS_MeshVolume * elem = itVolumes->next(); - - int nb_of_nodes = elem->NbNodes(); - medElement = SALOME_MED::MED_HEXA8; - ASSERT(nb_of_nodes = 8); - - if (trouveHexa8 == 0) - { - trouveHexa8 = 1; - _TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MED_HEXA8); - }; - // Traitement de la maille - int longueur = _seq_elemId[index]->length(); - _seq_elemId[index]->length(longueur + nb_of_nodes); - - SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); - for(int k=0; itn->more(); k++) - _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - } - - _mapNbTypes[SALOME_MED::MED_CELL] = trouveHexa8; - _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES] - = - trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 + - trouveSeg3; - }// fin du _compte -}; - -//============================================================================= -/*! - * Creation des familles - */ -//============================================================================= -void SMESH_MEDMesh_i::createFamilies() throw(SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - string famDes = ("Je ne sais pas"); - string famName0 = "Famille_"; - string famName; - char numero[10]; - - if (_creeFamily == false) - { - _creeFamily = true; - SMESH_subMesh_i *subMeshServant; - - map < int, SMESH_subMesh_i * >::iterator it; - for (it = _mesh_i->_mapSubMesh_i.begin(); - it != _mesh_i->_mapSubMesh_i.end(); it++) - { - SMESH_subMesh_i *submesh_i = (*it).second; - int famIdent = (*it).first; - - ASSERT(famIdent < 999999999); - sprintf(numero, "%d\n", famIdent); - famName = famName0 + numero; - - SMESH_MEDFamily_i *famservant = - new SMESH_MEDFamily_i(famIdent, submesh_i, - famName, famDes, SALOME_MED::MED_NODE); - SALOME_MED::FAMILY_ptr famille = - SALOME_MED::FAMILY::_narrow(famservant-> - POA_SALOME_MED::FAMILY::_this()); - _families.push_back(famille); - } - } -}; -//============================================================================= -/*! - * Gives informations of the considered mesh. - */ -//============================================================================= -SALOME_MED::MESH::meshInfos * SMESH_MEDMesh_i::getMeshGlobal() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * Gives informations on coordinates of the considered mesh. - */ -//============================================================================= -SALOME_MED::MESH::coordinateInfos * SMESH_MEDMesh_i::getCoordGlobal() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * Gives informations on connectivities of the considered mesh for the entity - * entity. - */ -//============================================================================= -SALOME_MED::MESH::connectivityInfos * -SMESH_MEDMesh_i::getConnectGlobal(SALOME_MED::medEntityMesh entity) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return NULL; -} -//============================================================================= -/*! - * Gives the type of the element number of entity entity - */ -//============================================================================= -SALOME_MED::medGeometryElement -SMESH_MEDMesh_i::getElementType(SALOME_MED::medEntityMesh entity, - CORBA::Long number) - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); - - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - - return (SALOME_MED::medGeometryElement) 0; -} diff --git a/src/SMESH_I/SMESH_MEDSupport_i.cxx b/src/SMESH_I/SMESH_MEDSupport_i.cxx deleted file mode 100644 index 7b5289ebb..000000000 --- a/src/SMESH_I/SMESH_MEDSupport_i.cxx +++ /dev/null @@ -1,401 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_MEDSupport_i.cxx -// Module : SMESH - -using namespace std; -#include "SMESH_MEDSupport_i.hxx" -#include "utilities.h" -#include "Utils_CorbaException.hxx" -#include "Utils_ExceptHandlers.hxx" - -#include -#include "SMESHDS_Mesh.hxx" - -#include "SMESH_subMesh.hxx" -#include "SMESH_Mesh_i.hxx" -#include "SMESH_subMesh_i.hxx" - - -//============================================================================= -/*! - * Default constructor - */ -//============================================================================= -SMESH_MEDSupport_i::SMESH_MEDSupport_i() -{ - BEGIN_OF("Default Constructor SMESH_MEDSupport_i"); - END_OF("Default Constructor SMESH_MEDSupport_i"); -} - -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDSupport_i::SMESH_MEDSupport_i(SMESH_subMesh_i * sm, string name, - string description, SALOME_MED::medEntityMesh entity) - :_subMesh_i(sm), _name(name), _description(description), _entity(entity), - _seqNumber(false), _seqLength(0) -{ - BEGIN_OF("Constructor SMESH_MEDSupport_i"); - - _meshDS = _subMesh_i->_mesh_i->GetImpl().GetMeshDS(); - - int subMeshId = _subMesh_i->GetId(); - - MESSAGE(" subMeshId " << subMeshId) - - if (_subMesh_i->_mesh_i->_mapSubMesh.find(subMeshId) != - _subMesh_i->_mesh_i->_mapSubMesh.end()) - { - ::SMESH_subMesh * subMesh = _subMesh_i->_mesh_i->_mapSubMesh[subMeshId]; - _subMeshDS = subMesh->GetSubMeshDS(); - } - - if (_entity == SALOME_MED::MED_NODE) - { - _numberOfGeometricType = 1; - _geometricType = new SALOME_MED::medGeometryElement[1]; - _geometricType[0] = SALOME_MED::MED_NONE; - } - else - { - MESSAGE("Pas implemente dans cette version"); - THROW_SALOME_CORBA_EXCEPTION - ("Seules les familles de noeuds sont implementees ", - SALOME::BAD_PARAM); - } - - END_OF("Constructor SMESH_MEDSupport_i"); -} - -//============================================================================= -/*! - * Constructor - */ -//============================================================================= -SMESH_MEDSupport_i:: -SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s):_subMesh_i(s._subMesh_i), -_name(s._name), _description(s._description), _entity(s._entity), -_seqNumber(false), _seqLength(0) -{ - BEGIN_OF("Constructor SMESH_MEDSupport_i"); - - _meshDS = _subMesh_i->_mesh_i->GetImpl().GetMeshDS(); - - int subMeshId = _subMesh_i->GetId(); - if (_subMesh_i->_mesh_i->_mapSubMesh.find(subMeshId) != - _subMesh_i->_mesh_i->_mapSubMesh.end()) - { - ::SMESH_subMesh * subMesh = _subMesh_i->_mesh_i->_mapSubMesh[subMeshId]; - _subMeshDS = subMesh->GetSubMeshDS(); - } - - END_OF("Constructor SMESH_MEDSupport_i"); -} - -//============================================================================= -/*! - * Destructor - */ -//============================================================================= - -SMESH_MEDSupport_i::~SMESH_MEDSupport_i() -{ -} - -//============================================================================= -/*! - * CORBA: Accessor for Corba Index - */ -//============================================================================= - -CORBA::Long SMESH_MEDSupport_i::getCorbaIndex()throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS == NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - MESSAGE("Not implemented for SMESH_i"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented ", SALOME::BAD_PARAM); - -} - -//============================================================================= -/*! - * CORBA: Accessor for Name - */ -//============================================================================= - -char *SMESH_MEDSupport_i::getName() throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return CORBA::string_dup(_name.c_str()); - -} - -//============================================================================= -/*! - * CORBA: Accessor for Description - */ -//============================================================================= - -char *SMESH_MEDSupport_i::getDescription() throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return CORBA::string_dup(_description.c_str()); -} - -//============================================================================= -/*! - * CORBA: Accessor for Mesh - */ -//============================================================================= - -SALOME_MED::MESH_ptr SMESH_MEDSupport_i::getMesh()throw(SALOME:: - SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - - return _subMesh_i->_mesh_i->GetMEDMesh(); -} - -//============================================================================= -/*! - * CORBA: boolean indicating if support concerns all elements - */ -//============================================================================= - -CORBA::Boolean SMESH_MEDSupport_i::isOnAllElements()throw(SALOME:: - SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - if (_seqNumber == false) - { - if (_entity != SALOME_MED::MED_NONE) - { - _seqLength = _subMeshDS->NbNodes(); - _seqNumber = true; - } - else - { - MESSAGE("Only Node Families are implemented "); - THROW_SALOME_CORBA_EXCEPTION("Not implemented Yet ", - SALOME::BAD_PARAM); - } - } - try - { - _isOnAllElements = (_seqLength == _meshDS->NbNodes()); - } - catch(...) - { - MESSAGE("unable to acces related Mesh"); - THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", - SALOME::INTERNAL_ERROR); - }; - return _isOnAllElements; -} - -//============================================================================= -/*! - * CORBA: Accessor for type of support's entity - */ -//============================================================================= - -SALOME_MED::medEntityMesh SMESH_MEDSupport_i::getEntity()throw(SALOME:: - SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return _entity; -} - -//============================================================================= -/*! - * CORBA: Accessor for types of geometry elements - */ -//============================================================================= - -SALOME_MED::medGeometryElement_array * - SMESH_MEDSupport_i::getTypes()throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - SALOME_MED::medGeometryElement_array_var myseq = - new SALOME_MED::medGeometryElement_array; - try - { - int mySeqLength = _numberOfGeometricType; - myseq->length(mySeqLength); - for (int i = 0; i < mySeqLength; i++) - { - myseq[i] = _geometricType[i]; - } - } - catch(...) - { - MESSAGE("Exception lors de la recherche des differents types"); - THROW_SALOME_CORBA_EXCEPTION("Unable to acces Support Types", - SALOME::INTERNAL_ERROR); - } - return myseq._retn(); -} - -//============================================================================= -/*! - * CORBA: Number of different types of geometry elements - * existing in the support - */ -//============================================================================= -CORBA::Long SMESH_MEDSupport_i::getNumberOfElements(SALOME_MED:: - medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return _numberOfGeometricType; - -} - -//============================================================================= -/*! - * CORBA: get Nodes - */ -//============================================================================= - -SALOME_MED::long_array * SMESH_MEDSupport_i::getNumber( - SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - - // A changer s'il ne s agit plus seulement de famille de noeuds - if (geomElement != SALOME_MED::MED_NONE) - THROW_SALOME_CORBA_EXCEPTION("Not implemented", SALOME::BAD_PARAM); - - SALOME_MED::long_array_var myseq = new SALOME_MED::long_array; - - int i = 0; - myseq->length(_subMeshDS->NbNodes()); - - SMDS_NodeIteratorPtr it = _subMeshDS->GetNodes(); - while(it->more()) - { - myseq[i] = it->next()->GetID(); - i++; - }; - - SCRUTE(myseq->length()); - MESSAGE("End of SMESH_MEDSupport_i::getNumber"); - return myseq._retn(); - -} - -//============================================================================= -/*! - * CORBA: Global Nodes Index (optionnaly designed by the user) - * CORBA: ?????????????????????????????? - */ -//============================================================================= - -SALOME_MED::long_array * - SMESH_MEDSupport_i::getNumberIndex()throw(SALOME::SALOME_Exception) -{ - MESSAGE("Not implemented for SMESH_i"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} -//============================================================================= -/*! - * CORBA: Array containing indexes for elements included in the support - */ -//============================================================================= - -CORBA::Long SMESH_MEDSupport_i::getNumberOfGaussPoint(SALOME_MED:: - medGeometryElement geomElement) throw(SALOME::SALOME_Exception) -{ - MESSAGE("Not implemented for SMESH_i"); - return 0; -} -//============================================================================= -/*! - * Gives the number of types of elements included in the support - */ -//============================================================================= -CORBA::Long SMESH_MEDSupport_i::getNumberOfTypes() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return 0; -} -//============================================================================= -/*! - * Gives CORBA: Array containing the numbers of Gauss point of elements - * included in the support - */ -//============================================================================= -SALOME_MED::long_array* SMESH_MEDSupport_i::getNumbersOfGaussPoint() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} -//============================================================================= -/*! - * build the object which will contain all the boundary elements of the mesh. - */ -//============================================================================= -void SMESH_MEDSupport_i::getBoundaryElements() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); -} -//============================================================================= -/*! - * Gives information on the support - */ -//============================================================================= -SALOME_MED::SUPPORT::supportInfos * SMESH_MEDSupport_i::getSupportGlobal() - throw (SALOME::SALOME_Exception) -{ - MESSAGE("!!! NOT YET IMPLEMENTED !!!!"); - THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); - return NULL; -} diff --git a/src/SMESH_I/SMESH_MEDSupport_i.hxx b/src/SMESH_I/SMESH_MEDSupport_i.hxx deleted file mode 100644 index c888661b6..000000000 --- a/src/SMESH_I/SMESH_MEDSupport_i.hxx +++ /dev/null @@ -1,111 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_MEDSupport_i.hxx -// Module : SMESH - -#ifndef _MED_SMESH_MEDSUPPORT_I_HXX_ -#define _MED_SMESH_MEDSUPPORT_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(MED) -#include - -#include "SMESHDS_Mesh.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" - -#include "SMESH_MEDSupport_i.hxx" -#include "SALOME_GenericObj_i.hh" -class SMESH_subMesh_i; - -class SMESH_MEDSupport_i: - public virtual POA_SALOME_MED::SUPPORT, public virtual SALOME::GenericObj_i -{ - public: - -// Constructors and associated internal methods - SMESH_MEDSupport_i(SMESH_subMesh_i * sm, - string name, string description, SALOME_MED::medEntityMesh entity); - SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s); - -// IDL Methods - char *getName() throw(SALOME::SALOME_Exception); - char *getDescription() throw(SALOME::SALOME_Exception); - SALOME_MED::MESH_ptr getMesh() throw(SALOME::SALOME_Exception); - CORBA::Boolean isOnAllElements() throw(SALOME::SALOME_Exception); - SALOME_MED::medEntityMesh getEntity() throw(SALOME::SALOME_Exception); - CORBA::Long - getNumberOfElements(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); - - CORBA::Long getNumberOfTypes() throw (SALOME::SALOME_Exception); - - SALOME_MED::long_array * - getNumber(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); - - SALOME_MED::long_array * getNumberIndex() - throw(SALOME::SALOME_Exception); - - CORBA::Long - getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); - - SALOME_MED::long_array* getNumbersOfGaussPoint() - throw (SALOME::SALOME_Exception); - - SALOME_MED::medGeometryElement_array *getTypes() - throw(SALOME::SALOME_Exception); - - void getBoundaryElements() throw (SALOME::SALOME_Exception); - - CORBA::Long getCorbaIndex() throw(SALOME::SALOME_Exception); - - SALOME_MED::SUPPORT::supportInfos * getSupportGlobal() - throw (SALOME::SALOME_Exception); - - void createSeq() throw(SALOME::SALOME_Exception); - - public: //public field - const SMESHDS_SubMesh * _subMeshDS; - ::SMESH_subMesh_i * _subMesh_i; - - SMESHDS_Mesh * _meshDS; - string _name; - string _description; - bool _isOnAllElements; - bool _seqNumber; - int _seqLength; - - SALOME_MED::medEntityMesh _entity; - SALOME_MED::medGeometryElement * _geometricType; - int _numberOfGeometricType; - - protected: - SMESH_MEDSupport_i(); - ~SMESH_MEDSupport_i(); -}; - -#endif /* _MED_MEDSUPPORT_I_HXX_ */ diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx deleted file mode 100644 index 42fac7d5d..000000000 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ /dev/null @@ -1,268 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Mesh_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MESH_I_HXX_ -#define _SMESH_MESH_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Group) -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) -#include CORBA_CLIENT_HEADER(GEOM_Gen) -#include CORBA_CLIENT_HEADER(MED) - -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh_i.hxx" -#include "SMESH_subMesh.hxx" - -#include "SALOME_GenericObj_i.hh" - -class SMESH_Gen_i; -class SMESH_GroupBase_i; - -#include - -class SMESH_Mesh_i: - public virtual POA_SMESH::SMESH_Mesh, - public virtual SALOME::GenericObj_i -{ - SMESH_Mesh_i(); - SMESH_Mesh_i(const SMESH_Mesh_i&); -public: - SMESH_Mesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* myGen_i, - CORBA::Long studyId ); - - virtual ~SMESH_Mesh_i(); - - // --- CORBA - void SetShape( GEOM::GEOM_Object_ptr theShapeObject ) - throw (SALOME::SALOME_Exception); - - GEOM::GEOM_Object_ptr GetShapeToMesh() - throw (SALOME::SALOME_Exception); - - SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) - throw (SALOME::SALOME_Exception); - - SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) - throw (SALOME::SALOME_Exception); - - SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, const char* theName) - throw (SALOME::SALOME_Exception); - - void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr CreateGroup( SMESH::ElementType theElemType, const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_GroupOnGeom_ptr CreateGroupFromGEOM(SMESH::ElementType theElemType, - const char* theName, - GEOM::GEOM_Object_ptr theGeomObj ) - throw (SALOME::SALOME_Exception); - - void RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup ) - throw (SALOME::SALOME_Exception); - - void RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr UnionGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr IntersectGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Group_ptr CutGroups( SMESH::SMESH_GroupBase_ptr theGroup1, - SMESH::SMESH_GroupBase_ptr theGroup2, - const char* theName ) - throw (SALOME::SALOME_Exception); - -// SMESH::string_array* GetLog(CORBA::Boolean clearAfterGet) -// throw (SALOME::SALOME_Exception); - - SMESH::log_array* GetLog(CORBA::Boolean clearAfterGet) - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_MeshEditor_ptr GetMeshEditor(); - - void ClearLog() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetId() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetStudyId() - throw (SALOME::SALOME_Exception); - - // --- C++ interface - - void SetImpl(::SMESH_Mesh* impl); - ::SMESH_Mesh& GetImpl(); // :: force no namespace here - - SMESH_Gen_i* GetGen() { return _gen_i; } - - int ImportUNVFile( const char* theFileName ) - throw (SALOME::SALOME_Exception); - - int ImportSTLFile( const char* theFileName ) - throw (SALOME::SALOME_Exception); - - /*! - * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value - */ - SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName ) - throw (SALOME::SALOME_Exception); - - void ExportToMED( const char* file, CORBA::Boolean auto_groups, SMESH::MED_VERSION theVersion ) - throw (SALOME::SALOME_Exception); - void ExportMED( const char* file, CORBA::Boolean auto_groups ) - throw (SALOME::SALOME_Exception); - - void ExportDAT( const char* file ) - throw (SALOME::SALOME_Exception); - void ExportUNV( const char* file ) - throw (SALOME::SALOME_Exception); - void ExportSTL( const char* file, const bool isascii ) - throw (SALOME::SALOME_Exception); - - SALOME_MED::MESH_ptr GetMEDMesh() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbNodes() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbElements() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbEdges() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbFaces() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbTriangles() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbQuadrangles() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPolygons() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbVolumes() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbTetras() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbHexas() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPyramids() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPrisms() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbPolyhedrons() - throw (SALOME::SALOME_Exception); - - CORBA::Long NbSubMesh() - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsId() - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetNodesId() - throw (SALOME::SALOME_Exception); - - SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception); - - char* Dump(); - - // Internal methods not available through CORBA - // They are called by corresponding interface methods - SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp); - - SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp); - - int importMEDFile( const char* theFileName, const char* theMeshName ); - - SMESH::SMESH_subMesh_ptr createSubMesh( GEOM::GEOM_Object_ptr theSubShapeObject ); - - void removeSubMesh(SMESH::SMESH_subMesh_ptr theSubMesh, - GEOM::GEOM_Object_ptr theSubShapeObject ); - - SMESH::SMESH_GroupBase_ptr createGroup(SMESH::ElementType theElemType, - const char* theName, - const TopoDS_Shape& theShape = TopoDS_Shape()); - - void removeGroup( const int theId ); - - SMESH::SMESH_subMesh_ptr getSubMesh(int shapeID); - // return an existing subMesh object for the shapeID. shapeID == submeshID. - - const map& getGroups() { return _mapGroups; } - // return an existing group object. - - virtual SMESH::long_array* GetIDs(); - - map _mapSubMesh_i; //NRI - map _mapSubMesh; //NRI - -private: - static int myIdGenerator; - ::SMESH_Mesh* _impl; // :: force no namespace here - SMESH_Gen_i* _gen_i; - int _id; // id given by creator (unique within the creator instance) - int _studyId; - map _mapSubMeshIor; - map _mapGroups; - map _mapHypo; -}; - -#endif - diff --git a/src/SMESH_I/SMESH_Pattern_i.hxx b/src/SMESH_I/SMESH_Pattern_i.hxx deleted file mode 100644 index 29b5084cd..000000000 --- a/src/SMESH_I/SMESH_Pattern_i.hxx +++ /dev/null @@ -1,103 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_Pattern_i.hxx -// Created : Fri Aug 20 16:03:15 2004 -// Author : Edward AGAPOV (eap) - -// $Header: - -#ifndef SMESH_Pattern_I_HeaderFile -#define SMESH_Pattern_I_HeaderFile - -#include "SALOMEconfig.h" -#include CORBA_SERVER_HEADER(SMESH_Pattern) -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_CLIENT_HEADER(GEOM_Gen) - -#include -#include "SMESH_Pattern.hxx" - -class SMESH_Gen_i; -class SMESH_Mesh; - -class SMESH_Pattern_i: - public virtual POA_SMESH::SMESH_Pattern -{ - public: - - SMESH_Pattern_i (SMESH_Gen_i* theGen_i); - - CORBA::Boolean LoadFromFile(const char* theFileContents); - - CORBA::Boolean LoadFromFace(SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theFace, - CORBA::Boolean theProject); - - CORBA::Boolean LoadFrom3DBlock(SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theBlock); - - SMESH::point_array* ApplyToFace(GEOM::GEOM_Object_ptr theFace, - GEOM::GEOM_Object_ptr theVertexOnKeyPoint1, - CORBA::Boolean theReverse); - - SMESH::point_array* ApplyTo3DBlock(GEOM::GEOM_Object_ptr theBlock, - GEOM::GEOM_Object_ptr theVertex000, - GEOM::GEOM_Object_ptr theVertex001); - - SMESH::point_array* ApplyToMeshFaces(SMESH::SMESH_Mesh_ptr theMesh, - const SMESH::long_array& theFacesIDs, - CORBA::Long theNodeIndexOnKeyPoint1, - CORBA::Boolean theReverse); - - SMESH::point_array* ApplyToHexahedrons(SMESH::SMESH_Mesh_ptr theMesh, - const SMESH::long_array& theVolumesIDs, - CORBA::Long theNode000Index, - CORBA::Long theNode001Index); - - CORBA::Boolean MakeMesh (SMESH::SMESH_Mesh_ptr theMesh, - const CORBA::Boolean CreatePolygons, - const CORBA::Boolean CreatePolyedrs); - - SMESH::SMESH_Pattern::ErrorCode GetErrorCode(); - - char* GetString(); - - CORBA::Boolean Is2D(); - - SMESH::point_array* GetPoints(); - - SMESH::long_array* GetKeyPoints(); - - SMESH::array_of_long_array* GetElementPoints(CORBA::Boolean applied); - - - private: - - ::SMESH_Mesh* getMesh( SMESH::SMESH_Mesh_ptr & theMesh ); - - ::SMESH_Pattern myPattern; - - SMESH_Gen_i* myGen; -}; -#endif diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx deleted file mode 100644 index f8ade30f5..000000000 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ /dev/null @@ -1,487 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_subMesh_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "SMESH_subMesh_i.hxx" -#include "SMESH_Gen_i.hxx" -#include "SMESH_Mesh_i.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" -#include "OpUtil.hxx" -#include "Utils_ExceptHandlers.hxx" - -#include -#include -#include - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_subMesh_i::SMESH_subMesh_i() - : SALOME::GenericObj_i( PortableServer::POA::_nil() ) -{ - MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i default, not for use"); - ASSERT(0); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_subMesh_i::SMESH_subMesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId ) - : SALOME::GenericObj_i( thePOA ) -{ - MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i"); - _gen_i = gen_i; - _mesh_i = mesh_i; - _localId = localId; - thePOA->activate_object( this ); - // **** -} -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH_subMesh_i::~SMESH_subMesh_i() -{ - MESSAGE("SMESH_subMesh_i::~SMESH_subMesh_i"); - // **** -} - -//======================================================================= -//function : getSubMeshes -//purpose : for a submesh on shape to which elements are not bound directly, -// return submeshes containing elements -//======================================================================= - -typedef list TListOfSubMeshes; - -bool getSubMeshes(::SMESH_subMesh* theSubMesh, - TListOfSubMeshes& theSubMeshList) -{ - int size = theSubMeshList.size(); - - SMESH_Mesh* aMesh = theSubMesh->GetFather(); - SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS(); - SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS(); - - // nodes can be bound to either vertex, edge, face or solid_or_shell - TopoDS_Shape aShape = theSubMesh->GetSubShape(); - switch ( aShape.ShapeType() ) - { - case TopAbs_SOLID: { - // add submesh of solid itself - aSubMeshDS = aMeshDS->MeshElements( aShape ); - if ( aSubMeshDS ) - theSubMeshList.push_back( aSubMeshDS ); - // and of the first shell - TopExp_Explorer exp( aShape, TopAbs_SHELL ); - if ( exp.More() ) { - aSubMeshDS = aMeshDS->MeshElements( exp.Current() ); - if ( aSubMeshDS ) - theSubMeshList.push_back( aSubMeshDS ); - } - break; - } - case TopAbs_WIRE: - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: { - // call getSubMeshes() for sub-shapes - list shapeList; - shapeList.push_back( aShape ); - list::iterator sh = shapeList.begin(); - for ( ; sh != shapeList.end(); ++sh ) { - for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) { - ::SMESH_subMesh* aSubMesh = aMesh->GetSubMeshContaining( it.Value() ); - if ( aSubMesh ) - getSubMeshes( aSubMesh, theSubMeshList ); - else - // no submesh for a compound inside compound - shapeList.push_back( it.Value() ); - } - } - // return only unique submeshes - set smSet; - TListOfSubMeshes::iterator sm = theSubMeshList.begin(); - while ( sm != theSubMeshList.end() ) { - if ( !smSet.insert( *sm ).second ) - sm = theSubMeshList.erase( sm ); - else - ++sm; - } - break; - } - } - return size < theSubMeshList.size(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Long SMESH_subMesh_i::GetNumberOfElements() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetNumberOfElements"); - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return 0; - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; - - // volumes are bound to shell - TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - nbElems += (*sm)->NbElements(); - } - return nbElems; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all) - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetNumberOfNodes"); - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return 0; - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - set nodeIds; - - // nodes are bound to shell instead of solid - TListOfSubMeshes smList; - if ( all && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - { - SMDS_ElemIteratorPtr eIt = (*sm)->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } - return nodeIds.size(); - } - - if ( aSubMeshDS == NULL ) - return 0; - - if ( all ) { // all nodes of submesh elements - SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - return nodeIds.size(); - } - - return aSubMeshDS->NbNodes(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::long_array* SMESH_subMesh_i::GetElementsId() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetElementsId"); - SMESH::long_array_var aResult = new SMESH::long_array(); - - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return aResult._retn(); - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; - TListOfSubMeshes smList; - if ( nbElems ) - smList.push_back( aSubMeshDS ); - - // volumes are bound to shell - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - nbElems += (*sm)->NbElements(); - } - - aResult->length( nbElems ); - if ( nbElems ) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( int i = 0; sm != smList.end(); sm++ ) - { - SMDS_ElemIteratorPtr anIt = (*sm)->GetElements(); - for ( int n = aSubMeshDS->NbElements(); i < n && anIt->more(); i++ ) - aResult[i] = anIt->next()->GetID(); - } - } - return aResult._retn(); -} - - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetElementsByType"); - SMESH::long_array_var aResult = new SMESH::long_array(); - - if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) - return aResult._retn(); - - ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId]; - SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS(); - - // PAL5440, return all nodes belonging to elements of submesh - set nodeIds; - int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0; - - // volumes may be bound to shell instead of solid - TListOfSubMeshes smList; - if ( nbElems == 0 && getSubMeshes( aSubMesh, smList )) - { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( ; sm != smList.end(); ++sm ) - { - if ( theElemType == SMESH::NODE ) - { - SMDS_ElemIteratorPtr eIt = (*sm)->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } - else - { - nbElems += (*sm)->NbElements(); - } - } - aSubMeshDS = 0; - } - else - { - if ( nbElems ) - smList.push_back( aSubMeshDS ); - } - - if ( theElemType == SMESH::NODE && aSubMeshDS ) - { - SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* anElem = eIt->next(); - SMDS_ElemIteratorPtr nIt = anElem->nodesIterator(); - while ( nIt->more() ) - nodeIds.insert( nIt->next()->GetID() ); - } - } - - if ( theElemType == SMESH::NODE ) - aResult->length( nodeIds.size() ); - else - aResult->length( nbElems ); - - int i = 0, n = aResult->length(); - - if ( theElemType == SMESH::NODE && !nodeIds.empty() ) { - set::iterator idIt = nodeIds.begin(); - for ( ; i < n && idIt != nodeIds.end() ; i++, idIt++ ) - aResult[i] = *idIt; - } - - if ( theElemType != SMESH::NODE ) { - TListOfSubMeshes::iterator sm = smList.begin(); - for ( i = 0; sm != smList.end(); sm++ ) - { - aSubMeshDS = *sm; - SMDS_ElemIteratorPtr anIt = aSubMeshDS->GetElements(); - while ( i < n && anIt->more() ) { - const SMDS_MeshElement* anElem = anIt->next(); - if ( theElemType == SMESH::ALL || anElem->GetType() == (SMDSAbs_ElementType)theElemType ) - aResult[i++] = anElem->GetID(); - } - } - } - - aResult->length( i ); - - return aResult._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::long_array* SMESH_subMesh_i::GetNodesId() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetNodesId"); - SMESH::long_array_var aResult = GetElementsByType( SMESH::NODE ); - return aResult._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::SMESH_Mesh_ptr SMESH_subMesh_i::GetFather() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - MESSAGE("SMESH_subMesh_i::GetFather"); - return _mesh_i->_this(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Long SMESH_subMesh_i::GetId() -{ - MESSAGE("SMESH_subMesh_i::GetId"); - return _localId; -} - -//======================================================================= -//function : GetSubShape -//purpose : -//======================================================================= - -GEOM::GEOM_Object_ptr SMESH_subMesh_i::GetSubShape() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - GEOM::GEOM_Object_var aShapeObj; - try { - if ( _mesh_i->_mapSubMesh.find( _localId ) != _mesh_i->_mapSubMesh.end()) { - TopoDS_Shape S = _mesh_i->_mapSubMesh[ _localId ]->GetSubShape(); - if ( !S.IsNull() ) - aShapeObj = _gen_i->ShapeToGeomObject( S ); - } - } - catch(SALOME_Exception & S_ex) { - THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); - } - return aShapeObj._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -SALOME_MED::FAMILY_ptr SMESH_subMesh_i::GetFamily() - throw (SALOME::SALOME_Exception) -{ - Unexpect aCatch(SALOME_SalomeException); - SALOME_MED::MESH_var MEDMesh = GetFather()->GetMEDMesh(); - - SALOME_MED::Family_array_var families = - MEDMesh->getFamilies(SALOME_MED::MED_NODE); - - for ( int i = 0; i < families->length(); i++ ) { - if ( families[i]->getIdentifier() == ( _localId ) ) - return families[i]; - } - - return SALOME_MED::FAMILY::_nil(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -SMESH::long_array* SMESH_subMesh_i::GetIDs() -{ - SMESH::long_array_var aResult = GetElementsId(); - return aResult._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception) -{ - return GetFather()->GetElementType( id, iselem ); -} diff --git a/src/SMESH_I/SMESH_subMesh_i.hxx b/src/SMESH_I/SMESH_subMesh_i.hxx deleted file mode 100644 index e8d84b37e..000000000 --- a/src/SMESH_I/SMESH_subMesh_i.hxx +++ /dev/null @@ -1,93 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : SMESH_subMesh_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_SUBMESH_I_HXX_ -#define _SMESH_SUBMESH_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_Mesh) -#include CORBA_SERVER_HEADER(SMESH_Hypothesis) -#include CORBA_CLIENT_HEADER(GEOM_Gen) -#include CORBA_CLIENT_HEADER(MED) - -#include "SALOME_GenericObj_i.hh" - -class SMESH_Gen_i; -class SMESH_Mesh_i; - -class SMESH_subMesh_i: - public virtual POA_SMESH::SMESH_subMesh, - public virtual SALOME::GenericObj_i -{ -public: - SMESH_subMesh_i(); - SMESH_subMesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId ); - ~SMESH_subMesh_i(); - - CORBA::Long GetNumberOfElements() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetNumberOfNodes( CORBA::Boolean all ) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsId() - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType ) - throw (SALOME::SALOME_Exception); - - SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem ) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetNodesId() - throw (SALOME::SALOME_Exception); - - SMESH::SMESH_Mesh_ptr GetFather() - throw (SALOME::SALOME_Exception); - - GEOM::GEOM_Object_ptr GetSubShape() - throw (SALOME::SALOME_Exception); - - CORBA::Long GetId(); - - SALOME_MED::FAMILY_ptr GetFamily() - throw (SALOME::SALOME_Exception); - - virtual SMESH::long_array* GetIDs(); - - SMESH_Mesh_i* _mesh_i; //NRI - -protected: - SMESH_Gen_i* _gen_i; - int _localId; -}; - -#endif diff --git a/src/SMESH_I/smeshpy.py b/src/SMESH_I/smeshpy.py deleted file mode 100644 index 9fb4709e7..000000000 --- a/src/SMESH_I/smeshpy.py +++ /dev/null @@ -1,96 +0,0 @@ -# SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : smeshpy.py -# Module : SMESH - -import salome -import SMESH - -from SALOME_utilities import * - -#============================================================================= - -class smeshpy: - _geom = None - _smesh = None - _studyId = None - - #-------------------------------------------------------------------------- - - def __init__(self): - try: - self._geom = salome.lcc.FindOrLoadComponent("FactoryServer","GEOM") - self._smesh = salome.lcc.FindOrLoadComponent("FactoryServer","SMESH") - except: - MESSAGE( "exception in smeshpy:__init__" ) - self._study = salome.myStudy - self._smesh.SetCurrentStudy(self._study) - - #-------------------------------------------------------------------------- - - def CreateMesh(self, shapeId): - try: - shape = salome.IDToObject(shapeId) - aMesh = self._smesh.CreateMesh(shape) - return aMesh - except: - MESSAGE( "exception in smeshpy:Init" ) - return None - - #-------------------------------------------------------------------------- - - def CreateHypothesis(self, name, libname): - try: - hyp = self._smesh.CreateHypothesis(name, libname) - return hyp - except: - MESSAGE( "exception in smeshpy:CreateHypothesis" ) - return None - - #-------------------------------------------------------------------------- - - def Compute(self, mesh, shapeId): - try: - shape = salome.IDToObject(shapeId) - ret=self._smesh.Compute(mesh, shape) - return ret - except: - MESSAGE( "exception in smeshpy:Compute" ) - return 0 - -#============================================================================= -## #-------------------------------------------------------------------------- - -##def SmeshInit(shapeId): -## import salome -## import SMESH -## geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -## smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -## shape = salome.IDToObject(shapeId) -## studyId = salome.myStudyId -## MESSAGE( str(studyId) ) -## aMesh = smesh.Init(geom, studyId, shape) -## return aMesh - -## #-------------------------------------------------------------------------- diff --git a/src/SMESH_SWIG/Makefile.in b/src/SMESH_SWIG/Makefile.in deleted file mode 100644 index df7e19a17..000000000 --- a/src/SMESH_SWIG/Makefile.in +++ /dev/null @@ -1,120 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : Makefile.in -# Author : Nicolas REJNERI, Paul RASCLE -# Module : SMESH -# $Header$ - -top_srcdir=@top_srcdir@ -top_builddir=../.. -srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl - - -@COMMENCE@ - -# Libraries targets - -LIB = libSMESH_Swigcmodule.la -LIB_SRC = - -SWIG_DEF = libSMESH_Swig.i -EXPORT_PYSCRIPTS = libSMESH_Swig.py \ - smesh.py \ - batchmode_smesh.py \ - batchmode_mefisto.py \ - ex00_all.py \ - ex01_cube2build.py \ - ex02_cube2primitive.py \ - ex03_cube2partition.py \ - ex04_cube5tetraHexa.py \ - ex05_hole1build.py \ - ex06_hole1boolean.py \ - ex07_hole1partition.py \ - ex08_hole2build.py \ - ex09_grid4build.py \ - ex10_grid4geometry.py \ - ex11_grid3partition.py \ - ex12_grid17partition.py \ - ex13_hole1partial.py \ - ex14_cyl1holed.py \ - ex15_cyl2geometry.py \ - ex16_cyl2complementary.py \ - ex17_dome1.py \ - ex18_dome2.py \ - ex19_sphereINcube.py \ - SMESH_test.py\ - SMESH_test0.py\ - SMESH_test1.py \ - SMESH_test2.py \ - SMESH_test3.py \ - SMESH_test4.py \ - SMESH_test5.py \ - SMESH_mechanic.py \ - SMESH_mechanic_tetra.py \ - SMESH_mechanic_editor.py \ - SMESH_fixation.py \ - SMESH_fixation_hexa.py \ - SMESH_fixation_tetra.py \ - SMESH_box_tetra.py \ - SMESH_box2_tetra.py \ - SMESH_box3_tetra.py \ - SMESH_flight_skin.py \ - SMESH_Partition1_tetra.py\ - SMESH_controls.py \ - SMESH_freebord.py \ - SMESH_blocks.py \ - SMESH_BelongToGeom.py \ - SMESH_GroupFromGeom2.py \ - SMESH_box.py \ - SMESH_demo_hexa2_upd.py \ - SMESH_hexaedre.py \ - SMESH_Sphere.py \ - SMESH_GroupFromGeom.py \ - SMESH_Nut.py \ - SMESH_GroupLyingOnGeom.py \ - PAL_MESH_041_mesh.py \ - PAL_MESH_043_2D.py \ - PAL_MESH_043_3D.py \ - SMESH_reg.py - -LIB_CLIENT_IDL = SALOMEDS.idl \ - SALOME_Exception.idl \ - GEOM_Gen.idl \ - SMESH_Gen.idl \ - SMESH_Mesh.idl \ - SMESH_Hypothesis.idl \ - SMESH_BasicHypothesis.idl \ - SMESH_Group.idl \ - SALOME_ModuleCatalog.idl \ - SALOME_Component.idl \ - SALOME_GenericObj.idl \ - MED.idl \ - SALOME_Comm.idl - -EXPORT_SHAREDPYSCRIPTS=SMESH_shared_modules.py - -CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -DHAVE_CONFIG_H -LIBS+= $(PYTHON_LIBS) -LDFLAGS+= -lSMESH -L${KERNEL_ROOT_DIR}/lib/salome -lSalomeGenericObj - -@CONCLUDE@ diff --git a/src/SMESH_SWIG/PAL_MESH_041_mesh.py b/src/SMESH_SWIG/PAL_MESH_041_mesh.py deleted file mode 100755 index 8585c9f6f..000000000 --- a/src/SMESH_SWIG/PAL_MESH_041_mesh.py +++ /dev/null @@ -1,103 +0,0 @@ -import geompy -import salome - -import StdMeshers - -#-----------------------------GEOM---------------------------------------- - -#----------Vertexes------------ -p1 = geompy.MakeVertex(20.0,30.0,40.0) -p2 = geompy.MakeVertex(90.0,80.0,0.0) -p3 = geompy.MakeVertex(30.0,80.0,200.0) - -#----------Edges--------------- -e1 = geompy.MakeEdge(p1,p2) -e2 = geompy.MakeEdge(p2,p3) -e3 = geompy.MakeEdge(p3,p1) - -#----------Wire---------------- -ListOfEdges = [] -ListOfEdges.append(e3) -ListOfEdges.append(e2) -ListOfEdges.append(e1) -wire1 = geompy.MakeWire(ListOfEdges) - - -#----------Face---------------- -WantPlanarFace = 1 -face1 = geompy.MakeFace(wire1,WantPlanarFace) - -Id_face1 = geompy.addToStudy(face1,"Face1") - - - -#-----------------------------SMESH------------------------------------------- -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -# -- Init -- -plane_mesh = salome.IDToObject( Id_face1) -smesh.SetCurrentStudy(salome.myStudy) - -mesh = smesh.CreateMesh(plane_mesh) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -id_mesh = salome.ObjectToID(mesh) -smeshgui.SetName( id_mesh, "Mesh_1") - - -print"---------------------Hypothesis" - - -#---------------- NumberOfSegments -numberOfSegment = 9 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) - -print hypNbSeg.GetName() -print hypNbSeg.GetNumberOfSegments() -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "Nb. Segments") - - -#--------------------------Max. Element Area -maxElementArea = 200 - -hypArea200 = smesh.CreateHypothesis("MaxElementArea","libStdMeshersEngine.so") -hypArea200.SetMaxElementArea( maxElementArea ) -print hypArea200.GetName() -print hypArea200.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea200), "Max. Element Area") - -print"---------------------Algorithms" - -#----------------------------Wire discretisation -algoWireDes = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp = algoWireDes.GetCompatibleHypothesis() - -print algoWireDes.GetName() -smeshgui.SetName(salome.ObjectToID(algoWireDes), "Ware descritisation") - -#----------------------------Triangle (Mefisto) -algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" ) -listHyp = algoMef.GetCompatibleHypothesis() - -print algoMef.GetName() - -#----------------------------Add hipothesis to the plane -mesh.AddHypothesis( plane_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( plane_mesh, hypArea200 ) # max area - -mesh.AddHypothesis( plane_mesh, algoWireDes ) # Regular 1D/wire discretisation -mesh.AddHypothesis( plane_mesh, algoMef ) # MEFISTO 2D - -smeshgui.SetName(salome.ObjectToID(algoMef), "Triangle (Mefisto)") - -print "---------------------Compute the mesh" - -smesh.Compute(mesh, plane_mesh) - -salome.sg.updateObjBrowser(1) - diff --git a/src/SMESH_SWIG/PAL_MESH_043_2D.py b/src/SMESH_SWIG/PAL_MESH_043_2D.py deleted file mode 100755 index 76ab25924..000000000 --- a/src/SMESH_SWIG/PAL_MESH_043_2D.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_testExtrusion2D.py -# Module : SMESH -# Description : Create meshes to test extrusion of mesh elements along path - -import salome -import geompy -import SMESH -import StdMeshers - -#----------------------------------GEOM - -# create points -p1 = geompy.MakeVertex(100, 0, 0) -p2 = geompy.MakeVertex(100, 0, 100) -p3 = geompy.MakeVertex(0, 0, 0) -p4 = geompy.MakeVertex(0, 100, 0) - - -# create two vectors -vector1 = geompy.MakeVector(p1,p2) -vector2 = geompy.MakeVector(p3,p4) - -# make two ellipses -ellipse1 = geompy.MakeEllipse(p1,vector1,50,25) -ellipse2 = geompy.MakeEllipse(p3,vector2,300,50) - -# publish circular face and second circle -id_ellipse1 = geompy.addToStudy(ellipse1, "Ellips 1") -id_ellipse2 = geompy.addToStudy(ellipse2, "Ellips 2") - - -#---------------------------------SMESH -# get smesh engine -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# get SMESH GUI -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -# create hypoteses -hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg1.SetNumberOfSegments(18) -id_hypNbSeg1 = salome.ObjectToID(hypNbSeg1) -smeshgui.SetName(id_hypNbSeg1, "NumberOfSegments 1"); - -hypNbSeg2 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg2.SetNumberOfSegments(34) -id_hypNbSeg2 = salome.ObjectToID(hypNbSeg2) -smeshgui.SetName(id_hypNbSeg2, "NumberOfSegments 2"); - -# create algorithmes -algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -id_algoReg = salome.ObjectToID(algoReg) -smeshgui.SetName(id_algoReg, "Regular_1D"); - -# create the path mesh -mesh1 = smesh.CreateMesh(ellipse1) -id_mesh1 = salome.ObjectToID(mesh1) -smeshgui.SetName(id_mesh1, "Path Mesh"); - -# set hypotheses and algos -mesh1.AddHypothesis(ellipse1,algoReg) -mesh1.AddHypothesis(ellipse1,hypNbSeg1) - -# create the tool mesh -mesh2 = smesh.CreateMesh(ellipse2) -id_mesh2 = salome.ObjectToID(mesh2) -smeshgui.SetName(id_mesh2, "Tool Mesh"); - -# set hypotheses and algos -mesh2.AddHypothesis(ellipse2,algoReg) -mesh2.AddHypothesis(ellipse2,hypNbSeg2) - -# compute meshes -smesh.Compute(mesh1,ellipse1) -smesh.Compute(mesh2,ellipse2) - - -# ---- udate object browser -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/PAL_MESH_043_3D.py b/src/SMESH_SWIG/PAL_MESH_043_3D.py deleted file mode 100755 index cfd0f45c4..000000000 --- a/src/SMESH_SWIG/PAL_MESH_043_3D.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_testExtrusion3D.py -# Module : SMESH -# Description : Create meshes to test extrusion of mesh elements along path - -import salome -import geompy -import SMESH -import StdMeshers - -# get smesh engine -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# create points to build two circles -p1 = geompy.MakeVertex(0, 100, 0) -p2 = geompy.MakeVertex(100, 0, 0) -p3 = geompy.MakeVertex(0, -100, 0) -p4 = geompy.MakeVertex(0, 70, 0) -p5 = geompy.MakeVertex(0, 100, 30) -p6 = geompy.MakeVertex(0, 130, 0) - -# create two circles -circle = geompy.MakeCircleThreePnt(p1, p2, p3) -cf = geompy.MakeCircleThreePnt(p4, p5, p6) - -# make circular face -wire = geompy.MakeWire([cf]) -face = geompy.MakeFace(wire, 1) - -# publish circular face and second circle -idcircle = geompy.addToStudy(circle, "Circle") -idface = geompy.addToStudy(face, "Circular face") - -# get SMESH GUI -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -# create hypoteses -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(12) -idseg = salome.ObjectToID(hypNbSeg) -smeshgui.SetName(idseg, "NumberOfSegments_10"); - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(30) -idarea = salome.ObjectToID(hypArea) -smeshgui.SetName(idarea, "MaxElementArea_20"); - -# create algorithmes -algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -idreg = salome.ObjectToID(algoReg) -smeshgui.SetName(idreg, "Regular_1D"); - -algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -idmef = salome.ObjectToID(algoMef) -smeshgui.SetName(idmef, "MEFISTO_2D"); - -# init a Mesh with the circular face -mesh1 = smesh.CreateMesh(face) -idmesh1 = salome.ObjectToID(mesh1) -smeshgui.SetName(idmesh1, "Mesh on circular face"); - -# set hypotheses and algos -mesh1.AddHypothesis(face,algoReg) -mesh1.AddHypothesis(face,hypNbSeg) -mesh1.AddHypothesis(face,algoMef) -mesh1.AddHypothesis(face,hypArea) - -# init a Mesh with the second circle -mesh2 = smesh.CreateMesh(circle) -idmesh2 = salome.ObjectToID(mesh2) -smeshgui.SetName(idmesh2, "Mesh on circular edge"); - -# set hypotheses and algos -mesh2.AddHypothesis(circle,algoReg) -mesh2.AddHypothesis(circle,hypNbSeg) - -# compute meshes -smesh.Compute(mesh1,face) -smesh.Compute(mesh2,circle) - -# ---- udate object browser -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_BelongToGeom.py b/src/SMESH_SWIG/SMESH_BelongToGeom.py deleted file mode 100644 index c4ee39dcd..000000000 --- a/src/SMESH_SWIG/SMESH_BelongToGeom.py +++ /dev/null @@ -1,28 +0,0 @@ -import SMESH -from SMESH_test1 import * - -def CheckBelongToGeomFilter(theMeshGen, theMesh, theShape, theSubShape, theElemType): - import geompy - if theShape != theSubShape: - aName = str(theSubShape) - geompy.addToStudyInFather(theShape,theSubShape,aName) - - theMeshGen.Compute(theMesh,theShape) - - aFilterMgr = theMeshGen.CreateFilterManager() - aFilter = aFilterMgr.CreateFilter() - - aBelongToGeom = aFilterMgr.CreateBelongToGeom() - aBelongToGeom.SetGeom(theSubShape) - aBelongToGeom.SetElementType(theElemType) - - aFilter.SetPredicate(aBelongToGeom) - return aFilter.GetElementsId(theMesh) - -anElemType = SMESH.ALL; -print "anElemType =", anElemType -#anIds = CheckBelongToGeomFilter(smesh,mesh,box,subShapeList[1],SMESH.FACE) -anIds = CheckBelongToGeomFilter(smesh,mesh,box,box,SMESH.FACE) -print "anIds = ", anIds - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_GroupFromGeom.py b/src/SMESH_SWIG/SMESH_GroupFromGeom.py deleted file mode 100644 index 3647c77d2..000000000 --- a/src/SMESH_SWIG/SMESH_GroupFromGeom.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_GroupFromGeom.py -# Module : SMESH - -from SMESH_test1 import * -import SMESH - -# Compute the mesh created in SMESH_test1 - -smesh.Compute(mesh, box) - -# Create geometry groups on plane: -aGeomGroup1 = geompy.CreateGroup(face , geompy.ShapeType["FACE"]) -geompy.AddObject(aGeomGroup1, 1) - -aGeomGroup2 = geompy.CreateGroup(face , geompy.ShapeType["EDGE"]) - -geompy.AddObject(aGeomGroup2, 3) -geompy.AddObject(aGeomGroup2, 6) -geompy.AddObject(aGeomGroup2, 8) -geompy.AddObject(aGeomGroup2, 10) - -geompy.addToStudy(aGeomGroup1, "Group on Faces") -geompy.addToStudy(aGeomGroup2, "Group on Edges") - -aSmeshGroup1 = mesh.CreateGroupFromGEOM(SMESH.FACE, "SMESHGroup1", aGeomGroup1) -aSmeshGroup2 = mesh.CreateGroupFromGEOM(SMESH.EDGE, "SMESHGroup2", aGeomGroup2) - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_GroupFromGeom2.py b/src/SMESH_SWIG/SMESH_GroupFromGeom2.py deleted file mode 100755 index 37f333d88..000000000 --- a/src/SMESH_SWIG/SMESH_GroupFromGeom2.py +++ /dev/null @@ -1,53 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : SMESH_GroupFromGeom.py, PAL6945 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== -from SMESH_test1 import * -import SMESH - -# Compute the mesh created in SMESH_test1 - -smesh.Compute(mesh, box) - -# Create geometry groups on plane: -aGeomGroup1 = geompy.CreateGroup(face , geompy.ShapeType["FACE"]) -geompy.AddObject(aGeomGroup1, 1) - -aGeomGroup2 = geompy.CreateGroup(face , geompy.ShapeType["EDGE"]) - -geompy.AddObject(aGeomGroup2, 3) -geompy.AddObject(aGeomGroup2, 6) -geompy.AddObject(aGeomGroup2, 8) -geompy.AddObject(aGeomGroup2, 10) - -geompy.addToStudy(aGeomGroup1, "Group on Faces") -geompy.addToStudy(aGeomGroup2, "Group on Edges") - -aSmeshGroup1 = mesh.CreateGroupFromGEOM(SMESH.FACE, "SMESHGroup1", aGeomGroup1) -aSmeshGroup2 = mesh.CreateGroupFromGEOM(SMESH.EDGE, "SMESHGroup2", aGeomGroup2) - -print "Create aGroupOnShell - a group linked to a shell" -aGroupOnShell = mesh.CreateGroupFromGEOM(SMESH.EDGE, "GroupOnShell", shell) -print "aGroupOnShell type =", aGroupOnShell.GetType() -print "aGroupOnShell size =", aGroupOnShell.Size() -print "aGroupOnShell ids :", aGroupOnShell.GetListOfID() - -print " " - -print "Modify hypothesis: 100 -> 50" -hypLen1.SetLength(50) -print "Contents of aGroupOnShell changes:" -print "aGroupOnShell size =", aGroupOnShell.Size() -print "aGroupOnShell ids :", aGroupOnShell.GetListOfID() - -print " " - -print "Re-compute mesh, contents of aGroupOnShell changes again:" -smesh.Compute(mesh, box) -print "aGroupOnShell size =", aGroupOnShell.Size() -print "aGroupOnShell ids :", aGroupOnShell.GetListOfID() - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py b/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py deleted file mode 100644 index 6a4533ea7..000000000 --- a/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py +++ /dev/null @@ -1,23 +0,0 @@ -from smesh import * - -def BuildGroupLyingOn(theMesh, theElemType, theName, theShape): - aFilterMgr = smesh.CreateFilterManager() - aFilter = aFilterMgr.CreateFilter() - - aLyingOnGeom = aFilterMgr.CreateLyingOnGeom() - aLyingOnGeom.SetGeom(theShape) - aLyingOnGeom.SetElementType(theElemType) - - aFilter.SetPredicate(aLyingOnGeom) - anIds = aFilter.GetElementsId(theMesh) - - aGroup = theMesh.CreateGroup(theElemType, theName) - aGroup.Add(anIds) - -#Example -## from SMESH_test1 import * - -## smesh.Compute(mesh, box) -## BuildGroupLyingOn(mesh, SMESH.FACE, "Group of faces lying on edge", edge ) - -## salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_Partition1_tetra.py b/src/SMESH_SWIG/SMESH_Partition1_tetra.py deleted file mode 100644 index e9bb55fa7..000000000 --- a/src/SMESH_SWIG/SMESH_Partition1_tetra.py +++ /dev/null @@ -1,200 +0,0 @@ -# -# Tetrahedrization of the geometry generated by the Python script GEOM_Partition1.py -# Hypothesis and algorithms for the mesh generation are global -# -#%Make geometry (like CEA script (A1)) using Partition algorithm% from OCC -# -- Rayon de la bariere - -import salome -import geompy -from math import sqrt - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -#--------------------------------------------------------------- - -barier_height = 7.0 -barier_radius = 5.6 / 2 # Rayon de la bariere -colis_radius = 1.0 / 2 # Rayon du colis -colis_step = 2.0 # Distance s‰parant deux colis -cc_width = 0.11 # Epaisseur du complement de colisage - -# -- - -cc_radius = colis_radius + cc_width -colis_center = sqrt(2.0)*colis_step/2 - -# -- - -boolean_common = 1 -boolean_cut = 2 -boolean_fuse = 3 -boolean_section = 4 - -# -- - -p0 = geompy.MakeVertex(0.,0.,0.) -vz = geompy.MakeVectorDXDYDZ(0.,0.,1.) - -# -- - -barier = geompy.MakeCylinder(p0, vz, barier_radius, barier_height) - -# -- - -colis = geompy.MakeCylinder(p0, vz, colis_radius, barier_height) -cc = geompy.MakeCylinder(p0, vz, cc_radius, barier_height) - -colis_cc = geompy.MakeCompound([colis, cc]) -colis_cc = geompy.MakeTranslation(colis_cc, colis_center, 0.0, 0.0) - -colis_cc_multi = geompy.MultiRotate1D(colis_cc, vz, 4) - -# -- - -alveole = geompy.MakePartition([colis_cc_multi, barier]) - -print "Analysis of the geometry to mesh (right after the Partition) :" - -subShellList = geompy.SubShapeAll(alveole, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(alveole, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(alveole, geompy.ShapeType["EDGE"]) - -print "number of Shells in alveole : ", len(subShellList) -print "number of Faces in alveole : ", len(subFaceList) -print "number of Edges in alveole : ", len(subEdgeList) - -subshapes = geompy.SubShapeAll(alveole, geompy.ShapeType["SHAPE"]) - -## there are 9 subshapes - -comp1 = geompy.MakeCompound( [ subshapes[0], subshapes[1] ] ) -comp2 = geompy.MakeCompound( [ subshapes[2], subshapes[3] ] ) -comp3 = geompy.MakeCompound( [ subshapes[4], subshapes[5] ] ) -comp4 = geompy.MakeCompound( [ subshapes[6], subshapes[7] ] ) - -compGOs = [] -compGOs.append( comp1 ) -compGOs.append( comp2 ) -compGOs.append( comp3 ) -compGOs.append( comp4 ) -comp = geompy.MakeCompound( compGOs ) - -alveole = geompy.MakeCompound( [ comp, subshapes[8] ]) - -idalveole = geompy.addToStudy(alveole, "alveole") - -print "Analysis of the geometry to mesh (right after the MakeCompound) :" - -subShellList = geompy.SubShapeAll(alveole, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(alveole, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(alveole, geompy.ShapeType["EDGE"]) - -print "number of Shells in alveole : ", len(subShellList) -print "number of Faces in alveole : ", len(subFaceList) -print "number of Edges in alveole : ", len(subEdgeList) - -status = geompy.CheckShape(alveole) -print " check status ", status - -# ---- launch SMESH - -print "-------------------------- create Hypothesis (In this case global hypothesis are used)" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 0.1 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_0.1") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 0.5 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_0.5") - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the alveole -shape_mesh = salome.IDToObject( idalveole ) - -mesh = smesh.CreateMesh(shape_mesh) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshAlveole") - -# ---- add hypothesis to alveole - -print "-------------------------- add hypothesis to alveole" - -mesh.AddHypothesis(shape_mesh,regular1D) -mesh.AddHypothesis(shape_mesh,hypNbSeg) - -mesh.AddHypothesis(shape_mesh,mefisto2D) -mesh.AddHypothesis(shape_mesh,hypArea) - -mesh.AddHypothesis(shape_mesh,netgen3D) -mesh.AddHypothesis(shape_mesh,hypVolume) - -print "-------------------------- compute the mesh of alveole " -ret = smesh.Compute(mesh,shape_mesh) - -if ret != 0: - log=mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the Mesh_mechanic:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "problem when computing the mesh" - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_Sphere.py b/src/SMESH_SWIG/SMESH_Sphere.py deleted file mode 100644 index 893e5441f..000000000 --- a/src/SMESH_SWIG/SMESH_Sphere.py +++ /dev/null @@ -1,111 +0,0 @@ -# GEOM GEOM_SWIG : binding of C++ omplementaion with Python -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : GEOM_Sphere.py -# Author : Damien COQUERET, Open CASCADE -# Module : GEOM -# $Header: - -from geompy import * -from math import * - -import smesh - -# It is an example of creating a hexahedrical mesh on a sphere. -# -# Used approach allows to avoid problems with degenerated and -# seam edges without special processing of geometrical shapes - -#----------------------------------------------------------------------- -#Variables -Radius = 100. -Dist = Radius / 2. -Factor = 2.5 -Angle90 = pi / 2. -NbSeg = 10 - -PointsList = [] -ShapesList = [] - -#Basic Elements -P0 = MakeVertex(0., 0., 0.) -P1 = MakeVertex(-Dist, -Dist, -Dist) -P2 = MakeVertex(-Dist, -Dist, Dist) -P3 = MakeVertex(-Dist, Dist, Dist) -P4 = MakeVertex(-Dist, Dist, -Dist) - -VZ = MakeVectorDXDYDZ(0., 0., 1.) - -#Construction Elements -PointsList.append(P1) -PointsList.append(P2) -PointsList.append(P3) -PointsList.append(P4) -PointsList.append(P1) - -PolyLine = MakePolyline(PointsList) - -Face1 = MakeFace(PolyLine, 1) -Face2 = MakeScaleTransform(Face1, P0, Factor) -Face3 = MakeScaleTransform(Face1, P0, -1.) - -#Models -Sphere = MakeSphereR(Radius) - -Block = MakeHexa2Faces(Face1, Face2) -Cube = MakeHexa2Faces(Face1, Face3) - -Common1 = MakeBoolean(Sphere, Block, 1) -Common2 = MakeRotation(Common1, VZ, Angle90) - -MultiBlock1 = MakeMultiTransformation1D(Common1, 21, -1, 3) -MultiBlock2 = MakeMultiTransformation1D(Common2, 31, -1, 3) - -#Reconstruct sphere from several blocks -ShapesList.append(Cube) -ShapesList.append(MultiBlock1) -ShapesList.append(MultiBlock2) -Compound = MakeCompound(ShapesList) - -Result = MakeGlueFaces(Compound, 0.1) - -#addToStudy -Id_Sphere = addToStudy(Sphere, "Sphere") -Id_Cube = addToStudy(Cube, "Cube") - -Id_Common1 = addToStudy(Common1, "Common1") -Id_Common2 = addToStudy(Common2, "Common2") - -Id_MultiBlock1 = addToStudy(MultiBlock1, "MultiBlock1") -Id_MultiBlock2 = addToStudy(MultiBlock2, "MultiBlock2") - -Id_Result = addToStudy(Result, "Result") - -#----------------------------------------------------------------------- -#Meshing -my_hexa = smesh.Mesh(Result, "Sphere_Mesh") -algo = my_hexa.Segment() -algo.NumberOfSegments(NbSeg) -my_hexa.Quadrangle() -my_hexa.Hexahedron() -my_hexa.Compute() diff --git a/src/SMESH_SWIG/SMESH_blocks.py b/src/SMESH_SWIG/SMESH_blocks.py deleted file mode 100644 index 0430867fb..000000000 --- a/src/SMESH_SWIG/SMESH_blocks.py +++ /dev/null @@ -1,43 +0,0 @@ -# SMESH SMESH_SWIG : binding of C++ implementaion with Python -# -# Copyright (C) 2003 CEA -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_blocks.py -# Author : Julia DOROVSKIKH -# Module : SMESH -# $Header$ - -import salome -import geompy -import math - -import GEOM_Spanner - -isBlocksTest = 0 # False -isMeshTest = 1 # True -hasGUI = 1 # True - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -GEOM_Spanner.MakeSpanner(salome, geompy, math, isBlocksTest, isMeshTest, smesh, hasGUI) - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_box.py b/src/SMESH_SWIG/SMESH_box.py deleted file mode 100755 index 2902c739b..000000000 --- a/src/SMESH_SWIG/SMESH_box.py +++ /dev/null @@ -1,73 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : box.py, PAL5223 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== -# -# Salome geometry and meshing for a box -# -import salome -from salome import sg -import geompy - -import StdMeshers - -# ---- launch GEOM - -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -meshgenerator = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -###geom.GetCurrentStudy(salome.myStudy._get_StudyId()) -meshgenerator.SetCurrentStudy(salome.myStudy) - -# Plate - -box = geompy.MakeBox(0.,0.,0.,1.,1.,1.) -boxId = geompy.addToStudy(box,"box") - -# ---- launch SMESH - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) -# meshgenerator=smeshpy.smeshpy() - - -# Hypothesis - -hypL1=meshgenerator.CreateHypothesis("LocalLength","libStdMeshersEngine.so") -hypL1.SetLength(0.25) -hypL1Id = salome.ObjectToID(hypL1) -smeshgui.SetName(hypL1Id, "LocalLength") - -# Algorithm - -alg1D=meshgenerator.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -alg1DId = salome.ObjectToID(alg1D) -smeshgui.SetName(alg1DId, "algo1D") - -alg2D=meshgenerator.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") -alg2DId = salome.ObjectToID(alg2D) -smeshgui.SetName(alg2DId, "algo2D") - -alg3D=meshgenerator.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") -alg3DId = salome.ObjectToID(alg3D) -smeshgui.SetName(alg3DId, "algo3D") - -# ---- init a Mesh - -box_mesh=meshgenerator.CreateMesh(box) -box_meshId = salome.ObjectToID(box_mesh) -smeshgui.SetName(box_meshId, "box_mesh") - -# ---- set Hypothesis & Algorithm - -box_mesh.AddHypothesis(box,alg1D) -box_mesh.AddHypothesis(box,alg2D) -box_mesh.AddHypothesis(box,alg3D) -box_mesh.AddHypothesis(box,hypL1) - -meshgenerator.Compute(box_mesh,box) - -sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_box2_tetra.py b/src/SMESH_SWIG/SMESH_box2_tetra.py deleted file mode 100644 index e8a4afd9f..000000000 --- a/src/SMESH_SWIG/SMESH_box2_tetra.py +++ /dev/null @@ -1,160 +0,0 @@ -# -# Tetrahedrization of the geometry union of 2 boxes having a face in common -# Hypothesis and algorithms for the mesh generation are global -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -# ---- define 2 boxes box1 and box2 - -box1 = geompy.MakeBox(0., 0., 0., 100., 200., 300.) - -idbox1 = geompy.addToStudy(box1, "box1") - -print "Analysis of the geometry box1 :" -subShellList = geompy.SubShapeAll(box1, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box1, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box1, geompy.ShapeType["EDGE"]) - -print "number of Shells in box1 : ", len(subShellList) -print "number of Faces in box1 : ", len(subFaceList) -print "number of Edges in box1 : ", len(subEdgeList) - -box2 = geompy.MakeBox(100., 0., 0., 200., 200., 300.) - -idbox2 = geompy.addToStudy(box2, "box2") - -print "Analysis of the geometry box2 :" -subShellList = geompy.SubShapeAll(box2, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box2, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box2, geompy.ShapeType["EDGE"]) - -print "number of Shells in box2 : ", len(subShellList) -print "number of Faces in box2 : ", len(subFaceList) -print "number of Edges in box2 : ", len(subEdgeList) - -# append the tow boxes to make ine shel, referrencing only once -# the internal interface - -shell = geompy.MakePartition([box1, box2]) -idshell = geompy.addToStudy(shell, "shell") - -print "Analysis of the geometry shell (union of box1 and box2) :" -subShellList = geompy.SubShapeAll(shell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(shell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(shell, geompy.ShapeType["EDGE"]) - -print "number of Shells in shell : ", len(subShellList) -print "number of Faces in shell : ", len(subFaceList) -print "number of Edges in shell : ", len(subEdgeList) - - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 500 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) - -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 500 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the shell - -mesh = smesh.CreateMesh(shell) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox2") - -# ---- add hypothesis to shell - -print "-------------------------- add hypothesis to shell" - -mesh.AddHypothesis(shell,regular1D) -mesh.AddHypothesis(shell,hypNbSeg) - -mesh.AddHypothesis(shell,mefisto2D) -mesh.AddHypothesis(shell,hypArea) - -mesh.AddHypothesis(shell,netgen3D) -mesh.AddHypothesis(shell,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute shell" -ret = smesh.Compute(mesh,shell) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshBox2:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_box3_tetra.py b/src/SMESH_SWIG/SMESH_box3_tetra.py deleted file mode 100644 index af4082774..000000000 --- a/src/SMESH_SWIG/SMESH_box3_tetra.py +++ /dev/null @@ -1,171 +0,0 @@ -# -# Tetrahedrization of the geometry union of 3 boxes aligned where the middle -# one has a race in common with the two others. -# Hypothesis and algorithms for the mesh generation are global -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -# ---- define 3 boxes box1, box2 and box3 - -box1 = geompy.MakeBox(0., 0., 0., 100., 200., 300.) - -idbox1 = geompy.addToStudy(box1, "box1") - -print "Analysis of the geometry box1 :" -subShellList = geompy.SubShapeAll(box1, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box1, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box1, geompy.ShapeType["EDGE"]) - -print "number of Shells in box1 : ", len(subShellList) -print "number of Faces in box1 : ", len(subFaceList) -print "number of Edges in box1 : ", len(subEdgeList) - -box2 = geompy.MakeBox(100., 0., 0., 200., 200., 300.) - -idbox2 = geompy.addToStudy(box2, "box2") - -print "Analysis of the geometry box2 :" -subShellList = geompy.SubShapeAll(box2, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box2, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box2, geompy.ShapeType["EDGE"]) - -print "number of Shells in box2 : ", len(subShellList) -print "number of Faces in box2 : ", len(subFaceList) -print "number of Edges in box2 : ", len(subEdgeList) - -box3 = geompy.MakeBox(0., 0., 300., 200., 200., 500.) - -idbox3 = geompy.addToStudy(box3, "box3") - -print "Analysis of the geometry box3 :" -subShellList = geompy.SubShapeAll(box3, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box3, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box3, geompy.ShapeType["EDGE"]) - -print "number of Shells in box3 : ", len(subShellList) -print "number of Faces in box3 : ", len(subFaceList) -print "number of Edges in box3 : ", len(subEdgeList) - -shell = geompy.MakePartition([box1, box2, box3]) -idshell = geompy.addToStudy(shell,"shell") - -print "Analysis of the geometry shell (union of box1, box2 and box3) :" -subShellList = geompy.SubShapeAll(shell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(shell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(shell, geompy.ShapeType["EDGE"]) - -print "number of Shells in shell : ", len(subShellList) -print "number of Faces in shell : ", len(subFaceList) -print "number of Edges in shell : ", len(subEdgeList) - - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 500 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) - -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 500 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the shell - -mesh = smesh.CreateMesh(shell) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox3") - -# ---- add hypothesis to shell - -print "-------------------------- add hypothesis to shell" - -mesh.AddHypothesis(shell,regular1D) -mesh.AddHypothesis(shell,hypNbSeg) - -mesh.AddHypothesis(shell,mefisto2D) -mesh.AddHypothesis(shell,hypArea) - -mesh.AddHypothesis(shell,netgen3D) -mesh.AddHypothesis(shell,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute shell" -ret = smesh.Compute(mesh,shell) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshBox3:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_box_tetra.py b/src/SMESH_SWIG/SMESH_box_tetra.py deleted file mode 100644 index 72b45e12b..000000000 --- a/src/SMESH_SWIG/SMESH_box_tetra.py +++ /dev/null @@ -1,132 +0,0 @@ -# -# Tetrahedrization of a simple box. Hypothesis and algorithms for -# the mesh generation are global -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -# ---- define a boxe - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) - -idbox = geompy.addToStudy(box, "box") - -print "Analysis of the geometry box :" -subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(box, geompy.ShapeType["EDGE"]) - -print "number of Shells in box : ", len(subShellList) -print "number of Faces in box : ", len(subFaceList) -print "number of Edges in box : ", len(subEdgeList) - - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 500 - -hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea.SetMaxElementArea(maxElementArea) - -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 500 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the boxe - -mesh = smesh.CreateMesh(box) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox") - -# ---- add hypothesis to the boxe - -print "-------------------------- add hypothesis to the box" - -mesh.AddHypothesis(box,regular1D) -mesh.AddHypothesis(box,hypNbSeg) - -mesh.AddHypothesis(box,mefisto2D) -mesh.AddHypothesis(box,hypArea) - -mesh.AddHypothesis(box,netgen3D) -mesh.AddHypothesis(box,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute the mesh of the boxe" -ret = smesh.Compute(mesh,box) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshBox:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_controls.py b/src/SMESH_SWIG/SMESH_controls.py deleted file mode 100644 index 1d5080d87..000000000 --- a/src/SMESH_SWIG/SMESH_controls.py +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright (C) 2004 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_control.py -# Author : Sergey LITONIN -# Module : SMESH - - -import SMESH -import SMESH_mechanic - -smesh = SMESH_mechanic.smesh -mesh = SMESH_mechanic.mesh -salome = SMESH_mechanic.salome - - -aFilterMgr = smesh.CreateFilterManager() - -# Criterion : AREA > 100 - -aFunctor = aFilterMgr.CreateArea() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 100 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Area > 100 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Area > 100" ) -aGroup.Add( anIds ) - - -# Criterion : Taper > 3e-15 - -aFunctor = aFilterMgr.CreateTaper() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 3e-15 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Taper > 3e-15 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Taper > 3e-15" ) -aGroup.Add( anIds ) - - -# Criterion : ASPECT RATIO > 1.3 - -aFunctor = aFilterMgr.CreateAspectRatio() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 1.3 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Aspect Ratio > 1.3 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Aspect Ratio > 1.3" ) -aGroup.Add( anIds ) - - -# Criterion : MINIMUM ANGLE < 30 - -aFunctor = aFilterMgr.CreateMinimumAngle() -aPredicate = aFilterMgr.CreateLessThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 30 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Minimum Angle < 30 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Minimum Angle < 30" ) -aGroup.Add( anIds ) - -# Criterion : Warp > 2e-13 - -aFunctor = aFilterMgr.CreateWarping() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 2e-13 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Warp > 2e-13 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Warp > 2e-13" ) -aGroup.Add( anIds ) - -# Criterion : Skew > 18 - -aFunctor = aFilterMgr.CreateSkew() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 18 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Skew > 18 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.FACE, "Skew > 18" ) -aGroup.Add( anIds ) - -# Criterion : Length > 10 - -aFunctor = aFilterMgr.CreateLength() -aPredicate = aFilterMgr.CreateMoreThan() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 10 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Length > 10 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.EDGE, "Length > 10" ) -aGroup.Add( anIds ) - -# Criterion : Borders at multi-connections = 2 - -aFunctor = aFilterMgr.CreateMultiConnection() -aPredicate = aFilterMgr.CreateEqualTo() -aPredicate.SetNumFunctor( aFunctor ) -aPredicate.SetMargin( 2 ) - -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Borders at multi-connections = 2 Nb = ", len( anIds ) -#for i in range( len( anIds ) ): - #print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.EDGE, "Borders at multi-connections = 2" ) -aGroup.Add( anIds ) - - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py b/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py deleted file mode 100755 index 755214a59..000000000 --- a/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py +++ /dev/null @@ -1,210 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : SMESH_demo_hexa2_upd.py, PAL6781 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== -# Tetrahedrization of a geometry (box minus a inner cylinder). -# Hypothesis and algorithms for the mesh generation are not global: -# the mesh of some edges is thinner -# - -import salome -import geompy - -import StdMeshers -import NETGENPlugin - -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - -import math - -# ----------------------------------------------------------------------------- - -ShapeTypeShell = 3 -ShapeTypeFace = 4 -ShapeTypeEdge = 6 - -a = math.sqrt(2.)/4. -ma = - a -zero = 0. -un = 1. -mun= - un -demi = 1./2. - -Orig = geompy.MakeVertex(zero,zero,zero) -P0 = geompy.MakeVertex(a,a,zero) -P1 = geompy.MakeVertex(zero,demi,zero) -P2 = geompy.MakeVertex(ma,a,zero) -P3 = geompy.MakeVertex(mun,un,zero) -P4 = geompy.MakeVertex(un,un,zero) -P5 = geompy.MakeVertex(zero,zero,un) - -arc = geompy.MakeArc(P0,P1,P2) -e1 = geompy.MakeEdge(P2,P3) -e2 = geompy.MakeEdge(P3,P4) -e3 = geompy.MakeEdge(P4,P0) - -list = [] -list.append(arc) -list.append(e1) -list.append(e2) -list.append(e3) - -wire = geompy.MakeWire(list) -face = geompy.MakeFace(wire,1) - -dir = geompy.MakeVector(Orig,P5) -vol1 = geompy.MakePipe(face,dir) - -angle = math.pi/2. -#dir = geom.MakeVector(Orig,P5) -vol2 = geompy.MakeRotation(vol1,dir,angle) - -vol3 = geompy.MakeRotation(vol2,dir,angle) - -vol4 = geompy.MakeRotation(vol3,dir,angle) - -list = [] -list.append(vol1) -list.append(vol2) -list.append(vol3) -list.append(vol4) - -volComp = geompy.MakeCompound(list) - -tol3d = 1.e-3 -vol = geompy.MakeGlueFaces(volComp,tol3d) -idVol = geompy.addToStudy(vol,"volume") - -print "Analysis of the final volume:" -subShellList = geompy.SubShapeAllSorted(vol,ShapeTypeShell) -subFaceList = geompy.SubShapeAllSorted(vol,ShapeTypeFace) -subEdgeList = geompy.SubShapeAllSorted(vol,ShapeTypeEdge) - -print "number of Shells in the volume : ",len(subShellList) -print "number of Faces in the volume : ",len(subFaceList) -print "number of Edges in the volume : ",len(subEdgeList) - -idSubEdge = [] -for k in range(len(subEdgeList)): - idSubEdge.append(geompy.addToStudyInFather(vol,subEdgeList[k],"SubEdge"+str(k))) - -edgeZ = [] -edgeZ.append(subEdgeList[0]) -edgeZ.append(subEdgeList[3]) -edgeZ.append(subEdgeList[10]) -edgeZ.append(subEdgeList[11]) -edgeZ.append(subEdgeList[20]) -edgeZ.append(subEdgeList[21]) -edgeZ.append(subEdgeList[28]) -edgeZ.append(subEdgeList[31]) - -idEdgeZ = [] -for i in range(8): - idEdgeZ.append(geompy.addToStudyInFather(vol,edgeZ[i],"EdgeZ"+str(i+1))) - -### ---------------------------- SMESH -------------------------------------- - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments the global one" - -numberOfSegments = 10 - -hypNbSeg=smesh.CreateHypothesis("NumberOfSegments","libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() -print hypNbSeg.GetName() -print hypNbSegID -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments") - -print "-------------------------- NumberOfSegments in the Z direction" - -numberOfSegmentsZ = 40 - -hypNbSegZ=smesh.CreateHypothesis("NumberOfSegments","libStdMeshersEngine.so") -hypNbSegZ.SetNumberOfSegments(numberOfSegmentsZ) -hypNbSegZID = hypNbSegZ.GetId() -print hypNbSegZ.GetName() -print hypNbSegZID -print hypNbSegZ.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSegZ), "NumberOfSegmentsZ") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- Quadrangle_2D" - -quad2D=smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(quad2D), "Quadrangle_2D") - -print "-------------------------- Hexa_3D" - -hexa3D=smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(hexa3D), "Hexa_3D") - -# ---- init a Mesh with the volume - -mesh = smesh.CreateMesh(vol) -smeshgui.SetName(salome.ObjectToID(mesh), "meshVolume") - -# ---- add hypothesis to the volume - -print "-------------------------- add hypothesis to the volume" - -ret=mesh.AddHypothesis(vol,regular1D) -print ret -ret=mesh.AddHypothesis(vol,hypNbSeg) -print ret -ret=mesh.AddHypothesis(vol,quad2D) -print ret -ret=mesh.AddHypothesis(vol,hexa3D) -print ret - -for i in range(8): - print "-------------------------- add hypothesis to edge in the Z directions", (i+1) - - subMeshEdgeZ = mesh.GetSubMesh(edgeZ[i],"SubMeshEdgeZ_"+str(i+1)) - - retZ = mesh.AddHypothesis(edgeZ[i],hypNbSegZ) - print " add hyp Z ", retZ - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute the mesh of the volume" - -ret=smesh.Compute(mesh,vol) - -print ret -if ret != 0: -## log=mesh.GetLog(0) # no erase trace -## for linelog in log: -## print linelog - print "Information about the MeshBox :" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons: ", mesh.NbTetras() -else: - print "problem when Computing the mesh" - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_fixation.py b/src/SMESH_SWIG/SMESH_fixation.py deleted file mode 100644 index b10fcc81f..000000000 --- a/src/SMESH_SWIG/SMESH_fixation.py +++ /dev/null @@ -1,294 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_fix_volute.py -# Author : Paul RASCLE, EDF -# Module : SMESH -# $Header$ - -import salome -import geompy -import math - -# ----------------------------------------------------------------------------- - -def MakeFace(lstEdges) : - """ - Creates a planar face from 4 edges - """ - wire = geompy.MakeWire(lstEdges) - face = geompy.MakeFace(wire, 1) - return face - -# ----------------------------------------------------------------------------- - -# ---- dimensions - -##longueurPlq = 0.686 -##largeurPlq = 0.573 -##epaisseurPlq = 0.150 - -##hauteurFlanc = 0.380 -##epaisseurFlanc = 0.112 -##rayonConge = 0.150 - epaisseurFlanc - -##epaisseurFond = 0.162 -##rayonTrou = 0.075 -##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou) -##marge = 0.01 -##tol3d = 1.e-5 - -longueurPlq = 686 -largeurPlq = 573 -epaisseurPlq = 150 - -hauteurFlanc = 380 -epaisseurFlanc = 112 -rayonConge = 150 - epaisseurFlanc - -epaisseurFond = 162 -rayonTrou = 75 -posAxeTrou = hauteurFlanc - (180 + rayonTrou) -marge = 10 -tol3d = 1.e-3 - -# ---- points, directions de base - -p0 = geompy.MakeVertex(0., 0., 0.) - -vx = geompy.MakeVectorDXDYDZ(100., 0., 0.) -vy = geompy.MakeVectorDXDYDZ(0., 100., 0.) -vz = geompy.MakeVectorDXDYDZ(0., 0., 100.) - -# ---- ellipse du flanc - -he = hauteurFlanc - 2*rayonConge -re = 0.5*(largeurPlq - epaisseurFond) - rayonConge -sine = re/he -cose = math.sqrt(1. - sine*sine) - -ve = geompy.MakeVectorDXDYDZ(sine, 0., cose) -cyl0 = geompy.MakeCylinder(p0, ve, re, 2*he) -cyl1 = geompy.MakeRotation(cyl0, ve, 0.5) -cyle = geompy.MakeTranslation(cyl1, -marge*sine, 0., -marge*cose) - -pbe = geompy.MakeVertex(3*he, -2*re, 3*he) -boxe = geompy.MakeBoxTwoPnt(p0, pbe) - -cylcoup = geompy.MakeBoolean(cyle, boxe, 2) - -aretes = [] -aretes = geompy.SubShapeAllSorted(cylcoup, geompy.ShapeType["EDGE"]) - -shape = geompy.MakeCopy(aretes[0]) -aShape = geompy.MakeTranslation(shape, 0., rayonConge + re, epaisseurPlq + 2*rayonConge) - - -# ----------------------------------------------------------------------------- -# ---- decoupage de la piece en volumes a 6 faces de 4 cotes -# ----------------------------------------------------------------------------- - -# ---- cotes x - -x0 = 0. -x0h = rayonConge -x1 = rayonConge + epaisseurFlanc -xc = longueurPlq/2 -x2 = longueurPlq - rayonConge - epaisseurFlanc -x3h = longueurPlq - rayonConge -x3 = longueurPlq - -# ---- cotes y - -y0 = 0. -y0h = rayonConge -y1 = largeurPlq - epaisseurFond -y1m = y1 - marge -y2 = largeurPlq -y2p = largeurPlq + marge - -# ---- cotes z - -z0 = 0. -z1m = epaisseurPlq - marge -z1 = epaisseurPlq -z2 = epaisseurPlq + rayonConge -z3 = epaisseurPlq + 2*rayonConge -z4 = epaisseurPlq + hauteurFlanc -z4p = epaisseurPlq + hauteurFlanc + marge - -zc = epaisseurPlq + posAxeTrou -zc2 = epaisseurPlq + (posAxeTrou - rayonTrou)/3 -zc3 = epaisseurPlq + 2*(posAxeTrou - rayonTrou)/3 - -# ---- decoupe du fond - -p11 = geompy.MakeVertex(x1, y1m, z1) -p12 = geompy.MakeVertex(x1, y1m, z2) -p13 = geompy.MakeVertex(x1, y1m, z3) -p14 = geompy.MakeVertex(x1, y1m, z4) -pc1 = geompy.MakeVertex(xc, y1m, z1) -pc2 = geompy.MakeVertex(xc, y1m, zc2) -pc3 = geompy.MakeVertex(xc, y1m, zc3) -pcc = geompy.MakeVertex(xc, y1m, zc) -pc4 = geompy.MakeVertex(xc, y1m, z4) -p21 = geompy.MakeVertex(x2, y1m, z1) -p22 = geompy.MakeVertex(x2, y1m, z2) -p23 = geompy.MakeVertex(x2, y1m, z3) -p24 = geompy.MakeVertex(x2, y1m, z4) -pcf = geompy.MakeVertex(xc, y2p, zc) - -arc2 = geompy.MakeArc(p12,pc2,p22) -arc3 = geompy.MakeArc(p13,pc3,p23) - -segz1 = geompy.MakeVector(p11,p21) -segz41 = geompy.MakeVector(p14,pc4) -segz42 = geompy.MakeVector(pc4,p24) -segx11 = geompy.MakeVector(p11,p12) -segx12 = geompy.MakeVector(p12,p13) -segx13 = geompy.MakeVector(p13,p14) -segxc2 = geompy.MakeVector(pc1,pc2) -segxc3 = geompy.MakeVector(pc2,pc3) -segxc4 = geompy.MakeVector(pcc,pc4) -segx21 = geompy.MakeVector(p21,p22) -segx22 = geompy.MakeVector(p22,p23) -segx23 = geompy.MakeVector(p23,p24) -segx1c1 = geompy.MakeVector(p13,pcc) -segx1c2 = geompy.MakeVector(p14,pcc) -segx2c1 = geompy.MakeVector(p23,pcc) -segx2c2 = geompy.MakeVector(p24,pcc) - -facef = [] -facef.append(MakeFace([segx13,segx1c2,segx1c1])) -facef.append(MakeFace([segx23,segx2c2,segx2c1])) -facef.append(MakeFace([segx2c2,segxc4,segz42])) -facef.append(MakeFace([segx1c2,segz41,segxc4])) -facef.append(MakeFace([segx1c1,arc3,segx2c1])) -facef.append(MakeFace([segx12,arc2,segx22,arc3])) -facef.append(MakeFace([segx11,segz1,segx21,arc2])) - -vcccf = geompy.MakeVector(pcc, pcf) -hcccf = y2p - y1m -decf = [] -for face in facef: - decf.append(geompy.MakePrismVecH(face,vcccf,hcccf)) - -pc = geompy.MakeVertex(xc, 0., zc) -py2 = geompy.MakeVertex(xc, y2, zc) -axeCyl = geompy.MakeVector(pc, py2) - -cylFond = geompy.MakeCylinder(pc, vy, rayonTrou, 1.1*largeurPlq) -cylFond2 = geompy.MakeRotation(cylFond, axeCyl, math.pi) - -fondec = [] -for id in (0,1,2,3): - fondec.append(geompy.MakeBoolean(decf[id], cylFond2, 2)) -fondec.append(geompy.MakeBoolean(decf[4], cylFond, 2)) -for id in (5,6): - fondec.append(decf[id]) - -p_xcy2pz4p = geompy.MakeVertex(xc,y2p,z4p) -p_x3y2pz4p = geompy.MakeVertex(x3,y2p,z4p) -pxc = geompy.MakeVertex(xc,y0,z0) -bcut1 = geompy.MakeBoxTwoPnt(p0, p_xcy2pz4p) -bcut2 = geompy.MakeBoxTwoPnt(pxc, p_x3y2pz4p) - -fondec2 = [] -for id in (0,1,2,3): - fondec2.append(fondec[id]) -for id in (4,5,6): - fondec2.append(geompy.MakeBoolean(fondec[id], bcut1, 1)) - fondec2.append(geompy.MakeBoolean(fondec[id], bcut2, 1)) - -# ----- autres blocs de decoupe - -bcong1 = geompy.MakeBox(x0,y0,z1, x1,y1,z2) -bcong2 = geompy.MakeBox(x0,y1,z1, x1,y2,z2) -bcong3 = geompy.MakeBox(x2,y0,z1, x3,y1,z2) -bcong4 = geompy.MakeBox(x2,y1,z1, x3,y2,z2) - -pcylx0 = geompy.MakeVertex(0., -marge, z2) -pcylx3 = geompy.MakeVertex(longueurPlq, -marge, z2) -pcyly0 = geompy.MakeVertex(-marge, 0., z2) - -cylcongx0 = geompy.MakeCylinder(pcylx0, vy, rayonConge, largeurPlq + 2*marge) -cylcongx3 = geompy.MakeCylinder(pcylx3, vy, rayonConge, largeurPlq + 2*marge) -cylcongy0 = geompy.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq + 2*marge) - -bcong1 = geompy.MakeBoolean(bcong1,cylcongx0,2) -bcong2 = geompy.MakeBoolean(bcong2,cylcongx0,2) -bcong1 = geompy.MakeBoolean(bcong1,cylcongy0,2) -#NRI : inverse order of BOP -bcong3 = geompy.MakeBoolean(bcong3,cylcongy0,2) -bcong3 = geompy.MakeBoolean(bcong3,cylcongx3,2) -bcong4 = geompy.MakeBoolean(bcong4,cylcongx3,2) - -pf1 = geompy.MakeVertex(0., y0h, z3) -pf2 = geompy.MakeVertex(0., y1, z3) -pf3 = geompy.MakeVertex(0., y1, z4) -pf4 = geompy.MakeVertex(0., 0.5*(largeurPlq - epaisseurFond) , z4) - -vf1 = geompy.MakeEdge(pf1, pf2) -vf2 = geompy.MakeEdge(pf2, pf3) -vf3 = geompy.MakeEdge(pf3, pf4) - -faceFlanc = MakeFace([vf1,vf2,vf3,aShape]) - -flanc1 = geompy.MakePrismVecH(faceFlanc, vx, epaisseurFlanc) -flanc2 = geompy.MakeCopy(flanc1) -flanc1 = geompy.MakeTranslation(flanc1, rayonConge, 0., 0.) -flanc2 = geompy.MakeTranslation(flanc2, longueurPlq - rayonConge - epaisseurFlanc, 0., 0.) - -# ---- constitution et decoupe des blocs -boxfond2 = geompy.MakeBox(x0, y1, z0, x3, y2, z4p) - -blocs = [] -for dec in fondec2: - blocs.append(geompy.MakeBoolean(boxfond2, dec, 1)) - -blocs.append(geompy.MakeBox(x0,y1,z0, x1,y2,z1)) -blocs.append(geompy.MakeBox(x1,y1,z0, xc,y2,z1)) -blocs.append(geompy.MakeBox(xc,y1,z0, x2,y2,z1)) -blocs.append(geompy.MakeBox(x2,y1,z0, x3,y2,z1)) -blocs.append(geompy.MakeBox(x0,y0,z0, x1,y1,z1)) -blocs.append(geompy.MakeBox(x1,y0,z0, xc,y1,z1)) -blocs.append(geompy.MakeBox(xc,y0,z0, x2,y1,z1)) -blocs.append(geompy.MakeBox(x2,y0,z0, x3,y1,z1)) -blocs.append(bcong2) -blocs.append(bcong4) -blocs.append(bcong1) -blocs.append(bcong3) -blocs.append(geompy.MakeBox(x0h,y1, z2, x1, y2, z3)) -blocs.append(geompy.MakeBox(x2, y1, z2, x3h,y2, z3)) -blocs.append(geompy.MakeBox(x0h,y0h,z2, x1, y1, z3)) -blocs.append(geompy.MakeBox(x2, y0h,z2, x3h,y1, z3)) -blocs.append(geompy.MakeBox(x0h,y1, z3, x1, y2, z4)) -blocs.append(geompy.MakeBox(x2, y1, z3, x3h,y2, z4)) -blocs.append(flanc1) -blocs.append(flanc2) - -compbloc = geompy.MakeCompound(blocs) -idcomp = geompy.addToStudy(compbloc, "compbloc") - -# ---- eliminer les faces en double, solid-->shell - -compshell = geompy.MakeGlueFaces(compbloc,tol3d) -idcomp = geompy.addToStudy(compshell, "compshell") diff --git a/src/SMESH_SWIG/SMESH_fixation_hexa.py b/src/SMESH_SWIG/SMESH_fixation_hexa.py deleted file mode 100644 index 1845b2218..000000000 --- a/src/SMESH_SWIG/SMESH_fixation_hexa.py +++ /dev/null @@ -1,101 +0,0 @@ -# -# Hexahedrization of the geometry generated by the Python script -# SMESH_fixation.py -# Hypothesis and algorithms for the mesh generation are global -# - -import SMESH_fixation - -import StdMeshers - -compshell = SMESH_fixation.compshell -idcomp = SMESH_fixation.idcomp -geompy = SMESH_fixation.geompy -salome = SMESH_fixation.salome - -print "Analysis of the geometry to be meshed :" -subShellList = geompy.SubShapeAll(compshell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(compshell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(compshell, geompy.ShapeType["EDGE"]) - -print "number of Shells in compshell : ", len(subShellList) -print "number of Faces in compshell : ", len(subFaceList) -print "number of Edges in compshell : ", len(subEdgeList) - -status = geompy.CheckShape(compshell) -print " check status ", status - -### ---------------------------- SMESH -------------------------------------- -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 5 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5") - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- Quadrangle_2D" - -quad2D = smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(quad2D), "Quadrangle_2D") - -print "-------------------------- Hexa_3D" - -hexa3D = smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(hexa3D), "Hexa_3D") - -# ---- init a Mesh with the compshell -shape_mesh = salome.IDToObject( idcomp ) - -mesh = smesh.CreateMesh(shape_mesh) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshCompShell") - - -print "-------------------------- add hypothesis to compshell" - -mesh.AddHypothesis(shape_mesh,regular1D) -mesh.AddHypothesis(shape_mesh,hypNbSeg) - -mesh.AddHypothesis(shape_mesh,quad2D) -mesh.AddHypothesis(shape_mesh,hexa3D) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute compshell" -ret = smesh.Compute(mesh, shape_mesh) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshcompShel:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of quadrangles : ", mesh.NbQuadrangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of hexahedrons : ", mesh.NbHexas() -else: - print "problem when Computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_fixation_tetra.py b/src/SMESH_SWIG/SMESH_fixation_tetra.py deleted file mode 100644 index 2d588bbd9..000000000 --- a/src/SMESH_SWIG/SMESH_fixation_tetra.py +++ /dev/null @@ -1,131 +0,0 @@ -# -# Tetrahedrization of the geometry generated by the Python script -# SMESH_fixation.py -# Hypothesis and algorithms for the mesh generation are global -# - -import StdMeshers -import NETGENPlugin -import SMESH_fixation - -compshell = SMESH_fixation.compshell -idcomp = SMESH_fixation.idcomp -geompy = SMESH_fixation.geompy -salome = SMESH_fixation.salome - -print "Analysis of the geometry to be meshed :" -subShellList = geompy.SubShapeAll(compshell, geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(compshell, geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(compshell, geompy.ShapeType["EDGE"]) - -print "number of Shells in compshell : ", len(subShellList) -print "number of Faces in compshell : ", len(subFaceList) -print "number of Edges in compshell : ", len(subEdgeList) - -status = geompy.CheckShape(compshell) -print " check status ", status - -### ---------------------------- SMESH -------------------------------------- -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -print "-------------------------- create Hypothesis" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 5 - -hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg.SetNumberOfSegments(numberOfSegments) - -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5") - -print "-------------------------- MaxElementArea" - -## maxElementArea = 80 - -## hypArea=smesh.CreateHypothesis("MaxElementArea") -## hypArea.SetMaxElementArea(maxElementArea) -## print hypArea.GetName() -## print hypArea.GetId() -## print hypArea.GetMaxElementArea() -## smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_160") - -hypLengthFromEdges = smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so") -smeshgui.SetName(salome.ObjectToID(hypLengthFromEdges), "LengthFromEdges") - - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 1000 - -hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") -hypVolume.SetMaxElementVolume(maxElementVolume) - -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_1000") - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - -smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") - -smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") - -# ---- init a Mesh with the compshell - -mesh = smesh.CreateMesh(compshell) -smeshgui.SetName(salome.ObjectToID(mesh), "MeshcompShel") - -print "-------------------------- add hypothesis to compshell" - -mesh.AddHypothesis(compshell,regular1D) -mesh.AddHypothesis(compshell,hypNbSeg) - -mesh.AddHypothesis(compshell,mefisto2D) -mesh.AddHypothesis(compshell,hypLengthFromEdges) - -mesh.AddHypothesis(compshell,netgen3D) -mesh.AddHypothesis(compshell,hypVolume) - -salome.sg.updateObjBrowser(1) - -print "-------------------------- compute compshell" -ret = smesh.Compute(mesh,compshell) -print ret -if ret != 0: - log = mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog - print "Information about the MeshcompShel:" - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles : ", mesh.NbTriangles() - print "Number of volumes : ", mesh.NbVolumes() - print "Number of tetrahedrons : ", mesh.NbTetras() - -else: - print "problem when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_freebord.py b/src/SMESH_SWIG/SMESH_freebord.py deleted file mode 100644 index d240a354f..000000000 --- a/src/SMESH_SWIG/SMESH_freebord.py +++ /dev/null @@ -1,66 +0,0 @@ -import salome -import geompy -import SMESH -import StdMeshers - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# Create box without one plane - -box = geompy.MakeBox(0., 0., 0., 10., 20., 30.) -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) - -FaceList = [] -for i in range( 5 ): - FaceList.append( subShapeList[ i ] ) - -aComp = geompy.MakeCompound( FaceList ) -aBox = geompy.Sew( aComp, 1. ) -idbox = geompy.addToStudy( aBox, "box" ) - -aBox = salome.IDToObject( idbox ) - -# Create mesh - -hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hyp1.SetNumberOfSegments(5) -hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp2.SetMaxElementArea(20) -hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp3.SetMaxElementArea(50) - -algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - -mesh = smesh.CreateMesh(aBox) -mesh.AddHypothesis(aBox,hyp1) -mesh.AddHypothesis(aBox,hyp2) -mesh.AddHypothesis(aBox,algo1) -mesh.AddHypothesis(aBox,algo2) - -smesh.Compute(mesh,aBox) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); -smeshgui.SetName( salome.ObjectToID( mesh ), "Mesh_freebord" ); - -# Criterion : Free edges -aFilterMgr = smesh.CreateFilterManager() -aPredicate = aFilterMgr.CreateFreeBorders() -aFilter = aFilterMgr.CreateFilter() -aFilter.SetPredicate( aPredicate ) - -anIds = aFilter.GetElementsId( mesh ) - -# print result -print "Criterion: Free edges Nb = ", len( anIds ) -for i in range( len( anIds ) ): - print anIds[ i ] - -# create group -aGroup = mesh.CreateGroup( SMESH.EDGE, "Free edges" ) -aGroup.Add( anIds ) - - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_hexaedre.py b/src/SMESH_SWIG/SMESH_hexaedre.py deleted file mode 100755 index 1b93e1c08..000000000 --- a/src/SMESH_SWIG/SMESH_hexaedre.py +++ /dev/null @@ -1,148 +0,0 @@ -#============================================================================== -# Info. -# Bug (from script, bug) : hexaedre_modified.py, PAL6194, PAL7153 -# Modified : 25/11/2004 -# Author : Kovaltchuk Alexey -# Project : PAL/SALOME -#============================================================================== - -import salome -from salome import sg - -import geompy - -import math - -# ----------------------------------------------------------------------------- - -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -myBuilder = salome.myStudy.NewBuilder() -gg = salome.ImportComponentGUI("GEOM") -from salome import sg - -ShapeTypeCompSolid = 1 -ShapeTypeSolid = 2 -ShapeTypeShell = 3 -ShapeTypeFace = 4 -ShapeTypeWire = 5 -ShapeTypeEdge = 6 -ShapeTypeVertex = 7 - -Boolop_common = 1 -Boolop_cut = 2 -Boolop_fuse = 3 -Boolop_section = 4 - -p0 = geompy.MakeVertex(0., 0., 0.) -px = geompy.MakeVertex(100., 0., 0.) -py = geompy.MakeVertex(0., 100., 0.) -pz = geompy.MakeVertex(0., 0., 100.) -vx = geompy.MakeVector(p0, px) -vy = geompy.MakeVector(p0, py) -vz = geompy.MakeVector(p0, pz) - -sphereExt = geompy.MakeSphere( 0., 0., 0., 400.) -sphereInt = geompy.MakeSphere( 0.,-50., 0., 350.) -sphereA = geompy.MakeSphere( -400., 50., 50., 400.) -sphereB = geompy.MakeSphere( 350.,-50.,-50., 350.) -ptcyle = geompy.MakeVertex(0., -300., -450.) -cylindre = geompy.MakeCylinder(ptcyle,vz,500.,900.) - -vol1=geompy.MakeCut(sphereExt,sphereA) -vol2=geompy.MakeCut(vol1,sphereB) -vol3=geompy.MakeCut(vol2,cylindre) -blob=geompy.MakeCut(vol3,sphereInt) - -idblob = geompy.addToStudy(blob,"blob") - -aretes = [] -aretes = geompy.SubShapeAllSorted(blob, ShapeTypeEdge) -eid=0 - -# ------------------------------- -# --- numerotation des aretes -##for edge in aretes: -## edname="arete%d"%eid -## idedge=geompy.addToStudy(edge,edname) -## eid=eid+1 - -salome.sg.updateObjBrowser(1) - -# --- epaisseur 0 2 8 10 -# --- hauteur 1 3 9 11 -# --- largeur 4 5 6 7 - -# ----------------------------------------------------------------------------- - -print "-------------------------- mesh" - -import SMESH -import StdMeshers -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# ---- create Hypothesis -print "-------------------------- create Hypothesis" -numberOfSegments = 4 -hypNbSegA=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSegA.SetNumberOfSegments(numberOfSegments) -numberOfSegments = 10 -hypNbSegB=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSegB.SetNumberOfSegments(numberOfSegments) -numberOfSegments = 15 -hypNbSegC=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSegC.SetNumberOfSegments(numberOfSegments) - -# ---- create Algorithms -print "-------------------------- create Algorithms" -regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -quad2D=smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") -hexa3D=smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") - -# ---- init a Mesh with the geom shape -shape_mesh = blob -myMesh=smesh.CreateMesh(shape_mesh) - -# ---- add hypothesis and algorithms to mesh -print "-------------------------- add hypothesis to mesh" -myMesh.AddHypothesis(shape_mesh,regular1D) -myMesh.AddHypothesis(shape_mesh,quad2D) -myMesh.AddHypothesis(shape_mesh,hexa3D) - -#myMesh.AddHypothesis(shape_mesh,hypNbSeg) - -myMesh.AddHypothesis(aretes[0],hypNbSegA) -myMesh.AddHypothesis(aretes[2],hypNbSegA) -myMesh.AddHypothesis(aretes[8],hypNbSegA) -myMesh.AddHypothesis(aretes[10],hypNbSegA) - -myMesh.AddHypothesis(aretes[1],hypNbSegC) -myMesh.AddHypothesis(aretes[3],hypNbSegC) -myMesh.AddHypothesis(aretes[9],hypNbSegC) -myMesh.AddHypothesis(aretes[11],hypNbSegC) - -myMesh.AddHypothesis(aretes[4],hypNbSegB) -myMesh.AddHypothesis(aretes[5],hypNbSegB) -myMesh.AddHypothesis(aretes[6],hypNbSegB) -myMesh.AddHypothesis(aretes[7],hypNbSegB) - -# ---- compute mesh - -print "-------------------------- compute mesh" -ret=smesh.Compute(myMesh, shape_mesh) -print ret -if ret != 0: - #log=myMesh.GetLog(0) # no erase trace - #for linelog in log: - # print linelog - print "Information about the Mesh:" - print "Number of nodes : ", myMesh.NbNodes() - print "Number of edges : ", myMesh.NbEdges() - print "Number of faces : ", myMesh.NbFaces() - print "Number of quadrangles : ", myMesh.NbQuadrangles() - print "Number of volumes : ", myMesh.NbVolumes() - print "Number of hexahedrons : ", myMesh.NbHexas() -else: - print "problem when Computing the mesh" - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_mechanic.py b/src/SMESH_SWIG/SMESH_mechanic.py deleted file mode 100644 index 7c1fdbd22..000000000 --- a/src/SMESH_SWIG/SMESH_mechanic.py +++ /dev/null @@ -1,257 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_withHole.py -# Author : Lucien PIGNOLONI -# Module : SMESH -# $Header$ - -#------------------------------------------------------------------------- - -import salome -import geompy - -import StdMeshers - -# ---------------------------- GEOM -------------------------------------- - -# ---- define contigous arcs and segment to define a closed wire -p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 ) -p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 ) -p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 ) -arc1 = geompy.MakeArc( p1, p2, p3 ) - -p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 ) -seg1 = geompy.MakeVector( p3, p4 ) - -p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 ) -p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 ) -arc2 = geompy.MakeArc( p4, p5, p6 ) - -p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 ) -arc3 = geompy.MakeArc( p6, p7, p1 ) - -# ---- define a closed wire with arcs and segment -List1 = [] -List1.append( arc1 ) -List1.append( seg1 ) -List1.append( arc2 ) -List1.append( arc3 ) - -wire1 = geompy.MakeWire( List1 ) -Id_wire1 = geompy.addToStudy( wire1, "wire1" ) - -# ---- define a planar face with wire -WantPlanarFace = 1 #True -face1 = geompy.MakeFace( wire1, WantPlanarFace ) -Id_face1 = geompy.addToStudy( face1, "face1" ) - -# ---- create a shape by extrusion -pO = geompy.MakeVertex( 0.0, 0.0, 0.0 ) -pz = geompy.MakeVertex( 0.0, 0.0, 100.0 ) -vz = geompy.MakeVector( pO, pz ) - -prism1 = geompy.MakePrismVecH( face1, vz, 100.0 ) -Id_prism1 = geompy.addToStudy( prism1, "prism1" ) - -# ---- create two cylinders -pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 ) -pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 ) - -radius = 20.0 -height = 180.0 -cyl1 = geompy.MakeCylinder( pc1, vz, radius, height ) -cyl2 = geompy.MakeCylinder( pc2, vz, radius, height ) - -Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" ) -Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" ) - -# ---- cut with cyl1 -shape = geompy.MakeBoolean( prism1, cyl1, 2 ) - -# ---- fuse with cyl2 to obtain the final mechanic piece :) -mechanic = geompy.MakeBoolean( shape, cyl2, 3 ) -Id_mechanic = geompy.addToStudy( mechanic, "mechanic" ) - -# ---- explode on faces -SubFaceL = geompy.SubShapeAllSorted(mechanic, geompy.ShapeType["FACE"]) - -# ---- add a face sub shape in study to be meshed different -sub_face1 = SubFaceL[0] -name = geompy.SubShapeName( sub_face1, mechanic ) - -Id_SubFace1 = geompy.addToStudyInFather( mechanic, sub_face1, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face2 = SubFaceL[4] -name = geompy.SubShapeName( sub_face2, mechanic ) - -Id_SubFace2 = geompy.addToStudyInFather( mechanic, sub_face2, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face3 = SubFaceL[5] -name = geompy.SubShapeName( sub_face3, mechanic ) - -Id_SubFace3 = geompy.addToStudyInFather( mechanic, sub_face3, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face4 = SubFaceL[10] -name = geompy.SubShapeName( sub_face4, mechanic ) - -Id_SubFace4 = geompy.addToStudyInFather( mechanic, sub_face4, name ) - -# ---------------------------- SMESH -------------------------------------- - -# ---- launch SMESH, init a Mesh with shape 'mechanic' - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -# -- Init -- -shape_mesh = salome.IDToObject( Id_mechanic ) -smesh.SetCurrentStudy(salome.myStudy) - -mesh = smesh.CreateMesh(shape_mesh) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName( idmesh, "Mesh_mechanic" ) - -print "-------------------------- NumberOfSegments" - -numberOfSegment = 10 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 25 - -hypArea25 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea25.SetMaxElementArea( maxElementArea ) -print hypArea25.GetName() -print hypArea25.GetId() -print hypArea25.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea25), "MaxElementArea_25") - -print "-------------------------- MaxElementArea" - -maxElementArea = 35 - -hypArea35 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea35.SetMaxElementArea( maxElementArea ) -print hypArea35.GetName() -print hypArea35.GetId() -print hypArea35.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea35), "MaxElementArea_35") - -print "-------------------------- Regular_1D" - -algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp = algoReg1D.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoReg1D.GetName() -print algoReg1D.GetId() - -smeshgui.SetName(salome.ObjectToID(algoReg1D), "Regular_1D") - -print "-------------------------- MEFISTO_2D" - -algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" ) -listHyp = algoMef.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoMef.GetName() -print algoMef.GetId() - -smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D") - -print "-------------------------- SMESH_Quadrangle_2D" - -algoQuad = smesh.CreateHypothesis( "Quadrangle_2D", "libStdMeshersEngine.so" ) -listHyp = algoQuad.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoQuad.GetName() -print algoQuad.GetId() - -smeshgui.SetName(salome.ObjectToID(algoQuad), "SMESH_Quadrangle_2D") - -print "-------------------------- add hypothesis to main shape" - -mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( shape_mesh, hypArea25 ) # max area - -mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation -mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D - -print "-------------------------- add hypothesis and algorithm to sub face 1" - -submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1") - -mesh.AddHypothesis( sub_face1, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face1, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorithm to sub face 2" - -submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2") - -mesh.AddHypothesis( sub_face2, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face2, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 3" - -submesh = mesh.GetSubMesh(sub_face3, "SubMeshFace3") - -mesh.AddHypothesis( sub_face3, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face3, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 4" - -submesh = mesh.GetSubMesh(sub_face4, "SubMeshFace4") - -mesh.AddHypothesis( sub_face4, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face4, hypArea35 ) # max area - -print "-------------------------- compute the mesh of the mechanic piece" - -smesh.Compute(mesh, shape_mesh) - -print "Information about the Mesh_mechanic:" -print "Number of nodes : ", mesh.NbNodes() -print "Number of edges : ", mesh.NbEdges() -print "Number of faces : ", mesh.NbFaces() -print "Number of triangles : ", mesh.NbTriangles() -print "Number of quadrangles : ", mesh.NbQuadrangles() -print "Number of volumes : ", mesh.NbVolumes() -print "Number of tetrahedrons: ", mesh.NbTetras() - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_mechanic_editor.py b/src/SMESH_SWIG/SMESH_mechanic_editor.py deleted file mode 100644 index 596786ed9..000000000 --- a/src/SMESH_SWIG/SMESH_mechanic_editor.py +++ /dev/null @@ -1,308 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_withHole.py -# Author : Lucien PIGNOLONI -# Module : SMESH -# $Header$ - -#------------------------------------------------------------------------- - -import salome -import geompy - -import StdMeshers - -import SMESH - -# ---------------------------- GEOM -------------------------------------- - -# ---- define contigous arcs and segment to define a closed wire -p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 ) -p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 ) -p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 ) -arc1 = geompy.MakeArc( p1, p2, p3 ) - -p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 ) -seg1 = geompy.MakeVector( p3, p4 ) - -p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 ) -p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 ) -arc2 = geompy.MakeArc( p4, p5, p6 ) - -p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 ) -arc3 = geompy.MakeArc( p6, p7, p1 ) - -# ---- define a closed wire with arcs and segment -List1 = [] -List1.append( arc1 ) -List1.append( seg1 ) -List1.append( arc2 ) -List1.append( arc3 ) - -wire1 = geompy.MakeWire( List1 ) -Id_wire1 = geompy.addToStudy( wire1, "wire1" ) - -# ---- define a planar face with wire -WantPlanarFace = 1 #True -face1 = geompy.MakeFace( wire1, WantPlanarFace ) -Id_face1 = geompy.addToStudy( face1, "face1" ) - -# ---- create a shape by extrusion -pO = geompy.MakeVertex( 0.0, 0.0, 0.0 ) -pz = geompy.MakeVertex( 0.0, 0.0, 100.0 ) -vz = geompy.MakeVector( pO, pz ) - -prism1 = geompy.MakePrismVecH( face1, vz, 100.0 ) -Id_prism1 = geompy.addToStudy( prism1, "prism1" ) - -# ---- create two cylinders -pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 ) -pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 ) - -radius = 20.0 -height = 180.0 -cyl1 = geompy.MakeCylinder( pc1, vz, radius, height ) -cyl2 = geompy.MakeCylinder( pc2, vz, radius, height ) - -Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" ) -Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" ) - -# ---- cut with cyl1 -shape = geompy.MakeBoolean( prism1, cyl1, 2 ) - -# ---- fuse with cyl2 to obtain the final mechanic piece :) -mechanic = geompy.MakeBoolean( shape, cyl2, 3 ) -Id_mechanic = geompy.addToStudy( mechanic, "mechanic" ) - -# ---- explode on faces -SubFaceL = geompy.SubShapeAllSorted(mechanic, geompy.ShapeType["FACE"]) - -# ---- add a face sub shape in study to be meshed different -sub_face1 = SubFaceL[0] -name = geompy.SubShapeName( sub_face1, mechanic ) - -Id_SubFace1 = geompy.addToStudyInFather( mechanic, sub_face1, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face2 = SubFaceL[4] -name = geompy.SubShapeName( sub_face2, mechanic ) - -Id_SubFace2 = geompy.addToStudyInFather( mechanic, sub_face2, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face3 = SubFaceL[5] -name = geompy.SubShapeName( sub_face3, mechanic ) - -Id_SubFace3 = geompy.addToStudyInFather( mechanic, sub_face3, name ) - -# ---- add a face sub shape in study to be meshed different -sub_face4 = SubFaceL[10] -name = geompy.SubShapeName( sub_face4, mechanic ) - -Id_SubFace4 = geompy.addToStudyInFather( mechanic, sub_face4, name ) - -# ---------------------------- SMESH -------------------------------------- - -# ---- launch SMESH, init a Mesh with shape 'mechanic' - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -# -- Init -- -shape_mesh = salome.IDToObject( Id_mechanic ) -smesh.SetCurrentStudy(salome.myStudy) - -mesh = smesh.CreateMesh(shape_mesh) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName( idmesh, "Mesh_mechanic" ) - -print "-------------------------- NumberOfSegments" - -numberOfSegment = 10 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 25 - -hypArea25 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea25.SetMaxElementArea( maxElementArea ) -print hypArea25.GetName() -print hypArea25.GetId() -print hypArea25.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea25), "MaxElementArea_25") - -print "-------------------------- MaxElementArea" - -maxElementArea = 35 - -hypArea35 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea35.SetMaxElementArea( maxElementArea ) -print hypArea35.GetName() -print hypArea35.GetId() -print hypArea35.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea35), "MaxElementArea_35") - -print "-------------------------- Regular_1D" - -algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp = algoReg1D.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoReg1D.GetName() -print algoReg1D.GetId() - -smeshgui.SetName(salome.ObjectToID(algoReg1D), "Regular_1D") - -print "-------------------------- MEFISTO_2D" - -algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" ) -listHyp = algoMef.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoMef.GetName() -print algoMef.GetId() - -smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D") - -print "-------------------------- SMESH_Quadrangle_2D" - -algoQuad = smesh.CreateHypothesis( "Quadrangle_2D", "libStdMeshersEngine.so" ) -listHyp = algoQuad.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoQuad.GetName() -print algoQuad.GetId() - -smeshgui.SetName(salome.ObjectToID(algoQuad), "SMESH_Quadrangle_2D") - -print "-------------------------- add hypothesis to main shape" - -mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( shape_mesh, hypArea25 ) # max area - -mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation -mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D - -print "-------------------------- add hypothesis and algorithm to sub face 1" - -submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1") - -mesh.AddHypothesis( sub_face1, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face1, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorithm to sub face 2" - -submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2") - -mesh.AddHypothesis( sub_face2, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face2, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 3" - -submesh = mesh.GetSubMesh(sub_face3, "SubMeshFace3") - -mesh.AddHypothesis( sub_face3, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face3, hypArea35 ) # max area - -print "-------------------------- add hypothesis and algorith to sub face 4" - -submesh = mesh.GetSubMesh(sub_face4, "SubMeshFace4") - -mesh.AddHypothesis( sub_face4, algoQuad ) # Quadrangle 2D -mesh.AddHypothesis( sub_face4, hypArea35 ) # max area - -print "-------------------------- compute the mesh of the mechanic piece" - -smesh.Compute(mesh, shape_mesh) - -print "Information about the Mesh_mechanic:" -print "Number of nodes : ", mesh.NbNodes() -print "Number of edges : ", mesh.NbEdges() -print "Number of faces : ", mesh.NbFaces() -print "Number of triangles : ", mesh.NbTriangles() -print "Number of quadrangles : ", mesh.NbQuadrangles() -print "Number of volumes : ", mesh.NbVolumes() -print "Number of tetrahedrons: ", mesh.NbTetras() - - -MeshEditor = mesh.GetMeshEditor() - -#1 cutting of quadrangles of the 'SubMeshFace2' submesh -submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2") -MeshEditor.SplitQuadObject(submesh, 1) - -#2 cutting of triangles of the group -FacesTriToQuad = [2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422] -GroupTriToQuad = mesh.CreateGroup(SMESH.FACE,"Group of faces (quad)") -GroupTriToQuad.Add(FacesTriToQuad) -MeshEditor.TriToQuadObject(GroupTriToQuad, None , 1.57) - -#3 extrusion of the group -point = SMESH.PointStruct(0, 0, 5) -vector = SMESH.DirStruct(point) -MeshEditor.ExtrusionSweepObject(GroupTriToQuad, vector, 5) - -#4 mirror object -MeshEditor.MirrorObject(mesh, SMESH.AxisStruct(0, 0, 0, 0, 0, 0), SMESH.SMESH_MeshEditor.POINT, 0) - -#5 mesh translation -point = SMESH.PointStruct(10, 10, 10) -vector = SMESH.DirStruct(point) -MeshEditor.TranslateObject(mesh, vector, 0) - -#6 mesh rotation -axisXYZ = SMESH.AxisStruct(0, 0, 0, 10, 10, 10) -angle180 = 180*3.141/180 -MeshEditor.RotateObject(mesh, axisXYZ, angle180, 0) - -#7 group smoothing -FacesSmooth = [864, 933, 941, 950, 1005, 1013] -GroupSmooth = mesh.CreateGroup(SMESH.FACE,"Group of faces (smooth)") -GroupSmooth.Add(FacesSmooth) -MeshEditor.SmoothObject(GroupSmooth, [], 20, 2, SMESH.SMESH_MeshEditor.CENTROIDAL_SMOOTH) - -#8 rotation sweep object -FacesRotate = [492, 493, 502, 503] -GroupRotate = mesh.CreateGroup(SMESH.FACE,"Group of faces (rotate)") -GroupRotate.Add(FacesRotate) -angle45 = 45*3.141/180 -axisXYZ = SMESH.AxisStruct(-38.3128, -73.3658, -133.321, -13.3402, -13.3265, 6.66632) -MeshEditor.RotationSweepObject(GroupRotate, axisXYZ, angle45, 4, 1e-5) - -#9 reorientation of the whole mesh -submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1") -MeshEditor.ReorientObject(submesh) - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_mechanic_tetra.py b/src/SMESH_SWIG/SMESH_mechanic_tetra.py deleted file mode 100644 index eee3f87d8..000000000 --- a/src/SMESH_SWIG/SMESH_mechanic_tetra.py +++ /dev/null @@ -1,212 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_withHole.py -# Author : Lucien PIGNOLONI -# Module : SMESH -# $Header$ - -import salome -import geompy - -geom = geompy.geom -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -import StdMeshers -import NETGENPlugin - -# ---------------------------- GEOM -------------------------------------- - -# ---- define contigous arcs and segment to define a closed wire -p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 ) -p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 ) -p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 ) -arc1 = geompy.MakeArc( p1, p2, p3 ) - -p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 ) -seg1 = geompy.MakeVector( p3, p4 ) - -p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 ) -p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 ) -arc2 = geompy.MakeArc( p4, p5, p6 ) - -p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 ) -arc3 = geompy.MakeArc( p6, p7, p1 ) - -# ---- define a closed wire with arcs and segment -List1 = [] -List1.append( arc1 ) -List1.append( seg1 ) -List1.append( arc2 ) -List1.append( arc3 ) - -wire1 = geompy.MakeWire( List1 ) -Id_wire1 = geompy.addToStudy( wire1, "wire1" ) - -# ---- define a planar face with wire -WantPlanarFace = 1 #True -face1 = geompy.MakeFace( wire1, WantPlanarFace ) -Id_face1 = geompy.addToStudy( face1, "face1" ) - -# ---- create a shape by extrusion -pO = geompy.MakeVertex( 0.0, 0.0, 0.0 ) -pz = geompy.MakeVertex( 0.0, 0.0, 100.0 ) -vz = geompy.MakeVector( pO, pz ) - -prism1 = geompy.MakePrismVecH( face1, vz, 100.0 ) -Id_prism1 = geompy.addToStudy( prism1, "prism1") - -# ---- create two cylinders - -pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 ) -pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 ) -radius = 20.0 -height = 180.0 -cyl1 = geompy.MakeCylinder( pc1, vz, radius, height ) -cyl2 = geompy.MakeCylinder( pc2, vz, radius, height ) - -Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" ) -Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" ) - -# ---- cut with cyl1 -shape = geompy.MakeBoolean( prism1, cyl1, 2 ) - -# ---- fuse with cyl2 to obtain the final mechanic piece :) -mechanic = geompy.MakeBoolean( shape, cyl2, 3 ) -Id_mechanic = geompy.addToStudy( mechanic, "mechanic" ) - -# ---- Analysis of the geometry - -print "Analysis of the geometry mechanic :" - -subShellList = geompy.SubShapeAll(mechanic,geompy.ShapeType["SHELL"]) -subFaceList = geompy.SubShapeAll(mechanic,geompy.ShapeType["FACE"]) -subEdgeList = geompy.SubShapeAll(mechanic,geompy.ShapeType["EDGE"]) - -print "number of Shells in mechanic : ",len(subShellList) -print "number of Faces in mechanic : ",len(subFaceList) -print "number of Edges in mechanic : ",len(subEdgeList) - -### ---------------------------- SMESH -------------------------------------- - -print "-------------------------- NumberOfSegments" - -numberOfSegment = 10 - -hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) -hypNbSeg.SetNumberOfSegments( numberOfSegment ) -print hypNbSeg.GetName() -print hypNbSeg.GetId() -print hypNbSeg.GetNumberOfSegments() - -smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") - -print "-------------------------- MaxElementArea" - -maxElementArea = 20 - -hypArea = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) -hypArea.SetMaxElementArea( maxElementArea ) -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_20") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 20 - -hypVolume = smesh.CreateHypothesis( "MaxElementVolume", "libStdMeshersEngine.so" ) -hypVolume.SetMaxElementVolume( maxElementVolume ) -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_20") - -print "-------------------------- Regular_1D" - -algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) -listHyp =algoReg1D.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoReg1D.GetName() -print algoReg1D.GetId() - -smeshgui.SetName(salome.ObjectToID(algoReg1D), "Regular_1D") - -print "-------------------------- MEFISTO_2D" - -algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" ) -listHyp = algoMef.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoMef.GetName() -print algoMef.GetId() - -smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -algoNg = smesh.CreateHypothesis( "NETGEN_3D", "libNETGENEngine.so" ) -listHyp = algoNg.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoNg.GetName() -print algoNg.GetId() - -smeshgui.SetName(salome.ObjectToID(algoNg), "NETGEN_3D") - -print "-------------------------- add hypothesis to main mechanic" - -shape_mesh = salome.IDToObject( Id_mechanic ) - -mesh = smesh.CreateMesh(shape_mesh) - -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName( idmesh, "Mesh_mechanic_tetra" ) - -mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments -mesh.AddHypothesis( shape_mesh, hypArea ) # max area -mesh.AddHypothesis( shape_mesh, hypVolume ) # max volume - -mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation -mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D -mesh.AddHypothesis( shape_mesh, algoNg ) # NETGEN 3D - -print "-------------------------- compute the mesh of the mechanic piece" -smesh.Compute(mesh,shape_mesh) - -print "Information about the Mesh_mechanic_tetra:" -print "Number of nodes : ", mesh.NbNodes() -print "Number of edges : ", mesh.NbEdges() -print "Number of faces : ", mesh.NbFaces() -print "Number of triangles : ", mesh.NbTriangles() -print "Number of quadrangles: ", mesh.NbQuadrangles() -print "Number of volumes : ", mesh.NbVolumes() -print "Number of tetrahedrons: ", mesh.NbTetras() - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_shared_modules.py b/src/SMESH_SWIG/SMESH_shared_modules.py deleted file mode 100644 index e40362fff..000000000 --- a/src/SMESH_SWIG/SMESH_shared_modules.py +++ /dev/null @@ -1,19 +0,0 @@ -""" - -""" - -# force SMESH importation at interpretor initialization -# see salome_shared_modules.py -# (avoids incomplete import at run time) - -print "============== import SMESH =======================" - -import SMESH - -# this function is required - -def init_shared_modules(): - """ - This function initializes shared modules that need to be - """ - pass diff --git a/src/SMESH_SWIG/SMESH_test.py b/src/SMESH_SWIG/SMESH_test.py deleted file mode 100644 index d2385f3a9..000000000 --- a/src/SMESH_SWIG/SMESH_test.py +++ /dev/null @@ -1,200 +0,0 @@ -# SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -# -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_test.py -# Module : SMESH - -import salome -import geompy -import smeshpy - -import SMESH -import StdMeshers - -# ---- define a box - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) -idb = geompy.addToStudy(box, "box") - -# ---- add first face of box in study - -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -face = subShapeList[0] -name = geompy.SubShapeName(face, box) -idf = geompy.addToStudyInFather(box, face, name) - -# ---- add shell from box in study - -subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"]) -shell = subShellList[0] -name = geompy.SubShapeName(shell, box) -ids = geompy.addToStudyInFather(box, shell, name) - -# ---- add first edge of face in study - -edgeList = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"]) -edge = edgeList[0]; -name = geompy.SubShapeName(edge, face) -ide = geompy.addToStudyInFather(face, edge, name) - -# ---- launch SMESH, init a Mesh with the box - -gen = smeshpy.smeshpy() -mesh = gen.CreateMesh(idb) - -print "-------------------------- create Hypothesis" - -print "-------------------------- LocalLength" - -hypo1 = gen.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") -print hypo1.GetName() -print hypo1.GetId() -print hypo1.GetLength() -hypo1.SetLength(100) -print hypo1.GetLength() - -print "-------------------------- bidon" - -hyp3 = gen.CreateHypothesis("bidon", "") - -print "-------------------------- NumberOfSegments" - -hypo3 = gen.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypo3.SetNumberOfSegments(7) -print hypo3.GetName() -print hypo3.GetNumberOfSegments() -print hypo3.GetId() - -print "-------------------------- MaxElementArea" - -hypo4 = gen.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypo4.SetMaxElementArea(5000) -print hypo4.GetName() -print hypo4.GetMaxElementArea() -print hypo4.GetId() - -print "-------------------------- Regular_1D" - -algo_1 = gen.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -print algo_1.GetName() -print algo_1.GetId() -listHyp = algo_1.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algo_1.GetId() - -print "-------------------------- MEFISTO_2D" - -algo_2 = gen.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -print algo_2.GetName() -print algo_2.GetId() -listHyp = algo_2.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algo_2.GetId() - -print "-------------------------- add hypothesis to edge" - -edge = salome.IDToObject(ide) -submesh = mesh.GetSubMesh(edge, "SubMeshEdge") -ret = mesh.AddHypothesis(edge,algo_1) -print ret -ret = mesh.AddHypothesis(edge,hypo1) -print ret - -##print "-------------------------- compute edge" -##ret=gen.Compute(mesh,ide) -##print ret -##log=mesh.GetLog(1); -##for a in log: -## print a - -print "-------------------------- add hypothesis to box" - -box = salome.IDToObject(idb) -submesh = mesh.GetSubMesh(box, "SubMeshBox") -ret = mesh.AddHypothesis(box,algo_1) -print ret -ret = mesh.AddHypothesis(box,hypo1) -print ret -ret = mesh.AddHypothesis(box,algo_2) -print ret -ret = mesh.AddHypothesis(box,hypo4) -print ret - -print "-------------------------- compute face" - -ret = gen.Compute(mesh,idf) -print ret -log = mesh.GetLog(0) # 0 - GetLog without ClearLog after, else if 1 - ClearLog after -for a in log: - print "-------" - ii = 0 - ir = 0 - comType = a.commandType - if comType == 0: - for i in range(a.number): - ind = a.indexes[ii] - ii = ii+1 - r1 = a.coords[ir] - ir = ir+1 - r2 = a.coords[ir] - ir = ir+1 - r3 = a.coords[ir] - ir = ir+1 - print "AddNode %i - %g %g %g" % (ind, r1, r2, r3) - elif comType == 1: - for i in range(a.number): - ind = a.indexes[ii] - ii = ii+1 - i1 = a.indexes[ii] - ii = ii+1 - i2 = a.indexes[ii] - ii = ii+1 - print "AddEdge %i - %i %i" % (ind, i1, i2) - elif comType == 2: - for i in range(a.number): - ind = a.indexes[ii] - ii = ii+1 - i1 = a.indexes[ii] - ii = ii+1 - i2 = a.indexes[ii] - ii = ii+1 - i3 = a.indexes[ii] - ii = ii+1 - print "AddTriangle %i - %i %i %i" % (ind, i1, i2, i3) - -##print "-------------------------- compute box" -##ret=gen.Compute(mesh,idb) -##print ret -##log=mesh.GetLog(1); -##print log - -##shell=salome.IDToObject(ids) -##submesh=mesh.GetElementsOnShape(shell) -##ret=mesh.AddHypothesis(shell,algo_1) -##print ret -##ret=mesh.AddHypothesis(shell,hypo1) -##print ret -##ret=gen.Compute(mesh,ids) -##print ret diff --git a/src/SMESH_SWIG/SMESH_test0.py b/src/SMESH_SWIG/SMESH_test0.py deleted file mode 100644 index a7a5282a5..000000000 --- a/src/SMESH_SWIG/SMESH_test0.py +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_test0.py -# Module : SMESH - -import salome -import geompy -from geompy import geom -from geompy import gg - -import SMESH - -myBuilder = salome.myStudy.NewBuilder() - -# ---- define a box - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) -idbox = geompy.addToStudy(box, "box") - -# ---- add first face of box in study - -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -face = subShapeList[0] -name = geompy.SubShapeName(face, box) -print name -idface = geompy.addToStudyInFather(box, face, name) - -# ---- add shell from box in study - -subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"]) -shell = subShellList[0] -name = geompy.SubShapeName(shell, box) -print name -idshell = geompy.addToStudyInFather(box, shell, name) - -# ---- add first edge of face in study - -edgeList = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"]) -edge = edgeList[0] -name = geompy.SubShapeName(edge, face) -print name -idedge = geompy.addToStudyInFather(face, edge, name) - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_test1.py b/src/SMESH_SWIG/SMESH_test1.py deleted file mode 100644 index c0b04299a..000000000 --- a/src/SMESH_SWIG/SMESH_test1.py +++ /dev/null @@ -1,157 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_test1.py -# Module : SMESH - -import salome -import geompy - -import StdMeshers - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -# ---- define a box - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) -idbox = geompy.addToStudy(box, "box") - -# ---- add first face of box in study - -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -face = subShapeList[0] -name = geompy.SubShapeName(face, box) -print name -idface = geompy.addToStudyInFather(box, face, name) - -# ---- add shell from box in study - -subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"]) -shell = subShellList[0] -name = geompy.SubShapeName(shell, box) -print name -idshell = geompy.addToStudyInFather(box, shell, name) - -# ---- add first edge of face in study - -edgeList = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"]) -edge = edgeList[0] -name = geompy.SubShapeName(edge, face) -print name -idedge = geompy.addToStudyInFather(face, edge, name) - -# ---- launch SMESH - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -print "-------------------------- create Hypothesis" - -print "-------------------------- LocalLength" -hypLen1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") -hypLen1.SetLength(100) -print hypLen1.GetName() -print hypLen1.GetId() -print hypLen1.GetLength() - -idlength = salome.ObjectToID(hypLen1) -smeshgui.SetName(idlength, "Local_Length_100"); - -print "-------------------------- NumberOfSegments" -hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hypNbSeg1.SetNumberOfSegments(7) -print hypNbSeg1.GetName() -print hypNbSeg1.GetId() -print hypNbSeg1.GetNumberOfSegments() - -idseg = salome.ObjectToID(hypNbSeg1) -smeshgui.SetName(idseg, "NumberOfSegments_7"); - -print "-------------------------- MaxElementArea" -hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea1.SetMaxElementArea(2500) -print hypArea1.GetName() -print hypArea1.GetId() -print hypArea1.GetMaxElementArea() - -idarea1 = salome.ObjectToID(hypArea1) -smeshgui.SetName(idarea1, "MaxElementArea_2500"); - -print "-------------------------- MaxElementArea" -hypArea2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hypArea2.SetMaxElementArea(500) -print hypArea2.GetName() -print hypArea2.GetId() -print hypArea2.GetMaxElementArea() - -idarea2 = salome.ObjectToID(hypArea2) -smeshgui.SetName(idarea2, "MaxElementArea_500"); - -print "-------------------------- Regular_1D" -algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -listHyp = algoReg.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoReg.GetName() -print algoReg.GetId() - -idreg = salome.ObjectToID(algoReg) -smeshgui.SetName(idreg, "Regular_1D"); - -print "-------------------------- MEFISTO_2D" -algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") -listHyp = algoMef.GetCompatibleHypothesis() -for hyp in listHyp: - print hyp -print algoMef.GetName() -print algoMef.GetId() - -idmef = salome.ObjectToID(algoMef) -smeshgui.SetName(idmef, "MEFISTO_2D"); - -# ---- Init a Mesh with the box - -box = salome.IDToObject(idbox) -mesh = smesh.CreateMesh(box) -idmesh = salome.ObjectToID(mesh) -smeshgui.SetName(idmesh, "Meshbox"); - -print "-------------------------- add hypothesis to box" -mesh.AddHypothesis(box,algoReg) -mesh.AddHypothesis(box,hypNbSeg1) -mesh.AddHypothesis(box,algoMef) -mesh.AddHypothesis(box,hypArea1) - -# ---- add hypothesis to edge - -print "-------------------------- add hypothesis to edge" -edge = salome.IDToObject(idedge) -submesh = mesh.GetSubMesh(edge, "SubMeshEdge") -mesh.AddHypothesis(edge, algoReg) -mesh.AddHypothesis(edge, hypLen1) - -print "-------------------------- add hypothesis to face" -face = salome.IDToObject(idface) -submesh = mesh.GetSubMesh(face, "SubMeshFace") -mesh.AddHypothesis(face, hypArea2) - -salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_test2.py b/src/SMESH_SWIG/SMESH_test2.py deleted file mode 100644 index b552a1490..000000000 --- a/src/SMESH_SWIG/SMESH_test2.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_test2.py -# Module : SMESH - -from SMESH_test1 import * - -# ---- compute box - -print "-------------------------- compute box" -ret = smesh.Compute(mesh,box) -print ret -log = mesh.GetLog(0); # no erase trace -for linelog in log: - print linelog - -salome.sg.updateObjBrowser(1); - -# ---- compute edge - -##print "-------------------------- compute edge" -##ret=gen.Compute(mesh,idedge) -##print ret -##log=mesh.GetLog(1); -##for a in log: -## print a - -# ---- add hypothesis to face - -# ---- compute face - -#print "-------------------------- compute face" -#ret=gen.Compute(mesh,idface) -#print ret -#log=mesh.GetLog(1); -#for a in log: -# print a - -##shell=salome.IDToObject(ids) -##submesh=mesh.GetElementsOnShape(shell) -##ret=mesh.AddHypothesis(shell,algoReg) -##print ret -##ret=mesh.AddHypothesis(shell,hypLen1) -##print ret -##ret=gen.Compute(mesh,ids) -##print ret diff --git a/src/SMESH_SWIG/SMESH_test3.py b/src/SMESH_SWIG/SMESH_test3.py deleted file mode 100644 index e10501858..000000000 --- a/src/SMESH_SWIG/SMESH_test3.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -# -# -# -# File : SMESH_test3.py -# Module : SMESH - -#import salome -import math -import geompy - -pi = math.pi - -# --------------------------------------------- -xa = math.sin(pi/12) -ya = 0 -za = math.cos(pi/12) - -xb = 0 -yb = math.sin(pi/18) -zb = math.cos(pi/18) - -xc = math.cos(-pi/18) -yc = 0 -zc = math.sin(-pi/18) - -rc1 = 150 -rc2 = 150 -rc3 = 150 -rc4 = 300 - -hc1 = 300 -hc2 = 2*hc1 -hc3 = 2*hc1 -hc4 = 2*hc1 - -# --------------------------------------------- -point_0 = geompy.MakeVertex(0, 0, 0) -point_z = geompy.MakeVertex(0, 0, 1) - -point_a = geompy.MakeVertex(xa, ya, za) -point_b = geompy.MakeVertex(xb, yb, zb) -point_c = geompy.MakeVertex(xc, yc, zc) - -dir_z = geompy.MakeVector(point_0, point_z) -dir_a = geompy.MakeVector(point_0, point_a) -dir_b = geompy.MakeVector(point_0, point_b) -dir_c = geompy.MakeVector(point_0, point_c) - -axe_z = dir_z -axe_a = dir_a -axe_b = dir_b -axe_c = dir_c - -cyl_1 = geompy.MakeCylinder(point_0, dir_z, rc1, hc1) - -cyl_t = geompy.MakeCylinder(point_0, dir_a, rc2, hc2) -cyl_a = geompy.MakeTranslation(cyl_t, 1.2*rc1, 0.1*rc1, -0.5*hc1) - -cyl_t = geompy.MakeCylinder(point_0, dir_b, rc3, hc3) -cyl_b = geompy.MakeTranslation(cyl_t, -1.2*rc1, -0.1*rc1, -0.5*hc1) - -cyl_t = geompy.MakeCylinder(point_0, dir_c, rc4, hc4) -cyl_t = geompy.MakeRotation(cyl_t, axe_c, pi/2) -cyl_c = geompy.MakeTranslation(cyl_t, -hc1, 0, 0) -cyl_d = geompy.MakeTranslation(cyl_t, -hc1, 0, 1.3*rc4) - -inter_t = geompy.MakeBoolean(cyl_c,cyl_d, 1) # common - -blob_t = geompy.MakeBoolean(cyl_1, cyl_a, 2) # cut -blob_t = geompy.MakeBoolean(blob_t, cyl_b, 2) - -blob = geompy.MakeBoolean(blob_t, inter_t, 1) # common - -idblob = geompy.addToStudy(blob,"blob") -#idc = geompy.addToStudy(cyl_c,"cyl_c") -#idd = geompy.addToStudy(cyl_d,"cyl_d") diff --git a/src/SMESH_SWIG/SMESH_test4.py b/src/SMESH_SWIG/SMESH_test4.py deleted file mode 100755 index 09271b6f1..000000000 --- a/src/SMESH_SWIG/SMESH_test4.py +++ /dev/null @@ -1,52 +0,0 @@ -import salome -import geompy -import SMESH -import StdMeshers - -smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -smesh.SetCurrentStudy(salome.myStudy) - -box = geompy.MakeBox(0., 0., 0., 100., 200., 300.) -idbox = geompy.addToStudy(box, "box") - -subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) -face = subShapeList[0] -name = geompy.SubShapeName(face, box) -idface = geompy.addToStudyInFather(box, face, name) - -box = salome.IDToObject(idbox) -face = salome.IDToObject(idface) - -hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") -hyp1.SetNumberOfSegments(10) -hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp2.SetMaxElementArea(10) -hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") -hyp3.SetMaxElementArea(100) - -algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") -algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - -mesh = smesh.CreateMesh(box) -mesh.AddHypothesis(box,hyp1) -mesh.AddHypothesis(box,hyp2) -mesh.AddHypothesis(box,algo1) -mesh.AddHypothesis(box,algo2) - -submesh = mesh.GetSubMesh(face, "SubMeshFace") -mesh.AddHypothesis(face,hyp1) -mesh.AddHypothesis(face,hyp3) -mesh.AddHypothesis(face,algo1) -mesh.AddHypothesis(face,algo2) - -smesh.Compute(mesh,box) - -faces = submesh.GetElementsByType(SMESH.FACE) -if len(faces) > 1: - print len(faces), len(faces)/2 - group1 = mesh.CreateGroup(SMESH.FACE,"Group of faces") - group2 = mesh.CreateGroup(SMESH.FACE,"Another group of faces") - group1.Add(faces[:int(len(faces)/2)]) - group2.Add(faces[int(len(faces)/2):]) - -salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/batchmode_mefisto.py b/src/SMESH_SWIG/batchmode_mefisto.py deleted file mode 100644 index 203b1602e..000000000 --- a/src/SMESH_SWIG/batchmode_mefisto.py +++ /dev/null @@ -1,136 +0,0 @@ -import os -import re - -import batchmode_salome -import batchmode_geompy -import batchmode_smesh -import StdMeshers - -smesh = batchmode_smesh.smesh -smesh.SetCurrentStudy(batchmode_salome.myStudy) - -def CreateMesh (theFileName, area, len = None, nbseg = None): - - if not(os.path.isfile(theFileName)) or re.search("\.brep$", theFileName) is None : - print "Incorrect file name !" - return - - if (len is None) and (nbseg is None): - print "Define length or number of segments !" - return - - if (len is not None) and (nbseg is not None): - print "Only one Hypothesis (from length and number of segments) can be defined !" - return - - - # ---- Import shape from BREP file and add it to the study - shape_mesh = batchmode_geompy.Import(theFileName, "BREP") - Id_shape = batchmode_geompy.addToStudy(shape_mesh, "shape_mesh") - - - # ---- SMESH - - print "-------------------------- create Hypothesis" - if (len is not None): - print "-------------------------- LocalLength" - hypLength1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") - hypLength1.SetLength(len) - print "Hypothesis type : ", hypLength1.GetName() - print "Hypothesis ID : ", hypLength1.GetId() - print "Hypothesis Value: ", hypLength1.GetLength() - - if (nbseg is not None): - print "-------------------------- NumberOfSegments" - hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") - hypNbSeg1.SetNumberOfSegments(nbseg) - print "Hypothesis type : ", hypNbSeg1.GetName() - print "Hypothesis ID : ", hypNbSeg1.GetId() - print "Hypothesis Value: ", hypNbSeg1.GetNumberOfSegments() - - if (area == "LengthFromEdges"): - print "-------------------------- LengthFromEdges" - hypLengthFromEdges = smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so") - hypLengthFromEdges.SetMode(1) - print "Hypothesis type : ", hypLengthFromEdges.GetName() - print "Hypothesis ID : ", hypLengthFromEdges.GetId() - print "LengthFromEdges Mode: ", hypLengthFromEdges.GetMode() - - else: - print "-------------------------- MaxElementArea" - hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") - hypArea1.SetMaxElementArea(area) - print "Hypothesis type : ", hypArea1.GetName() - print "Hypothesis ID : ", hypArea1.GetId() - print "Hypothesis Value: ", hypArea1.GetMaxElementArea() - - - print "-------------------------- Regular_1D" - algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") - - listHyp = algoReg.GetCompatibleHypothesis() - for hyp in listHyp: - print hyp - - print "Algo name: ", algoReg.GetName() - print "Algo ID : ", algoReg.GetId() - - print "-------------------------- MEFISTO_2D" - algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") - - listHyp = algoMef.GetCompatibleHypothesis() - for hyp in listHyp: - print hyp - - print "Algo name: ", algoMef.GetName() - print "Algo ID : ", algoMef.GetId() - - - # ---- add hypothesis to shape - - print "-------------------------- add hypothesis to shape" - mesh = smesh.CreateMesh(shape_mesh) - - ret = mesh.AddHypothesis(shape_mesh, algoReg) - print "Add Regular_1D algo .... ", - print ret - - if (nbseg is not None): - ret = mesh.AddHypothesis(shape_mesh, hypNbSeg1) - print "Add Number Of Segements algo .... ", - print ret - - if (len is not None): - ret = mesh.AddHypothesis(shape_mesh,hypLength1) - print "Add Local Length algo .... ", - print ret - - ret = mesh.AddHypothesis(shape_mesh, algoMef) - print "Add MEFISTO_2D algo....", - print ret - - if (area == "LengthFromEdges"): - ret = mesh.AddHypothesis( shape_mesh, hypLengthFromEdges) # length from edge - print "Add Length From Edges algo .... ", - print ret - else: - ret = mesh.AddHypothesis(shape_mesh, hypArea1) - print "Add Max Triangle Area algo .... ", - print ret - - print "-------------------------- compute mesh" - ret = smesh.Compute(mesh,shape_mesh) - print "Compute Mesh .... ", - print ret - log = mesh.GetLog(0); # no erase trace - #for linelog in log: - # print linelog - - print "------------ INFORMATION ABOUT MESH ------------" - - print "Number of nodes : ", mesh.NbNodes() - print "Number of edges : ", mesh.NbEdges() - print "Number of faces : ", mesh.NbFaces() - print "Number of triangles: ", mesh.NbTriangles() - - return mesh diff --git a/src/SMESH_SWIG/batchmode_smesh.py b/src/SMESH_SWIG/batchmode_smesh.py deleted file mode 100644 index 4964c8b0c..000000000 --- a/src/SMESH_SWIG/batchmode_smesh.py +++ /dev/null @@ -1,304 +0,0 @@ -# Copyright (C) 2003 CEA/DEN, EDF R&D -# -# -# -# File : batchmode_smesh.py -# Author : Oksana TCHEBANOVA -# Module : SMESH -# $Header$ - -from batchmode_salome import * -from batchmode_geompy import ShapeType -import SMESH - -#-------------------------------------------------------------------------- -modulecatalog = naming_service.Resolve("/Kernel/ModulCatalog") - -smesh = lcc.FindOrLoadComponent("FactoryServer", "SMESH") -myStudyBuilder = myStudy.NewBuilder() - -if myStudyBuilder is None: - raise RuntimeError, " Null myStudyBuilder" - -father = myStudy.FindComponent("SMESH") -if father is None: - father = myStudyBuilder.NewComponent("SMESH") - FName = myStudyBuilder.FindOrCreateAttribute(father, "AttributeName") - Comp = modulecatalog.GetComponent("SMESH") - FName.SetValue(Comp._get_componentusername()) - aPixmap = myStudyBuilder.FindOrCreateAttribute(father, "AttributePixMap") - aPixmap.SetPixMap("ICON_OBJBROWSER_Mesh") - -myStudyBuilder.DefineComponentInstance(father,smesh) - -mySComponentMesh = father._narrow(SALOMEDS.SComponent) - -Tag_HypothesisRoot = 1 -Tag_AlgorithmsRoot = 2 - -Tag_RefOnShape = 1 -Tag_RefOnAppliedHypothesis = 2 -Tag_RefOnAppliedAlgorithms = 3 - -Tag_SubMeshOnVertex = 4 -Tag_SubMeshOnEdge = 5 -Tag_SubMeshOnFace = 6 -Tag_SubMeshOnSolid = 7 -Tag_SubMeshOnCompound = 8 - -Tag = {"HypothesisRoot":1,"AlgorithmsRoot":2,"RefOnShape":1,"RefOnAppliedHypothesis":2,"RefOnAppliedAlgorithms":3,"SubMeshOnVertex":4,"SubMeshOnEdge":5,"SubMeshOnFace":6,"SubMeshOnSolid":7,"SubMeshOnCompound":8} - -#------------------------------------------------------------ -def Init(): - pass -#------------------------------------------------------------ -def AddNewMesh(IOR): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - res,HypothesisRoot = mySComponentMesh.FindSubObject ( Tag_HypothesisRoot ) - if HypothesisRoot is None or res == 0: - HypothesisRoot = myStudyBuilder.NewObjectToTag(mySComponentMesh, Tag_HypothesisRoot) - aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName") - aName.SetValue("Hypotheses") - aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_hypo.png" ) - aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - - res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot) - if AlgorithmsRoot is None or res == 0: - AlgorithmsRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot) - aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") - aName.SetValue("Algorithms") - aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_algo.png" ) - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - - HypothesisRoot = HypothesisRoot._narrow(SALOMEDS.SObject) - newMesh = myStudyBuilder.NewObject(mySComponentMesh) - aPixmap = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_mesh.png" ) - anIOR = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributeIOR") - anIOR.SetValue(IOR) - return newMesh.GetID() - -#------------------------------------------------------------ -def AddNewHypothesis(IOR): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - res, HypothesisRoot = mySComponentMesh.FindSubObject (Tag_HypothesisRoot) - if HypothesisRoot is None or res == 0: - HypothesisRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot) - aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName") - aName.SetValue("Hypotheses") - aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_hypo.png" ) - - # Add New Hypothesis - newHypo = myStudyBuilder.NewObject(HypothesisRoot) - aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap") - H = orb.string_to_object(IOR) - aType = H.GetName() - aPixmap.SetPixMap( "mesh_tree_hypo.png_" + aType ) - anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR") - anIOR.SetValue(IOR) - return newHypo.GetID() - -#------------------------------------------------------------ -def AddNewAlgorithms(IOR): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot) - if AlgorithmsRoot is None or res == 0: - AlgorithmsRoot = myStudyBuilde.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot) - aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") - aName.SetValue("Algorithms") - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_algo.png" ) - - # Add New Algorithms - newHypo = myStudyBuilder.NewObject(AlgorithmsRoot) - aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap") - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap) - H = orb.string_to_object(IOR) - aType = H.GetName(); #QString in fact - aPixmap.SetPixMap( "mesh_tree_algo.png_" + aType ) - anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR") - anIOR.SetValue(IOR) - return newHypo.GetID() - - -#------------------------------------------------------------ -def SetShape(ShapeEntry, MeshEntry): - SO_MorSM = myStudy.FindObjectID( MeshEntry ) - SO_GeomShape = myStudy.FindObjectID( ShapeEntry ) - - if SO_MorSM is not None and SO_GeomShape is not None : - # VSR: added temporarily - shape reference is published automatically by the engine - res, Ref = SO_MorSM.FindSubObject( Tag_RefOnShape ) - if res == 1 : - return - # VSR ###################################################################### - - SO = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnShape) - myStudyBuilder.Addreference (SO,SO_GeomShape) - - -#------------------------------------------------------------ -def SetHypothesis(Mesh_Or_SubMesh_Entry, Hypothesis_Entry): - SO_MorSM = myStudy.FindObjectID( Mesh_Or_SubMesh_Entry ) - SO_Hypothesis = myStudy.FindObjectID( Hypothesis_Entry ) - - if SO_MorSM is not None and SO_Hypothesis is not None : - - #Find or Create Applied Hypothesis root - res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedHypothesis) - if AHR is None or res == 0: - AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis) - aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName") - - # The same name as in SMESH_Mesh_i::AddHypothesis() ################## - aName.SetValue("Applied hypotheses") - - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_hypo.png" ) - - # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine - else : - it = myStudy.NewChildIterator(AHR) - while it.More() : - res, Ref = it.Value().ReferencedObject() - if res and Ref is not None and Ref.GetID() == Hypothesis_Entry : - return - it.Next() - # VSR ###################################################################### - - SO = myStudyBuilder.NewObject(AHR) - myStudyBuilder.Addreference (SO,SO_Hypothesis) - -#------------------------------------------------------------ -def SetAlgorithms(Mesh_Or_SubMesh_Entry, Algorithms_Entry): - SO_MorSM = myStudy.FindObjectID( Mesh_Or_SubMesh_Entry ) - SO_Algorithms = myStudy.FindObjectID( Algorithms_Entry ) - if SO_MorSM != None and SO_Algorithms != None : - #Find or Create Applied Algorithms root - res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedAlgorithms) - if AHR is None or res == 0: - AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms) - aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName") - - # The same name as in SMESH_Mesh_i::AddHypothesis() ################## - aName.SetValue("Applied algorithms") - - aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable") - aSelAttr.SetSelectable(0) - aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap") - aPixmap.SetPixMap( "mesh_tree_algo.png" ) - - # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine - else : - it = myStudy.NewChildIterator(AHR) - while it.More() : - res, Ref = it.Value().ReferencedObject() - if res and Ref is not None and Ref.GetID() == Algorithms_Entry : - return - it.Next() - # VSR ###################################################################### - - SO = myStudyBuilder.NewObject(AHR) - myStudyBuilder.Addreference (SO,SO_Algorithms) - - -#------------------------------------------------------------ -def UnSetHypothesis( Applied_Hypothesis_Entry ): - SO_Applied_Hypothesis = myStudy.FindObjectID( Applied_Hypothesis_Entry ) - if SO_Applied_Hypothesis : - myStudyBuilder.RemoveObject(SO_Applied_Hypothesis) - - -#------------------------------------------------------------ -def AddSubMesh ( SO_Mesh_Entry, SM_IOR, ST): - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( SM_IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - - SO_Mesh = myStudy.FindObjectID( SO_Mesh_Entry ) - if ( SO_Mesh ) : - - if ST == ShapeType["COMPSOLID"] : - Tag_Shape = Tag_SubMeshOnSolid - Name = "SubMeshes on Solid" - elif ST == ShapeType["FACE"] : - Tag_Shape = Tag_SubMeshOnFace - Name = "SubMeshes on Face" - elif ST == ShapeType["EDGE"] : - Tag_Shape = Tag_SubMeshOnEdge - Name = "SubMeshes on Edge" - elif ST == ShapeType["VERTEX"] : - Tag_Shape = Tag_SubMeshOnVertex - Name = "SubMeshes on Vertex" - else : - Tag_Shape = Tag_SubMeshOnCompound - Name = "SubMeshes on Compound" - - res, SubmeshesRoot = SO_Mesh.FindSubObject (Tag_Shape) - if SubmeshesRoot is None or res == 0: - SubmeshesRoot = myStudyBuilder.NewObjectToTag (SO_Mesh, Tag_Shape) - aName = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeName") - aName.SetValue(Name) - aSelAttr = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable") - aSelAttr.SetSelectable(0) - - SO = myStudyBuilder.NewObject (SubmeshesRoot) - anIOR = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeIOR") - anIOR.SetValue(SM_IOR) - return SO.GetID() - - return None - -#------------------------------------------------------------ -def AddSubMeshOnShape (Mesh_Entry, GeomShape_Entry, SM_IOR, ST) : - # VSR: added temporarily - objects are published automatically by the engine - aSO = myStudy.FindObjectIOR( SM_IOR ) - if aSO is not None: - return aSO.GetID() - # VSR ###################################################################### - SO_GeomShape = myStudy.FindObjectID( GeomShape_Entry ) - if SO_GeomShape != None : - SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST) - SO_SM = myStudy.FindObjectID( SM_Entry ) - - if SO_SM != None : - SetShape (GeomShape_Entry, SM_Entry) - return SM_Entry - - return None - - -#------------------------------------------------------------ -def SetName(Entry, Name): - SO = myStudy.FindObjectID( Entry ) - if SO != None : - aName = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeName") - aName.SetValue(Name) diff --git a/src/SMESH_SWIG/ex00_all.py b/src/SMESH_SWIG/ex00_all.py deleted file mode 100644 index b1aa726b2..000000000 --- a/src/SMESH_SWIG/ex00_all.py +++ /dev/null @@ -1,25 +0,0 @@ -# CEA/LGLS 2005, Francis KLOSS (OCC) -# ================================== - -# Load all examples -# ----------------- - -import ex01_cube2build -import ex02_cube2primitive -import ex03_cube2partition -import ex04_cube5tetraHexa -import ex05_hole1build -import ex06_hole1boolean -import ex07_hole1partition -import ex08_hole2build -import ex09_grid4build -import ex10_grid4geometry -import ex11_grid3partition -import ex12_grid17partition -import ex13_hole1partial -import ex14_cyl1holed -import ex15_cyl2geometry -import ex16_cyl2complementary -import ex17_dome1 -import ex18_dome2 -import ex19_sphereINcube diff --git a/src/SMESH_SWIG/ex01_cube2build.py b/src/SMESH_SWIG/ex01_cube2build.py deleted file mode 100644 index 02b5b1506..000000000 --- a/src/SMESH_SWIG/ex01_cube2build.py +++ /dev/null @@ -1,293 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# A small cube centered and put on a great cube build by points, edges, faces and solids - -# Points -# ------ - -greatPoint111 = MakeVertex( 0, 0, 0) -greatPoint211 = MakeVertex(10, 0, 0) -greatPoint311 = MakeVertex(20, 0, 0) -greatPoint411 = MakeVertex(30, 0, 0) - -greatPoint121 = MakeVertex( 0, 10, 0) -greatPoint221 = MakeVertex(10, 10, 0) -greatPoint321 = MakeVertex(20, 10, 0) -greatPoint421 = MakeVertex(30, 10, 0) - -greatPoint112 = MakeVertex( 0, 0, 10) -greatPoint212 = MakeVertex(10, 0, 10) -greatPoint312 = MakeVertex(20, 0, 10) -greatPoint412 = MakeVertex(30, 0, 10) - -greatPoint122 = MakeVertex( 0, 10, 10) -greatPoint222 = MakeVertex(10, 10, 10) -greatPoint322 = MakeVertex(20, 10, 10) -greatPoint422 = MakeVertex(30, 10, 10) - -greatPoint113 = MakeVertex( 0, 0, 20) -greatPoint213 = MakeVertex(10, 0, 20) -greatPoint313 = MakeVertex(20, 0, 20) -greatPoint413 = MakeVertex(30, 0, 20) - -greatPoint123 = MakeVertex( 0, 10, 20) -greatPoint223 = MakeVertex(10, 10, 20) -greatPoint323 = MakeVertex(20, 10, 20) -greatPoint423 = MakeVertex(30, 10, 20) - -greatPoint114 = MakeVertex( 0, 0, 30) -greatPoint214 = MakeVertex(10, 0, 30) -greatPoint314 = MakeVertex(20, 0, 30) -greatPoint414 = MakeVertex(30, 0, 30) - -greatPoint124 = MakeVertex( 0, 10, 30) -greatPoint224 = MakeVertex(10, 10, 30) -greatPoint324 = MakeVertex(20, 10, 30) -greatPoint424 = MakeVertex(30, 10, 30) - - -smallPoint111 = greatPoint222 -smallPoint211 = greatPoint322 -smallPoint121 = MakeVertex(10, 20, 10) -smallPoint221 = MakeVertex(20, 20, 10) - -smallPoint112 = greatPoint223 -smallPoint212 = greatPoint323 -smallPoint122 = MakeVertex(10, 20, 20) -smallPoint222 = MakeVertex(20, 20, 20) - -# Edges -# ----- - -smallEdgeX11 = MakeEdge(smallPoint111, smallPoint211) -smallEdgeX21 = MakeEdge(smallPoint121, smallPoint221) -smallEdgeX12 = MakeEdge(smallPoint112, smallPoint212) -smallEdgeX22 = MakeEdge(smallPoint122, smallPoint222) - -smallEdgeY11 = MakeEdge(smallPoint111, smallPoint121) -smallEdgeY21 = MakeEdge(smallPoint211, smallPoint221) -smallEdgeY12 = MakeEdge(smallPoint112, smallPoint122) -smallEdgeY22 = MakeEdge(smallPoint212, smallPoint222) - -smallEdgeZ11 = MakeEdge(smallPoint111, smallPoint112) -smallEdgeZ21 = MakeEdge(smallPoint211, smallPoint212) -smallEdgeZ12 = MakeEdge(smallPoint121, smallPoint122) -smallEdgeZ22 = MakeEdge(smallPoint221, smallPoint222) - - -greatEdgeX111 = MakeEdge(greatPoint111, greatPoint211) -greatEdgeX211 = MakeEdge(greatPoint211, greatPoint311) -greatEdgeX311 = MakeEdge(greatPoint311, greatPoint411) -greatEdgeX121 = MakeEdge(greatPoint121, greatPoint221) -greatEdgeX221 = MakeEdge(greatPoint221, greatPoint321) -greatEdgeX321 = MakeEdge(greatPoint321, greatPoint421) - -greatEdgeX112 = MakeEdge(greatPoint112, greatPoint212) -greatEdgeX212 = MakeEdge(greatPoint212, greatPoint312) -greatEdgeX312 = MakeEdge(greatPoint312, greatPoint412) -greatEdgeX122 = MakeEdge(greatPoint122, greatPoint222) -greatEdgeX222 = smallEdgeX11 -greatEdgeX322 = MakeEdge(greatPoint322, greatPoint422) - -greatEdgeX113 = MakeEdge(greatPoint113, greatPoint213) -greatEdgeX213 = MakeEdge(greatPoint213, greatPoint313) -greatEdgeX313 = MakeEdge(greatPoint313, greatPoint413) -greatEdgeX123 = MakeEdge(greatPoint123, greatPoint223) -greatEdgeX223 = smallEdgeX12 -greatEdgeX323 = MakeEdge(greatPoint323, greatPoint423) - -greatEdgeX114 = MakeEdge(greatPoint114, greatPoint214) -greatEdgeX214 = MakeEdge(greatPoint214, greatPoint314) -greatEdgeX314 = MakeEdge(greatPoint314, greatPoint414) -greatEdgeX124 = MakeEdge(greatPoint124, greatPoint224) -greatEdgeX224 = MakeEdge(greatPoint224, greatPoint324) -greatEdgeX324 = MakeEdge(greatPoint324, greatPoint424) - -greatEdgeY11 = MakeEdge(greatPoint111, greatPoint121) -greatEdgeY21 = MakeEdge(greatPoint211, greatPoint221) -greatEdgeY31 = MakeEdge(greatPoint311, greatPoint321) -greatEdgeY41 = MakeEdge(greatPoint411, greatPoint421) - -greatEdgeY12 = MakeEdge(greatPoint112, greatPoint122) -greatEdgeY22 = MakeEdge(greatPoint212, greatPoint222) -greatEdgeY32 = MakeEdge(greatPoint312, greatPoint322) -greatEdgeY42 = MakeEdge(greatPoint412, greatPoint422) - -greatEdgeY13 = MakeEdge(greatPoint113, greatPoint123) -greatEdgeY23 = MakeEdge(greatPoint213, greatPoint223) -greatEdgeY33 = MakeEdge(greatPoint313, greatPoint323) -greatEdgeY43 = MakeEdge(greatPoint413, greatPoint423) - -greatEdgeY14 = MakeEdge(greatPoint114, greatPoint124) -greatEdgeY24 = MakeEdge(greatPoint214, greatPoint224) -greatEdgeY34 = MakeEdge(greatPoint314, greatPoint324) -greatEdgeY44 = MakeEdge(greatPoint414, greatPoint424) - -greatEdgeZ111 = MakeEdge(greatPoint111, greatPoint112) -greatEdgeZ211 = MakeEdge(greatPoint211, greatPoint212) -greatEdgeZ311 = MakeEdge(greatPoint311, greatPoint312) -greatEdgeZ411 = MakeEdge(greatPoint411, greatPoint412) - -greatEdgeZ121 = MakeEdge(greatPoint121, greatPoint122) -greatEdgeZ221 = MakeEdge(greatPoint221, greatPoint222) -greatEdgeZ321 = MakeEdge(greatPoint321, greatPoint322) -greatEdgeZ421 = MakeEdge(greatPoint421, greatPoint422) - -greatEdgeZ112 = MakeEdge(greatPoint112, greatPoint113) -greatEdgeZ212 = MakeEdge(greatPoint212, greatPoint213) -greatEdgeZ312 = MakeEdge(greatPoint312, greatPoint313) -greatEdgeZ412 = MakeEdge(greatPoint412, greatPoint413) - -greatEdgeZ122 = MakeEdge(greatPoint122, greatPoint123) -greatEdgeZ222 = smallEdgeZ11 -greatEdgeZ322 = smallEdgeZ21 -greatEdgeZ422 = MakeEdge(greatPoint422, greatPoint423) - -greatEdgeZ113 = MakeEdge(greatPoint113, greatPoint114) -greatEdgeZ213 = MakeEdge(greatPoint213, greatPoint214) -greatEdgeZ313 = MakeEdge(greatPoint313, greatPoint314) -greatEdgeZ413 = MakeEdge(greatPoint413, greatPoint414) - -greatEdgeZ123 = MakeEdge(greatPoint123, greatPoint124) -greatEdgeZ223 = MakeEdge(greatPoint223, greatPoint224) -greatEdgeZ323 = MakeEdge(greatPoint323, greatPoint324) -greatEdgeZ423 = MakeEdge(greatPoint423, greatPoint424) - -# Faces -# ----- - -smallFaceX1 = MakeQuad(smallEdgeY11, smallEdgeZ11, smallEdgeY12, smallEdgeZ12) -smallFaceX2 = MakeQuad(smallEdgeY21, smallEdgeZ21, smallEdgeY22, smallEdgeZ22) -smallFaceY1 = MakeQuad(smallEdgeX11, smallEdgeZ11, smallEdgeX12, smallEdgeZ21) -smallFaceY2 = MakeQuad(smallEdgeX21, smallEdgeZ12, smallEdgeX22, smallEdgeZ22) -smallFaceZ1 = MakeQuad(smallEdgeX11, smallEdgeY11, smallEdgeX21, smallEdgeY21) -smallFaceZ2 = MakeQuad(smallEdgeX12, smallEdgeY12, smallEdgeX22, smallEdgeY22) - - -greatFaceX11 = MakeQuad(greatEdgeY11, greatEdgeZ111, greatEdgeY12, greatEdgeZ121) -greatFaceX21 = MakeQuad(greatEdgeY21, greatEdgeZ211, greatEdgeY22, greatEdgeZ221) -greatFaceX31 = MakeQuad(greatEdgeY31, greatEdgeZ311, greatEdgeY32, greatEdgeZ321) -greatFaceX41 = MakeQuad(greatEdgeY41, greatEdgeZ411, greatEdgeY42, greatEdgeZ421) - -greatFaceX12 = MakeQuad(greatEdgeY12, greatEdgeZ112, greatEdgeY13, greatEdgeZ122) -greatFaceX22 = MakeQuad(greatEdgeY22, greatEdgeZ212, greatEdgeY23, greatEdgeZ222) -greatFaceX32 = MakeQuad(greatEdgeY32, greatEdgeZ312, greatEdgeY33, greatEdgeZ322) -greatFaceX42 = MakeQuad(greatEdgeY42, greatEdgeZ412, greatEdgeY43, greatEdgeZ422) - -greatFaceX13 = MakeQuad(greatEdgeY13, greatEdgeZ113, greatEdgeY14, greatEdgeZ123) -greatFaceX23 = MakeQuad(greatEdgeY23, greatEdgeZ213, greatEdgeY24, greatEdgeZ223) -greatFaceX33 = MakeQuad(greatEdgeY33, greatEdgeZ313, greatEdgeY34, greatEdgeZ323) -greatFaceX43 = MakeQuad(greatEdgeY43, greatEdgeZ413, greatEdgeY44, greatEdgeZ423) - -greatFaceY111 = MakeQuad(greatEdgeX111, greatEdgeZ111, greatEdgeX112, greatEdgeZ211) -greatFaceY211 = MakeQuad(greatEdgeX211, greatEdgeZ211, greatEdgeX212, greatEdgeZ311) -greatFaceY311 = MakeQuad(greatEdgeX311, greatEdgeZ311, greatEdgeX312, greatEdgeZ411) -greatFaceY121 = MakeQuad(greatEdgeX121, greatEdgeZ121, greatEdgeX122, greatEdgeZ221) -greatFaceY221 = MakeQuad(greatEdgeX221, greatEdgeZ221, greatEdgeX222, greatEdgeZ321) -greatFaceY321 = MakeQuad(greatEdgeX321, greatEdgeZ321, greatEdgeX322, greatEdgeZ421) - -greatFaceY112 = MakeQuad(greatEdgeX112, greatEdgeZ112, greatEdgeX113, greatEdgeZ212) -greatFaceY212 = MakeQuad(greatEdgeX212, greatEdgeZ212, greatEdgeX213, greatEdgeZ312) -greatFaceY312 = MakeQuad(greatEdgeX312, greatEdgeZ312, greatEdgeX313, greatEdgeZ412) -greatFaceY122 = MakeQuad(greatEdgeX122, greatEdgeZ122, greatEdgeX123, greatEdgeZ222) -greatFaceY222 = smallFaceY1 -greatFaceY322 = MakeQuad(greatEdgeX322, greatEdgeZ322, greatEdgeX323, greatEdgeZ422) - -greatFaceY113 = MakeQuad(greatEdgeX113, greatEdgeZ113, greatEdgeX114, greatEdgeZ213) -greatFaceY213 = MakeQuad(greatEdgeX213, greatEdgeZ213, greatEdgeX214, greatEdgeZ313) -greatFaceY313 = MakeQuad(greatEdgeX313, greatEdgeZ313, greatEdgeX314, greatEdgeZ413) -greatFaceY123 = MakeQuad(greatEdgeX123, greatEdgeZ123, greatEdgeX124, greatEdgeZ223) -greatFaceY223 = MakeQuad(greatEdgeX223, greatEdgeZ223, greatEdgeX224, greatEdgeZ323) -greatFaceY323 = MakeQuad(greatEdgeX323, greatEdgeZ323, greatEdgeX324, greatEdgeZ423) - -greatFaceZ11 = MakeQuad(greatEdgeX111, greatEdgeY11, greatEdgeX121, greatEdgeY21) -greatFaceZ21 = MakeQuad(greatEdgeX211, greatEdgeY21, greatEdgeX221, greatEdgeY31) -greatFaceZ31 = MakeQuad(greatEdgeX311, greatEdgeY31, greatEdgeX321, greatEdgeY41) - -greatFaceZ12 = MakeQuad(greatEdgeX112, greatEdgeY12, greatEdgeX122, greatEdgeY22) -greatFaceZ22 = MakeQuad(greatEdgeX212, greatEdgeY22, greatEdgeX222, greatEdgeY32) -greatFaceZ32 = MakeQuad(greatEdgeX312, greatEdgeY32, greatEdgeX322, greatEdgeY42) - -greatFaceZ13 = MakeQuad(greatEdgeX113, greatEdgeY13, greatEdgeX123, greatEdgeY23) -greatFaceZ23 = MakeQuad(greatEdgeX213, greatEdgeY23, greatEdgeX223, greatEdgeY33) -greatFaceZ33 = MakeQuad(greatEdgeX313, greatEdgeY33, greatEdgeX323, greatEdgeY43) - -greatFaceZ14 = MakeQuad(greatEdgeX114, greatEdgeY14, greatEdgeX124, greatEdgeY24) -greatFaceZ24 = MakeQuad(greatEdgeX214, greatEdgeY24, greatEdgeX224, greatEdgeY34) -greatFaceZ34 = MakeQuad(greatEdgeX314, greatEdgeY34, greatEdgeX324, greatEdgeY44) - -# Solids -# ------ - -smallBlock = MakeHexa(smallFaceX1, smallFaceX2, smallFaceY1, smallFaceY2, smallFaceZ1, smallFaceZ2) - -greatBlock11 = MakeHexa(greatFaceX11, greatFaceX21, greatFaceY111, greatFaceY121, greatFaceZ11, greatFaceZ12) -greatBlock21 = MakeHexa(greatFaceX21, greatFaceX31, greatFaceY211, greatFaceY221, greatFaceZ21, greatFaceZ22) -greatBlock31 = MakeHexa(greatFaceX31, greatFaceX41, greatFaceY311, greatFaceY321, greatFaceZ31, greatFaceZ32) - -greatBlock12 = MakeHexa(greatFaceX12, greatFaceX22, greatFaceY112, greatFaceY122, greatFaceZ12, greatFaceZ13) -greatBlock22 = MakeHexa(greatFaceX22, greatFaceX32, greatFaceY212, greatFaceY222, greatFaceZ22, greatFaceZ23) -greatBlock32 = MakeHexa(greatFaceX32, greatFaceX42, greatFaceY312, greatFaceY322, greatFaceZ32, greatFaceZ33) - -greatBlock13 = MakeHexa(greatFaceX13, greatFaceX23, greatFaceY113, greatFaceY123, greatFaceZ13, greatFaceZ14) -greatBlock23 = MakeHexa(greatFaceX23, greatFaceX33, greatFaceY213, greatFaceY223, greatFaceZ23, greatFaceZ24) -greatBlock33 = MakeHexa(greatFaceX33, greatFaceX43, greatFaceY313, greatFaceY323, greatFaceZ33, greatFaceZ34) - -# Compound -# -------- - -c_l = [] -c_l.append(smallBlock) -c_l.append(greatBlock11) -c_l.append(greatBlock21) -c_l.append(greatBlock31) -c_l.append(greatBlock12) -c_l.append(greatBlock22) -c_l.append(greatBlock32) -c_l.append(greatBlock13) -c_l.append(greatBlock23) -c_l.append(greatBlock33) - -piece = MakeCompound(c_l) - -# Add in study -# ------------ - -piece_id = addToStudy(piece, "ex01_cube2build") - -# Meshing -# ======= - -# Create hexahedrical mesh on piece -# --------------------------------- - -hexa = smesh.Mesh(piece, "ex01_cube2build:hexa") - -algo = hexa.Segment() -algo.NumberOfSegments(4) - -hexa.Quadrangle() - -hexa.Hexahedron() - -# Create local hypothesis -# ----------------------- - -algo = hexa.Segment(greatEdgeX111) - -algo.Arithmetic1D(1, 4) - -algo.Propagation() - -# Compute the mesh -# ---------------- - -hexa.Compute() diff --git a/src/SMESH_SWIG/ex02_cube2primitive.py b/src/SMESH_SWIG/ex02_cube2primitive.py deleted file mode 100644 index 747507211..000000000 --- a/src/SMESH_SWIG/ex02_cube2primitive.py +++ /dev/null @@ -1,95 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# A small cube centered and put on a great cube build by primitive geometric functionalities - -# Values -# ------ - -ox = 0 -oy = 0 -oz = 0 - -arete = 10 - -# Points -# ------ - -blockPoint111 = MakeVertex(ox , oy, oz) -blockPoint211 = MakeVertex(ox+arete, oy, oz) -blockPoint112 = MakeVertex(ox , oy, oz+arete) -blockPoint212 = MakeVertex(ox+arete, oy, oz+arete) - -# Face and solid -# -------------- - -blockFace1 = MakeQuad4Vertices(blockPoint111, blockPoint211, blockPoint212, blockPoint112) - -blockSolid11 = MakePrismVecH(blockFace1, MakeVectorDXDYDZ(0, 1, 0), arete) - -# Translations -# ------------ - -blockSolid21 = MakeTranslation(blockSolid11, arete, 0, 0) -blockSolid31 = MakeTranslation(blockSolid21, arete, 0, 0) - -blockSolid12 = MakeTranslation(blockSolid11, 0, 0, arete) -blockSolid22 = MakeTranslation(blockSolid12, arete, 0, 0) -blockSolid32 = MakeTranslation(blockSolid22, arete, 0, 0) - -blockSolid13 = MakeTranslation(blockSolid12, 0, 0, arete) -blockSolid23 = MakeTranslation(blockSolid13, arete, 0, 0) -blockSolid33 = MakeTranslation(blockSolid23, arete, 0, 0) - -blockSolid111 = MakeTranslation(blockSolid22, 0, arete, 0) - -# Compound and glue -# ----------------- - -c_l = [] -c_l.append(blockSolid11) -c_l.append(blockSolid21) -c_l.append(blockSolid31) -c_l.append(blockSolid12) -c_l.append(blockSolid22) -c_l.append(blockSolid32) -c_l.append(blockSolid13) -c_l.append(blockSolid23) -c_l.append(blockSolid33) -c_l.append(blockSolid111) - -c_cpd = MakeCompound(c_l) - -piece = MakeGlueFaces(c_cpd, 1.e-5) - -# Add in study -# ------------ - -piece_id = addToStudy(piece, "ex02_cube2primitive") - -# Meshing -# ======= - -# Create hexahedrical mesh on piece -# --------------------------------- - -hexa = smesh.Mesh(piece, "ex02_cube2primitive:hexa") - -algo = hexa.Segment() -algo.LocalLength(1) - -hexa.Quadrangle() - -hexa.Hexahedron() - -# Compute the mesh -# ---------------- - -hexa.Compute() diff --git a/src/SMESH_SWIG/ex03_cube2partition.py b/src/SMESH_SWIG/ex03_cube2partition.py deleted file mode 100644 index cc566893c..000000000 --- a/src/SMESH_SWIG/ex03_cube2partition.py +++ /dev/null @@ -1,82 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# A small cube centered and put on a great cube build with partition - -# Values -# ------ - -g_ox = 0 -g_oy = 0 -g_oz = 0 - -g_arete = 10 - -g_trim = 1000 - -# Points -# ------ - -v_arete2 = g_arete*2 -v_arete3 = g_arete*3 - -v_1 = MakeVertex(g_ox , g_oy , g_oz ) -v_2 = MakeVertex(g_ox+v_arete3, g_oy+g_arete , g_oz+v_arete3) - -v_3 = MakeVertex(g_ox+g_arete , g_oy+g_arete , g_oz+g_arete ) -v_4 = MakeVertex(g_ox+v_arete2, g_oy+v_arete2, g_oz+v_arete2) - -# Solids -# ------ - -s_base = MakeBoxTwoPnt(v_1, v_2) -s_haut = MakeBoxTwoPnt(v_3, v_4) - -# Partition -# --------- - -p_dir1 = MakeVectorDXDYDZ(1, 0, 0) -p_dir2 = MakeVectorDXDYDZ(0, 0, 1) -p_dir3 = MakeVectorDXDYDZ(0, 1, 0) - -p_tools = [] - -p_tools.append(MakePlane(v_3, p_dir1, g_trim)) -p_tools.append(MakePlane(v_4, p_dir1, g_trim)) -p_tools.append(MakePlane(v_3, p_dir2, g_trim)) -p_tools.append(MakePlane(v_4, p_dir2, g_trim)) -p_tools.append(MakePlane(v_3, p_dir3, g_trim)) - -piece = MakePartition([s_base, s_haut], p_tools, [], [], ShapeType["SOLID"]) - -# Study -# ----- - -piece_id = addToStudy(piece, "ex03_cube2partition") - -# Meshing -# ======= - -# Create hexahedrical mesh on piece -# --------------------------------- - -hexa = smesh.Mesh(piece, "ex03_cube2partition:hexa") - -algo = hexa.Segment() -algo.NumberOfSegments(5) - -hexa.Quadrangle() - -hexa.Hexahedron() - -# Compute the mesh -# ---------------- - -hexa.Compute() diff --git a/src/SMESH_SWIG/ex04_cube5tetraHexa.py b/src/SMESH_SWIG/ex04_cube5tetraHexa.py deleted file mode 100644 index 5bb4a1c89..000000000 --- a/src/SMESH_SWIG/ex04_cube5tetraHexa.py +++ /dev/null @@ -1,87 +0,0 @@ -# CEA/LGLS 2004-2005, Francis KLOSS (OCC) -# ======================================= - -from geompy import * - -import smesh - -# Geometry -# ======== - -# 5 box with a hexahedral mesh and with 2 box in tetrahedral mesh - -# Values -# ------ - -arete = 100 - -arete0 = 0 -arete1 = arete -arete2 = arete*2 -arete3 = arete*3 - -# Solids -# ------ - -box_tetra1 = MakeBox(arete0, arete0, 0, arete1, arete1, arete) - -box_ijk1 = MakeBox(arete1, arete0, 0, arete2, arete1, arete) - -box_hexa = MakeBox(arete1, arete1, 0, arete2, arete2, arete) - -box_ijk2 = MakeBox(arete2, arete1, 0, arete3, arete2, arete) - -box_tetra2 = MakeBox(arete2, arete2, 0, arete3 ,arete3, arete) - -# Piece -# ----- - -piece_cpd = MakeCompound([box_tetra1, box_ijk1, box_hexa, box_ijk2, box_tetra2]) - -piece = MakeGlueFaces(piece_cpd, 1e-4) - -piece_id = addToStudy(piece, "ex04_cube5tetraHexa") - -# Meshing -# ======= - -# Create a hexahedral mesh -# ------------------------ - -mixed = smesh.Mesh(piece, "ex04_cube5tetraHexa:mixed") - -algo = mixed.Segment() - -algo.StartEndLength(3, 25) - -mixed.Quadrangle() - -mixed.Hexahedron() - -# Tetrahedral local mesh -# ---------------------- - -def localMesh(b, hyp): - box = GetInPlace(piece, b) - faces = SubShapeAll(box, ShapeType["FACE"]) - - i = 0 - n = len(faces) - while i> _begLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - isOK = (load >> _endLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_Arithmetic1D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_Arithmetic1D & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_Arithmetic1D.hxx b/src/StdMeshers/StdMeshers_Arithmetic1D.hxx deleted file mode 100644 index ca49df175..000000000 --- a/src/StdMeshers/StdMeshers_Arithmetic1D.hxx +++ /dev/null @@ -1,55 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Arithmetic1D.hxx -// Author : Damien COQUERET, OCC -// Module : SMESH -// $Header$ - -#ifndef _SMESH_ARITHMETIC1D_HXX_ -#define _SMESH_ARITHMETIC1D_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_Arithmetic1D: - public SMESH_Hypothesis -{ -public: - StdMeshers_Arithmetic1D(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_Arithmetic1D(); - - void SetLength(double length, bool isStartLength) throw(SALOME_Exception); - - double GetLength(bool isStartLength) const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream& operator << (ostream & save, StdMeshers_Arithmetic1D & hyp); - friend istream& operator >> (istream & load, StdMeshers_Arithmetic1D & hyp); - -protected: - double _begLength, _endLength; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Deflection1D.cxx b/src/StdMeshers/StdMeshers_Deflection1D.cxx deleted file mode 100644 index f6e54691c..000000000 --- a/src/StdMeshers/StdMeshers_Deflection1D.cxx +++ /dev/null @@ -1,136 +0,0 @@ -// SMESH StdMeshers_Deflection1D : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Deflection1D.cxx -// Module : SMESH -// $Header$ - -using namespace std; - -#include "StdMeshers_Deflection1D.hxx" -#include "utilities.h" - - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Deflection1D::StdMeshers_Deflection1D(int hypId, - int studyId, - SMESH_Gen * gen) - :SMESH_Hypothesis(hypId, studyId, gen) -{ - _value = 1.; - _name = "Deflection1D"; - _param_algo_dim = 1; // is used by SMESH_Regular_1D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Deflection1D::~StdMeshers_Deflection1D() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_Deflection1D::SetDeflection(double value) - throw(SALOME_Exception) -{ - if (_value != value) { - if (value <= 0.) - throw SALOME_Exception(LOCALIZED("Value must be positive")); - - NotifySubMeshesHypothesisModification(); - - _value = value; - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_Deflection1D::GetDeflection() const -{ - return _value; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_Deflection1D::SaveTo(ostream & save) -{ - save << _value; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_Deflection1D::LoadFrom(istream & load) -{ - bool isOK = (load >> _value); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_Deflection1D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_Deflection1D & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_Deflection1D.hxx b/src/StdMeshers/StdMeshers_Deflection1D.hxx deleted file mode 100644 index 1ed43cb7d..000000000 --- a/src/StdMeshers/StdMeshers_Deflection1D.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Deflection1D.hxx -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_Deflection1D_HXX_ -#define _StdMeshers_Deflection1D_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_Deflection1D:public SMESH_Hypothesis -{ - public: - StdMeshers_Deflection1D(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_Deflection1D(); - - void SetDeflection(double value) throw(SALOME_Exception); - - double GetDeflection() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_Deflection1D & hyp); - friend istream & operator >>(istream & load, StdMeshers_Deflection1D & hyp); - - protected: - double _value; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.cxx b/src/StdMeshers/StdMeshers_Hexa_3D.cxx deleted file mode 100644 index a3ed4f11a..000000000 --- a/src/StdMeshers/StdMeshers_Hexa_3D.cxx +++ /dev/null @@ -1,1068 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Hexa_3D.cxx -// Moved here from SMESH_Hexa_3D.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Hexa_3D.hxx" -#include "StdMeshers_Quadrangle_2D.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" - -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_FacePosition.hxx" -#include "SMDS_VolumeTool.hxx" -#include "SMDS_VolumeOfNodes.hxx" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "utilities.h" -#include "Utils_ExceptHandlers.hxx" - -//modified by NIZNHY-PKV Wed Nov 17 15:31:58 2004 f -#include "StdMeshers_Penta_3D.hxx" - -static bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); -//modified by NIZNHY-PKV Wed Nov 17 15:32:00 2004 t - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, int studyId, - SMESH_Gen * gen):SMESH_3D_Algo(hypId, studyId, gen) -{ - MESSAGE("StdMeshers_Hexa_3D::StdMeshers_Hexa_3D"); - _name = "Hexa_3D"; -// _shapeType = TopAbs_SOLID; - _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type -// MESSAGE("_shapeType octal " << oct << _shapeType); - for (int i = 0; i < 6; i++) - _quads[i] = 0; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D() -{ - MESSAGE("StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D"); - for (int i = 0; i < 6; i++) - StdMeshers_Quadrangle_2D::QuadDelete(_quads[i]); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_Hexa_3D::CheckHypothesis - (SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus) -{ - //MESSAGE("StdMeshers_Hexa_3D::CheckHypothesis"); - - bool isOk = true; - aStatus = SMESH_Hypothesis::HYP_OK; - - // nothing to check - - return isOk; -} - -//======================================================================= -//function : findIJ -//purpose : return i,j of the node -//======================================================================= - -static bool findIJ (const SMDS_MeshNode* node, const FaceQuadStruct * quad, int& I, int& J) -{ - I = J = 0; - const SMDS_FacePosition* fpos = - static_cast(node->GetPosition().get()); - if ( ! fpos ) return false; - gp_Pnt2d uv( fpos->GetUParameter(), fpos->GetVParameter() ); - - double minDist = DBL_MAX; - int nbhoriz = Min(quad->nbPts[0], quad->nbPts[2]); - int nbvertic = Min(quad->nbPts[1], quad->nbPts[3]); - for (int i = 1; i < nbhoriz - 1; i++) { - for (int j = 1; j < nbvertic - 1; j++) { - int ij = j * nbhoriz + i; - gp_Pnt2d uv2( quad->uv_grid[ij].u, quad->uv_grid[ij].v ); - double dist = uv.SquareDistance( uv2 ); - if ( dist < minDist ) { - minDist = dist; - I = i; - J = j; - } - } - } - return true; -} - -//============================================================================= -/*! - * Hexahedron mesh on hexaedron like form - * -0. - shape and face mesh verification - * -1. - identify faces and vertices of the "cube" - * -2. - Algorithm from: - * "Application de l'interpolation transfinie à la création de maillages - * C0 ou G1 continus sur des triangles, quadrangles, tetraedres, pentaedres - * et hexaedres déformés." - * Alain PERONNET - 8 janvier 1999 - */ -//============================================================================= - -bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape)throw(SALOME_Exception) -{ - Unexpect aCatch(SalomeException); - MESSAGE("StdMeshers_Hexa_3D::Compute"); - //bool isOk = false; - SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - //SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape); - //const SMESHDS_SubMesh *& subMeshDS = theSubMesh->GetSubMeshDS(); - - // 0. - shape and face mesh verification - // 0.1 - shape must be a solid (or a shell) with 6 faces - //MESSAGE("---"); - - vector < SMESH_subMesh * >meshFaces; - for (TopExp_Explorer exp(aShape, TopAbs_FACE); exp.More(); exp.Next()) - { - SMESH_subMesh *aSubMesh = aMesh.GetSubMeshContaining(exp.Current()); - ASSERT(aSubMesh); - meshFaces.push_back(aSubMesh); - } - if (meshFaces.size() != 6) - { - SCRUTE(meshFaces.size()); -// ASSERT(0); - return false; - } - - // 0.2 - is each face meshed with Quadrangle_2D? (so, with a wire of 4 edges) - //MESSAGE("---"); - - for (int i = 0; i < 6; i++) - { - TopoDS_Shape aFace = meshFaces[i]->GetSubShape(); - SMESH_Algo *algo = _gen->GetAlgo(aMesh, aFace); - string algoName = algo->GetName(); - bool isAllQuad = false; - if (algoName == "Quadrangle_2D") { - SMESHDS_SubMesh * sm = meshDS->MeshElements( aFace ); - if ( sm ) { - isAllQuad = true; - SMDS_ElemIteratorPtr eIt = sm->GetElements(); - while ( isAllQuad && eIt->more() ) - isAllQuad = ( eIt->next()->NbNodes() == 4 ); - } - } - if ( ! isAllQuad ) { - //modified by NIZNHY-PKV Wed Nov 17 15:31:37 2004 f - bool bIsOk; - // - bIsOk=ComputePentahedralMesh(aMesh, aShape); - if (bIsOk) { - return true; - } - //modified by NIZNHY-PKV Wed Nov 17 15:31:42 2004 t - SCRUTE(algoName); - // ASSERT(0); - return false; - } - StdMeshers_Quadrangle_2D *quadAlgo = - dynamic_cast < StdMeshers_Quadrangle_2D * >(algo); - ASSERT(quadAlgo); - try - { - _quads[i] = quadAlgo->CheckAnd2Dcompute(aMesh, aFace); - // *** to delete after usage - } - catch(SALOME_Exception & S_ex) - { - // *** delete _quads - // *** throw exception - // ASSERT(0); - return false; - } - - // 0.2.1 - number of points on the opposite edges must be the same - if (_quads[i]->nbPts[0] != _quads[i]->nbPts[2] || - _quads[i]->nbPts[1] != _quads[i]->nbPts[3]) - { - MESSAGE("different number of points on the opposite edges of face " << i); - // ASSERT(0); - return false; - } - } - - // 1. - identify faces and vertices of the "cube" - // 1.1 - ancestor maps vertex->edges in the cube - //MESSAGE("---"); - - TopTools_IndexedDataMapOfShapeListOfShape MS; - TopExp::MapShapesAndAncestors(aShape, TopAbs_VERTEX, TopAbs_EDGE, MS); - - // 1.2 - first face is choosen as face Y=0 of the unit cube - //MESSAGE("---"); - - const TopoDS_Shape & aFace = meshFaces[0]->GetSubShape(); - const TopoDS_Face & F = TopoDS::Face(aFace); - - // 1.3 - identify the 4 vertices of the face Y=0: V000, V100, V101, V001 - //MESSAGE("---"); - - int i = 0; - TopoDS_Edge E = _quads[0]->edge[i]; //edge will be Y=0,Z=0 on unit cube - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopoDS_Vertex VFirst, VLast; - TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l - bool isForward = - (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0); - - if (isForward) - { - _cube.V000 = VFirst; // will be (0,0,0) on the unit cube - _cube.V100 = VLast; // will be (1,0,0) on the unit cube - } - else - { - _cube.V000 = VLast; - _cube.V100 = VFirst; - } - - i = 1; - E = _quads[0]->edge[i]; - C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopExp::Vertices(E, VFirst, VLast); - isForward = (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0); - if (isForward) - _cube.V101 = VLast; // will be (1,0,1) on the unit cube - else - _cube.V101 = VFirst; - - i = 2; - E = _quads[0]->edge[i]; - C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopExp::Vertices(E, VFirst, VLast); - isForward = (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0); - if (isForward) - _cube.V001 = VLast; // will be (0,0,1) on the unit cube - else - _cube.V001 = VFirst; - - // 1.4 - find edge X=0, Z=0 (ancestor of V000 not in face Y=0) - // - find edge X=1, Z=0 (ancestor of V100 not in face Y=0) - // - find edge X=1, Z=1 (ancestor of V101 not in face Y=0) - // - find edge X=0, Z=1 (ancestor of V001 not in face Y=0) - //MESSAGE("---"); - - TopoDS_Edge E_0Y0 = EdgeNotInFace(aMesh, aShape, F, _cube.V000, MS); - ASSERT(!E_0Y0.IsNull()); - - TopoDS_Edge E_1Y0 = EdgeNotInFace(aMesh, aShape, F, _cube.V100, MS); - ASSERT(!E_1Y0.IsNull()); - - TopoDS_Edge E_1Y1 = EdgeNotInFace(aMesh, aShape, F, _cube.V101, MS); - ASSERT(!E_1Y1.IsNull()); - - TopoDS_Edge E_0Y1 = EdgeNotInFace(aMesh, aShape, F, _cube.V001, MS); - ASSERT(!E_0Y1.IsNull()); - - // 1.5 - identify the 4 vertices in face Y=1: V010, V110, V111, V011 - //MESSAGE("---"); - - TopExp::Vertices(E_0Y0, VFirst, VLast); - if (VFirst.IsSame(_cube.V000)) - _cube.V010 = VLast; - else - _cube.V010 = VFirst; - - TopExp::Vertices(E_1Y0, VFirst, VLast); - if (VFirst.IsSame(_cube.V100)) - _cube.V110 = VLast; - else - _cube.V110 = VFirst; - - TopExp::Vertices(E_1Y1, VFirst, VLast); - if (VFirst.IsSame(_cube.V101)) - _cube.V111 = VLast; - else - _cube.V111 = VFirst; - - TopExp::Vertices(E_0Y1, VFirst, VLast); - if (VFirst.IsSame(_cube.V001)) - _cube.V011 = VLast; - else - _cube.V011 = VFirst; - - // 1.6 - find remaining faces given 4 vertices - //MESSAGE("---"); - - _indY0 = 0; - _cube.quad_Y0 = _quads[_indY0]; - - _indY1 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V010, _cube.V011, _cube.V110, _cube.V111); - _cube.quad_Y1 = _quads[_indY1]; - - _indZ0 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V000, _cube.V010, _cube.V100, _cube.V110); - _cube.quad_Z0 = _quads[_indZ0]; - - _indZ1 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V001, _cube.V011, _cube.V101, _cube.V111); - _cube.quad_Z1 = _quads[_indZ1]; - - _indX0 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V000, _cube.V001, _cube.V010, _cube.V011); - _cube.quad_X0 = _quads[_indX0]; - - _indX1 = GetFaceIndex(aMesh, aShape, meshFaces, - _cube.V100, _cube.V101, _cube.V110, _cube.V111); - _cube.quad_X1 = _quads[_indX1]; - - //MESSAGE("---"); - - // 1.7 - get convertion coefs from face 2D normalized to 3D normalized - - Conv2DStruct cx0; // for face X=0 - Conv2DStruct cx1; // for face X=1 - Conv2DStruct cy0; - Conv2DStruct cy1; - Conv2DStruct cz0; - Conv2DStruct cz1; - - GetConv2DCoefs(*_cube.quad_X0, meshFaces[_indX0]->GetSubShape(), - _cube.V000, _cube.V010, _cube.V011, _cube.V001, cx0); - GetConv2DCoefs(*_cube.quad_X1, meshFaces[_indX1]->GetSubShape(), - _cube.V100, _cube.V110, _cube.V111, _cube.V101, cx1); - GetConv2DCoefs(*_cube.quad_Y0, meshFaces[_indY0]->GetSubShape(), - _cube.V000, _cube.V100, _cube.V101, _cube.V001, cy0); - GetConv2DCoefs(*_cube.quad_Y1, meshFaces[_indY1]->GetSubShape(), - _cube.V010, _cube.V110, _cube.V111, _cube.V011, cy1); - GetConv2DCoefs(*_cube.quad_Z0, meshFaces[_indZ0]->GetSubShape(), - _cube.V000, _cube.V100, _cube.V110, _cube.V010, cz0); - GetConv2DCoefs(*_cube.quad_Z1, meshFaces[_indZ1]->GetSubShape(), - _cube.V001, _cube.V101, _cube.V111, _cube.V011, cz1); - - // 1.8 - create a 3D structure for normalized values - - //MESSAGE("---"); - int nbx = _cube.quad_Z0->nbPts[0]; - if (cz0.a1 == 0.) nbx = _cube.quad_Z0->nbPts[1]; - - int nby = _cube.quad_X0->nbPts[0]; - if (cx0.a1 == 0.) nby = _cube.quad_X0->nbPts[1]; - - int nbz = _cube.quad_Y0->nbPts[0]; - if (cy0.a1 != 0.) nbz = _cube.quad_Y0->nbPts[1]; - - int i1, j1, nbxyz = nbx * nby * nbz; - Point3DStruct *np = new Point3DStruct[nbxyz]; - - // 1.9 - store node indexes of faces - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indX0]->GetSubShape()); - - faceQuadStruct *quad = _cube.quad_X0; - int i = 0; // j = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int j = cx0.ia * i1 + cx0.ib * j1 + cx0.ic; // j = x/face - int k = cx0.ja * i1 + cx0.jb * j1 + cx0.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indX1]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_X1; - int i = nbx - 1; // j = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int j = cx1.ia * i1 + cx1.ib * j1 + cx1.ic; // j = x/face - int k = cx1.ja * i1 + cx1.jb * j1 + cx1.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indY0]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Y0; - int j = 0; // i = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cy0.ia * i1 + cy0.ib * j1 + cy0.ic; // i = x/face - int k = cy0.ja * i1 + cy0.jb * j1 + cy0.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indY1]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Y1; - int j = nby - 1; // i = x/face , k = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cy1.ia * i1 + cy1.ib * j1 + cy1.ic; // i = x/face - int k = cy1.ja * i1 + cy1.jb * j1 + cy1.jc; // k = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indZ0]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Z0; - int k = 0; // i = x/face , j = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cz0.ia * i1 + cz0.ib * j1 + cz0.ic; // i = x/face - int j = cz0.ja * i1 + cz0.jb * j1 + cz0.jc; // j = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - { - const TopoDS_Face & F = TopoDS::Face(meshFaces[_indZ1]->GetSubShape()); - - SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - - faceQuadStruct *quad = _cube.quad_Z1; - int k = nbz - 1; // i = x/face , j = y/face - int nbdown = quad->nbPts[0]; - int nbright = quad->nbPts[1]; - - while(itf->more()) - { - const SMDS_MeshNode * node = itf->next(); - findIJ( node, quad, i1, j1 ); - int ij1 = j1 * nbdown + i1; - quad->uv_grid[ij1].node = node; - } - - for (int i1 = 0; i1 < nbdown; i1++) - for (int j1 = 0; j1 < nbright; j1++) - { - int ij1 = j1 * nbdown + i1; - int i = cz1.ia * i1 + cz1.ib * j1 + cz1.ic; // i = x/face - int j = cz1.ja * i1 + cz1.jb * j1 + cz1.jc; // j = y/face - int ijk = k * nbx * nby + j * nbx + i; - //MESSAGE(" "<uv_grid[ij1].node; - //SCRUTE(np[ijk].nodeId); - } - } - - // 2.0 - for each node of the cube: - // - get the 8 points 3D = 8 vertices of the cube - // - get the 12 points 3D on the 12 edges of the cube - // - get the 6 points 3D on the 6 faces with their ID - // - compute the point 3D - // - store the point 3D in SMESHDS, store its ID in 3D structure - - int shapeID = meshDS->ShapeToIndex( aShape ); - - Pt3 p000, p001, p010, p011, p100, p101, p110, p111; - Pt3 px00, px01, px10, px11; - Pt3 p0y0, p0y1, p1y0, p1y1; - Pt3 p00z, p01z, p10z, p11z; - Pt3 pxy0, pxy1, px0z, px1z, p0yz, p1yz; - - GetPoint(p000, 0, 0, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p001, 0, 0, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p010, 0, nby - 1, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p011, 0, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p100, nbx - 1, 0, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p101, nbx - 1, 0, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p110, nbx - 1, nby - 1, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p111, nbx - 1, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS); - - for (int i = 1; i < nbx - 1; i++) - { - for (int j = 1; j < nby - 1; j++) - { - for (int k = 1; k < nbz - 1; k++) - { - // *** seulement maillage regulier - // 12 points on edges - GetPoint(px00, i, 0, 0, nbx, nby, nbz, np, meshDS); - GetPoint(px01, i, 0, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(px10, i, nby - 1, 0, nbx, nby, nbz, np, meshDS); - GetPoint(px11, i, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS); - - GetPoint(p0y0, 0, j, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p0y1, 0, j, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(p1y0, nbx - 1, j, 0, nbx, nby, nbz, np, meshDS); - GetPoint(p1y1, nbx - 1, j, nbz - 1, nbx, nby, nbz, np, meshDS); - - GetPoint(p00z, 0, 0, k, nbx, nby, nbz, np, meshDS); - GetPoint(p01z, 0, nby - 1, k, nbx, nby, nbz, np, meshDS); - GetPoint(p10z, nbx - 1, 0, k, nbx, nby, nbz, np, meshDS); - GetPoint(p11z, nbx - 1, nby - 1, k, nbx, nby, nbz, np, meshDS); - - // 12 points on faces - GetPoint(pxy0, i, j, 0, nbx, nby, nbz, np, meshDS); - GetPoint(pxy1, i, j, nbz - 1, nbx, nby, nbz, np, meshDS); - GetPoint(px0z, i, 0, k, nbx, nby, nbz, np, meshDS); - GetPoint(px1z, i, nby - 1, k, nbx, nby, nbz, np, meshDS); - GetPoint(p0yz, 0, j, k, nbx, nby, nbz, np, meshDS); - GetPoint(p1yz, nbx - 1, j, k, nbx, nby, nbz, np, meshDS); - - int ijk = k * nbx * nby + j * nbx + i; - double x = double (i) / double (nbx - 1); // *** seulement - double y = double (j) / double (nby - 1); // *** maillage - double z = double (k) / double (nbz - 1); // *** regulier - - Pt3 X; - for (int i = 0; i < 3; i++) - { - X[i] = - (1 - x) * p0yz[i] + x * p1yz[i] - + (1 - y) * px0z[i] + y * px1z[i] - + (1 - z) * pxy0[i] + z * pxy1[i] - - (1 - x) * ((1 - y) * p00z[i] + y * p01z[i]) - - x * ((1 - y) * p10z[i] + y * p11z[i]) - - (1 - y) * ((1 - z) * px00[i] + z * px01[i]) - - y * ((1 - z) * px10[i] + z * px11[i]) - - (1 - z) * ((1 - x) * p0y0[i] + x * p1y0[i]) - - z * ((1 - x) * p0y1[i] + x * p1y1[i]) - + (1 - x) * ((1 - y) * ((1 - z) * p000[i] + z * p001[i]) - + y * ((1 - z) * p010[i] + z * p011[i])) - + x * ((1 - y) * ((1 - z) * p100[i] + z * p101[i]) - + y * ((1 - z) * p110[i] + z * p111[i])); - } - - SMDS_MeshNode * node = meshDS->AddNode(X[0], X[1], X[2]); - np[ijk].node = node; - meshDS->SetNodeInVolume(node, shapeID); - } - } - } - - // find orientation of furute volumes according to MED convention - vector< bool > forward( nbx * nby ); - SMDS_VolumeTool vTool; - for (int i = 0; i < nbx - 1; i++) - for (int j = 0; j < nby - 1; j++) - { - int n1 = j * nbx + i; - int n2 = j * nbx + i + 1; - int n3 = (j + 1) * nbx + i + 1; - int n4 = (j + 1) * nbx + i; - int n5 = nbx * nby + j * nbx + i; - int n6 = nbx * nby + j * nbx + i + 1; - int n7 = nbx * nby + (j + 1) * nbx + i + 1; - int n8 = nbx * nby + (j + 1) * nbx + i; - - SMDS_VolumeOfNodes tmpVol (np[n1].node,np[n2].node,np[n3].node,np[n4].node, - np[n5].node,np[n6].node,np[n7].node,np[n8].node); - vTool.Set( &tmpVol ); - forward[ n1 ] = vTool.IsForward(); - } - - //2.1 - for each node of the cube (less 3 *1 Faces): - // - store hexahedron in SMESHDS - MESSAGE("Storing hexahedron into the DS"); - for (int i = 0; i < nbx - 1; i++) - for (int j = 0; j < nby - 1; j++) - { - bool isForw = forward.at( j * nbx + i ); - for (int k = 0; k < nbz - 1; k++) - { - int n1 = k * nbx * nby + j * nbx + i; - int n2 = k * nbx * nby + j * nbx + i + 1; - int n3 = k * nbx * nby + (j + 1) * nbx + i + 1; - int n4 = k * nbx * nby + (j + 1) * nbx + i; - int n5 = (k + 1) * nbx * nby + j * nbx + i; - int n6 = (k + 1) * nbx * nby + j * nbx + i + 1; - int n7 = (k + 1) * nbx * nby + (j + 1) * nbx + i + 1; - int n8 = (k + 1) * nbx * nby + (j + 1) * nbx + i; - - SMDS_MeshVolume * elt; - if ( isForw ) - elt = meshDS->AddVolume(np[n1].node, - np[n2].node, - np[n3].node, - np[n4].node, - np[n5].node, - np[n6].node, - np[n7].node, - np[n8].node); - else - elt = meshDS->AddVolume(np[n1].node, - np[n4].node, - np[n3].node, - np[n2].node, - np[n5].node, - np[n8].node, - np[n7].node, - np[n6].node); - - meshDS->SetMeshElementOnShape(elt, shapeID); - } - } - if ( np ) delete [] np; - //MESSAGE("End of StdMeshers_Hexa_3D::Compute()"); - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_Hexa_3D::GetPoint(Pt3 p, int i, int j, int k, int nbx, int nby, - int nbz, Point3DStruct * np, const SMESHDS_Mesh * meshDS) -{ - int ijk = k * nbx * nby + j * nbx + i; - const SMDS_MeshNode * node = np[ijk].node; - p[0] = node->X(); - p[1] = node->Y(); - p[2] = node->Z(); - //MESSAGE(" "<&meshFaces, - const TopoDS_Vertex & V0, - const TopoDS_Vertex & V1, - const TopoDS_Vertex & V2, const TopoDS_Vertex & V3) -{ - //MESSAGE("StdMeshers_Hexa_3D::GetFaceIndex"); - int faceIndex = -1; - for (int i = 1; i < 6; i++) - { - const TopoDS_Shape & aFace = meshFaces[i]->GetSubShape(); - //const TopoDS_Face& F = TopoDS::Face(aFace); - TopTools_IndexedMapOfShape M; - TopExp::MapShapes(aFace, TopAbs_VERTEX, M); - bool verticesInShape = false; - if (M.Contains(V0)) - if (M.Contains(V1)) - if (M.Contains(V2)) - if (M.Contains(V3)) - verticesInShape = true; - if (verticesInShape) - { - faceIndex = i; - break; - } - } - ASSERT(faceIndex > 0); - //SCRUTE(faceIndex); - return faceIndex; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -TopoDS_Edge - StdMeshers_Hexa_3D::EdgeNotInFace(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - const TopoDS_Face & aFace, - const TopoDS_Vertex & aVertex, - const TopTools_IndexedDataMapOfShapeListOfShape & MS) -{ - //MESSAGE("StdMeshers_Hexa_3D::EdgeNotInFace"); - TopTools_IndexedDataMapOfShapeListOfShape MF; - TopExp::MapShapesAndAncestors(aFace, TopAbs_VERTEX, TopAbs_EDGE, MF); - const TopTools_ListOfShape & ancestorsInSolid = MS.FindFromKey(aVertex); - const TopTools_ListOfShape & ancestorsInFace = MF.FindFromKey(aVertex); -// SCRUTE(ancestorsInSolid.Extent()); -// SCRUTE(ancestorsInFace.Extent()); - ASSERT(ancestorsInSolid.Extent() == 6); // 6 (edges doublees) - ASSERT(ancestorsInFace.Extent() == 2); - - TopoDS_Edge E; - E.Nullify(); - TopTools_ListIteratorOfListOfShape its(ancestorsInSolid); - for (; its.More(); its.Next()) - { - TopoDS_Shape ancestor = its.Value(); - TopTools_ListIteratorOfListOfShape itf(ancestorsInFace); - bool isInFace = false; - for (; itf.More(); itf.Next()) - { - TopoDS_Shape ancestorInFace = itf.Value(); - if (ancestorInFace.IsSame(ancestor)) - { - isInFace = true; - break; - } - } - if (!isInFace) - { - E = TopoDS::Edge(ancestor); - break; - } - } - return E; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_Hexa_3D::GetConv2DCoefs(const faceQuadStruct & quad, - const TopoDS_Shape & aShape, - const TopoDS_Vertex & V0, - const TopoDS_Vertex & V1, - const TopoDS_Vertex & V2, const TopoDS_Vertex & V3, Conv2DStruct & conv) -{ -// MESSAGE("StdMeshers_Hexa_3D::GetConv2DCoefs"); - const TopoDS_Face & F = TopoDS::Face(aShape); - TopoDS_Edge E = quad.edge[0]; - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - TopoDS_Vertex VFirst, VLast; - TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l - bool isForward = (((l - f) * (quad.last[0] - quad.first[0])) > 0); - TopoDS_Vertex VA, VB; - if (isForward) - { - VA = VFirst; - VB = VLast; - } - else - { - VA = VLast; - VB = VFirst; - } - int a1, b1, c1, a2, b2, c2; - if (VA.IsSame(V0)) - if (VB.IsSame(V1)) - { - a1 = 1; - b1 = 0; - c1 = 0; // x - a2 = 0; - b2 = 1; - c2 = 0; // y - } - else - { - ASSERT(VB.IsSame(V3)); - a1 = 0; - b1 = 1; - c1 = 0; // y - a2 = 1; - b2 = 0; - c2 = 0; // x - } - if (VA.IsSame(V1)) - if (VB.IsSame(V2)) - { - a1 = 0; - b1 = -1; - c1 = 1; // 1-y - a2 = 1; - b2 = 0; - c2 = 0; // x - } - else - { - ASSERT(VB.IsSame(V0)); - a1 = -1; - b1 = 0; - c1 = 1; // 1-x - a2 = 0; - b2 = 1; - c2 = 0; // y - } - if (VA.IsSame(V2)) - if (VB.IsSame(V3)) - { - a1 = -1; - b1 = 0; - c1 = 1; // 1-x - a2 = 0; - b2 = -1; - c2 = 1; // 1-y - } - else - { - ASSERT(VB.IsSame(V1)); - a1 = 0; - b1 = -1; - c1 = 1; // 1-y - a2 = -1; - b2 = 0; - c2 = 1; // 1-x - } - if (VA.IsSame(V3)) - if (VB.IsSame(V0)) - { - a1 = 0; - b1 = 1; - c1 = 0; // y - a2 = -1; - b2 = 0; - c2 = 1; // 1-x - } - else - { - ASSERT(VB.IsSame(V2)); - a1 = 1; - b1 = 0; - c1 = 0; // x - a2 = 0; - b2 = -1; - c2 = 1; // 1-y - } -// MESSAGE("X = " << c1 << "+ " << a1 << "*x + " << b1 << "*y"); -// MESSAGE("Y = " << c2 << "+ " << a2 << "*x + " << b2 << "*y"); - conv.a1 = a1; - conv.b1 = b1; - conv.c1 = c1; - conv.a2 = a2; - conv.b2 = b2; - conv.c2 = c2; - - int nbdown = quad.nbPts[0]; - int nbright = quad.nbPts[1]; - conv.ia = int (a1); - conv.ib = int (b1); - conv.ic = - int (c1 * a1 * a1) * (nbdown - 1) + int (c1 * b1 * b1) * (nbright - 1); - conv.ja = int (a2); - conv.jb = int (b2); - conv.jc = - int (c2 * a2 * a2) * (nbdown - 1) + int (c2 * b2 * b2) * (nbright - 1); -// MESSAGE("I " << conv.ia << " " << conv.ib << " " << conv.ic); -// MESSAGE("J " << conv.ja << " " << conv.jb << " " << conv.jc); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_Hexa_3D::SaveTo(ostream & save) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_Hexa_3D::LoadFrom(istream & load) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_Hexa_3D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_Hexa_3D & hyp) -{ - return hyp.LoadFrom( load ); -} - -//modified by NIZNHY-PKV Wed Nov 17 15:34:13 2004 f -/////////////////////////////////////////////////////////////////////////////// -//ZZ -//#include - -//======================================================================= -//function : ComputePentahedralMesh -//purpose : -//======================================================================= -bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) -{ - //printf(" ComputePentahedralMesh HERE\n"); - // - bool bOK; - //int iErr; - StdMeshers_Penta_3D anAlgo; - // - bOK=anAlgo.Compute(aMesh, aShape); - /* - iErr=anAlgo.ErrorStatus(); - - if (iErr) { - printf(" *** Error# %d\n", iErr); - } - else { - printf(" *** No errors# %d\n", iErr); - } - */ - return bOK; -} - diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.hxx b/src/StdMeshers/StdMeshers_Hexa_3D.hxx deleted file mode 100644 index a9e20459c..000000000 --- a/src/StdMeshers/StdMeshers_Hexa_3D.hxx +++ /dev/null @@ -1,140 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Hexa_3D.hxx -// Moved here from SMESH_Hexa_3D.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HEXA_3D_HXX_ -#define _SMESH_HEXA_3D_HXX_ - -#include "SMESH_3D_Algo.hxx" -#include "SMESH_Mesh.hxx" -#include "StdMeshers_Quadrangle_2D.hxx" -#include "Utils_SALOME_Exception.hxx" - -typedef struct point3Dstruct -{ - const SMDS_MeshNode * node; -} Point3DStruct; - -typedef double Pt3[3]; - -typedef struct conv2dstruct -{ - double a1; // X = a1*x + b1*y + c1 - double b1; // Y = a2*x + b2*y + c2 - double c1; // a1, b1 a2, b2 in {-1,0,1} - double a2; // c1, c2 in {0,1} - double b2; - double c2; - int ia; // I = ia*i + ib*j + ic - int ib; - int ic; - int ja; // J = ja*i + jb*j + jc - int jb; - int jc; -} Conv2DStruct; - -typedef struct cubeStruct -{ - TopoDS_Vertex V000; - TopoDS_Vertex V001; - TopoDS_Vertex V010; - TopoDS_Vertex V011; - TopoDS_Vertex V100; - TopoDS_Vertex V101; - TopoDS_Vertex V110; - TopoDS_Vertex V111; - faceQuadStruct* quad_X0; - faceQuadStruct* quad_X1; - faceQuadStruct* quad_Y0; - faceQuadStruct* quad_Y1; - faceQuadStruct* quad_Z0; - faceQuadStruct* quad_Z1; - Point3DStruct* np; // normalised 3D coordinates -} CubeStruct; - -class StdMeshers_Hexa_3D: - public SMESH_3D_Algo -{ -public: - StdMeshers_Hexa_3D(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_Hexa_3D(); - - virtual bool CheckHypothesis(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus); - - virtual bool Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape) - throw (SALOME_Exception); - - ostream & SaveTo(ostream & save); - istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_Hexa_3D & hyp); - friend istream & operator >> (istream & load, StdMeshers_Hexa_3D & hyp); - -protected: - TopoDS_Edge - EdgeNotInFace(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - const TopoDS_Face& aFace, - const TopoDS_Vertex& aVertex, - const TopTools_IndexedDataMapOfShapeListOfShape& MS); - - int GetFaceIndex(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - const vector& meshFaces, - const TopoDS_Vertex& V0, - const TopoDS_Vertex& V1, - const TopoDS_Vertex& V2, - const TopoDS_Vertex& V3); - - void GetConv2DCoefs(const faceQuadStruct& quad, - const TopoDS_Shape& aShape, - const TopoDS_Vertex& V0, - const TopoDS_Vertex& V1, - const TopoDS_Vertex& V2, - const TopoDS_Vertex& V3, - Conv2DStruct& conv); - - void GetPoint(Pt3 p, - int i, int j, int k, - int nbx, int nby, int nbz, - Point3DStruct *np, - const SMESHDS_Mesh* meshDS); - - CubeStruct _cube; - FaceQuadStruct* _quads[6]; - int _indX0; - int _indX1; - int _indY0; - int _indY1; - int _indZ0; - int _indZ1; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_LengthFromEdges.cxx b/src/StdMeshers/StdMeshers_LengthFromEdges.cxx deleted file mode 100644 index f21f199f5..000000000 --- a/src/StdMeshers/StdMeshers_LengthFromEdges.cxx +++ /dev/null @@ -1,139 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_LengthFromEdges.cxx -// Moved here from SMESH_LengthFromEdges.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_LengthFromEdges.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LengthFromEdges::StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _mode =1; - _name = "LengthFromEdges"; -// SCRUTE(_name); -// SCRUTE(&_name); - _param_algo_dim = 2; // is used by SMESH_MEFISTO_2D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LengthFromEdges::~StdMeshers_LengthFromEdges() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_LengthFromEdges::SetMode(int mode) - throw (SALOME_Exception) -{ - int oldMode = _mode; - if (mode <= 0) - throw SALOME_Exception(LOCALIZED("mode must be positive")); - _mode = mode; - if (oldMode != _mode) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -int StdMeshers_LengthFromEdges::GetMode() -{ - return _mode; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_LengthFromEdges::SaveTo(ostream & save) -{ - save << this->_mode; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_LengthFromEdges::LoadFrom(istream & load) -{ - bool isOK = true; - int a; - isOK = (load >> a); - if (isOK) - this->_mode = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp) -{ - return hyp.LoadFrom( load ); -} - diff --git a/src/StdMeshers/StdMeshers_LengthFromEdges.hxx b/src/StdMeshers/StdMeshers_LengthFromEdges.hxx deleted file mode 100644 index d514e7c94..000000000 --- a/src/StdMeshers/StdMeshers_LengthFromEdges.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_LengthFromEdges.hxx -// Moved here from SMESH_LengthFromEdges.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LENGTHFROMEDGES_HXX_ -#define _SMESH_LENGTHFROMEDGES_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_LengthFromEdges: - public SMESH_Hypothesis -{ -public: - StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_LengthFromEdges(); - - void SetMode(int mode) - throw (SALOME_Exception); - - int GetMode(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp); - friend istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp); - -protected: - int _mode; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_LocalLength.cxx b/src/StdMeshers/StdMeshers_LocalLength.cxx deleted file mode 100644 index 457d8d80c..000000000 --- a/src/StdMeshers/StdMeshers_LocalLength.cxx +++ /dev/null @@ -1,137 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_LocalLength.cxx -// Moved here from SMESH_LocalLength.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_LocalLength.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LocalLength::StdMeshers_LocalLength(int hypId, int studyId, - SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen) -{ - _length = 1.; - _name = "LocalLength"; -// SCRUTE(_name); -// SCRUTE(&_name); - _param_algo_dim = 1; // is used by SMESH_Regular_1D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_LocalLength::~StdMeshers_LocalLength() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_LocalLength::SetLength(double length) throw(SALOME_Exception) -{ - double oldLength = _length; - if (length <= 0) - throw SALOME_Exception(LOCALIZED("length must be positive")); - _length = length; - if (oldLength != _length) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_LocalLength::GetLength() const -{ - return _length; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_LocalLength::SaveTo(ostream & save) -{ - save << this->_length; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_LocalLength::LoadFrom(istream & load) -{ - bool isOK = true; - double a; - isOK = (load >> a); - if (isOK) - this->_length = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_LocalLength & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_LocalLength.hxx b/src/StdMeshers/StdMeshers_LocalLength.hxx deleted file mode 100644 index aba58e51a..000000000 --- a/src/StdMeshers/StdMeshers_LocalLength.hxx +++ /dev/null @@ -1,55 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_LocalLength.hxx -// Moved here from SMESH_LocalLength.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LOCALLENGTH_HXX_ -#define _SMESH_LOCALLENGTH_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_LocalLength:public SMESH_Hypothesis -{ - public: - StdMeshers_LocalLength(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_LocalLength(); - - void SetLength(double length) throw(SALOME_Exception); - - double GetLength() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp); - friend istream & operator >>(istream & load, StdMeshers_LocalLength & hyp); - - protected: - double _length; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx b/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx deleted file mode 100644 index ed166fc03..000000000 --- a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx +++ /dev/null @@ -1,872 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MEFISTO_2D.cxx -// Moved here from SMESH_MEFISTO_2D.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_MEFISTO_2D.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" - -#include "StdMeshers_MaxElementArea.hxx" -#include "StdMeshers_LengthFromEdges.hxx" - -#include "Rn.h" -#include "aptrte.h" - -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_EdgePosition.hxx" -#include "SMDS_FacePosition.hxx" - -#include "utilities.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -//#include - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D(int hypId, int studyId, - SMESH_Gen * gen):SMESH_2D_Algo(hypId, studyId, gen) -{ - MESSAGE("StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D"); - _name = "MEFISTO_2D"; -// _shapeType = TopAbs_FACE; - _shapeType = (1 << TopAbs_FACE); - _compatibleHypothesis.push_back("MaxElementArea"); - _compatibleHypothesis.push_back("LengthFromEdges"); - - _edgeLength = 0; - _maxElementArea = 0; - _hypMaxElementArea = NULL; - _hypLengthFromEdges = NULL; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D() -{ - MESSAGE("StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_MEFISTO_2D::CheckHypothesis - (SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus) -{ - //MESSAGE("StdMeshers_MEFISTO_2D::CheckHypothesis"); - - _hypMaxElementArea = NULL; - _hypLengthFromEdges = NULL; - - list ::const_iterator itl; - const SMESHDS_Hypothesis *theHyp; - - const list &hyps = GetUsedHypothesis(aMesh, aShape); - int nbHyp = hyps.size(); - if (!nbHyp) - { - aStatus = SMESH_Hypothesis::HYP_MISSING; - return false; // can't work with no hypothesis - } - - itl = hyps.begin(); - theHyp = (*itl); // use only the first hypothesis - - string hypName = theHyp->GetName(); - //int hypId = theHyp->GetID(); - //SCRUTE(hypName); - - bool isOk = false; - - if (hypName == "MaxElementArea") - { - _hypMaxElementArea = static_cast(theHyp); - ASSERT(_hypMaxElementArea); - _maxElementArea = _hypMaxElementArea->GetMaxArea(); - _edgeLength = 0; - isOk = true; - aStatus = SMESH_Hypothesis::HYP_OK; - } - - else if (hypName == "LengthFromEdges") - { - _hypLengthFromEdges = static_cast(theHyp); - ASSERT(_hypLengthFromEdges); - _edgeLength = 0; - _maxElementArea = 0; - isOk = true; - aStatus = SMESH_Hypothesis::HYP_OK; - } - else - aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE; - - if (isOk) - { - isOk = false; - if (_maxElementArea > 0) - { -// _edgeLength = 2 * sqrt(_maxElementArea); // triangles : minorant - _edgeLength = 2 * sqrt(_maxElementArea/sqrt(3.0)); - isOk = true; - } - else - isOk = (_hypLengthFromEdges != NULL); // **** check mode - if (!isOk) - aStatus = SMESH_Hypothesis::HYP_BAD_PARAMETER; - } - - //SCRUTE(_edgeLength); - //SCRUTE(_maxElementArea); - return isOk; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) -{ - MESSAGE("StdMeshers_MEFISTO_2D::Compute"); - - if (_hypLengthFromEdges) - _edgeLength = ComputeEdgeElementLength(aMesh, aShape); - - bool isOk = false; - //const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - //SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape); - - const TopoDS_Face & FF = TopoDS::Face(aShape); - bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD); - TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD)); - - Z nblf; //nombre de lignes fermees (enveloppe en tete) - Z *nudslf = NULL; //numero du dernier sommet de chaque ligne fermee - R2 *uvslf = NULL; - Z nbpti = 0; //nombre points internes futurs sommets de la triangulation - R2 *uvpti = NULL; - - Z nbst; - R2 *uvst = NULL; - Z nbt; - Z *nust = NULL; - Z ierr = 0; - - Z nutysu = 1; // 1: il existe un fonction areteideale_() - // Z nutysu=0; // 0: on utilise aretmx - R aretmx = _edgeLength; // longueur max aretes future triangulation - - nblf = NumberOfWires(F); - - nudslf = new Z[1 + nblf]; - nudslf[0] = 0; - int iw = 1; - int nbpnt = 0; - - myOuterWire = BRepTools::OuterWire(F); - nbpnt += NumberOfPoints(aMesh, myOuterWire); - if ( nbpnt < 3 ) // ex: a circle with 2 segments - return false; - nudslf[iw++] = nbpnt; - - for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next()) - { - const TopoDS_Wire & W = TopoDS::Wire(exp.Current()); - if (!myOuterWire.IsSame(W)) - { - nbpnt += NumberOfPoints(aMesh, W); - nudslf[iw++] = nbpnt; - } - } - - // avoid passing same uv points for a vertex common to 2 wires - TopTools_IndexedDataMapOfShapeListOfShape VWMap; - if ( iw - 1 > 1 ) // nbofWires > 1 - TopExp::MapShapesAndAncestors( F , TopAbs_VERTEX, TopAbs_WIRE, VWMap ); - - uvslf = new R2[nudslf[nblf]]; - int m = 0; - - double scalex, scaley; - ComputeScaleOnFace(aMesh, F, scalex, scaley); - - map mefistoToDS; // correspondence mefisto index--> points IDNodes - if ( !LoadPoints(aMesh, F, myOuterWire, uvslf, m, - mefistoToDS, scalex, scaley, VWMap)) - return false; - - for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next()) - { - const TopoDS_Wire & W = TopoDS::Wire(exp.Current()); - if (!myOuterWire.IsSame(W)) - { - if (! LoadPoints(aMesh, F, W, uvslf, m, - mefistoToDS, scalex, scaley, VWMap )) - return false; - } - } - - uvst = NULL; - nust = NULL; - aptrte(nutysu, aretmx, - nblf, nudslf, uvslf, nbpti, uvpti, nbst, uvst, nbt, nust, ierr); - - if (ierr == 0) - { - MESSAGE("... End Triangulation Generated Triangle Number " << nbt); - MESSAGE(" Node Number " << nbst); - StoreResult(aMesh, nbst, uvst, nbt, nust, F, - faceIsForward, mefistoToDS, scalex, scaley); - isOk = true; - } - else - { - MESSAGE("Error in Triangulation"); - isOk = false; - } - if (nudslf != NULL) - delete[]nudslf; - if (uvslf != NULL) - delete[]uvslf; - if (uvst != NULL) - delete[]uvst; - if (nust != NULL) - delete[]nust; - return isOk; -} - -//======================================================================= -//function : fixOverlappedLinkUV -//purpose : prevent failure due to overlapped adjacent links -//======================================================================= - -static bool fixOverlappedLinkUV( R2& uv0, const R2& uv1, const R2& uv2 ) -{ - gp_XY v1( uv0.x - uv1.x, uv0.y - uv1.y ); - gp_XY v2( uv2.x - uv1.x, uv2.y - uv1.y ); - - double tol2 = DBL_MIN * DBL_MIN; - double sqMod1 = v1.SquareModulus(); - if ( sqMod1 <= tol2 ) return false; - double sqMod2 = v2.SquareModulus(); - if ( sqMod2 <= tol2 ) return false; - - double dot = v1*v2; - - // check sinus >= 1.e-3 - const double minSin = 1.e-3; - if ( dot > 0 && 1 - dot * dot / ( sqMod1 * sqMod2 ) < minSin * minSin ) { - MESSAGE(" ___ FIX UV ____" << uv0.x << " " << uv0.y); - v1.SetCoord( -v1.Y(), v1.X() ); - double delta = sqrt( sqMod1 ) * minSin; - if ( v1.X() < 0 ) - uv0.x -= delta; - else - uv0.x += delta; - if ( v1.Y() < 0 ) - uv0.y -= delta; - else - uv0.y += delta; -// MESSAGE(" -> " << uv0.x << " " << uv0.y << " "); -// MESSAGE("v1( " << v1.X() << " " << v1.Y() << " ) " << -// "v2( " << v2.X() << " " << v2.Y() << " ) "); -// MESSAGE("SIN: " << sqrt(1 - dot * dot / (sqMod1 * sqMod2))); -// v1.SetCoord( uv0.x - uv1.x, uv0.y - uv1.y ); -// v2.SetCoord( uv2.x - uv1.x, uv2.y - uv1.y ); -// gp_XY v3( uv2.x - uv0.x, uv2.y - uv0.y ); -// sqMod1 = v1.SquareModulus(); -// sqMod2 = v2.SquareModulus(); -// dot = v1*v2; -// double sin = sqrt(1 - dot * dot / (sqMod1 * sqMod2)); -// MESSAGE("NEW SIN: " << sin); - return true; - } - return false; -} - -//======================================================================= -//function : fixCommonVertexUV -//purpose : -//======================================================================= - -static bool fixCommonVertexUV (gp_Pnt2d & theUV, - const TopoDS_Vertex& theV, - const TopoDS_Wire& theW, - const TopoDS_Wire& theOW, - const TopoDS_Face& theF, - const TopTools_IndexedDataMapOfShapeListOfShape & theVWMap, - SMESH_Mesh & theMesh) -{ - if( theW.IsSame( theOW ) || - !theVWMap.Contains( theV )) return false; - - // check if there is another wire sharing theV - const TopTools_ListOfShape& WList = theVWMap.FindFromKey( theV ); - TopTools_ListIteratorOfListOfShape aWIt; - for ( aWIt.Initialize( WList ); aWIt.More(); aWIt.Next() ) - if ( !theW.IsSame( aWIt.Value() )) - break; - if ( !aWIt.More() ) return false; - - TopTools_ListOfShape EList; - list< double > UList; - - // find edges of theW sharing theV - // and find 2d normal to them at theV - gp_Vec2d N(0.,0.); - TopoDS_Iterator itE( theW ); - for ( ; itE.More(); itE.Next() ) - { - const TopoDS_Edge& E = TopoDS::Edge( itE.Value() ); - TopoDS_Iterator itV( E ); - for ( ; itV.More(); itV.Next() ) - { - const TopoDS_Vertex & V = TopoDS::Vertex( itV.Value() ); - if ( !V.IsSame( theV )) - continue; - EList.Append( E ); - Standard_Real u = BRep_Tool::Parameter( V, E ); - UList.push_back( u ); - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, theF, f, l); - gp_Vec2d d1; - gp_Pnt2d p; - C2d->D1( u, p, d1 ); - gp_Vec2d n( d1.Y(), -d1.X() ); - if ( E.Orientation() == TopAbs_REVERSED ) - n.Reverse(); - N += n.Normalized(); - } - } - - // define step size by which to move theUV - - gp_Pnt2d nextUV; // uv of next node on edge, most distant of the four - double maxDist = -DBL_MAX; - TopTools_ListIteratorOfListOfShape aEIt (EList); - list< double >::iterator aUIt = UList.begin(); - for ( ; aEIt.More(); aEIt.Next(), aUIt++ ) - { - const TopoDS_Edge& E = TopoDS::Edge( aEIt.Value() ); - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, theF, f, l); - - double umin = DBL_MAX, umax = -DBL_MAX; - SMDS_NodeIteratorPtr nIt = theMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes(); - if ( !nIt->more() ) // no nodes on edge, only on vertices - { - umin = l; - umax = f; - } - else - { - while ( nIt->more() ) { - const SMDS_MeshNode* node = nIt->next(); - const SMDS_EdgePosition* epos = - static_cast(node->GetPosition().get()); - double u = epos->GetUParameter(); - if ( u < umin ) - umin = u; - if ( u > umax ) - umax = u; - } - } - bool isFirstCommon = ( *aUIt == f ); - gp_Pnt2d uv = C2d->Value( isFirstCommon ? umin : umax ); - double dist = theUV.SquareDistance( uv ); - if ( dist > maxDist ) { - maxDist = dist; - nextUV = uv; - } - } - R2 uv0, uv1, uv2; - uv0.x = theUV.X(); uv0.y = theUV.Y(); - uv1.x = nextUV.X(); uv1.y = nextUV.Y(); - uv2.x = uv0.x; uv2.y = uv0.y; - if ( fixOverlappedLinkUV( uv0, uv1, uv2 )) - { - double step = theUV.Distance( gp_Pnt2d( uv0.x, uv0.y )); - - // move theUV along the normal by the step - - N *= step; - - MESSAGE("--fixCommonVertexUV move(" << theUV.X() << " " << theUV.Y() - << ") by (" << N.X() << " " << N.Y() << ")" - << endl << "--- MAX DIST " << maxDist); - - theUV.SetXY( theUV.XY() + N.XY() ); - - return true; - } - return false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool StdMeshers_MEFISTO_2D::LoadPoints(SMESH_Mesh & aMesh, - const TopoDS_Face & FF, - const TopoDS_Wire & WW, - R2 * uvslf, - int & m, - map&mefistoToDS, - double scalex, - double scaley, - const TopTools_IndexedDataMapOfShapeListOfShape& VWMap) -{ -// MESSAGE("StdMeshers_MEFISTO_2D::LoadPoints"); - - //SMDS_Mesh * meshDS = aMesh.GetMeshDS(); - - TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD)); - - int mInit = m, mFirst, iEdge; - gp_XY scale( scalex, scaley ); - - TopoDS_Wire W = TopoDS::Wire(WW.Oriented(TopAbs_FORWARD)); - BRepTools_WireExplorer wexp(W, F); - for (wexp.Init(W, F), iEdge = 0; wexp.More(); wexp.Next(), iEdge++) - { - const TopoDS_Edge & E = wexp.Current(); - - // --- IDNodes of first and last Vertex - - TopoDS_Vertex VFirst, VLast; - TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l - - ASSERT(!VFirst.IsNull()); - SMDS_NodeIteratorPtr lid= - aMesh.GetSubMesh(VFirst)->GetSubMeshDS()->GetNodes(); - if ( !lid->more() ) { - MESSAGE (" NO NODE BUILT ON VERTEX "); - return false; - } - const SMDS_MeshNode* idFirst = lid->next(); - - ASSERT(!VLast.IsNull()); - lid=aMesh.GetSubMesh(VLast)->GetSubMeshDS()->GetNodes(); - if ( !lid->more() ) { - MESSAGE (" NO NODE BUILT ON VERTEX "); - return false; - } - const SMDS_MeshNode* idLast = lid->next(); - - // --- edge internal IDNodes (relies on good order storage, not checked) - - int nbPoints = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes(); - - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - - SMDS_NodeIteratorPtr ite= aMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes(); - - //bool isForward = (E.Orientation() == TopAbs_FORWARD); - map params; - - while(ite->more()) - { - const SMDS_MeshNode * node = ite->next(); - const SMDS_EdgePosition* epos = - static_cast(node->GetPosition().get()); - double param = epos->GetUParameter(); - params[param] = node; - } - if ( nbPoints != params.size()) - { - MESSAGE( "BAD NODE ON EDGE POSITIONS" ); - return false; - } - - mFirst = m; - - // --- load 2D values into MEFISTO structure, - // add IDNodes in mefistoToDS map - if (E.Orientation() == TopAbs_FORWARD) - { - gp_Pnt2d p = C2d->Value(f).XY().Multiplied( scale ); // first point = Vertex Forward - if ( fixCommonVertexUV( p, VFirst, W, myOuterWire, F, VWMap, aMesh )) - myNodesOnCommonV.push_back( idFirst ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = idFirst; - //MESSAGE(" "<::iterator itp = params.begin(); - for (int i = 1; i <= nbPoints; i++) // nbPoints internal - { - double param = (*itp).first; - gp_Pnt2d p = C2d->Value(param).XY().Multiplied( scale ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = (*itp).second; - //MESSAGE(" "<Value(l).XY().Multiplied( scale ); // last point = Vertex Reversed - if ( fixCommonVertexUV( p, VLast, W, myOuterWire, F, VWMap, aMesh )) - myNodesOnCommonV.push_back( idLast ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = idLast; - //MESSAGE(" "<::reverse_iterator itp = params.rbegin(); - for (int i = nbPoints; i >= 1; i--) - { - double param = (*itp).first; - gp_Pnt2d p = C2d->Value(param).XY().Multiplied( scale ); - uvslf[m].x = p.X(); - uvslf[m].y = p.Y(); - mefistoToDS[m + 1] = (*itp).second; - //MESSAGE(" "< 0 ) - fixOverlappedLinkUV (uvslf[ mFirst - 1], - uvslf[ mFirst ], - uvslf[ mFirst + 1 ]); - - } // for wexp - - fixOverlappedLinkUV (uvslf[ m - 1], - uvslf[ mInit ], - uvslf[ mInit + 1 ]); - - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MEFISTO_2D::ComputeScaleOnFace(SMESH_Mesh & aMesh, - const TopoDS_Face & aFace, double &scalex, double &scaley) -{ - //MESSAGE("StdMeshers_MEFISTO_2D::ComputeScaleOnFace"); - TopoDS_Face F = TopoDS::Face(aFace.Oriented(TopAbs_FORWARD)); - TopoDS_Wire W = BRepTools::OuterWire(F); - - double xmin = 1.e300; // min & max of face 2D parametric coord. - double xmax = -1.e300; - double ymin = 1.e300; - double ymax = -1.e300; - int nbp = 23; - scalex = 1; - scaley = 1; - - TopExp_Explorer wexp(W, TopAbs_EDGE); - for ( ; wexp.More(); wexp.Next()) - { - const TopoDS_Edge & E = TopoDS::Edge( wexp.Current() ); - double f, l; - Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - if ( C2d.IsNull() ) continue; - double du = (l - f) / double (nbp); - for (int i = 0; i <= nbp; i++) - { - double param = f + double (i) * du; - gp_Pnt2d p = C2d->Value(param); - if (p.X() < xmin) - xmin = p.X(); - if (p.X() > xmax) - xmax = p.X(); - if (p.Y() < ymin) - ymin = p.Y(); - if (p.Y() > ymax) - ymax = p.Y(); - // MESSAGE(" "<< f<<" "<Value(xmin, ymoy); - gp_Pnt PY0 = S->Value(xmoy, ymin); - double dx = xsize / double (nbp); - double dy = ysize / double (nbp); - for (int i = 1; i <= nbp; i++) - { - double x = xmin + double (i) * dx; - gp_Pnt PX = S->Value(x, ymoy); - double y = ymin + double (i) * dy; - gp_Pnt PY = S->Value(xmoy, y); - length_x += PX.Distance(PX0); - length_y += PY.Distance(PY0); - PX0 = PX; - PY0 = PY; - } - scalex = length_x / xsize; - scaley = length_y / ysize; -// SCRUTE(xsize); -// SCRUTE(ysize); - double xyratio = xsize*scalex/(ysize*scaley); - const double maxratio = 1.e2; - //SCRUTE(xyratio); - if (xyratio > maxratio) { - SCRUTE( scaley ); - scaley *= xyratio / maxratio; - SCRUTE( scaley ); - } - else if (xyratio < 1./maxratio) { - SCRUTE( scalex ); - scalex *= 1 / xyratio / maxratio; - SCRUTE( scalex ); - } - ASSERT(scalex); - ASSERT(scaley); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MEFISTO_2D::StoreResult(SMESH_Mesh & aMesh, - Z nbst, R2 * uvst, Z nbt, Z * nust, - const TopoDS_Face & F, bool faceIsForward, - map&mefistoToDS, - double scalex, double scaley) -{ - SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - int faceID = meshDS->ShapeToIndex( F ); - - Z n, m; - Handle(Geom_Surface) S = BRep_Tool::Surface(F); - - for (n = 0; n < nbst; n++) - { - if (mefistoToDS.find(n + 1) == mefistoToDS.end()) - { - double u = uvst[n][0] / scalex; - double v = uvst[n][1] / scaley; - gp_Pnt P = S->Value(u, v); - - SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z()); - meshDS->SetNodeOnFace(node, faceID, u, v); - - //MESSAGE(P.X()<<" "<AddFace(n1, n2, n3); - else - elt = meshDS->AddFace(n1, n3, n2); - - meshDS->SetMeshElementOnShape(elt, faceID); - m++; - } - - // remove bad elements build on vertices shared by wires - - list::iterator itN = myNodesOnCommonV.begin(); - for ( ; itN != myNodesOnCommonV.end(); itN++ ) - { - const SMDS_MeshNode* node = *itN; - SMDS_ElemIteratorPtr invElemIt = node->GetInverseElementIterator(); - while ( invElemIt->more() ) - { - const SMDS_MeshElement* elem = invElemIt->next(); - SMDS_ElemIteratorPtr itN = elem->nodesIterator(); - int nbSame = 0; - while ( itN->more() ) - if ( itN->next() == node) - nbSame++; - if (nbSame > 1) { - MESSAGE( "RM bad element " << elem->GetID()); - meshDS->RemoveElement( elem ); - } - } - } - -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_MEFISTO_2D::ComputeEdgeElementLength(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape) -{ - //MESSAGE("StdMeshers_MEFISTO_2D::ComputeEdgeElementLength"); - // **** a mettre dans SMESH_2D_Algo ? - - const TopoDS_Face & FF = TopoDS::Face(aShape); - //bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD); - TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD)); - - double meanElementLength = 100; - double wireLength = 0; - int wireElementsNumber = 0; - for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next()) - { - const TopoDS_Wire & W = TopoDS::Wire(exp.Current()); - for (TopExp_Explorer expe(W, TopAbs_EDGE); expe.More(); expe.Next()) - { - const TopoDS_Edge & E = TopoDS::Edge(expe.Current()); - int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes(); - double length = EdgeLength(E); - wireLength += length; - wireElementsNumber += nb; - } - } - if (wireElementsNumber) - meanElementLength = wireLength / wireElementsNumber; - //SCRUTE(meanElementLength); - return meanElementLength; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_MEFISTO_2D::SaveTo(ostream & save) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_MEFISTO_2D::LoadFrom(istream & load) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_MEFISTO_2D & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_MEFISTO_2D & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_MEFISTO_2D.hxx b/src/StdMeshers/StdMeshers_MEFISTO_2D.hxx deleted file mode 100644 index fac85f07d..000000000 --- a/src/StdMeshers/StdMeshers_MEFISTO_2D.hxx +++ /dev/null @@ -1,100 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MEFISTO_2D.hxx -// Moved here from SMESH_MEFISTO_2D.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_MEFISTO_2D_HXX_ -#define _StdMeshers_MEFISTO_2D_HXX_ - -#include "SMESH_2D_Algo.hxx" -#include - -class SMDS_MeshNode; -class TopTools_IndexedDataMapOfShapeListOfShape; -class TopoDS_Face; -class TopoDS_WIre; -class StdMeshers_MaxElementArea; -class StdMeshers_LengthFromEdges; -class SMDS_MeshNode; - -#include -#include -#include "Rn.h" - -class StdMeshers_MEFISTO_2D: - public SMESH_2D_Algo -{ -public: - StdMeshers_MEFISTO_2D(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_MEFISTO_2D(); - - virtual bool CheckHypothesis(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape, - SMESH_Hypothesis::Hypothesis_Status& aStatus); - - virtual bool Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape); - - double ComputeEdgeElementLength(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape); - - bool LoadPoints(SMESH_Mesh& aMesh, - const TopoDS_Face& F, - const TopoDS_Wire& W, - R2* uvslf, - int& m, - map& mefistoToDS, - double scalex, double scaley, - const TopTools_IndexedDataMapOfShapeListOfShape& VWMap); - - void ComputeScaleOnFace(SMESH_Mesh& aMesh, - const TopoDS_Face& aFace, - double& scalex, - double& scaley); - - void StoreResult (SMESH_Mesh& aMesh, - Z nbst, R2* uvst, Z nbt, Z* nust, - const TopoDS_Face& F, bool faceIsForward, - map& mefistoToDS, - double scalex, double scaley); - - ostream & SaveTo(ostream & save); - istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_MEFISTO_2D & hyp); - friend istream & operator >> (istream & load, StdMeshers_MEFISTO_2D & hyp); - -protected: - double _edgeLength; - double _maxElementArea; - const StdMeshers_MaxElementArea* _hypMaxElementArea; - const StdMeshers_LengthFromEdges* _hypLengthFromEdges; - - TopoDS_Wire myOuterWire; - std::list myNodesOnCommonV; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_MaxElementArea.cxx b/src/StdMeshers/StdMeshers_MaxElementArea.cxx deleted file mode 100644 index c4a2d5e17..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementArea.cxx +++ /dev/null @@ -1,139 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MaxElementArea.cxx -// Moved here from SMESH_MaxElementArea.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_MaxElementArea.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementArea::StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _maxArea =1.; - _name = "MaxElementArea"; -// SCRUTE(_name); -// SCRUTE(&_name); - _param_algo_dim = 2; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementArea::~StdMeshers_MaxElementArea() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MaxElementArea::SetMaxArea(double maxArea) - throw (SALOME_Exception) -{ - double oldArea = _maxArea; - if (maxArea <= 0) - throw SALOME_Exception(LOCALIZED("maxArea must be positive")); - _maxArea = maxArea; - if (_maxArea != oldArea) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_MaxElementArea::GetMaxArea() const -{ - return _maxArea; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_MaxElementArea::SaveTo(ostream & save) -{ - save << this->_maxArea; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_MaxElementArea::LoadFrom(istream & load) -{ - bool isOK = true; - double a; - isOK = (load >> a); - if (isOK) - this->_maxArea = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_MaxElementArea & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_MaxElementArea & hyp) -{ - return hyp.LoadFrom( load ); -} - diff --git a/src/StdMeshers/StdMeshers_MaxElementArea.hxx b/src/StdMeshers/StdMeshers_MaxElementArea.hxx deleted file mode 100644 index 52af887c8..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementArea.hxx +++ /dev/null @@ -1,55 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MaxElementArea.hxx -// Moved here from SMESH_MaxElementArea.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTAREA_HXX_ -#define _SMESH_MAXELEMENTAREA_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_MaxElementArea:public SMESH_Hypothesis -{ - public: - StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_MaxElementArea(); - - void SetMaxArea(double maxArea) throw(SALOME_Exception); - - double GetMaxArea() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_MaxElementArea & hyp); - friend istream & operator >>(istream & load, StdMeshers_MaxElementArea & hyp); - - protected: - double _maxArea; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_MaxElementVolume.cxx b/src/StdMeshers/StdMeshers_MaxElementVolume.cxx deleted file mode 100644 index f9f6b6322..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementVolume.cxx +++ /dev/null @@ -1,141 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MaxElementVolume.cxx -// Moved here from SMESH_MaxElementVolume.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; - -#include "StdMeshers_MaxElementVolume.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementVolume::StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _maxVolume =1.; - _name = "MaxElementVolume"; -// SCRUTE(_name); - SCRUTE(&_name); - _param_algo_dim = 3; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume() -{ - MESSAGE("StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_MaxElementVolume::SetMaxVolume(double maxVolume) - throw (SALOME_Exception) -{ - double oldVolume = _maxVolume; - if (maxVolume <= 0) - throw SALOME_Exception(LOCALIZED("maxVolume must be positive")); - _maxVolume = maxVolume; - if (_maxVolume != oldVolume) - NotifySubMeshesHypothesisModification(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_MaxElementVolume::GetMaxVolume() const -{ - return _maxVolume; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_MaxElementVolume::SaveTo(ostream & save) -{ - save << this->_maxVolume; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_MaxElementVolume::LoadFrom(istream & load) -{ - bool isOK = true; - double a; - isOK = (load >> a); - if (isOK) - this->_maxVolume = a; - else - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp) -{ - return hyp.LoadFrom( load ); -} - diff --git a/src/StdMeshers/StdMeshers_MaxElementVolume.hxx b/src/StdMeshers/StdMeshers_MaxElementVolume.hxx deleted file mode 100644 index ee9986f1f..000000000 --- a/src/StdMeshers/StdMeshers_MaxElementVolume.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MaxElementVolume.hxx -// Moved here from SMESH_MaxElementVolume.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTVOLUME_HXX_ -#define _SMESH_MAXELEMENTVOLUME_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_MaxElementVolume: - public SMESH_Hypothesis -{ -public: - StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_MaxElementVolume(); - - void SetMaxVolume(double maxVolume) - throw (SALOME_Exception); - - double GetMaxVolume() const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp); - friend istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp); - -protected: - double _maxVolume; -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_NotConformAllowed.cxx b/src/StdMeshers/StdMeshers_NotConformAllowed.cxx deleted file mode 100644 index 5c471b2a0..000000000 --- a/src/StdMeshers/StdMeshers_NotConformAllowed.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_NotConformAllowed.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_NotConformAllowed.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_NotConformAllowed::StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _name = "NotConformAllowed"; - _param_algo_dim = -1; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_NotConformAllowed::~StdMeshers_NotConformAllowed() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_NotConformAllowed::SaveTo(ostream & save) -{ - return save << this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_NotConformAllowed::LoadFrom(istream & load) -{ - return load >> (*this); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp) -{ - return load; -} diff --git a/src/StdMeshers/StdMeshers_NotConformAllowed.hxx b/src/StdMeshers/StdMeshers_NotConformAllowed.hxx deleted file mode 100644 index 079742458..000000000 --- a/src/StdMeshers/StdMeshers_NotConformAllowed.hxx +++ /dev/null @@ -1,48 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_NotConformAllowed.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_NotConformAllowed_HXX_ -#define _StdMeshers_NotConformAllowed_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_NotConformAllowed: - public SMESH_Hypothesis -{ -public: - StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen); - virtual ~StdMeshers_NotConformAllowed(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp); - friend istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp); -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Penta_3D.cxx b/src/StdMeshers/StdMeshers_Penta_3D.cxx deleted file mode 100644 index ad6ebc831..000000000 --- a/src/StdMeshers/StdMeshers_Penta_3D.cxx +++ /dev/null @@ -1,1582 +0,0 @@ -// SMESH StdMeshers_Penta_3D implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Penta_3D.cxx -// Module : SMESH - -#include "StdMeshers_Penta_3D.hxx" - -#include "utilities.h" -#include "Utils_ExceptHandlers.hxx" - -#include "SMDS_EdgePosition.hxx" -#include "SMDS_MeshElement.hxx" -#include "SMDS_VolumeOfNodes.hxx" -#include "SMDS_VolumeTool.hxx" -#include "SMESHDS_SubMesh.hxx" -#include "SMESH_Mesh.hxx" -#include "SMESH_subMesh.hxx" -#include "SMESH_MeshEditor.hxx" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -using namespace std; - -typedef map < int, int, less >::iterator \ - StdMeshers_IteratorOfDataMapOfIntegerInteger; - -//======================================================================= -//function : StdMeshers_Penta_3D -//purpose : -//======================================================================= -StdMeshers_Penta_3D::StdMeshers_Penta_3D() -: myErrorStatus(1) -{ - myTol3D=0.1; - myWallNodesMaps.resize( SMESH_Block::NbFaces() ); - myShapeXYZ.resize( SMESH_Block::NbSubShapes() ); -} -//======================================================================= -//function : Compute -//purpose : -//======================================================================= -bool StdMeshers_Penta_3D::Compute(SMESH_Mesh& aMesh, - const TopoDS_Shape& aShape) -{ - MESSAGE("StdMeshers_Penta_3D::Compute()"); - // - myErrorStatus=0; - // - bool bOK=false; - // - myShape=aShape; - SetMesh(aMesh); - // - CheckData(); - if (myErrorStatus){ - return bOK; - } - // - MakeBlock(); - if (myErrorStatus){ - return bOK; - } - // - MakeNodes(); - if (myErrorStatus){ - return bOK; - } - // - MakeConnectingMap(); - // - ClearMeshOnFxy1(); - if (myErrorStatus) { - return bOK; - } - // - MakeMeshOnFxy1(); - if (myErrorStatus) { - return bOK; - } - // - MakeVolumeMesh(); - // - return !bOK; -} -//======================================================================= -//function : MakeNodes -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeNodes() -{ - myErrorStatus=0; - // - const int aNbSIDs=9; - int i, j, k, ij, iNbN, aNodeID, aSize, iErr; - double aX, aY, aZ; - SMESH_Block::TShapeID aSID, aSIDs[aNbSIDs]={ - SMESH_Block::ID_V000, SMESH_Block::ID_V100, - SMESH_Block::ID_V110, SMESH_Block::ID_V010, - SMESH_Block::ID_Ex00, SMESH_Block::ID_E1y0, - SMESH_Block::ID_Ex10, SMESH_Block::ID_E0y0, - SMESH_Block::ID_Fxy0 - }; - // - SMESH_Mesh* pMesh=GetMesh(); - // - // 1. Define the sizes of mesh - // - // 1.1 Horizontal size - myJSize=0; - for (i=0; iGetSubMeshContaining(aS); - ASSERT(aSubMesh); - SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS(); - iNbN=aSM->NbNodes(); - myJSize+=iNbN; - } - //printf("*** Horizontal: number of nodes summary=%d\n", myJSize); - // - // 1.2 Vertical size - myISize=2; - { - const TopoDS_Shape& aS=myBlock.Shape(SMESH_Block::ID_E00z); - SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aS); - ASSERT(aSubMesh); - SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS(); - iNbN=aSM->NbNodes(); - myISize+=iNbN; - } - //printf("*** Vertical: number of nodes on edges and vertices=%d\n", myISize); - // - aSize=myISize*myJSize; - myTNodes.resize(aSize); - // - StdMeshers_TNode aTNode; - gp_XYZ aCoords; - gp_Pnt aP3D; - // - // 2. Fill the repers on base face (Z=0) - i=0; j=0; - // vertices - for (k=0; kGetSubMeshContaining(aS)->GetSubMeshDS()->GetNodes(); - while(ite->more()) { - const SMDS_MeshNode* aNode = ite->next(); - aNodeID=aNode->GetID(); - // - aTNode.SetNode(aNode); - aTNode.SetShapeSupportID(aSID); - aTNode.SetBaseNodeID(aNodeID); - // - if ( SMESH_Block::IsEdgeID (aSID)) - { - const SMDS_EdgePosition* epos = - static_cast(aNode->GetPosition().get()); - myBlock.ComputeParameters( epos->GetUParameter(), aS, aCoords ); - } - else { - aX=aNode->X(); - aY=aNode->Y(); - aZ=aNode->Z(); - aP3D.SetCoord(aX, aY, aZ); - myBlock.ComputeParameters(aP3D, aS, aCoords); - } - iErr=myBlock.ErrorStatus(); - if (iErr) { - MESSAGE("StdMeshers_Penta_3D::MakeNodes()," << - "SMESHBlock: ComputeParameters operation failed"); - myErrorStatus=101; // SMESHBlock: ComputeParameters operation failed - return; - } - aTNode.SetNormCoord(aCoords); - ij=i*myJSize+j; - myTNodes[ij]=aTNode; - ++j; - } - } - /* - //DEB - { - int iShapeSupportID, iBaseNodeID; - // - //printf("\n\n*** Base Face\n"); - i=0; - for (j=0; j aZL(myISize); -// vector::iterator aItZL1, aItZL2 ; -// // -// const TopoDS_Shape& aE00z=myBlock.Shape(SMESH_Block::ID_E00z); -// SMDS_NodeIteratorPtr aItaE00z = -// pMesh->GetSubMeshContaining(aE00z)->GetSubMeshDS()->GetNodes(); -// // -// aZL[0]=0.; -// i=1; -// while (aItaE00z->more()) { -// const SMDS_MeshNode* aNode=aItaE00z->next(); -// const SMDS_EdgePosition* epos = -// static_cast(aNode->GetPosition().get()); -// myBlock.ComputeParameters( epos->GetUParameter(), aE00z, aCoords ); -// iErr=myBlock.ErrorStatus(); -// if (iErr) { -// MESSAGE("StdMeshers_Penta_3D::MakeNodes()," << -// "SMESHBlock: ComputeParameters operation failed"); -// myErrorStatus=101; // SMESHBlock: ComputeParameters operation failed -// return; -// } -// aZL[i]=aCoords.Z(); -// ++i; -// } -// aZL[i]=1.; -// // -// aItZL1=aZL.begin(); -// aItZL2=aZL.end(); -// // -// // Sorting the layers -// sort(aItZL1, aItZL2); - //DEB - /* - printf("** \n\n Layers begin\n"); - for(i=0, aItZL=aItZL1; aItZL!=aItZL2; ++aItZL, ++i) { - printf(" #%d : %lf\n", i, *aItZL); - } - printf("** Layers end\n"); - */ - //DEB - // - // - - // 3.1 Fill maps of wall nodes - SMESH_Block::TShapeID wallFaceID[4] = { - SMESH_Block::ID_Fx0z, SMESH_Block::ID_Fx1z, - SMESH_Block::ID_F0yz, SMESH_Block::ID_F1yz - }; - SMESH_Block::TShapeID baseEdgeID[4] = { - SMESH_Block::ID_Ex00, SMESH_Block::ID_Ex10, - SMESH_Block::ID_E0y0, SMESH_Block::ID_E1y0 - }; - for ( i = 0; i < 4; ++i ) { - int fIndex = SMESH_Block::ShapeIndex( wallFaceID[ i ]); - bool ok = LoadIJNodes (myWallNodesMaps[ fIndex ], - TopoDS::Face( myBlock.Shape( wallFaceID[ i ] )), - TopoDS::Edge( myBlock.Shape( baseEdgeID[ i ] )), - pMesh->GetMeshDS()); - if ( !ok ) { - myErrorStatus = i + 1; - MESSAGE(" Cant LoadIJNodes() from a wall face " << myErrorStatus ); - return; - } - } - - // 3.2 find node columns for vertical edges and edge IDs - vector * verticEdgeNodes[ 4 ]; - SMESH_Block::TShapeID verticEdgeID [ 4 ]; - for ( i = 0; i < 4; ++i ) { // 4 first base nodes are nodes on vertices - // edge ID - SMESH_Block::TShapeID eID, vID = aSIDs[ i ]; - ShapeSupportID(false, vID, eID); - verticEdgeID[ i ] = eID; - // column nodes - StdMeshers_TNode& aTNode = myTNodes[ i ]; - verticEdgeNodes[ i ] = 0; - for ( j = 0; j < 4; ++j ) { // loop on 4 wall faces - int fIndex = SMESH_Block::ShapeIndex( wallFaceID[ j ]); - StdMeshers_IJNodeMap & ijNodes= myWallNodesMaps[ fIndex ]; - if ( ijNodes.begin()->second[0] == aTNode.Node() ) - verticEdgeNodes[ i ] = & ijNodes.begin()->second; - else if ( ijNodes.rbegin()->second[0] == aTNode.Node() ) - verticEdgeNodes[ i ] = & ijNodes.rbegin()->second; - if ( verticEdgeNodes[ i ] ) - break; - } - } - - // 3.3 set XYZ of vertices, and initialize of the rest - SMESHDS_Mesh* aMesh = GetMesh()->GetMeshDS(); - for ( int id = SMESH_Block::ID_V000; id < SMESH_Block::ID_Shell; ++id ) - { - if ( SMESH_Block::IsVertexID( id )) { - TopoDS_Shape V = myBlock.Shape( id ); - SMESHDS_SubMesh* sm = aMesh->MeshElements( V ); - const SMDS_MeshNode* n = sm->GetNodes()->next(); - myShapeXYZ[ id ].SetCoord( n->X(), n->Y(), n->Z() ); - } - else - myShapeXYZ[ id ].SetCoord( 0., 0., 0. ); - } - - - // 4. Fill the rest repers - bool bIsUpperLayer; - int iBNID; - SMESH_Block::TShapeID aSSID, aBNSSID; - StdMeshers_TNode aTN; - // - for (j=0; j* nColumns[8]; - double ratio[4]; // base node position between columns [0.-1.] - if ( createNode ) - for ( k = 0; k < 4; ++k ) - ratio[ k ] = SetHorizEdgeXYZ (aBNXYZ, wallFaceID[ k ], - nColumns[k*2], nColumns[k*2+1]); - // - // XYZ on the bottom and top faces - const SMDS_MeshNode* n = aBN.Node(); - myShapeXYZ[ SMESH_Block::ID_Fxy0 ].SetCoord( n->X(), n->Y(), n->Z() ); - myShapeXYZ[ SMESH_Block::ID_Fxy1 ].SetCoord( 0., 0., 0. ); - // - // first create or find a top node, then the rest ones in a column - for (i=myISize-1; i>0; --i) - { - if ( createNode ) { - // set XYZ on vertical edges and faces - for ( k = 0; k < 4; ++k ) { - const SMDS_MeshNode* n = (*verticEdgeNodes[ k ]) [ i ]; - myShapeXYZ[ verticEdgeID[ k ] ].SetCoord( n->X(), n->Y(), n->Z() ); - // - n = (*nColumns[k*2]) [ i ]; - gp_XYZ xyz( n->X(), n->Y(), n->Z() ); - myShapeXYZ[ wallFaceID[ k ]] = ( 1. - ratio[ k ]) * xyz; - n = (*nColumns[k*2+1]) [ i ]; - xyz.SetCoord( n->X(), n->Y(), n->Z() ); - myShapeXYZ[ wallFaceID[ k ]] += ratio[ k ] * xyz; - } - } - // fill current node info - // -index in aTNodes - ij=i*myJSize+j; - // -normalized coordinates - aX=aBNXYZ.X(); - aY=aBNXYZ.Y(); - //aZ=aZL[i]; - aZ=(double)i/(double)(myISize-1); - aCoords.SetCoord(aX, aY, aZ); - // - // suporting shape ID - bIsUpperLayer=(i==(myISize-1)); - ShapeSupportID(bIsUpperLayer, aBNSSID, aSSID); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeNodes() "); - return; - } - // - aTN.SetShapeSupportID(aSSID); - aTN.SetNormCoord(aCoords); - aTN.SetBaseNodeID(iBNID); - // - if (aSSID!=SMESH_Block::ID_NONE){ - // try to find the node - const TopoDS_Shape& aS=myBlock.Shape((int)aSSID); - FindNodeOnShape(aS, aCoords, i, aTN); - } - else{ - // create node and get it id - CreateNode (bIsUpperLayer, aCoords, aTN); - // - if ( bIsUpperLayer ) { - const SMDS_MeshNode* n = aTN.Node(); - myShapeXYZ[ SMESH_Block::ID_Fxy1 ].SetCoord( n->X(), n->Y(), n->Z() ); - } - } - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeNodes() "); - return; - } - // - myTNodes[ij]=aTN; - } - } - //DEB - /* - { - int iSSID, iBNID, aID; - // - for (i=0; iGetID(); - aX=aNode->X(); - aY=aNode->Y(); - aZ=aNode->Z(); - printf("*** j:%d BNID#%d iSSID:%d ID:%d { %lf %lf %lf }, { %lf %lf %lf }\n", - j, iBNID, iSSID, aID, aXYZ.X(), aXYZ.Y(), aXYZ.Z(), aX, aY, aZ); - } - } - } - */ - //DEB t -} -//======================================================================= -//function : FindNodeOnShape -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::FindNodeOnShape(const TopoDS_Shape& aS, - const gp_XYZ& aParams, - const int z, - StdMeshers_TNode& aTN) -{ - myErrorStatus=0; - // - double aX, aY, aZ, aD, aTol2, minD; - gp_Pnt aP1, aP2; - // - SMESH_Mesh* pMesh=GetMesh(); - aTol2=myTol3D*myTol3D; - minD = 1.e100; - SMDS_MeshNode* pNode=NULL; - // - if ( aS.ShapeType() == TopAbs_FACE || - aS.ShapeType() == TopAbs_EDGE ) - { - // find a face ID to which aTN belongs to - int faceID; - if ( aS.ShapeType() == TopAbs_FACE ) - faceID = myBlock.ShapeID( aS ); - else { // edge maybe vertical or top horizontal - gp_XYZ aCoord = aParams; - if ( aCoord.Z() == 1. ) - aCoord.SetZ( 0.5 ); // move from top down - else - aCoord.SetX( 0.5 ); // move along X - faceID = SMESH_Block::GetShapeIDByParams( aCoord ); - } - ASSERT( SMESH_Block::IsFaceID( faceID )); - int fIndex = SMESH_Block::ShapeIndex( faceID ); - StdMeshers_IJNodeMap & ijNodes= myWallNodesMaps[ fIndex ]; - // look for a base node in ijNodes - const SMDS_MeshNode* baseNode = pMesh->GetMeshDS()->FindNode( aTN.BaseNodeID() ); - StdMeshers_IJNodeMap::const_iterator par_nVec = ijNodes.begin(); - for ( ; par_nVec != ijNodes.end(); par_nVec++ ) - if ( par_nVec->second[ 0 ] == baseNode ) { - pNode=(SMDS_MeshNode*)par_nVec->second.at( z ); - aTN.SetNode(pNode); - return; - } - } - // - myBlock.Point(aParams, aS, aP1); - // - SMDS_NodeIteratorPtr ite= - pMesh->GetSubMeshContaining(aS)->GetSubMeshDS()->GetNodes(); - while(ite->more()) { - const SMDS_MeshNode* aNode = ite->next(); - aX=aNode->X(); - aY=aNode->Y(); - aZ=aNode->Z(); - aP2.SetCoord(aX, aY, aZ); - aD=(double)aP1.SquareDistance(aP2); - //printf("** D=%lf ", aD, aTol2); - if (aD < minD) { - pNode=(SMDS_MeshNode*)aNode; - aTN.SetNode(pNode); - minD = aD; - //printf(" Ok\n"); - if (aD*& aCol1, - vector*& aCol2) -{ - // find base and top edges of the face - vector< int > edgeVec; // 0-base, 1-top - SMESH_Block::GetFaceEdgesIDs( aFaceID, edgeVec ); - // - int coord = SMESH_Block::GetCoordIndOnEdge( edgeVec[ 0 ] ); - double param = aBaseNodeParams.Coord( coord ); - if ( !myBlock.IsForwadEdge( edgeVec[ 0 ] )) - param = 1. - param; - // - // look for columns around param - StdMeshers_IJNodeMap & ijNodes = - myWallNodesMaps[ SMESH_Block::ShapeIndex( aFaceID )]; - StdMeshers_IJNodeMap::iterator par_nVec_1 = ijNodes.begin(); - while ( par_nVec_1->first < param ) - par_nVec_1++; - StdMeshers_IJNodeMap::iterator par_nVec_2 = par_nVec_1; - // - double r = 0; - if ( par_nVec_1 != ijNodes.begin() ) { - par_nVec_1--; - r = ( param - par_nVec_1->first ) / ( par_nVec_2->first - par_nVec_1->first ); - } - aCol1 = & par_nVec_1->second; - aCol2 = & par_nVec_2->second; - - // base edge - const SMDS_MeshNode* n1 = aCol1->front(); - const SMDS_MeshNode* n2 = aCol2->front(); - gp_XYZ xyz1( n1->X(), n1->Y(), n1->Z() ), xyz2( n2->X(), n2->Y(), n2->Z() ); - myShapeXYZ[ edgeVec[ 0 ] ] = ( 1. - r ) * xyz1 + r * xyz2; - - // top edge - n1 = aCol1->back(); - n2 = aCol2->back(); - xyz1.SetCoord( n1->X(), n1->Y(), n1->Z() ); - xyz2.SetCoord( n2->X(), n2->Y(), n2->Z() ); - myShapeXYZ[ edgeVec[ 1 ] ] = ( 1. - r ) * xyz1 + r * xyz2; - - return r; -} - -//======================================================================= -//function : MakeVolumeMesh -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeVolumeMesh() -{ - myErrorStatus=0; - // - int i, j, ij, ik, i1, i2, aSSID; - // - SMESH_Mesh* pMesh =GetMesh(); - SMESHDS_Mesh* meshDS=pMesh->GetMeshDS(); - // - int shapeID = meshDS->ShapeToIndex( myShape ); - // - // 1. Set Node In Volume - ik=myISize-1; - for (i=1; iSetNodeInVolume(aNode, shapeID); - } - } - } - // - // 2. Make pentahedrons - int aID0, k , aJ[3]; - vector aN; - // - SMDS_ElemIteratorPtr itf, aItNodes; - // - const TopoDS_Face& aFxy0= - TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy0)); - SMESH_subMesh *aSubMesh0 = pMesh->GetSubMeshContaining(aFxy0); - SMESHDS_SubMesh *aSM0=aSubMesh0->GetSubMeshDS(); - // - itf=aSM0->GetElements(); - while(itf->more()) { - const SMDS_MeshElement* pE0=itf->next(); - // - int nbFaceNodes = pE0->NbNodes(); - if ( aN.size() < nbFaceNodes * 2 ) - aN.resize( nbFaceNodes * 2 ); - // - k=0; - aItNodes=pE0->nodesIterator(); - while (aItNodes->more()) { - const SMDS_MeshElement* pNode=aItNodes->next(); - aID0=pNode->GetID(); - aJ[k]=GetIndexOnLayer(aID0); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeVolumeMesh"); - return; - } - // - ++k; - } - // - bool forward = true; - for (i=0; iAddVolume(aN[0], aN[1], aN[2], - aN[3], aN[4], aN[5]); - else - aV = meshDS->AddVolume(aN[0], aN[2], aN[1], - aN[3], aN[5], aN[4]); - break; - case 4: - if ( forward ) - aV = meshDS->AddVolume(aN[0], aN[1], aN[2], aN[3], - aN[4], aN[5], aN[6], aN[7]); - else - aV = meshDS->AddVolume(aN[0], aN[3], aN[2], aN[1], - aN[4], aN[7], aN[6], aN[5]); - break; - default: - continue; - } - meshDS->SetMeshElementOnShape(aV, shapeID); - } - } -} - -//======================================================================= -//function : MakeMeshOnFxy1 -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeMeshOnFxy1() -{ - myErrorStatus=0; - // - int aID0, aJ, aLevel, ij, aNbNodes, k; - // - SMDS_NodeIteratorPtr itn; - SMDS_ElemIteratorPtr itf, aItNodes; - SMDSAbs_ElementType aElementType; - // - const TopoDS_Face& aFxy0= - TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy0)); - const TopoDS_Face& aFxy1= - TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy1)); - // - SMESH_Mesh* pMesh=GetMesh(); - SMESHDS_Mesh * meshDS = pMesh->GetMeshDS(); - // - SMESH_subMesh *aSubMesh0 = pMesh->GetSubMeshContaining(aFxy0); - SMESHDS_SubMesh *aSM0=aSubMesh0->GetSubMeshDS(); - // - // set nodes on aFxy1 - aLevel=myISize-1; - itn=aSM0->GetNodes(); - aNbNodes=aSM0->NbNodes(); - //printf("** aNbNodes=%d\n", aNbNodes); - while(itn->more()) { - const SMDS_MeshNode* aN0=itn->next(); - aID0=aN0->GetID(); - aJ=GetIndexOnLayer(aID0); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeMeshOnFxy1() "); - return; - } - // - ij=aLevel*myJSize+aJ; - const StdMeshers_TNode& aTN1=myTNodes[ij]; - SMDS_MeshNode* aN1=(SMDS_MeshNode*)aTN1.Node(); - // - meshDS->SetNodeOnFace(aN1, aFxy1); - } - // - // set elements on aFxy1 - vector aNodes1; - // - itf=aSM0->GetElements(); - while(itf->more()) { - const SMDS_MeshElement * pE0=itf->next(); - aElementType=pE0->GetType(); - if (!aElementType==SMDSAbs_Face) { - continue; - } - aNbNodes=pE0->NbNodes(); -// if (aNbNodes!=3) { -// continue; -// } - if ( aNodes1.size() < aNbNodes ) - aNodes1.resize( aNbNodes ); - // - k=aNbNodes-1; // reverse a face - aItNodes=pE0->nodesIterator(); - while (aItNodes->more()) { - const SMDS_MeshElement* pNode=aItNodes->next(); - aID0=pNode->GetID(); - aJ=GetIndexOnLayer(aID0); - if (myErrorStatus) { - MESSAGE("StdMeshers_Penta_3D::MakeMeshOnFxy1() "); - return; - } - // - ij=aLevel*myJSize+aJ; - const StdMeshers_TNode& aTN1=myTNodes[ij]; - const SMDS_MeshNode* aN1=aTN1.Node(); - aNodes1[k]=aN1; - --k; - } - SMDS_MeshFace * face = 0; - switch ( aNbNodes ) { - case 3: - face = meshDS->AddFace(aNodes1[0], aNodes1[1], aNodes1[2]); - break; - case 4: - face = meshDS->AddFace(aNodes1[0], aNodes1[1], aNodes1[2], aNodes1[3]); - break; - default: - continue; - } - meshDS->SetMeshElementOnShape(face, aFxy1); - } -} -//======================================================================= -//function : ClearMeshOnFxy1 -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::ClearMeshOnFxy1() -{ - myErrorStatus=0; - // - SMESH_subMesh* aSubMesh; - SMESH_Mesh* pMesh=GetMesh(); - // - const TopoDS_Shape& aFxy1=myBlock.Shape(SMESH_Block::ID_Fxy1); - aSubMesh = pMesh->GetSubMeshContaining(aFxy1); - if (aSubMesh) - aSubMesh->ComputeStateEngine( SMESH_subMesh::CLEAN ); -} - -//======================================================================= -//function : GetIndexOnLayer -//purpose : -//======================================================================= -int StdMeshers_Penta_3D::GetIndexOnLayer(const int aID) -{ - myErrorStatus=0; - // - int j=-1; - StdMeshers_IteratorOfDataMapOfIntegerInteger aMapIt; - // - aMapIt=myConnectingMap.find(aID); - if (aMapIt==myConnectingMap.end()) { - myErrorStatus=200; - return j; - } - j=(*aMapIt).second; - return j; -} -//======================================================================= -//function : MakeConnectingMap -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeConnectingMap() -{ - int j, aBNID; - // - for (j=0; jGetMeshDS(); - // - pNode = pMeshDS->AddNode(aX, aY, aZ); - aTN.SetNode(pNode); -} -//======================================================================= -//function : ShapeSupportID -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::ShapeSupportID(const bool bIsUpperLayer, - const SMESH_Block::TShapeID aBNSSID, - SMESH_Block::TShapeID& aSSID) -{ - myErrorStatus=0; - // - switch (aBNSSID) { - case SMESH_Block::ID_V000: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V001 : SMESH_Block::ID_E00z; - break; - case SMESH_Block::ID_V100: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V101 : SMESH_Block::ID_E10z; - break; - case SMESH_Block::ID_V110: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V111 : SMESH_Block::ID_E11z; - break; - case SMESH_Block::ID_V010: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V011 : SMESH_Block::ID_E01z; - break; - case SMESH_Block::ID_Ex00: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_Ex01 : SMESH_Block::ID_Fx0z; - break; - case SMESH_Block::ID_Ex10: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_Ex11 : SMESH_Block::ID_Fx1z; - break; - case SMESH_Block::ID_E0y0: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_E0y1 : SMESH_Block::ID_F0yz; - break; - case SMESH_Block::ID_E1y0: - aSSID=(bIsUpperLayer) ? SMESH_Block::ID_E1y1 : SMESH_Block::ID_F1yz; - break; - case SMESH_Block::ID_Fxy0: - aSSID=SMESH_Block::ID_NONE;//(bIsUpperLayer) ? Shape_ID_Fxy1 : Shape_ID_NONE; - break; - default: - aSSID=SMESH_Block::ID_NONE; - myErrorStatus=10; // Can not find supporting shape ID - break; - } - return; -} -//======================================================================= -//function : MakeBlock -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::MakeBlock() -{ - myErrorStatus=0; - // - bool bFound; - int i, j, iNbEV, iNbE, iErr, iCnt, iNbNodes, iNbF; - // - TopoDS_Vertex aV000, aV001; - TopoDS_Shape aFTr; - TopTools_IndexedDataMapOfShapeListOfShape aMVES; - TopTools_IndexedMapOfShape aME ,aMEV, aM; - TopTools_ListIteratorOfListOfShape aIt; - // - TopExp::MapShapes(myShape, TopAbs_FACE, aM); - // - // 0. Find triangulated face aFTr - SMDSAbs_ElementType aElementType; - SMESH_Mesh* pMesh=GetMesh(); - // - iCnt=0; - iNbF=aM.Extent(); - for (i=1; i<=iNbF; ++i) { - const TopoDS_Shape& aF=aM(i); - SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aF); - ASSERT(aSubMesh); - SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS(); - SMDS_ElemIteratorPtr itf=aSM->GetElements(); - while(itf->more()) { - const SMDS_MeshElement * pElement=itf->next(); - aElementType=pElement->GetType(); - if (aElementType==SMDSAbs_Face) { - iNbNodes=pElement->NbNodes(); - if (iNbNodes==3) { - aFTr=aF; - ++iCnt; - if (iCnt>1) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=5; // more than one face has triangulation - return; - } - break; // next face - } - } - } - } - // - // 1. Vetrices V00, V001; - // - TopExp::MapShapes(aFTr, TopAbs_EDGE, aME); - TopExp::MapShapesAndAncestors(myShape, TopAbs_VERTEX, TopAbs_EDGE, aMVES); - // - // 1.1 Base vertex V000 - iNbE=aME.Extent(); - if (iNbE!=4){ - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=7; // too few edges are in base face aFTr - return; - } - const TopoDS_Edge& aE1=TopoDS::Edge(aME(1)); - aV000=TopExp::FirstVertex(aE1); - // - const TopTools_ListOfShape& aLE=aMVES.FindFromKey(aV000); - aIt.Initialize(aLE); - for (; aIt.More(); aIt.Next()) { - const TopoDS_Shape& aEx=aIt.Value(); - aMEV.Add(aEx); - } - iNbEV=aMEV.Extent(); - if (iNbEV!=3){ - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=7; // too few edges meet in base vertex - return; - } - // - // 1.2 Vertex V001 - bFound=false; - for (j=1; j<=iNbEV; ++j) { - const TopoDS_Shape& aEx=aMEV(j); - if (!aME.Contains(aEx)) { - TopoDS_Vertex aV[2]; - // - const TopoDS_Edge& aE=TopoDS::Edge(aEx); - TopExp::Vertices(aE, aV[0], aV[1]); - for (i=0; i<2; ++i) { - if (!aV[i].IsSame(aV000)) { - aV001=aV[i]; - bFound=!bFound; - break; - } - } - } - } - // - if (!bFound) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=8; // can not find reper V001 - return; - } - //DEB - //gp_Pnt aP000, aP001; - // - //aP000=BRep_Tool::Pnt(TopoDS::Vertex(aV000)); - //printf("*** aP000 { %lf, %lf, %lf }\n", aP000.X(), aP000.Y(), aP000.Z()); - //aP001=BRep_Tool::Pnt(TopoDS::Vertex(aV001)); - //printf("*** aP001 { %lf, %lf, %lf }\n", aP001.X(), aP001.Y(), aP001.Z()); - //DEB - // - aME.Clear(); - TopExp::MapShapes(myShape, TopAbs_SHELL, aME); - iNbE=aME.Extent(); - if (iNbE!=1) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=9; // number of shells in source shape !=1 - return; - } - // - // 2. Load Block - const TopoDS_Shell& aShell=TopoDS::Shell(aME(1)); - myBlock.Load(aShell, aV000, aV001); - iErr=myBlock.ErrorStatus(); - if (iErr) { - MESSAGE("StdMeshers_Penta_3D::MakeBlock() "); - myErrorStatus=100; // SMESHBlock: Load operation failed - return; - } -} -//======================================================================= -//function : CheckData -//purpose : -//======================================================================= -void StdMeshers_Penta_3D::CheckData() -{ - myErrorStatus=0; - // - int i, iNb; - int iNbEx[]={8, 12, 6}; - // - TopAbs_ShapeEnum aST; - TopAbs_ShapeEnum aSTEx[]={ - TopAbs_VERTEX, TopAbs_EDGE, TopAbs_FACE - }; - TopTools_IndexedMapOfShape aM; - // - if (myShape.IsNull()){ - MESSAGE("StdMeshers_Penta_3D::CheckData() "); - myErrorStatus=2; // null shape - return; - } - // - aST=myShape.ShapeType(); - if (!(aST==TopAbs_SOLID || aST==TopAbs_SHELL)) { - MESSAGE("StdMeshers_Penta_3D::CheckData() "); - myErrorStatus=3; // not compatible type of shape - return; - } - // - for (i=0; i<3; ++i) { - aM.Clear(); - TopExp::MapShapes(myShape, aSTEx[i], aM); - iNb=aM.Extent(); - if (iNb!=iNbEx[i]){ - MESSAGE("StdMeshers_Penta_3D::CheckData() "); - myErrorStatus=4; // number of subshape is not compatible - return; - } - } -} - -//======================================================================= -//function : LoadIJNodes -//purpose : Load nodes bound to theFace into column (vectors) and rows -// of theIJNodes. -// The value of theIJNodes map is a vector of ordered nodes so -// that the 0-the one lies on theBaseEdge. -// The key of theIJNodes map is a normalized parameter of each -// 0-the node on theBaseEdge. -//======================================================================= - -bool StdMeshers_Penta_3D::LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes, - const TopoDS_Face& theFace, - const TopoDS_Edge& theBaseEdge, - SMESHDS_Mesh* theMesh) -{ - // get vertices of theBaseEdge - TopoDS_Vertex vfb, vlb, vft; // first and last, bottom and top vertices - TopoDS_Edge eFrw = TopoDS::Edge( theBaseEdge.Oriented( TopAbs_FORWARD )); - TopExp::Vertices( eFrw, vfb, vlb ); - - // find the other edges of theFace and orientation of e1 - TopoDS_Edge e1, e2, eTop; - bool rev1, CumOri = false; - TopExp_Explorer exp( theFace, TopAbs_EDGE ); - int nbEdges = 0; - for ( ; exp.More(); exp.Next() ) - { - if ( ++nbEdges > 4 ) - return false; // more than 4 edges in theFace - TopoDS_Edge e = TopoDS::Edge( exp.Current() ); - if ( theBaseEdge.IsSame( e )) - continue; - TopoDS_Vertex vCommon; - if ( !TopExp::CommonVertex( theBaseEdge, e, vCommon )) - eTop = e; - else if ( vCommon.IsSame( vfb )) { - e1 = e; - vft = TopExp::LastVertex( e1, CumOri ); - rev1 = vfb.IsSame( vft ); - if ( rev1 ) - vft = TopExp::FirstVertex( e1, CumOri ); - } - else - e2 = e; - } - if ( nbEdges < 4 ) - return false; // lass than 4 edges in theFace - - // submeshes corresponding to shapes - SMESHDS_SubMesh* smFace = theMesh->MeshElements( theFace ); - SMESHDS_SubMesh* smb = theMesh->MeshElements( theBaseEdge ); - SMESHDS_SubMesh* smt = theMesh->MeshElements( eTop ); - SMESHDS_SubMesh* sm1 = theMesh->MeshElements( e1 ); - SMESHDS_SubMesh* sm2 = theMesh->MeshElements( e2 ); - SMESHDS_SubMesh* smVfb = theMesh->MeshElements( vfb ); - SMESHDS_SubMesh* smVlb = theMesh->MeshElements( vlb ); - SMESHDS_SubMesh* smVft = theMesh->MeshElements( vft ); - if (!smFace || !smb || !smt || !sm1 || !sm2 || !smVfb || !smVlb || !smVft ) { - MESSAGE( "NULL submesh " <NbNodes() != smt->NbNodes() || sm1->NbNodes() != sm2->NbNodes() ) { - MESSAGE(" Diff nb of nodes on opposite edges" ); - return false; - } - if (smVfb->NbNodes() != 1 || smVlb->NbNodes() != 1 || smVft->NbNodes() != 1) { - MESSAGE("Empty submesh of vertex"); - return false; - } - if ( sm1->NbNodes() * smb->NbNodes() != smFace->NbNodes() ) { - MESSAGE( "Wrong nb face nodes: " << - sm1->NbNodes()<<" "<NbNodes()<<" "<NbNodes()); - return false; - } - // IJ size - int vsize = sm1->NbNodes() + 2; - int hsize = smb->NbNodes() + 2; - - // load nodes from theBaseEdge - - set loadedNodes; - const SMDS_MeshNode* nullNode = 0; - - vector & nVecf = theIJNodes[ 0.]; - nVecf.resize( vsize, nullNode ); - loadedNodes.insert( nVecf[ 0 ] = smVfb->GetNodes()->next() ); - - vector & nVecl = theIJNodes[ 1.]; - nVecl.resize( vsize, nullNode ); - loadedNodes.insert( nVecl[ 0 ] = smVlb->GetNodes()->next() ); - - double f, l; - BRep_Tool::Range( eFrw, f, l ); - double range = l - f; - SMDS_NodeIteratorPtr nIt = smb->GetNodes(); - const SMDS_MeshNode* node; - while ( nIt->more() ) - { - node = nIt->next(); - const SMDS_EdgePosition* pos = - dynamic_cast( node->GetPosition().get() ); - if ( !pos ) return false; - double u = ( pos->GetUParameter() - f ) / range; - vector & nVec = theIJNodes[ u ]; - nVec.resize( vsize, nullNode ); - loadedNodes.insert( nVec[ 0 ] = node ); - } - if ( theIJNodes.size() != hsize ) { - MESSAGE( "Wrong node positions on theBaseEdge" ); - return false; - } - - // load nodes from e1 - - map< double, const SMDS_MeshNode*> sortedNodes; // sort by param on edge - nIt = sm1->GetNodes(); - while ( nIt->more() ) - { - node = nIt->next(); - const SMDS_EdgePosition* pos = - dynamic_cast( node->GetPosition().get() ); - if ( !pos ) return false; - sortedNodes.insert( make_pair( pos->GetUParameter(), node )); - } - loadedNodes.insert( nVecf[ vsize - 1 ] = smVft->GetNodes()->next() ); - map< double, const SMDS_MeshNode*>::iterator u_n = sortedNodes.begin(); - int row = rev1 ? vsize - 1 : 0; - for ( ; u_n != sortedNodes.end(); u_n++ ) - { - if ( rev1 ) row--; - else row++; - loadedNodes.insert( nVecf[ row ] = u_n->second ); - } - - // try to load the rest nodes - - // get all faces from theFace - set allFaces, foundFaces; - SMDS_ElemIteratorPtr eIt = smFace->GetElements(); - while ( eIt->more() ) { - const SMDS_MeshElement* e = eIt->next(); - if ( e->GetType() == SMDSAbs_Face ) - allFaces.insert( e ); - } - // Starting from 2 neighbour nodes on theBaseEdge, look for a face - // the nodes belong to, and between the nodes of the found face, - // look for a not loaded node considering this node to be the next - // in a column of the starting second node. Repeat, starting - // from nodes next to the previous starting nodes in their columns, - // and so on while a face can be found. Then go the the next pair - // of nodes on theBaseEdge. - StdMeshers_IJNodeMap::iterator par_nVec_1 = theIJNodes.begin(); - StdMeshers_IJNodeMap::iterator par_nVec_2 = par_nVec_1; - // loop on columns - int col = 0; - for ( par_nVec_2++; par_nVec_2 != theIJNodes.end(); par_nVec_1++, par_nVec_2++ ) - { - col++; - row = 0; - const SMDS_MeshNode* n1 = par_nVec_1->second[ row ]; - const SMDS_MeshNode* n2 = par_nVec_2->second[ row ]; - const SMDS_MeshElement* face = 0; - do { - // look for a face by 2 nodes - face = SMESH_MeshEditor::FindFaceInSet( n1, n2, allFaces, foundFaces ); - if ( face ) - { - int nbFaceNodes = face->NbNodes(); - if ( nbFaceNodes > 4 ) { - MESSAGE(" Too many nodes in a face: " << nbFaceNodes ); - return false; - } - // look for a not loaded node of the - bool found = false; - const SMDS_MeshNode* n3 = 0; // a node defferent from n1 and n2 - eIt = face->nodesIterator() ; - while ( !found && eIt->more() ) { - node = static_cast( eIt->next() ); - found = loadedNodes.insert( node ).second; - if ( !found && node != n1 && node != n2 ) - n3 = node; - } - if ( found ) { - if ( ++row > vsize - 1 ) { - MESSAGE( "Too many nodes in column "<< col <<": "<< row+1); - return false; - } - par_nVec_2->second[ row ] = node; - foundFaces.insert( face ); - n2 = node; - if ( nbFaceNodes == 4 ) - n1 = par_nVec_1->second[ row ]; - } - else if (nbFaceNodes == 3 && - n3 == par_nVec_1->second[ row ] ) - n1 = n3; - else { - MESSAGE( "Not quad mesh, column "<< col ); - return false; - } - } - } while ( face && n1 && n2 ); - - if ( row < vsize - 1 ) { - MESSAGE( "Too few nodes in column "<< col <<": "<< row+1); - MESSAGE( "Base node 1: "<< par_nVec_1->second[0]); - MESSAGE( "Base node 2: "<< par_nVec_2->second[0]); - MESSAGE( "Current node 1: "<< n1); - MESSAGE( "Current node 2: "<< n2); - MESSAGE( "first base node: "<< theIJNodes.begin()->second[0]); - MESSAGE( "last base node: "<< theIJNodes.rbegin()->second[0]); - return false; - } - } // loop on columns - - return true; -} - -////////////////////////////////////////////////////////////////////////// -// -// StdMeshers_SMESHBlock -// -////////////////////////////////////////////////////////////////////////// - -//======================================================================= -//function : StdMeshers_SMESHBlock -//purpose : -//======================================================================= -StdMeshers_SMESHBlock::StdMeshers_SMESHBlock() -{ - myErrorStatus=1; - myIsEdgeForward.resize( SMESH_Block::NbEdges(), -1 ); -} - -//======================================================================= -//function : IsForwadEdge -//purpose : -//======================================================================= - -bool StdMeshers_SMESHBlock::IsForwadEdge(const int theEdgeID) -{ - int index = myTBlock.ShapeIndex( theEdgeID ); - if ( !myTBlock.IsEdgeID( theEdgeID )) - return false; - - if ( myIsEdgeForward[ index ] < 0 ) - myIsEdgeForward[ index ] = - myTBlock.IsForwardEdge( TopoDS::Edge( Shape( theEdgeID )), myShapeIDMap ); - - return myIsEdgeForward[ index ]; -} - -//======================================================================= -//function : ErrorStatus -//purpose : -//======================================================================= -int StdMeshers_SMESHBlock::ErrorStatus() const -{ - return myErrorStatus; -} -//======================================================================= -//function : Load -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell) -{ - - TopoDS_Vertex aV000, aV001; - // - Load(theShell, aV000, aV001); -} -//======================================================================= -//function : Load -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell, - const TopoDS_Vertex& theV000, - const TopoDS_Vertex& theV001) -{ - myErrorStatus=0; - // - myShell=theShell; - // - bool bOk; - // - myShapeIDMap.Clear(); - bOk=myTBlock.LoadBlockShapes(myShell, theV000, theV001, myShapeIDMap); - if (!bOk) { - myErrorStatus=2; - return; - } -} -//======================================================================= -//function : ComputeParameters -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt, - gp_XYZ& theXYZ) -{ - ComputeParameters(thePnt, myShell, theXYZ); -} -//======================================================================= -//function : ComputeParameters -//purpose : -//======================================================================= -void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ) -{ - myErrorStatus=0; - // - int aID; - bool bOk; - // - aID=ShapeID(theShape); - if (myErrorStatus) { - return; - } - bOk=myTBlock.ComputeParameters(thePnt, theXYZ, aID); - if (!bOk) { - myErrorStatus=4; // problems with computation Parameters - return; - } -} - -//======================================================================= -//function : ComputeParameters -//purpose : -//======================================================================= - -void StdMeshers_SMESHBlock::ComputeParameters(const double& theU, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ) -{ - myErrorStatus=0; - // - int aID; - bool bOk=false; - // - aID=ShapeID(theShape); - if (myErrorStatus) { - return; - } - if ( SMESH_Block::IsEdgeID( aID )) - bOk=myTBlock.EdgeParameters( aID, theU, theXYZ ); - if (!bOk) { - myErrorStatus=4; // problems with computation Parameters - return; - } -} - -//======================================================================= -//function : Point -//purpose : -//======================================================================= - void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams, - gp_Pnt& aP3D) -{ - TopoDS_Shape aS; - // - Point(theParams, aS, aP3D); -} -//======================================================================= -//function : Point -//purpose : -//======================================================================= - void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams, - const TopoDS_Shape& theShape, - gp_Pnt& aP3D) -{ - myErrorStatus=0; - // - int aID; - bool bOk=false; - gp_XYZ aXYZ(99.,99.,99.); - aP3D.SetXYZ(aXYZ); - // - if (theShape.IsNull()) { - bOk=myTBlock.ShellPoint(theParams, aXYZ); - } - // - else { - aID=ShapeID(theShape); - if (myErrorStatus) { - return; - } - // - if (SMESH_Block::IsVertexID(aID)) { - bOk=myTBlock.VertexPoint(aID, aXYZ); - } - else if (SMESH_Block::IsEdgeID(aID)) { - bOk=myTBlock.EdgePoint(aID, theParams, aXYZ); - } - // - else if (SMESH_Block::IsFaceID(aID)) { - bOk=myTBlock.FacePoint(aID, theParams, aXYZ); - } - } - if (!bOk) { - myErrorStatus=4; // problems with point computation - return; - } - aP3D.SetXYZ(aXYZ); -} -//======================================================================= -//function : ShapeID -//purpose : -//======================================================================= -int StdMeshers_SMESHBlock::ShapeID(const TopoDS_Shape& theShape) -{ - myErrorStatus=0; - // - int aID=-1; - TopoDS_Shape aSF, aSR; - // - aSF=theShape; - aSF.Orientation(TopAbs_FORWARD); - aSR=theShape; - aSR.Orientation(TopAbs_REVERSED); - // - if (myShapeIDMap.Contains(aSF)) { - aID=myShapeIDMap.FindIndex(aSF); - return aID; - } - if (myShapeIDMap.Contains(aSR)) { - aID=myShapeIDMap.FindIndex(aSR); - return aID; - } - myErrorStatus=2; // unknown shape; - return aID; -} -//======================================================================= -//function : Shape -//purpose : -//======================================================================= -const TopoDS_Shape& StdMeshers_SMESHBlock::Shape(const int theID) -{ - myErrorStatus=0; - // - int aNb; - // - aNb=myShapeIDMap.Extent(); - if (theID<1 || theID>aNb) { - myErrorStatus=3; // ID is out of range - return myEmptyShape; - } - // - const TopoDS_Shape& aS=myShapeIDMap.FindKey(theID); - return aS; -} diff --git a/src/StdMeshers/StdMeshers_Penta_3D.hxx b/src/StdMeshers/StdMeshers_Penta_3D.hxx deleted file mode 100644 index dc8ba72cf..000000000 --- a/src/StdMeshers/StdMeshers_Penta_3D.hxx +++ /dev/null @@ -1,256 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Penta_3D.hxx -// Module : SMESH - -#ifndef StdMeshers_Penta_3D_HeaderFile -#define StdMeshers_Penta_3D_HeaderFile - -#include - -//////////////////////////////////////////////////////////////////////// -// -// class StdMeshers_SMESHBlock -// -//////////////////////////////////////////////////////////////////////// -#include -#include -#include -#include -#include - -#include "SMESH_Block.hxx" - -typedef std::map< double, std::vector > StdMeshers_IJNodeMap; - -class StdMeshers_SMESHBlock { - -public: - // - StdMeshers_SMESHBlock(); - - void Load (const TopoDS_Shell& theShell); - - void Load (const TopoDS_Shell& theShell, - const TopoDS_Vertex& theV000, - const TopoDS_Vertex& theV001); - - void ComputeParameters(const gp_Pnt& thePnt, - gp_XYZ& theXYZ); - - void ComputeParameters(const gp_Pnt& thePnt, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ); - - void ComputeParameters(const double& theU, - const TopoDS_Shape& theShape, - gp_XYZ& theXYZ); - - void Point(const gp_XYZ& theParams, - gp_Pnt& thePnt); - - void Point(const gp_XYZ& theParams, - const TopoDS_Shape& theShape, - gp_Pnt& thePnt); - - int ShapeID(const TopoDS_Shape& theShape); - - const TopoDS_Shape& Shape(const int theID); - - SMESH_Block & Block() { return myTBlock; } - - bool IsForwadEdge(const int theEdgeID); - - int ErrorStatus() const; - - -protected: - TopoDS_Shell myShell; - TopTools_IndexedMapOfOrientedShape myShapeIDMap; - SMESH_Block myTBlock; - TopoDS_Shape myEmptyShape; - vector myIsEdgeForward; - // - int myErrorStatus; -}; - -//////////////////////////////////////////////////////////////////////// -// -// class StdMeshers_TNode -// -//////////////////////////////////////////////////////////////////////// -#include "SMDS_MeshNode.hxx" - -class StdMeshers_TNode { - -public: - - StdMeshers_TNode(){ - myNode=NULL; - myXYZ.SetCoord(99., 99., 99.); - myShapeSupportID=-1; - myBaseNodeID=-1; - } - - void SetNode(const SMDS_MeshNode* theNode) { - myNode=(SMDS_MeshNode*) theNode; - } - - const SMDS_MeshNode* Node()const { - return myNode; - } - - void SetShapeSupportID (const int theID) { - myShapeSupportID=theID; - } - - int ShapeSupportID()const { - return myShapeSupportID; - } - - void SetNormCoord (const gp_XYZ& theXYZ) { - myXYZ=theXYZ; - } - - const gp_XYZ& NormCoord ()const{ - return myXYZ; - } - - void SetBaseNodeID (const int theID) { - myBaseNodeID=theID; - } - - int BaseNodeID ()const{ - return myBaseNodeID; - } - -private: - SMDS_MeshNode* myNode; - int myShapeSupportID; - gp_XYZ myXYZ; - int myBaseNodeID; -}; - -//////////////////////////////////////////////////////////////////////// -// -// class StdMeshers_Penta_3D -// -//////////////////////////////////////////////////////////////////////// -#include "SMESH_Mesh.hxx" -#include -// -class StdMeshers_Penta_3D { -// - public: // methods - StdMeshers_Penta_3D(); - - //~StdMeshers_Penta_3D(); - - bool Compute(SMESH_Mesh& , const TopoDS_Shape& ); - - int ErrorStatus() const { - return myErrorStatus; - } - - void SetTolerance(const double theTol3D) { - myTol3D=theTol3D; - } - - double Tolerance() const { - return myTol3D; - } - - static bool LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes, - const TopoDS_Face& theFace, - const TopoDS_Edge& theBaseEdge, - SMESHDS_Mesh* theMesh); - // Load nodes bound to theFace into column (vectors) and rows - // of theIJNodes. - // The value of theIJNodes map is a vector of ordered nodes so - // that the 0-the one lies on theBaseEdge. - // The key of theIJNodes map is a normalized parameter of each - // 0-the node on theBaseEdge. - - - protected: // methods - - void CheckData(); - - void MakeBlock(); - - void MakeNodes(); - - double SetHorizEdgeXYZ(const gp_XYZ& aBNXYZ, - const int aFaceID, - vector*& aCol1, - vector*& aCol2); - - void ShapeSupportID(const bool theIsUpperLayer, - const SMESH_Block::TShapeID theBNSSID, - SMESH_Block::TShapeID& theSSID); - - void FindNodeOnShape(const TopoDS_Shape& aS, - const gp_XYZ& aParams, - const int z, - StdMeshers_TNode& aTN); - - void CreateNode(const bool theIsUpperLayer, - const gp_XYZ& aParams, - StdMeshers_TNode& aTN); - - void ClearMeshOnFxy1(); - - void MakeMeshOnFxy1(); - - void MakeConnectingMap(); - - int GetIndexOnLayer(const int aID); - - void MakeVolumeMesh(); - - void SetMesh(SMESH_Mesh& theMesh) { - myMesh=(void *)&theMesh; - } - - SMESH_Mesh* GetMesh()const { - return (SMESH_Mesh*)myMesh; - } - - protected: // fields - TopoDS_Shape myShape; - StdMeshers_SMESHBlock myBlock; - void * myMesh; - int myErrorStatus; - // - vector myTNodes; - int myISize; - int myJSize; - double myTol3D; // Tolerance value - std::map < int, int > myConnectingMap; - // - vector myWallNodesMaps; // nodes on a face - vector myShapeXYZ; // point on each sub-shape -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_Propagation.cxx b/src/StdMeshers/StdMeshers_Propagation.cxx deleted file mode 100644 index f314b4c28..000000000 --- a/src/StdMeshers/StdMeshers_Propagation.cxx +++ /dev/null @@ -1,102 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation.cxx -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Propagation.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * - */ -//============================================================================= -StdMeshers_Propagation::StdMeshers_Propagation (int hypId, int studyId, - SMESH_Gen * gen) - : SMESH_Hypothesis(hypId, studyId, gen) -{ - _name = GetName(); - _param_algo_dim = -2; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -StdMeshers_Propagation::~StdMeshers_Propagation() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_Propagation::SaveTo (ostream & save) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -istream & StdMeshers_Propagation::LoadFrom (istream & load) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -ostream & operator << (ostream & save, StdMeshers_Propagation & hyp) -{ - return hyp.SaveTo(save); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -istream & operator >> (istream & load, StdMeshers_Propagation & hyp) -{ - return hyp.LoadFrom(load); -} - -//============================================================================= -/*! - * GetName - */ -//============================================================================= -std::string StdMeshers_Propagation::GetName () -{ - return "Propagation"; -} diff --git a/src/StdMeshers/StdMeshers_Propagation.hxx b/src/StdMeshers/StdMeshers_Propagation.hxx deleted file mode 100644 index 4ee7c5628..000000000 --- a/src/StdMeshers/StdMeshers_Propagation.hxx +++ /dev/null @@ -1,47 +0,0 @@ -// SMESH SMESH : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESH_PROPAGATION_HXX_ -#define _SMESH_PROPAGATION_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_Propagation:public SMESH_Hypothesis -{ - public: - StdMeshers_Propagation(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_Propagation(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_Propagation & hyp); - friend istream & operator >>(istream & load, StdMeshers_Propagation & hyp); - - static std::string GetName (); -}; - -#endif diff --git a/src/StdMeshers/StdMeshers_StartEndLength.cxx b/src/StdMeshers/StdMeshers_StartEndLength.cxx deleted file mode 100644 index 1d7016206..000000000 --- a/src/StdMeshers/StdMeshers_StartEndLength.cxx +++ /dev/null @@ -1,143 +0,0 @@ -// SMESH StdMeshers_StartEndLength : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_StartEndLength.cxx -// Module : SMESH -// $Header$ - -using namespace std; - -#include "StdMeshers_StartEndLength.hxx" -#include "utilities.h" - - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_StartEndLength::StdMeshers_StartEndLength(int hypId, - int studyId, - SMESH_Gen * gen) - :SMESH_Hypothesis(hypId, studyId, gen) -{ - _begLength = 1.; - _endLength = 1.; - _name = "StartEndLength"; - _param_algo_dim = 1; // is used by SMESH_Regular_1D -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_StartEndLength::~StdMeshers_StartEndLength() -{ -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void StdMeshers_StartEndLength::SetLength(double length, bool isStartLength) - throw(SALOME_Exception) -{ - if ( (isStartLength ? _begLength : _endLength) != length ) { - if (length <= 0) - throw SALOME_Exception(LOCALIZED("length must be positive")); - if ( isStartLength ) - _begLength = length; - else - _endLength = length; - - NotifySubMeshesHypothesisModification(); - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -double StdMeshers_StartEndLength::GetLength(bool isStartLength) const -{ - return isStartLength ? _begLength : _endLength; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & StdMeshers_StartEndLength::SaveTo(ostream & save) -{ - save << _begLength << " " <<_endLength; - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & StdMeshers_StartEndLength::LoadFrom(istream & load) -{ - bool isOK = true; - isOK = (load >> _begLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - isOK = (load >> _endLength); - if (!isOK) - load.clear(ios::badbit | load.rdstate()); - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, StdMeshers_StartEndLength & hyp) -{ - return hyp.SaveTo( save ); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, StdMeshers_StartEndLength & hyp) -{ - return hyp.LoadFrom( load ); -} diff --git a/src/StdMeshers/StdMeshers_StartEndLength.hxx b/src/StdMeshers/StdMeshers_StartEndLength.hxx deleted file mode 100644 index 05bd2e0bb..000000000 --- a/src/StdMeshers/StdMeshers_StartEndLength.hxx +++ /dev/null @@ -1,53 +0,0 @@ -// SMESH StdMeshers : implementaion of SMESH idl descriptions -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_StartEndLength.hxx -// Module : SMESH -// $Header$ - -#ifndef _STDMESHERS_STARTENDLENGTH_HXX_ -#define _STDMESHERS_STARTENDLENGTH_HXX_ - -#include "SMESH_Hypothesis.hxx" -#include "Utils_SALOME_Exception.hxx" - -class StdMeshers_StartEndLength:public SMESH_Hypothesis -{ - public: - StdMeshers_StartEndLength(int hypId, int studyId, SMESH_Gen * gen); - virtual ~ StdMeshers_StartEndLength(); - - void SetLength(double length, bool isStartLength) throw(SALOME_Exception); - - double GetLength(bool isStartLength) const; - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, StdMeshers_StartEndLength & hyp); - friend istream & operator >>(istream & load, StdMeshers_StartEndLength & hyp); - - protected: - double _begLength, _endLength; -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx b/src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx deleted file mode 100644 index 090f0a7d2..000000000 --- a/src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx +++ /dev/null @@ -1,66 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Arithmetic1D_i.hxx -// Author : Damien COQUERET, OCC -// Module : SMESH -// $Header$ - -#ifndef _SMESH_ARITHMETIC1D_I_HXX_ -#define _SMESH_ARITHMETIC1D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_Arithmetic1D.hxx" - -// ====================================================== -// Arithmetic 1D hypothesis -// ====================================================== -class StdMeshers_Arithmetic1D_i: - public virtual POA_StdMeshers::StdMeshers_Arithmetic1D, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_Arithmetic1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_Arithmetic1D_i(); - - // Set length - void SetLength( CORBA::Double theLength, CORBA::Boolean theIsStart ) - throw ( SALOME::SALOME_Exception ); - // Get length - CORBA::Double GetLength(CORBA::Boolean theIsStart); - - // Get implementation - ::StdMeshers_Arithmetic1D* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx b/src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx deleted file mode 100644 index 138b1d9cf..000000000 --- a/src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Deflection1D_i.hxx -// Moved here from SMESH_LocalLength_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_Deflection1D_I_HXX_ -#define _SMESH_Deflection1D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_Deflection1D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Local Length hypothesis -// ====================================================== -class StdMeshers_Deflection1D_i: - public virtual POA_StdMeshers::StdMeshers_Deflection1D, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_Deflection1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_Deflection1D_i(); - - // Set deflection - void SetDeflection( CORBA::Double theLength ) - throw ( SALOME::SALOME_Exception ); - // Get deflection - CORBA::Double GetDeflection(); - - // Get implementation - ::StdMeshers_Deflection1D* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx b/src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx deleted file mode 100644 index 0ca4839ba..000000000 --- a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx +++ /dev/null @@ -1,84 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Hexa_3D_i.cxx -// Moved here from SMESH_Hexa_3D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Hexa_3D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_3D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i" ); - myBaseImpl = new ::StdMeshers_Hexa_3D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i() -{ - MESSAGE( "StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Hexa_3D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_Hexa_3D* StdMeshers_Hexa_3D_i::GetImpl() -{ - MESSAGE( "StdMeshers_Hexa_3D_i::GetImpl" ); - return ( ::StdMeshers_Hexa_3D* )myBaseImpl; -} diff --git a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx b/src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx deleted file mode 100644 index 91bcabdb8..000000000 --- a/src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Hexa_3D_i.hxx -// Moved here from SMESH_Hexa_3D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_HEXA_3D_I_HXX_ -#define _SMESH_HEXA_3D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_3D_Algo_i.hxx" -#include "StdMeshers_Hexa_3D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Hexaedron 3d algorithm -// ====================================================== -class StdMeshers_Hexa_3D_i: - public virtual POA_StdMeshers::StdMeshers_Hexa_3D, - public virtual SMESH_3D_Algo_i -{ -public: - // Constructor - StdMeshers_Hexa_3D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - - // Destructor - virtual ~StdMeshers_Hexa_3D_i(); - - // Get implementation - ::StdMeshers_Hexa_3D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx b/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx deleted file mode 100644 index 35d871c56..000000000 --- a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx +++ /dev/null @@ -1,135 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_LengthFromEdges_i.cxx -// Moved here from SMESH_LengthFromEdges_i.cxx -// Author : Nadir BOUHAMOU CEA/DEN, Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_LengthFromEdges_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i" ); - myBaseImpl = new ::StdMeshers_LengthFromEdges( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i() -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i" ); -} - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::SetMode - * - * Set mode - */ -//============================================================================= - -void StdMeshers_LengthFromEdges_i::SetMode( CORBA::Long theMode ) - throw (SALOME::SALOME_Exception) -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::SetMode" ); - ASSERT( myBaseImpl ); - try { - this->GetImpl()->SetMode( theMode ); - } - catch ( SALOME_Exception& S_ex ) { - THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), - SALOME::BAD_PARAM ); - } -} - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::GetMode - * - * Get mode - */ -//============================================================================= - -CORBA::Long StdMeshers_LengthFromEdges_i::GetMode() -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::GetMode" ); - ASSERT( myBaseImpl ); - return this->GetImpl()->GetMode(); -} - - -//============================================================================= -/*! - * StdMeshers_LengthFromEdges_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_LengthFromEdges* StdMeshers_LengthFromEdges_i::GetImpl() -{ - MESSAGE( "StdMeshers_LengthFromEdges_i::GetImpl" ); - return ( ::StdMeshers_LengthFromEdges* )myBaseImpl; -} - -//================================================================================ -/*! - * \brief Verify whether hypothesis supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean StdMeshers_LengthFromEdges_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_2D; -} - diff --git a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx b/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx deleted file mode 100644 index 1075278d7..000000000 --- a/src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx +++ /dev/null @@ -1,68 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_LengthFromEdges_i.hxx -// Moved here from SMESH_LengthFromEdges_i.hxx -// Author : Nadir BOUHAMOU CEA/DEN, Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LENGTHFROMEDGES_I_HXX_ -#define _SMESH_LENGTHFROMEDGES_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_LengthFromEdges.hxx" - -// ====================================================== -// Length from edges hypothesis -// ====================================================== -class StdMeshers_LengthFromEdges_i: - public virtual POA_StdMeshers::StdMeshers_LengthFromEdges, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_LengthFromEdges_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_LengthFromEdges_i(); - - // Set mode - void SetMode( CORBA::Long theMode ) - throw ( SALOME::SALOME_Exception ); - // Get mode - CORBA::Long GetMode(); - - // Get implementation - ::StdMeshers_LengthFromEdges* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_LocalLength_i.hxx b/src/StdMeshers_I/StdMeshers_LocalLength_i.hxx deleted file mode 100644 index f0b6b21e6..000000000 --- a/src/StdMeshers_I/StdMeshers_LocalLength_i.hxx +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_LocalLength_i.hxx -// Moved here from SMESH_LocalLength_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_LOCALLENGTH_I_HXX_ -#define _SMESH_LOCALLENGTH_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_LocalLength.hxx" - -class SMESH_Gen; - -// ====================================================== -// Local Length hypothesis -// ====================================================== -class StdMeshers_LocalLength_i: - public virtual POA_StdMeshers::StdMeshers_LocalLength, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_LocalLength_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_LocalLength_i(); - - // Set length - void SetLength( CORBA::Double theLength ) - throw ( SALOME::SALOME_Exception ); - // Get length - CORBA::Double GetLength(); - - // Get implementation - ::StdMeshers_LocalLength* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx b/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx deleted file mode 100644 index efcc37c5c..000000000 --- a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MEFISTO_2D_i.cxx -// Moved here from SMESH_MEFISTO_2D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_MEFISTO_2D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_2D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i" ); - myBaseImpl = new ::StdMeshers_MEFISTO_2D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i() -{ - MESSAGE( "StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_MEFISTO_2D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_MEFISTO_2D* StdMeshers_MEFISTO_2D_i::GetImpl() -{ - MESSAGE( "StdMeshers_MEFISTO_2D_i::GetImpl" ); - return ( ::StdMeshers_MEFISTO_2D* )myBaseImpl; -} - diff --git a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx b/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx deleted file mode 100644 index d7021df8a..000000000 --- a/src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MEFISTO_2D_i.hxx -// Moved here from SMESH_MEFISTO_2D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_MEFISTO_2D_I_HXX_ -#define _StdMeshers_MEFISTO_2D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_2D_Algo_i.hxx" -#include "StdMeshers_MEFISTO_2D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Triangle (MEFISTO) 2d algorithm -// ====================================================== -class StdMeshers_MEFISTO_2D_i: - public virtual POA_StdMeshers::StdMeshers_MEFISTO_2D, - public virtual SMESH_2D_Algo_i -{ -public: - // Constructor - StdMeshers_MEFISTO_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - - // Destructor - virtual ~StdMeshers_MEFISTO_2D_i(); - - // Get implementation - ::StdMeshers_MEFISTO_2D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx b/src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx deleted file mode 100644 index 39dde7639..000000000 --- a/src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MaxElementArea_i.hxx -// Moved here from SMESH_MaxElementArea_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTAREA_I_HXX_ -#define _SMESH_MAXELEMENTAREA_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_MaxElementArea.hxx" - -// ====================================================== -// Maximum Element Area hypothesis -// ====================================================== -class StdMeshers_MaxElementArea_i: - public virtual POA_StdMeshers::StdMeshers_MaxElementArea, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_MaxElementArea_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_MaxElementArea_i(); - - // Set maximum element area - void SetMaxElementArea( CORBA::Double theArea ) - throw ( SALOME::SALOME_Exception ); - // Get maximum element area - CORBA::Double GetMaxElementArea(); - - // Get implementation - ::StdMeshers_MaxElementArea* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx b/src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx deleted file mode 100644 index 928fab59a..000000000 --- a/src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx +++ /dev/null @@ -1,67 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_MaxElementVolume_i.hxx -// Moved here from SMESH_MaxElementVolume_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_MAXELEMENTVOLUME_I_HXX_ -#define _SMESH_MAXELEMENTVOLUME_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_MaxElementVolume.hxx" - -// ====================================================== -// Maximum Element Volume hypothesis -// ====================================================== -class StdMeshers_MaxElementVolume_i: - public virtual POA_StdMeshers::StdMeshers_MaxElementVolume, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_MaxElementVolume_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_MaxElementVolume_i(); - - // Set maximum element volume - void SetMaxElementVolume( CORBA::Double theVolume ) - throw (SALOME::SALOME_Exception); - // Get maximum element volume - CORBA::Double GetMaxElementVolume(); - - // Get implementation - ::StdMeshers_MaxElementVolume* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx b/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx deleted file mode 100644 index 8940cf7a7..000000000 --- a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx +++ /dev/null @@ -1,81 +0,0 @@ -// SMESH StdMeshers_I : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_NotConformAllowed_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -using namespace std; -#include "StdMeshers_NotConformAllowed_i.hxx" -#include "SMESH_Gen.hxx" - -#include "utilities.h" - -//============================================================================= -/*! - * Constructor: - * _name is related to the class name: prefix = SMESH_ ; suffix = _i . - */ -//============================================================================= - -StdMeshers_NotConformAllowed_i::StdMeshers_NotConformAllowed_i - (PortableServer::POA_ptr thePOA, - int studyId, - ::SMESH_Gen* genImpl) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE("StdMeshers_NotConformAllowed_i::StdMeshers_NotConformAllowed_i"); - myBaseImpl = new ::StdMeshers_NotConformAllowed(genImpl->GetANewId(), - studyId, - genImpl); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -StdMeshers_NotConformAllowed_i::~StdMeshers_NotConformAllowed_i() -{ -} - -//================================================================================ -/*! - * \brief Verify whether hypothesis supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean StdMeshers_NotConformAllowed_i::IsDimSupported( SMESH::Dimension /*type*/ ) -{ - return true; -} - - - diff --git a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx b/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx deleted file mode 100644 index ceddb3287..000000000 --- a/src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx +++ /dev/null @@ -1,57 +0,0 @@ -// SMESH StdMeshers_I : idl implementation based on 'SMESH' unit's classes -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_NotConformAllowed_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _StdMeshers_NotConformAllowed_I_HXX_ -#define _StdMeshers_NotConformAllowed_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" - -#include "StdMeshers_NotConformAllowed.hxx" - -class StdMeshers_NotConformAllowed_i: - public POA_StdMeshers::StdMeshers_NotConformAllowed, - public SMESH_Hypothesis_i -{ -public: - StdMeshers_NotConformAllowed_i(PortableServer::POA_ptr thePOA, - int studyId, - ::SMESH_Gen* genImpl); - virtual ~StdMeshers_NotConformAllowed_i(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); - -protected: - ::StdMeshers_NotConformAllowed* _impl; -}; - -#endif - diff --git a/src/StdMeshers_I/StdMeshers_Propagation_i.cxx b/src/StdMeshers_I/StdMeshers_Propagation_i.cxx deleted file mode 100644 index 4e038748c..000000000 --- a/src/StdMeshers_I/StdMeshers_Propagation_i.cxx +++ /dev/null @@ -1,91 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation_i.cxx -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Propagation_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Propagation_i::StdMeshers_Propagation_i - * - * Constructor - */ -//============================================================================= -StdMeshers_Propagation_i::StdMeshers_Propagation_i (PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ) -{ - MESSAGE( "StdMeshers_Propagation_i::StdMeshers_Propagation_i" ); - myBaseImpl = new ::StdMeshers_Propagation(theGenImpl->GetANewId(), - theStudyId, - theGenImpl); -} - -//============================================================================= -/*! - * StdMeshers_Propagation_i::~StdMeshers_Propagation_i - * - * Destructor - */ -//============================================================================= -StdMeshers_Propagation_i::~StdMeshers_Propagation_i() -{ - MESSAGE( "StdMeshers_Propagation_i::~StdMeshers_Propagation_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Propagation_i::GetImpl - * - * Get implementation - */ -//============================================================================= -::StdMeshers_Propagation* StdMeshers_Propagation_i::GetImpl() -{ - MESSAGE( "StdMeshers_Propagation_i::GetImpl" ); - return ( ::StdMeshers_Propagation* )myBaseImpl; -} - -//================================================================================ -/*! - * \brief Verify whether hypothesis supports given entity type - * \param type - dimension (see SMESH::Dimension enumeration) - * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise - * - * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration) - */ -//================================================================================ -CORBA::Boolean StdMeshers_Propagation_i::IsDimSupported( SMESH::Dimension type ) -{ - return type == SMESH::DIM_1D; -} - diff --git a/src/StdMeshers_I/StdMeshers_Propagation_i.hxx b/src/StdMeshers_I/StdMeshers_Propagation_i.hxx deleted file mode 100644 index ca130bc2f..000000000 --- a/src/StdMeshers_I/StdMeshers_Propagation_i.hxx +++ /dev/null @@ -1,60 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 CEA -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Propagation_i.hxx -// Module : SMESH -// $Header$ - -#ifndef _SMESH_PROPAGATION_I_HXX_ -#define _SMESH_PROPAGATION_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_Propagation.hxx" - -class SMESH_Gen; - -// ====================================================== -// Propagation hypothesis -// ====================================================== -class StdMeshers_Propagation_i: - public virtual POA_StdMeshers::StdMeshers_Propagation, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_Propagation_i (PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl); - // Destructor - virtual ~StdMeshers_Propagation_i(); - - // Get implementation - ::StdMeshers_Propagation* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx b/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx deleted file mode 100644 index 059eac91f..000000000 --- a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx +++ /dev/null @@ -1,86 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Quadrangle_2D_i.cxx -// Moved here from SMESH_Quadrangle_2D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Quadrangle_2D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_2D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i" ); - myBaseImpl = new ::StdMeshers_Quadrangle_2D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i - * - * Destructor - * - */ -//============================================================================= - -StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i() -{ - MESSAGE( "StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Quadrangle_2D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_Quadrangle_2D* StdMeshers_Quadrangle_2D_i::GetImpl() -{ - MESSAGE( "StdMeshers_Quadrangle_2D_i::GetImpl" ); - return ( ::StdMeshers_Quadrangle_2D* )myBaseImpl; -} - diff --git a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx b/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx deleted file mode 100644 index a8c1e281f..000000000 --- a/src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx +++ /dev/null @@ -1,61 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Quadrangle_2D_i.hxx -// Moved here from SMESH_Quadrangle_2D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_QUADRANGLE_2D_I_HXX_ -#define _SMESH_QUADRANGLE_2D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_2D_Algo_i.hxx" -#include "StdMeshers_Quadrangle_2D.hxx" - -class SMESH_Gen; - -// ====================================================== -// Quadrangle (Mapping) 2d algorithm -// ====================================================== -class StdMeshers_Quadrangle_2D_i: - public virtual POA_StdMeshers::StdMeshers_Quadrangle_2D, - public virtual SMESH_2D_Algo_i -{ -public: - // Constructor - StdMeshers_Quadrangle_2D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - - // Destructor - virtual ~StdMeshers_Quadrangle_2D_i(); - - // Get implementation - ::StdMeshers_Quadrangle_2D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx b/src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx deleted file mode 100644 index 24f322c58..000000000 --- a/src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx +++ /dev/null @@ -1,85 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Regular_1D_i.cxx -// Moved here from SMESH_Regular_1D_i.cxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -using namespace std; -#include "StdMeshers_Regular_1D_i.hxx" -#include "SMESH_Gen.hxx" - -#include "Utils_CorbaException.hxx" -#include "utilities.h" - -//============================================================================= -/*! - * StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i - * - * Constructor - */ -//============================================================================= - -StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ) - : SALOME::GenericObj_i( thePOA ), - SMESH_Hypothesis_i( thePOA ), - SMESH_Algo_i( thePOA ), - SMESH_1D_Algo_i( thePOA ) -{ - MESSAGE( "StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i" ); - myBaseImpl = new ::StdMeshers_Regular_1D( theGenImpl->GetANewId(), - theStudyId, - theGenImpl ); -} - -//============================================================================= -/*! - * StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i - * - * Destructor - */ -//============================================================================= - -StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i() -{ - MESSAGE( "StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i" ); -} - -//============================================================================= -/*! - * StdMeshers_Regular_1D_i::GetImpl - * - * Get implementation - */ -//============================================================================= - -::StdMeshers_Regular_1D* StdMeshers_Regular_1D_i::GetImpl() -{ - MESSAGE( "StdMeshers_Regular_1D_i::GetImpl" ); - return ( ::StdMeshers_Regular_1D* )myBaseImpl; -} - diff --git a/src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx b/src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx deleted file mode 100644 index 3231532fd..000000000 --- a/src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx +++ /dev/null @@ -1,58 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_Regular_1D_i.hxx -// Moved here from SMESH_Regular_1D_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_REGULAR_1D_I_HXX_ -#define _SMESH_REGULAR_1D_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_1D_Algo_i.hxx" -#include "StdMeshers_Regular_1D.hxx" - -// ====================================================== -// Wire Discretization 1d algorithm -// ====================================================== -class StdMeshers_Regular_1D_i: - public virtual POA_StdMeshers::StdMeshers_Regular_1D, - public virtual SMESH_1D_Algo_i -{ -public: - // Constructor - StdMeshers_Regular_1D_i( PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_Regular_1D_i(); - - // Get implementation - ::StdMeshers_Regular_1D* GetImpl(); -}; - -#endif diff --git a/src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx b/src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx deleted file mode 100644 index d937f9390..000000000 --- a/src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx +++ /dev/null @@ -1,70 +0,0 @@ -// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses -// -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// -// -// File : StdMeshers_StartEndLength_i.hxx -// Moved here from SMESH_LocalLength_i.hxx -// Author : Paul RASCLE, EDF -// Module : SMESH -// $Header$ - -#ifndef _SMESH_StartEndLength_I_HXX_ -#define _SMESH_StartEndLength_I_HXX_ - -#include -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) - -#include "SMESH_Hypothesis_i.hxx" -#include "StdMeshers_StartEndLength.hxx" - -class SMESH_Gen; - -// ====================================================== -// Local Length hypothesis -// ====================================================== -class StdMeshers_StartEndLength_i: - public virtual POA_StdMeshers::StdMeshers_StartEndLength, - public virtual SMESH_Hypothesis_i -{ -public: - // Constructor - StdMeshers_StartEndLength_i(PortableServer::POA_ptr thePOA, - int theStudyId, - ::SMESH_Gen* theGenImpl ); - // Destructor - virtual ~StdMeshers_StartEndLength_i(); - - // Set length - void SetLength( CORBA::Double theLength, CORBA::Boolean theIsStart ) - throw ( SALOME::SALOME_Exception ); - // Get length - CORBA::Double GetLength(CORBA::Boolean theIsStart); - - // Get implementation - ::StdMeshers_StartEndLength* GetImpl(); - - // Verify whether hypothesis supports given entity type - CORBA::Boolean IsDimSupported( SMESH::Dimension type ); -}; - -#endif - -- 2.39.2