From 0a023b75d747476690c29fb474413bbb9ef17cf7 Mon Sep 17 00:00:00 2001 From: azv Date: Thu, 20 May 2021 12:43:14 +0300 Subject: [PATCH 1/1] Issue #20641: Tests for implemented features --- .../Test/TestCreateShapesFromGroups.py | 114 ++++++++++++++++++ src/CollectionPlugin/tests.set | 1 + src/ConnectorAPI/Test/CMakeLists.txt | 1 + src/ConnectorAPI/Test/TestImportSTL.py | 84 +++++++++++++ src/ConnectorAPI/Test/data/cube_ascii.stl | 86 +++++++++++++ src/ConnectorAPI/Test/data/cube_binary.stl | Bin 0 -> 684 bytes src/ConnectorAPI/Test/tests.set | 1 + src/ExchangePlugin/CMakeLists.txt | 21 +--- src/ExchangePlugin/Test/CMakeLists.txt | 65 ++++++++++ .../{ => Test}/CTestTestfileInstall.cmake | 3 + src/ExchangePlugin/Test/TestImportImage_1.py | 99 +++++++++++++++ src/ExchangePlugin/Test/TestImportImage_2.py | 105 ++++++++++++++++ src/ExchangePlugin/Test/data/1.jpg | Bin 0 -> 60324 bytes src/ExchangePlugin/Test/data/2.png | Bin 0 -> 21146 bytes src/ExchangePlugin/Test/testme.py | 74 ++++++++++++ src/ExchangePlugin/{ => Test}/tests.set | 0 src/ExchangePlugin/Test/tests_gui.set | 23 ++++ 17 files changed, 657 insertions(+), 20 deletions(-) create mode 100755 src/CollectionPlugin/Test/TestCreateShapesFromGroups.py mode change 100644 => 100755 src/CollectionPlugin/tests.set mode change 100644 => 100755 src/ConnectorAPI/Test/CMakeLists.txt create mode 100755 src/ConnectorAPI/Test/TestImportSTL.py create mode 100755 src/ConnectorAPI/Test/data/cube_ascii.stl create mode 100755 src/ConnectorAPI/Test/data/cube_binary.stl mode change 100644 => 100755 src/ConnectorAPI/Test/tests.set mode change 100644 => 100755 src/ExchangePlugin/CMakeLists.txt create mode 100755 src/ExchangePlugin/Test/CMakeLists.txt rename src/ExchangePlugin/{ => Test}/CTestTestfileInstall.cmake (93%) mode change 100644 => 100755 create mode 100755 src/ExchangePlugin/Test/TestImportImage_1.py create mode 100755 src/ExchangePlugin/Test/TestImportImage_2.py create mode 100755 src/ExchangePlugin/Test/data/1.jpg create mode 100755 src/ExchangePlugin/Test/data/2.png create mode 100755 src/ExchangePlugin/Test/testme.py rename src/ExchangePlugin/{ => Test}/tests.set (100%) mode change 100644 => 100755 create mode 100755 src/ExchangePlugin/Test/tests_gui.set diff --git a/src/CollectionPlugin/Test/TestCreateShapesFromGroups.py b/src/CollectionPlugin/Test/TestCreateShapesFromGroups.py new file mode 100755 index 000000000..b68df3711 --- /dev/null +++ b/src/CollectionPlugin/Test/TestCreateShapesFromGroups.py @@ -0,0 +1,114 @@ +# Copyright (C) 2021 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it 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 +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +from salome.shaper import model + +model.begin() +partSet = model.moduleDocument() + +### Create Part +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +### Create Box +Box_1 = model.addBox(Part_1_doc, 10, 10, 1) + +### Create RevolutionFuse +RevolutionFuse_1 = model.addRevolutionFuse(Part_1_doc, [], model.selection("EDGE", "[Box_1_1/Left][Box_1_1/Top]"), 80, 0, [model.selection("SOLID", "Box_1_1")]) + +### Create Sketch +Sketch_1 = model.addSketch(Part_1_doc, model.selection("FACE", "Box_1_1/Top")) + +### Create SketchArc +SketchArc_1 = Sketch_1.addArc(4.7, 4.9, 1.8, 3.2, 7.6, 3.2, True) + +### Create SketchArc +SketchArc_2 = Sketch_1.addArc(4.7, 4.9, 1.4, 3.2, 8.1, 3.2, True) + +### Create SketchLine +SketchLine_1 = Sketch_1.addLine(1.4, 3.2, 1.8, 3.2) +Sketch_1.setCoincident(SketchArc_2.startPoint(), SketchLine_1.startPoint()) +Sketch_1.setCoincident(SketchArc_1.startPoint(), SketchLine_1.endPoint()) + +### Create SketchLine +SketchLine_2 = Sketch_1.addLine(7.6, 3.2, 8.1, 3.2) +Sketch_1.setCoincident(SketchArc_1.endPoint(), SketchLine_2.startPoint()) +Sketch_1.setCoincident(SketchArc_2.endPoint(), SketchLine_2.endPoint()) +Sketch_1.setCoincident(SketchArc_1.center(), SketchArc_2.center()) +Sketch_1.setHorizontal(SketchLine_1.result()) +Sketch_1.setCollinear(SketchLine_1.result(), SketchLine_2.result()) +Sketch_1.setRadius(SketchArc_1.results()[1], 3.5) +Sketch_1.setRadius(SketchArc_2.results()[1], 4) +RevolutionFuse_1.setNestedSketch(Sketch_1) + +### Create Group +Group_1_objects = [model.selection("FACE", "RevolutionFuse_1_1/Modified_Face&Box_1_1/Top"), + model.selection("FACE", "RevolutionFuse_1_1/Generated_Face&Sketch_1/SketchArc_1_2"), + model.selection("FACE", "RevolutionFuse_1_1/Generated_Face&Sketch_1/SketchArc_2_2"), + model.selection("FACE", "RevolutionFuse_1_1/To_Face")] +Group_1 = model.addGroup(Part_1_doc, "Faces", Group_1_objects) +Group_1.setName("Group_faces") +Group_1.result().setName("Group_faces") + +### Create GroupShape +GroupShape_1 = model.addGroupShape(Part_1_doc, [model.selection("COMPOUND", "Group_faces")]) +GroupShape_1.result().setName("GroupShape_1") + +### Create Shell +Shell_1 = model.addShell(Part_1_doc, [model.selection("COMPOUND", "GroupShape_1")]) +Shell_1.result().setName("Shell_1_1") + +### Create Group +Group_2_objects = [model.selection("EDGE", "[RevolutionFuse_1_1/To_Face][GroupShape_1_1_3/GroupShape_1_1_3]"), + model.selection("EDGE", "[GroupShape_1_1_3/GroupShape_1_1_3][new_weak_name_1]"), + model.selection("EDGE", "[GroupShape_1_1_3/GroupShape_1_1_3][new_weak_name_4]")] +Group_2 = model.addGroup(Part_1_doc, "Edges", Group_2_objects) +Group_2.setName("Group_edges") +Group_2.result().setName("Group_edges") + +### Create GroupShape +GroupShape_2 = model.addGroupShape(Part_1_doc, [model.selection("COMPOUND", "Group_edges")]) +GroupShape_2.result().setName("GroupShape_2") + +### Create Wire +Wire_1_objects = [model.selection("EDGE", "GroupShape_2_1_2"), + model.selection("EDGE", "GroupShape_2_1_3"), + model.selection("EDGE", "GroupShape_2_1_1")] +Wire_1 = model.addWire(Part_1_doc, Wire_1_objects, False) +Wire_1.result().setName("Wire_1_1") + +model.end() + +#============================================================================= +# Tests : +#============================================================================= +# Group of edges : +model.checkResult(Wire_1, model, 1, [0], [0], [0], [3], [6]) +r=Wire_1.defaultResult() +s=r.shape() +dim=s.computeSize() +dim=dim[1:] +dx=abs(dim[3]-dim[0]) +dy=abs(dim[4]-dim[1]) +dz=abs(dim[5]-dim[2]) +print(dx,dy,dz) +tol=1e-06 +assert(abs(dx-7.0000002) <= tol) +assert(abs(dy-2.6261643) <= tol) +assert(abs(dz-8.46802318) <= tol) diff --git a/src/CollectionPlugin/tests.set b/src/CollectionPlugin/tests.set old mode 100644 new mode 100755 index 387c5af8b..fe648a0e6 --- a/src/CollectionPlugin/tests.set +++ b/src/CollectionPlugin/tests.set @@ -69,4 +69,5 @@ SET(TEST_NAMES TestGroupMoveAndSplit4.py Test3114.py Test18739.py + TestCreateShapesFromGroups.py ) \ No newline at end of file diff --git a/src/ConnectorAPI/Test/CMakeLists.txt b/src/ConnectorAPI/Test/CMakeLists.txt old mode 100644 new mode 100755 index 563bb2042..d931acb56 --- a/src/ConnectorAPI/Test/CMakeLists.txt +++ b/src/ConnectorAPI/Test/CMakeLists.txt @@ -44,3 +44,4 @@ INSTALL(FILES CTestTestfileInstall.cmake RENAME CTestTestfile.cmake) INSTALL(FILES tests.set DESTINATION ${TEST_INSTALL_DIRECTORY}) +INSTALL(DIRECTORY data DESTINATION ${TEST_INSTALL_DIRECTORY}) diff --git a/src/ConnectorAPI/Test/TestImportSTL.py b/src/ConnectorAPI/Test/TestImportSTL.py new file mode 100755 index 000000000..b55211ef0 --- /dev/null +++ b/src/ConnectorAPI/Test/TestImportSTL.py @@ -0,0 +1,84 @@ +# Copyright (C) 2021 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it 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 +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +from salome.shaper import model + +import salome +salome.salome_init(1) + +data_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data") + +def testImportSTL(): + model.begin() + partSet = model.moduleDocument() + + ### Create Part + Part_1 = model.addPart(partSet) + Part_1_doc = Part_1.document() + + ### Create Import + Import_1 = model.addImport(Part_1_doc, os.path.join(data_dir, "cube_ascii.stl")) + model.do() + Import_1.setName("cube_ascii") + Import_1.result().setName("cube_ascii") + BoundingBox_1 = model.getBoundingBox(Part_1_doc, model.selection("SOLID", "cube_ascii")) + + Import_2 = model.addImport(Part_1_doc, os.path.join(data_dir, "cube_binary.stl")) + model.do() + Import_2.setName("cube_binary") + Import_2.result().setName("cube_binary") + + model.end() + + #============================================================================= + # Tests : + #============================================================================= + # ASCII STL file : + model.checkResult(Import_1, model, 1, [0], [1], [12], [36], [72]) + r=Import_1.defaultResult() + s=r.shape() + dim=s.computeSize() + dim=dim[1:] + dx=abs(dim[3]-dim[0]) + dy=abs(dim[4]-dim[1]) + dz=abs(dim[5]-dim[2]) + tol=1e-06 + assert(abs(dx-14) <= tol) + assert(abs(dy-8) <= tol) + assert(abs(dz-5) <= tol) + model.testResultsVolumes(Import_1, [560.0000222], theNbSignificantDigits = 7) + + # Binary STL file : + model.checkResult(Import_2, model, 1, [0], [1], [12], [36], [72]) + r=Import_2.defaultResult() + s=r.shape() + dim=s.computeSize() + dim=dim[1:] + dx=abs(dim[3]-dim[0]) + dy=abs(dim[4]-dim[1]) + dz=abs(dim[5]-dim[2]) + assert(abs(dx-10) <= tol) + assert(abs(dy-10) <= tol) + assert(abs(dz-10) <= tol) + model.testResultsVolumes(Import_2, [1000], theNbSignificantDigits = 7) + + +if __name__ == '__main__': + testImportSTL() diff --git a/src/ConnectorAPI/Test/data/cube_ascii.stl b/src/ConnectorAPI/Test/data/cube_ascii.stl new file mode 100755 index 000000000..125cfe199 --- /dev/null +++ b/src/ConnectorAPI/Test/data/cube_ascii.stl @@ -0,0 +1,86 @@ +solid + facet normal -1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex 0.000000e+00 0.000000e+00 0.000000e+00 + vertex 0.000000e+00 8.000000e+00 5.000000e+00 + vertex 0.000000e+00 8.000000e+00 0.000000e+00 + endloop + endfacet + facet normal -1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex 0.000000e+00 0.000000e+00 5.000000e+00 + vertex 0.000000e+00 8.000000e+00 5.000000e+00 + vertex 0.000000e+00 0.000000e+00 0.000000e+00 + endloop + endfacet + facet normal 1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex 1.400000e+01 0.000000e+00 0.000000e+00 + vertex 1.400000e+01 8.000000e+00 0.000000e+00 + vertex 1.400000e+01 8.000000e+00 5.000000e+00 + endloop + endfacet + facet normal 1.000000e+00 -0.000000e+00 0.000000e+00 + outer loop + vertex 1.400000e+01 0.000000e+00 5.000000e+00 + vertex 1.400000e+01 0.000000e+00 0.000000e+00 + vertex 1.400000e+01 8.000000e+00 5.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 -0.000000e+00 + outer loop + vertex 1.400000e+01 0.000000e+00 5.000000e+00 + vertex 0.000000e+00 0.000000e+00 0.000000e+00 + vertex 1.400000e+01 0.000000e+00 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex 1.400000e+01 0.000000e+00 5.000000e+00 + vertex 0.000000e+00 0.000000e+00 5.000000e+00 + vertex 0.000000e+00 0.000000e+00 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.400000e+01 8.000000e+00 5.000000e+00 + vertex 1.400000e+01 8.000000e+00 0.000000e+00 + vertex 0.000000e+00 8.000000e+00 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.400000e+01 8.000000e+00 5.000000e+00 + vertex 0.000000e+00 8.000000e+00 0.000000e+00 + vertex 0.000000e+00 8.000000e+00 5.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.400000e+01 8.000000e+00 0.000000e+00 + vertex 0.000000e+00 0.000000e+00 0.000000e+00 + vertex 0.000000e+00 8.000000e+00 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 -1.000000e+00 + outer loop + vertex 1.400000e+01 8.000000e+00 0.000000e+00 + vertex 1.400000e+01 0.000000e+00 0.000000e+00 + vertex 0.000000e+00 0.000000e+00 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.400000e+01 8.000000e+00 5.000000e+00 + vertex 0.000000e+00 8.000000e+00 5.000000e+00 + vertex 0.000000e+00 0.000000e+00 5.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.400000e+01 8.000000e+00 5.000000e+00 + vertex 0.000000e+00 0.000000e+00 5.000000e+00 + vertex 1.400000e+01 0.000000e+00 5.000000e+00 + endloop + endfacet +endsolid diff --git a/src/ConnectorAPI/Test/data/cube_binary.stl b/src/ConnectorAPI/Test/data/cube_binary.stl new file mode 100755 index 0000000000000000000000000000000000000000..12ba5f12dbdf132095b13273a8a9cc92ddcdba23 GIT binary patch literal 684 zcmaivK@Ng25Jh_c5785F1=Aoq6BoEMF0gcoC2CUL^=4kp4#N*qKqVvMB!2P59C=BZLyNEhWFICL~L literal 0 HcmV?d00001 diff --git a/src/ConnectorAPI/Test/tests.set b/src/ConnectorAPI/Test/tests.set old mode 100644 new mode 100755 index fa9195ce5..a5664961d --- a/src/ConnectorAPI/Test/tests.set +++ b/src/ConnectorAPI/Test/tests.set @@ -28,5 +28,6 @@ SET(TEST_NAMES Test18887 Test3195 TestExportSTL + TestImportSTL TestImportSTEP ) diff --git a/src/ExchangePlugin/CMakeLists.txt b/src/ExchangePlugin/CMakeLists.txt old mode 100644 new mode 100755 index a155317e9..e8db9c5e9 --- a/src/ExchangePlugin/CMakeLists.txt +++ b/src/ExchangePlugin/CMakeLists.txt @@ -108,23 +108,4 @@ INSTALL(FILES ${XML_RESOURCES} DESTINATION ${SHAPER_INSTALL_XML_RESOURCES}) INSTALL(DIRECTORY icons/ DESTINATION ${SHAPER_INSTALL_XML_RESOURCES}/icons/Exchange) INSTALL(FILES ${TEXT_RESOURCES} DESTINATION ${SHAPER_INSTALL_XML_RESOURCES}) -include(tests.set) - -ADD_UNIT_TESTS(${TEST_NAMES}) - -if(${HAVE_SALOME}) - enable_testing() - set(TEST_INSTALL_DIRECTORY "${SALOME_SHAPER_INSTALL_TESTS}/ExchangePlugin") - - install(FILES CTestTestfileInstall.cmake - DESTINATION ${TEST_INSTALL_DIRECTORY} - RENAME CTestTestfile.cmake) - install(FILES tests.set DESTINATION ${TEST_INSTALL_DIRECTORY}) - - set(TMP_TESTS_NAMES) - foreach(tfile ${TEST_NAMES}) - list(APPEND TMP_TESTS_NAMES "Test/${tfile}") - endforeach(tfile ${TEST_NAMES}) - - install(FILES ${TMP_TESTS_NAMES} DESTINATION ${TEST_INSTALL_DIRECTORY}) -endif(${HAVE_SALOME}) +ADD_SUBDIRECTORY(Test) diff --git a/src/ExchangePlugin/Test/CMakeLists.txt b/src/ExchangePlugin/Test/CMakeLists.txt new file mode 100755 index 000000000..6d267d431 --- /dev/null +++ b/src/ExchangePlugin/Test/CMakeLists.txt @@ -0,0 +1,65 @@ +# Copyright (C) 2021 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it 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 +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +include(tests.set) + +ADD_UNIT_TESTS(${TEST_NAMES}) + +if(${HAVE_SALOME}) + enable_testing() + set(TEST_INSTALL_DIRECTORY "${SALOME_SHAPER_INSTALL_TESTS}/ExchangePlugin") + + install(FILES CTestTestfileInstall.cmake + DESTINATION ${TEST_INSTALL_DIRECTORY} + RENAME CTestTestfile.cmake) + install(FILES tests.set DESTINATION ${TEST_INSTALL_DIRECTORY}) + + set(TMP_TESTS_NAMES) + foreach(tfile ${TEST_NAMES}) + list(APPEND TMP_TESTS_NAMES "${tfile}") + endforeach(tfile ${TEST_NAMES}) + + # tests which require SALOME GUI + include(tests_gui.set) + SALOME_GENERATE_TESTS_ENVIRONMENT(tests_env) + set(COMPONENT_NAME "ExchangePlugin") + foreach(tfile ${TEST_WITH_GUI_NAMES}) + # Strip the ".py" suffix + get_filename_component(TEST_NAME ${tfile} NAME_WE) + # -B ${CMAKE_SOURCE_DIR}/doc/salome/examples/testme.py + set(TEST_NAME ${COMPONENT_NAME}_${TEST_NAME}) + add_test(NAME ${TEST_NAME} + COMMAND ${PYTHON_EXECUTABLE} -B ${CMAKE_CURRENT_SOURCE_DIR}/testme.py ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}) + set_tests_properties(${TEST_NAME} PROPERTIES ENVIRONMENT "${tests_env};SHAPER_UNIT_TEST_IN_PROGRESS=1") + set_tests_properties(${TEST_NAME} PROPERTIES LABELS "${COMPONENT_NAME}") + + # salome test + list(APPEND TMP_TESTS_NAMES "${tfile}") + endforeach() + + install(FILES ${TMP_TESTS_NAMES} DESTINATION ${TEST_INSTALL_DIRECTORY}) + + install(FILES testme.py DESTINATION ${TEST_INSTALL_DIRECTORY} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE) + + install(FILES tests_gui.set DESTINATION ${TEST_INSTALL_DIRECTORY}) + install(DIRECTORY data DESTINATION ${TEST_INSTALL_DIRECTORY}) +endif(${HAVE_SALOME}) diff --git a/src/ExchangePlugin/CTestTestfileInstall.cmake b/src/ExchangePlugin/Test/CTestTestfileInstall.cmake old mode 100644 new mode 100755 similarity index 93% rename from src/ExchangePlugin/CTestTestfileInstall.cmake rename to src/ExchangePlugin/Test/CTestTestfileInstall.cmake index ceaee95f9..cb194fbf1 --- a/src/ExchangePlugin/CTestTestfileInstall.cmake +++ b/src/ExchangePlugin/Test/CTestTestfileInstall.cmake @@ -18,6 +18,9 @@ # include(tests.set) +include(tests_gui.set) + +set(TEST_NAMES ${TEST_NAMES} ${TEST_WITH_GUI_NAMES}) foreach(tfile ${TEST_NAMES}) set(TEST_NAME ${COMPONENT_NAME}_${tfile}) diff --git a/src/ExchangePlugin/Test/TestImportImage_1.py b/src/ExchangePlugin/Test/TestImportImage_1.py new file mode 100755 index 000000000..2c974d6bf --- /dev/null +++ b/src/ExchangePlugin/Test/TestImportImage_1.py @@ -0,0 +1,99 @@ +# Copyright (C) 2021 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it 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 +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +from salome.shaper import model + +import salome +salome.salome_init(1) + +data_dir = os.path.join(os.path.dirname(sys.argv[0]), "data") + +model.begin() +partSet = model.moduleDocument() + +### Create Part +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +### Create ImportImage +ImportImage_1 = model.addImportImage(Part_1_doc, os.path.join(data_dir, "1.jpg")) +model.do() +ImportImage_1.setName("drawing") +ImportImage_1.result().setName("drawing") + +### Create Translation +Translation_1 = model.addTranslation(Part_1_doc, [model.selection("FACE", "drawing")], startPoint = model.selection("VERTEX", "[drawing/Shape_1]e[drawing/Shape_4]e"), endPoint = model.selection("VERTEX", "PartSet/Origin"), keepSubResults = True) + +### Create Scale +Scale_1 = model.addScale(Part_1_doc, [model.selection("FACE", "drawing")] , model.selection("VERTEX", "PartSet/Origin"), 0.5, keepSubResults = True) + +model.end() + +#============================================================================= +# Tests : +#============================================================================= +model.checkResult(Scale_1, model, 1, [0], [0], [1], [4], [8]) +r=Scale_1.defaultResult() +s=r.shape() +dim=s.computeSize() +dim=dim[1:] +dx=abs(dim[3]-dim[0]) +dy=abs(dim[4]-dim[1]) +dz=abs(dim[5]-dim[2]) +tol=1e-06 +assert(abs(dx-400) <= tol) +assert(abs(dy-258.5) <= tol) +assert(abs(dz-0) <= tol) + +#============================================================================= +# Change the image : +#============================================================================= +model.begin() +ImportImage_1.setFilePath(os.path.join(data_dir, "2.png")) +ImportImage_1.execute() +ImportImage_1.result().setName("drawing") +Scale_1.setScaleFactor(0.7) +Scale_1.execute() +model.do() +model.end() +salome.sg.UpdateView() + +#============================================================================= +# Tests : +#============================================================================= +model.checkResult(Scale_1, model, 1, [0], [0], [1], [4], [8]) +r=Scale_1.defaultResult() +s=r.shape() +dim=s.computeSize() +dim=dim[1:] +dx=abs(dim[3]-dim[0]) +dy=abs(dim[4]-dim[1]) +dz=abs(dim[5]-dim[2]) +tol=1e-06 +assert(abs(dx-448) <= tol) +assert(abs(dy-296.8) <= tol) +assert(abs(dz-0) <= tol) + + +# Close SALOME GUI +import salome_utils +import subprocess +port = salome_utils.getPortNumber() +proc = subprocess.Popen(["killSalomeWithPort.py", "{}".format(port)]) diff --git a/src/ExchangePlugin/Test/TestImportImage_2.py b/src/ExchangePlugin/Test/TestImportImage_2.py new file mode 100755 index 000000000..025bd9267 --- /dev/null +++ b/src/ExchangePlugin/Test/TestImportImage_2.py @@ -0,0 +1,105 @@ +# Copyright (C) 2021 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it 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 +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +from salome.shaper import model + +import salome +salome.salome_init(1) + +data_dir = os.path.join(os.path.dirname(sys.argv[0]), "data") + +from tempfile import TemporaryDirectory +tmp_dir = TemporaryDirectory() +img_file = os.path.join(tmp_dir.name, "1.jpg") + +from shutil import copyfile +copyfile(os.path.join(data_dir, "1.jpg"), img_file) + + +model.begin() +partSet = model.moduleDocument() + +### Create Part +Part_1 = model.addPart(partSet) +Part_1_doc = Part_1.document() + +### Create ImportImage +ImportImage_1 = model.addImportImage(Part_1_doc, img_file) +model.do() +ImportImage_1.setName("drawing") +ImportImage_1.result().setName("drawing") + +### Create Translation +Translation_1 = model.addTranslation(Part_1_doc, [model.selection("FACE", "drawing")], startPoint = model.selection("VERTEX", "[drawing/Shape_1]e[drawing/Shape_4]e"), endPoint = model.selection("VERTEX", "PartSet/Origin"), keepSubResults = True) + +### Create Scale +Scale_1 = model.addScale(Part_1_doc, [model.selection("FACE", "drawing")] , model.selection("VERTEX", "PartSet/Origin"), 0.5, keepSubResults = True) + +model.end() + +#============================================================================= +# Tests : +#============================================================================= +model.checkResult(Scale_1, model, 1, [0], [0], [1], [4], [8]) +r=Scale_1.defaultResult() +s=r.shape() +dim=s.computeSize() +dim=dim[1:] +dx=abs(dim[3]-dim[0]) +dy=abs(dim[4]-dim[1]) +dz=abs(dim[5]-dim[2]) +tol=1e-06 +assert(abs(dx-400) <= tol) +assert(abs(dy-258.5) <= tol) +assert(abs(dz-0) <= tol) + +#============================================================================= +# Change the image : +#============================================================================= +os.rename(img_file, os.path.join(tmp_dir.name, "1_new.jpg")) + +model.begin() +Scale_1.setScaleFactor(0.7) +Scale_1.execute() +model.do() +model.end() + +#============================================================================= +# Tests : +#============================================================================= +model.checkResult(Scale_1, model, 1, [0], [0], [1], [4], [8]) +r=Scale_1.defaultResult() +s=r.shape() +dim=s.computeSize() +dim=dim[1:] +dx=abs(dim[3]-dim[0]) +dy=abs(dim[4]-dim[1]) +dz=abs(dim[5]-dim[2]) +tol=1e-06 +assert(abs(dx-560) <= tol) +assert(abs(dy-361.9) <= tol) +assert(abs(dz-0) <= tol) + + +# Close SALOME GUI +import salome_utils +import subprocess +port = salome_utils.getPortNumber() +proc = subprocess.Popen(["killSalomeWithPort.py", "{}".format(port)]) diff --git a/src/ExchangePlugin/Test/data/1.jpg b/src/ExchangePlugin/Test/data/1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..546569c833c17cdf818e1d8e7600df1a3d18545e GIT binary patch literal 60324 zcmbrlWmFtNw=O)mySux)yKAt)-5rLYL4pN$cNtuR4o+~F;4-+o1W16`CGR=se(SDp z-Cwu+S#8x)wfou9yQ=@L|J?&%t17A}0$^YO0GPKK@D~b*1R%dnD99+Ns3;hi=$III zIM~=Yc;xtmZ!F*{0`M-|8mKT(d!QsJ# zauYK$a;rO%mr+Y&00u<9Z6+0oPEhKZ{nUqJ4!Z98h%_$ZF0RE)LqK8S+*OYPy>uiU?heOz{aL0hd<(Ja!LRo!eNiWaz6x{hxC#1gv(IF zO$#`=9`f*uO9}i1uo!IzI1b>;U?@bB=Uc9?qdQu11LPwSDT5^?3bII1aB)#!S-QL@ z5CK8AE?e5>FE-uniKX(6@Ht(muGz`WNBx!DHZa`8U!w*Qv6?PVj@uU!JL9BhRthsh z<4OHLs{P@M`wO6XKWS5hTMItSD>erzWG&7g@5+x~jHhlWjc2of zTQh7<5&cyc4JlhckNJOWO`Cf(Nvr`Z;4LHo&>Jf{$0fk|u5ykIpURVhD%1O-l+>16 zx4)A#ND5ht_pO=Q>jGVJs4tnm>DalmB@TC90kmziuh6@JUMJ%|w7Q@-dbF7`@K2zWsdC zBUZZ^%v3_sN4;XfJ?;*!_vBUNU6YW`2D7@{U`94#jsvhORcP@l-K6|$;qU7#J z?oD=mm&3S$gVo{m<#lP!!w(&|e$)mMgYgBYW2u5*w%i|#(YZ@7#N93*bKQOhcku;c zDP=F=9{5wa5GNHKPPdTr{Se1;7k+(yq?G(7@oTsEBNtPBjfX^6@Z2>X2;7rOW9!Qz z&JopGe4Ho2kpl}1;NUrtM?VG@%`XY;H_K$MQF5JbNiYE|C_gtGol7R3A7d83bD|8V z#iaAYEU4_r>D@1bjXQ7+A~!fvedl^>=i5Jke6r!7?O<@ufh}KB{==Xs`0m8$=eb{w z(euyeS1pSdgIi|7#dsYglH@t<3|%kBy<02tlR`y3AzjjGXM4r8ZweuDAxmWk%P^VC zBM)=yri?+CA8+=DtqZ(18<9eLa!4fH#V+n9u83J^YT)fis^oYCya^f>KHNQk!`JBN-$V*u>x_1A#&LtC0Tw1&+teUjD(A!v^tKlW?JI2>| z*gI{qf#K!Duj_ANf7_>g^fXh`?iHn^81xsAuAAS{J?r?#;PJC~7PJK$q-;qskMWp? zo#8&Fj!{&U;*r9@yEdd1I|+l8{E zi)Af~L#|)W-&x-*d=;gnnh{GP_+Q)jVvTms-mz7?SFS1``NU3J_+_jJM(|WglSpX3 zS0r&GlB>V^fu0rmc9(-AogJ(1CsNk=_;O!Kh;X&jiREpX`RUkRgB1#vnchTP*}^+} z?#$o_u;<^4;3;9@M-}PgVRZr7@pHjE3QuN`qU*2Nw$IRmm2KkjG!j5`v?9OpH7(w$ zWX7%Qb<|H@EVpbHjO8FOpYoSP+Iw#_uo@Nem+E?wDF3t;N=@U>DHOSO(mg@9 zmIz8mp&XC3ud^uRIHzJ~AX=MZ(@b63iZak6xyB&;^!>qWivI@)o1~9{;>^D7;PdVG zC=-)~&{uZy3blYZ=!-3c)=g0dF9p10Ie;aE%7JSx94yhCvh>tpVoxRTYWP6vx|*Tw zI`8;3vgI{lCr%BaA5_y38@*2au0)|DciCEq((pPVC*=q?j+j>&hQCay1h@WES6WvG zD%)ef-=n_W<4YoYr10sZC9OzPf_bS#gm%bcz>Kb*|50@yPINk-Wqa1R1M*gc)~~jnW{vNq%DpfRo07`8Zpi!7pagkoQH0HUC+xg zpXD({+%3eVT@OobxEY*!vFlGqO^+vyB*Hjb z37PX|Jai{e{t>=TONq*5!iFiaGO--OH^!xByC%?>Gtf~R4&P~+$7xHkzq%4Rt3XXQ z3OL84-CZ<&p_sL+;P}d(xT`h@;>7$5aPI#L@OgAi`buhTlR*qXiAH*lC8_~P7KH+V zpqwR$_Kv~&ouy>XP`S{JMO<9b3Vc&uRv?-a*llx zbBfIV0+OfQ+dAOWoU4Q?&%K-!t4@vGCcka#N2<}(*7kGzNt(y+l=W1SOBSVGem;v< z!g94bz6u2SJb(D?f#o3jXQ$shS<2H!zWRod$J5_0 zX#TvvNG~(r>PUcc`M1vC#!PPhvRw4q+H_0L*7t)ek>Xy7=hx@gUp>9SOjIA(cB#xm z$XxE|G<<`EQYmGj(_JX{li!=hI_9EeRkk^OhGf{u%HU%Z?K@-Za z_j{cU4AUzn7pMDY1XT1aK1xDo(Url~>8< zR>AY>)8pNesRrBs?_M9N$%KyyA+lHDf8axMA0g`(4;f zc^dCl%4R(o7*iiqF9!VpuI*;*efiOfoZ48n^cc!sR7_Oa!sla>5Y@U+>;3=;XbA`| z+FiueNF`>($uK&@W}wQxT0Bnnxr#;&Y=Nxcus+{_@NRze?ANdJaF_Nu^TtLj7~10i zJ1hFGG;|EbEj|{@3@87D@9fFQlS3H+$T4t9QYL#8dfylI2C|(}8S0wXPV33D^wwM1 zV^LiO?9egEv~|eW@shekg=Z)248l8IQNqsGk{7*jHF9BrFg;VM;JMYcpAtUhEjGVj zwuq@|Tp-B$YR-ONH*+fyD?PP)_bSIx`*6SiC8OT!Ckc+rX-~*NsO~zkiB0nQOt3ws zWJ-nu3Rp`Heuz_pWR^{5uc1FqJg2Vyki|a`Z~ER@3^2FpTg%=nCPWfkV$b^&8atWdnp5lufWkycZQ6?{rl2T$L4KYV^>70|UbJGjacr+%n|J?HH z^@We1-AL@Sy5tg7vm%!*r3hPmZD6rTktC>Yxt_{E=5#6JwTWd&JHtL!W;8q%M2>bc&9#I6`kw z_w)OYrqU^=r)Ti;LL{_&8udZFj0Wc(@8 zSvdF%BtwX|PqG|oD^&bZk;~fxe!d9mL1BbD=kQ>u;Zky+n!4uR|J_32b7fOt>Rg;HP9-ADSbc(yc=gITs@DRXojomK#W<~?EMoPQ3J7ll()l@rImA2*W^h7 zZYqm7TqMg>nc2oPvA8c;<{$v=?B};b!!W^nvMy3CtZW;&EY}+(Ex7U60t^iNqd2v7 zzH2-;ED%Fxx-DU#;s7@K$vMmjxH(Jz%^074k-Z;3 z>xogvFCTTtm=8uv(uo|Pqd9C}?Yb=3*Hfe9S+wp@2|FJk+8prC@4A zVRcXnN)kH$V5&Q>qsY8vF1?-=L_J3pkEpmQy9Un7wUYqs1caf+J|)S_&ZZnzrh3P&g2qlBtS0hQ>5~?zR%cHd zxxqfIV|FrF6wIbGg+?2jZ~ZB^)w4!`E?Z}j6|5L#|4B8WJ>P9+)%AFFdDRi#nG?UO z-P43Mjs0-Nhfy{@Q$tlCquPYIizunJK_E<3MXeAGPfNZV*<4IO3qiTn2x6#8I||lK zDl<-Dv1P9?@+z^b!xvfKwgs0H2-L4x0GPinN-j z7!mJ8Ep2K}W?M1kzQ9FPBmS&nqkQT?WT&Ad{c{=YDBbl9>d~@ z;c})Ojs7G;x7GUwo0@iP)s;VX`vqu!wFSksUXWG>eXkpj` zL>B9t+8G$O(pIDeGGT&#!$xQ`U`*!e!D#^w_3QC~nGsHC%HWg7RF&j6Vi5iRc=3-I z|KSDPKVDo=1CVjUV3a>)djdjL>|hPsLfHjFu~86cM^$l@<94h!V`>yt$`NF&hnRQJ zR1oyK3}Gx=22lm_`0TJjmb4TdG>n)SH0fD2c6Qi-W*-)0RBCB706-`O zLI}f7tp@;@Sx0KYm%dP=8fi5EpurYJnH6@x5J5$HM?ry? zaC9n04`5i|Z3}^;QKMb|1P`FARQSZpW<(pw^6xk+Lu8htJ$PLj(9|NzYI-Ti>qZ@K zg&!9erdtk+OWLBr3&A$hmTvaTRk4fAYvP6A$Pk7b`Q6F+`fcYK2~=e2UTH zZGVps!>oD^Ye?_JzC6?J1;}J?`lq@=*Z>$f*thf{JS+_STVnAoy$Ayb4?w`d#ly!Y zpr)bY=HcZRK&0i9p_gWm*U|>*T3Qhb{&%hs1{vlr;On*zM8?!Nc)PlG0#1{zf&ZAv zBR!3-ty5&?fKb$=EB;KUC%a1Z#@vrs$S+qKjnB)Nq?D;~@3GPZ*D4n)A`%by9bv@H zuKQ5K9_hezbsdV(F|MF8c@GWR^xUGOqDLf_PjnAc=zYQg`rY&&<|`hJd1H*_ zWfB}{JN;M)!?XB}8ayR$bZ2ZHczY5_6k+%XXe8 z*<-uQ5#Jpi&T50#;*K`3u1Y-@9-h6Gl9@ZQPn7-QQXe_4Zr^J?ul)3<{N#+B;>t?D zl00q27e#!KT9MLhR@Pqt4)&z(1#wqXB_#?v|Fb@Y+P+FIrJ$Z4!id=6Ik7(vzNYk>aXn(aQlz~xF*!U@rUErX1P&sbA*@KU{$BPG^oeMm zDoaF_&t8UxA|`F`5S_U3Nj8)4zbG=oVnAGqP+`a%9%qST?{)AYTQ*_acoAsPV7yp6i-@| zlyzjpe4voDG)W|?oY}N8=Hq#yW!78#2}E0e1LAa2IFISqk9w7YCu#k|h$ObydQ`MR zUS0S*w?0MnsgE*iA>g^@g$=5mZiu^TTWDg9b|sl!2Ps)pL5=sOa}h)XG)}H*Bml2p zze@l&yo{mX5mjS~pPvNPXj_NuhCdzPIaHEncS(k~qD@5$j^h+q6p%AaCu3Cj{5Dzc zMXA2O*?jn>(lwiyB@QuhtIT(6gmDiiLcy_RXgHC`o9Z4_Fv8)yWB4wlcKG{UGN%Us zTRX)ec`x|p0eCSD~#x(v_v~krm<2f;FmQX-wDG0TMTCZzkho%;`XXf1Ur>b{j zDEA73a&(Z$Q_=WQ3i|xbY{;4yR&6A4ZQ7poszG*O`ox6i99N@me#JzU;j!0DylkPk z?EQe72ki@hZLVu9a9hjstG4#N+8=j)HkG3yObTJp_-N5N#@I6dyEH^+p%~CWrdAls zTA}M5Y{nniI=P#Q7E&D*0b|@5T66sB>Q~eRC)R^}%_o&E{-u0hovo`(xz5lSKq#mK zteVMq(92~j=aQL$M2*ZKQlxMpopoL;+M{ZRi#Ob3-I1VwUEoZf1=dK#?O;EMRb$C8 zHfl~QOocgF>3DzDW2Mw9`>~}XwJw0PV}b1>7Njc!^(5<6t+3A}7uqxyckeXU-2^?)E)#zKdxUzzCS#ugyB5&a zQX@rzV$6*Ge-8KL=fU7q<|-N^Mj+IqHZE+3Y%?^)ys9J&?}sl7{IOe27rHpz zo$QdW2i5C08+SJyCPd7Pr{EeoeZMyzbs?zNuaL9X2YNE9M9FUbnl@~(ZjW1K`|s8G zg}5MwHAa)`fvqN9B1wr=LwNPE?W{oN4+PGQ0CSGdd3PCDT@-tk6ec4`v{H8QAh%hA z-k>11=!uOw{Cb^c)lue5-a?~4tVnW+5fK?TU-R6znGeT1c+my9yq+mWnUSrcx~;-du???HT4Xz;4*vW*sqSx^L>E>qOw z6lZ+lbUT%7%`r%m$o3G)AB2wFHO9EwI0saLS{af^HkXnp9=FwR*`Hh+ zjftPOR3cH)<(Rj2gS3! zm{-~yJFDT_%r*GHM1blS*bJfBJ5zb0us)t2&<&Mnf3%(!tG@tqWl2|Ic5coHYR;9P zq7&^A41|wy>-wv=)yi=zd&YFMiGiz#0NNdLA$az`00Owm%lq_m@$|t|3d#vtKWSGl zF+!ZO{2HHRjh&Eq1(KM1+j#W0MERtJQ_4@Rqq6gq5`Bl6UIejju^8{$$ET9W-wW_} zHG{C7zJoOq*|BpqtIGOFmeMhzH&ecLuZ2BfvcdG0;re&+%Q^8`6PE{co>$I}CL!}0 zb#+OkyX!d(WA545W_NZ7#Ny8AxHaS8;7|&K#(MmH@5Wz|Bqj~cs>qdCiQ(eDM%XGR zvrS7gJJxd_v^@|vRi59cp9RwmQ+DZu^95wMHKwvxTljmbvnNlT{C?b=yONcwB%LXA(oIcxrqrmJ9P(6R#GU! zh+M97u=(w=%X2z!#Oub%x+8>UOfM9$q!I_$V8G4#{8q}&Mzm&p3>(%MoHWL_G9=ac zXvD&g63yMM62k8TVv^M|up5VHcJvQhk^R#TbBSIa)fxVBfm}A>RnPi;<1pjI)iR&z zwOe5AigUYhgRjefZ`jwIHxr}JeUUU<(BVf@O3 z&D26XV#AiapC=!SQqP7PPgXygZ)R|8+~4?&LhY5b$*PYP?4T~o{p z2AcR<(F8gB%Z;$GdBZ*pD;rZtWKy!el@bQ_^U`*0OC=8)o!gTdRBqM!P43+F?tGDj z7%j325EWu19iEPE9jJnWyxv|Pl};dH-3#K&*M#6seXdIe#-#YnT^Au;DyJA;e99U3 zad5|Au!^aPR@!%jEJkb9V^H&0)*7;Gm#Jbj@H+?3+S*hJ_y)sufqS7*$%9Xk^jNS% z?3GL&F!OUO3ywBi#kRvLH9(-VXY@$$$*j{WU&Qjamx-rUaSF7rlcRCYrcS{zlr_%D zz9R|8#6+Sby4iKL&CDTy90p&M{Bt+Jepxr9E`6jRZJ)Yl_fk zLdcvTVK6NeXovC~jo&Zaz1_=P;t3esjbnH!l(ssmG)5h5+?K6J5rLsm(_-Gcsq;nw#N;Av>s8X>$k z0=L?dan_FnqxVLYg?saN^a;R!(hdsr`4tRbZ?Q&7LBT}Wa~#Bm7+WQ6KZ{(C9xbo? zMU`Q;)Q~GA^Ry(U)AF|+;iI{?e4&u3xDp*>@P(K%+K=%h=D}upm+z8)0Xqw^DM@bL zR2_7NKjI!5+PCoVV7$>$7N*}_Ro z2qOsSR>-vi(E+oN0py~1nwN!GZ23<%mx%^VbU zNS*MsFlY9Jo5}y$O&7 zusTcNNL)iJ^@LkSaTPNLGU%Z?#{N4nb#=BJ9RfWtv4gavImYWF?%db$?m+$&t7+Qy zSd4C50@b9gN{sXfhH?1Kk5v~8Lp%7YfBI1Q>kIv+p7k;6JOHUUcmy0aXUeO<+0y7g z-k*OV7r$IyyBdK8alLo=Omj)-ZWT6V^yVprye=hb4{G7QNq&z-UyzcZrHyB;)y$7t zG8NAm;jO^Fu+^B17($n z0n|M-ONHI^qnOL^q~T9gghh^yTb>#K6NHgmD`13uGC8h%ywd2vd3TWQ>pSHq)ifNN z&KIaP8Akr+yL^1Rkr2_%;~Ow){@7>X<~&!JCTt`!;Lotu`9#H`;~+1f@S&TarU=Pn z+K`y`p;Fu;|G3_}VBgE}sgxt$cLgalJa}aGgqH<9Ajy~0uSvsz0XrfxA_eIjpHUsB z%cXL+c9?P;92rWy1w*YOSY_Eb2`cTwY3T6PVgOs8oO3Fi#sUG5!Mf?!xlW$5ynP=3 z)#~uPY@g`U_n0`e2C10B&t9K|Hep@2+z5%w${;WA_1wn^-#|Lpd3S+!~bLP+C7*#v0?ak0Fn?GX=D z9B>^GO(`gV+d}!g^_|t_iynKnu9p@>ccs2Oha|BEj69Ka-9Jb5Of8iU+gfPI6f;_K ze%ekbZ779Yz8f7VKl>+AD&;4!U(+e=OP)^8i#oP!-V^qV{KOohm#%U79U_hDmUH+V zY#OEQ!C#KX-E5z@9P(RB`Ce$Zt`B)nYK6o=0UUEXMM0ZurvI>Ey1Hh%x?#Gwp=oM4 z1lX`Ji(nMvC5D)S!>=ignntxz7)F3sUGp(h0$H2Xm()$kqeeN0@|I1ln7WM38V=uO)#I$qW5^qJrc8YL zJR6N%|G~uV|5(25{s-kUI5Gq{rrH5^kS;q&`Cuq6$6l-}WQ`qS@E>SHIdWCs)Y;>| ziTOC4#$zM;Vp4|hSi%Xq(p-tl8`GIGMSjn{#Sz=MOjw@+$3lL(X;jkyo*t)^d1M9C z);`b&wh-O+qI!AVQo+0MjLxc{$u;OqSB1Nbt(67Hq*Y zl2FVx+_yAMu_}tOinC&kb;!h^qLZQXeiJh>><6~Ss=58E;>sAjA{mNnV*h$|BzX(; zEl3RTw?rTg`yN`!>q3U1_|U)UL5DqVyyn`TPZlP`i>BU`%pZBTpcw__m<&iOe9tRr zHI$6ez)1WT@JjOZ^TPbguCaHwYkafTE7~H^;klYZ=v_jw+&N{g#bhy|fbXN~ZDMEa zm|kc+$p(^pd$*{^^jRvuF^I&CYHgkf*cO_6fmPYe} zQsCr9SW(exY|zrBP?@#lT(?rhJHQY-c`f(7;$j2dIKJw5J(KE`Gni%Xb1ZeP(jLtt zQF-lbG|RuhVB=9T_3SU8N1wAiw_?bHH#1oYS4ek2Eo2RuU7O=rd^a@oP^f}U(l_#;7jDGMw)v3FuTl5 z0(67{Zssw?iPJ+LC$rE$iiJd*Zu|RBRO6qxsyo%Pcw|siZ{dxTt_jR4Gmx36iRL~R zhcj^1fb8w2^e5Nv|9Bn#M!|~o)mXH4FWbaqo>~>4MA;`w1(qFL|1$VAf9UY_RSE16 z=n3Ilq&OO%2fO3CCya@Ul zlRR~~rW)C1zKa1I>TW&`HU>t-auVO9L_EjTFAFkU%pV`4$~Zq2nlq#0rQ6LV`V=%1 zha9+aJ2Z$vVxdt~?(OrGGe1PCn9z*x=BkU$I%C`sF=_V1pD9T;*PF zi3TZ^vbWO6O$Y9Ic=0IgS-a(*3lF94F3)^6*Ey?C1hlQ0AFO^}cIchm5J%h}_Tw75 zy>$}!5FsxXeOjP<{$c3xsPa>lZwoI9f85WnXqT!cnW2p^76fdZ>XpxCsBCj>o{hHw z9Get`ptZ_Vv|#l0dJwSg+ebnH zuDm;&Q_c|F&rduR-;CRW^f0531StBH%+U7^y;(xzKm{iSEDl;Gi=VJXDFk+hJ;1Uw z<{X8H)yK!Fs$G7cV5P$FcFjKA$zGW#iuVh1$P8F?wG_COf0=XgtQVG7(3p5M52Qg^ zG`n`Ljh(q}|5%7}1`Abq4>>VD@x3_FKe}#oaBFmMty`}4+9Si@n1jYOm^%!BVuldB zA=d4)92uiSux5>zpZOsM{1C0J>oH}z>Yc_!g1Jq2@IUYT|KZJ9|BvH-bKi5@|5Nt1 z^Y5hpE|c-<$hCv(9B}iLbaQERb16+FUpE;2v7W^2@!rJl4Fszj;VUi29_~4ebkC4RsRP zY;V`*Z@%HI5u5OFsb;ppXZ9L6d+kjm<|mMH{65f3%ro3TEC6iUa2Z8DhJar^G}hfG ziU%M5L$H0(jHAwUXHEM?3)gHQI}eK6)!x|E_aD4%{09vkZ2s`|zcx42O&iKY1ODsL zYXa@dYz6SSKEM;m)PKSL)J-n)Eru~2+s!6D@!jm3jk<1>=HK$aKABA6F@8-TBlAyV z4(G5Vl|dbFfv*djcIL?tz?o?e8g?Vi#3R@zJGm*~u4kicoGZ|8z8LE5zEh=Fuh1`! z4>L5d^VO}y5Il?|3ed!bU{|#BL}HVrkY4zj`Ttdc8X{RQa#kPaGY z#Ff<91SZ-T-j7FG1i#;pMrT7EYO1qvR5uHK;U?V);3vXIj%wq*7l`H~bTa zj=#IUCCV%D+|8V;CF&ey)m-gFBf`FT`3P?Y2E;zf{Y+Ewwm=f6!IaWnVi(DvT8 z??Pm3bvbGO2vlya?o+U+sQx10dk9@D03Aj@sx1PY-kcg|BZf$XMQpzimm|>8;=Xwt ztePhQqm-~RNn`$|+V5``>GQr_)ujI5p|USkR^c%UY!v+{c&M`C$FPA%OB))_d_m6iE2oW9urytTV8sPgNSj*o1`~O7y|ws)%X*fmy4$@9o8}~|-^D^JkdY-= zO-(z*`Br5GYSyRr8~2|;c#+h;Bu=^93yqy#>ooMm@)X4J{x zee+Bkm`r*=aQ82Y*`VP2<#elfnRx4NX7#J)=oYQmAF8$Vr_*enp<7lDpt!ET6xq5I zPrU$Hs2prNd=CofOD*4j!fLUOUp5o+J?O#_QafpXLKOQ~9gEu72fvVlf3N&c*9X;q z4x(aibxYOdUSRA%q|8c#Rmit!S1vJrHs1kZ$cqj>i1Y{V#oAVVry1HWwJdQ)#jVy% znyIb!Snu&49hfy~==|$eQL^$UI_CKcTrWh*JQqwAJG^%c3G-^PbsxN+e=A*) zf}e=g$7p*O=`$ZbSKqG-sGYR6}g4_@mqAhYkbZ=ob)c~K_OwJol{5Ajj(i#F=h5f$PeS#esdxwG$z4A ztrug!Reg@m79CtnRyQ)+trFhCb1-C+ylg&L%S1Y(_qi!9R`r49w0?yK(r=(|nn`Tz zz+KxAEGyG&AOEiz+IYWK4u8HAob1C+F6m?VXE)xu0jdqlnPYmH0_`fEI7|rSd@%gG z*F~2SMKFdLTSPPha|@UV$ASW;Uo~TScHCC7arv{#!&7t-Z@Jyvq(zE_IR+M!S|RyByAp9 zITrx}4a~4flLZRGaQH?HE@u<2U<-MP@RMsYQ)F#kTp#jyr6Nz(gv(k+;z&B*A8;jH zdHYP29mZ{ONGXIX+-`CS|7uH+v zF^*nEQa061*|s}$RT_>uBwz?p^F$b^k~d6Zp6X|v1&kAyM;#AE*=&&y$&b+1eu}Y$ z34Cnr?nE~*p1Kx2^yp1sd`s>cMYUp>6)`wfy8$5U$nY!b3HPtDKsf0B2bx z)KEzfUuz~K-)BTgdyULJkQ<}Y28S6tUxT$HwTc|bm`D+TGXffe8v2gonfaopKTUIt zkaE^RJf`;Iw91#Ya2bw$&C{=dO_f1n5pbAGo5B576B9fhrw-9z< z&B;@V2z+rLpE|?5gipM$?Wi}2@Ki_Ls%Id zJByy)D*6*vBK0(&To|ERvkNCZ+Veef)xF3=KsV@oki= zYyuf7v%L}2a|uWestgS}7|A9TUmcBOKu;9*PgmsZX5PyWC2rC_SC#1(24fl+x%BAg z@oBi((dx=d0~}331^K6z$d{!Tb)R#U)XP4%Kj^HBvPwt>yx7XwvUd-7gzmX|SH z>FW#mtaHdQXPs=aiFld|Y$KOG-;sp@7%A!2RMvur8h<44#L4l*3CN_~i(@WZa(MKd zjM0BzbON`?NHSX42ISFR+8Qi~;L6|Z;r%o$E~ub*jMYM5pHWyP=@1E4rh5af7d;X_ zp+O@R@}7c$d5OL|2V7+{hmC4$mB>Ew#jg7yD@HyYHl0=7AtU}Vesx$8w<_;RIb+0f z?pHOm6u^0&RXc+w>78F!E6kb`OGC>ldd9yY>}fJ?^n;OBu4rW8(93&Eu;B`_E(loH zTb!EUqN?tTXHiZdW2M!^P1o#PpmYm4O;%A_vWHqL4Wy8yZ7!xUda0WpG9-V?L zz{4OXY;K>dzzU~UekI^BEyKSNHJ~*L0MKsitv~lT$n!=eqJo|OX!2I!sB{W^hsf$Y zN4(z{ZjFqQe~_I1k}=!B4zE4vPoPaIXjWzbJUPoC#RCvdqH7s2Dgg`t3$)lg284-9 zfO-t{#d7h0J+zM>dV$+c*0q|>vADE^)#!<|NimQw3I7~Qox|9`p%9dUD;Jc9K(SY} zPMm}C$vl~%)(4grfQl%Vef|RDOzj@VdpLZ-_(Uf!AHiTdhR2$Uz5U)Sm(Mu1qSI}_ z8)57f$wYf=8?}?Rww2+u@TV`RgN^Ca`pPykj3qppyd-8CKjRbM?oo<%Z(-fKL)&a+ zyqE?N3NKmQaI%Pp)dCT{^1j$z$6JaD7Y?=3wh~J;=B5;~iS?=+S7O<~t17A??1vKV z;YQ!dyw_=os+}chEh6#C8gbu$c6DosC%b=>zdEBNh=U9vn~2*-pcq=#sPpb%&JDc` zb^%e?N1eL!lX$#m4wZH3?FhafXiPyjWGwOG-oHgB++M2|%18re|rw_TN4-(n;-gHS@~kD&69iTF|L% zS$N5U%cHBKx_AuoacO9rlTE%5UR%8Rus5>4$$HEIBFZIjW)~2YkpT3xvX#l27)(jC z8utfo(f87^!gM~;)mNak!AFiFJCuA8+#u~MTuS~6V3oHDD1|q(x8Zy>c; z5}vCmNP8_7AE-=&OXi+tKIscT5mSPSykv1?NB>EaFB>uc@QF~2`6Y1QXAFw}5R0St z#$TWkoqJboo8x865xn@ui7E^tcwM7VzS_zq%pfYFAV5Jze2n z?j}r<^bPA$PQUy-OeS}sB)%WZeuW{i-WubxmPkUbfuRG&=T*{eozvEhomlI%|FXr* z{Kg9Lg<67gugxkR%yU7Ay2=8mPMvn7DlH4~F>WLIsA`i4Jqdl&wHGtp-R10jZe~`g zJZG~~nQG?pA3X;lGf&c&$+zwlXbU*s6E}#M?lZo9=U;M-k~ZYEX3gw!|J+viYF6wm zl}w7aMnd5_0p=_R3*p9p1d&wU!n==Ta0$E4*Iao|>XEpS&g{cX`s^w1 zjwhFvhDGtBaPrFL)@H1b-GBaGCAY6CdQ9^${G3={6 zU6j*%qhx{~wF@*A5ZQ5~yjAf;1nhD9Hru4qmT$xx*9j1IvAQr~e2?^rYYh=nruu6~LZKlXVfXR`X&ZqTL zx()wMdobL>c#|JbDaMnFXmpYPtd#iMGnT?hZ<9aZNC{^gAQo=j9JEWICo^@az7;cB z2SR=MjDPlS7i(Ab*=bOC?uUL+uH>e|+Y3Ul>{TY?|M^JLKMampJdcU zCT`I=HKk;Me}os|O^@A{n#0xCj3ihH+kVpZ5ULp`{71Rtf#oZv2M&qVGd}SQQNvc-18>_(86h`)d!&dFpmn#b zR|bt_Y;AL>N-xQweH%D>RkouV6T*-5a&lV!o*UAHuHvXq7qHH6Rce)$3;3ZUoDvI;C1{v< zF6_uB51EeFY&Uyhb7hvyG2@%q z$}Mq9gP52YWdKl*Fb6ZIyW4gZ68||$BAaB{|B$bz*cHbW*$OWc=PVa zegOeIXU6?y`5Eu;TTu2IN-3P$CeP(WrH;|l?1*3$vK(-{*lXw1z4+z$Ly`d07|mT@ zAd&WNJlX+0(1mm?^#kb60PHSSr;i$Hd}-c*EBQljK&;(u3|g20#*uJ+KBGjRcYfl^ zdxpC?@<+|7MDq&8`L<=%4sQWSB~a8Fn=_%UaHj;|P9R8nybC=Yr5w-o}NbXr)FUnp1_7jEdodxM- zd83Jd9NrS&&y``qKjVOWH>LYjRktB)CxV`JnLE3m4o*R91L%H>y|j2Oy_x`GVOXmn zPBLf_IVZ2RQe0piMQmFDCyYZM+Yk{-^ccFMM+p zA5t_WG4xp~aT1*6ary3}+;=cTj?16%0zkf%Ao@Jdf>bN|u{Tm-2Iwqkf^impT3ccN z>WMPg!SlF>p|l=&^g_a$=S}%lXD7-Jn?x~5`~p1!0z!uq$JNUE+igRe0}JuH?{5tC z>>VB)O)Cr1F(FGu97q%GUB_;D%7%n+*YwcT*Y9!L3E!< zv!Yy|*b4LwkqSY7e4;yI*FY{$G_$e#LeA@cyn}P_mNaWQvIVu~1{?60gS4%szk7UD zr#QFql!{l{e|Rg+puv*dTx%rtj+&q`6wcP}Mbs~7(S17DNfw6vdgeU8)jHH62pWhm z{-sMkS5f^$HYA$0pmcRiG8gEPfmT_dU8Q7KrD9j51buq=CoHIklqddsEte-gT?b3u z!1`CiedDBDR9lgrv3DG(pZu{fN^Y1N^q3nommSN)M6>3M{&USB9+Yev7ML3rSQ;u_ z{frs&7PCwrT?w6PLi&oHtMIS#5Qp)w>IRC=yizsBE7H&VTCn*d?v_W3Gy#w@_M!YU z>SM*#so}QsRZqbo4T|n;bMaaJ%>&=jv38f)GQC8=f`0K|q-R%RaZkOl)c=o*QGb?b zf~U;%^TF+LrzJCT6!eT|j}_~^>tsW*{fYTa{i>noDP4Z&?UIYM8xt}tn(?GH!*91+ zj4RTYhbt@6<)_8{4EP#9)HPPmFUzn&pYJvyrjUQs;fFmd_EVbHWu@F0AdZe+12OPU zo%_17_Osy5+92AmY&VYNc`HZj`DsVTqWNWO;)Vh9AeXBC8Ukh!K5_9n$f9J@km0_S^`` zrQYE$Qb`_TlAcU^cjxqW3_P`^J=Cz-qb<_#fDiGssGubL;>-uHDei{{NfVd-f1fm1 z5w9BdE(HF!2o$Fz|5K>1waeSAA=K=vpFQ4kmwn@Z749GP!;Vzf(2j`&RCylG6$#DG zpdd66G>p(=w12s}X!^uvh_~lYHw1H6_UCIZdU^lwhfu*mtERI&1fj;!wawAB+-`xj zaRJzWYkFI+N?92 zqX%qSU=3F5GQYLQ%W8VTAN(qrm64b}8`z`=M3m%z!X`aX)6**pBBp5p6sTYqXjF#l z+RQgXtH%~YQ6pgcoDB>>P8(s4;@nB&vXbAvSz z=QI*((TI4owBIJ?)^$xyGjK{sxd!E(^GaLPtGflmx;NeP%`CSr{&SiIOB`{UWy4+( zpSx5xh||t6vMIKl1#@>H9a#mAW*{WvNe#sSC!@Zk$}QTNUig6$ztU8iT4^iI#}unm z8SqhhrA+)eNDmqbZ*~lJea7#wU#Sqz-ob>{pxe+(bR7UD)A?mvSC&K>$Zx*Hz#0T& zTRzYhTXcoj>9Xs|(5Adh-8ci5tZRuf-q{%#OJyvdztph|U+V?SjO6I>q+3<6V`7p1 zfOJb})-fl?T>{oAGfh(S3%dc+nqEi3SJ230=X;5YbBSj{ysGkDKQ zCDu9%i@KJwGQ0s<6Tc>pwwNTL3=ooJFfW1dLGo=G+p^%L(-2g<(!8+s6SiVsIgR=P zhuwhdV5O+q)dBi5R%5KTq{$!P%V42JzK%j2}?Sn0w% z7rCld#R2)|EYOY*3v3Is!w?ljF_i4W){O-rCMRA#_F&uZd03ijALtwbJl~S}GrNVi z?2HZ28$B?S92&m|7JjX;fXdNnsarHh;(i~1dc5-gGk>xL`T5n5&lUK~r7|ah^AlYPlW_Syo-Y)?l7PI+Z4g4}}9{eHj>JqWv|s zK`3rn#`rz7SRNol8+>8do(6v7aqEWR!Mjik@4#|}u(-fn;IlfMG4hrh2plZBlFPS% z5Ka~rBnFUK#y3mD$S%S{4w*{?wk5y%Bd;0sY4P?@pg4gFPgz{aQwD(IihM1moqfV= z7uOOR_0g44)Z^$RNO$X=zHFWCo)88YfHV&vC&WFJzI?~z|hG4+<^QQm&b5DZb{U# zd8n1a#e`k>#pT!-Wdx=6U6`%y%x|be$X_I#Mb9c&rf458?iPBrws%NCpgB-ghvH*k zpv6Fi1?xG@uT%vNR{yP-!gAPyA=UZ8`s>s9;kP~uYMk$ zlnMjmCEth*W}Jl$tc+UiY4gHIi%x&(jKJOP7OI> zJw5!4pIxosX)Z+o+Z7%U`4P%E_i1wRT;&pH-{4OlOtHy*q$hNbi2@Vs=I`lWD88)P zT>^_rEW=(*y$ixUK~88zv=N<4Cz5hmDWz`sS*Or(nCoJaoXNuSJWa(igr5{3)>a8K_Kn&`394QY{3VMoH5aI(xOIm59zNXp;)hQTjyJb zB8|Aqy;(7HW&oq`C}XP;#c->HzVa>w5FI6$@(iY40eOYRX{hx}Rk0AwAQ$j(JUr%X zIpxH>%eB%(v|6626!{hUd8@E?YM)uyd{%o`l7@x4j(U%930Eh{8(q~Pc-#1=i21|7 z@6w9UWoLq16vh;vH~XMKMT5=PlE2J%!jB)AY(9328hT7%bq(?PsZf@SdPMK+;kUh> zB}sj`F;!^d^?g;#!(-Ham$ZmEt7fW92Bz7n(qAN!&*$j3>*TSs)_dOn?@R~FJMaGoR zksrEN)H=Owl&L=oBZtYRs5D$*eo1|w<%vs$LSB;+L#7(m|6#1I6=zx79T``EWopp4 z-z`rhZ?5K&9b&ypNg6geocUomBk@}HBq4X*2bV0r=uX4m@7(H#ObG#=s}aC zhyEz^v7YfC_yXqy?sA6S`7xoJRBZc)T8g5hOwpmuWRh0wP%O!5v6-4#KPlp187 z!gMgFrpUwHVCL~(t?@!DXkj;6))=c3@bNH*>3kI7&MVE=lAVHs1@ib3cSq*+iL-z`EW{QG+Tqry+sRkYvPMA7RJd*ROMq%vd7 zdm$l(LI5yJwwT}?DpU1n#$-gso5-EuSj}{Fh%#(6G92-E>L0(1Mq{_tVv%B`QklX?(y0UD=BrK-$S431Wl0 zw3O)Un3Q5{QoK3NzLkMt;coDP42x9o1R|l^Rrw~~W0F7Z=45q90O9<0ooAfg*PGYCAg3FxcPu&Oxu=xA+UtxWArrqV|0_Zq|uU;AJ%U;ibe0mAZ zdzUHCl?hS1xNO-)2Jmg+Kf5bwRw4^l5=$+(g3MBxu!7OCf-$T--^1qlqiZ;gCmfa) zb&|FRO!D(Z`JmUPuQ|NMXI+^%Dy{eG2vt$sk&nVuaqtG#6_7!iqNo#*Q)D*QUQkA_(`F15?q%h5RWdn_`YTMH#$xg>9 z()BJJS&2A!NmA5^tjyfYw{eP*5`!$?Q(bO0#(e?t60A(0Djn;qDLzb&X6Ri!@6Y^Y zu1fBriupbwg*Cw~REHJGBbK8%$qFijNld`dg%yA-7<4j9k*ASi<2{YfUhz$niE<;i zn-jXVO8EJ`9h>hq(!oShKEi<_uJE|wEIZQ)NCt|HtqMzzXeo4>z7O}$a;!lE5z(yS zpa}uHZ9p0GF_2tydG!+dqjJ?h_ROL@&`U=pB|V=9Ir9fMEgx=Yt-P!fD}7KPD@b6R zAYSod6|cA>%FCu1aIlqcL~FbY;a$gbw0V3}Q&XBwD_Prag}Qe;K>Q{H+ktcWMvu5> z8s-Z2qKTJOM+tL($laJJFlyt^9dXhkgQ#}ThgVh<i+f0Fcl zUg3_B$HFqV$lhGXab}VIeDTrkEuFM~CpL=8FaPHG65mIat%(iGx56aTtwecMFY3xJG9QkQv#m^2_d|@BVTCV-rng4P zm5&cRLWkAWEr|;28Ss;`Kre>7c%;!Q zTL~q=oYfb5k?R1t&-QmxM+Ca}qP2ry)mw(>;M1{%5{+$9hw<=3(UuUJvJR@in_xx%3v763 zRPZ%=aED<9uNE8LCI>oCF`ryp5mD@2ed}uwqekB=cShqKJdn4W{j`VYH^pMzOzm@0 z*~GgJDpTL@t67_))lsQsOki280_-AV^80OU$ZlxtZ;)&1TU-TYAtfxVE_VIHIe&&@ z+<2-y%tL%ReQ@G5O>qG@aUQ?mI)wd=IkuWUcxoOW?hzsw+Z=BABf_JjIb362S$N%; zb4z$AoL~WeOL&XwT?L&v{Bz%V2s=)N#VCu`OKky9(oivIRQbzCr$KNKt8CgcGDP#8 z8L@axksb}Fxxd2p-$pGANeuODD%r=<&En4Gw@j4IMe=q;!sCeHT-M`N&kHM$80IaB zxS+S+8TXVU@(hs7BTRX0_?ADcLh+7=MW~Ztq6WjSPLXjsSA8#`Qk_MnPt-X6sz{}v zmE+qZef1}#n=RsC-+4P1cP3GuaMXn@y>4zA^&djxt57U56{m1Q3!F7Rr*kkRxCPgO zS@nC5VkVtOaagM0CwWbujm0nTn|m0elT%K^oYmeX1>~J&+l#kZm3wRWKP@;|ntPfA%L2&URwGDmtA>CJ{N!$j`)*wteMJYrI1o5nY~c zlDPK^(Nsi;red6Q%U(U-YFl1AI@KAi21C;+)cluL(l-?IqdmSEMnm$ebVF~5Jy>&W zIOp_|O-#AP%l4TfupovSM!j2A@Z2sH9!yu~m*U|TSTY0yZs4~r$Aki-!g|u$R*JO6 z!>f-}2}eOCf=;&hKU4YV+C~j^j<)!DdR`bhFTFJqE;nv*KM2<|&xhWeN7Z_*=C7F- zPba;t87I(}`NGulriV?y4yr%kZX6Z_ziXZh=MrV@v&pfpwxlW25E}Wk`r-ay1~86P zZ=U=ts`10|pFC46?!z)erB7ID;zZEEh_SO#VsdR~%{LbeE?=K9+BH@S$+3hyNRMR1}4j}i)iU#j%Kf3&`Y>L%-%)*ZlhBv z?D!gi8p7a@o_Rh9dinK21DX8e%o3mw=UgKOYNMJZ31Cl|2jPEpZxlUnjeJG?vs|`g z&>@6(*J|k*nSD{`S}Kr7J1;2-a41SpXk3F(G*#l|wft_RJH?PC7{ZXMs;6qM$`P1_ zqQhUXMGqpCBQtH=v|io4ne%B-gS652##AQ?Em3MLU8B@Rf9dt^yZDXn7%bCbg)oYg zKv5#WU^!mUaKC@At#A&0j%~p{`b(=C+wC4bWb&&rd_a7v43NJ&p}Kcoiilldi`lSj z*r)L`J+?P-X^2t?VuwS;H;?I+-F+oK)?oz%0+b5T&=9@gShU@hiI*C~rN;<+2N-`H zM3$!!0#QjakRVnV!zG&Ej?H`HvMLibyXb)orHW^38v8O?uhar??LMx2JLxzoGYuc~ z3@36L{gB-8g6lKYN4ZTqRu^~z2T)krO83GibFLJU%cxjbcmQ@UPvMN(7f9dzl-z$D zoYVBd(s?rJYQ5Iv#y#sskHBF0x93s)RZ;a+GJe%%LquR_hDkdeijH8x+u}fuHN-$g zQgz+X+UoUFY4VGD$j#W7p(@lm-mHO?@oIbU*eA-A!kg#g2w z$Ydvb#xiGuoEO?$UYB((tTthLA8GG8Gt!3=KgJ;W=9#|yZD5pCye5=``QasEb#x>K zY_?8zv0~IpyOOhL- zw=VL-RKQXLfcshHFVgmMNG9Aou%qFpA7|Y0c3yI1h%k_ zS#Y+X)p=bOX6KvhS9^YTo7=0}G1wa?C*+?ssRp4aKdM5GIz#th`ITjkr*o~IV$A*4ADA;n(WZupc%KTrnWC z|LG}1nFdjTovUYuC1z0$-0e5Fwz%5{$`UGJ4HuT1q!OoUI;o+-55?Oyhq34OV<88- z$07KOyjJlYkb1XYHsPh5(@~l9WH^Q39b8b5dN)>go8he6$4XHvu)|PZGJbZ)lw{u| zPq$`iA5*EUHfM0=<5_5i^xVz(pH6}L=idhT6F=Lfnn?Bi%J0Q}Qgw0+>s4LFzT$;m z`>hfcSb+wO^)m}PrX`KT0_dV^H$hZGEZK#Bx-!#Pv}P<*We5b~Tu9fVkSB57cZ5{Jj?eRJr#EZL)r_zi zUfMT5ZCvdG*G3z(u%BYqh;o42v>QK!NB#pLP4cdMb8i+Y>hDQ*m|5aArq*pVew8I_HbwZ*wpVEaK>j}~X%>CDi%UC~p zJp31s`n=M$t9|zHzcS3gw5nbqjY9LIQZ)b@r=Nt3g?{Ivn#v+{b*TUN<4f+^s5lq( zFA#Xjk_F1$a?A`&@*LHZ7p6*h_$M-7!*vmhoOpmqEN`G(AkXu1T2J}}bxGK=7s8k8bf zMmRF;N%t)?4BPhob$)uvG6ad=*u8>2s0Z7HBXe*UoxQ6Q1$%ZV?_1hZWjI8T2@Y^l z)=F{zZaiuu9OQq0L4+YW`gT8KWlc4-h(z*kw-|&xD!P4yShLf8#OY?CMA=R~63)>8 z?=lN3oAl;6@KySno3qH5!Q7`E~c{bg6dQiN1yko2)B5eJU#2g(ijNiVgj0-h*aNr4wn;(cH7oxV+_} zG3U{iD8X^Ybsz|lHy$DLYdtpdAQ0w61N|*RYY|9d{uJRiK)E_90*X*nXPZEd=;S1X zxvCa#+Q^iLTZQN-OdT(VIaP}Kwys5>(;G2vp52#Lo~oko`sGz}BKDm=f}g`SIp!r_ zJU1OvvBY}zF;-2R>(f2FQAzu5fEW42_6I(m{84Fc&5(2@CFdx3wn!bdgbuceJ7{la zEB&U7Ez*4nFp2`o?_%(@oxtO5Y0^rb-N- z$nSs>hy#Qa9VJvT7VL2_g~z+I-CQDJ0z!xA$&v0y&VKk+WDoZ5zrq{Te1-)COmCdU zTCuJY#+c6v=mqvcnLkGDhfhY5{P3_V{ycI5{;st%6~-Q|VkhjL6_M%CQS*F;ERF~D zE<`Luz6r9fd2#Ef-Z-)|ZTtxw@e}5L_=bRYCQ09pGSptrr-=18Y!Nl{6*)r*-PYUZ^ch2a@d9}WO|myUL-Y*eurj@GOf8V8&G7y?39|AHb`Nry6zR2 z0a96h<~go$i;y4tGg*CX^ggGtZecg6nC8n2K^ends8B+d{sq>5Rzex(x>j5Z`@&xN z8TR12)K3-zTH+w{Bax)umZ;r)SP3ac9ubTIJ0V{lo~(|o^qVuO4K+(&L9$Rg3y|zh z$LNq4ZD_)WIn>mae2`%!T23H1i0x6AXwOc8a`46M(L2-Zy?1ut}X53IV zj=l}aXM2Vq-A^BSz6kp4uRLl1Dd(8$virHKr}I$wzysQcFcbdVH!T}+v?GAtNzlL}4RSRCp?`N98Ifr^R2@VYnQ z^?ZN^gV1a~fZY^;P5A`0>G97O`WuojQW;lfzpPXL}1g#{-(WIXG z|C@8Kypk{1zdzM+^{_aF*iSQMa;p=}ueT2fS>es>e(hm{c?7RCRE`ta8j(0Rye%VD z9Ne^2-zRt@8ge0(O{%!A>Grj*Q&;|xTpmNOa;9B|_RAC&Kf9Go=lj`7oQ5%+Dzl3) zR*Rq1?y6yOB*p^QbGR=*UnlDw2}qZ-+_Rt{osU^R#zpcI4+mlyKG*e}^~0Uw{C>Fg zm5sG36*+ z2)Zo_m5ttzraaZ*62ILt(sWYPlC+fJ+BIEgzW2T82u}hD*LgBx7h^=DbdJK-d*$GY zUlb3k$jGgMtn3hos249XVF~<0RC)=~Pm1s!l}dBK@%(jQlB#VaoKUS$MHgY)TMUA6 zf7&gacIhOT4^aO~VMFXj-W+{5?yZ7>`Q96X5Y@0RPj3 z<05Ch;Jq+SgM(jU^nT1nSf7P>oSq z^HrSBC|OP~#U>?RkyW2yp5V*L2MJ4~mZF*@f^pdNCpa43K1y{(70!~gH>?z7doR@S zzbbcRD|Mv8dv_2pX_tf@TtJFXORPXdFVE!{lTKw3ROOA>9mOgc2PT7bK)ZpJ4JN@z z$G@fC-^SZ9kR3##zm?32h_lIKNT5=jQ6}v`#8oKqFKG|sI~cp>(=_86zM{=;ph!QV3p<$TfMPu5s~urMg?v=rFDDL=i7Sm3wRwCfBaHb0>9O( z3v1!6V)ZGTEuXC~lr!(meHM~03GkfSHWuV{v*B9hW6<*9_!u}{)=%Z@DB2m#Qqe)$aZ zMh}EgTF071@S$o`eK|_d^uh6#o_l_;(0n3rfIR!2=^~##;yHDyp3N|#F1W(2^ECJ^38S8ekfy?s?+M8#mb|T$}Vk zcEIKXRg~ghRe@*X8j-6^({w{x}8xPCOEnI@PQaj%lR>d9rrKI1v zpz3}@-BH)j=Oz4LIQWb_7nzX#-847BfLgjIA;Oo!A+`6s`#r4=_#;p_c5Gusn!HSB z1nE$+of#TG-xGYnOl(r-$SrGNvtpA<9s^tcBjx4Z8wy78;@txB%{axcl>J4jpfe~? zEUd6z)nA9IWS;x&MbY=|R|OEzq<{G0@5Lt*RqT6xu`;J8c9eO+@p0HD4yAAL+s*xf_YRrq<)mUH?FaOq1?UpXbb?nnxb3v=tO8S zT_0b^dwp2aUnJ-1WJaq1;ST*|*wv5UZy{PU)w_{UHPy~!#)1doNBxw;nX7h#QKLcNoBwrWgYEKZ_r)d_Zgn)`@=2XHMfsd|_`fvaD zE7Jd)joSZYW38uq)ES~Q^vCMH_BHci%4P4@>>|?3f;& zvkb-uw~Fg+IUI4h-{gO9s5;O-`HM8mw``T_jUeE&w}s7gDg0T}zrhVz_E5xxQd%K) zzsglv$>uH=iXFGpA1A+m0F0gd-WJBorXZ!Qk*KsS89K(+vDS**gs6`Q_#y?KlNHd zz~OtH(3_Z!g|f+|k#)?Q{x4+_PLmqBMXJW1*{peweMG3={o7@3lYYq&yvbmuQ;05e zTDreEK?Cn;{gLVPoV+!FFT|6sofOFxX_&}fJbb6v$tS#^NDzK|hxsh~-9NHD+nuFW z+Zj2Ej*?g35$M0}g|Wu#$%RO;zrNsiINnhQir&cH(hc1gWe8ianl&8^skK47vLyEO zizZ+K{4m&Jwgt^gAM-<=X^xPm~F= z(Kre;Gq3Cuy?Q7{OIcWg7j1$XSd)6Zto!Ax6Yb+s7TS(P-AtD${KHOD`LsOK_5N6A zP?D9KB=P?W?@|>}mC2BTrdzF>2y{ZfrJ0)|jv2Hm6sV2(N)obF>U*9l{vfrm1)jS`45mqqzTyMQMttPyD@P7K^ zkC!|B|DWi8!0(?6;qIgyj#|NC)dtOfe&+Q;cpM~`|HmiKW*^*wbd-Ea!pqesv>cJ0 zGU)x5nN%@h5F5>%?%y&UqN#=!(NVWm)& zKhQ4(|0$YET>~(Q5vW+^lILrLzwGVuRIT4m{}kB=u{YX#_Os%1$p5K8hF!Pid_uXN zZtef6oZ}~Soq|wEb6oyY9n&3h**m=jbdRLB-*5>oD2shupv=gF7R|~?XqI}WK8fHb zmF?4Qn_n?QoxfhcK#lAFC#WZhkg3>EtC!t^w4ci05%n6y{vA6S-T#s1HZ5xa8beu9 zZ{d_U`&0E1t&CVWNME&|ExZ@Z`?prhIWaE#^@KSU3+qt0bg2M+(#Bhe8gJ>}R*uB+ZL$vX7aqsK}FaSy<6is)0!E zn8gx{$5HN>#{{Z@LM}8TnnFC7TAuX1O?LvAd=YXtC?q>H<81;oZB0#f9&%4n zL-D6E#`O_E6TLYjpiKdA&F*uq*Ar(MWyH9%BRW-w6?E2Li_TasLU=eK(CLt)tx z;!OF=5x00p8#V67%iT zu>Toi-I^BW|_4kYUIBC6*o`sPa0|FBB$pZS)aYW7#Yz zj~j?XyKR3i9`0lex=QgDwCqZkaa{2Ww4!0NvT_uPjjn=0S*hodrv}`H(uvh$Pa+1je_-F=1RpK$fL_oYkF5Lta&KCq7!ZrS5j#J@Wd#!nf?furB;r!M zcp)M`>xtA;pq{hxN{;Bqq*+D`QDO%e&T6uNX!Qn3m)%?b#3WPXDx#O1dk<1f1;t|& z*sEEj!xxVGdfkLpn8-kKq$OS??Jp?kywgW~{22-K!zRBPU3otS-ljxX>+pAu-bf3I zqm=`f#K#abT6rC3i9u@%kAshvMzKZI#Bv;Gp54F>-9t68as1A~KRgshsthrqYzK(} z*`v?BOK_SwR(bXPWoKe@AFtTe@AZY9*4*s8RWTUp;t^&WtGi^se|PRe6oD;MRnz6NgC(UNwUg zQ=(}K9)M-0`DeBQlb=Ldj`o>xA0@vneqgVUoT!0H*ysbe>%AnrE z(6OeB=DbL6B<-0{n0oP?-?$b*`kwqu9^+)BY_rYThx=c>QH1K6y&d3cA?FdhRDrK2 zT;vUXy4Jpll*;z zpBh8P{^L6iqYN>wY6sawih=jBXLfiC-mSc+Rdns&sb`KC2e+`zG~^AW?8ZKQyR}=c zXy8P9Ryvg{B^Y+j%+vF&Iy-m*&WZj|{q~=ELjy}q;uDtqa3K;Ze}%~Eesp>B zoTen(PbiyRYMhattwD@wN0^BzoudTw><7IHJXSY&xFj4(&}R4EM3ic{K(KJ543vAJ zgERD^)5S4^oyJzJO_a&3-U9QhloQmbmABithb2UG4|6JH#y1|*0|5F-r2Sje(PWml z)pTuowqHXHSL#OIxU`sxWYwk6N!L5)VC+XI5hJsQm%pSiZ$)>FW~H|92{aL;8Bi$2 zn?zcnIDMmPS6t)Xm$Yf8oaA&LuFb|xLXITtKv7OOJ@6n&ShtM`o}k8kQvrd<>*9YA z#y^1LA7qJ`kW1)%P0o(~7hpccKcUP2L7e}MI1NGM@xSI?I8(#1{md-85LGpJfqA@i5##rkw{L#NWzy}H?RjY#6*+PH~y;II33e|nz7#>NVF?@Oat1Mo_`Kx1Mka{*Y%LzM|NIATrZhEB@0&39 z9VKwX{t#A53b~2v@}J1t-o-R$8;`fa@pK0PRW;$uKO%fOY7jgS{4L*ZreK94?r9l^ z=-OaeDjh5g-;kAf!V>YI^5e+a&;8gU=FkrFl|P%dHBsyaV%bi6iuwfWf<$k(8{eriQ1ZU_O_5o=H zb5wk>#9{DTNr6(iv+?@AU%7?EiC0jEq+;9;ZMok{8v?`Lr&cm^%Kws6=IF5v;9s3^ zG$`*Ex&jAl#^_-m@a`(A!Aoq5j2Wv^cqVF&i*c&oG}AmeSjF2X56x*9d8S}5l882H zDmjR2U3kDO66zpCoI{aW_vR>)p|rDAhHH;V&`wkmOIBw1h8PQYAfXnfZEKf^S&46fOdu_(8%+Qlg3*!bq`x=Vwi7YNc_fL5npl@ z5%2wOm`dSQY+6UvNycn}Wl_K<%3e!(i9R5J0qZC zD&f`uW#bF2pU@kqjb5}Z;NM~L%jai^P3SRiOYsal_K7w1Y@X0}8lhezzcgYG)((+{ z@=ld>&g9!fbE6Uh zx;{YB0o$RvxDVy_x})@7Dx4 zQAebLaaqkn0?pgy5GO>C22rGWgMUjil3H-W&9pP*^)cq;%}J*7s1)Pa(RTSFt$l+S z(~mHdY)a^KVsj!rYd|ZDDzPZ4f042n7LPDtHn(Bk&tgqy6>2B4_kRk4a681@K6)f z2=n5lx*EPc`iaU>KE%bzF?6Hi>YGm@Nt(lacKt$NIVAQEuvb=Fi8;E`dGn0M?#Dm? zcXdh=FTWFSax$6Z?}ya7oy(cwFpcwHxm)C@X=!;+6u=XqdMPBD54f)rnGvRTdd~0z zs6lCcdM451Y1lBS0@VozI(JfP{D4@+g-yrtBZCsnuaZ9-)$Qz)@tqk48^yZKia1;G zvfuAotp6efaMrIitY(QEhFZ3bJw(`=*VPP>R^X({0kgG5%Ney(Q#UJp*yu7j1|5Mu zz&wiKNK49n#c06-&ZwK-0bILrLRFH)DV!PJiZZ8Sj&`5i-kUDf?pq!{GI5k%O{5azU zuCLE86+oPVaEP}-;=A+wpj3)T+?0b%zo$6EIT@cS zS=W1BDOiOdvZMc*j9LfWDnM|o&mhG6xYX(ifQCj*_bH<9%>b;NafMlQeGkd(uM(}R zt|;y@F#eEBMj$>%gZW1{txc5s?U=tvE(y2*ad&cskkcrSE>$}F_S?Qe?=U9ut;)QT z?VIM@Z#F{vAyYsk2HR(dB?XS3AE@5oi7 zQIhhLDyPwSGG}(fV4+S`!8+QzNEhR7=|to(yW9oIBIOdvUr889W17kOSp8lZHP#bI zBK#+s-=P8wHqXYkL6qoL5?(!5eNbVHX1CP7IE7v9?)Htx68W<-oyN-|1Lm+!G0M7W z1s)!THC1Q4FU-NXu;GHh*9Zn?*~aRk&?peyY3%nDTkzRQ2+)xw15@NM$z@>=(~E*( zbl3@@&9=p5XpyKIK*jfWn*I}Z0G!oKX=lbbZ^fUvJ!{|_6Wu>nrmvlBC5ir{&+#OB z!tm8EI5c)Njxfj!h}xTOUep|R)UM| zHLI?@iDy-6ZU%5yx(?6LPOKSprlif=K2(^6?E&S4ft>RRYBzSjKV0X|tfiUyg>qMF zZ~WQ|Va7q7Hb!UGMt9lqFwEF^S`o({_674m}7FO8WS)a%mRsa8(`b2$Xr z3VZl-KzDfaSanJrr7C5yhhNaJ>lEL^VF+NgawvUqdLB|t;^Py_~9^YDB0yQ zAzjC5Yq^?%AiRkCmaX7itBT7?D+B1Ac^|%jRleioXzeI!W&aT29P;7?7lc>~B>6=4 za3;ZgYe08n%N^fGurqkPe4%FP!xNApYW+|$?J48%oDhqW34U2bM3jVG5WR71V>bag z7=`_kBkuGEk}@mQgqDqC-hYX+Q`tG(nX9P@y_t5PvLq#P285%B=55zf)US&ADx}UE`7nk6Eaq;CMO1%`CPx7xgyUwgT+piV za9L&!p(mN_@@RefPMENIp4&2Kf&OjgHqWP)Be4yrIFPD0@|{q5N(}j9uC|`g&xh2^ zB%|*^AHT1pshw3)O*+sAa9)^*6zoyIitvagrR6@>4ayHY{m6rP`pHARfs4ydq8ZWS&8uQZ9)6xAE!g|)m?>+b{Uv=izCh5wp zSJ(45ufx0K>5sdy6c$BXne2^V4^yAH7Zl!hNd{!$RvaiON$iG`ui4*I0q4?*h!W$X z!*~RX=Wf-3XMruMf3nm@`C|p=619_K(*4b4ZV11)%eP)&foZf-qeg|$7Pwjydg{$Q}-KxaCmHU38qm)<3e3^rB9WFE5_ zJ=~??yd}-1VaPDd*E5ZZpA6yDf|_()Nw`sss}&bREK^op!h%fw6h-Y_KEG8fH@?Sg9Dh4{A z5sNBGo881Y}i%&X=WAH zB!AZ&x|Q2mt1_q;LAMz?+NhUR8iuSqT4bwKk;Kcm-wZL%>{7*|^bzs>MnFQ+C2WzMc3e^`c zmI)-P3UB-e6O&get&RW&4q-T*<`y&XeDXi8HVy~j7@7*KyM+ssMsXJklI;WQNTMvV z)oIizODQ%ODD1T*vckWy2Cn^z*2hNFw2%AWxxUvR@gR|3B)Wqn#+w9qj(WVL{Rc}4 z=3?Gxo_T}`A44V9<4Q<|Bg8{&YLl-QGd=NOS*1C|n+i?2XlTiSAh;m-iZrI1_#Ab9 zT(Uea!_|vc)>3d?F=6VxGb!086nPfP2@*$eAn< z=Lupxqdm!uKP8?=Z<_GO#A4)Hi345}Olmrsw0eD|!P{kam7KxH3WsMo5A^2GgD|JN ziW-#Yttx%y>$cr-6*feoGlk=4`lCVAK|!mq;y(HHYj|=7=s{4lC=FWYipT6zdE@$y zYP4u&Jq$G2G?>W?uZy4a&5kCiKS z9cqjs_}Y;4r)VD@&cw+WpN2yL#W6x?36S|DSfHU)6qHu$N)^qPBBABbp%|)3ve%zK zo7>$oiBwFIx1YV^ubRo1!k*%lto1DAT)O1@Mk4x5%G$JZwvz%r$a9D_H~M`iDMM`$ z+UN0UZLThAOThGF@m7D2O`C?B%F&Z~CvVI-f z#2s}S>eDtBAN+tt-O{Xw?Jiuaie6|U9CJaG;ZTQXSZyA2u?TUO$yTpVY44#`aY0lD zzK;K~&Ua4Vo$bzghr*{Eg;(hPVo^~_6*~9Ffl;YJw${~NNalFzM*y_NGAE^yQzXqu zbMyIeICG?mt$o&cX*t(Wg)&B^GY!WA;-QVk+o)P&mVf)tERdScc~T7k+uTrr1dnQh zSTbQ%5$v!6>&?A5Taenst;zaW(;z!84Oj_mBUaV2qWk7V?o~(}Bj6g|5L38|hKe>W zsm}fwA;8J*hVQCNFKvi|oS-f*b%XrC?TB(Pko6(C!%Hw`7Daa&ptR_8qJ0Nll8N@SQc^f3MttNeX zJD|k7j7+z!B{RzX(vJ~R!hAvK1MzdSe24y|MJ}8YfB3t+ePp`T z7XTgMaaeFwPkd4UfKI>qC(;kH%;w&6bJ=MT&RFeNVS$y)m>WpvQFs1@w}ToNV?C5c zZeL|NGP^4c#M`_wdby3VAX;U8TU?LoG)CN{lX^W->(*tnKV zqVW+Bq>MR(rna@ow{Dh;_i^SLo(PQfrhFvWBji@NQcVt3`MayXv#dxMnr7z8Ld&=J~}P$vCE{(UWawS&w3&tZW6 zPg)eaiBnMBA%~I*{3kqMFCxt;0yk|9v#ZYXe7Sbfj2x|)YY_E}AzO-6B(^#c{)v|V zIc4#s)WocZn4M}4Vt${ThH|PjZ{QT|BXTXHEcz)U=2MeJ4&xu|k(N{(wPu;q$fGF| zR4J5uWlNwutRN^u9LdYC6omgEma*6FP*Zqu9zxW-4Z4o0yat`nSF8JGIN9jom12~& ztXFvw6dAgXufF3^j$LCIDm>7jQ>cYM`&zaQ0z#<|f?WP*3K*DT7hTndm(P60Mm5wY zn~4YgAqAYa7=|UPaJ;U;-g7~_YLzICa*fEa2Clp+8~k;vAg$KExW zJR!M2ZLRuoL}txR*!CO?wl6*{)S7Gm4(swACqmT|H6DA-Rr(#)Z9C>Bd-a3hXGd1w zJCf+`t?c{pU~aEAE}_;0hgcH-A`)`>LhjmP6Q|gk8A_~CHYO7uDILI;a>%MjrmT~I z+pUp6Nd^|IJ3%x}8?Y&PnV=ZUsn*gQrX@U4Vu2z8khXU~&9Nvl9%5q2k>08MQ^wC0 zL`6Q{lj3q~6pSRwb_I!Va6Lx4OI2nWVr-cJ2hmTeK+4g3=r)?^Hbm2i?J&*Ql3L$Z zFCxF$*rax_(mVqp*DZnxwI+Dxw@^ko2SSTm7Zvd~w2#j87%@m`!8^2%+!JC^-DrP& zh?Aav86PS)+@aJY}|NC8fpya(c4;KIpYu&gYUtcpiTtT%u&lj74PzBDG|kIMcR z0{kFb zwG}>H!^3Dpvn2gL5008*H89Md@KJsm>S2=PcJ(yfHGF{5!Ym7T2E_H8AIGj#{u>lU z|EQN9eit-P7DcDZ9YxWUAnDOhd`No5PU&g48O$p_UJ} zxl5A%`Ef#SWCp0a8oPZzj>jw!n_eJ)v361#%Ps0Pm<{(5DeXgRx|e)xUNl~61s+t6 zQc*q39hPFAFg})RXNA<;@Ir6CE9>$v`cE24tN8rs{6U7scN8o6f_4V)kK&ZA&AVQSQk`3X7>I~JEUM2v-Su6@sGNT{{s zhwq1zx3l2oyJ+%D_5J{boS#DN+TtS-O`ZQL=_II~z?j)OvsSjm`_(jniG^OccY}ed zg!#DjXO$hD4C0ZC-4X*=!SGfwp(Kv@0UHg}Q1$^|>Z`J@2X*LrAzM0tp~(N zy~Y3ABVR8?@55`-=P8t?rqkEg_Hi}Hl^Js>3GE7SCTdSe>oD`ap(+G3- zgqcey#Vv%sU07#zT4Ga`v{JXgl%wm&0^-L+$Z;!ENAKshc+WUtZq!DKh-uJIOoDo` zwF|8MRDm>ce_vdnDsBn7QUc9(vCysN=CV2A zU1gSrClr2Te0y36tJ88}M!1z0lNn%!WGbOfI7}-=!YNKOpcoved=1M(bazTH0gWmz zQtP%LCAS@T(~&kq?RYB3rVBUs&+qT4OsAU5V6~^*l{Mton8h|>VWgrJnTqo-{&(_Zq+?_^Q`V-+l zahhTIk_yibImD{@?w^WDvQJePVWSv7QwY4wZ;cD=vzL64YcE5iCXS(Eu8{Ftee3rG;v-g24xE_^c$H#Ao$XcfZXhFd~P;Ald7jN$FR>GI1AXSpo^ zibx*)EK>wFABj|%J_nkP7e2cjX%*}1+FnN9@eMJ0{{=W+xcYpR_6@OI(Op`o4MMR+ z%a8Wsxrjwm!%>v*TU8O@J3aJg&}+1(LN#lL)woMAFg_9)R^O%l<1iG!^Epa((JStT zZT81jPwG#gkEb`9vr&zl{5tRC(Ydn~2cL5NVp`w66(>nxB&8rBao8E8h)2 z%$~iPcA^WteQ90C&VKc!@)fZ95l^Du3l$wlz1Gd&4S%fuYc1jchS?s+olm=R06Pr^ za+PRM`zbA~YGyT~(b|P*rMSWDBzI?Vbmih$LqnyYK{6N)bT5Mu1B&#@n+%r_fHI?? zE|ss0W7!rs%G9F{@To2W8ogTA#k0ylLdAcC3%N%;AR&oR@*iRBKLXpo9%q$vc9c~e zn#AV|XHGTJUP~$2l?87hA5(qLP~(N-hY(4V=r90xTX9qGk+~#vPgeR=U70!q8*N-^ z{(0uRnpNjoGCH{sHSi>H`8L=7a^*(V=<1d*%uw1eVf`tWer5!4Fwh{_AdvnbFbt(a zY7EvN0M_@$Gl|eNb(_s0UfV)EzcD*@f;I_K0^i4KW32PG-utG0W)d7I2pA{`aFBl^ zh@i`3T~*;N(?sQo<6H3{B0dDc0Z7N{tyKWPV~dVnhcGs_vC_-#o*WeA%*az6EaFzT_T{`qW-PzlPc4$RTumv@jzhQHN8z5b#`=kH!BtE5beh$ z@pf`;<>w&^1~N;izmcc~6&u|p$u+rTkb%v%S(HbF5>QTPZ zSv*FtJ;8Dn4bl4m7=8b*#PDC~UmQNp#c&9r)=!|T0(hci(h@>t7efQbj5WqR#i6o- z1C=3+#@4xWJ1og_f*R38y`(l!Z5Iu}RUFtS(QHxed&6=R6mJ8`n8yDNlmHwu804=7s~8P4Y6&ze&qRp7C$>u+8mG5-y})wA_ukQF{LXjv^f|3GA|ze!&4$ zpiX%IYlc#9zg~Q2nJ-dq`VS1gI%l|#* zqU%g2?!2=qjuEjyUz^MWAU1U^trHIe=VJG23QQ&3gsN_a=Os9Pu)L0kzWzv7p;R#a zq!z4VlX=2JOX3h#zipe2ccmu-m4d=&VjurKJ=1c5k}~5VDr!97dwRAhu#yg}vO5w5!kHJzjEIQx(Izsvt_1w9M= zuZIziG_XX1BORI>2}LM+wlUBsQZf%j``C+=naiMES1PY5LX&edk&Y{tW?7EH;%)dg ztMN_iVmJo42uv%`okXEqb8hmo|ZExI@O zO>Kqp6pLBbxzfAX83#_+!!gw!&lV#pV5Kisma4=MCxy`5*F;@__GP%yd*Wrd{gUYr z!N29h#PG51zk+c*@J=@1q0ayuvo|T=;5|T{hO@&D-s57P(s|1Ux@}aT3M%`@c}pALOGdR={IH-8!hei6Y|{yg1wM! zrs%VoT$z#BJ&LW5!zx-!j+YLq9kWR}8_&Y8LZ1bKnYhr35Z2mcHS>Jsx))Vuj1t3B zEP4Sf%mnd=?a~w&*cQ0|OrbBDuJ2+G z%YsdWgIy_EsK2O}Z{AL}z%2R0dyilFa{-SXrZk874`b~hdF`fGXR}- zqkl!c35f1VjRFb+1_lZa4gn4dg!Tk}KtWJRSwv8jje(G!Bn1t(1N(pGng0*96I2M8 z7!h{#FUXy@iOWifpLRuDN++fN59s-s*$*ZG&z!e3h#MxY^TwqfX?x)+Y#(Zx8=0Tl0oQ9V1}TnXu72x@a(X5oFejK1^<`AiCF)_m5J}8%G zB*T<6JfY>RwrU)us}S8LL-w_U=y%N^{MGQ$_XXSz;0q=IcIi{@WTZK8&8Vm)&U2T# z6jub{l!a1KKaU3!kG~*`Op*>ZnybFDZ=45ebwz}9C4Gi%3v0O^>~hE|7>A>Wd;y6! zL+A8APvv7Js#Teujw<8=>~!hz4e5*8GzfC`4Hqu^4>QJV-@+L1SnAlO&DnUJDB#1> zA$0C{exF{ll-D$DlL~jDVF%;p=mU3?&FOpD7m=`c7hFvdoJ`(1G}9tTu;Sjx0mwg?*PNFVmD;>VrxpST5}m}v7ei8JjNedyfg!njFu@K9ff@g4?X|*anw3I% zi|h6Ss>5^qZi3O?ga&C3hVdmohEz`8^oBc}Py6)rC>EzJt8A1j(*>f#D3lyk_pIpjO z0zu$ZMZ91h#uTW!cf8dt%t3sXN_RNSMbXnuYXfd?=;Uh4B=Key*@C&~&-3asI$Tb! zJx%DUYe>Qm;s(NIARi50L|09Nf1fb6H2ch~YxQUfTbInLdj$bQBkVg=I@M~EWiq2k zOLnu;uL#$uvJdbPhPm)hn74Q%#j_LdhR$jpyfP-NHaC=VIMo$91qw9+mD>@!X+-Z){6~*^^`QE-Ycbh!t2Z z)MEklA9dmLF4R#RbFa#CskxynAmbbUNLsXo<8F$~HrLHNYSo|>E_%LXUQRFlMBwL z-KG{HUGyXF<%#81?fbk57gPPx8TR#EOWl(DF02cNqJ(TKhq)P)fQv+X1=a8s<<>j>UO4h@q{ywm1kcKi^wHl3`!4G(tQe8QyQ~`WZ1FO}1Z&+7ROX z7**&kant6_C(m7FmuDqcPm@KYnhdUZT3Tksq=f6r(1)+_as6J)P>~ES(`Kb|yP{2N z8N=5)lZj-jSQ>;(>>|L+h(-Hj7IDwzD&$Hn%R=%$wQ{24hkXd0-zR;1HV@!c{*)pD z$hNL|4GK`lT87|DNe7)r#?g{TqQ%b*Uo_|aV8;mrXwJtZa{EM%kxN=-J-1xFJ6&?7 zKNFHM%}suE3h@L|>DPwhpXP@{mU9cLyh1B!48CSP=(X|p1%uLL_a{5>;iRYdiO^!r zx1n?zbiS|g^OF2bX-hhKm|xTf@ObY~OqFET{JAG!l4$>|$h>pQE8S#pPlDAnH#Z(J zYl=0C&mU#FH9x*kfg(=#2K^ahIW=nPL!u~CF>_@6u2IoAIW)!AABB@i#x+B>KEB5R}w8gr|L~-{;{t9KOT{?AID?_bA83_)5}KmoLG|Q=j&rml1M?N!cC_~R$Hnm z(+$q|L+h^fQh#I3eo5D6lc!P(c%kL2ki9mp_-tU(HO}!8(h~9j7Q?Rkh#EY+iTf}h z3;j+^qY%cK!QJqLJQnmjV%+RyvZb-pi8Hse`iCW-ex;OO)p^y|>6o=%v%2K%TSokHlT*yPZ9aD{F!{3! zT(Z3{Vn?C%KahCii&f#~g}wA-Nu$>r?_GMBoC`Hu`KP2>d4_oI3Um`j<01xDtq`lw znGEs>9Jv@Jvl$Al9FU>zo%Eh%!4^7OY-dKcC~~AVR{sDfM*bMgTG+D1cXC`6MrnG zF*2IN01sqWOdnfmNNeC%Jk=emB?M0guLB9X40(s`$X*jgtDm0=X4&o>lP@yH|0BBQ zavaTF7wkL1B6(P5$Vd{{aZQ|I$Ndg|l+*7$3PfXZJyvhkLtolTIceR!Z>6tu<{n+7 zT<+sHRR_&tn$mZR?UAPIi`JpzsQ;pLw9}PAXz>|?q%lgmn%7Iv-+s;>j8Y`%nOaoe z7@{RWPb0aS7=lz_r?tL*m*9^gcRqFzOCBvXCt@tGBh*Dg($21f5{=L^TE z)T9`q`Hm-tup6jM+|54EeRbqr7JWAIAs)NzD2bAzez|b?Lm9ivahmuPJK*~gF0+7B zk8uYt`I*r0Fck%aqf@dxVKa3xS!}iVou=H+MRW;yic>T5Qz2W&yp{+(MLf-ay{VdA zFT8vqk?3Jc%&--cP<$ujmJFy7T8el=z24t>K&JK5_hieOpP;c?5%}y-)s=k`y@FN+ zvu;AAqRXIUWNi%<6d9NV@2skCf<~Y_rP5Xi;I8epFik4s9X*}mC&gFIV?1Z|F6%RQ zA<0TbyNQYm8|CUq?>ROoI??9hTnBYJa~pZA*a6=S+{$CUM!BL2!c_fOe?YEa;TbNw zoWz)I!Zg02VlW%ftI%|(v3rhAjxYGaX`0v$SkP^srjB2n;;!@h3&M-)s_yMec`mq{&NFs_*Zgbs|R+2-j2AZ5T zNKe8qJ%vqJ{w&=wwi=i=ftVjZJbI?#&(zP4daa6ykZt7KeL)kI#F)*4Pe4mXht|2W zZ1FA9u)9Pumh)s|eD2luRduc_$F z-~xI%OeK=zk}8H?Q{UO*LKfByj5v|)d?&&-NN=H#ejIpetssc_@x!^?Ca91r`4SvW z>0hR(VvJ-2{SE|sp0tf5CaK`+a64hi`*_?t8x80SHGU}84QE^iTlq~wz36v8dM7Xv zS%9P&at|rvL7JoB9T+qm@pFbcaCvFX=TIO@crvMHJ_qI)o3T@^if9InO?>xo6uH5i z$~e{rtW4_-RD&GCVyR`ta2$IjQ4_&D6rw5)_b_Q3i+*ZEc#78&lMa5rXD!?NK0gbI z2Puu|`~=P6mu#yEb5bJ%d9a%S9Yd9uvu_E`aM|*qFeTGp5aGK+JpoCBuSt}QHFkM< zo=T;5VOJ;?X08Do61<-`rpl=iBmwBr7dW_Ib`aC^2 zf<}w*+}@V99NXMF9U$|h- zWw_o~!X|#%DhI(tphpJPu*`9t=+l%p+dbNOI!j8Pqu%3z)5D5uUEzFFlvab<#jCS2 zfMNntPy*tQlD=BY54hjiKaDZNOi67e;fbCN9=@p@2LKQqq#)W6+2jwFxfFN9QfYP> znHnSByCj{mACQai!;Pz2-bPKQeQ$Ew#;+qpGunE6YvFm29!{s$`YIS&zXE0%X)&mY z_!N{^1YjJ^p4;pO@N8Aa7=B!-f-;*=x$Hj~H(6FFA4^pVZ)5BJnmYW-dooLTMqwLy z8vg^pYJB>l3$cCn9l-jDt6Fqo{n_W~pY$3}=?{c}id>Fw`{?I-|FS50`ZP(GzyAy3 znV5U}Rp0dBZ+R^=6(IRBEx7uoxYn0``MIl=ivKS3m@~V0kL~e^yfIJQIMvCTGc*~f zpnp0D;%<$P%X38N06tDa`JNU4m_&XqdVe{bM_G(oetgogkG#r4C7pbB5@+W}PbwO2 zE0EgypixSh<3LKWZta)>an6SLg`yKcu~rZ#{DHF3`{UVfC@jy%wyn%;i(oQs8(dw# zh+%*!@ewMKD+}gk_Kc0rmj3#fmylRG7t$g-a+S?ON1o6eXHe7EJN)>Ii@}wz0RvSp zQcya$CT-rE8165~CaY{Ai6a;gM`WEEY-HMbOMB0J*chG?b_&i%E7WEC*_IHJPkGSX zo+fM|=VVJL7D^b!OzQg`bL;@ct;|_s@rECDrH>p!8_(0>RH;ed^BVot&g-r!#YTD) zQ=EksmvK4ij=R8){-30T_!`VpPBB%t8LKNZoxdQ(2oUOHM~%%K)3V^P0QU7LNB-}R z#4Zy63&6d+#FZn^w~d?XeV%-$d(+*Rdo}VNlgvM|H%F4kXdSFg?4V$yHbQp9$4|JE zt0x^0s+g_$R0z{EFZuZ4nT;DFw+8i=vnxyc?W^U-W3ThaUP&28bx8V|K>|)yA5FTM z-MXVC&%_I}cFL?~lE7&?rnb`7F}mRZg1wV`Z`%*!?&#+(`mP4`{+%)8LFuvzb)(XF z($T$i^&e9+ulG%m+=u#K*G=%296BN-8hY5{#znSw^&+mORY_xxQ1McU`{zi!-*)F0 z9QIdAL}pPeC5XjZT@asxN^E+_N$l7?Ex>-WST_Cz5ocjln!SsNNdL^6u4-F%l9ZdU zX`_8M&{8-0ZXXH5kjIllQ=4KB_5vTNJuMdOfhevO*_V_FQzWcCqEnhKA|IgS;9S~8 z@SaA~_FApwB>9ET)PA-|vvf9)k#8k>%-oz&Sfqgh42uR$8%M#@#*K0WM5}ctxoE%- zT2Qj3csBIWBY;_}oWGbOU9eWN?Oz?4McHC_fAeW*$azN_u3TBG3nKW4pMnX4Agl_t z$)c~USvwGj{J=+je++<4jM`Bv2!E?R?CIiEFW~zw7g7 zmnU*gjsWy9FxZow4`gl)@-S52YW!+#!ZNVfm}oPX#mAZY2dAc>Uk45)G>2y&5qXha zIWXB(--@%H-}^RB=i_V<`wysVbf)uTW+V6+|6|SP9dYX_lu9!~`X|;@;#|(VvhB%r zZLkgIQUt$Hbq+lRr}oD(Tpp=u$IU4nB?Jvb+}8eAo+zVBkkL8AP5LnbC{5q@`#|(f z&U~Jiy%df}q<$yxQ5WJ}*k1kX{aW<)J(B(p@91oL(vdylso|ZaDBI%}zD-ed15zm> zmJ+Ua>t9qA7vENPYgF7vk(Hi2sjf{VeVV5P(e zN{3BQ+J?s3pcezWZI)hFbR4aKvb>38M`u9(V>oQW!N&zvR4A4RS8W7UcS8z#)0~4^n{qLRBE@ zULFWZcL8RnrVPWv&11ZuFd9(K6HYMwksF8q~o|tSB1S`*J{o6%N6sOkLx~ zHT5QIu_WEQF%1tjy3KVw2Rx5X?MV@Gsn@^qgi4`+^a0TUPXR9>biIbxd;A_Ot1sEG z>Fz;mNFbgwrtkYyvwbxCRcq%K(1$?~Dp2fHL})&zYQ458C0vC>D506RPTIds+|P|2 z$voe#AG=U zr$cijv^BmU+y^2aHvMAbz~uaj-$3{4vR4og>KcG(8lI_h)*rED)Lo7vevY>wTCzphfpZW$4(Y_JStfZqxW1j9ZU|OVqioS-}T+jc{m`JK|;@ zxGl6s3|0(G)yDRUJ7Pxz#w9I#4#B8jjVPk_BLec3z&n;8MRq7||2SO|g@ObP@+cqC z0TI|Qx6VPR#6-#&*cVE~!~|%Dmkd&JkY+$BKp8rsCDFXToDs#Ad_RIPVdcU@qxgbiIL^lJnBNSb zu@Sv~sUf^_x}K;6GpWgg8HS{$T%54~bv#MWFb6)VzuPffrxW6_{^dz>RXNKSKe@J^ zGTh*F{oQt{m~Y^f+$G&YEs%S<>Np!}u))!3VlM)2N5)q6h2@Ps_^cjZwpR@e$001r z^~TDyG<{Cls!MZbJ=E!8${_43qLG6IQ3f{{^fzHC^n@8tM(ZiMQm|JMf*rrHTKK&t z2J7s3vM4oz@MF}Mxq0PXQF4~LOG7;bB02*jro$=Iyx#(E9OD_WcQVl`nbg})+J+}2 z1cquZz!z3PL_G3H#G}_28rrbKB~YuUQW@5Mt)ne?43eW0Qga%OX@{s)Nq!=N^U&0? zn=fUmE$8wIp#MC5&CCA_!q)QcZ=%jkttW*$Rog~X!?SbzwtFw6`elx;4$izhdYb@-8K=>wrhN0uN!`nU$(Lbj+PirSm_Sc-i%DTVJ3}C1 zeW}U<xsqp;#vcS&Mz*i~JT3JGK@2WhYUps&oXy!Wb!@TcC)*v? zcxxr>-idVCqQzeG4I2>H<;oE2WlW>jB;L1xy@gDRsY$cMYYh1|8y~Fi{z7sZAFTY# zZZB#_I+(yK=pyl0H>WP)fHfd*woyQ{G2x_)aMSS@X1MZxBN+yRg3~aeqH~p?vBe(Z zh{x!F91bh<#d-x2SQPkfDGbq21hWJ93&G+q9>woIGbPeU-2MDcfVVQdu|hDE54j_b z8>h6$J*6c{yZ)`b4WkD<(xX6$;?LI;`N?q>e&iT()!4DV@E_C@f zbGr(rrBot4uE!DbtZsudq-Cm!QFIRZ^NSlM<8KD%+1}^lbj1&!ew3v8{Qc_XtE0@l zwI;tiJeH$hs1(`9_PrQ=abM1N>{nISkZIWuJVhFxwm7KNGgmy(*GqQ+-G;yXO)&`Y zxX-<6O|9EH3^Ss=2jDz}6xp5}PXuC~Zm=mse;$&JEKAz$0$&be2l!z<^DOk%kIeTZ z*tABOE#z?=2Wk6(yjmkKJlE==T)8{aouzvmSR!rEirGBlK63uPNMJG%p~1NDFp9u^ zN)ctf2C28Qk{2Vk;yr|=Rc6u8bh4fP#LAeDYrX{!F$f$2i{FyZc({j>N@obBAl$Gm zXAQCZqZP@pUM@JiX(#mUm!*q4F1WLjFlxLUSSVaU`3X|oA=_z;dWHoP-$LN`QZ=-a z2hHi;3}%2qNCt`_^rOqwB_@Z%cxQvcU}b?56O(R**6kOK3cuU5D$fA~(xB_>Z0;xP zegy5IWMLy*aR>O*?Y$Q`@?~H_G-@}e4@V>|b~2#P^pIkF<{!fA)iQ%blDxG56`%DO z0Sj;F#HPrPHQ6Mg)(%OoAWuote3|>9OHTx(ZvE+mS+BOxhLABd=l400%Z60v_U||Y zDW|`_N+RC$`M6d(C!_8&R-?aqjo+9~fcDk9f)__Dq-XF;D=RMI3HT~v#Ir*)a|%ER zCh=BV6avIoe8d#Y2bkR(qg%4BxiDX?5SKzcs2oDBKaTrs`2xU`!UAdwa7J+*laj}+ zu)dMvY#U%6U}2V{7`XOVqbggfUq^tL8vhGoypAwv;&DhlNz6juYPY z1q!LGrqKlzWgfiTvgjQBqX#*Kp+GZ+aTWYb-ILG2{CGYNorvGrtGP$!#XK{%5hp z8;hH#=c-UPzL*D?))4FI#&5KYS@fjTS-%7p7}1`FyA?x5i{Hdz8Ewf^+6>9{X6+DF z^7bDpcoNL237O8e4Eu;2W7f$wfSBFjtC$$`Mbqd)_B=A2wlezRRq?I8hcpBrhoJF8 zq*GFegr@h|l@6}>cEOoXSA*80in>#;$A8a$dbS@~pV2cAE1}hQJjE+vV&Bf90v{D1 zy~&~um!_oO(zAil)0N(v7Osl2u`En*M8QjlrB-uqe+?j#r7uy2v z0cj}s78075&@JJ){1`gn@e3$l%`P>?jDU2D@)3U=PJB(qrq7F|uj?kGfIk&;HFK`D zh@AEwTjCL^Z?+b5#BA%IE|x+3Eq)D;gG#%@OxAGKZ<6Kq*mfm6t(&iUX7$BciEjIh zi+s60s=Kb{rc@>tmoP@#PQIZEU*|rmpA~YfX~V>FP^)!F1Zu%WZU&1@k0z3?Vz7!}c)vHyE`U~8cJ%(l)DDKO)4$>FyF z5DwvI`$?V1w+RiWz&!u>3V5CBtdMqNaHs5tHB zQ@;Ojl0}7YrMMv)HNV_|EUt2pZ6^5`T})quk8OaS0+$zGK@b)X?_`ThQ<}1jod}vD z{T`@g{av6dSu@5n7Io`6g>AQF6h}KV_Y)W2_EpK&bSqo(SWo1~RE&^}0x4pAB8SLR zVcF&xG>`r|`f(r!iZ}7grKMC7B7?MFjtS#q3^ZPC-*`%Li2FUl9y#Wgo+{OvQr&ggBR+ z&-Lee>cPMBP;lvFNlP$grzE9vgP!uc*U8P1!pph%S6ihW$(6&Cc3B0r^aOW z949bSuV!aeM=D+=KKAYPmtRe%%E3eF8gFL&MH`D8=IQ-klt$IwuGTHfbkD;5gW~6! zL3dB@yO9J*jN%%Hel{SVp9LoygW5jyZ5=fsS9vpLY9SAEg~2;+tgqWc_QH1(~K z+uFox|ANpGg^lCORGA3!Snf8na?VD96VlpfjdExiN#=ufzeEPy;m5JDY zZX_E#OXJG+aUgamS2^kJC<%g}3cE=ZCTDm8f}=O9KykQ9V{ zno)`iAF?okcVZK!uD-wqsVHHqPkuS~Pa=|k75z{F2>5GXv>rj&fM$i8H3|ODs6V%| zGeQtZkGIL5FEV_@u(Hg;4ABB0(Oo|3p`%W|WH^A^Otu$Vp7lHA6Xo$Ye#IrB$a`B) z{T)&SqQK-&F&8rnk18%Ch$jDi+g1AH}{lk2#!%zsG~TG0y$xi zH=?BeAdunixJ)}PnzesVg9+C&9Uvql^(BU=gB}nRgb~wlLt45C*-PghX#+xWTZRPF zeW1$iLJu$v+$w6Wr5=C5y8Rq&3J2c$CW!V!`8Ih}5GH!@;SbFxOw4li60D3xHeP;m zjW5cvL-z5Af6Sk`;Q*H_JUT5LqTiqIFL@0C=nppss2)u%kbtVGD#z_WHQd{*&?R!> zWLTXp>Tu&_?@e&bY!uM&pW=G!kp6Y|h^6gON#bthTwEKx$+yEU8F|f&zfe3Zj1H9N zW2U^?Q2|JCw!`E&H$K^diHGA+${aiRuQ88a4~K+o-#v|2)d(pO=EML*Kd=XgFC?}B z1GJrZtssv-*~ey3QsR;u+yiWZ*af`i+g;Zgc)X{>&#d}zT^T9sc|TKR_%L3A=93M~ zCE-S9ePP_nPo2`~&8tC^=rS(GT-d&@IfW@?njg!pTV}46BHdGHxjt~*Dv_TSSJEqo z-mgDh=4~>j*@9yl$zOs*NB|xqVFIMd?{aJ~-#Ui9NXKLa7ZT352`5K{Z|G3McALv* zwB?&H9@`nUKq+)5*oNvCo4PQhfyy6MjxC%bLD+;xO7a)b|2L+)CM>sG~QTXiJ32|C< z(3zOJmfa?Mvae&6!)sME1aGH4oSa0E7(Jwt+BD7xGi9|a<7Ez^b%r4%VgB81x~b>E z+kNT;dF2#i%GHA}77G|(PwN{ndU0-9bq@*5Aj}*by50r)O^a10H_qIWUNn8zKu#zv zas5e=LO=t4KjCZ0DQ9FeP(k2JamNfWV;Ea z_j%+=YJTI$P}#pTOyHyo2%9?rAy2DXlno}*f`1yWK|Nzry&^47XXU2kTj!;uYoO*e zIibyvCVCUXlb-~}z+e)=$A>ead?bsp`w>cv%sb3l7Paup?UX#0O+E;mjE~9p75pOJ zxk_D6rPHgJY(mHv+rrBxn?0-73-Y~4rn_@>(5^6SQGjT30H#KWO9SC+x!1Rgeo~g< zf7=!Pz!Z@Td+m{>Ia#mm^POFlCziy!ccr!L#?CO8ksT(GCADfdEe!09bsY&=xQBI} z`K0BAsv&u@B^Jqe+xhxYEfblz|z=%LX7!Css5C(Ih1#gqh&JZ@X z^=+H@W^}+A77|vOk8d}jk=Ez1*!A`b?$*lJK%(+6{=$>QqCztEE_5Fh~dN%fc$qs{b zR;?IFE+5X%Gf(ms23h^cVL3kLw}fA_<7DrS9#~@&<1AcKFYzHbYR0K?Uq}H|jAU+! zVUF-|qRPr?Nswr^glmR&hi`gQk>rUpIs0|$!OSAwVg23>uCu~^eoO~Y`-z^+{kNnQ zZoZqJ$WSX(A{($M9Muq6mTn}B7u>J7DiQyiyj*{R-Fx-r!U1m(; zoy(O5S!u~8E>#LKk*bi0TlpH`UGxPR^R%)=iLCL+vonRjFmWhrBk+4VL z$Qu1~ukd+v)UVvRp%NR!i>{MKu#M|>d3`0oQP@v_91FN@35Yk@|Q^W(t+1;oYkv@@lAXGon zeqcnEYHQX#`dU>;-l4(oHT(M};$9bXHA{hD{j%KK7r?jW1$(>$&+!fpY?y897zfPX zJVch>Gk+FlV!QJsrlyh79`t5)hr8>0gG$+%6XRzW-)COq4Gi+iuLHRuHm;aN+Xg>` zuRha%2y6Fu_{UMo_WT8*ntQpIg1dWTDC8ODIBnZq#CFvA)#)-0#guv2R=w*Bz!A@y zJjY%y)x%@s&+;)6M_0&+FPg9BAI$l3ya%b0D9UK^4zQC?c_*R}+IWfXZ2=2k{+{~2 z0Ow1;$_j)|ibjU`WP8c_3!=Fp)bK@74m8t?5hZj7V2?8PKZx(MGML8a(jqA)&c#7( z1{`EkjQqu>)EIi!x)d{VV~_M?oS7#s!!N3c#&3TQn4K1m5VA0B1?RgoAffx6j$R;s z%GGg8mU2dF`wJ z*X9G3_VJTo8-4v+Y3-@9MexFv$|{v4GtZkUW`q7}U&IdX^a`?Rul#UJ&%RZxY6_YBw*A6Cki@!GS~btg|FZ zWIfcM25CaxBmXb^BLv)vL5l!lgdjs6%&|2L5eIj&?0g=da!Lkh2IJ4M0(h~gbPyHdcMSp(ut1D(?MSAJ*D$a-w*GH>)B|iaj8BYlmu`vhiJcW77W_ZX6~&GsD`CWerw~P4^Roi}NT*7>K7x#aeP?%Cbg46gIh5Zk#1HmtdNi7zrv~-xU zG+1~age|augks<>{G${oY$i-gahe&mv$)=FRrd|%P7}s z_Fl!zRBx&kIbD_8xn~06)O!{1U6uF<=nO0 zs-k6nIhI;Zc=sO39cK__R~+kO3tXQoj2m&S4raVM%l&ZZ3rvg5C}C%@fMCSTuKv5Y z%E!1q5BLmg4LTuGsj14g5;_oftJ$^%pwREY)&5N1+`n6SeDHaf59tKe>K@r4G^Y|*!y?Ay-XUGAfcdhd-; zZ9_Au)aUv9V2fLwp3+~-&894i{H=2CTqusB?KtLHcy{q0w{m8Wpay$OyXFCwSu=*58Bi=@)MoN3873(Elb?Nt zxnq~JLva59?&Gxn>^FE{&c`Yhfu3S<@!i^s%GqvpE0c{L5kfH(+%WdyJ%}Q>i)Pcj zwTv7Sd*25oj4Vm|1zT8mk3*2`2?!kuHX9&%`JFgOD~p%3gm z;QC>tR^Dv9{fB;ACKoV5qX@m>a;A;Bla9@9!%qCYpascTGeXw|qk>W278(qC;2HDc zC;grJW&1fwSVvN&h8+I@7Jlo$RysC=vZpW%1#20COvF*N`Cy#Ek6|ivwtB%zoghY} z*3$Bdg2x?!7}faKwG$-c`>`^|bi<>@r2|R)nS!8G&mD!Kg-&ghyd=Wh3EnI=S~wIc zk0uU<^edPOYVa2X3l)LkdvDn?FdB;`P;or4Bi9zS`ws*t-)Nw_W- z+C!Q0{{UG9QkC|Ae0_o|D61WWzt1WTqYyX-{{YC*h#C^io{xJ)E`av$%O)`wm}$U! z2?({04%hL@(%#We0V`9BTuRzO3&8Hr{ytck;0!iiY_0xICFR38X1tLyqKiRN z?~&jl)j(eTm=z;q`ecwT%{YT(W zyUu#5`gNM#j|*~dCb(eaJT_yAqvg5KDIp&fHn=R{!^Oa+$|{bkX2^C(E4-ceci{$f z+r%D5RB>{>FYjW(3LW6Yp{tc0D(w?N)%i$)F%SYJ|rLMKEoY8J4BdrcGvA+N&&L zfT#dfbOzR8Y+`s!KK#pR{Uy2klVYVDo&aroOZ$wX4=4IzZm)pkT^=4~xaoLtT22xt zK3Cnp>>2iUsDcpSrPol$Z|f#~hcnEYV*WAyWe*P3u5FBG4tQx ziDWWL4#ROq-5e6eZUHuMoo>&oE$UqFe7Bm>?+#jDWR^FA-v7~hw}z4pWr(C zJ^DFtW|~CEoNO3%tTY3!7mOV@osm#C`u7&;nY;wttufmiLGD@b!GZHH?wIFBzI91s zM6@{IiD`2;ss}3u=LqzG}V)qvfVM@=*K>XAFT4|@I36oaKK#dz^kLcBGFNm+TqAuVr4ye zz;@i~kibLM00oAsr{+&ZpaeOctS$sAYSdVyLd}x?RhtqmpTL8 zxpzzQ`2PSN+&XPE2j8~Juq{^L_V*qX8C(?|fiaDd*@kx$`Fs;6_T{{Syr$lSx#bmf zz24w$b}Bo{m*1qF?HsGmq!#b#?FEsfebcqNW_%^i@HggYxuf#58|2@09c84jcHMCs zpvDovC?&C(V~#g5%SMdtnYS{H?&6~rT+d0C3R^JKGO_IwQm!UCaXsKlhpe{X+#q6% zQv|?mT@GcuB>e8_m`XF4`q~Ie9C7F3d=iZz>xSlgf*P`?H&~_t63b_0(a(17eC9h{ z4A(=a==-2Le4nM`KJDnkqaW_NtNvQlFal%T{{YNg`Wu?9_?4AUhyw1T4NT)XIhlkm zpcn{(j9eE(BT~;CuNN?I*Q6NGchem=H9oJ0LK*V6L}6F~qE0_ObRuRMO3XUq2DYU` zm8g0W&fX#6Fs5yCuF-UR6050UNjwUEC4wc#D#70;AS?2`Bv7>-llJ_m7b~T)SQqwd zqwNALUb^dOuwu{c-=B@44^Q0cwubrR_aW)Dx6Je!sxW1K-hKH;MgIUlP>lz%2F1hf z(s;Sze|6uYwxRWO3cRG*mO-pC)&RMH6BoEdnnJ2@l;d-@evWEmr4WPBM5GZao=H=g zX*SZ8ZxQSzJ3c3YzR-*&{{XbcYl*qc9T>Q(-!R~uh%&;f_M<|>c&CX9kSe)K&Y-L- zyVq2%__rp4Aewe%7@3(gZ^H}P{Ki%hUG~pXI@8Odu;#sUDZy!M4pvpRU6LcYH28>) zScTNk8BB!MbgU@w7P#yZ>cWV{U?G;#cBU2=ZBf37`Ir6|Me@Q1VaQtc(M?F&b6v}5 zGP0eIne`H30?7<^V^!hzgi8JSjFv*Z17mCz#b z5QG6GXakj(>epqn1_OW5T&`cG>0Ihp$r|aK);!MeK@bk_C2_iM`lLL?zGu7T`kPt4 zPxnz*CG)X(HsxaG@V~mjf-QJ52>$?H3-7-@MpvV%YV@ey_AD)!uTM z<=^Xxs=dGXM0NZACkOQWOme*rQ=bUCzxVAA-2VU&4Sw&5jIp>4R>qB`DZZ@}(GZ>B zvb!3;124<^ej>Y1-?T5k-}Ilq{{Rruu7Q)Y#%TZvsrQWVjo-KN7TbRPqJ6Dfe&2RF zrxTT}Yd6YTNzeZP(&l!tL0|)2LDmBlI!Ym!hbgz2Q>w2WYoK5K7E^m*#4atTDiyk@7sQ^- zV2X#Tuw^ffUVky`_ZPSG71wy{I^ycno|`c0+n^CbGWC#zc1(N5TqPQWx$D!`1bum# zFV=EOi79|XqbO~z2DplF&Z4&`Ox!wi)F_{-!}Gd4Mj}p9Kt|_ZB}c)Q4xkDES4M+z zbwDb~50VYhbFHSc7CyfXWf-2LEzDbf-*Z0BH+!s!tjrAkrsoy+bEn@UR4hIthymVW z#3>@-J)8NN8H`a4_h{Up7m^(Qf#8YYZTDJaqNpQ1-XlMS%-0w`Q*7o{UE^8Z2G$TQ z0bA+ZLPYe{SIGewE(tbII$4I~%wKRu2hKtu?Qi0K(_23#x1 z?gSFm7)S5Hx-nSq6HJeHqW$UH!PB0)V_)_@m#$?{>!C?S4vVr>R;PTiqWTGm>amRD(+dyHghhy zxJzkB0aD7ivgZ0M#J*Ti+`FD73<=+$yiYKmb&h*33Y9omdiXI~on~&jLxz%Cg9R4s zfb;(VNH)_`rTf>2K~U%c^)O`A<&Ir|G{dR6Ujg`#e4QDWsnMSK^2wR+(&l<@ z6PvOh11fKWp{S%B)6dJYrA0<$&Q!RT6+8p^R$2BqMT=xojmwXeAn&s14iOd?#!;RE zL0OxM-xBq8z(Q5?bGze-M2I-sa|_s~Z65|crZ`|v(86P zpmQE2@M^NDM5HC8q@rUmDPxu8gt=@kf zIhd}jCS{#|DfdrC7@gjF8{?;n`^F5iZW`&@GmXYpzK*K#cgz0(K&bXFU_5Wq#0^{;pF;(r?4}x`bJJVpJZ6 zZ5Y%IbX`wK=QEC#4YM(s?Kpa24u4k&U?H>AS?cmkxj+ zK@kK;gmy4&dD;7|!w-LM_?R5y2VY8=fH<}rX{!Q9jhMObQhd5|7o`eA2e%Afi3h9J z(lBFcX{U(0`4~hB<%d>j>I4fC@h!T8AFD8E=si_=X@R4rVZN({D~X75h18;GgB7Po zyEyE0E?IEu^i1jeP(M8T?g=a4qjtiKWbdORnW+PLMjMnbX5i1v1&EHsO??=?tByn-?z=7H9+|f^I(y3Km~M}d zgN~-ybUU)?SuXQCx;rbP{7YiQm{$J)7?>P1RP>r~XQ0gV@jJxx9Pu%UjQWzY!0ns; z+%VDU(w3=bQ#TI@pUs$k`_a>aIeOPq@joQNJrn3Q%QYI6zO($rH2i#O)?=nztu;haZf#;)9yTkR_T+L3o0?GNT06sV{EG-Sc8U z%Ae;;58|G0#Qy*SdA|%VWgg~M{{R#_nB>kB?;Whb6>tm1k&Y_a?(qmKx8mhVTBQrw zs^wjPU!6mMJ=o~AA6sS%9jfOO4tpY(j6+Nv^eO&ir-|-mD7Wz zho^txJ6@c_$=fUG1}3we`t3lFEByS}z*WsA#ivGpcqV3&v4=-k|i zbvLIA)2NM>MV8OFJMSi}3Ru{9Rg(8(J<-X8k2k-6%mUZ6K)gpQ4T7I;r})rz&uBD# znKYj+e}xL&=kWn?qO#b3d*}i|gCf-V2C7ksc*co$G$0Ns7v)~~GfPNn#Qy+eFjQLf zfVSi2D2&7(d!mEQ0^4o%&2@>y990YE22jhz<0o>%m9<{+uxl2YouUn-9?fqb+YDkU zouPI^;I1O7yv(g4ijGTbMQ`8kh)yRYAuz@a$W>u;kov)|KSICoeyjQc>Sh_Y4S42O1-eNI41okW zLJ@V)dg@vA@jd!;(%}kTj``Ls!rFyl^m@LNZ_&%pshPymbJs|8tj=@vano;k+t;Tv zyv%jge$OZoynZBlkm*pV=f9L-f~v2;FR)5NXF4AearaTLh}jC)PfWM-E?@YvyMpYM z!SL4pXE^a{Vh!$e6D}lkQ4AL4hpe{{`L$R zne3Ox^F~LtSdgrnc;?t&_YdMML30a^%!=eHK1rS{pu{)sz8J_K6W{5)^)~$(w^H-c z;P0Se*fI+XY07g3J+2)z!!)xq5v%E&n;x*^q0da?ra0+ePxGaY`}mNX>U1V;ih(n> z!@QXzDl5{DsqHfx=tq8P6Et;V=y0~Dz-dWcvWrFH2fTF-W;zXZYKr^98^-?Gl~9G~ zf9(@LbLLi~`+j41Wpr-)!~?qrJL51IAFuuAC+vE{k$*Awf*>>4{{XZ|&40Hs93c7s z0HjRF`u_mhbCq}g=r*6z{*e8{^C{oxd5JJWWSKHKdR7(vt-4Ce9}0gnUx5Iuw&;a(cJu0K{u+!5lOnr~Nt--g}?h18_$H{{Uzfy`TC{_w4zA zVbwNW2e~raUtWzlgex>kaP*3Ia{$Si$dQdj?qxh3h$EmIsg}88r zdzMZYrgGAd@tLiX;i+9{rGrS8T_%&v)DD-AdCYLIBEW{wZRp||mYK&-5I->7(*=0o zU7+TU(F&SjlQGjSlch?@IF9BO4MuYURP)mHGYwJJt}y-VI&b5l*NAlD1YAqR@6h@j z^>xwuIQC;L%p4tD%e+veB$j=HFnb90-<2K%!YNhtIx^uRfg^#&oME$dKD*{4Q(smq zWO28siog>|60X~}-^!DmTMuO@{O& z*+_1&I~GzaUSWJuYC5)BE5?e7!A3MDv?B;?QL+%MqOfE|6{9e|3VOCe+@+%$9-f`! zCj)Uxt}tMUJc8wi!o1nYW5pe%i9C2 z7P8A;i~29o+2!HC3QO%{bl1wySD zFkrx{g;^;^1x6?Ose2=YE6m=6KL-<ZPD;o4P>0qy+ucJPX(fTVJ2@Mp=WkOC8 zaa1j#&l(dfwpnGD9Za&zEVA?{?r9`0s%5eDIxYJfe#>RD-?G@csU6I=TP^!7`z@At zGRE>QYT*mDB#2T|UZ1 zbd4gqO6e=4u90?~Rf7f$7%*UTV6Kx1YF;lxI!4`}k!-i@zM|QZ*=~5y{4RNwt$5kf z4meuB|HJ?w5dZ-L1pxs80RR91000000096H5g;KjKtWJ3QDFbt00;pC0RcY%MvG|9 zNmqDzX)h&RU0+bCQ=&?p@$|WX{t(`fu*Mz@C%IQsWsnErv<#Oon!BY zJJG*)g5iglJ3#Am%!{-zqCBD3?vdEN7eZR<^i`qEUq z)jR#w3^WBc{s{SEh(UE9EHH4okCD>hN|u!>QK~U@9e$RC1=Ixrp$0xc`doE`1Ukln zOeoxjktGxhN)(!=iLB*}QF4e-fKVC~C{Uq8!h}ObBkpm7h&ZG$Zn4lfV>RVTQdE^C Z30G32tKz!7X0b`o9df&anxPzD|Jl^VS?&M; literal 0 HcmV?d00001 diff --git a/src/ExchangePlugin/Test/data/2.png b/src/ExchangePlugin/Test/data/2.png new file mode 100755 index 0000000000000000000000000000000000000000..ea55f7f859a77ebacbc4be2fb35bba594ca76fc4 GIT binary patch literal 21146 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 literal 0 HcmV?d00001 diff --git a/src/ExchangePlugin/Test/testme.py b/src/ExchangePlugin/Test/testme.py new file mode 100755 index 000000000..94e8622d6 --- /dev/null +++ b/src/ExchangePlugin/Test/testme.py @@ -0,0 +1,74 @@ +# Copyright (C) 2007-2021 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it 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 +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +#!/usr/bin/env python3 + +import unittest, sys, os +import subprocess + +testTimeout = 600 + +class SalomeSession(object): + def __init__(self, script): + isOk = True + proc = subprocess.Popen(["runSalome.py", "--modules", "SHAPER,GEOM,SHAPERSTUDY", "--gui", "--splash", "0", script], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + try: + out, err = proc.communicate(timeout = testTimeout) + except TimeoutExpired: + isOk = False + proc.kill() + out, err = proc.communicate() + error = "Killed by CPU limit." + pass + print(err) + + assert isOk, "Test failed. {}".format(error) + + # # import runSalome + # # run_script = "runSalome.py" + # # if sys.platform == 'win32': + # # module_dir = os.getenv("KERNEL_ROOT_DIR") + # # if module_dir: run_script = os.path.join(module_dir, "bin", "salome", run_script) + # # pass + # # sys.argv = [run_script] + # # sys.argv += ["--gui"] + # # sys.argv += ["--splash=0"] + # # sys.argv += ["--modules=SHAPER,GEOM,SHAPERSTUDY,SMESH"] + # # sys.argv += ["%s" % script] + # # if sys.platform == 'win32': + # # main_module_path = sys.modules['__main__'].__file__ + # # sys.modules['__main__'].__file__ = '' + # # clt, d = runSalome.main() + # # if sys.platform == 'win32': + # # sys.modules['__main__'].__file__ = main_module_path + return + + def __del__(self): + port = os.getenv('NSPORT') + import killSalomeWithPort + killSalomeWithPort.killMyPort(port) + return + pass + +class MyTest(unittest.TestCase): + def testFunction(self): + SalomeSession(sys.argv[1]) + pass + +unittest.main(argv=sys.argv[:1]) diff --git a/src/ExchangePlugin/tests.set b/src/ExchangePlugin/Test/tests.set old mode 100644 new mode 100755 similarity index 100% rename from src/ExchangePlugin/tests.set rename to src/ExchangePlugin/Test/tests.set diff --git a/src/ExchangePlugin/Test/tests_gui.set b/src/ExchangePlugin/Test/tests_gui.set new file mode 100755 index 000000000..0464ada42 --- /dev/null +++ b/src/ExchangePlugin/Test/tests_gui.set @@ -0,0 +1,23 @@ +# Copyright (C) 2021 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it 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 +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +SET(TEST_WITH_GUI_NAMES + TestImportImage_1.py + TestImportImage_2.py +) \ No newline at end of file -- 2.39.2