From fd9ee944372186247207b9fc7c9223378853148b Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 31 Jul 2016 08:43:33 +0000 Subject: [PATCH] Add basic test coverage for curve sketching tools. --- src/platform/headless.cpp | 3 +- src/render/rendercairo.cpp | 4 ++ test/CMakeLists.txt | 43 +++++++++++++++++- test/Gentium-R.ttf | Bin 0 -> 362644 bytes test/constraint/angle/normal.png | Bin 0 -> 4969 bytes test/constraint/angle/normal.slvs | Bin 0 -> 6357 bytes test/constraint/angle/normal_v20.slvs | Bin 0 -> 6335 bytes test/constraint/angle/test.cpp | 13 ++++++ test/constraint/arc_line_tangent/normal.png | Bin 0 -> 4932 bytes test/constraint/arc_line_tangent/normal.slvs | Bin 0 -> 6846 bytes .../arc_line_tangent/normal_v20.slvs | Bin 0 -> 6754 bytes test/constraint/arc_line_tangent/test.cpp | 13 ++++++ test/constraint/at_midpoint/normal.png | Bin 0 -> 4372 bytes test/constraint/at_midpoint/normal.slvs | Bin 0 -> 5529 bytes test/constraint/at_midpoint/normal_v20.slvs | Bin 0 -> 5437 bytes test/constraint/at_midpoint/test.cpp | 13 ++++++ test/constraint/comment/normal.png | Bin 0 -> 4296 bytes test/constraint/comment/normal.slvs | Bin 0 -> 4181 bytes test/constraint/comment/normal_v20.slvs | Bin 0 -> 4089 bytes test/constraint/comment/test.cpp | 13 ++++++ test/constraint/cubic_line_tangent/normal.png | Bin 0 -> 5100 bytes .../constraint/cubic_line_tangent/normal.slvs | Bin 0 -> 6991 bytes .../cubic_line_tangent/normal_v20.slvs | Bin 0 -> 6899 bytes test/constraint/cubic_line_tangent/test.cpp | 13 ++++++ .../constraint/curve_curve_tangent/normal.png | Bin 0 -> 5349 bytes .../curve_curve_tangent/normal.slvs | Bin 0 -> 7415 bytes .../curve_curve_tangent/normal_v20.slvs | Bin 0 -> 7323 bytes test/constraint/curve_curve_tangent/test.cpp | 13 ++++++ test/constraint/diameter/normal.png | Bin 0 -> 5007 bytes test/constraint/diameter/normal.slvs | Bin 0 -> 5291 bytes test/constraint/diameter/normal_v20.slvs | Bin 0 -> 5199 bytes test/constraint/diameter/test.cpp | 13 ++++++ test/constraint/eq_len_pt_line_d/normal.png | Bin 0 -> 4455 bytes test/constraint/eq_len_pt_line_d/normal.slvs | Bin 0 -> 6515 bytes .../eq_len_pt_line_d/normal_v20.slvs | Bin 0 -> 6423 bytes test/constraint/eq_len_pt_line_d/test.cpp | 13 ++++++ test/constraint/eq_pt_ln_distances/normal.png | Bin 0 -> 4435 bytes .../constraint/eq_pt_ln_distances/normal.slvs | Bin 0 -> 6998 bytes .../eq_pt_ln_distances/normal_v20.slvs | Bin 0 -> 6906 bytes test/constraint/eq_pt_ln_distances/test.cpp | 13 ++++++ test/constraint/equal_angle/normal.png | Bin 0 -> 5342 bytes test/constraint/equal_angle/normal.slvs | Bin 0 -> 8470 bytes test/constraint/equal_angle/normal_v20.slvs | Bin 0 -> 8378 bytes test/constraint/equal_angle/test.cpp | 13 ++++++ test/constraint/equal_length_lines/normal.png | Bin 0 -> 4367 bytes .../constraint/equal_length_lines/normal.slvs | Bin 0 -> 6030 bytes .../equal_length_lines/normal_v20.slvs | Bin 0 -> 5938 bytes test/constraint/equal_length_lines/test.cpp | 13 ++++++ test/constraint/equal_line_arc_len/normal.png | Bin 0 -> 4609 bytes .../constraint/equal_line_arc_len/normal.slvs | Bin 0 -> 6597 bytes .../equal_line_arc_len/normal_v20.slvs | Bin 0 -> 6575 bytes test/constraint/equal_line_arc_len/test.cpp | 13 ++++++ test/constraint/equal_radius/normal.png | Bin 0 -> 5396 bytes test/constraint/equal_radius/normal.slvs | Bin 0 -> 6251 bytes test/constraint/equal_radius/normal_v20.slvs | Bin 0 -> 6159 bytes test/constraint/equal_radius/test.cpp | 13 ++++++ test/constraint/horizontal/line.png | Bin 0 -> 4329 bytes test/constraint/horizontal/line.slvs | Bin 0 -> 5046 bytes test/constraint/horizontal/line_v20.slvs | Bin 0 -> 4954 bytes test/constraint/horizontal/pt_pt.png | Bin 0 -> 4251 bytes test/constraint/horizontal/pt_pt.slvs | Bin 0 -> 5018 bytes test/constraint/horizontal/pt_pt_v20.slvs | Bin 0 -> 4996 bytes test/constraint/horizontal/test.cpp | 25 ++++++++++ test/constraint/length_difference/normal.png | Bin 0 -> 4490 bytes test/constraint/length_difference/normal.slvs | Bin 0 -> 6129 bytes test/constraint/length_difference/test.cpp | 7 +++ test/constraint/length_ratio/normal.png | Bin 0 -> 4558 bytes test/constraint/length_ratio/normal.slvs | Bin 0 -> 6167 bytes test/constraint/length_ratio/normal_v20.slvs | Bin 0 -> 6075 bytes test/constraint/length_ratio/test.cpp | 13 ++++++ test/constraint/parallel/normal.png | Bin 0 -> 4769 bytes test/constraint/parallel/normal.slvs | Bin 0 -> 6041 bytes test/constraint/parallel/normal_v20.slvs | Bin 0 -> 5949 bytes test/constraint/parallel/test.cpp | 13 ++++++ test/constraint/perpendicular/normal.png | Bin 0 -> 5015 bytes test/constraint/perpendicular/normal.slvs | Bin 0 -> 6041 bytes test/constraint/perpendicular/normal_v20.slvs | Bin 0 -> 5949 bytes test/constraint/perpendicular/test.cpp | 13 ++++++ test/constraint/points_coincident/normal.png | Bin 0 -> 4223 bytes test/constraint/points_coincident/normal.slvs | Bin 0 -> 5020 bytes .../points_coincident/normal_v20.slvs | Bin 0 -> 4998 bytes test/constraint/points_coincident/test.cpp | 13 ++++++ test/constraint/proj_pt_distance/normal.png | Bin 0 -> 4494 bytes test/constraint/proj_pt_distance/normal.slvs | Bin 0 -> 5142 bytes .../proj_pt_distance/normal_v20.slvs | Bin 0 -> 5210 bytes test/constraint/proj_pt_distance/test.cpp | 13 ++++++ test/constraint/pt_face_distance/test.cpp | 12 +++++ test/constraint/pt_in_plane/normal.png | Bin 0 -> 4211 bytes test/constraint/pt_in_plane/normal.slvs | Bin 0 -> 4495 bytes test/constraint/pt_in_plane/normal_v20.slvs | Bin 0 -> 4403 bytes test/constraint/pt_in_plane/test.cpp | 13 ++++++ test/constraint/pt_line_distance/extended.png | Bin 0 -> 4568 bytes .../constraint/pt_line_distance/extended.slvs | Bin 0 -> 5668 bytes test/constraint/pt_line_distance/normal.png | Bin 0 -> 4459 bytes test/constraint/pt_line_distance/normal.slvs | Bin 0 -> 5571 bytes .../pt_line_distance/normal_v20.slvs | Bin 0 -> 5549 bytes test/constraint/pt_line_distance/test.cpp | 18 ++++++++ test/constraint/pt_on_circle/normal.png | Bin 0 -> 4868 bytes test/constraint/pt_on_circle/normal.slvs | Bin 0 -> 5637 bytes test/constraint/pt_on_circle/normal_v20.slvs | Bin 0 -> 5615 bytes test/constraint/pt_on_circle/test.cpp | 13 ++++++ test/constraint/pt_on_face/test.cpp | 12 +++++ test/constraint/pt_on_line/normal.png | Bin 0 -> 4424 bytes test/constraint/pt_on_line/normal.slvs | Bin 0 -> 5525 bytes test/constraint/pt_on_line/normal_v20.slvs | Bin 0 -> 5545 bytes test/constraint/pt_on_line/test.cpp | 13 ++++++ test/constraint/pt_plane_distance/normal.png | Bin 0 -> 4328 bytes test/constraint/pt_plane_distance/normal.slvs | Bin 0 -> 4608 bytes .../pt_plane_distance/normal_v20.slvs | Bin 0 -> 4516 bytes test/constraint/pt_plane_distance/test.cpp | 13 ++++++ test/constraint/pt_pt_distance/normal.png | Bin 0 -> 4439 bytes test/constraint/pt_pt_distance/normal.slvs | Bin 0 -> 5106 bytes .../constraint/pt_pt_distance/normal_v20.slvs | Bin 0 -> 5014 bytes test/constraint/pt_pt_distance/test.cpp | 13 ++++++ test/constraint/same_orientation/normal.png | Bin 0 -> 4444 bytes test/constraint/same_orientation/normal.slvs | Bin 0 -> 5198 bytes .../same_orientation/normal_v20.slvs | Bin 0 -> 5106 bytes test/constraint/same_orientation/test.cpp | 13 ++++++ test/constraint/symmetric/normal.png | Bin 0 -> 4347 bytes test/constraint/symmetric/normal.slvs | Bin 0 -> 5048 bytes test/constraint/symmetric/normal_v20.slvs | Bin 0 -> 5026 bytes test/constraint/symmetric/test.cpp | 13 ++++++ test/constraint/symmetric_horiz/normal.png | Bin 0 -> 4347 bytes test/constraint/symmetric_horiz/normal.slvs | Bin 0 -> 5018 bytes .../symmetric_horiz/normal_v20.slvs | Bin 0 -> 4926 bytes test/constraint/symmetric_horiz/test.cpp | 13 ++++++ test/constraint/symmetric_line/normal.png | Bin 0 -> 4478 bytes test/constraint/symmetric_line/normal.slvs | Bin 0 -> 6018 bytes .../constraint/symmetric_line/normal_v20.slvs | Bin 0 -> 5926 bytes test/constraint/symmetric_line/test.cpp | 13 ++++++ test/constraint/symmetric_vert/normal.png | Bin 0 -> 4351 bytes test/constraint/symmetric_vert/normal.slvs | Bin 0 -> 5022 bytes .../constraint/symmetric_vert/normal_v20.slvs | Bin 0 -> 4930 bytes test/constraint/symmetric_vert/test.cpp | 13 ++++++ test/constraint/vertical/line.png | Bin 0 -> 4327 bytes test/constraint/vertical/line.slvs | Bin 0 -> 5046 bytes test/constraint/vertical/line_v20.slvs | Bin 0 -> 5066 bytes test/constraint/vertical/pt_pt.png | Bin 0 -> 4240 bytes test/constraint/vertical/pt_pt.slvs | Bin 0 -> 5022 bytes test/constraint/vertical/pt_pt_v20.slvs | Bin 0 -> 4930 bytes test/constraint/vertical/test.cpp | 25 ++++++++++ test/constraint/where_dragged/normal.png | Bin 0 -> 4246 bytes test/constraint/where_dragged/normal.slvs | Bin 0 -> 4540 bytes test/constraint/where_dragged/normal_v20.slvs | Bin 0 -> 4448 bytes test/constraint/where_dragged/test.cpp | 13 ++++++ test/harness.cpp | 43 ++++++++++++++++-- test/request/arc_of_circle/normal.png | Bin 0 -> 4879 bytes test/request/arc_of_circle/normal.slvs | Bin 0 -> 5401 bytes test/request/arc_of_circle/normal_v20.slvs | Bin 0 -> 5379 bytes test/request/arc_of_circle/test.cpp | 13 ++++++ test/request/circle/normal.png | Bin 0 -> 4789 bytes test/request/circle/normal.slvs | Bin 0 -> 4941 bytes test/request/circle/normal_v20.slvs | Bin 0 -> 4919 bytes test/request/circle/test.cpp | 13 ++++++ test/request/cubic/normal.png | Bin 0 -> 5046 bytes test/request/cubic/normal.slvs | Bin 0 -> 6151 bytes test/request/cubic/normal_v20.slvs | Bin 0 -> 6129 bytes test/request/cubic/test.cpp | 13 ++++++ test/request/cubic_periodic/normal.png | Bin 0 -> 5354 bytes test/request/cubic_periodic/normal.slvs | Bin 0 -> 5595 bytes test/request/cubic_periodic/normal_v20.slvs | Bin 0 -> 5503 bytes test/request/cubic_periodic/test.cpp | 13 ++++++ test/request/datum_point/normal.png | Bin 0 -> 4187 bytes test/request/datum_point/normal.slvs | Bin 0 -> 4333 bytes test/request/datum_point/normal_v20.slvs | Bin 0 -> 4241 bytes test/request/datum_point/test.cpp | 13 ++++++ test/request/line_segment/line_segment.png | Bin 4300 -> 0 bytes test/request/line_segment/normal.png | Bin 0 -> 4303 bytes .../{line_segment_v21.slvs => normal.slvs} | Bin ...{line_segment_v20.slvs => normal_v20.slvs} | Bin test/request/line_segment/test.cpp | 20 ++++---- test/request/ttf_text/normal.png | Bin 0 -> 5390 bytes test/request/ttf_text/normal.slvs | Bin 0 -> 5134 bytes test/request/ttf_text/normal_v20.slvs | Bin 0 -> 5037 bytes test/request/ttf_text/test.cpp | 13 ++++++ 175 files changed, 649 insertions(+), 18 deletions(-) create mode 100644 test/Gentium-R.ttf create mode 100644 test/constraint/angle/normal.png create mode 100644 test/constraint/angle/normal.slvs create mode 100644 test/constraint/angle/normal_v20.slvs create mode 100644 test/constraint/angle/test.cpp create mode 100644 test/constraint/arc_line_tangent/normal.png create mode 100644 test/constraint/arc_line_tangent/normal.slvs create mode 100644 test/constraint/arc_line_tangent/normal_v20.slvs create mode 100644 test/constraint/arc_line_tangent/test.cpp create mode 100644 test/constraint/at_midpoint/normal.png create mode 100644 test/constraint/at_midpoint/normal.slvs create mode 100644 test/constraint/at_midpoint/normal_v20.slvs create mode 100644 test/constraint/at_midpoint/test.cpp create mode 100644 test/constraint/comment/normal.png create mode 100644 test/constraint/comment/normal.slvs create mode 100644 test/constraint/comment/normal_v20.slvs create mode 100644 test/constraint/comment/test.cpp create mode 100644 test/constraint/cubic_line_tangent/normal.png create mode 100644 test/constraint/cubic_line_tangent/normal.slvs create mode 100644 test/constraint/cubic_line_tangent/normal_v20.slvs create mode 100644 test/constraint/cubic_line_tangent/test.cpp create mode 100644 test/constraint/curve_curve_tangent/normal.png create mode 100644 test/constraint/curve_curve_tangent/normal.slvs create mode 100644 test/constraint/curve_curve_tangent/normal_v20.slvs create mode 100644 test/constraint/curve_curve_tangent/test.cpp create mode 100644 test/constraint/diameter/normal.png create mode 100644 test/constraint/diameter/normal.slvs create mode 100644 test/constraint/diameter/normal_v20.slvs create mode 100644 test/constraint/diameter/test.cpp create mode 100644 test/constraint/eq_len_pt_line_d/normal.png create mode 100644 test/constraint/eq_len_pt_line_d/normal.slvs create mode 100644 test/constraint/eq_len_pt_line_d/normal_v20.slvs create mode 100644 test/constraint/eq_len_pt_line_d/test.cpp create mode 100644 test/constraint/eq_pt_ln_distances/normal.png create mode 100644 test/constraint/eq_pt_ln_distances/normal.slvs create mode 100644 test/constraint/eq_pt_ln_distances/normal_v20.slvs create mode 100644 test/constraint/eq_pt_ln_distances/test.cpp create mode 100644 test/constraint/equal_angle/normal.png create mode 100644 test/constraint/equal_angle/normal.slvs create mode 100644 test/constraint/equal_angle/normal_v20.slvs create mode 100644 test/constraint/equal_angle/test.cpp create mode 100644 test/constraint/equal_length_lines/normal.png create mode 100644 test/constraint/equal_length_lines/normal.slvs create mode 100644 test/constraint/equal_length_lines/normal_v20.slvs create mode 100644 test/constraint/equal_length_lines/test.cpp create mode 100644 test/constraint/equal_line_arc_len/normal.png create mode 100644 test/constraint/equal_line_arc_len/normal.slvs create mode 100644 test/constraint/equal_line_arc_len/normal_v20.slvs create mode 100644 test/constraint/equal_line_arc_len/test.cpp create mode 100644 test/constraint/equal_radius/normal.png create mode 100644 test/constraint/equal_radius/normal.slvs create mode 100644 test/constraint/equal_radius/normal_v20.slvs create mode 100644 test/constraint/equal_radius/test.cpp create mode 100644 test/constraint/horizontal/line.png create mode 100644 test/constraint/horizontal/line.slvs create mode 100644 test/constraint/horizontal/line_v20.slvs create mode 100644 test/constraint/horizontal/pt_pt.png create mode 100644 test/constraint/horizontal/pt_pt.slvs create mode 100644 test/constraint/horizontal/pt_pt_v20.slvs create mode 100644 test/constraint/horizontal/test.cpp create mode 100644 test/constraint/length_difference/normal.png create mode 100644 test/constraint/length_difference/normal.slvs create mode 100644 test/constraint/length_difference/test.cpp create mode 100644 test/constraint/length_ratio/normal.png create mode 100644 test/constraint/length_ratio/normal.slvs create mode 100644 test/constraint/length_ratio/normal_v20.slvs create mode 100644 test/constraint/length_ratio/test.cpp create mode 100644 test/constraint/parallel/normal.png create mode 100644 test/constraint/parallel/normal.slvs create mode 100644 test/constraint/parallel/normal_v20.slvs create mode 100644 test/constraint/parallel/test.cpp create mode 100644 test/constraint/perpendicular/normal.png create mode 100644 test/constraint/perpendicular/normal.slvs create mode 100644 test/constraint/perpendicular/normal_v20.slvs create mode 100644 test/constraint/perpendicular/test.cpp create mode 100644 test/constraint/points_coincident/normal.png create mode 100644 test/constraint/points_coincident/normal.slvs create mode 100644 test/constraint/points_coincident/normal_v20.slvs create mode 100644 test/constraint/points_coincident/test.cpp create mode 100644 test/constraint/proj_pt_distance/normal.png create mode 100644 test/constraint/proj_pt_distance/normal.slvs create mode 100644 test/constraint/proj_pt_distance/normal_v20.slvs create mode 100644 test/constraint/proj_pt_distance/test.cpp create mode 100644 test/constraint/pt_face_distance/test.cpp create mode 100644 test/constraint/pt_in_plane/normal.png create mode 100644 test/constraint/pt_in_plane/normal.slvs create mode 100644 test/constraint/pt_in_plane/normal_v20.slvs create mode 100644 test/constraint/pt_in_plane/test.cpp create mode 100644 test/constraint/pt_line_distance/extended.png create mode 100644 test/constraint/pt_line_distance/extended.slvs create mode 100644 test/constraint/pt_line_distance/normal.png create mode 100644 test/constraint/pt_line_distance/normal.slvs create mode 100644 test/constraint/pt_line_distance/normal_v20.slvs create mode 100644 test/constraint/pt_line_distance/test.cpp create mode 100644 test/constraint/pt_on_circle/normal.png create mode 100644 test/constraint/pt_on_circle/normal.slvs create mode 100644 test/constraint/pt_on_circle/normal_v20.slvs create mode 100644 test/constraint/pt_on_circle/test.cpp create mode 100644 test/constraint/pt_on_face/test.cpp create mode 100644 test/constraint/pt_on_line/normal.png create mode 100644 test/constraint/pt_on_line/normal.slvs create mode 100644 test/constraint/pt_on_line/normal_v20.slvs create mode 100644 test/constraint/pt_on_line/test.cpp create mode 100644 test/constraint/pt_plane_distance/normal.png create mode 100644 test/constraint/pt_plane_distance/normal.slvs create mode 100644 test/constraint/pt_plane_distance/normal_v20.slvs create mode 100644 test/constraint/pt_plane_distance/test.cpp create mode 100644 test/constraint/pt_pt_distance/normal.png create mode 100644 test/constraint/pt_pt_distance/normal.slvs create mode 100644 test/constraint/pt_pt_distance/normal_v20.slvs create mode 100644 test/constraint/pt_pt_distance/test.cpp create mode 100644 test/constraint/same_orientation/normal.png create mode 100644 test/constraint/same_orientation/normal.slvs create mode 100644 test/constraint/same_orientation/normal_v20.slvs create mode 100644 test/constraint/same_orientation/test.cpp create mode 100644 test/constraint/symmetric/normal.png create mode 100644 test/constraint/symmetric/normal.slvs create mode 100644 test/constraint/symmetric/normal_v20.slvs create mode 100644 test/constraint/symmetric/test.cpp create mode 100644 test/constraint/symmetric_horiz/normal.png create mode 100644 test/constraint/symmetric_horiz/normal.slvs create mode 100644 test/constraint/symmetric_horiz/normal_v20.slvs create mode 100644 test/constraint/symmetric_horiz/test.cpp create mode 100644 test/constraint/symmetric_line/normal.png create mode 100644 test/constraint/symmetric_line/normal.slvs create mode 100644 test/constraint/symmetric_line/normal_v20.slvs create mode 100644 test/constraint/symmetric_line/test.cpp create mode 100644 test/constraint/symmetric_vert/normal.png create mode 100644 test/constraint/symmetric_vert/normal.slvs create mode 100644 test/constraint/symmetric_vert/normal_v20.slvs create mode 100644 test/constraint/symmetric_vert/test.cpp create mode 100644 test/constraint/vertical/line.png create mode 100644 test/constraint/vertical/line.slvs create mode 100644 test/constraint/vertical/line_v20.slvs create mode 100644 test/constraint/vertical/pt_pt.png create mode 100644 test/constraint/vertical/pt_pt.slvs create mode 100644 test/constraint/vertical/pt_pt_v20.slvs create mode 100644 test/constraint/vertical/test.cpp create mode 100644 test/constraint/where_dragged/normal.png create mode 100644 test/constraint/where_dragged/normal.slvs create mode 100644 test/constraint/where_dragged/normal_v20.slvs create mode 100644 test/constraint/where_dragged/test.cpp create mode 100644 test/request/arc_of_circle/normal.png create mode 100644 test/request/arc_of_circle/normal.slvs create mode 100644 test/request/arc_of_circle/normal_v20.slvs create mode 100644 test/request/arc_of_circle/test.cpp create mode 100644 test/request/circle/normal.png create mode 100644 test/request/circle/normal.slvs create mode 100644 test/request/circle/normal_v20.slvs create mode 100644 test/request/circle/test.cpp create mode 100644 test/request/cubic/normal.png create mode 100644 test/request/cubic/normal.slvs create mode 100644 test/request/cubic/normal_v20.slvs create mode 100644 test/request/cubic/test.cpp create mode 100644 test/request/cubic_periodic/normal.png create mode 100644 test/request/cubic_periodic/normal.slvs create mode 100644 test/request/cubic_periodic/normal_v20.slvs create mode 100644 test/request/cubic_periodic/test.cpp create mode 100644 test/request/datum_point/normal.png create mode 100644 test/request/datum_point/normal.slvs create mode 100644 test/request/datum_point/normal_v20.slvs create mode 100644 test/request/datum_point/test.cpp delete mode 100644 test/request/line_segment/line_segment.png create mode 100644 test/request/line_segment/normal.png rename test/request/line_segment/{line_segment_v21.slvs => normal.slvs} (100%) rename test/request/line_segment/{line_segment_v20.slvs => normal_v20.slvs} (100%) create mode 100644 test/request/ttf_text/normal.png create mode 100644 test/request/ttf_text/normal.slvs create mode 100644 test/request/ttf_text/normal_v20.slvs create mode 100644 test/request/ttf_text/test.cpp diff --git a/src/platform/headless.cpp b/src/platform/headless.cpp index 036e314..9580e0f 100644 --- a/src/platform/headless.cpp +++ b/src/platform/headless.cpp @@ -233,8 +233,9 @@ void OpenWebsite(const char *url) { // Resources //----------------------------------------------------------------------------- +std::vector fontFiles; std::vector GetFontFiles() { - return {}; + return fontFiles; } std::string resourceDir; diff --git a/src/render/rendercairo.cpp b/src/render/rendercairo.cpp index 3f7cb99..d5e7753 100644 --- a/src/render/rendercairo.cpp +++ b/src/render/rendercairo.cpp @@ -19,6 +19,10 @@ void CairoRenderer::OutputStart() { cairo_translate(context, camera.width / 2.0, camera.height / 2.0); + // Avoid pixel boundaries; when not using antialiasing, we would otherwise + // get numerically unstable output. + cairo_translate(context, 0.1, 0.1); + cairo_set_line_join(context, CAIRO_LINE_JOIN_ROUND); cairo_set_line_cap(context, CAIRO_LINE_CAP_ROUND); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c0ed0d2..e79d9bb 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,7 +7,48 @@ include_directories( set(testsuite_SOURCES harness.cpp - request/line_segment/test.cpp) + constraint/points_coincident/test.cpp + constraint/pt_pt_distance/test.cpp + constraint/pt_plane_distance/test.cpp + constraint/pt_line_distance/test.cpp + constraint/pt_face_distance/test.cpp + constraint/proj_pt_distance/test.cpp + constraint/pt_in_plane/test.cpp + constraint/pt_on_line/test.cpp + constraint/pt_on_face/test.cpp + constraint/equal_length_lines/test.cpp + constraint/length_ratio/test.cpp + constraint/eq_len_pt_line_d/test.cpp + constraint/eq_pt_ln_distances/test.cpp + constraint/equal_angle/test.cpp + constraint/equal_line_arc_len/test.cpp + constraint/length_difference/test.cpp + constraint/symmetric/test.cpp + constraint/symmetric_horiz/test.cpp + constraint/symmetric_vert/test.cpp + constraint/symmetric_line/test.cpp + constraint/at_midpoint/test.cpp + constraint/horizontal/test.cpp + constraint/vertical/test.cpp + constraint/diameter/test.cpp + constraint/pt_on_circle/test.cpp + constraint/same_orientation/test.cpp + constraint/angle/test.cpp + constraint/parallel/test.cpp + constraint/perpendicular/test.cpp + constraint/arc_line_tangent/test.cpp + constraint/cubic_line_tangent/test.cpp + constraint/curve_curve_tangent/test.cpp + constraint/equal_radius/test.cpp + constraint/where_dragged/test.cpp + constraint/comment/test.cpp + request/arc_of_circle/test.cpp + request/circle/test.cpp + request/cubic/test.cpp + request/cubic_periodic/test.cpp + request/datum_point/test.cpp + request/line_segment/test.cpp + request/ttf_text/test.cpp) add_executable(solvespace_testsuite ${testsuite_SOURCES}) diff --git a/test/Gentium-R.ttf b/test/Gentium-R.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3b44ad16d4b7ba32359857f73142a01d11687ec4 GIT binary patch literal 362644 zcmeEvcbr^R-S@d=dY{?pz3M%O;!bZhFtAl3oZU0U;!z2_j7q5RnHJ zLlHuP3QDn|C?KdHibUYiM-h1tNp|M_o_l9@7h`-r>gRp<<9#iLq8^jDJ4Yu#o>8nscm|MDrEy9oF8oXORj_deb6!{-P$wTY0MeUocetp4SLsSd(_nzmOn zi3^%O)qmjpNt}l!H}Bm0&i8)uS)9Lx+g-VF&Gs!tYsm$Kzkeqo?eb0Mty-ad?+?2P z|K0_7|Juzf_HLDbo!?F*I(mQKmKB@VJXS)U!Feemb@R8Lw`1pTo_OdTBI)@AAIOkWZ|G`krzD>Otu z(jhb=d?p>I7yPvP$A2Gf>mPqsg|`Rrg@5p<|G0twYwu1!5e^3OV=CTEe5WCu|3ukG zA3-(!#gAV9J7;Ho@~jJg=S$+HfwMmFEg}4H&g>4 zMF%AZr3Y?-e`nuky2+3C;O{(G88e_SJd^-j+C%U|zLOn{aE_i)^yiNYpa1`_|9=F8 z5r{Ai0yJhg@PF`LmIP_^7!%(X;9 z2sh4+Lo**Myppvn6d6k-oRq%szak`u3ml5@H?McVhXdbfUaHOd$wKLCY&9-8g*R!% z5aH>FntUM7L6ggJQ$#`JsFg&4T1Aw(Gk8~pT0_*RwM2tjhx#Rfx4O`QP+?%)M-+ldxzAL3e878s57J{_XpBU(x_X6x|P)8xQ*21{)@Dedej}H0d*&7%>ABpktWpLLfu0$ zIPN9Qx!;jK(t^65w4xp$ZKwxHd+tBUkWdek4jj)Row>Kk2U0@SO8dJP%F@meyT`wdw~CQwh3g{aq)MW{EB#ktqXMxowBmf(0ZS(^Jb z*+Q0~K94L%y_Kv$y^XBQ{fcZC>K$Yij(3vPx!1@pvIg~TvKI9ovJUlLGMW1&*(cQJ zll3^>Pd1>wfNadYN-iXuP+vqgqrRAI$-P1j2=zg79*!>|TTx$1w&i|7K0&slzKrZZ zeL2~Q`Vi`$lPkzB)Q8D#)JMpk+|S5SvKRH0WFP9Q$oZ(RM*T9mhU`auEx7>oC&`7m zm&kSGBGlKDi&1}y96)^o>YtKNlY^*lB$uGRiCl{MX7Y*Li{ut^8R}cf<)}Y{`UUb? zas}$!g!*&jFph60M{>`TJIGPgcakene_p8XB3I>pLcTz*MtwKA2K5)owYeXYd&nnI z{|C7a^}XbJ)L$Z>$~{NEEYx2iH{kd_^6A`<$XCgYsE?7GP~T5(M*RTlACd>jEvO$N zx1#Ti-S zpnhDapCEVVzDK@AzKHtUZ0>YtI5sDDl#%YB>tf_xqID?CqXIFPmZ(skw;Lz}#k-76m=Pwu=pIEqP@sg!v{{Vss}_kZxi zA3d}ETTgv&-@(0?T>Od4F2D5f5pu;f*Is?>YbQ57a{SR9kDYj!@Ep8Y@XG-rrCI}0 z;|oCUk3juDf+}Z7jwxp@oIf_B-s$>@V5hbA(&Y z?G&E$6L`|AxzFQCpWr}YJgJ_apMTO9_?P)#@o(WtiRX4N@!GsTZ;y9Q{z;d44|pH; zKJERf_f_w^-uHdPr^l1l;YoM;?(ltS`bhyv`lPvE0sSQR2+D&f51_n`@@tgWP=1N> zYVH@gZvy!QI3~HT`<)@OT5~oT}#ZSdf6`zWpiku3a3ZC+x@}2S$@~c~Z zb=@1!yz%5454>^gjjz7;rQZzyrq{I!qsagP^zUAjmr>qDd1uxuJ^llV`1f19(DL{G z5JUO5|86=*3&(JsgOvLTX#PA|1C6^5nsz-j>K-T>fI&~{_>2|UM(rzcT z=gW|EKZk@n1if|``s^t5*elRtS3`SU3$67k(Eb`^+^?YxjzJ4N0O|h_r2fN@_QxUR zPe8gqM!qhIOG+gPaK|?#NlBTcoIFmRAm5TyK$bsAo|2>>!Ji@DkyJ{mB-P}*k{Zb- z$mkzQHcPg^28+W+*#g~5h$rhKMckdl!~Y%@6mCFD`;QaFobme^=IV*#OzyJdq{ICv ztWR#)(!_CutbD%C^&Q8Uv>&=8gv^d`EmodRHIub@?V&tUktv zg;%_>=Ey{u?--dkz8>}Hxc^wogme0E&BR1K+Tm$C_zFILWCAU0$hUx3;ZoTYJ|rpa z_Z{ORbH+!;j~(c69&72CaQgke&SQ_y89(-ThtoeXflo=NpA=7g;d)#CnPqrpX$!^Uu_iijD@AGlyzx#vn13Q6poxP`&%#b;z>_RcG@hHwEtO2dx;K-B%v>-Y0)>@? zkDnyNcw2&_<78NW5+)=MRU~ak_47Kfwhge9ZDC<0+h8VyHPGjQ7mbdz~~_m zrBFQdFA7dfAgl_ezY6BL3II^S%vF&Il=Ue4P!6Lgme9K&C;I2aR|{SxICtT- z60Z@wM#{u%2^`b+YVk_H)0}^u!0RZ^7rz3KIq~5P3h5j_PTXbAN8x2iG86d=K6=47 z>%s)RFhMVzgz?Uz+jIn4(AtFlQ8+s6nd5}sH-RSUReJB*vJ)`Mog`y0)|FS7iae~< zpyimVBpWqkI8MvSqSXOuFc66*nd+*VwAI5{4N0!LD#NC$GhEtg_Hb5H^OyG#b6yDN#zgZdfFfN#*hKPc6#qSyt~KI90MPH^9d)Fs0PW;yFFO;2qs>q*Cq*>*`V-J2bk zE2I+6at%{aC#efZhF$!+jcVpKYpQ#7Uu?zv7S(lfxrE~_pJFsNzeyI3$JFv-63%*Xro>rB zI8)-R3THqfK3Sy~a3jj(JZ=bZLx3B^bWwUyCQ#O+>_a(>0_ahUdVo<6FzNwDJ;103 z81(?79$?f1jCu+f^#G%u0!A~yXr_SC4DOY|y)w902KUO~UK!jggL`FguT0@yJ-Am7 z?$v{P_26DTxK|JE)q{KW;9fn2d-dR6J!t+oSwaz+0(8buD1_?DPQoK(;n~ryw*ydv zC=!55Lf-}Cbbwr|pU7}vMTw%MQMysaP}ZUBK{Qf_FOsNLaSBz|^Yh2kCnd&GX+1SvqqB~kXvZ20lWp|YEcTINs-SuM)JsUa$p2i9G zQ1@iV>s>_?PsMk7Z%l2FFqe4aZc`a zNt@(eAUjNUFmIhiID&_BP6_4*a;f~BBb*VOEyNj+jrSJf4008Unx0kuJ2F%Wd@2k0 zRDvo>;8O{FDuGWW@TmkomB6PG_(a%7`$1-Z0iS;0 z(_i3)N!)9)aIZ<+YZCXG#JwhQuSwjC8Xl9l*Cg&Wi6%}UpfX7+A^VP#T@>Gfq-~~h zw0V|b?W7kvMZr2Bh}Q|jG9QDq4QHE$vuyxcCtz1pzB#-$b3 zF)bqAl&VQ5xu_Q68DQ2jGMrFZEtOdy(9>2eLnS<|DdzE6$a)d^^fUN8gnS0q&{`Dy z;kPo61>BspWnQ__7_1J4YC^`*`B&GaHmq3^uI!4N%IB=(*4r!W#$;KkL8XzgnYzyU z$auYCY>&mVrDy2z%}Z|C(savp?m*4LUCk|H)z(Y*m;(CX*ot+PKEEqb@3yGoMa*MX zenb65Z44jm>+SXjGi9!DD-Z#Sl6cB2z!&a#Gufsq>RxUio3gS z>u*c?%-VP)Jg2j5Ud8fjmTo<@q5E*#$dNU5B^?vx>mTV;TUD)>T(r9?wKfs!OZ!|J zk32*z>f5;lvt05W8Z!hMRFGp5I-FWA$Wdj-RLiXnr@C4dOBAc(TpKT!a_kzZL9b!W z`1Zc+Q|wA<3#^mjlQ3KOyhWlH`9}{->w#%KFs%os^}w_qnAQW+dXQ0Hz_cEi)&s_P z0wtb+&?iW;AdG{70@kt+U`D86wr$&&cGS1-{f~9N)}3ROvAMekvrko>e4mMY?k>1g zEXJwk*jw4(-hN&7cYpd;GoG&m&u0{#uV3VSY9k36>z}rC@N9;{=oBd#sVtgdjn!2w ztbnwKHL}JwJeRj+=XhmoWY3^?+n09Mvp0Pq`)oEVJ{IG+t&tipH|1RZfRh#xh;mpD+x| z^FhWPRk_?QRfxaqNo~kba@9e5hsFAQ_UlreM#UPLGb3g}`tvt9^1+FD{rFJ8IwLXXb>(GA=8W#3v9!4s>Wxz+M z*=TvLydn&~j2ip`LmH^oGWfyBGQWX&wW!=;&;H&nF(??VDP^%SW}Czy&;IH6O1;Fw zSZzh+MT|jelvuNG+lnd;S-6f28PEQRIRqckB0iyLLI2C>pnMai#$c3+p$L6}s9_Fy z8|GCdTv3}U-J)02ceWeL16|RTYga^rzQ&gBcxe@1ruMo`jCGhkQxo$HyNjjD!T^6x zfw92AVb~OU%9ZG>D2~`&Qgn~d4ztA0`Yn|Po29(Sh88Z(z07PQzlY2QPf~p+rHgmYrU6Zs#DqX3H{lSJ(dworyA>nAC{iw*^&s_!1 zQwef~ay1`@Fb+M%PO1pSqeQc6fEC8U%RQc4LarG%7HLP`lL zntDn~NGYn=fmK0k+NqMXi%K#$4cZ{?VgL9{L7?PsjK1{Wm~!lo<2_3&E9cgEi#wOq zR?V&R+|_j6XO}Izc11s?t&Z@PQ>R3gEF?jk# zrPXFrRMTfziD&2lPEzE8lL!m)U>M3Qlm_HE0VN7pNZ=yTqg8-h3Rp-ASV#(3ND5d; z3Rp-ASV#(3ND3$<@!M6?w$V%vsE5R2LXFs{VRqe$>9cnq_Hok&}$T|r)t~Mra^J z;v{??9&n~lnGwCS2*w~%7=sALAc8T7U<@J{g9yeTf-#6-3?dkVh+rj}@k%{pN=jiI z&1l11Xv2&)%xJ@mHq2DI- z7u_a3fTV{BsfP)vhgQ_Xgw(@?)Wd|-!-Uksgw(@?)Wd|-!-Uksgw(@?)Wd|-7fi@= zH>7o9tQED=cbx3@)_ zR`(Q_^(`vZ%A_itPP=$ZgUOueC@*e~8G!4!Gc$R3pnqeh&z&Bss9V(&V=f&1^ww5w zurA&nD0L_!J!@O~*SEP@mTR=Pb$5FMJ@sK{vMFFNao*UnIo0LEt12UX9rYGjdj4h% zU>eBZ0PbTE5LtQ>OvqEo2%5Vwrn2WKIzc$OWp*(>bI{tQ_SKYRt*vv* z3|Xz8c_#+ZzTd&?r@oHRwBdcZMyFTA<0_LuulSvxvl=71;FJjgUj}oVuY-@D!OZMw zQD>RZ7Xf!B;LcRQoe8)z0e2?g&IH_K-JFw{loI;z)v zYUz@P$AZ;keHnM_iWZ;0eO;HirlG-6Ce<4ZS|!UoRM+BGxjk-m_Ci*v(elNcDi0qr%Qy#}<`fc6?R2m=yr zlsrcv02~AhIGC-eljw-ZDM@^mYHEaBMd>34<>jEf9F&)X@^VmK4$8|xc{wOA2j%6U zyd0F5gYt4vUJlC3L3w$B^5??}E15qU&_|59B(h~{luf&u41_7uCX^bH(&dui9ph&PA$2N^5LXl zcRd6}7br+>C6yLRQChe$cJT59DMQUs3H6ktHPlPxWc_6a|K&Bj-M`n?A}Rc#Mx{5LZeMsnr=Yj3PKT08qXEMe*_ zEX9*7hek7yFd1ZSK8d6g9tj}y-Y)Pjl2S2<^sGblHC@1)3wUz@Z!X}?1-!X{Hy7~c z!ic*Hcyj@7E&*>Y(7v8I|$Rh`lKtxEyupb!q1H*n`*bfZ*fnh%|><5PZz_1?} z_5;IyVAu}~`+;FUFzg40{RIr4yOBJG#fX%sL7^1#krF_F8lU;73)QEyZBN8wW@0P= zi-%*3@t!5AzKpkSPDP@v)WY0fHn6g)yd!Q7v@EJi52vi3ZQb_i`3pX=xGdbcqA@;L zA4o61w7-AXaLiNFUs|!aGsZn!+FBL2RBx=Q8cf*&>5i!-ZA&{+)?jM080uR`cIT*OLwfjJ8SuM97UlV5l4im_!~^NTA-YTb#>xy-$D@5zz- zjF&xrpi^0MP3N2o$CA#<-h~?)x-MPY#Ks3Q7u~ZaR?@qsVezhZ`>~s{r@wp1-r(PK z%~#hn_S7sr(4ShrazRVDe*ZTxe#+!JgBdJZY1Lx65gmDxGDT+Xx6sqY)CaU*-1m7S1FX^*9Hg^ZQ5yqwFvXIDC0 zc62&w^yxmdp_g-VFLP1E2z8`|(NN&=5H7UiBJc{5m`2oT3@{|TmyZGd)ANugV9R2O z0=h@B{wTy5C;Iy#@E+(O@?HqM7Xt5vz%h%yl6v{G;y@(EFD zP`XeSpsYpNjdD3kp3_RfX<#XES{fW%4NlYJwe6LU#6V8MLS-RcY3Ccyj)*{Q>!@#A z#zZnaVn8ATS_J~gNSWuUEe>-tb@$}N-lx)M&d zbJtCyz1xS1XNOq0SNiu(E?cv`d%4ymH}9<5wt3^)Rpl34>96UDYCT$mUgD9<74ojV z;}ywyJMqk2*~8K@%=j0PUF@opNH*k=kU+aZgZhYt=ph^pk9x%59KgQo|5xH$@!q(5@j#S6(~2M+=Fr)fr5L3ar3YmkWfDb(8IcHX z{xMBKo`Ch>A}L|8JK!`jNv@!N1VaFxwqVl2ILOa43MvSuL)u!78A?NuMRdRsP{$W} zA>uE56LLKm2u0}BB>f6wQCE zSFWF5yKso7A|PseEsM>jP$`JRZ9-u{FQ}Y%f9x# zO~L9$M>;avmE8RcCjI!fpFMHsuC_H#V={ocB!s_D62_4W#%&&SRth>RQB9+eqZg3( zF@0gSFVEo1qCvn=6Tr`zsxwTK^K(**;I?B?2u7R1M2eZYm05J`TSFPm_Uz<&ir%@| z&Yh|r0d-~0|#Oq@Qvk!V*@Y>Z*H^0_iqCMT`^2_4XLNCd^%Y7hG zLI(y(Kg*wl_szqGr830?wxAZeIJepXwlJY^Vnptro*z8{b*s$V*j`bBcp*U$x)61N z7ZSt^3F3tW@j_mBp$oi_AYO2w7aZt?V0aW7f!f&Jc*2kX(!ptIke~gW8RZf>$|bW# zxtv}o7nvXYoSzP*(-O_#IM_8JyNk&Ud3Gn@R02*V;8X%mCE!$H5gXW@fZYk$ou)Jj zxm93yF{SM-yncX^XZLeALfM^r4h1$r2_C{xZ~%~~kCP}$8l@X$3}qe49+X2UH==wI zjK-a8glxE4l2t>LJC7^GFjBKb6#n5xP zagQ%wF;w2$F&OC$D5C4O@2**W=eDM`<1Jf8lKjIAll3RM#^b34&7rC1<KyE+Vsw4P1#?}KfJt(<#>*bYyDb2BT-2+DziZq?pocv>DGX{ZN+|Sb#=k_{1C`a zGSHNPX&eVc{TF~93P2SEpoap`LjmZa0Q67*dMJQl2^92D0D33@kQTUEM^U7k#mzI} zDa?L>hRyw^EQQ=EQ3=qzl^O(Rxer@*ZC+osnw^N3<|PKsZhEp)sR>FGf{BLor1|@hmjV z1gYpm)yF7SSoD=eUq8m!7!@Ug@BkvjsJvi5Aolzb!NEM0DpzXf40T?=Z>a6!6Ku3{ z!S)L;X~=RNgT+05Md^+Mmo^;z)ot_nhq=>lTC@g3`{C!Vy6pMuho=5;;ZrxRZ}$pf zpb;s08MVcrn0MP7;Qkbp+X-a7)(~VB#=!lePK|-`PC8F5M3yy_dYW0(o6*cPR7H_R z6`>1X(&VKxb>SaH2%1h9(V1+qGnfvm#w<1`3nsaspH66V$W@6mbY`r9p&=A2cS3HL zpSh!Bu(yYc_*uDHBTcZHBDXPn9dm<2ZnfK0x?rLyc9phtPTRp`YpTQ?e{aD-x6nDK zI;4%;9hpq6DVYiDvV$(I*KL>UinP+KN@q1Fl);V$Bb9oz-v`m}7@appM2h}H7b56_ zFh4K!TS5D+nAPvu(__?E3=3bf;Y$ki7IV4iEhhdzwsZFs=1EHEUAdQ$t2ELwR%LdZ zvPYQRZiUTZSLy=j-PXaC|5Jyiex~-AV4DaMoZkn&Zf0&q<|nY+ic&XH$q;~V4V<^F+#G_5Fhn`sp{pCXIhFD zBWRJn#_$@WaT;OF8t9lc%o?)_dZ9wJFB;GQG9E+&Ld>eo%Y7B(zKTi+$bA*$z6x?* z1-Y+++*d*Ft04DPko!X34&=THa$g0xuY%lH73BW88=-Q)0yno7)*43{GSxo?Hsw-)5S6^DPnk-XfuVjOWxI`<|f z(NZ@7*1jm{4K#dM?Kf)~v!R^kYJEgEcv#*jGy0<%zrSm6L5014-e_B_fA5V0z56Rn zWy4L(vvuVx{`z*U98auy^48_+AO7=U|M1*l{w|3d*#=T?iA7)P^*Lysv(!OE3m6ilS@B(;C@(m_XO`~N4&aP~9PXX~O*BR7XsGb%;{%P%d;Aj^k28IHKDVXUXAamjCc9H1_jsHVqgBlZ z#%|ihWu;oZ0saw&&-@EBEqUn)GQA=Z<=CfQsbg_;{XFiXu* z@SgD-ohGHI)EGqTh%|s_tH2u4{BQ>7a0X@#cp1G=HtT|%UO=d2+Q~N13x-)2Z1jRn zyif)i3Y7!jQjaeM;9H&mlZZ!%cs)m_`NT8PKQc}8C?}OML57a*J5yI3gh}e%Qz<;HRr5hoDq6-@SH>;3?9~!3r7X1L4i)aL@P5((BUFX zBr4(hx&uAY7j!0*&BT7Pbq;e&Pj9MDJ=NYm6jwx`S-c)uT%z|n&g|ySQ%69& z*b(P$gxV2K+}u#GBMi{*28c8R><9zw2m|a01MCO`><9zw2m|a01MCO`><9zw2m|a0 z1MCO`>@k-{yh9Z{7;WN~JZ!|XXniW}}Fd$N6Wb=|~OE2^5-9T}W= zbWQE83vd0w_PviC>=?i4+1(dBcA%Br)p=;&WPg0%=+ozK{mzZ!omYJC(^vfWi7gu* zcRGJ5d$(}Kt>G6hyfWfAR`83#DI(#kP!niVz_?{ z$cOd~5pwO0(zLmG{n}9~{!LDA1Kp$G^yt6E=_eo( zqND<3D^R?Y@_gwmp7+rUv)91o^%=C)NjMoSgeQeS1D=QaCLfzf@O^wDfsUe&7%+-w z3kSNe0ZTrjSl~Ca*hyHzCt8Q_w*QW}VB)q^d0dy-w|7sY)w1Qp<^2V@QM>x^oaCah zxnZ?4Q0j619WgR>OKE3?qiJkekXw7-e|{n_OwQl%^cN3=Y>ibRxzS?@Qe+~Y&hG#+ zHJJ777neac1DP36(gox;M)N-Wz%24zMeX!2bd~!$I-Us(IRE+QKVfuB! zcy&P4wkPUNYqMY0JE~kgy$CgBiG)3RS$c6>_;jBjpqeBq1enYQWpeI$Era`)HtVxt zvqQsjaf{n;VG|N*RwlSv&@j7b1{P4z$Nb_r=?DD>P{=Dd#>mq60=3T6cva(-#%6Rl zrb{R2v4|6V9u$BE5|QDC-hp!@&Xu^KcihlBZeYm`z2k=7aYOI8p&Q)L4Q@g2q|s(t zX!B8Qgp;>h+F-Y|VO-n5UTv^j+F-Y|!ER}T-O>ha+*Yt#+F-Y|&9Yk(RAeP)$uJqc zAftw$X#cm;6_YlY4K_$W8_WhQ89^CCS%sz%ObFSk#xS8Q;2V>v)Z^xOrk{Z(`AKi&3U=`qd#cFb5Q$X~&* zQ>6qk0g$;dQ;c{8mIdVV2kBBfSP5b>0fJ#5eyXk8~!w&H%49(t$G^6;lWXH za14#wXdzkcf@GyW4OS6M+gm0IRMRZvo)xsudp!b_u{uD^!Sevh9zfXxD0={951{M; zls$m52T=9^${s-311Ng{We=e20hB#}vZny$b2pNQvbaK8uz>Ty4ne2Qa*_%erTI(z z>5jpcy@$UM(A37|H*Kix z+p%A?6rO}58yA@d;StC{7@998#R=63!Gjoo$nF^ku%=J?O1^zpdF<2^IL zJ>+&Go=0tUJfrk(JYyUzn}5c$=F{`m)XX!MP>Pq#qPU7)P|b2$jr4+%UN`~oOhv5d z1tR1?js;Nw%$mUC_vWvkpn-<`CyD`e+E2RX8jIA>;X(w*YGNuGQ%zEcd`j>3RuwzA zQ<7jjuF0Or{u=uXBsJMH(xz_aD;2da3HuDwk!Dt&WG%7!0CNxjgiNh9s81gkMuPj{ znWI*(S;g@;+kG00iOy(Now=BM_l%Z1tTt-ZQgLjMbk9GFv8l!?p8VM4r=MnqBA@Xx zb73|c3n4!>9SU`RY%l=W+6G||8I-?W7!^3S^PwQQ>6r10)QehqIbFWoeC#(`Mg3<7!=;&9pAIGfmkCb*^B-&wP7+ zrTZ_hYxzJX!8{eJEA?x#uQHo;-f+?#=QSo*5pz>^vNV9vkc4Bbgn8TIGO8r;xZGEo zy@AtpstsYy;~U1vt&m;qWky8 zlYW~B{-Pib5xzygF&~69zRDD4(5-ovpsXS;nPMgv^@f+OTpUzbLp3qJVRtO)3olqO z7t4Wk6@$!`oxR%ZF+;SuEN+TwnY%}h-F;2Dsz|4Z%QeyRORu}7hk4220i$S~j;Y(S z3#5jkBI+M8a3Kiy8YG|($y0e`=qZ`?vv{J2UMQM%!9p)sW?h&)vuy$OX^K5&gg|RL z)l4@k5SanXNJPPJqVfMqEVIU9DLUo#8q0AUbLKKP`%Jc49|`$Xb#7-OZne7EN&8eY zCWr!FpDE3ReM7_j?gYQcQr=&sW)e~v7eD=ZQ*urQ>84ntmc5@H!YV{9!MZ3!VCX-1 zM`}ItH|hK@5_@r~LAnYxVa0S6DZv{Od~U^5d$>N$K9;?oS8H@K zS(il@_~0bIU6Q?@c^lu>kP7->g>}>#Foy0GJS&f<1N88$Jf0OnAv~|x5v-{cR)iLo z#SZv6os4m0{}AL1GUf}}``y-*M*3xkrOfaF)!wVwYVN313ju7$bJ8`(G=oHitWvD= zB*tlx3^oL(MG=ThGu%;oSsSAE6paI#EDMY zZAG#(n{l6}oRT}3yAb1X_BvK!bcLt3atAT8XWpeLv7FZWnc2Co9^T44Ecr3UlSZaE znqETjk464z6Z5dbW60iaQAV-D$vb?F+$dr8m9R3ol*z8a=wKHJ?l$gm(7lVfi{_>r zCp{?5@R-bkrl+Yh-56ajUcJ!&ApO6%8WgLn&`$Wd0=ML6`(|Oxq5W(2BLG*`_r z81#h(nu_D|FB*MTA8D=dWs(k#i8s`#wbrHk4mEGtV=-z=i*>7;+8Bvdoy_!?6sO!u zV?*`gkwjap$W}GCzG35dtD)p*pdoH$n4(aHM`1N8xoB!}S8T_+sUO5bN&~iSg4_Vw zz6PEuB6Z9S$4Nbq)_`LEH)Bfm7#lHbmRcax^Dl$?EJvax&1t1$j++RIxSArW`W)%2 z)u1nu)^Sir}$x|0r-i^N5V2G^f@Qiucyo)%)nVm7Kc8Hlt<54M4#z(TyZ zJl46e+}O}J8Y`aH-(+lB((Jp;Q$KIxfj(3F*xDMUtFokRZ=J-bVN$CW4Y@mZ%u6yi zt-f_bt+`@eCcEBKY*ki|ZMnMs{GF4734^c9!yikg>~cx5-tUD2!<_kD<9MB`W#4^N zZ%|3q14&gzbIn2!^r8|9iMeJWXw?vW?ht(L5Pa?seC`l@?ht(L5L{Uy&7H2I3&H26 z$?*j#l+QJrkwUXIGR-wZ_N0giF+(!X@m_Ge7aZ>e$9uu?UU0k@9Pb6kd%^KuaJ&~B z@5Oz*;CL@M-V2WRg5$jfjz4!Jl;f!ZP(p7`rCtdHRtW@F2?SON1Xc+IRtW@F38Y>L zq+SW6UJ0aL38WtVrGOGhy%I>h5=gz0f~R!uM)Fdx1S5r8&dxQ<2)i8pjgyUQg7MMQ zx@vSzS?|$Jt;2^;Z1Q(DR~uNR(V_^;Lv_QI)hqfFmGjSQbd}fj*G9iFIF?Y+EZ|L# z9UVd1icwu!k6Jp>u*6nXj)?<7EAdW2_jWQTj*~91FV#$qkQ2zA1%K03 zw_V_RG0u~Z?$J3T1#qAM4ivzF0yt0r2MXXo0URjMJGyWk^7{rHd;x`KrqGOA>SEJn zzx24AYA7n21c{N4$;{wmcJ`U@2|tx7e$lw6u@aadB4Bu^2%Ly2f(KxD0EP!(cmRe6 zV1!+i02m&C;Q<&PfZ=g-9)RHi7#@J(0T{jjm~%Hm0prKbKeolW*y@_pLxfOag86(= zm>7f<_32%;(h{nwW+^PBsaveml11F)zyejpzU|-J)3RYOUNNw!B+%BH@iM7ocXdST zkI5qa!{e2;yH_=P>qjRq=qg)MBX!kR&%LC|%Sq)@MP;Lg(KFwxYc7DwnW*#J?~OY( z3pXeGDqS;q=+Qj4u5*17~L7%nY2Ffip93W(Lma!hQi~X5fr&2LOHs#w63ZPBj!Y!07bcc|N~E zn4X|EHeJ{)E-kMCT?O-p+8zJfVd5xm{xPLY!;Ynz2n)Iqkj5G_xENyk6J!r^^JmN+ zSh~v50TPsKPRJ1&Z>F*4IF%=K`cse=c^`3x?lB64 z*eoE-mM8lB=!^3YLS%&I>cHd0$ha9X36cqluCAER6pW@T>G~;gP*|?QT^!fhDiTqR zqoFduux^FZ=}=e~%rU2i8?u_t?#s6H=!B!~`Dxn4+S#D%KMM{o+1#(@Uu>R(QiSV2=MDhJ7H|xvt&bR1?BR5Z&(PO8=K5Ev}w< zF;(r-3p(1j484(e^5Hk=kO7^d=o{cD#CNSBX8?@1-m10$z#UXq0-qR4qhK3KkP0Ik1@MT1`9f zYzGHm?J2HA;3Gw$wdqncNGO`nBuJ?IO!|z3IxC!+4{JeHiF4=J>q)eD#ElyB7LO7Z zj}jJ-5*CjV7LO7Zj}j)b5*CjV7LO7Zj}jJ-5;s@E;!(olQNrR;!s1aDES_^WB7<*E z9r&Y&BH1PMv${Z?bv0RT8)PXaPx2)}n zIBMqAPF<>X79lJEi-0iiNd{n#g$e8j&<3Hs{7xT1Vdh_xl>3?rR)< zMFuUfT00#zN>e$So+ViG_BaG9U3Qvxmm+YNB7jE(AC16Wiojipz+H;KU5db6iojip zz+H;KU5db6iojipz+H;KUBWhu;;ypiZY1w6MPTURmf|$!%!Y5=-=@=wsXNn9tTZs2 zG3+)BJL*x7yRxg;+1OZZ@-~#YskZiYMBH^rm&8$56>Dus`@*v+aoW1$j%`CebJ(fV zS!{BJ7pmH22rs^EAG@P66VywKWk!=#bLR6@Cgk47ZevjJVY=3M8 zO{KLt-PWh_rsJKLRfZWDV5WqF*GX2`ojt~9$on60pUQLE)r!q&0wPQv2a{*FY3I~HTfNo@SSLrdShr6pP3_kX2G=G zQcJn1b{03~mw3(qp^tu|Z`LPf1}d*FW@`gMfy{U^$4MV<`Z1{o1YR%}DU3lqhvR3~r-IKQjfWIn+oyol{pSA>O7UoAS0ddzA zaDza;Af!}EO2ga6_ ziv*N9Yb!f;)&^Cj8#bM77kJt>4$asF?6PRm0UD`FT*1G#ukVe{B8(W<;vNQNOe9XT zr>RV!Yh?c2-8$(S8y~Pvv#0;{`I!R!^Xxk#0%m7V({RAY=B&`{>5pmGhO^y~LS(#< zhs3$7Mkgx=CR<)UsO*R}g@4m6Ig+1|A5=FJWMhIwmtHZR2y^UUxyn_KGF9GNqG z&8Ft+l}C2A9o)X6E826>eQVne>{!uN+;cJF-PpG<>*Ib8tQ27{nPOI z1y;m;-)MF$)fh^O99$K1*$OB)Yo?@;iiO5mVj)B?gs4ZG7aX&<0%`m>aq_XwrFb!y zf}fRw!leuT=|of-qg0J6GZ^~l>`DYC(K(e3x2}XvvefsDmL>+<8=Wg(J=MQY9BVNA4)mNEB^eR^}oQaRR=-4Q6YD`RudzfPQJ zY0G4zda6_OZUdhQm%BA=vCLqyYJ*P~rdtq!&-!>J&}YQT(33MOL+hbMFrg0Aw4ieV zASVEsgUy}9IbmvJX<-smFBCJ%C<{>5qU=Vw93>wW)gmg2P&J~WQnX{mAlZ-sMB~S> zUT~#q+TK4)`BYKZRn5X-K7V8ehciEil8>AI?@t?J82}gn^9!P1EN+>b_lp(is{($p zf*M}%ixu#T74VA{@QW4jixu#T74VA{U_}M|Vg>wS1^i+K{9;AHFFto8)GxNt7@UB( zFrBEG6^5rfonS`^nBrnqH?{<$Q+YykB)_{1QVHJ-(3m@7@U@d86^OwfTsjcx8y*wF z?zJO}gLPXY&YIfBfX?S}D(G%8nZdO*&d$78*IL*FX6i&->ou_MWKX4&2HnR$wPQ|^ zH-Oz=JPNzruE72;Ly6OmQ6!4d3r+>RrO1MlNQB^NmJmD@1F#SW%Hq>;^SmE2qn+~k z)-xCKOGX7xC63s8iO70%5iQM@6ec%6%5O>JPGM$Kv;-_1t6+3CbzEw32ThiSOp{II zGG40SWd>)&)p}tnsBt#;499(a+^y33fjQ3NTE8wlynlXnuVAg|+y=JGpK$3VG6jAH zpx6*}1%H!X-d(Jx{sDGuWFJFcJDDHN%x%%kWjdo3LT^Km^HeI+&A>yrR>)kY*~)Yc zH6|8r!NI*WFfV2+J7DEI;EOqst?WRyvI8+o2eOqNm@#l*8p;92qg;g|v`Hm-o@X1u zvyI@{M(}JSc(xHd+X$X*1kW~tXCd;%nT$s8EH?F;o;f{>60@_FG36mnT$o^f-;L>1=H25wJzDtAe(%`!^_%02;OM~yy;JY;VE)Bj*gYVMdyEOPN z4Zcek`0m_|%w#LmeY*iCL?jD=N~EaKprpWQ6o>c##bG{f$v#%xGBnU`DnHaNlW+=I zoGosjs0uZf+TvXk$=Fa+I5lr$owvWYrAVqUS)|eObrt@qunFEqEI!^<$~e2%bj2*P zP?&2N9I~oneYHMotRYyOsZ7|+<&AyinH6n8RgudmjipNE@}4?NFlP2uCQ2-pRO>t- z5*eWET@tzp&wD2^Jzbbv_X2y$JpSmhaat;$mARZ>$v^3%L# zaiJug?8dabh?x*D69Q&J821n`69Q&Jz)T332>~-9U?v32gn*e4FcSi1LcmN2m0n-gt-$q{P}qmadQc}uZoqut77?BpCi~@?mB25>e=IEx-pUBaw=^r zN2*kg5>If$kb74s9mbmIBfRM#9CeAfjE2=4pM%s!x-x@ z#yX6#4r8pt80#>`I*hRnW30m%>oCSTjIj=5tiu@VFvdEJu?`o;`rM7=$2tr_f?F06 z3#O-lr(*T@X@#noeky_;g0%Jb+A;LSvS_}D_hVOmD;P4q2`80zsnr03;Ei+ zhe{Qmbh76YwH}35U0maNMR#&nL(y-S&6<<(B5q?lLh&6?=c*SeP0+Ds*_ zWy}+a8jqSSRzytEsWq7)rCedbl%Bv5n9I5oq1NfV?Xza?&I-NGq(D;@jIAX^&4cv7 zkEStCr|5F8dLlNBBzsB`D2{5f4=but%q7tZCog^fO$ld9gqe13k4&vI>89jj+VY6Y zjR`o3QfJXmUCbWTnRTjsrZUYm|0JHcn4DigOFr9l1}$ejaXxi<<`Xkr$Q$)DNqJ%x zw*`GdWCiR>6P4*^b}AxX3(v~iRtX&z6V*AZQ%KtubJaiT4Ve|(tI}YsMDvGd<$l`l z4;8DKODbw?4ENakoecjKX-y~7iH>VD2K5vxbez3=>Omo2n;VN-F#t%3S4>^TzA@!O zZlw!DLTQG%*bguQ^)tEJXYtEf=^SUpGG^lE7y)!s%+*HtUEmxsPn-VMiU;qxg;o3iHf+Zh>$Kq)3C*4j($ zMNfa-Bo9>DvX>RtMxClZ|4!ow*Az2%c@tL7c*iY9-dyTsE*zO~{De`dUE!2J&dQB? zgOkx@|LpV|)ehanz5bx zu`qjkC#jr4{8^Epv$liG!v(hY3C!=R3Y&C`h@ZAGJv0}!nJM&>0z%ADFW~=y*t+w! zrXnp#hb>g1FJBfmmRFP+-Pz+GVF;PCBFqfs8RE?T^KM&HuGEEgB0(w32U zC)YQNLoQ`66gdP`8~{3+xCgLqRp%K>WCUMvCJN?=1$d$Ht|RtO)MgFcjUlopgZC=wcX zehvph82KIXK!zVpEg`p~97EygN45&@6c+o0fOG_rp{;2O3pKFtbB8!n0{1#7Txwv8 z4?s5xq7Tr7*CM=j(m*qfTF{uB4wgk*K_XJqC%>AMz6h2O(i*6hBy0x@^N8+xNAp?5 z`CKb|INF|aX>=MaQjeuNVN?~od7 znf~#r`o7k_`q)T!y-|_qSd?xY?dwaW=XW-^n*#ldxA!y*c8_F6=3yJ;YVQU8#r0(+ z$%c~lJ!?h-WmFeDl-YpUIXGajnjxGUJHG2;{UC>$QZu0jp-qzDF)IHKP zGRkmVEylls`32&yG(to3G9~DZ28G6HY#984%Vl~6ks8rOrZWNgy%z;DkbBtNGQ6lf zwsgg^c*VR}wYhb8VR>@JvPH$^3u4urv|{~OZK^RfH0mrI&BYoHa?8~BnM2$Y7&QmE z^WU8z#gm)x)U%B{L10N<0d9T<3-4_jp3FRIX3)|%>1JXMSt1p#$_nht?5Ro?MdtGx?Yb29f5w;aF0g3U?EBVzyYJ4pC#-df-jd#b?GuNCun|LI+@u_OZsr6er; z02JX9pm4*JFnj6m!_c#+p04ZA3)|9&%s_>z5zVxt znRdFSf=*k~AHaoji&l%GD*rpT`521m*>O>WkQ|GTnHdsjn3GHlHwKw%g%;L~z5BAs z=Jd+LBU-gWt8=Jr8h>X?K4~_n@Rqg2oaJ?WHPOns-OWCBvTOT-IxYL4BDG-uR0bQ5 zOL+Syxy+7xHjjU1|Csq^g+jvfmg^XX?gFPOEl+5a`bfYjnaW7)Rb?fOb1H27RaAnt zeuDfmcK_{GP{NZzrMajgl&oyK1$&Ebl9sOf!gfbRZD*Odubp<^YG-v>#LTKs+gV%3MdvLI@z|N2 zV;DvmXm2pahuc#+yHsmc>bw>9(#rOghnLxPLH*UQe|8?PbJ`qzgPo=ewyJ{d+rGFH zyQq=du-|=%`wX0&cErYzdx*+v_F zk!vHX_31YThKh>^0viIJ4K};Ywt>Np`^`RIlg(kncZD`^Ih$N>wOaGv@Xu}sci6zR zZJ@0T2G$2aW%`Tr+;91B0OOOC$c5Sd6iCUVsGzRtZ@h|IPt&WVlryOMp-bfjc`{=S zfAr@C={E^+2-}3kL@^#lh{cdXWs*a5NJqBz%fk%3DCeBog^T?o7{1zK8` zvX}A!ha5CaMDcLDIBS3^~xy9oD3 z?1M$EuVPW_gUHhdF{lp~wLTzDA1rEpu&DLHqSgnq5^|s;Z@LDb5wR!g_9k`lcSCm@v>gq}V1qPbhDg7xp;)#%o zX(^WQB|76{CN#2}7qEB*5Xu7ke;WU;pk0Y}6WRl4kE6X8?W1U)Mf(cc_tAcZrg+j^ zdJ@GxP{5BQLmdbXJbRhgCjtQ#e?KNr6P78lC^hpMOI4v**Xl~s)>7l5=mW@hND}@2 z9$zGpn7?7s)9SSQZTi^M)xvQ{wAJkobMu?Ge{?chXMjV*{PgC`*umLmPbwFPCoeR@ zjm-rL>k8x7E@ecUxzXYrPPWfYPq&&H&6-fM+1frmI;>CPEoSa;YbaesCk@$n4!|lx7BOa2Dsjjs5Xh= zQ-BdkDJou2FqlUHMQ}HYzajDfKs*X&uEMxc;0OC95&V(}en|wsB!XWO!7qv6mqhSO zA^^Qe1-~NrB@sejvan}>%b5x;XMoEY;Bp4IoB=LpfXf-+at64Z0WN1MxLm-q3V2ol z&nn#4I_}~(Clqk656dBMIVJU&1OHRZ* zg^`8*+>&aUk%MJmFE~6ucqjT`+)m!2sR`19%sN!7d1c zT@VJlz!kb640gc)-US1A7YyKC6$ALCC!r9O5+05-0&d0~0O=S2=@`Jz9Dr$Y0Hk98 zq+#_eA-cfqjS5jw?DMkpYG!GErfKxHU4!FC{&3^`;iTN)^69-ztAmmCbGiP_dt2SD zUHwU&Sx_%M`nj8K{OqGkOOJl`#+yF(=+egYn(N;5?3RbV_uTgF&wcNqEziE`x;1Ix zx^!QYrF-`yTlPG2!*Iec`6D5%9LPo%?%uif=A{;$vne3C1?k2wzH@c;onO51rZ3Uw zmu}kf{M(Lg?AZU|pFQ;8&tBZ$vGL}&JqG~q6lX;dlAHw$U`F*WI9LJuDf`VBD1e3K z9i-T(S>SUFpL9B_rMfW0Wwd}yEg(}1$kYNdwSY`5AX5v-)B+2%6)eyKGLd=&kQu`~ zRC}1jXYy6A=&N*{d2$APP7)t zjgBl;tH~Dx)aKCS9NP2m*Fs{wveg-BZEJ}*h3}{J=iLi07>x~PM9sb<)YLz>IM)|1 zZw(3Wx=1I<@q?<5NXNy42z-x|76sj&Exn24xbrJQ^W52$D$pLAbllnE^PQPx5#(a< zhn9fOhjd*ipyVz;hKb_hx5by#Z^yBG4!F8Sm^ua15dz)W6SCOcAnr`;E{MA!+%2=a zA>5U4*Uj!oamb>{yoQAdG?Y>^0s!^6@S(M!713tUHlrOtJBIcU8p%`<%v&PLO*FV0 z-|wz`zZ>80#`nAN{ce1}8{hB7_q*}^ZhRkJ0bHIM0;CTC(uV-)LxA)lK>83MeF%^~ z1V|sMK>83MeTYFiz4x{%9abXGk%HnB6b3=zIpg@HE4VANU%G;C(5bEX3b)%>zE1D% zXK@TXT}Lx17O{9t>td!42rEgcC$AKAAoYRt2Iw40POT2$Mat#$xDprAC@@lPS)nsT zVXa1^Mj0-RF4vLyaGTL>6oVtJa|^v~S86?O(U~^t?eYQ9VoeLameQVq{@taPmeTJ2 zfjy;`{;o~8luD>}M47otw`}T?e;~Y7Y)uB6%a7Rg24PAR#h})hZ|N8`K4R2}E{)No zdB60SL2v&||AEC!X7ND(z<&DNKTx`Tdp^JY_LA~R5c*#EacNHN0~D!9QHEw96;SAK zPBfT|@|iz$Z0u&)6fGF<>Nl=mP_D0i>OwH+( z(Ib0gi(WV(sI^)NfgGT2Ws^K8{kdvha1vvYV5X}umMIXZUUo-55@g*W<1-bqoMJ)` zd3;g+&zFJCl|CA|SjA{1Ayv(^KT49-Xq_LC;^tWMBdWLc*IV1zQK|vLS2KHd?&~nM zX+bqTXeqP;+BDh<+LdTGp*?{1INE#BK8p5Pv<4D0{|*=5LnEEe2Ev}hob=21?DTv1 z740MQ+EEM=E;>#EhNY@Us9AK7j$J!NB{Kzf9NuMQ)sP26BLg{`E95i^OON;UU*9G` zvGH4Sg-%n73`VKZz8=5c)FAsiCR!Vd!&A*#V}rJBOG`jDh<4Dh=(3|Z>WcNvBSL1W zq`CHm`>zPA9Ux*s`NdS5*QjpBS*6_!BfR>|*W$}lSwnQNTlgDmrY)&Ag>5PS%y8MY zZQjyAtgG{^Mh-)^rwE?`)yH^7Y#u#HRgon8k6aFbZ3%ZI_j4mvf!hfkSRw}~yaN>8 z0SfN`g?E6$J3!$bpzu`S7_0jjE}lgrS%&a}+zp6*Q#8~N!G;evY;V&94miT9dNV3# zU5o`F5gwUN@G_)SQ@9{_8qDfuvXB9`$$t+@tK?7$**=#lRIFc|v#s-|*p>00tkdlLMB2Co~XB*Ne|m1cM11z>vb%ex-PJuLnS+gsDSs~I{cd8Sx7F0CZ;ZsPu||!yb#=XXMB@mx zGB|)lYX#kxfIn%~Cu&~NUP!buQEZX}WXJ)CrRQ>lOoSM6fJ~eia)1muK!zM3Lk{3U z_vGzFUeOg9*j%Cfm+hel%1`COIPeJo#T4%K3>H$jbKnjMBmo%?NW2aRxzcap1%tw8 zm;G)1(NIUs9?0~C8$068?U~Znj;`hYNb}UTp6v2KRGgie5pHXpFUCUonO5bqFSl!< zJvqL$(7kIOpNKyO*Mxlf);jr=N_M!=DCuPsl(&#_bhT?bshF9|=|bJi^X@;I{=NX| zG~F6;whC7Yg8saFBm{jX-Uq?7zbRDShoI{Qqp`gEBAs}bwP(I4r9i)_`sI#OM2{g2 z(bBYIp|F5tp}<|G`emNoq5385?`7L8$Rb&ZiHkzZNmX{Z9h9LRl%XAzp&gW=9h9LR zl%XAzp&gW=y+Rq_=IiH15Gz6z|N~ypk8E8Ea zH^o^uY+1PuSE4J}ll@03m^pj>LUTuH{XFVw+QNRnMox{)RqAT$G%>2HSv}q9YxDKJ z_UQCYE2x!u!{pqt{X6zvH?_lR(>ae84_|ZeN>*4Cl_D$wv%@BZQ9@OPI<~a;FK9j~ zCYcdgtG-Rv2_qNjzg@nuuK#1z@ps6Z>-w*&_TMS5*7fhH_TO_(|2HfB;(MtdTY~@K z!~A3L?0MDwv`dw^blN3403nT+u7^plV%$OTgs5?c3;bl12s&n{f$mH`tk`!gW{HDc zWEs1lyDrRa!{-n_jrhwX{z3v|5{z2Pu_On~MYp~fA$OJ_ZvPurVgC#9a9o|JX1@^$Hgngm-COT??IZG$d+`W^G0^IZ-tTHIW+iZmNkCYaeQT*pgWq zLrtX4W>-c&ZZt@CTlr|&rId|8A>3~UL%h17RJM5>ND{8pN*YA1q{WNZO2Qsbl_#h| z9QFXIn^juz)AEdpV1m_-Vla`Qe)VnAd)Z!|-+#O8s_Q41;N$O*eqGm3d(Zptk^T?$ zpZz-!M;)6V31w)0@vCe+RcE=muK#vvijDsf`gdz+em?#VsfG2whW>RLnxFUIBek-5 zSS<(*!D2g`|4#Xxe17=$UC-u+>i|7h_FlCAcKQCgetIq+e}{aauAk=T{ddX->-y<^ zc>g`r58gR-_OFl=o1C#cszI@@=2uAdD1d*Qi~bJ!6L}(L0jpUse+h8h2=wpE9EL9Fza2>GVI$*(d zz=G?jSa2^r33Fk_$){3mAOWcs(kAzk6bX`AT93Ov&tWX{{o-m8|-y=T<%%T|TZ_8;!4{s9Q zatfSZM&eJR?0LvEh^B@66Wy)F9m%1{ae})UF4LqTQy>=rms!)0DbgS!X~-05j7>wP zNJFMbL#E)l1j+Ul#Ptk=#UMXVyzHFh3bqq&u7xDD7Lw3fy!Kj1LTe!jtyS$qyAkbv zG(|^R3rT1#UbMpPl-xwX4h3CmnlP2Ctt2m*0D6+&Hnby-GG0Kt7trnnwExFvCI{DK zx=cHr6f&oyn#Vo)jG^&db}pL|1PU#MyK2x$A`H_SIh|a-b2YHMb{O_vQLR&_v|Uq6 z$@oylKfd?q-to@ajkBGBfh)$d%YD)EHzrC{H9UWRY2(dv(cJv%d@eb>X8oGsq|n%p zyy6yjz@(0Qz4@+$wjn>?>2aqD(aEioy%Vbw;~NUe*1l}+(B>lL)H$uABs$WToBs&) zvf8rKhi)${?;mSTW}Bm(t*N%2>FwZ=EH|h6i-5>cf^6|!kn;)R&+k7WLB^`~|5*FRtFfA*aIlhywBQa^}4o~tfGzK8W$bzDTMl?=Hrp$V&-ek$e!#LHu-)jqTv(Wu0(0?U5D zGKIx({jU{PB69d>V>m_gZ9vcAYEKh-ZmY`fR} zMTc@ehjV`bKP>KYIoTdK!eSi1%(CFJGnAM!QXKzuy;2 zHZ)GmEsEcA4n)esVt8PsH(VTD>_O77fjwJRI@&hO4Z6~M_pF8~TWZJlx9p0pYcs_L zJ0qpuMtE2E_nXY>?DVEB8{?a<^h8QClfl95li8q2+T=__pjZ21yKP=+{lv&>>X!R~}>Ql4P_L=BPs82xMbbEVH+wEu*h zuj{AZ#m7G-`|A2>e%^l)cJ|8e{Rn#>-v2E1gBlL1zAqW1J7FOULL#Hw&E!qUt%NB$ z{j4{%QH8~-)veATFZ`R?7jwiT^zV4xrQoTz$4lMr=8&y9;cgDv&iwD%^@|m2Jg3fo z1>e@MFb!Z-?BsseRIw@WdujkEWml`Dl4YBv1~(wQiFdrgv2;y)C@zm2(wa25S^6#Of% z(feOe@MqqQ7fAjraVL3%O2LS~d{^_PW=eQ)=C7jx;m*|NHp+q^etuuBz%w9B-k5dh zqo^wz+|%95Qz1;=)ahynMrlli0CLg^X(fM?Q^EyT6C;`AAhsL3=ea+pP>UfKdEZf%|#%=>z7pH>Pu%3f51J#&4}{McAqrG#U1 zf4;w2TuX*PDj&`afu9f#qI|f|Yd~@Iq1HWOV1gL}TioeY$pAa(4NiEp3Tsn&Cs6Bu#iw<3CxKFEnz`RfO_(VWtxK*80v-Q;DzSkh34Re z=HONBL%R`;id-q0gBO|uR9R@@Lty1RzuB^KRnd&skhs65P9a#Oj@7!3B6Sq&G=y>L z80Q{*q#>ZprJ^CMRxsf8$m{FCI+5q_I9>up&$t2~gkT@UPYyz`4+2+%5bT2x?1Rt_ zg3u0v&<=vo4ua4Qg3u0v&<=vo4ua4Qf)$UwOHZO`2SKbl9trKBh=;dT9^QtBx8dP! zcz7Eg-iC*_;o)s~cpDzxhKIM|;ca+$8y?<8l}M0t1{9*#%C;5LM9 zS_7ryW%wKMtMk;4iuph}Q)ejon=}u`6rp@@MMFNBT^?!E3vYGXEUok9bZ*0;Vt(^T zJiqZ!KEG)sE~!Ymwb_7y!tJ7>EimP)?j#^w1!`P#LQ9I9p%D(-#gBhV+r^RgEQ3v0SM7K`CpnxX4< zCdd4iphwAN3{Hywj_j!(EoVo&p$vR7!DT??U zA|5dVaJo3>Qw*{-K`lW@k>I(5YB`P*00%gGaaimIICKLXx&aQ|0EcdXLpQ*o8{p6l zaOeg&bORi^0S?^&hi-sFH^8AA;Lu$Ghf7bQfI~OH0gnVMQV<*^&+Df%eLCB2XSqV^ zlPsgNMv@WMMk;9!Pa05{aM?#G9DQBzGV~ARqJkLE`;jNWvtcokpJ@&Z6myPHUwa^c zLC#nt>If9ugZH@>=c9$0=EmWnUPpMmH*v`n%%P*t+^`sS#k~zyk4MY$G+Uqv#$i*E zJm;rmhLq9?U!3=;{|t1Os_jq(8#VdkK&#eM$tVP7i|<2OtnyFFKhqiY2CbmGO3=s? z4!ce;m46}Y3}(G>ynG*K>XJLe_p3hz)4zqNA!ZWMOf*}Zir=UcP{xI4uPXmqYtX|X z(;=8`W|Q0@>@}DTI`wO>>Fo&67F5l0yZEB|HV|~Gt3&a39>itYK^b`-S$z^_rj+Wb|8l-;FT;N4 zQ%OMKIIZ=0WbXW`(83OrJK}UDQLq7@&Sc2Gni^h6#$b3z4K1W1#a6HU58k$@(-v-P z^rWLsODH{++b|sWw)RGHE5mVL8sr2!0e_Njz`X5O&2e8J?z!*y9sPL#I~HOeN@u&8#!BQ$dJkTF(9!vDtJBOxI$%%oyH#rl_tH)Z_ zjx@*9@zGvq%M!a9>GwdwRjmaMeu(+Qxfm7_?ihhLC}YpP;;I)9p}N?IOwnlA;0`;S z_79mN(Xi1CM>(TOcuIt$oZM1=ufuq-&kvfvEMf-@`&⁡v!y+nU!5NkXXIK`TVOem7WvQHD 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

$Js7$j;=G7{{ z>?EWA^~CNP+?>p9kP{H$2eU8)RkSX&DYPwUhtO_7yBqCYXpf|=09A$`!>Z&Hk|SbN zy5j7748A0X8YZ?iyL)FhH5L}e`Xim&$1-b^!;VthxI_PiPGF-Z*t}$fJZMf;Jy*FKZc%d*lSjswUfo;yHOCC%& zM{Q!g!Q~0qlV9pz?5P<(@r0_iP6PXzD8dTzF;PSCL}VEuYikOU097_hK@vzo5=cQ3 zNI?=vK@vz|CCEJxB={Y8^C((H5>O+oDipEeb3|^0s%sw|EAZ@PDn*QgBE~@xrU5vEq<(am zZ@`-XS{AJfZ3=A*+95O*XBx0lxMg*O6`jn-mM6DFA0=0irbqT|TGupl|B;ck_db0j zF)`HP63uSEDQ!&ktZnPqGgoNad}V)4bI)9N_OlCH3YL+ZK7QqqXYOBb@kQO%#+HKJ z?9OFEO}pN>Yx8}3I+S30Gkkjl7)^E3--15obnP70JjROjooLxYP|@nNkg7V+jU>b# zL~VXelq_36GnLQq)s?rI(8U*Ir25np=J4vEL$tuFs zN*%3L9ctVKDAm(YaV_lh3!4$std6yckpMa*P$gBO=2AKKMEW6IAZ$wMlet4z9t=lgyo*`LO-Fq>dD1!3C;z&DD zhfjzvfdE9GGOs1}$^$vcgH4L9ZNi%nS_4`S+6>xOw9C*=pxui`K3_552Iuz^b*NmZ!ei8Axs1oK zF^1_U!~C#?iBm-L6>L2PTTj8(Q?T_EY&`{APr?3GuzwZoUj_SD!TwdSe--Rs1^ZXQ z{#7L?1KtGCvS?jsQ)pYz4xy?0m!J8Qi{iY-aENm8{GBT0a)RhML3ErTI!+KBCy0&{ zM8^rrO~t#A+x4 zr3elg1_TIYmBNunt|PxV%OLPW_+ph0&IzExLiW>2k zyc-d$?-Gx)#nbsvB%e+Dj@%@DiuKf{8^e*t`V4yR3^$Lh+ul-G*Tf~FM1N{5xKkcJ@u$c5wNz4gJe&6$m3n(!ZQau8NUc*L76-b=DlUPR^j4zb)QF`De^T+S z(xF;6DhQ~uG~NL`;L&iDzcR))gdN~CmswnhP+?;3y-m`Em*pk%ZeQ=JR?_DC!V42&3+J zz=1e8$>NCz|M4G#wJa)5-;^%>ed%qEXxPhQ;<|8BJB8J2)$M;u*M==kkz#GY!vY?t z0O^uPiBa4bMTsHfa9OfmVIfk}0#sJH;(nl649EgQVv~AwTIGUYISwrc(Fs2}Uj!%H z;qXZH>E_vYku*+Lm0J5!C$kv1oZ?qBELtj9qTo5@!%Ai`V-`lhmvrhZ<3X?^YVmPR zWqpF4*nu^0U=5H%5XJ%0r&DFip_eEY&ZEn6vznj@9cLhnz<-jF^te+qlc?6Ea+n;& zlJd=4@%5yjF!99rblbM|3)$qx=@wyRPIzK!LI^f=Cw%Rr8{4War^4k8owZg^+v0@a zbLi+1gc>YE3E7Zl0GBjW0?MG9=i=qKH{M+mQzWf|n+c(X#|R+TvHPL4=V z=~^*t8(C|ZNe>bVVbpnnmRQQ=ri}8}Ix@&fp3SiTI;3BYPm^uxvGz1y-HE9eySc5J z8?A6b#9_NAiAE(k4s0W{Q}+e1P1F8Vv&Z>JDHu(HAV`8Nx@>f!gq^3i0~$MYKY2>G z6HuT>YQ^g$U*t)?$PYj;SHVJWxIqJ7!jgLU7d_f__00p|?({{-9KhOEKm)d3yrZ9R z$5Q@&4)>$n`_#{UAvnL^wK}BKq(T*>@1kAMRkaH$oSmB{$e|E!7%HTg1BCCD?th4H zWIimzHrt+T=8yyM`2PT&v&JSHP(j2JE&zn2s;{IIFFv~ro&bai5Vh0=6(cgZngCSE zKwb_3FX)KHBnz*Mjw~ZQO?b8%F9tZVpnuPPt_ls7p-Uj!T5~>Tlv*kh24fP8^MbZiW5wul z^f7yZMMNinEAT@lT;~52RNE^UbdY%))c82%zBc~9l73)lJ~A%UXOs&VVBX8ouf zJF7}{#iB-1rfLNBg4lXNY`q}1UJzR^h^-gI)(c|m1+n#l*m^;1y&$$;5L+*Ztrx`B z3u5cli0$fwsKk~#S`x7x0W^zrb5e+lU@`c>4>yX?WsA^di_m3@&}ECzWsA^di%^J* zP>73Ah>K8&i+I2y6yhQj;vy8{A{62xpNSD~f@t+<-DuNji)e?@R>tgcQJHDCRML^0 zFG=TRd8eyF_O2K^@&6pycye>TuBpXt$@flXdJoPQgl{Lt20MK$2t~yc6~ip=D&uZ3u;ZGGY~K5}V(8wcczqc$7?I zR&R2yy?IlkuXSCYUZ^c}6dex1lZ?1VZ~jxZgMX~Ni=AhU2=7}Svj>GhjoCB9>O(%} zoWFWsbIhI>__QKUuOg(aa0{7iWoEFUo;R;F1^gT*7vLZTz=$SfBoAx zUhI%df8pcO%@1BP&Q87%Hh=Cn(q96r`XNE=t4I*t-~h1kLb4}Wg42_y)EFwt;?kh& zW~K|OeDM3%x8g3fl?XgFf}nz3E2PMZZRHHChFX1}3Cxl3G=z+NDL8&iu(?qlfY&Ku zE>vJlM~k{6Cm60AF@2p(;aaA99OabVBh|1w*mPFJ-BHX`Q4s6Xjef)0>}XdpQ)@H2 z{ZX&Jwy7^+h{D&=>aOpeY3tlNlx)4?(Q6BPc5llX5>u(!(b6O9kB!Ife48r~a3%6) zr`={0X2gc^EsN`GTs{k8hRIz~u=qVSTlVZqTI&baw>R&aD;lj%(>OGkC4;*L;m5~A zg~9apL-5rW4hgVeQI>h}8ODFU2|W+81jXLze!z7;O-rDYLrQU$!V++c2k~@n^}Fz}ULL*t)>jy1>}Fz#Y559lO9CyTBd0z#Y55 z9lO9CyTBd0z#Y3Z?zs9OmD*}##vlVOwbpPL!>>P;TMKHGe#CDEStWCqvf z@{5y=LS*W|WX^9$rKP@wH33U*w!1cv>r2)TwiSZD=Kk5{!9Al%i?_zD&$Tuhjnh5; zWX@OHR%r11TSqp67@)42@M|PKw&P?3aRPJ_LX}Avo*98>Mh(x5z%wK8%m_R)0?&-V zGb8ZK2s|@lv5i0$p2b+lD2WGp6vE5P*2xvVuoYDY8UxF|n&B&@DhyaVIaFph&&P(0cZ9vb>=J zw6kOtj5zW8Q@t4 zdnAKBlEEIyV2@<5M>5zW8SIe^_DBYMB!fMY!5+zAk7TqxviczE9?4)cL9q`KzDWsAVxHb&zC{pMxmR>+U*3dAkVTq3g7OtB{811V^CvLuHIrRm@8I zh)QBTmCRQs+K2fEsg!9%14bb|lP7YdPh>fD;dKzN7F>bUK?b7s3=SKlHWmoOi~`kV z1$jckO5EE8YZmD};jrO7|0cd@3LDRUV0^Ch>mS+%sq)~0O?Z#N*SgRmCt{+(VmA~- zt2gQ?yx(-2IOH`cc#}YN_`XGHWBD?Q-qHk_B=EN(sno+~3w8?8+kngy!3zyeI4 z8u5v|K1}SBT3f~hDr?fHtO-=s1S)F+l{JCNnm}bupt2@VSre$NiE(qPnBaPr`HY0Y z!^7CzVes%U_E8u-JPaNl1`p>Y)l?oH1`j8pfo4Hbe-vry(KT{fjh@ZuIbQA|+2fY- zE;vf;{b-d{`8w*juBu~@ItEDqP*G)?I;OerF{1TA;%EW%81_0K#OoI3n#BaX&!RyV zn#M$4r<_;VdJF)Ax}yvLv@V-5t<5A3;{A5K-;T5!$FZjL4YH|$gz!i*5hs-cR3IAG zc!&|CDzPo4_j$F?JcyeJd$x+cLoy+egyau3R{)DpVu#JL^v{8T{tlb40~Y?=Sm_Fb zA<=Gq=Ut(?j4d)gw?_Ptx4*VDB*y!WT!h5(YCR)$?rBvsqFk%PeWjOy1qN%NcOGUdMPjvyHs{7X6({_;al*s$5IcX z*`c*zPjcVZ-y>TakBa18`{Xkage-vl%_VFTcBcuu(}dk=!tOL-cbc#}P1v0#FlE}# z5VhWcH;HZ_!b}>iI5iz_q*4 z-i7uU+NaUJjP^aW=h1$Lrn+0LK8Pw?Xh}23E=t94RqIp(h!uHZjZjcQ1LW@p$luU_ z(WcQB(GH{Ch;|R!gJ_SVJ%#oawC|(+6zv5xHK<_qK}h~ilQUPM4tpRb3SNC7S3u1KM08BCflMKKl12D+|OfmqI48SCQ8lz&80hk2d3``hHPup}@nsbSdagK!M%tRNVLj+ZeE3D3FhlWY*& zbw_ySnv>Sj@pv*bFfTl_cB1G0ZPO=rb$VRU$)xagv1R?yfk^l0x;C3vKX7R0VsYl) zD~4wuez3W|XTY~f~ z^s5OWQ?X?;y)6WZ0!ISeJ`lp&5Oz@r5=96SMFD2?hDR*?XE zi1hSSksdXFPvsjGyZ9M|X^Di&z!W+-rR;XEo28u6_E2`ar@=sDx)IJot4e$zwLU+n zB(i`2Td3ttLPv8;Ylpzo(0Pclwj}~k=gAdIdUi#fx1nR}iuLnH#tZA3TSS9b!71~* zOQ)RaRNUMX^QE(aV6E5_Dt*vZ3xMtF5k7hOM^22MSL3a2`pWtK0AL-cg0-3>vSK%EB3L(7$#iP4YULX$tf9f4fx1dn#tGJ4Dy(0(Ooo&b zoTvhM13it-Yc+&;6`=!=%t4{^XgMrv z?Xx^)26`5rPLnk9xI#6Cs0KPjYJ5jursQb?;)SdI@T?5H@+rxiRQu<3lfx-e#zK^w z1eMimo8N$IccZ-v?J=}ZqkS3eduY$2{SHkPR8}8E6;!kW>6$EElq4oIpiXoZVW7<} z?$~(O?q0q4U#7u5rxrHcyT3)lZ08?lHrqBRPp#hje1E2x{P=NrbKmb%A04fjw6$pR|1V9A>8WjlO?S%(X zsXzc)7j8+WP;QQ=L+f(E9X0zB^K)y~8~iXwaVd}0=!uE4+u%-QZHdI>!X+)Cxs97f zb8|PoYkubD7EjaK0pS}x&7kb!>~(t=3kSaV@b1f={MEgQwHwyTA5@~Lq*Whp@S6f{ z8&ACd@cn;#_gFL{Y_#~iUWA_73xU!ZN*^>Zowd$A^pl4_Bp5!u+aAtMQF zF4H&lG>V8^LNti1mksO{zfh2D2*2Tf26itAe{5g{1LK&Uej&rxkN)Vn`FHtmWYK^V z4g8@WgJE2L2U#+h*(fp+B++#?6E<_2U)6u?aoE`SN9)()DJ48U`wve>_oR{7_e8o% z|7m~hXLxeghw_Ru~sy#%8l4P7(}$?lty2>@xv`UB)^vY@#Q`0~)Zh zcv}2O!7cz)=r{P&Ug>S+PhDmXwK5nuZUMg#UxhynrfeMTADS2~r;26_WXn+vD{jOj z_|Lg-9s5^WrZdApH>ESa&P1++2yU{`L1**`m)roSLvVSoRnj*%=eGzhqMWq|j z11JhcHrp7V!j2_;z#`LR)IYZ1AgA~(-G-U zjU;32v0$*k3_umqT4GX^9!Nq~beA za(@5s-1A;mRkuVm_?)`uZs(rm+rRIem&NvOJ#%E`=u{YX_cSc7wUjnc+dI3rTY7?) z7^)~mv;`@NE_j~GSu1EyBO*13OePtp#Yh7|zI|)dy-OmS5I#OJGt-+U%$Z|6xRp2& z4otoo9V8RVDQ4_5EEji|kj~N|Hl^6zXp*2@u*>lvY5GT%1we;N-PyscB*Ec1bW}D& z1NzW+0)W+`^qkKCK@7{^w`A_CH=3t|BJ~)z8elviPm|_~_r3)ip&I~od2CqId$j=a z5Ih<+NQw!Zj~&md8d>}j$!ZANr?>@u?1*elWm_jPD`V#^%NijX6v`oMyop!d7Si}duM!Y zB)Af^TX*ZBT&_UM<^0#VT)rU96}N0^Z>^`K12ZD8IDxjc%mbfNF3x!1uhFJ6h-rS_ zlGxxcv74UaKea>+hPd#ZLNT$ zCxWbhBT?j(i`DwT>Snat21PzM6oryv~Wr!A={gD)eImVmGstVU%5EWV=> zouxqvZ8++H;%GTnl%Aq3UNB5)82eabawE&SZ=If!Wvq5VH&>>oB+X!COimvTvxwBStH+F(%1JaJ zchZ11b(;ZGvl`Mr5F%nfBW za(&GqX;0;h=9o5n+36{$;4VGIb6Q*LDdYfmW=VM-{~J1^r;rcn1RGb8sgRw(jp6|< z06@G17GMWAe3c?ukptICIAVxio&)$)ma3Yfl7Z8K(JH!vnlWerum~)!9P26INm|!% zS60W!>JB{>KRH+12q42mlGFTi!okJ~uwQ)VR*I>WN`>7DQb3t+`nM0m*%2 zfosuuQ2t#eBhSV}vpR^G-uLaa(Wls7vyVtJ>>5Tg(9g?@L%Wi zy36O|_mZnw(^K}qbf=?28EXxj);pF)$a`CJ+i;w@=$pv0E5 zx%gUH4C=U+R_$9phK2>wxaHL;rcU7%l$xH>wHzl$xgbex$(Ity9hmhhtv^Yil*~FY z1>vDONKRWJGIY)NG$zE787#?oju8mMw9T~ex0owtq$=^6R`cZq?yU5@*)DQ-NRIVH zSzAfdQ?v#Gk*Z<_{(){z;v4;=I&O-fXu=2q#<+P*$ihi{NljXo5~UIJlmSBHw(bPH z*qRdfY~YO9M!|q#q4l7W2}}rK*|Z(Cc&}k56X^mYWK=N`aS2oDL&t%dvoi3q=3L>q zQ(U-;urM?0Q)HoU_;0>qE{&@j^SkC~P@#cy;TH%;U07$ENs~d`NemiJQYmQN^pvKY zln#>Sm!5LH=u_iRW`!k?fagFTp$s=HALRjw8ci&oY?6>Dl~c*Q6yEBMCaS5~*crJR z(5Rsk!NOqV!Qen6aPl1a9Sdl14w&IWNhOUMEE#QE^h+o*yFd+#^i>K3NPAr)b?8Y1 z!%G>W(2baV#o_GALRg5&UAPYi89gP{XO#apS|mj8P-7-1{RzP^Nx;QL7DO-s1RLZH zhUC%cr7S*o#WflD@kgii5%#2Mw;1?$0+AX@G~{SUL$dz!}x1bMK8o>xj zJv&0Xlhj0PKD)1NjMQZ+^!@xclQK*9uzp zWkNF3HE7@Jq2|cRwd~$eI`Pkim^>N4t^h|B1vEVZNkWYDlR)mkEEKKuR4NB2>vJFg zBZ;q!t+-6%f5|ArLKk@hT3sM1#B91lyr?eT3jorMs6HuAtq_WDQ(5UL-o|>$joSe{ zrw$kgfmShvdc*ci>v627)DLa zTn*T$nY3o98g5>yPro7__Z$$op}4>f$b-u@ACZttR2FMW^?H)7KcyHv!Pn3rvDB zGkdNC3D^nSipY^ZqH3PX0+!MmhysOAFwGicj<^JDqb=x5a(%6*JQ}P$GltCFi#3(k zQ|tDG-dx6K`&!dc-h_SbFrGZ6dy?=2)OkHFKZ5nydNY{F!|<)x2q~Pl@vB9q1;{g)AK{llFXa@I%I8e5w zI9yMR6x5`EX(?t}K961!TmBE* zS<6;s`sS@ML zQGr3xk6aDdsIfXUOVNk>o>Kh^W*m?_AaFy$gOIZEGV8T<;C!2QyB>|L7_XF%I3s~0z?5N0kABsfhbV;1kq-!LoV>>*auMN)97T36 z6^qhKYyT+>qo`U9L;rQTT&-3r<#JqIim71sw>{8mR#D_-3G&4gH2+DRWHKytL88`F z9;dE|Y{{kYfi_a|rx1}vUYkYkC>N5&V0IpkJ+XVuFr6xzZYUBzT7~y$pDz%DVkSC1 zN8cVS=LDVxyn4(9LpDM*&I2TRS1uwN@?uk0TY+feGG=q}wX#0U=UoLLs>B=3@y_Pe zT-=U80ipsX3vjTb5I;@~V?d}afxlA8Yx|tDLT+V9phP`kIxHgU)+o6 zPh;7uUHaGmY9X$%ZBx=y^0zkg>eB!rAQ)iX)RTG6434l<23t7|$tqcW3mUk4D`Qe# z>nSzrhn3#MgpjuisR`idc?g*yZ)QVNPPipT1dLiDf`nipdk#agsI54Ael*#{^er

}IQ3yn`RY-S z&j@_!6u(d7zeAB>;vB&)|fXR>es;nZa zE?3)V3;L4B0YUp3=aAsYYE5RI&>R9ix&hisamjm3fDv<6x;Fs`p{7e(xEIdh~Ot5+p0;rKBr#^jqeIf_$Z4HYo2 zO2k$2h#39=tTy~Hl#+Z7B#wy~wc&{0H|Orvo-9zEOKEmGdos@Q6CHR3@q+C76nY8@ zS|x;=C24F31}=*E&H@x+3DJONaMcm<0Bw^6>YgSM~oUYQ3g|* zVG?%&y^K{H!2?_=NJc}?D{{1jo|3uGw}3CKo1V%`PccJ61?%J#0OAx{O=pSBngphA z+SdQR1Rp~~C?1n%wjWwT3>k|bBMpQEBSdEnrdE0?!~d+yGtEF=ncfP^644}qFD7N8 zSMfVFDp9YL-a_iddP@DUC}jp01|)il7EqiJ0nQ@{NemnvZ}Gil7|uFX;|wFtik+;8 zjhUgEB&2}}dCNssFbv{s8p2-j+6fdNe9^gRx<}yO;?7bEmCOSUR6KeLgFVbSJw*)~ z*-W9Q@(fO)B%bido^EYbEAV=zTq-g(K3sQXLpNU~7KMbbsGLogsgzCg#-^@mYHBui zMy>{I)Lc1w0t|j;)V1L-0H>!k6pfn(U@ckCkOTNvTvxsZO&P0lfziO>l474}!fMPS zT`a+}dC?K1Aqjzs7qdUFp3+FAr|`W0>**<|F<;8$O9g-e6qyc`Qv@8smTiOQ9S_B60+d07R~oGcQbUF^W781qz>Fnl;8WIakYQ3;NO?0F2BStG)#_=e3I` zGeen~M7}m>n7fF&b=kfa^(Yf`xzow_l&KX#!fPc ze=WULt5quTYlRm}7ALX?(vIbGdWx8fi}Q)dv)NLKO>B4{Bw$)7qo)dpm{?C?m6dr7 z>DmINq>Sk)*uW>d*Zi;+jT_46^;E7@LX#m-w1SVGI%kKiP$EdhW9P(UsStas7w9S3 zumX%Vk8H@4&aK!Y^6))pXX~LNj9>)EM=Mh%!#4HKA3Dw z3x5kZ5(*Y2Ly5FpZAnjM3VEau8XJpQvvUb_kjiKf2AX5#EQj^4-tgt}Wv&QSDYgdf zV&vg(Ww%Pw4nUS3kpNiD*x}Y#s>qqav22nhro${Ol{7{(&10`$;FGW*6>JGXq{_h&VZHg6tL{^4sZWXFp?nB);B2xRZ`z3soJ%K^eXIjfMvd(1!f37>N%~-;pkmJh%vWQ(1^$yWWxon71Lndao zur9KMP{5;R3a~(Cmbl|qEvlfSaFke>WmxNuZ19+&nxKu05mPyr38@6G+#8#xre<{* zw;GUFp5;pRt-u}6ONeH;Ql>mZt_ZKZ<{4lQw=0Xv{l%A4RDP3o4DNq6ID?2sG#$aND(t+L(eV+4Q$Dcy< z6vJ$>T+}v7BWEZF&lar%v4ev=FW3=ilNWVy<*oruK9esnTSdO}AuB0@juOP?GjsO| zrdeZbg$74k(3jTyVcr<4{(Chi5<5?3hO)a!4S`fH_^ehu;VI~XPqm`&JFooU{CPbt zKZ5mHt;)A>*|(z+DtVnENugzRc~I_6HtRKtm*Fy(*ZQVdRCI1t*Q_z;UCLw9iW4A( z5akG|A72waRF@v|_jUe?S+iNMyKf7HTCLe^G-|c@z3l(c>~DJ@-C5DBIHShfmYLHFnATXik11)c`XBLUXG$(kiD)fL@kPJoS4quAa7)OBSXE!ALsBI7;dY~lhOtT^py&{PMoDM_6ld{P$WIvm%co}F~l+rM%SgdOw3L1cE zkOY#p=6z^ai$e#S)?msBS^hPpUh73C_~fEV)Y9FgaXK#j&h!L!FGsGEiSOFGn<+4Xa@> zTZ~CV5&~(9DswEF`4qSyX8-)z56+)GdHDX% zpN+5y?z!ywMI%&_w$W;l&@K;3ckWFt=RF&>u7t}9f%`tuV&|iEwFu4Rk|KAm9TB3w zlOgU~jUwrxDDwBsW~bZfG@JhGMx#w?G~)M?t5wre_CPu?g4*1OpjyIA7UxqZ@()Tl z71mT(3d>dEDrH2>W`fPu7jQ4KkzyoB91}4}8EJU@{#CMjO);0P5^~CBBetlm^i-i* zse#rfIo3 z5Z~s)G6Dm^%zg)Pq&}Bu;*^bOpQeg2sVe=6qR6ZjB`vriAnezFCi7l>VmTi zSem>_rt|m-N|_Mgqhbk16_G(OucfLy2wZI~2wIXo23V9r1GU~+C3<0^g?y@7EuvCo z(MTFri~*>gDz&HyObMU~8)`0F0 z8OT7Nf>_gOtc0gJtwyy{Xw<7rEmh2~J2I7p4v2-E`b<)}n6EPiaHTiY(Nr}p)ziq; z0O&{hVjS^}YOLFUS*1*&00;(kD*OoWG=Py&B=j$G07+1qcnD(vl>)?}Cqug74jQD} zB9;veRcqB!t_&T?=eNbgyfHhPO2!d_K`|;0c~lx{0%4$dYhE7z3#AvYr}&{^$R89h zgtbZvVg@SZ668{aM})0n83!;;bXm$vk{@?MSArwdKqR3Y3M^1~sa}Fw4a0zT4Ma~} zO#TjxX>zWX(H8Wj7#2}1P@?Qx5TSc|^<*ZL-9u^&CJKEnVGDV}E2NQ3cNkBO3tYJ# zpSxO*%a6e8C1PL7K*VML-bP4)AYd1R_lvk=t;oOg8bz%u5rl!jji4whm3m#FBbTCP zgEb|Ws#WJi{9X=J4ewn|k+`Wf za1-2!VQwP#g#bQ(oku26!HH<3tt<78o5yS82lbaV1+qs59M+im}F-RG#DYTZ8 z{wnQWEKtbR$~xECqPE&DQL5Fbq1|J)^^rd;wMwdMNh5OtPvaFcl6YfcvcLvEnND&| zP4%=Il|sEL@vDT;P-O_j1Pe)~N6J+>BP226ODrT7AX%lFl&t+k zj~IZGt&tjp^Dg2nw5d^=wX%?^*UAb3nh9Sl)MS1L1L;bK5du>-@Cz4eEr(h~?nt!Q zC^gbDQ-~!CYQxEgazQrfY9)Y~NpBWXWND35Y_S4#v>af^mc~Jija32zBaKX8uS3YM zV1*6k2HLbuPRuS#6ilL@6rB)z8CJ@9Vb}oafq0I- zWWacT$5EIAwb2&zrL~nhwu;Lh4eHGi*_zCRvU^CafB{qWIV^@CP&8g-^$p3Cc9ef_ zxu$=2<;lbM&v~VpjNbSw<1TxC(Fm0g1P#U??_zLw?oF}iHHw$w5<_c!Q>(RFjfSsV z@3dKCa;a8px0}scO?JHdkq$;g)z@sd2ZMgU-S+o`!DKQX4+j40UT-`eje5QKy@HSW zKU38diJN8{@^WL62gr?Hi0;efMuW`(No%Se)uUE&3!z$Ldul;?3IX5dwSJ)}OIb;q zsj!z<$?hS2sH$1fxy7c^)iPArY(nIOwiLHRA)cde&o^eYOJcaRW+*ciiz%2-Y=@n1 zs;AqIimf_6wxxVt(j!$URV721lt=*&0y2x6v~T6tYL1*%-MS0cj;v)ND$t*s5RQw* zW>cFdz-hHA#0dPuVYTYOET^Dajd`=&M4rRzg|N`%({hN;5L-#MG5;zmqJe2%K)6)3 zi~#AwJkpTSdr}R64}GW%$q{E%)Z)+d>opc+AGE8z?wqj?$ood^0SoAO3^( zOvo_h4i~|FOFPSuw#5u6DHSqBHiDMY2qSYROGWux!~}~;WAS3HM$4G!`An(ILSoVM zc^Ed#jS`mGS*j%PNm!DcT_%E3qv&@li|Ixql%66Cg&-}W=QT{|x!NNdObmjM7O%5v zEsvHcmO?-lI=he(^HUll&f;z5Dr(=>qO=~RJ#$1MkW+4zI<2?Wauk-CJsJH+cBW}D zM__WDJqDIi)i_?=G7H!r^A4M=g2d@ok%;AX4V_YC%?j(HOt_;Gp|-S&EKiL1 zQYJm@cN?`*x7{S*&9K(p*t9T1H31t}si4YXvCUw^0&i^UnyRMeN3I4mYUl*Fs6;E! zlzmSL;?=nh96J=Yh!feZZN8|KuwHLK4kcC-oC%htDd{QPcIritO`KrTVu(1Wp$0}@ zF@lan8j=u1t1u>%6xcyW5jN5xkBZkBj9<2YBSie#>^b$cx_ps(iruzIidw4HD%D!` z48)9`P_1M@OSKfDxyxa-5^)c`v3ks`aGQ#{LZ6uis1&OaYu6B2I4vT zD#A35dOU?WP#bMQUkyvXhDU>Xb40c#Gf!xDkXo@?Y(+jx*U9KnE-Mbg63O#tPyPPv z$;0>0x$LvZB?2NYJ8q$uI7#j!+~ZvgQKYpZ|E}5W^}1a|bDSj1B=cOV*E=1Bj$CT? zx=roVQ))E2UFk5H^x9Y^l8ho>v)dhwhQn^x-;YM~`D`{Cxo@LrFqlp!lffWwb2Z!E2fq7;6E9TBt!UGq)=cFdBX%VPaN0sMswt}>egMjcAURZECzXg zE=Jh2S}HMcOt}(fHRvgo1pdiHz*aZfW)Vg4B*QkGjLyIsZu2RoOBJ?~xqxuP{HT}9 zEvzZI2(>&ip^Qqw^?^93RIi7yRZUwZGnGbEX86z|Ef06Zx21Xwz$uW2zK&B_4iaE$ zqd^e1RaVTZrFN|f8<*Hp(_z7c^@wsQiqPg;|sd43KN#I(KlWTzA=Wtx}dHQLNT0bXx(C)i%M@ayIPOD*WyP_AC?n3)5H^ z6#^kqU7w;aP!c#K1W~7>L8}=KdhIGaRV}Z(F_qP-`zff;G?lC69uci-$=*;$lhxEz zPvcet8g;qIYBb-d#<~rNMGmxtH*&aSZfO}~8Z@w_6h>=7Zsi&zgei_W23ECFMZ|$G z&1Vvqit3<1+!Y#YciK^@-T~}H8szJuJI|<;(OOCyTg7FM1`)a=vNf4`Lc4?1%C&N* z;d8{$JmFPx;NlMBX>H#)l30&%O&-2~&a1hIT;yB0>}zO*N(cg?aJ8BfbJ9KSwtEwX zoz8Hmh@4QWMEHcLpcr1M+3fc_9d}(Ww}*qa^DVV6qCb$Pl1U#zc&dW{i<8$w{(d^$ z*;y{9Q~&j3vRG_yPbTqu1rfUzC$b09fqfP@+=yh&viPVDAXh|br$a!?Il1jdyV*}A zORZ9i4Pm9!)&}lHsn2VoEyZ{r7-l4<|GDUy-AjIjB{T@B$EMPio{D-sEsB&WE7gCxA9OLQfbD24Og#*Xs_q8IcO4g`A%m88#!(VHvOiNXrRRjt!|xx;d2gt)8My8K4L^i+r z=qccZPX`=ean`P4JynkN6bmMmDm&TBrq3C-fltPWWx$I=_x}3(wl^yYDd~U z!XK6}J%s@d9>HQ`Cpc-Pp9+=tPMXjSN4K%GGiou@{xvI8>Ur*HfyYaci6e zqjF)9cnzJYhMO0qXjvUY-trepFtX^|_Mf7s_-`fK6?_O{ud$vAiAJJe&{Ncd@`X8Z z7RFk+iZg-6Z4;a*)w>b20pYVKEIp+KueF|H9R~*u3sV9lYkCU(RaRvBh0=@HQ~aW< zk#6=X&29@sNVH2YMIHV_KRB{dMIzVGQ^kr+9-EWB{ydi=#&`&8<$5Cve}Sl4zs5p# z920}sd_JcGU>ebu%VsW^1~A%!zB-n?p7P&|&>fMj$xJA_o78GBcemlQeH{~?(^HP} z?=8=b?+)_t{c~Pi^X&rSC{?YBg(9xBS}8q05iysDP(((ZDvs?)oQmZJ!MU`o1NBRt*6pXPYqaL zz&|P7p{EE9`?S(il~NChTPpQS>~!`tToDjt;J*BvAzpqVx zVb~RV!cgE}EE)}gStt^M;z?F}Se)=WMACyiqNr1ct+Y!M;U@PQ!jPqeaA_9MXPE!+ z7J90V2ZWwtTCCh71){d}6rxEH#o1As<-tm;1>nLGyTO=_n^J|JaEYM$bj3jH&0MZl z={M`uIzq779I&v@s$GTHn#5$j5}_rs{iqsgAttJ{2@SDjsgh<6q+*Ad9Ge77`KZQ* zmkK1S)KjF(g4^sYRcewD7D_E+1`!l1wWLy2ima0D_v+e?!e7WJVZwINQzl5Wtr`1J zu)DHl`*DC;E8zlFBBww+ht=^jV#&fxy##4S&B*plXx~JgOALWZmW;Dg$?9!0Y9YYz z#_EJvl~;<72xU}oRa}W_7<*p%YD*9S>GgJmJH}D3_Y1j3H6Klzj5Zo~o9ufkRx^cq zA!;?64MIuiGUkt|&pJphyPQvZooF)d*TY=4UR`%&Dyv6d^-9ggg&#=edS$|3>zG-L zl{%WNrshYk2GE;@YPlKVcR?S3!M>;De>=s=!?HvKVd7NS=;NpsG_X|wM(alyNlk)e zL=|w?@vhlTg2^CEqQeYz_#q9tMcP9e<=(L0th5Go(8%9eVNn>TPRvfYP#cT*eS5_n zcvXt0nDo=P(0h2NBDF5DaP5 z9_sb9KSLYKFpRK|d`<5^xjv$3XXohX@Nj3xf4x{79PaNg7IFQ0z1<#JoX9@F#~V#p z;BaGNUjRG5Y%_~Gsn>_YcBz!MruvwK5jnw_XMrF@Tv}q63wCmR z!^!T&1GNwhLK=tcboS)i7>zK$*!rqn9c+v^N8hSzX)W+HU>HiE<&EvckFwCA8G^Bm zKc9A@aX-Y&QetBRMr5`U5d_oxB}(`*3z?Y=wNM}S1np{$R4^GE_smHFDOf1~LY|{DDvinrJyCC6y;(aOS8tt z%wm*bdQ7m~=ZtV?*`&#jiXt?l(uj>cE@(ikT1n<*(|}d&K{@)(b1r9W{^j428<52@Zw#KDG zyH=<#`R_qnjoF}6!~Lq~O08m}M~JMaPgzq&_f%>GNOOm~i_xIIn2%f4LatR?cVp8U z^=t|@E-VKsH=}JP)2fbojFmc?rl#dbt_GrVgQ#DpLAcmzxOu6>C{f2K6#{&yQ{kt^ z1hgHhlxvPg;|5=KJJ`3FYy|vqKG~C0EHXQgZtMU)D(wBJHL+|kaYoZ|C+baF&<5*V zFmthn&4=Tp?N*AbWe6MT&`%mbcRnfX^1N2@4E{Xl7pbTCRR}+A>1X@1`d~WDV|xID zPP+hFI`tN@r$!STbP7!*GRjK~hxf=;131dhAmZKa2`t3?+Vge~%Boqez#4I0)0Yew zAD43!)~qQTZ9!jSOTLCjg9zOb*_zCRvU^Ca)~QYVKDTRa5a+!iO zPaeL1&MVC%a_O~w_BAv@rEXWd7`k0aib|!|n@-1L_eMdXo!#YfGVxNpR_k^ZBXnsv z+}@r}{oQzHG491_G+HdQ;v_r1Ue6l|_Ike6X`xK-ai2X&)Om8U)nK53i=vK9NRiYBZP(w=?Nz7!7mjttgw^ z2oUg#u$-;1=iEdL5}$2rM7`uox@7l~c=c%3(Rm()$<=m=_IwVJm)Y;e4gx$gzef)8 zb~5h{fu{i@MFm)%+fMv?j;)Xu;=tV1QpxUOP@j*hIg^b@4F#feQKJW5Eg_n#=#epk znWX5c)E@21KH|x$TX&JOk5DLRv05$ApPLYl>-G6OpVuzTX|E^52>d4}y`BTJP}J+i zJldSIv7m*pYu9F4f^4HR+6WLugxixzf6!>m*iBJoJ-Cm7SZj2fNJv(adbK8ctkuK7 z(N@VqYt+N;sv>S_`QS#D<-yu;faqt2<(yzcRw)e%pgYZ0r%~_pi^$?xzuWA#>)?L7 z+i9}K*r=Bfv&~wu(PAR`86E+SUAfs9@*4-XEY-7+0;w|2vzMd6uD4d34KMY`1w5u0 zSZ>o#ziUb0i%EG1<BY%?Er z%Jk6d4)tjZ#z8PPvTV(}c(gYiH}`gComw&9#XRxZrZuH6CSk#!W-U+UPJM^LBEW{- zh9<7bYFZk*#;woml~%bC^;?9CiFY+>K6C`4ap~wAHI3oZuCoJ`!~|H3V#|DcHk-8w zGWUCEF>E0G{d$E>a6lY~7^K5k3>}FMZ8ti3NF%Dw7PDS`FlWm=q=9NGKnJ)IT1nQf zVYcG1GOI(sEmUA4NywFbKJ40g9{uDWt^V^l|KP87=2s!PY-N-iEn1`PNwL$c1A~4S za+&p;-Ch%7?{x>g64nxiLzB&H)e3w4c~0O9T8J9`dVffSt1+xKddnVWMl92#PSfW# zebr$aM?IdxoK7;@g1&$!$=C2`5TQFFTa%ekb`PmF`iyGm8E!X37 zSDrk4|C}-BTo$lr~& zOeVX#+uQzbey}$m#%Vg;+f(F@AP}~^qKN=|==y6m_x4UtFJ9c+bA7a0r>8e=+;`vU zssH-qoN!5hqgzkSn5edwYc6Vol9P^T}>D zQ=il)Y+SDAQX2sRey>`|MR_dpI9SHMY3$^6R&8oE;{(DKQHIhF?-lacmI*K#5Hnj{xZKj9Lfm;G+1-)irjSX02#aXyQ~< zSoiJnKI~nr0clxLEWFTUYR$qiVY`M^7=z zX0tfD$UYSKfDQaI8Ze6bwSK$RYWLyhzJ$5u{+Nd=Yq8gKdDIuzjX+ml|4DcHDB zD^%_^4~S?Xz!-%luE}az8oS1=2Ab7w2%VrO+jZ6Of)YfxfDVoYLZw#kHcJNjcDDm# zhm~S)u~>Gxz1C=m7Q@7=R3R~TCK4`ZD=|oS;ad!(0k^#Zq*1Reb{E6ec&CqDRjo=w zgsm_qN0}v2e&N7A8p1|8^z#m0mr@lxd)8W8wNIgYUZkGl?~q~GOmfq`&UANPf|z@) z_GnNBEyH$y*lu@wvZTwscCCX=r47-YPU$vzwUStn7F4m_;z6A(-6-{^3o4kT}Tz1>{` zS~+WKF66_{Zgm>F(gThCMlH2k zh8pbevwROTpbplT_KsQJT^9Bir9bSNC6@MenHfizV^k~-JUp9(H zGB7PfSuZrZAYYS02J?&$7Yl0=*=zw1+SMHOKJGO>p^HesiJzpkT0sFn>z z@<(4yCPIwBf8)kvA}~7?O(rp~_V(HE+3$3lgVtVqH0lo)BiO2g%0Rg7>`dpK&Td!6 zaHlb?_uw1iK5~6p<5st`SoFrt#;nD!no5K1Nr$j{za>xY@=NoCT``j}Y@79b1$~X6 zQflKMNuloz`@LbOJ(!fsgZAD8mVz56lLJH*@}@&Uhp0#0)>2jm)@Qpky~1J|;4L-uR}(5~uRdg1w>NAldyO>2&xj=p(#6O2C;dr( zwYog&m5c0CYM02YRkTZbJL%5=ct;uiM^>0cxsU(auTFaFd@vt^C*`m+Rh+xmYYs6h zI_*Ay9PU=jqfXd6o%D&qA1}roJjiabIwVLx8jt4s6uX|?XgDNn&AV~+bZ5~!J>DC( z%B5jv-HlCaXJ%8dap4D2dC)%Y(R6EP##pJN$!cnTcA>E2*JfiDxa0I9^%TEe zBup{SZy)xy50+(!dC=)jM&V$%H|Y+EVD$%+(QF(Jx{V$-6@jV-+*I!N`Z!DIfJSH1 zp3VgpD13Z0#^`er9Tb~2qjF7O?Qqa`)Z-~^fI~lUv;}?b?JD~k9u2tFGP3RWo03BfNeU|21@!e{Z=SpS$wp;rr*@^I7CF8~N;Oxadc>JDu(yAl#=; z&dp{A2YY)KHlx_zzf439(Htjf3CTQ{mdlfi2M7Lc@AB#1JWjj27f%llcXwsd_j>Fx zBhBZ&$J5iBFS&mG^wjrq^X8*3edLjwH~rW5-S^PL4?cL`eR2Kaa6UiccO$HYD{XHd z9$sXD!wpIM*oa%J1IgRL;NW0R2*;Y*-QHWC2_tH zZ20*`o_(`E*}ddeuXQLr&^m6_)2r=3`aJ#rAX>ROTlbplW0MK_3} zc!Pw)Qz*i+W)t9>z^Bctr;Fb4UaMrX5!-s!Cd}3D&%moCM01M|cM;5_UeDPRw5vJt z#AIyTGbf8esV&@vPA90dc}_U)^^T7buC#G5p9?Vp{{s)q=K`}s(R?0r=isPahOPR< z`;I!3$!Ltu7(>pw9338RFZ;a%tSS7h)^=mi>-46BPQTY|ccz?nc89ZeYti9HR^{;y zaR$UwXF$vMJzik{0x|0Yqk`7tz9QV58c~}{D59hGds0;3or{jL5 zQ|S>~!UI=@tPX~3cAXpx-sK z%TXF?G7z+moSF z5+l~nM~!aXWdhjb`Cy%om*bu@tt-7b{4VV|Uh>l>E?GT3h{9>FI=C_)qLWYeX1!sz z-Y-RyXtIZII-QOKtxpX+`gyl(Z-A!B5+9$5h6iiFv2U2<5 zy*!|4-Y{BfXsVi+#;$Rzfo^>m^;$$)=u9=-ye7RdmHR#VW>Fh98=_9-t`CMo&`_>AN}l>W3%rIKf5R)>DxK|f)dV@QO*z)vP1(dw0g7d_7br4mfha;bc)gE zBswU@Rd?A_7n&KSan$1}40Mr=wxF*=OTLCjLx0d8I3inE{cRO$Hm zzU$Yn9UqIml@P7O2#uF1_VzAcK0fw$NB3PhTE^+%;L6pD=&*iYF(-Wou$R8at5+Yy zf4X|r^)VPc_~0uZfBDNFe9(V=|NW1>?4>Wg|NglCWU^eITAau}*x9*w@k+!FFiVxn zV8CjJI*_~_k55jP{HXR{(+?{Xp6+3W0;a;Z)slfb>`T;X+#^=0&oCG8F44??Vx z-Aj56Iv1q}I;Z^jVYOXidV0!Fd>TCpEe++)*cnT$0Rzb@8 zV6en8Y~Q%LJGgY%DVuD>wqA7ErQRJbz^f%hbB7NP5zM3ki$ikHXjgOO3EKI5QWQ$n z_zfD$2`4X?Bj~j~7@VGJlOOtOxfEgq{zo5OE(Kn#4mxuav%HMt&qtp1oTICgw+&Vp;-nw~tF^DRQ@w%J7rgeH?6R>ej`XQCK zM=zPuG;bIyH8fRC&5v9S4BNBDxVJZ(k0-P;8n}5;j)tQ#dYr9T{Y9@g8=~$(&~!G_ zcBp1$e(BQbjIZ`~XV_vg$JjKlJw=WBbT}Fvjx2l&rT3P!v>lGnjlE0PF7FNxt}bR{ zf;V|s8fA$qp_OE91LF7XBX?-uI_QovO@3LyX2enVg_IP}U!LS!p+a8IwToxL(F_g9)Z9!j`EjjuEX@qG<;lbM&v~VpL@ozQpBE#SomGjUxqtQA<;(l~ z&U-mHxJFD)Y^rqi>O&7d@W9opVsE9*5O@h6{p?Q0)@+<*PDmwo1EzUDPA zds$q6u{b=uVfMFuaCCJ2`mH8w*p_Ow$&?!nVu*>my?yQ45q^s`b?NxZ$xBLw!NtKv zeqcW+WfO?)!7V)DURdhK`<2-h%CDqWzx-k`Q}>cy)4_eaI^P_0va9V9J2!6dJC*i` zLUdoy%1fM7*V0 zjb;bLX-OlA<^dmGzHBmdiuEW%l6EymDxhV~r;5H(TWGP-D3Grr98ae=Z$=SakFNqNkhe@!XqD_m1n0-RX_v{q6mo>GJsa*1`UEW73#Sn&UYO(v9gds?MVu%lTp( zgM2Z&G@p&yVQUsf)?)8+bvkL!I)mn7Cl|8Dzi;V2CN!H##UHx|$D|zt*7$U!FGWvF zd0E(XQf0H~#`S&nk#zXMY`?obxrSi`A+vMn;^U3Ra&Hf}grAkSTGDufeGIt8{#e;_ z*xtpx?b*aYFB;Wd^nXMiP6yM-S*#cLm-}<&oxZYHe9N}-@nW5CUD}^H z_1BmmE$7Sa#bUH~x@0VD8{gZ%(XJoNn~RqoFWEo)@YTcla@yOjw)fl1iw8#sm-HzS z|KWT*n3sEv=rdpW*!3%m#~!}9Kdwjn^K~~it@}<9B(q%`*Y>zd<-OU%3z{C^cgk3) zqp50Ye&lLk+FQ2g!{g-+ovDVK7bTVFbApek>HXnwXTnAw5VTk>3G%f%(eCx@Hsj}Mx=`!|la_wfvtd&dVC51V`2!$lqYe>xfV7qdFFHy_QQh2i{YdUB~gpUp2# zW`_?QUfdspVKOM*_SsVx7D{7p=KUQqb=y`h9zIaqhWioy>LXfCNrVz9#Wef z&u(4vS@Azlc*`~>W5ZGYz2$m*?#h#g@1HZ~oXaAYiw8dM&s@d|v~+TE|NS>^oSe9* z{l$y7Zr!};EY8K^{`+6?_{&~)|NUZbrP)m0mKa{?+O-hto8sonAG>)ePS>x$ z^sxsYyncNf+F300-5mSK_xRXjuYK)je8yvs`CeZ8+NYoX+|PaOYyH=+e)SvQ_}QQR z>Q~40_xCSddWa2Q{l0y0`SODgzO>B_FiY|PiIZs%)9HM^w|DE-rG7uOrfyt$$<;^0 z;^f-o8b7d~gt<*(bCZ|iTaT((3|Jbkbhcp5OeK|+}4vl(v|)#Y-ozh8)*e~B%TqgOt5W%2OMab&U) zsd0)CS)DCU=VMK3Ceb|M!y5=@5=;B~mXBweBNgCQm((?#tCre2I5?QifKR(_+L}wgsFHji= zhX=QAUBJ$?kl)7|muU^PT0j`}QtQCRb*?s9Ha`?{tYpw?E%g z%i7+1A@#$5^bKF|?>@J5?4ZwkJG zW10A;!J~=Cf}0n9BY0}#N9_C#>K=1E&hbBRJk9Yi#}$rOa=ew}3pw7%@g}}|hrUg` zBe=ObzC3s$`L^KEP5Rw@OR(I0IoI!}uTKUiiC+&+Hs2dOx^+D`*?2m5bmL3T9^8C4 z&wnL2Nq%W?W9yjrzeN2*zSH@u`0iJNw{3o5kkvO^7lSDIOF^{x@nEp|LE1kIu5Wy~ zjq?iUW#az{-o&_WZhULdPyA5u#AZ3jCf?3@89b5r5$66?!G7Y8gZ}0h1y?q9>A!MT z=D$+Y^^N3z6I{`A{&wXPn>RTR_-2=RH-a~Ae2_kG(*Bqmn(ZRCORAJD$W`rE;T zcK_wZ?*-o?Trl<74CL zv)?pWKYjKmTtBmdvEX~xVK5e)<74xk%pW*D-?8;gJO{Rd>-l42_v|kWw!3E^<@!%o zFcn!o1p55ZO6C!vqzQ+xxSH=a040-s}!6X3PD@Q;9DApC*v%gi~T-eqtC zJd-1%<2Q&djW)k3cthf=pwWNM@oUuO*tiA_zCL(Ix&!{c7`pi4;9EAoBDlW!1Hrxy z+IiA&_?F<^wDH5@jg9v}Ywro>9G}1WKKk>=`-2X1`J9*@j}y-V59VMr1dfaj?>-Ap zqRSUL!!KKJ;XQ2|?FyHI^QSqBw~W4D;4HifAMtqvJ^Xuc^z)oQ!udBi{{iO@8NG-< zz`^FPbKK+_UNwG!U&S*z#JA#|^XJ6hcK3-V?Y!juvC*9R6@Q;U{~hM|>%sBn=h2>M zQS@>5Suy}VG+A)&EV&@wjL%QpeJ`0|e7inpbZ>Kq-u|j*$s6N&=+N+r%n{#j-gTC2 z*({%ZV(W3_%UhUJId~K2lg(+61tu6PI%n> zWn|qKAe(-{WaZK3|Lx$u@jvqJdJv`F3!ffS*TYV5dpvj|^%D4IGk9XFMj!lvzRfQ% z`TC{6>Z#2IG#s40!Qk@KLEpn?>mShe9|My*ZTt!Cei!mnH0&}5Z(GuER9_g}>x z_#)`_i=g{2LuS4oIrAU}s|oxc^#Ew7zIxZ6gDo2!iKWfOzh!g5X&w>DeFP z_`x7}=2^}^&h!77^RIFK43395j<~1Zb3e&(AJ<>#>RH{d<=N+Qd~pz*>ATxpQ{TSj z`)5B9JbGK-eHq8@xr4==vo8vQ+x%*F)t~xOpReb*#ld&aew^b292%z%#%IU5G26Ix zPrYY8%=w>iJjVAw#rZ#TekJE`<Y=;LzLjnMb@t6`@e95s@d(%df#XX|Z(Z5yaQ#Q{%VWWP zTi+SHp7}kie(2-1I_nuS@v{@pQUAFhNF4wZ&hVGn$YyuR|DYf9L(ZSQ-G!YcnI`|_ zQ=PpG{j_KN8?ysq`^(GbPj^NqcsuMFbi|*6BWGjXb!NWj?5(rkaQA1w7@t2XA4-1A z-RFDkuDk58Ppcb57xIbx`7T{`r)_rjlZ@xQZRTw>e_q*YD_yp>(PXn_{d0rcU&U6# zFO>Y2f2gy!**@Lb{78Jc)fsNQ!|w6A)SuC_(jl@3RZlc#_=caJ*Uop(yWVDavFA@q zcb}yH9|`Vzp?c@-dHGhK7Tl3cp$*!pt5`*ObfdFuZz-+c?`Zz0Bj?D|wk z@+YYG6TwM37mU(_;5hXw!H8p!{E4$S>yXTI2Y%HX&i)PWtlc3;Ui{|o*6Yx+6k{)}&5$^1Ax9y~lfto*$F*!`G%U;eunI;Vb|{(d|- z;iv4QOfNW2{}S;1rC^Zy@v}GU@cq2dIaBAmdT^5cTfr#%mBDd#m-B8g$kfl?tizAv zh0f{s(jWd+<{7>#1;?2W(B21vLHfOCZ`Scb&=!a9Z>59f zuf>OtH>_d}ah$>QwBidI|GDw{YYz{LX(~QUJs%VB@nVZ9=sEDa8xE$kWY03!m5;3X zuIKotW|y6hF`tK}Y%7kt=IiJD#??4w<6wK7KN!m$@n|=fvp?~3y63#cL;B9REi%cC zX>`Z@r04xXj7V`J9Uj-v-9Lic4z&jnW z&Px6Q^<$lcetAlVZwtBqln&ok=AWNErNh@pE*y zcE<0JZ7Vx<-Lds!oSQsT?C|Bm<>Y_io3Dbl#JB$mpXc8MM~Nq(m)8Sx zaJlu9*rIO*M~ai^xni@gqmS3(55=*QP0^j`OT75;peEdHeU8y_wE5M%dm}!>WsXO< z{*mD7)>l&Z7dZYc?f)_7Ptb?fL1MXNap6w{*;NdT*rmmU;#iv5hoU9?Af)_-Ab4mq zxR6`o#OErX2=c)P&!&_=Ls_)zqFs-I$=M$SqhQ<0Lo1K1JUx3C&o7<5kMi=_=TTlc z`$o!ZXOB~Umc4z_-oDPRKX`VP=RZR^2}Wl>6HMdsGJf@xZ$D0Xjpy?qPn~&Cv~ooB zU>-a`JM-WXD_=#4+@>*a_#-x!?G+J`7F)BcIIc1oSE4o<0~Qgu#kB&Rl#(?BD+#PfFrmxKK6XDN$T zj_Ca|5PKixp_LEt?Pb1F`6|jQ*83If{R%A*FQ(>)C^ge7*8UZ1|C-gjW;L%_&1=@? zwcsN4uTlRSDb?~dYxw~n{|CVX!IP8^1&>+z3M(I{d?a{^^3mXf!S7Q34CO2M_Cu7f zqI?zKs?@iyqUMK!*U#XMM?Ct*!9IggG zt#aef6I*8=qs&`bKKll)!?P=tm9w9vjLtrfvSClUR%c*!mR25~eLruH?D>g3xop>0 zRc?N@m2bE5YpncQE5FXlcUbxLR=(59@3r##RBk1#+_ch0xRtc)jFnj{a~joFUS)Dm zPm=pqK4Rsglz+K#`|MXX{xXravSek*y#6v#wK6*UIM)qbZ+=8?H$SR!E2k&4{IeU+ z1V455zKv%#p5ys5wDt`f&m=BbxpnqiT&K?-r_9@RMKu#qu%xWnlP1u6CegC8qZSf9 zyY4f#XA%ReKeU?AFi&PyXJO^i%3XWDXXSyFhiC7i=CNI0v=%N|%`1Aci6o(P*H`WO znw9ridELqzR^GJoQ7d0+|kDD}TVs|JBO(TKR)k{*aab z%E}+M@_)1PLsovcw_wb_ZRPJ+`MXyBo|V6E}<|&_p zHa#wsdfT}5wsGrirYGXo+X->&ZR6J4o8s2no8s2no8s2no8s2no8s2no8s2no8s2no8s2no8s2n z#;v!v#I3it#I3iDTW@cPTW@cPTW>SFE0p5a+s3W8jazRg#jUrK;?^_c)-&VQGv@UT z8)wW#Wk+wB%WqN6>{|SOw)t)=-(#it_ssbB3_R-XC#?JnEB{g@W1uz0K$(2#>|=>Q z9GwW@={*G1;>oVPg%i0xwd*TZUQ@aG9jdeWomRff%I~uByY21w zSo!@{{!1%AWN$xg6VG0F=-@{1@NRw9MCo-p?dk~Wk}>R*5=bbVDNl%VqMR(_3@Uu)&pS@{ktzuwAs zS_#imAD*TBUMs)PO1Oz9a1$lmLp6xGoqB-rbKQh_%E>agmylbNWm$;MTumltT4xvsE88!q13EXaD+fbGSgI=AMEJRBG-ixIiToNC^c}YVIjGLM0SP2?bI@fs{~Sg8$o3Z*A@= zxPxn(Z_4JIGMY@;eAD9YL|WWUi7uu@3sY(qX`4lwk^dIgS5-1{m2bE5YpncQE5FXl zcUbxLR=(3pjXZ55Pcw3T`+Zhwc}rYe-Vzs=;bMA+i&ct?%Smx@C_5w(+I&MG!KTatM51Bh}WqVL! zbx>k;P>SC}Ssj#E9h6udlvo{<=r78d)j^AKjjo~m|G9e?_^7HYd~`p~IVvQhKqQKY zV^AZAyhL82$s{v@Xb2brzR(hqK!PEOdGPj)%#5Yh2fnGIBEArnWqOhEK)L051FYU=_BHd zk`ZT-l4p7%wolrgh^okg;bTv5btPmk%1p{^kzgQfP!}Y)3Jtir()L2mc@9!|+lx7; z7y6Mg@}peJ(O=z|2E}T%59X}DR)rrq?D1~izB@kM|v-g^j?Sz^oWc|8Os@nOp(nX z(=xEKeGbPmOJ;DE%z$5S;#lU&4EQCoKQ+fv%DBs5rpn-m%ixI1VAjguxWoOrSTc8I zAnVGpRaSvNvr z-3WMGMObZnI$rrB{G>M zGMObZnI$rrB{HpypiE|oOlFBpW{FH@iA-jROlFBpW{FH@iA-jROlFBpxr4Boj%0~U zN3ujFvqUDdL?*LDCi-^<^pYhqnI$rrB{G>MGMObZnI$rrB{G>MGMObZ(T{SKWQk1l zqe#gTndnE6k|i>kB{G>MGMObZnI$rrB{G>MGMObZnI$rrB{G>M4uij~_ArY(O~}FM zg~Q-=t34e0cF4hyM<9BwkdkMPkafH53)yauA;a)O%%Or53{&F%;Nem zi|fNI_F5KuEeniAIbf_vSu197t(e8$%wlh5u{X2Wn^{~dW^t{U#kFD<*NRzOD`v5; zv$$65kJfIs$B-?@l6%LJd&iP{*~kg)xRd<-*N50_`kRe04h<}?gA|5jlXclv=A&#z zBikOwo17iPjXEXC>GxKLN^Jg>jXEUDJjAu6DiSiLok+Oo#W`@s3h8N9!lrmDX z8QW~eHk+}{X0Fa=uFhtz&PJ}rRmjyM52fr)nJJRFI-9vVn~~3Ee$GaIma`Kek4FUF zv;&Y)TOlQ?1CTjIW}|loAa2h=%6-iML{Id?u>(E;`3=X&Z>@G9R|^BVLKp}hz6p(t zpn-^_9LqQw$Z<4~<7glvCK?$>0}(NiGL8l!Vj^W64dnV^AlDBA5iyj5h>4UjH4qUK zDQkv-$e$u*%`g!8Q>3gJ1|ololr_UZjF_9(1c2lMmUA&kHfMqmg>;t<5`O*@3yatLM?IhOG_ zgnkX7Uqd*uhHzvJp)W(|%Mki9guV=+FGJ|d5c)ENtsTPF4n<4a?J%_JC`ie=!=P!k z!_l72kkY5a(JDEXJ{=C5MZj7QPhv7ehl?v zSi%^d9m{Mmmin>G0Ao4!$HKdIJC{V3{3Q9p|M(bSKoel+!?sUJiA80yDRKZg3T z)Q_cpEcIilKZW{Js6U1JQ>Y(D{W$8!Q9q9QQ>j0d`ctVtmHN}Hi`Jfo6_iNal|$mL z91?fskk}!I#JxFWU)mf+8_XuqV9yN_JLHhqbA!a58zlDJoYOFtMP5pI8Rg}a*mHya zO3I~_S5dB}yjLVfqDY65EtEYsXt3u7i9I(++@V9_4&6Bo;}jZ0K_p%cXa@^e&g)<cX{+KkKX0cyF7ZANAL3JT^_y5qj!1qE|1>j(Yri) zmq+jN=v^MY%cFOB^e&Iy<ST|T|br+4}EE}!1z)4P0nmrw8V>0Lg(%cpnw^e&&?<0P|qGQ-B$; z-5Jm0@jRZu;|V-2lvc)35!_5B9^d-B`jhIi&(-UmavE=EMf_ZSi&Nfu$Uz*W(kW~ z!eW-Nm?bP`35!|6VwSL&B`jtMi&?@Fmav2+EMW;tSi%yPu!JQnVF^oE!V;FSge5Ft z2^X`3i&?_OEa767a4}1`m?d1y5-w&57qf(mS;ECE;S%&nyK^b!Wt5jwUO{;!!QKl@d<~;4GdHfW#95ka$7>5>E&~;t2srd!9OF|4$S*|7 z69SOzHQ75P-xJ0+4t@01}@;Kt>_sWK^7t!l(487oXx%3Zw9;AQ%-V zqvB)~_PN2RI2jcuqvB*#oQ#T-QE@UVPDaJas5luFC!^wIRGf^8lTmRpDo#el$*4FP z6(^(OWK^7tijz@sGAix}qvB*#oQ#S)!l<|-jEXzLsJJ7Hijz@sGAd3+#mT5R85Jj^ z;$&2ujEa*{aWX1SM#agfxa=6CG+|VnjEa*{aWX1SM#agfI2jcuqvEow40~ZzoQ#T- zQE@UVPDaJas5luFC!^wIRGf^8lTmRpDo#el$*8y^jEa*{aWX1SM#agfI2jcuqvB*# zoQ#T-QE@UVPDaHYVN{%qijz@sGAd3+#mT5R85Jj^;$&2ujEa*{aWX1SMkUCo1R0ee zqY`9Pf;lQdMkUCo1R0eeqY`9Pf{aR#Q3*0CK}IFWs0106AfpmwRDz63kWmRTDnUji z$fyJvl^~-MWK@ETN{~?rGAcnvCCI1*8I>TT5@b|@j7pGE2{I}{MkUCo1R0eeqY`9P zf{aR#Q3*0CK}IFWs0106AfpmwRDz63kWmRTDnUji$fyJvl^~-MWK@ETN{~?rGAcnv zCCI1*8I>TT5@b|@j7pGE2{I}{MkUCo1R0eeqY`9Pf{aR#Q3*0CK}IFWs0106Afpmw zRDz63kWmRTDnUji$fyJvl^~-MWK@ETN{~?rGAcnvCCI1*8I>TT5@b|@j7pMGNir%) zMkUFpBpHfXl4Mkpj7pMGNir%)MkUFpBpHfX zl4Mkpj7pMGNir%)MkUFpBpHfXl4Mkpj7pMGNir%)MqQ15Z+EVi z{Ygk!bzhH_+oO>9#1j&qctYY6Pv?59)%iOZlcXiw7H2kH__%M+T28&n`v`1ZEmK`&9u3h zHaFAe7TVlGn_Fme3vF(p%`LRKl{UB1=2qI=N}F40b1Q9b1OHo{+qh$S8%DvKIF_B& z+o`{u`rE0$o%)r~w>vALX?K3cK~;3LFyl({vqlgqW&T3*HXWh`nA-rrT$^+AEy3c>K~?l9rf#|Uq}5q>K~#0 z5$YeI{t@b*fZXi-n(|4?-%xI#{4M2El)s~Vi{-qUU7TgZdrR@1%Yw^*gEGN&PP5@K$FR zvbRXt@!kbCj)IgO?_FTy3`p7W-o^cmUFcb{kv-vEC}9nx?0D}26GS6>!n?S?v5Wf~ zySTrxi~Ae9xWBQB`y0Eszp;z^8@sr_v5Wf~yBygQ-o^cmUEJT;#r=(4+~3&6{f%AR z-`IuGfmUI3KyrU$7xy=IaereM_cvPTT?@Typ?59xu7%#U(7P6T*Fx`F=v@oFYoT{7 z^sa^8wa~j3de=hlTIgL1y=$R&E%dI1-nG!X7JAo0?^@_x3%zThcP;d;h2FK$yB2!a zLhoAWT?@Typ?59xu7%#=`A5X6mEPfLIK&^%d?6aG^bXJRpzm7gT`Rq7rFZxQl9tkU zt@I9`Tu~!^*GlhN>0K+mYo&Ls^sbfOwbHv*de=(tTIpRYy=$d+t@N&y-nG)ZR(jV; z?^@|yE4^!_cdhiUmEN_|yEb~)M(^6_T^qe?qjzoeu8rQc(YrQ!*GBK!*mrI8u8rQc zvG3aGT^qe?qjzoeu8rQc(YrQ!*GBK!=v^DVYom8<^sbHGwb8pade=tp+UQ*yy=$X) zZS<~<-nG%YHhT9CTHETpgVt__lsvqTntjylqvlg;KBeYUYCfapGipAg=3mtOi<*B? z^Eox2Q}a1B^6i6G=L>4S5RGdg+g*p!rSvEdqU=W5T~>W=cUkYb-DSN8iMvrq>~BC~ ze*+SCqmXzC5fVEakl5LPJd(%Q*}yS&HXyOH0f~ELNbGDt;!YV75rD+b1|)ViAhELn ziJc8d>})_{X9E)Z7;bl2i9urj0TTNUkl25K#Qp;$_8%az{{V@*MMykf1c~R1AaN%M zi910^>@7fIZvhf}3y|1bfW%XXka!9a63-Vw;`t)T?UXwx@q7_9*eighmgi>UZW<#jPtO+NSR$Op2;;d~L^zER zPGf}A7~wQVI89d3I4coOV}#Qf;WS1#jS)^`gwq(|G)6d$5l&--(-`42MmUWTPGf}A z7~wQVIE@ibV}#Qf;WS1#jS)^`gwq(|G)6d$5l&--(-`42MmUWTPGf}A7~wQVIE@ib zV}#S>2`)EHp5TI%2+MQAA|=9UjBpwwoW=;JF~Vt#a2g|=#t5e|!s(1~y1{;(o6b0= zGtTMAEpNK%jCMMsoz7^dGur8L=Yq4?uY(j;r!(g1a_53$iFrC>p3a!3Gv?`xc{*dB z&X}h&=IM-iI%A&Bn5Q%5>5O^0+_|7M;dZ**xj_2I*j>Rf_UjFmvP_GUVJGo8Je&fZLyI~UkvzYY@n zb&%MvgT#IvB=+kdv0n#?{W?e)Q|avSboO{Udpw;zp3WXmmpd2OV80F$`*o1muY<&X z9VGVaAhBNuiTyfA?AJkJcLfsrb&%MvgT#IvB=+kdv0n!%3`r+L(#eo?G9;Z0NtZhp zoW<@6q>RUOxpQ&T<<13Ca#1?@lTQAm%bg1}*sp`cejOzC>mX&crpuj+8zQ4ZWE7uQ zcjbBYIHWL2o?0)0l<^xPqe5gQx6Q6VxaL`H?ks1O+yBBMfNREUfUkx?NsDnv$w z$fyt*6(XZTWK@WZ3XxGEGAcwyg~+H785NRyVK+oZg~+H785JUQx6Q6VxaL`H?ks1O+yBBMfNREUfUkx?NsDnv$w$fyt* z6(XZTWK@WZ3XxGEGAcwyg~+H785JUQx6 zQT)aMe3zUPBBMfNREUfUkx?NsDnv$w$fyt*6(XZTWK@WZ3XxGEGAcwyg~+H785JU< zdZFLj-ClC91c`fLH-nlCYBH!fl$t}SIh2~-)bysNH#M2mWKxq!&0)xRo87~}Ns;)Z z2@;<)LE@7pNPN-+iBFo`!!V9;7G6VQ^#To6FVDG$vxLK0!r?68aF%d5OE{b*9L^FB zX9>qXe$h|Ej?&~3OU+?yTjY!F%(xGGvW%URRp5%eVlRS{PuYtsUjVDimLL;k3$QUJ_b@BSsyZ-d9KfUWu z@A}ib{`9Utz3Wf!`qR7q^iG~2U4s(DyZ-d9KfUWu@A}ib{`9WDtc|_?^sYa>>re0c z)4TrkuD`5}VI$u4r+5A7U4K~{LnGexr+5A7U4MGlpWgMScm3&Ie|pzn*2dm3XyIn> zSjywk@>UPOAP0>+b-CFaKn;H1g~y_iXA9fC6DbEve)a}Seul)#${Q^C84~#!68RYt z`56)`SV*j|ATi@ZV#bHWj1P%*EF@-pNX+<h?KA%8}RRWy#ViiX508WO8$NX+<h?KAu;1aV#bHWjPDJT>;#Dn28j#?i45iqlk5a3*=aa! zhSO#^ZSeb@qNmMp+ML8pbrLhxNz7Cyfg7#f2~3Ra(8=Ta|EvbB2h1d&MbF`uI*N{u{qv)PMM6XSR(pd630?cR8qJ0LL! zc@wCaK+Ocv;CC>-<3DpYekp3WQU}fiR^eyfbAg>ob=!cS%D4ddNU5|Dz>~mdN`+P` zb#PdzL-6~MJ^KKA@lzw$DAl_j_#A(1vqq^txVF#h0O~wqxl(;mZ(saIWxvyvI{H1O zvQWmc`0dQ>8A=UkQfeTsIbpO?CoWZL@YMi*M`*}8rG~CnY8cuxyh5pys+2kzzv48i zM5!?-_Y}12v=vI_M3u_DMXAU*rSjlQK5U{5O2u$p>_GtSE5J1cXn(<%N{vT7g=_Fv zTH2JFxJjwWla(r2pwtx9eU?$`Y+QfN5~a?=9}u117eM=el%~`STr=}kr7B@R`)Q@B z)+%-3X-d`LwHCTMTwCubby1#D4Osx{ZJG|?x_QR|clel(*M+ez?Vv0p8*U~>V{i@M}ZfB768|*I0QHzK%7>f&K30l>RYi2cmj9@*sIiyN~xRC zuebCB1_Ef;E$1qA+v`BPQn$m0+YzVRM*u}Yg;IBR0}z8d#{y{QopXRIfZG7H|IQbI zHUQQP+tC}Q#`%6Sa&`vrXc#T=#9qrK~IQRN&*gx%ZTM{%io{{t@N=5!bzdvR>Gr z)Sn(x>P6tC-AZk`09X%fRO*$dm3j^Be(edRwj2YD14@A!0BzW^5`gU%*lxkKTfS84 z%?w}=5Cx_KO~7(swNhKbfgK^>IN&s38c+)?1MUDGSE^+wFaekWEC8+r?g!A8mbZWp zm1;c@2m_;m$x5}ouGDT^yL%I`2lz^-hC2y6+rCv8epGNf879}zQ49B^_~Ot1x5fxK!sB6Xw&;w0Ji~% z>H9ANZNTSBeb5sa2;>2%>jTvF0qXkTZUA+CfVw_FT^|~t4=@}!9heC$0PHEE@KS(!OY41^`5Bw0nO*BL4^sP!CyhrICRZ3@smG0f9 zbml&#`^;0i?-NQNxk2ghHA)}-iPFbBru4A|N*|Y|^zm6r4_Kn~K$LsJ1xlZ|Tj?Pv ze<-dQz6y}nSCk&gbM9CAyi1fmf11)WhAUlmnbI>GlrA5ubj7nu z&$=7Y8JECO)t9Mn1I8DJ~$ zk7ee(pSUg z>MUR^0Gs74O8@j+rLRMsE22u@beqz*pv>EWJJu_`YOm7wj8^*ItxDgI*gc50J`B!0 zf>`|=<*&!(55#kl-@E@>9=sr*4LHZ0Y2`UqjXE2(yhalZhKPczo4() zL3{R~?Z`!X?;fS!Ls{>mO&=mgA0cKRBNqSMr}U?=`3&v(;t-|r``-Gio0R^#KpFgU zl+hueO&PmV8Rr#cya$yzs6?4=Pbz~ydT-L9JNQFodS0(g23|9lE7K=WnIn!<=E!rE z={G|e{0OHxdYv-;E0j6bQzm=8GJ}RIGo(nFld_ZY300ECpT%_9#<06u3;8(;c7|*sIJL zXxAB61FtGmbRdBDMJ2#Ypb0=bik??yBFdgP5QqZPfGS`S0N*Cw0X(WqG3qUb55=D= zGpPW7Bt-!@cV=H;FaX_|GXTWxOth(_A21JC2kcR13hJHmf-ii?*E$|IU3zne*`eym7#_0Q{Vewok7Co(4Wr z2KmXHzd@M`hAZy%y|H=EywxtgfbQNz_ZF!<^qU$C48RM z6F?oa(C*m^7z-e7v(Z;ohX9j--O5xC1rV$150#mNSj?FLv?y~S>Zrl{n$^I2%FI0t zxE^>>nc5Y~)Ey6OQl|bu0O#r-Q|2PndC}}JI%O6uQD*TK%3Ol$FTwGpu(|9IWiCg#S0Dyg zRw#4TwaP4me~FR6C(0yODRVWj9De)+W&9Mc*P*@Fp+B!f9Ix*U35Ilf?Q&r?y1Z(uzMD|=f?siz#L`%1Rwvj z0$2;6U;nfnKwU4U0mlI2faw72UWDC?uzL}9FT(Cc*u4b1mtgl2>|QDbYJlYc>|WXk zv@5gG0r~*lj_1Z=$?6QQn*50F?J8 z%6k*#y}1%t4{QW>179lhRt7K#hyv4rCSW3h0u8{`z}>);z^lM}%Ir2kA7Cg@03dhmM()~u4S;;L8@Xrq7T|ql-tmBbz(}AN zm<3z{+ytxxo(FaU`;^%e0*(Vt1EvABz%l@B-SZgm0sz}R@ax@fKo~%|@1opyQSQ4a z_g$3xF3Nou<-QBscTw(Ml)D$@?nSwK5re&m!Cu5*FUsAE80_5$>;}G6=C2vRARr1% z2bzH8z-nLv@H)`04DP`U?!gT1!OVL_Kn1V_SOKgBo&~l8pD6RUG~gIu98e0>084?D zz2kq#CcJx6z`k)7nlKD2CM>}23nN)KmlPO7nlKD2CM>}23nNC?XLMS4CDecfXjeYz|%mB zGXGFO7{~=?0G9!)fTw{LWj<0s7{~=?0G9!)fTw{LWj&zE1YicRK$*|M zlP_@Yi>H7s!28O4=>UBI*nU|6TmZ}it^w94^KaDk)nH}5#&ut#%&%ehHOl-NWqyq^ zzee3(qwcSt2HpZbR8}1bgn`k(NB9B02Z24x8V~3PoCZt-<^k6LYk;SKEx`NA+Cjhz z|L1VJDeDvgC==^$>sA41kC#yPfX9F~{0ty;2Q2`;RJPl-0A9PVRW=Q6O}jw8_5zlb z2kyX+6r$V_?18RX~z#YKjz$Rc1@RhP>^ach41;7QsJm4B&4e%7O z1$bZCq7VSPBG?tdt_XHTuq%RH5$uX!R|LC>u$u_GiN!!Ia1F2ycplgZe5Gu0Z(uNh zvWihwG0G~2T`|fkhF$R<0Cto50V9E8pcYsLz-AI`ChY|FDLWZuO-5Oh3jmZg`4Zp` z;3;4y0Gl&Iz;OU<&b$D)1h@lu3fKvJrECexDM2|Uuqn9!m-2G zFh0-S4t%2Qc^Lrg&MO6)fEB=c;C0{=Wv6EVBY;w%3BXvHjxwgBjOn`pjPLUg0geZ9 z0gRjT(XR7bl)YfGvOmID{?UWV&Oi)i;F>bDqihARUfBxxRq>*-l^8p-1}R%LR@n

!a-aJ<2Y?`Gu%^5ytw(DF5Qml)dyxWiMZ?>=m%R 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 E17_M>N&o-= literal 0 HcmV?d00001 diff --git a/test/constraint/angle/normal.slvs b/test/constraint/angle/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..4f1dfd0149ded1347d54fa8cc28272aec451d7b0 GIT binary patch literal 6357 zcmd^DOLNmO5Wf3waE`}zQU(q_lv21copf3b3~Agi~OT7ES> zFyzwduJ-lqCuyx;zyDm8`4(SRXo2VF*C+^r&!pT`;a#{*Bk_x+sNPpNJpq~gzd&o8 zz9D#p2`(0xO7Wu1OOmcu!dMFFeO7(S2(43PT@k#*tB~$cb#;9xE$}U>@l~_ftlnlc zyUB5?GNhXd+)}FT2+q;tSy|AUpsc8k0_AzRo8#rCSfaut1>%p{n$A^C+7VqK7AKUD zIDce`1g}w*{s?{sr^_V=u>s3OE>>8o%uBMwMAyNQrT4gA+)c7#QstU5^ zR&COzO(N-Ui*jFMT0$qSp_BH|Q*UBGxt5Zd)*qK?{c%C-lpKZZ z%sKqEB?cvn4lu+zy@GMe5d{q_O0c=X9t9J zD9rK02GiP|W0a8Jg>YyGN^r|(9&6%JiUpq?HgM^d1q=f~52*>Xtu-knTKHNKrmr4h z=0#7pQ%5Twk zdkm7Qq9kjSYXzLXQUN2}wH{o7Q9>Ljwd9i+sicX*Li=dWrnhI44EGGDbBE`aIw9y6 zQL1-t98@^8++;JZ56nfZ@U;5?3R8MNv>abY?Sqrds6IHk*?sWb&ZZBtW7|jHeDr+j zzW>sv?xj6;0Ar=5IJ)J!pGD% zx0?LK%6;k^@XX4dm1tm&TuFC=sua(xIH(f-4XIkpD~X2^h`G>RbP2>%8mEp{_JG}q z^v}btfjM#|owV@sM|>>w=Z}73lO}>c(DVKWkaVH3&{K(2Xkzuaj1EnBI#c$6C-ZAQ zVgzORta_M@ePwtaIR~SqOONWz_xTgDb1Qt@D2tSOZJjN;eG5h woq6_=6$A4RB?}ZM1EIBmakK&$r(IpZSdo_*t-^A(qPPzC>CF2SXiS3OFS~`3NdN!< literal 0 HcmV?d00001 diff --git a/test/constraint/angle/normal_v20.slvs b/test/constraint/angle/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..c080183a12451dda96e8e825fbf540174fd8a8ed GIT binary patch literal 6335 zcmd^DOLNmO5WeegaE`}zQU(q_lv21copf3b3~Agi~OSbjA< zF!a*NuJ-lqCuyx;zyDko*_K?EctPgp*BBx6xhghga2IToQ2a$wRPRcXoPbRJ&heTg zZz{4P70DNbN-@1p%TH-V>qIRqE3zc3fIi~#>Uv+AlUrPqt7frTy-jI)laWLvLpLS3 zrBvHhB*RZ0zcat=qlo`&6G{lQK-IA|Gb=?V+dM#DHflB{Qu*F4Owsg4QWH4A|+i|JRlnlq@>H z5F240zs!6(-hA4MD%1K=Wm-R~pnVCd%-lwGG7wf~Z^Jsq-o|yP{fq-^STQ+iKHz;D ziP_urMnlNhd~iNZqrXwIg$XOj%~45xF4=axDl=oe9{cY+*LIJDek zGp-NJMWpbw`v3}4dOx%rUq|hOlgy|-IJwz<@Z8R(53*z1C*OQ@xOCTl>2vqe9y@@s zQqyuA5txfcBCvTx`|d{s$JbGb;3PAO2u^MziQpTlnwZdk?Q_z-wg(qr{@UjPJ0R5_ zZ$1v)LyNi4To9^Ap4&_nD_@PboB^R{vO1DtiWW5I+7b1F-7~>c;+tDdeq!Y=@eO!p zWzR}9Fh{PWJ3&>7XI30k3IB#vE#{R(LkYxO=q|bhVk(VOM=N{4?nL_MVb{PMxspy= zc=;nf7W(r?zpF_T!5`>({{u+6&{*iHL@G3~dR#{PCOn-f`@oa=H6Jm8vV2zE&&Iwo zJWrp4(bA>Lw!`B@YkI!I&-Cl9n$#Ka5whemf-O4u9I=)+Zcs~K)~8}@7x#jr`5-i6 zhgzDVzJpiW&`yDiVppc$#l^>@ae!<~=abT`2?Xz8aIs`BDHPtvPLr8uA6YR7|4_0( laWW8E3m8W$fN|Q@1&kGWnbI;SRx3*CV3*9iPl3h+p}+LUi>Uwr literal 0 HcmV?d00001 diff --git a/test/constraint/angle/test.cpp b/test/constraint/angle/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/angle/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/arc_line_tangent/normal.png b/test/constraint/arc_line_tangent/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..0d973262223624713df36f0dfc1144947107b5c1 GIT binary patch literal 4932 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 X)zDet=KcA^_cE}`#$kE3HG1HmLFreC literal 0 HcmV?d00001 diff --git a/test/constraint/arc_line_tangent/normal.slvs b/test/constraint/arc_line_tangent/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..f30e98d1fadf546cdf57053a6b155600c1a673b9 GIT binary patch literal 6846 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 sWH~WwzNbzMs(=dY4cmOm*AX)R1>KeIEC2ui literal 0 HcmV?d00001 diff --git a/test/constraint/at_midpoint/normal.slvs b/test/constraint/at_midpoint/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..07761c17bcfcdd6922314c61d85894c9fc1fb005 GIT binary patch literal 5529 zcmd^D&2pPC5We#oJ(~fXw7qc1q-k%Rj5A3OogNe{CrmI9f$cb*K2+Nm>`JWu2*N;| zQ*-HbSNrpQyIQUJ{pashk!|T!NfNraxFMeBePP9>^zZ#`95jC+it2qy<5Q5~|8ugY z@jFIWl+iq)6^fH0D_Fc*HO45c9@6r2%Bnh+)+M7$y7H?XDX(wZ(wyFrnqGH{_33R| zrMDT4Wro$J1h-YC>=@0+(|M6sH6v+WYX!-&Vz;2nO}-?#P71`I(si|vn3SU`Av}(c zlvw{DL`K)7jDLE+ytCy}kl4Xxgoh=UGV_8hDN{HEv(*Ewllxhk&&rJC6b(sIr(621 zU=KnHRr(kN5zhw?bko1N6%pU-bIyu9`n!IhSh<3wcWK_VNeF%=l>efzmxPfuza&1t zB>+DRc-e*6^ImGhUTxH;jRN$yC7G)*J)xuC&{2Qrxic|nxgN+|>yFE{?zo_}AO}95 zIqko`!~k+r0nXS2^XPTv^XcaEURJr*%_`TrSq1HDSmov>tFw``a(k23DfT9>W9?4_ zvAQc};c53QciklJz$9RTxt0F}`xB$DMw-J7g4=4s55~dg4o1OW(8mp}YI~26Lh%;C z(DbC>PV5}U#vv7nc)K_7=oL9U#!wy9c*@q;R3asOs|fQqk8ol~fN7`%yRKJXGS#9` zQ!$RhQxy#<43*&M;V<$!t@pA;_zn?xD3kTmk`@d+R~E3=eGh(^YY3|Hf~`rW6fpfz z0V~vvS{$LH8nGwU*iX$$gC-&!D24LToy}m+IvL>^rsDz6Jvbrg*9NL{ZyN=i!&KQ! zs{?ltNqb#+K#lsCBTCnN$ZWH?t0o*HPC2E4F=d?I$mf?uQ?JK74e*4d7k* z%0}QWIvauS1IqWXMzDMxwGpgjCN+YU+r&n2tu$SoF#POueE95uUV!zd-3xp`$~)dY z4(*}EU8r7YR3Xl7u8O3u&SyrGFfdsaNp^}7bmw{?>Lq_?{HNHtH|hkNqx;ygqUnPJ zktkx0jO1W`#{?pN!pRCB8A#~ZWi``BL!!R5pl^Z1T3oujtJG@>x=>YB&m$^SpAMLc zZ4;5soUi(r-{@@2+2#1!rD;9Xz-_2lcledso1P2!x%!SLS4J2cFj5S;i0~mWMKAVZ w<9O$#H}qwF*6fc>`x+W5R#((E!_m+d^*wyev(gZv$d;*3r_C=L?ZET?0pLBArvLx| literal 0 HcmV?d00001 diff --git a/test/constraint/at_midpoint/normal_v20.slvs b/test/constraint/at_midpoint/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..76d63eb1ed7bdbccef5fdb253e234df569368233 GIT binary patch literal 5437 zcmds5&2pPC5Wed*dNu>tX?x+2Nz>js8E29nIz1@1k}$?VB<#fL^r70mU{^xF1YscL zQs2C*-Tn64Wwr48&)>@;+mp)@ugLQJ8Y6_h&|+5x_rX31>t7^A)uANG3CQIC9B)bT zj*?qKNxmXXirFSDKc|#ci8@$PvL?3yd&K3{byJ#?J6w^gcCk6VPg#1Ckwk%EyAs?o zrtK)n@Y7k5vx?$0uZ#j`*{5{NmI|k3vBhQb6aA9F(=FhJ5bob4$r5zBUJF`U*oozF z#f}14&^4hNuHcGoNVU43rTMJPa89HlURCLyd@JZiNP+i{VHk7j(UE>IjD%Af|sV*?ZTi(b4?_|g_3V9)g7@?Qis8btvY2#4( z+vCi~e@E!JGj!Y?dhP`VP1KPx*ZSjftv@bkos`3X&xPi%3mBwaSAa7%!aRPR`FyrnfJAl7unEIMhQWWFbfJFp2DVea4` zVZX5YYM?nhLGZNN>4(G8=MDy?za$Sk!YcQ!S3+^+z|cfWa3}TxYb#KSmAG_waE%o? zT&_?ZsX^M-+9qNxe5(laH;=GzBfvD&g2%RdTrt(4&`>dq!V?`$QW$B$Cl#<1UF(exI;s{UrI!6vZ!XeA zz=2X|AMI#*dp2N%XPAyhJa^;?LBH0ide^f-iSslynsIgDE+WOJT?bH@)cdjJ_?om1 z4wzAOaIo2R@Z6534zgnVC*OYZ^5~)e(dXkwdprTWD__|N+(m06@O?o0?$-#8uSpxh z0W+!*9Bd;S!MD=1bwdBM&&lz#J$eDwpJp%c0jZwx_HpPAE$%}1LamDA+~%rS`D(pp z3<*8K>PV_nw4fd9k*F8^o(Y~3@7`zt)<+MCXGJpyduF1EnK+Z9_@+!myuzspPn<~P z*<}sWlVzg6o=D#!6K8R0@2=9UDbj_ms=gkjLicHpsn|3TaOQl~m-q&wv1ga(TaTgj zSOYgxm34==)J}N5#Lx5xIJGju*np8@$wh<@p)Go`7hA_$A9_n)R;Ts;ShugGA!2ov d+Il!z+M>FL?{f|eA&Om@{=8Yg*%${1{R7i3eYF4p literal 0 HcmV?d00001 diff --git a/test/constraint/at_midpoint/test.cpp b/test/constraint/at_midpoint/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/at_midpoint/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/comment/normal.png b/test/constraint/comment/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..5b175d721ce03f01fac60874d860d04b72c54024 GIT binary patch literal 4296 zcmeHLYgAKb7Cm_okcXfsRf~e4XcZC15pa-49WlPZSJCi}B3g|+EJEa&1YKIHf{0Rl z5Gbx{F$4k_pcxXc#j1!B5e-lb!7>s|khsJU30#~D720TV{4xD8Yx(1@yVkvDo%?`Sc4KlSaPOLa8luj(=;ulZ>iI=6N+Ej%3H`oKmZ z4w&@@_P}&x>4BLY58x-F1$bs7crY->KDZ5U1lH@QI5;%!FA7RNl@rGf2*?Uy4BS!6 zuSUBo17uoBg-FefL?cVHEPDc@gO60#s~!s;N4W&MeN*&l#030*TTUmr{+u3u`g}oz z?%po;_PIp^7%aLr*8X0GvN?3%rH%p+!wP#~3dXmIZ-8i@CkXvOoS4b>Yt`eKt&@VB zbwS18=e807S+#CVz|m~EVmj=#83~{SQKza2aPV($R*qDD)1Cc+HOaH8-6SOBIeRsl z=v2AsfqwwU83&FN&BrRPr$@(+@%nIX6vi!|P*$RVN zAM;P0j&kBlBnoeUW7kJOey7{+rN{QS`t@Ub{Lk7$K~|HPAzX(0V25EtNJE7D5iOj# z_^YF4<9BLlT6v`=6oNPGzxg}S7GFzAlZt|sy-vSAX>ask^v82*<&XLUq1Bd`w^6S z9LOE_TSN4u80VRK1kkJ=o`VB*V~*<|6(okWL>zXB1WlPkIfj(whVLJ@szXWd3QxO# z*2xA#9e%nf`Ndy2j_I9TE^)u?jC+25B=LJCOM$1cYkf?BH^YXnfJylOeC0&kiY=CggSOv$);i&9S1~;$?@oTLrMI z>A7Xx!br5NFeEDc2b01yhr^y3%0~YMJ-ecU2IMXDo&bjiPWnO*qp#;Fj$6r+S2E4D z&4(tR#{@~cNaL(_;-_r)qSq2FqV_gc;9L`SvkE4k{}#a;Eau~@ya}EsD)IiDfqBcB z*D7Zl1P;@7g#qrps?HN2XXT}v3D8yZrl6=}A1T=PZF>AuE*-WBNM+Xd|GuI_y1W8@ z`IbmLP-ofcaO@aKI7WqW4z5c8VZRZUd#0I@ZN6_S*1PR7suag)ertT@kI3b4;5n=& zYCC|H+fzQk+^)aiOnY$~TTmYzDl>gmco%ttQ-i>uMDHJ0wghn_f zLAjWhc<@VTL$t<)lEcRfqlH{|I94D-_JrTMB}i1+e5Xe@?$u0xMe=GqE+TOF+iaDI zvRM=1Mm>YdciORozw@jf2&dWd{QHj;;=CEJx9-4sdSIe~q&5T>MNTzb04}0^c9c0( zEH3HQMjm;TMJcOT zOFEsuCV?Wyndfir2Z%%6bP6}s9;|(+e7jO$&Sk~S#BOG+7;fjYmpEpL<$PYmoK@*| zYeKxwmKT+%+Y{EZUrYI$5`IW@;4rLkZMRGCG!D6AU?4-J~^l+)1+mhrV2X0D{IT+*S=b{L32qa4`pg|so$(L=r z>iZa)r81gymvSqYfP98^+zhY#8!tTdt-z^$zjTYg^H5wJESL4{3-8;`;$F^WfZ)E0 z#_JY3bo}d*aWPx$aUY@#QIf<~Hq}p@-<>0@df}j6CbyUgdTINPKKBiguI%q-801PN zYpWRd!*XPP%GiZM?*_J8Z^Bj6bauto*=z>vnH0=fuNF<3vHr*rxn$qc0lz30%N)yg zsZHUgMQ#KbU(jpuxXijQr=&HjsW}vV5XYD!!Tdr-OiIIn;h@?|>ZvWclJZxEhXP)Zl`Y9~VmXc* zPUO<*x7xpNSG(4)-+%5{z9DxdPRRUbfe}Io01c=Gu*DX3cLS$2jEq<_T5lDtQiTJv!P@AK zX0YWZn94FV=n2a`d4khVb*kRgc~;^oO&iU)Iw%uU!>3z^dc2+;jg__j({Ck#LP5}!VMsu%1>z7D0Ls5P#;$DuQ{w2A0wC}@Fgk^#MNsG=(dUxYfo zv!ih<=6Pl{RT#*YO;xuld>-|N=S%$BJ|NAaRM&Ef9NgB!1rI(dB3HKUdcipcnS6u? zVd$z$?pntSAV)Yrl}4bWNn0CQ EU)li%LjV8( literal 0 HcmV?d00001 diff --git a/test/constraint/comment/normal_v20.slvs b/test/constraint/comment/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..101e89861e33bb81e008c4053e4aeecffd2fbef4 GIT binary patch literal 4089 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 literal 0 HcmV?d00001 diff --git a/test/constraint/curve_curve_tangent/normal.slvs b/test/constraint/curve_curve_tangent/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..995d11e9134c44d17a999e2da821823f7cb6a224 GIT binary patch literal 7415 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 b$>h^^eOGKNdDoQ-5d literal 0 HcmV?d00001 diff --git a/test/constraint/diameter/normal.slvs b/test/constraint/diameter/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..81a24e230423b2b9d60c97ecc8813a59a3369fc2 GIT binary patch literal 5291 zcmd^DJ8#=C5Z?7SI$MzCq-X~XK_11^wkXL; zGSy3vd*64*JBq*m{JkN?2H#XD#q-NM6a>K+O4e2Q5N?vF`AsFM-c>j`1)BW7L@S(p zpm>2PE>p}TIVA<5$zstcOCo#BtE-%{I#Jpc#Tj0NY>TSfyM1bjm#D_K?PMdp$yt71 z;6z2p))km#OzTlxpyzW^vYMj2tPKMd1=-GVwk|VNnxKGuk+0ZX<)jU<6mdVHgv9wH zQ>1u>s^n+zD>%zC0b&c5u@qKVs>lh=Fx7boWZ5IG(}zi3PO1WxSSq5l&NuiQp^t(J zRr(Y~F^@+Iw8Ou?7al(vId4Ut!fkh=vT}sx%e-vbWD0gwD*r`cuMtHnen>)oN+A7d z#LF(oL2$^Oc5>q`ZX8K_8&voT)8RVqbRBoQo_PaqnJy{ip)>HK=lR8`a5?uyTDH)-n1vuE*-12w+WD zOr}x$EccxxZomd$g#L+rkWc&E&+*e5v)Wz6iYSITOr1axmSSmJD_b#AvHaGsHAo5D z4APUFKi+V-$x>PFFT+YU=Qr~0?%2U@%C}(4lQn?wHJV4dLheMjo^E@ncKjEy)O}H-9HAM zfm!GfR10ZBdlEffulWKBpA+wu$OPDk?h@bS$4CxK#ek-IwkMU2dh}%ZrVGX?stBF8 zhN|+YDqP5}Njw+B;n3>$0I4G4bFL=s0b1Bf6S2xj&ppY|RT?n&_Elu1;p0)pcXTxN zbn?8&9F3MvRfHGwFR9M(e2Jgyw%^NU-I5c*Q)+ah=fc1c)2kt9|7f+QzElkXYckmN&2 zR-`1^f-p&DYg$~=l2wTkEK0H@tAIV>;^wwV&B#5j$W1%hNbe}4cPU9!Fl<|ZS;n+p zNmBfLmS?OgG0iH&z-f9;H*Burv@|xjNPePUGH|+qxWR?{Iwxs@PM1poOA9)&6j$h| z0P}K5N*%7iimgetc$m;^QlvN|QV}mIx+CB6axJKU`=>CBIrLJ1ZSREfj~2;?@ni6m zL;+WBKGK-1MPAZ-n$ah|-^;`F-95}) z4^TKwcxqdO3aJK!28s>{FS3eOdsQR8>_Q}I3P3|?*pYHY4mXPL;SYOXN>-Ma8=Pte zoL|X+wSKGbEKt&#j1*fIwBEf^MT7&RRoiHfX0T-wjIa#nyT@`zp5XLrovQbOaa7_w zO&!g+I&c$_!qcupy`7E@N85VSIyk|Ms)LiKT?fy6H;K!N?Vf!b_E2;`T=b=1bifJV zUHQsJ;3jnO>_*@lP1_!JY#du}+6YcCqZ+}9ZDb?(mU3Gs43~XL`eg_70_=fiFYuhz z8E+ql?$F{UT6+N)rWcl!RT#cm>$wdq*!vQJ*8OA98JL9*LA8)3v?tNy^@=Z`;5qSL ziA;dC=sxjXevIU>R19dUXM0lVs7FthZ@OTdqKeRYYp5!Zs=~SKn#6N491gAi!j~!{ zKIdxE9-xJ-G!d(e^xTsSU8MnYuc;y{4Ihs(zN4eDr<3P@#L;N!R7H3(|B~tq&zJa_ z{z;@Rh0quy-yzQwMGS@f0wpAi2wiq literal 0 HcmV?d00001 diff --git a/test/constraint/diameter/test.cpp b/test/constraint/diameter/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/diameter/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/eq_len_pt_line_d/normal.png b/test/constraint/eq_len_pt_line_d/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..709b9e3f64dfe72908ba1cd2abe87be335803e95 GIT binary patch literal 4455 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 literal 0 HcmV?d00001 diff --git a/test/constraint/eq_len_pt_line_d/normal_v20.slvs b/test/constraint/eq_len_pt_line_d/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..6ce37fdf1966371b6776409cd39380184837afcd GIT binary patch literal 6423 zcmds6OH~)(}S7_@Zi|Sb^@W(AJz5`c2{pXmR|%8 z&5d2{>)TJ#%KZNG_cBkn^s*pJx;Vckp67io^G)I3`P(?)zfg$kT|whH$i&|nS=0Dk zNpEOLvn8#BxVle@Pf1zTv0PY`bVYCc>X8&z*G*|gZ%IwB+QoYHHmQ;yDUD?^)usTq zRi*4onv$opJge%GBw4K$Buzgi>uMqMG%VJnh<|#&MB>RB@`e!hp9`AC-sx(^U}-@o z63ZnzGQqrD(Nd+$u&VB9y}Ub0vZEp;85M?PStnciH81a(6mWkZ1Q9|n7F3%b%=w8S za$)@7KgOYt#?7B_CVG*V$!(JH9*3}0X8k|4>VlMHjYRg5$xvk&U?Z8>^Y*o2r#9-+ zMuG6RC8-Plj?htO=%_pN%$XRFsH0@my5pkO9T&7#$$^jOLi5*^7?jLAfQU^nk6vaz zn{GbqL>0AeR8i|j6|^rw70pdlk4D0Z_9m=T>`h$9+8;AuH7kz7dHYG`+DYiZ1Ym-> zmH!0$V}n;C&0z<@ZZ*pf#+8o_%<{*=2ltDWz{vd3+zda#+(ds$_M^~W(1#7JYJ1X= zLU!T8mElRjEt`srnMf*@Y~J>d&(}sdtj0IHv`kkV*PzNdrZ(uE=2+{uX>U zM?Im+@^Vd5rGTqPC}1MJR^v7hnu|TD7IfxgqcD+JC?Db?>hauBCj|Y% zOLfl1qY8(X>ujd=0bPU=PqPo8(4`MU%kp*5K3K_2>VuV=*$2mHqWd5^wtaF9hxfS%xYDn)!&N;q~a zpbN#vf{ie8E1*hsyoZznlU0!pi~F1M$Aaasb@Y=$(xWzvOr7bu3O`dH&*h5) zfe$@H&LYesQ?&Q0GnTh*PeWhSr~LWBPd`IL*~>?0`GK;h{lIPc&1-1$`VPLl2WFB? Q6xlNMj|={4*A6`IA49jJDgXcg literal 0 HcmV?d00001 diff --git a/test/constraint/eq_len_pt_line_d/test.cpp b/test/constraint/eq_len_pt_line_d/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/eq_len_pt_line_d/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/eq_pt_ln_distances/normal.png b/test/constraint/eq_pt_ln_distances/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..589cced6b44eba9923a68c55987a98f276032247 GIT binary patch literal 4435 zcmeHL2~d;Q7QP8YA{1OGAd7-neJWvb1I0i9L8T&yC_5o4xUdL{pezZATCIqneJxNI z79CK8EDuZ|vIS^Gi%2UFHc5~u!KBC{NeCgN2^I#%!P+IWzVj zM2iWC^Eky?IE!GriBxLbA^=vb`xE33$v1K+v%m{bE={i#O$csY0KWKTDs#@-hX+5A z#CRNHmp~QI`tk#IgoYE*%7C$R3gi#F;WIsENx@w7xaZcQhOZTKYFcrXool-@kSL6% zylwF(v;x-65SMBgzp9nDl5rpw$B3P#SnQ2?XZlCH8cj;VUW4CI zjV_-{-JR&xQjgy@JdS_&&lS>kzd2Z2nAJKea!qs_2+%M{;;JOPX!h-#a5<||j6+K? z_zg%@H*#(<`y{G~DMwCDlnzp}25742Gsu+JSL!(RfwJ*h^63EQ=5!vcyfvaRaa>Hc zs_Yfp=zX%TQJ`6T1nZ-3<9o5SoY>E9{N(qYr9w zb?8w`P*U4ysj=v|R46svO>R4@OXUk>K_9`^AKVPm`ty6zIt0`tCuDGkvjM7X0 z{Z|0u2Ovmzz$N+P7iwUriLvJH^;UTb}lSpav5#4RB=1MWb=THxm zGyYIDqo>WPgO=*RzDM;aakvBynaBCgXwX4{Io%Qd@!6sU#zdws)dLu}RqrjK@8T1y z$b#GNF3bY{BXh_jDq`hDt-tFhGqRF9d_z=w4g?5;&Q4B3cw9z;QpsBDh-vfv3uD3f z*Y7>){dX;X=7{wfhRF(lhT;DWhGpgyCJzR{o%nKj!?t}m337bXzN=N8nqns#DNlGb zqJmE2`l$oTOlzO}3FN=xg{QtZ?zJ9RvL_s4digOFT<}P|v?mAx;(g>9F;zT6gRPbU z%z`>amlG5plzb}9)4Yeo6ebivK+M7SYA|dXPgQu)L=rXjz2rLazNbthP|Lq=%nxO%PS`Y~-V z5|Yda>EBW`Z=>|x-N#Tot{KL}Yu>H6iC+JuFNjRwxKNhi6>%>;1W@6LHTHSSp~2zo zb8297n!OU=A{o%%A9S>89fo#9w(Sa_n z5cMBK!2%8({3}Jv+wWG{O%YQT^X54ldBfM<4H-yq9ntkpFOP=eOp08P!{dWWc&2Y7 zL12BI=5hzU;|C*rL(QDhJZAZ=>bGjk%pg zuO((n2bkmvF0NyEbfr+jl6l$|JtC(5JDlAhJzm^?yi2~c6m4wKkn7yVe{%KB6D(Z@ zDRmFP*wlosp;gAdS@A*#4BCz1)R}LBUfzqKN9y@-nWy9QpXH}eqUvOQ*veKMxxXp| z1(4?tDKqIitwT0;@uKYlREbd~^f6o;e>9#&GOa>T_6wv7?7YUX>P$cKWxDA5mrRa$ zxjI;o!)91>Gp|LP@>s=beyrR~zQ3_@He;RHA{Os?@Pl}nQF)Ay`Ot*3xkUW95>3u6 zIo3h#oM3Vy-{Q*l_e`i{Z+}T2%VDM0^uLLWVt1e|Wu|RmG*{Y?*&@&Uj7$i)xG(PT|Hoc#m+-~wC# literal 0 HcmV?d00001 diff --git a/test/constraint/eq_pt_ln_distances/normal.slvs b/test/constraint/eq_pt_ln_distances/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..1e4968b5bd0c6f0d8254bce46f264daae8026ba8 GIT binary patch literal 6998 zcmd^E$x_=u5WVX+a>gae7;@1eAtbjH1qC^zav1CZRLGK$WV595QAvI<-LsFZ(PqIV zzEE^eFYk5Fs7Lz!=kG<9Z0SW#mh}Aeig=#)rN}n<>~6M=eEtiBsCv$6v;dj-KP77# zy({PqEoi!=r4TQ(BrBqu8*VIw<$augj*GI2q;+1<6}_32k0igms!LOPODcNVEY_>H zaT#AHG?E#Xn;hJhrLrq%LY_{tw5$per1va%NUDHYFPtX7P~1};OfSaK;d&x#c-6b{C0c~7h5-9ell-mW%i)rM`_&=>x;Bykm{C3M&tI&2R;cP0ic*8&-}?zpIR#|5ng z*`MK=Q~$Lk29S9Lkg*Zw;eO`x@#gbZR#EF_6}4_wLAwvDXl}B4FpyTXH)$PXZ}K|S z{*V!?yW${NG@s?JorDfd0!Ely`H!$aH2P|wIqV?VttNbb7<_bK!Vd=8!-L04U|{}e zZiXLWZn8hL_!xc<_K$1ehmwc(Ci-ssbNaBMWo1usQphF&cw~7}aLXn>W8RaBC7YZ! zFmhxmj6$$CgvL|0#+(=`;cG>hzj}m2I|4k5l;E*x=8{a+DAZI8qi~_32?_%xc#H5y zDjEy_*65Gz@BxgJlHbYEpQcq@JE*cvFXHn(5Un5w)CT#>OnNf{kjPQgiGjFAam}5P~FT4dy zd>@$DnxXJ!XY;ynp_*OIi9(@B=`kMEO;|c}eBB}P8=Q^#5O;iX&<)a6_c~P3!0@WD zH9Z&b6ZJ7g-kp&6z%%45!eVZUcCN?9^2US4(C5_$ev#tmxTX2XHN3G64Q01GVaMl( g9j&nCN2;OCsyp};A@rdJUF(ooj~aHN45Qf-PK!;>Amjh1(VB$s z3UW&dk}gTf#pOese~yc?3dO>_AS-g~mQPWBbzPUH zPQaH7bVPz#u_A>`mts{ukZO5<6sJdd5~YM2M$0PRl5bh@K&62Dd(R6HdcL6C+)(Ey zn#hLnqx%&4E*jVWxHI01tcdU8l=aw$r6TM9sZ|$I5v`HPE;1Ra^gV1O6+6zp)^F7Y zZQ8)&{A{u4?VLc1|(`J8MXGfsI|uhtx>Y);<-@&YfB7DW*tDpMwkbO zna{?X&stGMtsPa=+EE4VA*iCcj_T1sSkYdGb&S1^>rne+3anzqkw0%f$!t3b9q0gz zFgNlaVSlXgYM?pnAlR*X`QEVd(ScsRKhPfT7bAgz`J=fWeuTM>{?O)Q_yf>Ctrb5M zJha!V@3vo%#|Tt?#%`cm)~;ZI~V8vd=TKQ+VqFgXf*C$IiI zt>S7YHVBTXp2KB=y-HGRB43wh@D}*){m>^}u1d3F9VJo$H!oMfKz=P>8?c|4*b!>J zo7mLMO++iCkLGN8dsfL%&u}w$cy6f^f_`PCTAv1k3J1oiY{vBgUHAe|y$_&JrT0V2 z@HJ^4jATaj!N^VTgJm*Pec&D2KHFyF{iVD9OJBN|_SgZ)N=eIcL_imfM8H{8`tC;r z!`GxlFp?QX1S7YRM6iw1O-$&&_9g6I+k*=*de^yt2c+2J&Bvj6XrT+q1*Y=(xs9qo z_-edn6bL<&m5~Hfq@X$1j;I%S&$!Q__06IZWJ`CUWj@rP~&bRqee(-B5&1ysq7caXAYvNF=NxW6fX3|OYE z!}bu}r%z|aJsJY<$QpZKh>#sR=xpj{_jLO}e!}J`v3;P|)?5lBJDu0L3rTi4Cvt@Z zrN?+sH=*gw@N);xZ*VsHC2slPt_afA_j;+E!0@TCH9cG5XYyAN@peMseMghi2=kdP z+It>r%Nq|GO`lgE*h7k)Xr;ds=SGj#N#XRrm1Yil?VfMS&@k NzfG|ZBg%o}`~$*&-*_2egE$J`Td?VyBzHl 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 F{}-wsF}MH# literal 0 HcmV?d00001 diff --git a/test/constraint/equal_angle/normal.slvs b/test/constraint/equal_angle/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..6fb46d0be3a8ecfe0353aa7ea01268a50caf7f9d GIT binary patch literal 8470 zcmd^EOHTn2ox;8J9s=1ZJQ9F*DO5toaHNt8^o7$uk+qD2{P z@Ru}yq*79)_nsF(K72tn{p(vA@mQ_1R^-Xu)&u30OY`VHN?4ot#IJzzUljHdvaY1X3OSA@L z&xJE*|5uk7fy^oZjP)=NhM7cQ)UibJ%T3>aHPj(R5ts4BU@xj3W{9tb2?~%U_ziayB zxo6<-W3R*SW3S`y2p`hd;deAY*+bvMTnFF7T*uy(JIKBh_&I)B0E`MNA6_o=VmH+}x+swB-< zD3%H`c5nr`yWGed8`)1x>5U;2!^jw8^K7XS0fm?^=t&&U81TJ+OK^Ho7cAJ1#Lom9+~?4CVN?0B zmAlX~o~nf{fk<9P24b6kRf1z8q3=#ag((uhYyW@?SwypcKqYxX_v%|i==h`G%jq>KIHa3 zw0*#ZrF}ppSsLCxMx-}Rx};@X9PPKk;O>zhw)m5g0x>SD)e{AKMA54$cOkiuS0b*E zZPj8D-Z!D?OyRvE&#!Yf`n+oSw5W!HroFZgm6x4-5~xkj2K-EZG!?H2U?cmECg%}! z(W^H>+VaZnsp+%wl)W=xL#d(pz%*<=&@^fJKt7v#dJ0q&m@@f|n!U$U4jkRmc$=rz zxQD{Yo_$)NtmHV^IizV0g>$Oor#NRvx@br}F@4FT)zl~x(`t3C(4MiX0~;0EbEX9r J4efBQ{s1hI5k3F_ literal 0 HcmV?d00001 diff --git a/test/constraint/equal_angle/normal_v20.slvs b/test/constraint/equal_angle/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..25b9634dd249680d45e3cf76ea84674237f8aeab GIT binary patch literal 8378 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 L^EXNz!1MkAg25A{ literal 0 HcmV?d00001 diff --git a/test/constraint/equal_length_lines/test.cpp b/test/constraint/equal_length_lines/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/equal_length_lines/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/equal_line_arc_len/normal.png b/test/constraint/equal_line_arc_len/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..323d8113f660aaeb501ac3f2d933864cc4b3749c GIT binary patch literal 4609 zcmcIo3pA8zAAe>Tx#hAhAw?;QA+>TT8CthC)Gi?-rd+<(xK*UaZOq!WB(fEfm^dZt zHnk0+(O9jvoicowvB;$x&E#$j!(?A;Si`67`_B2!nK^ULd!F+=&;S4b-QGz&>}0oA zQcV&7u=aqx_16Hv-RHjIV$hQs|IAJRl#CBAi zN;goK+-s z&gP7n)x6rf@QJ-de!Y{vyN@$G+|TW;>h0~l%l#_s1<6MIpRPyLurZMm-QybeLQd%7 zjstA^GZ@f(EV^2~jj88LySkJt*P;pO(35%XvHLt$Lu%dSL;nin@!n28j6)=4XRHr8JQFiNhjl(7vX?i6%D8 zwL+6^Yw&lZYXF?CDS+XpxVxW0IQ*LCi;d_W~S2;gB@nz!L|ph4{X%govCq%!gC-iddEx%<$1tiK5%BG<+If;tE0fMX z6W(5TB8W~0`UH}d5$*zZfpGhR2a1y4yT zT@RNUbZ3%r5+KZWkvfHB|5=gXexB=EaK&)G7E+u^l?W+e{@$SpTyGdDgG#s@mCpbQl)s%(C8ND<4gZ;`@;!KF5mB8o!!{z1({+TI{v!F`xm zlD4%Jo_-65unhUD9{8Y5dL`U+T^wRl2<6=|Pgr&;l|Z6xpLW$+^p&X0ILCadYcE z&`_(qNwjl1*b1edl{PhUXgC78*L{ww^kzMbV7`Pk?Z+4BI$ld#8%1DVmfW_rUvv4@PJ z`fYDL>Y8kmjdZK8E3Mhs&7Xd0GRtecs{XP%UuI^E=^ZoOr>8O2m#O1VKpg7#%j2}W z(0q$xV-xj^N3xpM#~}_4dIcsLH0<|nQb5Nyrm=&5p^>Umir>-jsPw)^5Vv2}%v6?7 z_;7SLjt61AWs+xxVpWIfyXro#C8Qj4swmX}EfA)+jq`Unb3;zgjy`X%LFuw$E#8ts zjTDf0*$Gy}<5L;Ti#eH?+B;EF(`O#=a5D^Ggh#in6q=_j?kdVM-wJMEU@|5#DeRVky-~ssU;TeSmr43HDL!iQL)ABfhm$;z**# zZ2wSo>W&KO@07D4u1$j5M?(!DmDM*J%O7HSr_YQGZD=0Z&^?lh`oOu{cZ=-TF%{E3 zrk)htHL6y_-QDr~$c9A>%JiV_9n6H`L^q5l?d#JXi%vSX@Dq}NFuWP&88_5GkG;Te`V*d- zkldQWzYxOTNBsDeNBWP=lK*We`Wx+<#RjCe58k%`U?;F%OO!)R+`I!U>DEW0?COL8 z$*bqXrT7Ss+fDZ?5Cf(^3XGa}e01&mBg=hsx$pnI1+_B$*6aI1Qa~ysm%HwO1I(5M zEB|ONFOn)gZ?Jbapr#3wrcw5C2&Qa#r1*${)RU203zURY@;@8@YI-sE93PVzB@(H$ zJY5NuDKrA=RXj3JRJL zHPC6MD{1C7&_}-Qf`6MLh z*#>d7oktBQdH)ome6JbQMU3WLE9W~jc^Es*D~17?)uXe34IEYXn6sO}@ME4d5~ZmI z&Yg%BbH&!#G9CmM$pRmi3CUyqu6tfFXVV%9ZqgIn4U@ozd9g;Mhf$`>b%-yfEy) z?{iepsF?e&r@AAHThw&DX{<6W;CZf;+RiE&c*y)vfkwxU1qLAYjc}Fvt#jkTY1nl= z%+0jNT69zlX!Ky4kxKKwp&7CE{3Hq+|20+xHpc;rtJ$3P@NJZdyA>x+vW>g_E=9j) z^hD+jk~uH-HoQ4g%{Aj%l!xD7mNNN_^nu8f>8@9S(Jux!ptD6t%{-&j^ELeGiVrBX zMF@RoD$asy(Z@LR$LRTrh6=9F(D@tXQT)%IL=WX&wPRFr*so8$uVW7i-jn+yE`%CY zXooW|Z)(1r`i8RxQ&2_SQy00tyzAk(bQuC<+jkGuR%Ij2+4}1YwAdw_V-^V&E_Q9` zzS!~IC{`sm#XDRbI6R=q~ zM7?`snySvm=~En=2lsKAH8LTT;K;3Bu^>RvtLRX;w;_7m}^8IIt46YQDkN%f3D}rtuF4n)A!G-?X0S9cHtV{P} G2!8@*E__@7 literal 0 HcmV?d00001 diff --git a/test/constraint/equal_line_arc_len/normal.slvs b/test/constraint/equal_line_arc_len/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..733864bb8b480553161f549cfb91be10b78676da GIT binary patch literal 6597 zcmd^EOLL<*5We#__G}7?rw<(FxwoyUOikvnwFkyl5-J!Nz)mt-`=fUD4{qx%IS8=h zoQ6v(-RjrZpQHx=`}4ogO?4oj+hRkmK3o@`=l$L_`_{kn4|%{JBt*kgOY#_G;{UqX zk^Hxg+>nmc8`2B$rm31Pzq#SYLfGGz?Z>j~hg@2>9odo_zkev&FW1M?n%oux`7$on zs}E&geyd0>Gwk;*xb1so*O97teAm?d&=qApXhl&~&BGPh?(1z)>!d*ZzTEX!vL@xI z-xM^CFCel0h!Q)pE86^T?;r2YcFRBR`zB_hi`It;%}URz*#O zVX+y?1Nqu?_e=_1%7OsXe8hrr`1jvf#6+)icI3PNFkPtVT+@}eWzA`Vz^^RjmuT## zqAPZEllXL(K=~-3ZD(T7d#**3T0Eu2f$(=IDpzABLgUHMcsg|GObjSDQ8LxK<5I0V zE@-Wi1D~Eb$Inz^P%`fTMeGc7{4(?KeDiP;RjPHPO0{lOLHiO^skw>j>O@$ny$S0% z_9m{U+D8mn&5Bjzui*(XP7p>JT4SIcoT09bMD5M`QNXT(Bu&FC%}^Gs89^uQt^C(C zei~yiL^zCa1PINBy`B`@vU$sxwxnXi=9WEN_)QIi2vAdK zJY{Q4X;=wgD?<3{5h6PRG)@T~#wH$#)DeUliqjyBRWt@6oCr#A@$et&p&XthML7S3 zO!g1L3&~L#LfSSk(*7CzWsYD%RX5$PsFVUuexZQz@mdYdz$h;Eq+0Narh}wRVxfGD zXS3L|PKJ4==bj8T?s=k42>J&v)j6}CR5-r`gvoh*pe_`4W*M9}nyT`Anc-Gz4K~)^nW5c9hXMB4L2f^mI--M-l#K5S zJ9p|r70Xp}-&2*M>P%S+aJC{{mN1UDHBAGHFHn~KNW7MfJQggMt;6-+_X>rmZ?eKS zXAi|iqA|-J;X+YFo&Q3iXte;>V-uE6NZ-jtekW&R-t&&H;u_XD`W}}m+74f{Cew2j z{!V@Gm#|p>6vTaaxFd0ENwH~!I%H% RB5cdl&n)~)fDZ0?{{sX8*cSi* literal 0 HcmV?d00001 diff --git a/test/constraint/equal_line_arc_len/normal_v20.slvs b/test/constraint/equal_line_arc_len/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..9f4b27b22be19ef70c1cc6989b60ef1ceecf571a GIT binary patch literal 6575 zcmd^E%W|AL5Z&_|cRdsm&sng@>t>fqITdG-%7Tm)n=%6gn6aH(`KTm6nATewBVfkk z)n((FZuRT*k<{Q{zyEw_sy+G878`Q$=CbfS?`_xYTK~r1=K+6^5DgD4$zza--*vGi z`9B@`Mmkb&NH4_wZQ1@?cKwjcg>6T!$Tz>gE835jhtir{7X$e?F4n8}WnX@+NG_A< zcP+T>du7*=ss4D7H4%ozW+?aMQ`6lt zDYPaF0!$MY3;Nwx<~%V(t~Px4@1~0u?P|L6x~w@35cri@|IfPlzUYcA-3~t84*&!T zXs?;r^B!x_q!v$UaUlHdi^|oaiO_g5G@cF}Iuiq)O_WTv?zmLzjtg3=JvGx%IRm9y78-pHeh>!$anP_HKi*KD#f<|?V!u(4$aw|rB>cmmWE8c*38^B7jb=ZX+M zdxXf20F6_EyRk7xB6R?vhT=E~V-<}-2q%IPoIU)TdMJknNfFL}A(Q=s@IrD>hLE-m zOthbaFXk{NRCUvBi%KcrtvW`dhW?k z+6qW`CWZ zEW|P8>xIh-(NvY^%M7<#Yp}8Q&J69&It;MS4s!dk)Dazwq-1iic9MXLq49-6RpLi$cF@;f>k^PYEnE7!2j(f6=a(RTQnHJP5P@K@?{zkI!-z$4F) zvj}l)iXOc~8p}twr=ch8W$p!k-=Yi-OwU~Vl56Q{W@($@20r&c7GYba{-MIZ1nA(N F_ZJ4~(RTm< literal 0 HcmV?d00001 diff --git a/test/constraint/equal_line_arc_len/test.cpp b/test/constraint/equal_line_arc_len/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/equal_line_arc_len/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/equal_radius/normal.png b/test/constraint/equal_radius/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..e796226da3d842c9e3c0792bba4b3a5b6c5f95e7 GIT binary patch literal 5396 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 TyAclEc7okI4s6fgN{sklpy5k< literal 0 HcmV?d00001 diff --git a/test/constraint/equal_radius/normal.slvs b/test/constraint/equal_radius/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..57b6d9bf5328a79fff2b52d9d189e81ed27770fb GIT binary patch literal 6251 zcmd^EOHbQC5Wf3w^c>4}pz6g33beNh1wjv04~w%27LIM!PC}^qquTz#&c1gOuU`pL zrE)>c?7Y7Dc6ZkN`u*p&$Ts-4L8hH^nv|m|K{Spp zAhCXl5(!?RGXCNH^e*Oe24Vx2kytFTl$jS~j)|&+AzMA+I(eL=`J~KHj)fsg>U4v@ z7UYRZp-UfvAfow*1-9q{}qtGzr14Eaksw>&?`ts7OUb)yQ}V^F2$CaRNxuu^*y)-m=bu0!q5 z7_gcZlQ3vL%UwH(IxqnkVSi?B! zp@w1@gy$+6gYZqmU*~mN?<7U&3=w!jCi|x)du51qWdUQ|x8S=uh6q(&kQK_50!}}n zfD!6m4UWJlF7~8a@QIH!!i1#*7nAbQoK0`fIvM5}PR9<LDg{X)C1@_9BkB#kfc%%(IZ)~Z z`O;nNn%(ruex+#8BxgHHY3WBtl_$MmtfsQmDK%u5M|I&!uqJkl)q|jA&rO*Q%P$9}KHc^|81_qL=|%LD zOKW4MEKZYUw-bCIoc@4?$de*FuCsM_W%IsuvZpVAeJ z-WBYQ6)at_Qi#jPIR6wEWfjSVdBK+K&MTj3etpxFrtF?p?7Cg7S8w7nzD-ypgDKZJ zxGhU%SFnV>oMmZQ6*NvOt)NMA9)m zX+vN5+t9>?f5+Bg=hk8O)-z{dK%$P6QS06pweEdEYo+XacrP@6U4cQ$bp;Ty3FhH` z=CkSMvrbe|>qZr|Zd5_L52|QxqIxtERB>0~3G= z_Q&QyJ{h+?9053PI{vZSqy0YNgZ;Sh=j>_C%F6EbQpj5lT$)4*?)h9`Oa)T0;7xZ8 zZ7fTnxk7b>hA3NOnh2Hft#+8b`3}eS4!}Dlcy8VPf+iKkhIy0?!GNBKHv z9jss`)xpZstb?OF>cmCGHZQLEWOwOy_|n(@r2|d?vT{!%pbJ$zlL$BuDBr`5jpgg0 zM6iOHLY3(L5yD7^UV zdmB_Rb_fJo+n+{fU=}I_Ng*X@PoihnOKd>iOXM6Vb%6EKZRDEW^vYqWXwW2Qds6AB zM^BaqZ7^0*dFV(DS>;JpI2Wvm9Aot;X!&zfhQs3v#&R89sA8D+9w>C#Y_8WMwurQ+ z9s>wsg>YD|_Y?S_RJSmjM0E>`9%v6rb*rZT8r9XOK*711>cHHdvuIo+!bK=gi=w(v zs53C2#WzhvrQz8t;%mPdI-)TfvE#$#@Qb0DDi1HjPcEI|xe`B9Uz6qg2Z0ZWA+PH( y^G(^#E6-TpN^C>V_;c%2byleJj`m}%#RFq$v+4o9IPZ!=Tc$qP*Kc+0o{+x_d1LVa literal 0 HcmV?d00001 diff --git a/test/constraint/equal_radius/test.cpp b/test/constraint/equal_radius/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/equal_radius/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/horizontal/line.png b/test/constraint/horizontal/line.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5e46e4b93ef7b0e43fe0c09be587880d1845f9 GIT binary patch literal 4329 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 literal 0 HcmV?d00001 diff --git a/test/constraint/horizontal/line_v20.slvs b/test/constraint/horizontal/line_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..8909c0f1a84a97aaa2d612e129ce93d7f2ec1bdb GIT binary patch literal 4954 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 literal 0 HcmV?d00001 diff --git a/test/constraint/horizontal/pt_pt_v20.slvs b/test/constraint/horizontal/pt_pt_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..6a38678c410683ac5ffb8e141d87c02dbebe270a GIT binary patch literal 4996 zcmd^D%~IPi5Wed*dXC3-pu@!nN@;H$CJgk@=|N2dcyMeZIf2mWL$!UuuH=<08OyOv zIF$>N{r~nyyUFiAe=mz{%Pvd0WQ+4_N(lMPi%l8a1=}R7{~{z+yOJfxK*P^DU9;pJ zXE%(qe8~io#eG_SO1Y>KEm(54VmEMfxLSi4I0=N-!&g z(c>(mPiI9gDo)e9Y8W)jKBjB2&~X|Kv82*qfH0kZh=sE?Et8+*7k*CH01cGfj|-M1 zE3JO1JE5!S59nN^=s1u?!dm z#O8-G{@x<_%J2|8_JhW96+FF7^STWpu&bl~&#HMrIbF+f2;@9KBBD^%T9FBP$&Grs zaUVAh(cYG3z7qAgj(c6l{jTTUz@X21AWN>_ujKmu0@r~Y2J&@j|Mdk1kn0M_j7?CF zU#C8wu0HS0s^t2!D!Klw0{1mpmFjj@XCu=p_3gAy(YNzDR{uyPw&{x5arXo78ziZ3 z;~%LG9SqabxSyat%KL&nY?!FreXWUVC%}_MG~rh5c5Ab1#!@ZL4eXgBhXo1AK@Ksx z)Oo|~l+8~{XJ^7?7g zU33^Ad&8>{9{`8>mW|LA4rhOMSH#*PXd>3BFvE!qlac|$*;c_3f_oF=8y$^3LY^N& zhF84}6{`+kReHno0Y5Xp<><>r&PGHmy7F)m+N2lfnI+yiC>Fo0PU|zKZeEA;q2|={ aX>p3`4t~RNLQtgGrI}yJ>f^dGK*&FDJ@-uj literal 0 HcmV?d00001 diff --git a/test/constraint/horizontal/test.cpp b/test/constraint/horizontal/test.cpp new file mode 100644 index 0000000..4e07438 --- /dev/null +++ b/test/constraint/horizontal/test.cpp @@ -0,0 +1,25 @@ +#include "harness.h" + +TEST_CASE(line_roundtrip) { + CHECK_LOAD("line.slvs"); + CHECK_RENDER("line.png"); + CHECK_SAVE("line.slvs"); +} + +TEST_CASE(line_migrate_from_v20) { + CHECK_LOAD("line_v20.slvs"); + CHECK_RENDER("line.png"); + CHECK_SAVE("line.slvs"); +} + +TEST_CASE(pt_pt_roundtrip) { + CHECK_LOAD("pt_pt.slvs"); + CHECK_RENDER("pt_pt.png"); + CHECK_SAVE("pt_pt.slvs"); +} + +TEST_CASE(pt_pt_migrate_from_v20) { + CHECK_LOAD("pt_pt_v20.slvs"); + CHECK_RENDER("pt_pt.png"); + CHECK_SAVE("pt_pt.slvs"); +} diff --git a/test/constraint/length_difference/normal.png b/test/constraint/length_difference/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..49b4b584b2d502e767aab538495ac3bd7663cdd5 GIT binary patch literal 4490 zcmeHLdpy&7AO9F*3Q<`%(T#I@sHH2R=}x-n=rD5|r3*>!ESD*d9^E{3dR)@Mizg+U zEm})9n>vx4La`B%3muKYM*&zt89U{=6@r{gNEF zZ`PhLa{>Tp+uLpU1^|H@`J&Vnzm)AwYXQ*PX}@9ZuE>jTo~{jUc19=G9Y4S789BQ$ zJp4N?58TxIclN9bs%TmpUe^_$leY8Z0y|l4#}SLm6ZEZeNSptZ$aZ(Et;f5~0x-w! z!T=DKBPPO}tppWF&@=;J(r2$1jAYHrY4dQ>8XT(eoG_ z5BgCk4JQGnCuxp{aki1jorNH6`%tN1qFHV%5FC}APj{))UpD4)SkNX7ALILS)+PEx~n%6X#LgNPI0opCjQh^4j`@Zj-6r}HA{)I%f#im>$B5eat zJe)O#)wF#24QC7j2n&=TeU6(163xbxN;qu&uE5DVH#@b35L(!EB7Id!2+D17 zkBaRHC9(?L9j*}b#MA*lR=9mo^=_~*jK4dV)o&6J7_BkqZbpk`0`K{O>c77VT^A8a?gq=p(9h{^)D(mqgNqL5l<7T7keZf6W@GY@a-L)J~<>%oIc>I)%1=d^>YL`w>DO!pdXIdeZPmfd?Tt2IF1S|ow5 zcYp92_j!9Fx;yFg+}7HkE4f_y%c>pxymK#v0=C151)G;EvS(SjPsC%!D_Y=HPi$ep zg%c+BsjclgoWju}TWR+!yUq)|2Z?Zg_8zZ)s_VLmhIXS7pev@wOj^`-Qw`10*;?GzsD|!s zjKwy24#`x9qyyNEXoF-9LfW@Jjvo_Eta9969)vO@MG!6^E0@x_+;j8U5)WDRIli18 z^MoyHmJbibmGnd%2xtmtVi?xPeY_aV#DTKCZcS{Nk*^%tnfQbw=-PvtY8gXqSc*mR zinCf{Rs_DaW=V;CJ8gIE42+H(n2#{1O*J96*{PvxlS|n7jC}p6rnm4WG*V?aaR#lJ zflkAh2Wgs-mN=Pm0%pR|AM|VS9T9p6tqS9{ZRsNu40&%~<8CDd6UkAFt(F5P^F5Tc zlfDaVbN+SY|HgEcYtHy%`dlJ@v@0n>=t5`FdR2H`^^RRCvL%D+hra!_wv`1x-K#h^ zQ!cgBes2nWyqx_3!{~(nfZ_iQhS?YzSAYb_wenOfb+13!AxS}t9ICvLV-{p5t0$CI zynZoR1;WSQS^s5)`l(hk+*LvKsy5kI&lNa_1sJ^(W$la1@)3 zTv8rezOV?gjl$wrwEb`Zb2(M(&uFkN3o^lJDEuB`esW}yV%)d<^}t_jU7H8m5MWrH z9UnH=Ca>&HyQR*NSRGh$YptsP);wpZ)rfCUaWaLQPIVsYYTRSX=m^p(3Y1!e z6X+&IK(dH$xNr{vIcnTxXOWPAB0FtlJl24Ux43vo@X^piIiUw0T@N#I!MP;t!FFqBLO_@>xYb`Sd~}H&wUT}`^C!`S(3~31t#Wwr@tn#0O5o|nr^_y` zVfZJP^k1WNN5AU0RpU{_+Q%Lc?(6Oj58yvHAkCsoDt;j9;Aah8T$Ehun{~t{OL1K6 ze#2V$sPB-h(T4gsh3e(Q9vEi4O<8eBwz{eRDO0#I;|-V6#jNWwzFp^jp`LY7D?O8m zp<-dx)rsW!%v7K52M)=-c;Li~WrpO(Rkw3ngP$!gdPwOJTV8aU?cI4s&gDf@WuDD( z4Y6R6P>CXkoE2ZG3oS@h30rvmp-rcN=S_XlGswIVUCeQAP(0b=)qo9-%EG*4UDje4 z)_6UF!zh_L*Rp4ZD=$ZwNpA^GB^D~;m4rwRO6qk^U7X7r@Jiq zVn&|F5g|2Z_CwYo#unx<)PHU5Vk9V=nz`e629Mj%91JYqTO3w&IwFa-<*rx@BJJp@ zC@Qkbt%B(0voBe8`OHuXt~hSUC`z6rs<=l@mNm0wdTwlA3g literal 0 HcmV?d00001 diff --git a/test/constraint/length_difference/normal.slvs b/test/constraint/length_difference/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..1d85e47661260fc0fa6783b2334a21afb9800178 GIT binary patch literal 6129 zcmd^D%~IPi5Wf30dXC3-2-AxXl+xZhOc>~)(}S8Q;K8wtzu&G_EC2rU_omFZ_@+V&Jiod_K@fZ<<)#WB!fhIfUo1)WzQXAYX!8F8t#SH} z;1wpgSYRs2i!v`sx>^ZkNu-Zi^(iB?PL*~=@Di^=xeEhC8P|_0NcvABVlFwHmqaxZCsDlKjXlf zu9(EL_F3*bNz8x^zzB6G{t^0TR$m>d4krjs>nqY{2JH0X=s5V8zLWnL12zEt`g8oW z!L)Wa8Aar`A&l)n5$^fcW9>YOvEbXo2Cm(*fOP=+LvjMGYwb#jCcc%2>6?2vb3MR3 z)`VT#-l33cKxm*i4#JuC#vy!D_g6)o)qB+SBkNmKPRltvm-t}0=%{1$z;7a_?i zO0q_|X2ATF3|Qjs^y&&7CCGtd%YG6|l~hq!XdCU(47O~7;g(@O_gL=86P$h#sd_iZ zqY{Ubn`p+>ftiREo^~C8VNxH4mSgLrb#Q_iRRbPNGpZ4s*hV&jZ>ehQgyFI;X}|1%UVsIx z*$Zqysx#g`4&9-}Oz2(^tXR%%#!8f})?3biFfdr{Np*@Qw8z@x^_tx?;dAQUTup#N zbf0>bL?bvb6AjFXGwF@*l!@?1q^dAaBtEu(m(moG%}}7#q$a=0iG@u{h3V~7cB&3A3lPl35|x{OC&@0)`07%slvmVvR9sr zuYJgfuI1ZmGaCES@O3KmAK;^JWQWX2iA&R8*j@56qg7b0 SRutFaKJ}edcwHEeLGTZP)kV($ literal 0 HcmV?d00001 diff --git a/test/constraint/length_difference/test.cpp b/test/constraint/length_difference/test.cpp new file mode 100644 index 0000000..7f8723c --- /dev/null +++ b/test/constraint/length_difference/test.cpp @@ -0,0 +1,7 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/length_ratio/normal.png b/test/constraint/length_ratio/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..45a41c46c3c079a5b6921ee1db94405abfdcfa98 GIT binary patch literal 4558 zcmeHLeN>Zm8~(BJF(e`)h&PNG8E9^Tn0&~`K*5g`P%wmzj~U?y69&q(E#q#chBLCYHlUh5;K1Y!WYS1A%mm#rW!hfY@7<|MZ^op3@)CKhL?(x$oz? z?)$p#`#HHQaI5LE*OmbQOt)|I3kCodHuE41p*MB=&vyY}er~&;@1C>^gWbL#c5Zp? zc+Zw^Y1;x%a|U}qP&QoJ71i8zcQifW5$=Wkmsah2=Vjwyz@Vab+e*3s= z%r_*25FZb~*Au~fJwSPYKmm#q)d0L?&jz4D-wODg7r+3*0!q9OW&&31#Or}$#(z_g z_vaVMbQ~@}drJFRt5Ei#_W(|&74z!UEaId`_>Nq1h5NNTJqk@?ccR;JiLJlHl!ws! zt13r|758D(T+2vT-LDDB(9+!jICg%?FVe0PwR?aLzxe=mjlj9z2pGm5{S_Zdl4bY0 z=S0Q_lYb@M$cOkzg^do3>@p5Fln4X(mG(QQ{Zm@5n) z;h*}Q?#JomSj=ZjUTm3Euch$vz;PX3567`s?S%kXpEO>Ia|Tis!G}`<7BZEapo+5q ze%E~E)_WhkzWzCTXCx;4t5h&@RZ;VXPNNlK2?Vu009)Rl1Nry#DukYUhXLMVAyYrB zsT2vUKcBDs?t32zpSMpZ!}9xI2mIAF3A&wsRs0akHwKh5OSZ>Rqspn8DbnH0t}C+2 z*!wJb=2*s19DO*$n_`n$Dg{6B)DlhrrldYA>z*n`cIz=m&VQT)wytD9qFy{M@{-h! zSSOKkhzGn!#}aOVp)ZH5F73ul+-WM^eylxz1JQkWB>9sQNWr#R!`Zp>6>@6@UL;#* z?++JvjT@Z%y;?Y^^VnAZbk-WO=V^-D-UXwiUwlj2z%mw=F-{UG-n{oiDkfouxq!x^rS(k*oR%=m>x;>l-iOOmr?)BtyTqZ9_ufGYfg!njC{H=aiBvw*_`LT87g|Ciyj*V$B^|nQU zb+(wHS|mPu7UVxPk>`?J)qVQDJ+kHrt;)-F6M@CazBr~vYPt}KW-t>&*Gx?S9eJ-L zdpuoWUgeKqS0d%!qvPFNy{Uf(WMRv zTGYc5{SYeVP3;ytR=KnphHiazGow*SVC9dkuA*nwjVDO^$mweJlVVEgW$Dj}n)R^d zEi`-Pqiy>L+agWXuh{4`yc_mGHZ*Vd;r+s)$|f&e9q5=P=d9 z+ty-sepS>v|FNkGT{Lxzo&1kBvtDfeXRXV0G~us}Y_Z1u1HbY;SmzX01N34J)Gd+4#YM8B-*Pi|=UMDDLcs z3(jjznd0N8nDXJsl{X(*=1h`}h8T*P2dQ|D%i#}RA1?HR3EZ@1voYeGm4LA~Mn9Ag zbY=rXDMI>Nfsx|1Y{Ls~gMB0Ums(&Hp=-1L0GNq0Lw@DT&Pz6SHZ@;G826|G6ruA$ z{Kf5gWy4P7+&grP5wPxNP&e3ztO1G~K|iI;5_FX+A`SJ$IqNwv$`pcW6dPv%CZD;O znr(~F^N}5Cx@FXxzXFU5S6MKPG9AcC1_wM9MK}sA*Cs3{E9W3!NR!~@8)ne^v4h%P z&sS^Is{uJpke;x{eg&LbthDI#1B&##*>e(PqlQl6q* zNAu>AiX8b}8XWI1FSo^nEleYx4wY64Shu*4~tAFO(OZ;5XOH<(xjG$>H}VC*UpTvZ8a;4+q{K@`|k*Ju>x~ zA!W0|l`Z{H)L8QhiT9+hAhk^H3|-=@ezN8vu91dZ9`dK{YCpm`KAqYw8mK+MqGc%K z3sRKH*@FW=iB&1AuT^F~pEeNGm!z}?d23HkHOUh>g@bPTi_3ev?U=#qyx_n#co5yN z!}l5ex-`GzhnUGWvdn@2Ee(wW4iz?UVlXqm1&BD;!*M~ysI-XU+DIdCV)m4rJD2{( i-xLc6@DjKGD8^CwFiF1aZRqL&V7q^yU&SW;(O&={ZeGd& literal 0 HcmV?d00001 diff --git a/test/constraint/length_ratio/normal.slvs b/test/constraint/length_ratio/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..08957de7c0fa9ffa5b21958eac26efa251c94f00 GIT binary patch literal 6167 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 AtpET3 literal 0 HcmV?d00001 diff --git a/test/constraint/parallel/normal.slvs b/test/constraint/parallel/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..8584018f38c20d3381b33e4ad67fba333ac5514d GIT binary patch literal 6041 zcmd^DOHorw8FE;K8wt>?DLve^lE)*wtHdEWZ*? z&4poC`}+2iwASxGe{YIxi*HJl;KkJ)@;vVgDK@45=x^hI|3V?E_a%ps(Hh6^ z2wq`=^8{ByoD^9>;?;^93t{z?mY-8n)v>fL30~rrU+qwNd)Jia_yN`Uwq2}OZ__Hh z&u}a=tTrXMttw?laE4wki@d4{O7mJPP?iyIdr;591apWZL;V!31>wqO~F#S%-Ic|n$#s5%(3)f29h$61=s$_(XL7^0+3xAWohwNCkmj5wA^4T0{1=VAMg*spKd=j~^?YbQ|$CIA!6t^6n0pBcOggK_D@7J}`1ME%r(S^ty-jsbwiw*cq`aDksU zxT@_*Mhe+&2*Haoz1j9P#2-Z)9eE%bm_y;vV5Ji4^}dh`e5Z|_Q7#K>pqB%ZC_jy(&5tm@TIT) zO9$)#%1TAcX+)qdT8Tg>66Jds5iDOPC4!aABqCV3O(cSAsA^-v@U^dT|JngufB~$@ z1$scrJ>GsC+J_c(p}4?Rp*XjxDw4ihZ#fOZz+_b<$rL4M&$TD&HN9v2m)JSE>IC`H zee4*K^umFaC}2)pNpF6#5ZACdsuK1UDO=1c3C9wMx=>xT2}D&2r=C_0fZd98V%S}u zJ{rxF0gn`h?BI*U(6#PS sLyy^~!3Ce*`Pp%x{m8ZaYBID%{RpqQftd;uMYc>mo%8QX?ZET?0TvZ4p8x;= literal 0 HcmV?d00001 diff --git a/test/constraint/parallel/normal_v20.slvs b/test/constraint/parallel/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..56abd5eb2a221cbb2e97b4e455695bc008d62081 GIT binary patch literal 5949 zcmds5J9C>r5bpUKsl@=YGifLs$4Qs*$YZC-q&Q1wn=t|mNVc5Gk4o|fvwQDD952aD z)M?-Q?Z@51?>~R9@^nkD3bLe&iyPv3-j_1p6#j$1jRXD*g{a;YG(H8H_@9wAjo+2@ zj+QiA(n^S{$E5h2lvN!|!=j`sdgoWqq`1CmN;7&-YI@x+*4EpkN^Vmc%VMfc0b#33 z`IR&!FXwqy)g?)?S}RDJeoEHWLe^<`tVt37^nQuLlQq;0DeS)sn#SJQYQhivA|7Q~XU_$NHZzU^Odd;c5Fx=6aGafC<0^cdPyh z{wD^n!eCta@Cd=+mJ$b>A|t>Nx?naOpLum zDwgcp-@rwhXK=j(KZM3pzQ#TiDdAgXn7?_36FUQ($4ckSggt2~f-O6-i*j=wa8qK5Qu8=u$E5jMoYuPsx_2Epw z#2ExrAASUh5DE;nmk5QT)`07%>B7pH<4c~Xulk=)YE{e~ zK2UU)=W6_1eS4L=IszYhhMdm>K2jL6y*Cm=*ZPbaddgl6&iMAu&yGFqN3P{plcCM) X2lzf4n58gLWXsg&ZT?=V19;v)A~qGR literal 0 HcmV?d00001 diff --git a/test/constraint/parallel/test.cpp b/test/constraint/parallel/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/parallel/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/perpendicular/normal.png b/test/constraint/perpendicular/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..8acc73c86ae22bd104ebf68ba6fd237395f400f1 GIT binary patch literal 5015 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 literal 0 HcmV?d00001 diff --git a/test/constraint/perpendicular/test.cpp b/test/constraint/perpendicular/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/perpendicular/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/points_coincident/normal.png b/test/constraint/points_coincident/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9d7e92f758bfe84f32ae4c5bd8450c4492f01d GIT binary patch literal 4223 zcmcgwe>l_o9{+6fW98~5H|dAybT9QpCKM4WrShXrHHPq&6v?mTR|}(_eq7S&s!e~Bg_<^BIZvxI*KT3t$K+XvvE68PklgP&n`7KLbmewUL|nqcwnm3xopa<{1MLE?E^UG^7FW^nX=k-&+5~7%v!`w6E?S8m>NR zC-CkZ<5n`oMd1_b)|D&RucCY})S3yq=v@(3!Y!G_%fqzLzx8msP7PVAXiNw_46D$D zn|N$X6aZMW8fD$41$fe90qxS%I1-Wr8~+Ggeo~Q*W%xKf;0p&rill}}7LZE7;0#Ns(yt!FB$E64M@ldeg)Y)QH^0)Q?w^my=*Sf;K^qUH&D#y;V z(&7#qu(RP*$3l5qpNq2#`r8@v0O=-0DeRt=8Y7psILZrXOn5`TIxq}O`30Y(c*_p6 zFN7~_#VseQ!$Am?rrMHXopu19U9|}XaN6?bW+5N8BHtmZgRCi3ahDKwP5}4^7a2ux zCHXc-6;4&oAYB$cMg(+S8=|+%+xlD_Q&12kF$Cb~VOevt$*0RIJ0${;_7pqE(CmBq zfO2h~jLJPtr&!7tp~!STp;@R0@`7iP1s^TssQ}nT-rQ`F;1kHmr6<0T3k1OrS}MkX zj14k=!A~-UlrPi~XoaAafq^Vsn>DA}k^;QtenEXl766n>^5$mg6ojY*14DA1;)6iL zI4==E`{n$icr@slE1ara@6rN%s$xM}ejk06ysgj0Hu$E;L~Q`ff2Vki&AS>Yc0C4DSFKK(p3_%_y<(h^8;)$*LAPQyK=B{ykew96htGxghn&CqrS zSBz+oJMXWk?=O3w1Mm}Wj%oUoWK820$u-fv$r%Avn7LBro2K)~8cm$r?xVoSk^h2U z(&s4eeyG3#8MkOJI0dKscq(wHd^2-ejX;AM7;Iw+;2Z>k+Y)2KLEJL5hQZrAzN?*s zYP5qtD{+c%fAv4n>CO;p0JhLbcZE=#K~X9{FW0{GMpDwBJR@w;8oI1-euDUYx5@U~ zsw`x!E2Wj)i2RYwlO*^FL8jj%H&bdl62HlbR<>7pm`x{#xN`f08z!7CkK6}E)bNQs zYG*{~J56fx`tuGM>}Ibbc1Q$cbfT+jlw8@@#BSoC|DJi8&#L8MBOL6V2{l)-#t1Is z4ul_A7sNePiEM*2IJEH%WNLydPvI{j0RMb?TNXi+E^0!Zkm8*Bvb6P+PBLedCU~lIqZ7atC`#|Uoj*6w(L!dABX|4U&R~; zq%AUMhE^DM!i<^TqTB@lrI}uF%l&H|U>ZIUFZ3c;9Ke8q7cw8`<3`nlO*3s)xehBQ z>|ACzJu8Y;xn&QtmjP(6jM%ytUTlgenVC4|u%w>yVw1azzcv?4b220$k?#yP0zi~0 zDs1J#OeR{+3||Vmq_7uUNpz@nkwTdHf`~LdJ0~QU8;9Oi11%XcuX^S`q}g6L%SwD9 zBxxYQOBjd1pElc>{?jn}gTfi{#m!C#+?5BE-@Oy=asu=1GCO3Pi;^QZQYaW6(qyI3k*$f(tfo|;;q2>VJ zE9F)`_FB}$l0yKFx@kcx{(%)dfQwJ9y{eA^bz!gI%#8bsLE2VG6K4l^K9sYL#@qXyUDg_(EQ?T| z00B!vww?57-ZOZ6`0>D}XcdwMXEDJ$A;w0OmlQk5?JT2s)$IBhuc~Ht6!IBReRn{W*t*iLB05*Z=#(6*JW*XH^k{xP_N2qh`xYkR?r_5j_Q{Ff+=)%z zcA^|h$!Xh4yWZA-*F*8m^|2xrbI3MyRP0P0Z|Ypv`I^u5Gh#6>^mcSbv=gPfW9+cX z3dx{LGFCNYu!cS&=P}{UPeayLFys5Qax{R|ccp%3qpdyTxRr+# z!C!dxeWBSRsyNX!&$S_J%gB{PJv$;#cs=eD>fOt@BD==%{c*OKl{wz5wk}CZZI|v_ zib%)*Mta{;@ULs9!?k$x|0YTkSNvGNQgF9^Je%-w(;d6aY0MVq*OUQAS!j7i`H^Ua_b7)peViu{AB(RX4eo-X%qH zld?!hSZs4JTNFl5u#`TW@~kKYO|r6P&@|=y1zT>jCC%!ffP9v0iiOU}7%E~a{dfpT z;}51N*oNlO5Au_oESCzz4lF|y)>!JuxmYq`@=(YYcdU$WXGu28Q<^bUq;Z+-*jFy@ z6cwuU!S_QM4+?a{zr9f&-`8@^irjnq{zS2ITqNrxtJ)+0yE>KsqOccK(2X1tPfiJ> zANaEDicH8;ZqUmO`?#Tx_I5ON6{g2^*y}p%cRhCo1})cLHmp;+?^JDS0k>tK{+c$}WG+><9b{ZggsJex)(F4Hv8Osj)55okQ^I#jE5bU4P=tJa|r z%%nOr^0e#VSWb1~Sh3xM>pXZWdKfPH_`K+V36Nd+!bXrLO!4eSkn7mk9yT@&Td&#( zjbJ7|^x2?0{Z?^P|-Z(EFyc-LGNix~j9ekWaVw5V$S{};n9jBe&JbLj7~kk< z>=|6$5S#@341_=2JaRvTC literal 0 HcmV?d00001 diff --git a/test/constraint/points_coincident/normal_v20.slvs b/test/constraint/points_coincident/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..8b072f7ee4bb648b1e6256f05e7d936e46c6bbb0 GIT binary patch literal 4998 zcmd^D%~IPi5Wed*dXC3-pwo*F6liZ9CJgk@=|LnS@!;4-asr{#hidzRUCAq1HkM;M zCi}nN?rJyr_506tmTcK|PUmcPc}oc)pLw>)y_L6({PHhAQnAZfbP6>5oYFOm z-f?!%I7{bDAXz-b`KOqRBGQ66XA5@ki6@%h+%~BxThfBvw3938Z7kxughe_SvB|-# z5Jr!)gg&2VsVF#&)1qR~B)N#!Vy5FX8e&eRK@Zcc{li>1Thl!HL4M-rcnzt6QvKtM zB@sDWEEIAr0EQ^80n|BUe8ITMNWm!{STSEs;&hTHG-aqr=S93_Uo-xos8E^@z8}hf zQ9x|&l=1f#$yJ6&@2NX!ELXquF0-F_w4?H9PUlzmUWF3rELz#!$a0ur$i z>fvGP)A8!lPE;k=jjH6jQ3dWHs7iGk)yY6urM?a87=0Vpq53BZ*s3cgr|l2CYmlVA zo&P{}=wO(Z@$RMmAonx&xM8BGFKkUzO99?2q6tg2+^yBF8FRHcH?U~36gDKFgB)UX zt&<=$#AA7w9^J!9(?ehgPi>o4Bh`Sgf?^nir^XvXctrP?X%QDY-6C?C`vhsaeifyW z2Fm3b997@^@Af@_tTf|mnivK=KFENx<<^{S&`~9sXg2m!d0U{03J3OrvC$q)Z_8CM z$}&7odn|Y42~NM1sX7m+L5a&WO*G@`AWZ}sPrDA~Y8@PovGt~Ps0A~s4z)b(Iyjb7 zl{i*x`|LUoUW@Mfi@xj^?J)teD-Uc0X~GoGZUniGjqQG8Q?vD^jZh0_R3p@48`%i1 zi=wR)`pdpV`(=Cd0-PU>UVz>=m2H0wTh~>U&6Rw*z30ev2{k2mk>lp61bZZ+PI>(_ z=`Q-`5;5PiF?W?nZGpCz#9AY0BGg!z=|qOXq{nnNRd9yj;>7p{M`O>BKR3VT=+i|GM?fq(day~a?lVigby6&TUYwP8OgV-%&c~8d_O->yiWU5d UUq$ryp#T5? literal 0 HcmV?d00001 diff --git a/test/constraint/points_coincident/test.cpp b/test/constraint/points_coincident/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/points_coincident/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/proj_pt_distance/normal.png b/test/constraint/proj_pt_distance/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf90ed22ee322ec76569722126ac1386e4671b9 GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/test/constraint/proj_pt_distance/test.cpp b/test/constraint/proj_pt_distance/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/proj_pt_distance/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/pt_face_distance/test.cpp b/test/constraint/pt_face_distance/test.cpp new file mode 100644 index 0000000..298ad90 --- /dev/null +++ b/test/constraint/pt_face_distance/test.cpp @@ -0,0 +1,12 @@ +#include "harness.h" + +// TEST_CASE(roundtrip) { +// CHECK_LOAD("normal.slvs"); +// CHECK_RENDER("normal.png"); +// CHECK_SAVE("normal.slvs"); +// } + +// TEST_CASE(migrate_from_v20) { +// CHECK_LOAD("normal_v20.slvs"); +// CHECK_SAVE("normal.slvs"); +// } diff --git a/test/constraint/pt_in_plane/normal.png b/test/constraint/pt_in_plane/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..a368ac45a46dd120f52d696dc5b413c9765bc937 GIT binary patch literal 4211 zcmcIoc~p~k7JVeL%QmMa#Wt2*UfP!HW5>V?{BB)r1 zfMjOSs9{xvP?qp14ogwc0|X@oa8MB=go=?81m=?xP67ovv;2{hbH4L_C-2?gefQok zXTEiJ($X-}001rLZyY@UF!+xjH5K#;?;!IjfbK?T$1QszGJ1vkgS%=Mo_bWXg|cF} z_RCudDuq|+{TFVraSp~=ORG};JnXU4bEE2V75n!KTwZ@UobKd95;*>$xya3?t|Es97t)V>6Q}BMQlJ|0?o7R1t z&*e#SDKR2Khm?AYYb0`?S0z!FrfaHD}<|l&*}yl1qct6oyEN z8o9Iq;3RX#`KoW`2{(bQqpYBShpc<83g!pme+PmdX)RnkN1PDb;@oIeYG96Oxv5ngt`hB zyxOyfO2Gih++5+Y+`ZF7bI60*psgn>$gwP7NR{Z$mnQHb5#6Zw=SU4)Vvwj^375te z{h-kJ;TxQaXng>ywRdLXAj99cj0z!tojey4cc57ZTz`=PI1pIsKS!FPb>Un4mV)sLSpnXUWGKNx^12BCk@B=Yrrb5ow!S1|0lxxE zTJP4XrO^0e56|d9bAW^2O)!7D1Q^tm9uq^S?&LWsrvCaeU|y5~__8IeX0B4w^|%EPrh&5nyfO>wvw z4BVQ+x5*@6Tmy^uw6s^K1O3wfSUO0?V^2^T$WdFqQ4*2RXj3ye*f_&e#sLYb6?39` z+UFtRGVaYP+9J)I@SsiBfL!`dKmlfJaZ!fX9{@t%7VF*Og7PHKYR2W2GZ2)hxn#i& zC206dyt3}wvS=()g=&(irNqc*tER~}3Cj%U4UNO zk(VqUhbDL{@*^}!`Lu_U!OD?0^$|lg4mvE+Ztmtx7ZGhAS;#5&7me}4JI)dl?E;*Z zHB$4h@wuagIUONEue5UF*8G6WF!Vc7l$(D?a_~ycE*jgLn50Z?ZeBust{tLEe5Kv^ zHQEQhCOs;B@0LP#*#V5^LF>o8g_dZ;Cn|0u%^I1h2u97S2vhEc{pwr^hO@CUL6@{H zSRF$d7Zk$D+1*zGypN#LLz&01+`y?DGpSDUk}>X>B%*+SWbfpRX zrCu&7qlt)L)Y}XYFyX$4tt&5%U_CWmG%m(R52^tDiM=1HqZ!jK<_}qEFCb9*B+~0j z;6Aer|JVB&g{|lA!-D>6t(+izA3(yS6uloUpwj|Xi?&gO6Byl(ju*i|(-(6*f{kC& zJ>T9rc6QbfAA8Ic`jP7S77ojeAcEwt;?;8dyks9GTL+FB*%WZtj2te@_p{rb`pGdB zSn9(tp}{8f>Dip_Vbk+~OZpX?9r#NvXWat~eb)m$yl4J->%YICjVlZ!VN0;68A-fnrQGWZXeiA@-Uc);gM-<~vf&-JDu&rN0)gY#b97c|^ZDzNU<}OsVrST9L&oy*&7& zvMfwQ@pa23ea0ikZDAPVQ;#208nw9PYWMcT3svy6K0=CNu+5sTC+%9PMzR>KQTwPx zUEcLR4pM_1te7|11{H`6Mi1N_>4a=?~aHlKnMejz4F#2eF_sI%+H?vJm&)af~K8vEw fnghpwZcI7XYz1?bKyU{AGXb2xc6ZF%N{atC%F&F% literal 0 HcmV?d00001 diff --git a/test/constraint/pt_in_plane/normal.slvs b/test/constraint/pt_in_plane/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..1bec7188757e44a34238430fe44d5c7bd7f57f52 GIT binary patch literal 4495 zcmd^D%~IPi5Wed*dXC3-pwo*FOiO#~FkzsFP7lISz=I67{W=kKM+x9qZ@DO;RhQ$olWDK6#_) zBwI1bc*;r?ry>_JS*>bk6qff{@i~)al^E|rvL#yu<&G9t*Ig-Rx3pqc{o=-Yo0Zv3 z&Jt5$xhWuQSz15Ia{BmD@UoIL<5i=ec`kMfw%qU~;;u{tqw_`P6@Oh zg=*|tOvt`A8q~%^+Bn2`Tbla@GmttSOdSuWo_h;}l^bYTY5jSX)}I%&t(L<;-8tQ# zp~9f$dIAcu3GVUB+~?EX=Yyy!tshmT^`i>fm!PWLT~udB!m9jTSf}{AxE||&qJeF; zVs_epmHQ5o@^_(Mu!jvRt2RvP9S`{?7pebcA$ zrq72>N1On)l`mWb6~YeBT?EB9Hukt<(~9+~i_j`&(jv5Ko45!*%Iw>O@wU&&VcQYA z0Q}n71=xK%+5X$GmoJ)bF4WZ>JSIM>Z!8bhXTPw}MUSvWC;bIFmnw#c_bx3|*j7jE zYS#rf3ZCOw-_g~$8|C@NJsK_BDjp?xn+}%eYy6}AdN)L_RwW{iTxU3GiT0igj(P9i rIQpVGt69BXN=L)=g95ecOonb5qPl}`_ literal 0 HcmV?d00001 diff --git a/test/constraint/pt_in_plane/normal_v20.slvs b/test/constraint/pt_in_plane/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..946fc8a889d2e32a8cad39eb7dd2443ba0b843f2 GIT binary patch literal 4403 zcmds5&2pPC5Wed*dNu>t>GZ-Olcc?MGS0+3bb3&1#bJVhNZ5(f=|i=B!LGzg2#he` zy;xW!Y$6OSVHq1F&v3pNE)BJYPl%{M=3wGNsuB>;li0={>X)t1&Ls%h< zA7=@DxyVvca2lsYrJzZ28E?c~?9gUkE(j0B%T8|2bz#M9x<$MN11iA)0G; zG{B6n7&mYgSK^Ts%ZEvvPV$7N3?1pRhm=4p`;!S#P&`F|7eL^96x!_ zQQ%4E=7Yho7a5P&aa#5`08@?ne`?h=<#Zzl*^`qDRR+Fnq!JTys0})`VV5@aG2V_Q zF8(`Ghn=az?$lE!Fc_kalBL$2S8CmPL0c=?_vF3Me7b-^$z=y5VQrKc53wNtimOJ^zU4#N}Mkz7SSL7677k~HF=U7o?d|L*^=w;8I^jBjXS6mYsw0ZVsb-YB4@ zrI=_nHniM~=%V1j#b;u)qv;*F0;3|s={pj+qfSWrwJg=S{s$E<%QR@l^+ARRG@o`K z%H1&-j*0cAeW-yM)rVT0b{`zKZ&f&UZ1>{Ye}|^~{-&?TO?#XGIh7|4f(&7rXAgqh zHzsz!V^fRurh`xeGinfO*hUV5Yh|`gLVw%W=(uf4hR=L6p^Iu^ZJo3Ov@TT)5guGxs4%7WnAN5WP87V3Bfi0C?1^%G;SFZX zl!`|Q-c38V*Qe@=W?R YjI4Nouku4tSeKbUHOd#hDm)?o0K~mcdjJ3c literal 0 HcmV?d00001 diff --git a/test/constraint/pt_in_plane/test.cpp b/test/constraint/pt_in_plane/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/pt_in_plane/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/pt_line_distance/extended.png b/test/constraint/pt_line_distance/extended.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa6c218d77a0d2780a30121a2d6cb65c38fcd0b GIT binary patch literal 4568 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 literal 0 HcmV?d00001 diff --git a/test/constraint/pt_line_distance/extended.slvs b/test/constraint/pt_line_distance/extended.slvs new file mode 100644 index 0000000000000000000000000000000000000000..c73570db43d2fb691e1a8306963fe10587f98174 GIT binary patch literal 5668 zcmd^D%}(1u5Wf30dX8l~Q1#*i0@_=Jf}n@0hb7s7g=3ptCm~dQsJ1WInf3k#ukDy{ zYA%TRpKoSo$NT%w-|I5p(CdoK>Fn~B1VQkHmFp^e2sdfe{9;L}cNI-ffhPYi$cm;P z7+q3Ei#g?zJTLQ-rORcbEQ$Ovt3GFp*QwI37+uh1$hV}rx!tE0^q$o8rk!l0HyO|F za+<0L`MLtLoNGNsbMky%7QAL8D{8|ad0uX3bg?cLq%c7N`665KnaW8U;&Xz2LJ5iU zN2bW=id5;(;8$?ASO^eXuuP<|!cs+EvIS*24}mOyr1kt^k`enc2z3>MPaW9BP%>4A)XRQ zKaQ~Mf*b^|xp5~q>Eb4lw6`I-uP`01lTO!3x9h1lFlf1sl#%QAi(J27;5sQsA@-qEgaf6}Hrk^ZY}o`OEW>#0vD}d-IQ`nB>RsFpN*vSF z(TuADnuryib{&9WQXhtvW9z7OaDo|C2PZbW4xa1L)InBk^XywtUW@LAi@x-W4mbhW zm2YeWG|}1!xDaUD!y3V{b<{?1f*I8aPHZC^!MD@2b;5Ajm$YAYKrg`lv)>CiAk`Uf zABXPHLKC_d8dfalHnI|BtM!^OAPfvvds3aE3GK1=c)h}VCVWo4i=zp!5#6Pp9nA<1 z%tQloL~q+hbHCi=BS8W*WJn@f9pRc23-CUjZ#{U{l_ zQ3s60eH9VT6qkJ&-@(z?!^`vDWpEvcmQGa`9==mM!}BG6u3z%h&Ioe@W{O2`07z`o ztHsz7Z$0%EA6^j7(uwD!SaMZ;)-0M$pIaO%c3jDArl`d&>j!xEi|lX(DRF7~k<}$H gGG2w{a>;2knmiw6mOonq_X)&r?}y)5Mk5IR0k;>tAOHXW literal 0 HcmV?d00001 diff --git a/test/constraint/pt_line_distance/normal.png b/test/constraint/pt_line_distance/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..12a66c1525a042043ae3ce1fc97c1403f86fd61b GIT binary patch literal 4459 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 literal 0 HcmV?d00001 diff --git a/test/constraint/pt_line_distance/normal.slvs b/test/constraint/pt_line_distance/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..f36ada91c91f60ea57dcba293eaa2a66fd2d76b9 GIT binary patch literal 5571 zcmd^DOHorw8FE;K8wt#Eq|>l$Tvae0e^AoxP6O&vaj+cXltSdyB3jnh-0$^T2V#_0!w zSD4^3!&H*9s;Ef1S_x%Iq>p+1IVZG9m3B?=60btKL-oz=A+^N!sKGbwWFx)JX?|DW zR7FTPHJGJT>k(X_=kuzh4MBO?7zQeeYPZ14O}Rv+2@1#;`I;_NPTCO75c3mCNSr@1 zMS|C;PJaf!g0tn4gV=&)B83%}D)NdfG0}N&Wa%SrvWHn-&gue{SSq5d$+!4hMIJd7 zs`M#}5*CjXXor7u$31>Da^8wOg}d%VW#uZ8-{+-hlNju(RQ`*?ULk_k?2v@)ltB7% z#LCXeLGYRzcXE?1ZW2j*TU7W8)8RVlbe(j&o_hm>mg`8Fas7T7*Y6j&PRdcpX3pWS zD=sb904y@^l zS$x_)%Y7$_8L$DEpzg#!LI1?+tC8w(g5b2;=||(zX9n!_<6iv*e%fH#xQm1$^2-RO zW}pc7eCe=O4#mj$<-LJhuPWg-hVn>GpmnWPCDFw9@-TmQ4=1h%7>Am$YrFOpQU?$k zD8@l}s=Y}FV@)`^`^&P)o4slgwnRjMq^bHD%0U`ZuC8FO`yTzU_Ylb{E3!s~X2AH9 z4A`M=_2vj2CCGtd%YG6&ja1>`Kq<71_GkuMHocjO69zlv17i`%HgS(-YU zX?0*GVuhz&2Vj`ghoR-zI%*x9U?$bUiOsHq=Xx}CkQLiL`xcbfqWj^ZFa4qeP5|r5 zH#Pz@(b@=XA<(vmHG*U7sEyzRGpP}r*d{iDZ>MSNgyFI;X}|1%UV#1Quou{XRA;<> z9J)h`nb5r;Sh1YjjFl)`t=EhJVPLS@lj;;rXpgnW>lM3a!spbxIGO;3=sxxAXhv{g zCK{L{XVM$rF%#k6aH_&bPQorw5S;@Zi`+asr{#AJz5`b|tS~!Sai6 zYAzY?d%s<+*8ctH?`4^9>19Qhba8%7f*|<9%1ssChubu2ele2jT}9Jlpy6{t)-?UV z=q+WmSW=E;{*YClGsf#w3091*=xxZKNOg6+Pc7&jsp(Za*+_3Qp55d$Rl)F01!g(d zdW`1e`Lrx}%}7?%hC%ZDEL-!1ic@RwB@qTgOw;+pTo_%GD*YM!!sl!asezLFxS)9& zoUB$7xfTEu6juPM97?vLOlKtF!4)OL7pr=Ej}e zq>GzGXm3k$Ux_+gC!Ma7Zr5{fV9;kBDGRROui*Oq0@q173dMBU|8)fhDK`}mh)qyW z-ljgEu0HQXRdD^N3a%ej;JyV_p>Cr(8wsn>w_%;4Z{s>v|40IBx?&a|w@-NANfHKZ z04AtA@lVh{vifSII-DRlt#vjB20COoy>^$Mvy2n`hDAUxLI5W-j! z4(|TEsIz*fT12c9QGhg6KSS9|1Ldj`*1GS}4|^j)R#CDw$u$GUA2MKZy4H&$bW}qQ z6dU`g*=|rph6AP0Hrk^ZY}o`OEyH;1vD}d-IQ`nB>RsVRB`(s`(M+p@FcB*}?K%L% zq&^HS$JRmX-~==BtrLdJzNG!K19}1WpZ#7C15%yw_HpPAEn!0ULc@x2 zZVOhTY_(o9284mZYEPtBL-^g2rVk&gRnIUX|HX(1b3lz8{gH8+E`~+*gs|%*C>g z@r{ng9$ucWU2r%i<&KNoW{O(evc89peUTlmBqc6Qe@<;)fsBD5_y-gFnacnG literal 0 HcmV?d00001 diff --git a/test/constraint/pt_line_distance/test.cpp b/test/constraint/pt_line_distance/test.cpp new file mode 100644 index 0000000..1f53686 --- /dev/null +++ b/test/constraint/pt_line_distance/test.cpp @@ -0,0 +1,18 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(render_extended) { + CHECK_LOAD("extended.slvs"); + CHECK_RENDER("extended.png"); +} diff --git a/test/constraint/pt_on_circle/normal.png b/test/constraint/pt_on_circle/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..656005a3303a77b002ed2ead75ac2ae38be81b30 GIT binary patch literal 4868 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

T5PHZG+)?nB;gfem)f>k7Xn#rzj^e;T#` literal 0 HcmV?d00001 diff --git a/test/constraint/pt_on_circle/normal.slvs b/test/constraint/pt_on_circle/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..fea01e60c1c93d88f6925071ac97c96b44637a33 GIT binary patch literal 5637 zcmd^D&2pPC5We#oJ(~fH6Z^m+lcc?MGR`DDbb3&1Ibni<0Jh_F`cQ3Ouq(0p0VBY~ zIn|d;cC~-sev%gb{`2=XiMI4MB?~&gz9*JteaVtdYCqZAz$t$&ii&+og9*s+|Cp?4 z@F}A!n$dVca}+OxU7lE@|R|Us1|`(byZ3ku}>S zHrpjozU#2IbFpO|YTZ_?*QWIx^tUCEsWB~~z1GlPd+4z-F`!&a$xLgG%e3aWpskeb z*zC-y|Jo9RlFJS-#0Hpq?=v3{Hy^j6%Cu%wnbwRdXy1b>GuKfa9SJM5*I^xEuj6{G zz0ZMFtQgJg8UMMST)CWA_Y5-xeNr z0PHp`{RxJjp3lxFQ{SC++aH(yoW5*mUR37*A>?-nAZ7`{BcBK3h0OCl&uIbhmNYx-zP#g#0L`FjhT`4$u`0Ka`i@l%- z-$542ME{_Al+?;VX_~-T_TBlRj}fSflWa{Qsesc96)*zb%fSyARf;X4Mn180Tp{D> zustRO&Dr$!tdilL;dJZp+)^h5{aTi4oV$)HoF65k&S8CEE+lq(A3&i>?}t{!*GcFx+mc57@Eot7*PCT)OYS^sReoj~&2RDQP*32+Tzz5!ih$efJ|m#n(xR zP)TMG5h}S2B!X!qX<|bEwQoW9+8$hhYpBizRI3(GJs2)qWA z=QgNd>_G$??;nLu&njdJf30Fv(z%Ujc1ug$t6zQCpB!;nD<##%g$Y&jN&MT?RSj|vt zEI}8Z07Ks7sE~Z?ae&uNkhAbrg83btjeg7;9@Z4DU0bSND)t>dh+ES$6@Dq748?Q{ z6o=DKlZ$@nvV$33Ti>`vHGNuKlxJqiUrj^#n2lPt*Bm`&Qar)S;i1T@%H%U``4y(z GTh>3SAioR% literal 0 HcmV?d00001 diff --git a/test/constraint/pt_on_circle/normal_v20.slvs b/test/constraint/pt_on_circle/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..d36fc3b42166ffa728b3c2181b646b4877cdd65d GIT binary patch literal 5615 zcmd^D&2pPC5We#oJ(~fH6Z^m+lcc?MGR`DDbb3&1C1HYrAne5H^r70mU{_-GgN*-ZYE#>P^hzyM#tE8Me;B zEn~{Apb2?B&r((vBu-1MAW3o&uh?AXsVvxnaEC6IS^L3S3c4bB^war;|Kk;u21fP2 zbDBiX*>Wk6YXC67*f_H$ck?Vm+uDv!uNQuh1hZS zwSKEMXwwEB`rDAi)}ofsL2KxsJ@nX`81Ss6WUjTx=*oWpm4y*9fAoRlN*gpZ%w}pot0K3gde}dtsr?b<^ zH1ucP_J^fEr_XE3%KD8jh2mBL#2hJj5YvG%8%V`MT)k_!sj?KVSbzsLjgqM{*$z7iZg{AF6k>vkavVTxLN_NUX zX`aDU_TBqo4iub!G#`icLyNm;_G$??;nj$ z&ni?3l0r(*Ttr9ID}DjFuaRva)cI8_w~=l1(<}Q`qA`<{?Wm-s9UVm;^?s@KRHV+C zA)7p?2^UD3$TAim1g&^ml<6FqB$lyT=XX4ksBbywTvSqN52~wt5TG?j7eJhJUzh literal 0 HcmV?d00001 diff --git a/test/constraint/pt_on_circle/test.cpp b/test/constraint/pt_on_circle/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/pt_on_circle/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/pt_on_face/test.cpp b/test/constraint/pt_on_face/test.cpp new file mode 100644 index 0000000..298ad90 --- /dev/null +++ b/test/constraint/pt_on_face/test.cpp @@ -0,0 +1,12 @@ +#include "harness.h" + +// TEST_CASE(roundtrip) { +// CHECK_LOAD("normal.slvs"); +// CHECK_RENDER("normal.png"); +// CHECK_SAVE("normal.slvs"); +// } + +// TEST_CASE(migrate_from_v20) { +// CHECK_LOAD("normal_v20.slvs"); +// CHECK_SAVE("normal.slvs"); +// } diff --git a/test/constraint/pt_on_line/normal.png b/test/constraint/pt_on_line/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..4c87b6a49a47ead0bae918efe7e7cd9a249d4ace GIT binary patch literal 4424 zcmcIo4OEin9)Cbk)9XjqBUx&?woxlgDov~TwahzjYObczhl(Rxg(j{N6%BMX=LzMO zT_oMjby~I%4K1Ca;#+wor)86c4kdM#hKQP^WQJUH;PE4>-Fxmia5(2Z&-?Lv{=cu6 z%;2EEnVBpz0RWi!f9ksv061>yYiy`F!au<30AR6&zpu~diQma39$)o@qQ2?g8Wwlk zD)4EgT+$Y`1a)fX!J+zu0aBTNwNcRb%=~+2Rt2kkGL$1p>|oXVW+b1R7s=+UMuI~G zaNyWmHHZYD$qx?$Cl_G=4V#7pmS`>jw-G4d&4S>-*h+K%D7Yzb4ER4S8oMaJ+qkp5 zBvL)@dZj?k?D?%$)vo*0<`5byFdl;P-(q@>l-O>}my3&~yl&KcZ+kjgyh{zv5z8%< zeKQBeKrmzIyaDk3c9A}Sc)P}y8aOR*W(Q=Zm`f)BekWSH6Ra?y{f2kkC^{j$Dh$vI zrM&m%?CO@!AC^)U1F&J;Eq!}TC+y~h0dD5ZA_~OHzzp50UoUbw_wb)c+7UC3D~$;#{-Ttm;Mq)^FOcU13n^<+%)&9 zdg+4AJ}!@dVe=MFB}6c|O~b@G9k>N_#AZiJBVZ7E=Gvo3=4W02`;nEFw@pRT?DI35 zHM8usw5~5Lk*ooJ!ebIk9js}3+q3)IYK#HxJWDUx>q{}3Q`>xX3%Gn}eZLVvN2mWG z9a@sBWZgT8267jbQ;^WXyb{|v&&%B!Vqdic2C!B-a0^5Uxic?QkRab!r&`exoSzCn zKLlubhP_s}<-nY)>KC_-fR}I$*aQlXZ`Hw?UYzhFo1k0)z=1Ec;1>FVjiBt97q2nRl!}fZm7C@2o@P zNP|kXx`;tdoxJBf#5?OY{^EIlqyu$ak&(mjIJ(?{=txydYSMqA^va$w3LYK*5ZYpi zBi-`ySfp!DKQf$;b>_W^t`7lOB? z9YS@ur6D^iI(Jm`O{Uyg?x|i~)-`F2!P|9aDTRV7KmFwts>31;Icy$qy^C+BajLH# z$EAjUjJEDR;pYLKw5T6aY+1L<|v!4JoGodh}Y+bt8P^*6=l1u zn>cf#e?Zf3-%==MH^|hqa!hQ7A!y6dI(vQ8h}piP`K?WVtkaT;iH%XnIi2$D-D-Bv zmYH&*4{dP)&;_l%V9j&ly7tV^pf_~#CSv$r^EJ8voL=}2HS;0mCiw^=)Pok1gI2^_e^G(jVV zzW~V0b_17Pn8le$-kl0q!pgJ|*XaEoHRLl7(!UHC8?sL{3T(|PH7GhPzRRn1%S6zU z=nlA$U4EheJcI)D!`To!na){cKV|j+ZCx$Oa(-0mYyzD=#A28!vI+ zwFcNQAl_$%p#ZzqSxEZ2&Kl6~?R_M%`3V8Trzp4F;{6hKc1alNR@P({(w$tJ<|?)I zH2|tXH!j;31-Pdt%sH#iAVJ-t=^x)koRup~f$?J8mAr@`P1S3RMT*7|(#x4Gm;HsJ z)EL!^M`s088Gk47X$q#QHXD$BuYePaa*y8&7od3W^!+#0gX%*e6Zg&|bE0Qn6i~?^Hm( z=c(LW(CXROax-SUdb^-%j1ZUfT}6uOuM?><>YC27`r^oy?fiU!79sK)TF_co}^=V^W{BP!chqE1Rye;|LpW7xN$AKD58)248qI(Vu*> z=Gd#a)F!2Ph&VAMwg6-e>13Bb$h zSyh~ysQTfGDy5NszjeLXMP7cCIw%`%=}9QA>#^`=)DuU;Yu27pEF~%0#1}TIo!Vk5 zd@9C|EKZQJF2I1>RVAvM=riI(sBtR2E|}aUP%&}WsS^cB>P%UE6N54JK3*GJ8nQu{THKyA?C5uSR3|9iFO9}?id MEy%az6MXuA0KIt;h5!Hn literal 0 HcmV?d00001 diff --git a/test/constraint/pt_on_line/normal.slvs b/test/constraint/pt_on_line/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..5a74c345233e508a4569e837b32d5ac2c36e1b0e GIT binary patch literal 5525 zcmd^D&2pPC5We#oJ(~gSbb8^CNz>js8E29nIz1@1oG`&a1h(UJ`cQ3Ouq$cx14bB# z(@TBHWdHZu)oRhN-+!+2bW5)bvY_+JTjF`%XO?dY|H0qJf&7I?s`dqq&wz&iXJk#| zcZ{wmquGL%NM7V=&f?WdDkHIcOo~qlE2~&(7mP0H$}e}MxVddoGkQ-ddecre(%Ym= z?ot}72+K_YX3J9RF`AO+i##hUMv|;D43eh#Zcdk*Y)LW`6p%kA>vFDg(uT?f;eLFC zr1l3>WOPl6_=oq?J6|pZh%Hz~D6Ftlk>_klna)EXTRzfi@i0lUNs*F_q9R#T$(DZ2 z*`uIBl|BSP#N$DMcKA1U!sB}*=d8$+zw1sEE0?q6KFMU8gkV>t@?RA8iZHU~hs5Wn z1kw)!UUotDyhCo-$&I?WQGoWgBy|<0!*$f@I_h>kbp{44*O4;ky8Uvl+b?iyDF;5E zIn7^JV34w`07q3H>NC#sz5MwN5jr~>yjsB(21)yY6uxxNkS7=0Vpq53lc ztm%qL7_`rF*Gb|AYyi%NtK0F9P@h?CHBcQ65FA!3`w{wslAqJ34K1ts7NLmZCW4Xa zDZ;(jIIMj`F&5(H-oTZYXK)omZII(>U29K?H1VxGOyAtYtnLA3p(gCw?tFz*140AE zFbL1IH-s?Mgp<3!%&Mf?s}|uKMBpJ!)z45GX`oz@!&3Jx_--#D$jWlICaGq?>_Y}D zP`7$*gpQJAPqDF|hU5TvM1)6b^zyT%ysyua|Yljs8E29nIz1>@PMBaI0y}X!eWbq*YPIm|_n*rm+tJICBy@RxO+3&0%!+O4-}$>ZkiQT~^}eL>3DEF4CmR~S zV{}a!%@bN7IVrM&#p|_HMq+iJmY-5q)v?kp8C}t}UpbgzM=`E@0RX4ej-lbJ~ zlhIg3SZzx%TUA<*(TqHu6?s)NlIC^8AX)Y?-Be2zyw<1^!VUVEyY+{;FuEaS{KNZ+ z&*=tI110-$Nwe5HU9AM19jHbqu25Au6l_JA&PZTf-P1a`o2B`z%t%gAktB7xqhAYl zFQ`zj4?z&|fKi~k5ZfE!@qHubtj&Y}*pCF(uwdzJn#+a>!LCZ>KP&MCVPwM(j?YgH z01*bf0R-9eUUI`;Zq&z(0<^aynX5!SuA^SpQNQcCGcahro|HM)?U!@iet~PH9Qb?= zwSRqqLCUfM9I*-N(d*Rb)79s_sB*3wRnB#z3f$MA%GFI&XCqMsPa zO;^mqpnL4QP7*g@0&p^3-Hd;N`od_dk?L@O;IJCmPtYHg{E|LwX;s^sg(8YO2}Y); z2)AMjF?JBeNW^Wvh0CwV;ns%QAji|X#_ken;#+x`zqyBn?Ez+?COmfC{tBrUgbftq zAUx6D5W-Lsj_&?EuhV+3T7>Tsfrm6zzlPFE1LevB7QJu5cXJ&CycFFJ7kxe~I^YEGu6$)9 za1))4z_$Tydsrh_wvO5eRxpzq!HR8SBe)itu1**(`y3yZ9ncG~{Iq+44@h;!yT_qD zw73b~3z8M$+~%xE+3LJz8W08st39bs(S+_;4|u)c_l*A(JGaIrKqFzDr>|#kl6S}7Qazuvi(g8EEts=si z^F1Hq8y$@~xf~zGhPQ7!RV+Kaq4tL7O8iWJ*Ha543=J4423>eqL?-FQR&0oO9(jXb p)~9lNl-+A^s90Q)D@UWjE$Tb?rWcrD2vTIz^ruw$Ueg%xyuYCXn`8h0 literal 0 HcmV?d00001 diff --git a/test/constraint/pt_on_line/test.cpp b/test/constraint/pt_on_line/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/pt_on_line/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/pt_plane_distance/normal.png b/test/constraint/pt_plane_distance/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0291ca2d1bea9aee5a2fbc4f09c7af295553ed GIT binary patch literal 4328 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 literal 0 HcmV?d00001 diff --git a/test/constraint/pt_plane_distance/test.cpp b/test/constraint/pt_plane_distance/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/pt_plane_distance/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/pt_pt_distance/normal.png b/test/constraint/pt_pt_distance/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..7d29abf94ffd15448f4769914221cea1f3e542ce GIT binary patch literal 4439 zcmeHLc~sKr8va0W$vr13C#A`&HHl>lSuSX$QK_xwf*W3Qm@?7HOmGD=t?cUU=1ogW zYObXhP|{orp~j@#tt7WxvXm<+C8CL^G%pbrx@Sg8`dEV!Jp7;Ho zKd=v@wn%3Y06=ZeZks~@KwTzZN(!=XO212K1wc!0kIi;RVp`v;&L6sV!Ozym`u!tN zZ=X+I%8mnTeD5CHs)4`zUc+@u^*?w2y`*EOX-(FSraXPrwIoGRpPa1&BR?MkG(~n| z*@?UKnE*VJhXd;r4iqS9%dYZ!0)QbE`{ ztMRKM*LDf7uvE+lh!C)!U{6*BRg-kpG3+=&>`$GB3q@;r9(y72Edh0(fK9c z%u749d9=0)0#=sEFZBQF5=q%@5RTz201dD!2d#j~8trKyF4Fi3SHBP^$z5cFIS4&` z>Xqg^P$%IJ)doO+!^4FDAN09F3jxgYvo{4(d|zk))ry(SyVjQYd|^$8sYII(Ibz{LZ%Tr3C9Y@E)VQ*@y}lznd-E zrxW6Ha~*|%?@%ASa~{RF6|pSXr} zYGXcE5>{3>$UVAO0poOv`wsKem9n!)HQMryMY6yP^8{1p5!uQ*&@`~EmOe_a6g?Q& z21~HRJ$$M}jyP{jMNwdPJ~Rz>A1S<-0AISKaG(_(6Qt!5xC5hd!e|(5$((5I`|9KijgpW3rIpGpte}9AG(0aN zHWP~0XOh{vDD|NWKPKr5)iS?fl20ZJ4+d{?y7KmBZPSB(({n~!i{b_4M#{*J48r3B z13`Kt%gCFp)+$a*yaNLj@C16sToPYaTmDk693Q=q-1E5>&O(6Gp6%XVXk{h>EK5?J zHjnZn)A&fGkspK;#S(GA`ZkqPy}*rza|BTOv0bJEWCwY88fUOQD^$h(y_o!Awr9Kj zb#RWQ;t7{<%MM3bf0KVOMzyb)Z&ImPKR>Y{*fP?D4WqTmb0X%Rzo2W;ROqC2<|x3q z@q1(gEPI)ol;-qXl5t`nFMr61rA!{3Irx)aDibe}`|0C=Y<%a8;ycTVCug%tjqh;=!vH_tPm?4Yu*X@bNhcMu$HmQ}XU(~N;Z_Ke>f^Qoi?~`e z-c4q*ov07{+t?5Ebch0$AAeQ*)u@EbD;T`Y%*^xJ6;oKLQsYx zrkuwu=F_u<%w4L3nzA5Z=;$vbBuA!%%O$QYAYZ`;%_mSWlq+jih6bHip=SX&dI?&xzLlGN^PU=i z%Ip|@(t~o~-NG~B^xh=c#2kCK19WgCsz|GqI$$dkEl11u))%-3&@_NguPGDz^~PLu zvN-fuW*Y}hFnF@rhDz^C?|^~?-#SjoCB4J#-UC{3 zmR1U~YEUUC!^1{^e}>ab&RPO2viKef^1O#vu@LJhdEWNPPxb?cpCIRDF{ubr$fROh zPt=${G~=5;jW;Ulq(%`S+1E{(3Q|Ztux5!Aocva)fX2tgax|0-%ra#<&jt=O4VdV2 zNU+id=dm`_JObd5+(mSO@-t`c47ba-8Ga|EQkFsO#5-)3r6W4I!3zV50_mLQURnz& zT^dkGkXGkqEg39JccyAbDDaHaJ;+w^NbN+6s1b;@AESp;l5pGjd8Qz9v3%Xq39b^+ zu|BvlUab5L4@=NN4#*gY-uf6ctA8Wtgvr?qNInxUjsODreO1d-f#C4#< zMiQyUdwaAqGoUzdxvN*7a9~4thS{T1vx$&&5sSwvjBGFiX^%EQ1+?8}$2VK{no$X7 zdCrN&5>lgJEDW7(+>T@(5sNgeoh1=!JbX?(Nu1PKFB-Aa0sC&Yb0if;`U1}vmU+pT zwu~F2t*hjzoDBpmbT7~Up7Vq)QCQ&lT6!7H8>zv*4EvA&wbR18QA5G92{X*`^@t*M zS7*M&QE1os;S`Zb&_%>ez*neaR&$AkN;F6NT0q|UZP$9#mEXMnp1VyhIGO#AgQB4K47*P# U-rsai_P_+}vE65ry#p8hGc9`um;e9( literal 0 HcmV?d00001 diff --git a/test/constraint/pt_pt_distance/normal.slvs b/test/constraint/pt_pt_distance/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..16974355cccd9bddf05565b2776f89c8f858b063 GIT binary patch literal 5106 zcmd^D&2pPC5Wed*dNu<%?)1VTP1D{w8E29nIz1>LCrmIR61L-X`cQ3Ouqz=6K@bM) zoa##^`~U5(v@3r9`Fl;XEx9gmOqQ3o7$Nk9(M{n!c-zRYet{yD`+`IZpsD|Jye82* zMplH8JSJR`W13MGtyYz?BJ#(y_?$9cMq0aIBq1x0?{IN*+otB^9+%{%n_Nq8Q=Z;s zB+?P`O#x;(H+qa@`1yk7ykt1d%bJ0+jP8~s+2je%>!5)ADP8lW#$*if7z;n1N=f67 zg2>1k7tv4j3!Nv4OkzhaLnW+psUxQ>AAndOh9j2~ucJ}WYu6QzjbGToAIls!r+ zROy57haw&&(4GFxo%Hy=mUC9*$=meO<$53suG_ERy8QyT0onJ&ozwpH z1qP6-3W$tNP!Eq&pHEkx_hwaa-B}e}cUFOWOjd=uoz>aMvvypGjBlZman zVz%hM%3TLZ=-c>5szV3EX{p^$P#@)eNuD-@m(3}ziE#-fKoIC+7x6 z4$WZ{LUI%b8C`2n2o3SAJj~zR!&%!yU9S<({is{ zL`-lWDVnZdO=-bUas`E@>bw8LUIG*=r)-Tg!+^U-F<^nYHESDmR7FObt@^22D3po} z2gZW2(H+fT%XKi)GTcoEEcf69r(Y|m&aG(_Z~@aqGp!E7M4`Qc5c0ez{_R;DE=zUY!?%S|)T-9i<#MSLRN3KPvExC^z zJ4-D%0Epb=_0^=i=rlkMhF2jz0S@!vR?sDm#{BHAh&4r&iBPA)98SeBDH(7$+bZe^ z!M>^D8y$^(gdCqdhF84}RaG6HD!t*kfM1x8IeK#uXCpusT_wOKy;{#K@y>%{@!=79 z9tD2)d%=<`%JXX7sZMKy^RePo?Qd~t`2e4Nd^=Q03Y#?Zjjc&eQeJp;wc@1o_EG43 JC)W-U`UjtX7B2t* literal 0 HcmV?d00001 diff --git a/test/constraint/pt_pt_distance/normal_v20.slvs b/test/constraint/pt_pt_distance/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..653c99e790690a03e2177fbaa2102e903c9d768a GIT binary patch literal 5014 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 Hl*B&(A(JWs literal 0 HcmV?d00001 diff --git a/test/constraint/same_orientation/normal.slvs b/test/constraint/same_orientation/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..c29b8d727e352ae2c719e1d04dbf932e5a1cdeba GIT binary patch literal 5198 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 literal 0 HcmV?d00001 diff --git a/test/constraint/symmetric/normal_v20.slvs b/test/constraint/symmetric/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..170f39375b73c3043179e9e70716c59c5c768eb2 GIT binary patch literal 5026 zcmd^D%~IPi5Wed*dXC3-2-AxX6liZ9CJgk@=|Lm{JUF(IoIvRGq1wJ+SMo}h9m}yz zaw-=l`~U5ac9Y+K{$6LvhF#}$!RD8@lo0ZTXY1U1^fr-S{sl-XwmFMtK*P@|U9so` zXZMV=bio9Y#Z#Prj=3lzEtqq*WcQwUq4~{ilbW&zTCkgTawWZqMSPdANCzXE33h&Sw8#-9`wO7qe8Lm4m% zi1nQ^erl0iWq9^pxx9h1hFzB-m$dc>!E4gmJz^y^{J^8vc|GEML$Ylj&#zv@z z?^BmmpZ@mLsG%*Z#dyoNF%dNTEprcAM(QNFe^0Yt|6%MQgW1~Hq-j=Ii zlx29E_E_$~2~NM3P@VVFAm9?FiDq0Kq=`W1)2>6gSqFz>Y#p=?wO~fop@!40gJU;U zz_DVRSJ!p0E4uA3`nF%R#{|f(d}kv_6Q+1}Bgk!RZ1)?RnyrI2LM@n4jZlkiWFxo^ zindPZFZ&klm+jFDaD6m-0eat5w*571T~`&FEBSPLuaWBzYD#V+$IVg+_5h+TdHpo$ zE;<>r&PG5iy7F-9+oYZI%o1-M6pNo1XXP1FHgApdspORN iX>pjktx!+ysaiBy@d&^0?2^Jd&HRQ|p5B#tLjD1|X#n^D literal 0 HcmV?d00001 diff --git a/test/constraint/symmetric/test.cpp b/test/constraint/symmetric/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/symmetric/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/symmetric_horiz/normal.png b/test/constraint/symmetric_horiz/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..598bf98d9aac308f26380d6605face102dc7f524 GIT binary patch literal 4347 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 T-KZ2PZqn@kExlaV1_=2FP6Fln literal 0 HcmV?d00001 diff --git a/test/constraint/symmetric_horiz/test.cpp b/test/constraint/symmetric_horiz/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/symmetric_horiz/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/symmetric_line/normal.png b/test/constraint/symmetric_line/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6ff6be455d40e894172a7d9f0422920ba3c5fc GIT binary patch literal 4478 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 T36O~*Tc+Nz`S+uC;CX)lynPMf literal 0 HcmV?d00001 diff --git a/test/constraint/symmetric_line/test.cpp b/test/constraint/symmetric_line/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/symmetric_line/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/symmetric_vert/normal.png b/test/constraint/symmetric_vert/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..81d0618595a5d9eade8e8721c7a594a742fb9356 GIT binary patch literal 4351 zcmeHLdpy&7AOCKw%q2>M6zOzdNRe))3r?q^o9kRAMKzw~M6z7Qc}|^5oF1J}!cpld zo6U+?&3;Zwsa!fPnG7Y{GmM%gm)ZGQ<}r?wf6gDz>-D@|+w1pwefN2Nzu(X0efjO| zZbt_VRRdK3fX4Q3x9tT0={EdTnFg;E`6s^tKOzmuJ32t~|aJuU8Jj)iF zSN6>AjHPi83W9EEh6M*lFTG-Jcv1Q0oI(2eX-wNc%#Xv=qv_ zi<*~5nhC(dRmGE)zQ->u+ZE8yj-C`6bEsMqsFx{^^yuAk&Z;Rk%@%w4CJALrJSUv1 z&|&)RynGikB*1?oPi{i@$x$zki&cTuO!@sOru4Xe1bK7HNL}%sb{qT^cAb1~_@#{f zG{E0Au`9K;0y_ZWO618+7{JPe@EmUhw0QKS8r0=ISYW>Kdge(Np!L&oMU%)~R*6B>1B6>26 zp6_KLGuGPmYA8VMb+rdBdkzAa&ypuM0fx5Nwn7pLTphi?%N#d*34k(oj^NciCv)Cv zgG~_7E4zVhkJG*i1DEMRpzK;+@^;QPZxANpBl942t2X{2kM1FraFTB23 z3H)F&f-k7x+=&;8yN*uM_-<7u9J=j|sJxmvaC#Jc!@+?^snnYDFkhaPCpUpKr$iq0 zxM$8W5=kh}FZyAi4!Cu2Om!<0q$|J7S23Crol~;|SnG_|_Tet2IKfA%Uep@mOVGUq z#w=8D`HETmC^lvDUxRX~N?Qsb?)Yk%CyPt-yEYVvMc`x_6szqKO$qAXTnE{PtMcE=)JyP z=ZBzc#-Nt?l2EC8tKwyuCCzjJw16==O{N`q&*yu;cOT7exH}`0Pk&ZX%b~%Hu+e`C z`;cJ_4&O})bUag5Gj0tKBgv0ozFolPoH~eJY5lVd30ghb5^WDC9E~B*OZG1=L}Qv? z4>7H62Kr(o{R8PHYUK`igygeRv`=J2;i0AXnl~!zLTba2J7KbJEo+K&mNHr^r2N!j zd16cZXce2xs4E+CdPOOvyF2PG^SZMu>RsR;1J*?svwpRruV?Bb?M!_Lc`v$(#VrX* zv^JbgmMdErrK{y!J(p<4Hi6KRz~5BMVKR{<4_qZ(_1K)7*=P}iGHiHng%2=WX`UA= zn&k$3vs}pcj{ucfuC|0DG!^x?w!e@zLq)hOYn57q!EZDblMH4}-=?&BF} za&7=|1o!VuSIBWC3;e7DW!vO7|k`R#N5cBhgbXTnO-D3j6T7Nu) zrb0bFO<`Krw+}5Vq>RFwn}x7{Pt^lu!@ZUXbFQ7r*UgW@;K?kB#Jq1>n)7(MAI~uV zMFb4so2?85Dw={QkF{ifV~78e`Nuf0|Cd2#SN?~}@VXC4pn3yf&J>|^0aQLg8TINI zmponMCP(Jztn%)%#BCg|ktKi}$7{=YsS? zPR3*o*f+)0aOf99i-@z(;2j?;i}6_f5=r*HFw>37a;PO|v8BrxAj2p$#YmsThb_9_DrS>%stuN>KNt8ofP!Nbh$E;y!3~fKxwTCj zVX1N&3`ec63cxpt>NP&!eQNRHsVK<^+^Z$cptK+6SX^MnFW(FzKVa=;9VaewWu2J! zU3z4Pi+WIF+XHom>pwK2771){P1i-9Hu(E3p;AX?19v-P_6@ywq6t5Iu-{pb+$WP$O`b9Ud^gxij%X` z&#-dXymy?BkC8ZMtQ3UYY^uXYeqtuOI_ame(%3f;&9nP8C^&C@_k>L03PO0BmmvIw z?gD^{&$atZIn{8OHgvwbD&PC9B+;f^bnUno?dJU>oa?1S^|VJ+UZ?w6o)OvL$6moc zmf4S`zqhm$hDI1hnOPggJH~&=SIOSLvjUK}-f1+6nEg$YetXc_Yn#f`nZmFGFZ-@V zw~Ces=PtxzhwX|qPjq@$XXGVRsbyJ1C^!ZiJ7D~RprGnge3$%Fq)*Y|kJT;Nank8d YTMw|FCN`wPe{6v5c8=R}w%}v`0GuG=RsaA1 literal 0 HcmV?d00001 diff --git a/test/constraint/symmetric_vert/normal.slvs b/test/constraint/symmetric_vert/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..602bee19f0ac1d03f7a65ee5a1977a592c3de3bf GIT binary patch literal 5022 zcmd^D%~IPi5Wed*dXC3-fa%2tN@;H$CJgk@=|MOOcyJ^mISHZDhidzRUCELx8_Tf` z^wL}y_W#=-?Iyo||G8xOmRuG%C5!WGj1ca7#&(9vi>)wW{>keO6dc*SpKeIpRnA=58M}!=@@^BKnq-O`3Bi=bG4!Z z+(Wss|NHGqyYTDxpX)5yvg@4A+3fO`5<))nY?FH{ZyWjL6CkPBL)_q^{yJkxM9vor1xpJ$A&P5s zbbuLOFmA$CScwN#%vX~*o#Y8k87k6w5pUVoj6WzU;QrqCLkT?!h|QfcerAze7(aSX zQQ%4C=7Ywt78#G1aaz_m08t(F|5U0g%IR7*vL`zkvJ8A#NJS>(H8<$whF#pyM|)eE zxbW|A9d^17yIoJ6fk6{>q%65^zmn_r3*1`Dz9;X6=F=4zq+C`&A~r%jJWPE$UVYk$ zs^q#+m0UNfz&!+2scxe>83?P?w_zQlZ{s>t|3m>>b;abg{UUQ6B&l!bKTsVy7*5N0 z_fp?>zd!sLd)zQl)Mu?Gsw*EZEuslaHJ7catQm7P^foX?vJ{3Jz=IrObggL~8sf1$ zOpos2r0F3rgr~MSs*!3ySV1ui!c*f7Av~h{%e07#oo*31s(peqUB8ObNCV~a4ECXK z{&#!YBP-4LnkI$;w+}L4DY-Qp7j#rfCYp`?RBjHaqQZf}U~IHU)7x?tjIs>3(;mwm zd4kg~Wvb5gXi(xZO%u(yI!F_N#?!7tIa>#ZV{E-?9csahszWVLyAF=&R3(lT+djMY zgV&h28VjI~Au9c##6Z*@( zMEhlX^aAW3jb4D>Hj-D+7f51<7~juK)l5 literal 0 HcmV?d00001 diff --git a/test/constraint/symmetric_vert/test.cpp b/test/constraint/symmetric_vert/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/symmetric_vert/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/constraint/vertical/line.png b/test/constraint/vertical/line.png new file mode 100644 index 0000000000000000000000000000000000000000..caa33372e0e24210e01e3798ef0acfa344094f37 GIT binary patch literal 4327 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 literal 0 HcmV?d00001 diff --git a/test/constraint/vertical/line_v20.slvs b/test/constraint/vertical/line_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..eeef577b3f1bf227d06534107412116f40c8d61c GIT binary patch literal 5066 zcmd^D%~IPi5Wed*dXC3-pu@!n254^`CJgk@=|MOOcyMeZJAu&YL$!UuuH=<0C6eP9 zm>!x-#{0kDuC#0a`u*ps%-8IyqA8nQ+)zTuXI`$V;67L< z2hJ9Zvm#|RlG8FTd9qlv%1Epqvg%XD>n2g!6=!p{2O~!E22=rNUr{Kgo(omD7TuB2AlY&AyiW zK~kY!Ct(PG@=Sn}*HE82#Mz^+Q=KP&Mi<#Z_yP9RPW z01<_v0VJ7_U2fFNjr+K9i1yYr_m!x}b=>PZ?sq-)1_sU7ld|CY{R*z%FL14t!$90a z+rPfRAmz3K0CkMhR^i5dD=$p76s(&Pb z?Yd%e?7sDV2TACg`9~x4t@uai9~phMSAE7FSFCRA*{+CkD!`>h6yZ+p0mc@f7^$46 zD;Pgz0do`JK@QQn#`X|v;(K|RzPpDb+XLK2n(*YBzY3`>2spBv3vI(4 z&0x!2Fw!zy4|^>4g)l z*vvY3#zR*Jtl0Y5H=uV#H^W6=_KOZU0ir8k*$Bdfvk}BV)V7B;f@SMX8^H=@R3lii zjcf$pOm}s{aM_n+zwCfsfCXT?7sLgr&ba$Jv@b1TLia+;ityeRtXSD{j+qXGfx&7| zs#7$<9qS&imtxKY&xvnw>f&o9H;HdW>LdqdqJjBWnRu41;fd&%bySgwSmWMZ6Qh67 zgvLS-6=dk@4!BFURq({a`y9r1a5UzL_k2$|7%iPDmK|Phdc*T2ex^SOsYMG88yrM~ xElNmz#>yRz|FsEk;C2l?NKCTOvQn z9_d&l2do9HoEE7Guy%FTT%gBiOZt{Uzwr$6cyFSvSOJpPOuxZlo*GPh#{>}#5HFSj z(Z-3VCYQ~YpS>RD*`dH%bLMcbW%>gga)ti^jt_AB$!2LyJXeaY8AqyXCdqA<;8v^n zJKYiuq=fu%pr7W%XtqqY=P@AUZ!d``!d0QJ@2STEwq4=@AREhCmgqyOx2sW>qq079 z{^Lw@;553hXr;G~bsx?-1ftdhPwj-oHTk!TgHt7?H$kH!osUj8D) z@>9~GRqI6I?7ZXNBBYbhBvYBmVZ^tngU96_6O51EA(@Ym8ls*zO9HJBf)tBr@6kV~ zK*~D3!oBw?iN>AO+9RAKj|El!ax7AeJn~0*II)I%p7<-`E?xW#UzM(mB^n%K<}z}Z zE?HGUFr`y@MA6*#hVq_ zQyb4p{az2cJ~91GNp!xgwHwNrt#5Bg*`xBpkFP9!Ul}r^PYhm&MP<6o_yKwar;pYD z0Kj=#i8wgd%4p}M-gdA1gMMeR67`!GVZ#@t%rUXi4*q;jZQ9I6)5fApF-3}PCO}T{ ztKrr8=@C5*e+2gf0klKS7XZ@Y2q#{xlsS|ye|`b~o|_tkd^BBe@wa;Q$-5fEWM%Yj zerC>E25S23*#FQJ6a|u%<5i?& zc*@oA)v{9i$gfDjMKV%Y{@3A=uZHbBtOl+*f2VVI??XXTF5Ahx1gO~sq}l*PA-}vt zTOC49@TOEKZtC`1lKz`}bz~$D1q)|Bv%A5HoxM%{Hpu#6n@15(`*-P~4|6jo`pSOr8n4!^GPT3e5%dem#+ zX)Gu1iIn4$D@%ZA5EgCQefx=dDq}&c7BDL#Oz~#K^BC}Z?!k)oYu|o$|0&1THg**T zm?|pfOs@niJRd{1L6WS2`+oWkdxC6-9>n-`wvv1+Jx@&uiT{& zf6q_P=j=5!wRkis+^X7QGw5_inBlF)K8gs%*fAepBv45LwE~ypjyB*fWJWiizk`N_ zp@W=*pUKb+Md#ZlVPLCDLAddJP}abwo-(|m4t2kjqmjs%XRTYGaQ_`3)QfVUl=Y6X zD?AUXe<$287Mj2wGL6%Qls=3wnh0kEO^AaIVoZhwOLcCiMTgyU*6vC)zIWTC!IuI* zdFijC7iI@E*z~Q>Q$)r8C|!-7YQyIqhq)x)rDu&bn@(S1F-9%F=}%`Uu@{FK4G8(` zQ;P=pg7)zi{xP2$e2G6JkXoXgo_SI+mG_V@3 zi@ip^=F>#>W5q?x9Z?kNVuT{@{7%>(DikL7wA>mW48a-NpDNVv;Tvbv(_A{l`|dpJ zz0Q=v#vDuf{h{(DQAR$ICnacb+t*)IRgr;Z_L*o~njobU-jydCb~(5B3#5Zllm`_O zZjskK>Q3?*&KUNbkL`KGux0LyEl4SE&%`E!ut^hNUS_aXOa9ozJfe9IMUCt1t1aqZ zc`I8WO0|KEo7bYn>Hgceteo+?K86w7?IqWplpUja*PNc`5EzY_6WZOZhmmmtGggu4 z`|?7`nl_sOK1upm(p@SU@Q9NbQT1YZeLL+_Zz8%wL;Ur8b*UxJAYpUDXpn|yZdxV^ zta3-Rx>?Id@8g4a^cxgY`k0+@wg}<)Be5p$OnRr$)PUBd3@YSXU+ qVx`jWUhu6W?z`#Pdk*mb02e2>t%X~NG5-UQy_lx} literal 0 HcmV?d00001 diff --git a/test/constraint/vertical/pt_pt.slvs b/test/constraint/vertical/pt_pt.slvs new file mode 100644 index 0000000000000000000000000000000000000000..458c2419c859adbc9d597a90cbeca04dfca18520 GIT binary patch literal 5022 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 LZ!2pH;mm&lV4Oc>~)(}Qpn@Whdf{yQD zz^S<~?Eikd(x>G2pTD;(-;mn^r(|}0j}by&I9nINQ?NJw>ExhqI=4l?~e#VeA0 z;ABBKp(znsoU)wpWU;86wNNax;&aADnHcYalQ~%gVvCEr`?i#lM_iJ-ZgFkB$wc;$ zlf+ag)&+zW!uoNN!Lt>m950g^kf5x6w5q;hNSUF zx5&u~7s*fb3ti0T3d9a9V{L4(G?gMaabuBTSr{mqHy{Jm9A62RKqYBznP?hd3s*@vOmHsZQWBgrQkM%!Oz}8za zIq$y8eFsVUyZs+@pONP^5oMD{jZodiaA_bTcvPJ0Fs@Ogio4cu=`#vs1m$TBvc3*e z$5!}W8K&=^;jEn@vVv_F>lvh45Y|xiKzL2dtlXIyNfHZ@mKgwRNh^-FD;T^hzK1_t z9@Hwz_zLG%0mn}(fWz@jMW@r%y=w zwQAM-a5$=Q*`}>#+#FAUZTe|?eZztP*8+P(V-OY`>x`UU*_ZDbd?h+5{*M^50vES9Si<)(Vce*=qZeJZD z-n-qj!eTODsoO4k_26Nz>pQv{clA8qmXAiuwyMt@ymEWX^EG~He+Mv(FLx?Jj$CI5 rUD@8l!m;n%Fh^gM7Zv|k>+5J(`2=718;O)CZp!ShE7jw#4uH@ literal 0 HcmV?d00001 diff --git a/test/constraint/where_dragged/normal_v20.slvs b/test/constraint/where_dragged/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..397ee40155ea32291dffa6ff163b8f0ab7c29457 GIT binary patch literal 4448 zcmds5&2pPC5Wed*dNu<%>GZ-Olcc?MGR`DDbb3&1#b%6wNcb`JVJzzAcU zT*}S+zu&HQCI9~O_dZKD>^`ScHo1MIgpe;hTj$=w+eCi(1xPCPIg2iVhQCv~V$lcA zo*8H9lnEq@Wt@MGxhNtnm~%E`&z{)Q{Nb@lP1&3l?4g}pNpE5iKP4>E!H9JZW`!_% zoF#O3ou#7SG){|(L6hVrUWtj0)6!VcJo-s~Vc_u!;szJ>pA(iupGKrz_dWp6q1EGVo;~6`7DjZqUgMySSl`_BJ$e z;ospp>~tM=yB<3OgC^=oS#sTeCD-j2xV4mhPtJwr*A*C~Tvk9LHb6Z*PklUGecXwv zh!#YIY#`RSF3k7V|6{E}cLFPJ0Qs2)1sQQGxteGh4 zyG|3;$c3RnG-0mxqO}z@W2%sG%*Y~e#n5W{AjKm zP|}i2G#d+Au1-`@;lN}xHrk`6gTuu(h*m~1C)PfmQhgzO?9USAiN*pV;*|`?vq3FK9=<9LO9w$I{<(Z8jO_<`@ zjUX42vEA?3)NH+JBh-Q!)CjfM1~!6gr?z!Mf7#dQxNMJJfCb#>1?YWK+4gDJx-Y71 z?&Rq9c9H8Y(3IRqj;&t_9!tc$zEDNgy0&-PGqI*Gng|c38!`+gJ({|yf~^M^dyMbo zXzbQ=ycJJI%cP2D4sN-f;kgpOHV=5c@nug1#G<1I-=-a0EG+rf4zu`qaaHdBvVAR1 YRxIENUvs2LVV!3F0Vywkl>tKj0Rb{s(*OVf literal 0 HcmV?d00001 diff --git a/test/constraint/where_dragged/test.cpp b/test/constraint/where_dragged/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/constraint/where_dragged/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/harness.cpp b/test/harness.cpp index b819596..7c70d83 100644 --- a/test/harness.cpp +++ b/test/harness.cpp @@ -15,6 +15,7 @@ namespace SolveSpace { // These are defined in headless.cpp, and aren't exposed in solvespace.h. extern std::string resourceDir; + extern std::vector fontFiles; extern bool antialias; extern std::shared_ptr framebuffer; } @@ -94,8 +95,8 @@ static std::string Colorize(Color color, std::string input) { return input; } -static std::vector ReadFile(std::string path) { - std::vector data; +static std::string ReadFile(std::string path) { + std::string data; FILE *f = ssfopen(path.c_str(), "rb"); if(f) { fseek(f, 0, SEEK_END); @@ -107,6 +108,38 @@ static std::vector ReadFile(std::string path) { return data; } +// Normalizes a savefile. Different platforms have slightly different floating-point +// behavior, so if we want to compare savefiles byte-by-byte, we need to do something +// to get rid of irrelevant differences in LSB. +static std::string PrepareSavefile(std::string data) { + // Round everything to 2**30 ~ 1e9 + const double precision = pow(2, 30); + + size_t newline = 0; + while(newline < std::string::npos) { + size_t nextNewline = data.find('\n', newline + 1); + + size_t eqPos = data.find('=', newline + 1); + if(eqPos < nextNewline) { + std::string key = data.substr(newline + 1, eqPos - newline - 1), + value = data.substr(eqPos + 1, nextNewline - eqPos - 1); + for(int i = 0; SolveSpaceUI::SAVED[i].type != 0; i++) { + if(SolveSpaceUI::SAVED[i].desc != key) continue; + if(SolveSpaceUI::SAVED[i].fmt != 'f') continue; + double f = strtod(value.c_str(), NULL); + f = round(f * precision) / precision; + std::string newValue = ssprintf("%.20f", f); + ssassert(value.size() == newValue.size(), "Expected no change in value length"); + std::copy(newValue.begin(), newValue.end(), + data.begin() + eqPos + 1); + } + } + + newline = nextNewline; + } + return data; +} + bool Test::Helper::RecordCheck(bool success) { checkCount++; if(!success) failCount++; @@ -169,8 +202,8 @@ bool Test::Helper::CheckSave(const char *file, int line, const char *reference) ssprintf("saving file '%s'", refPath.c_str())); return false; } else { - std::vector refData = ReadFile(refPath), - outData = ReadFile(outPath); + std::string refData = PrepareSavefile(ReadFile(refPath)), + outData = PrepareSavefile(ReadFile(outPath)); if(!RecordCheck(refData == outData)) { PrintFailure(file, line, "savefile doesn't match reference"); return false; @@ -259,6 +292,8 @@ int main(int argc, char **argv) { resourceDir.erase(resourceDir.rfind(HOST_PATH_SEP) + 1); resourceDir += "res"; + fontFiles.push_back(HostRoot() + HOST_PATH_SEP + "Gentium-R.ttf"); + // Different Cairo versions have different antialiasing algorithms. antialias = false; diff --git a/test/request/arc_of_circle/normal.png b/test/request/arc_of_circle/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..90361e81e711497386224f1503722819b87999e1 GIT binary patch literal 4879 zcmeHLX;@Ro8lHp%LMRF%p#@ol0&0SQ;#Fi-prC>lL6S;vT8Lb5;l>|8pn&_(|cR*kN&!Sp5&Q1GjnFXdEf8M z_kNS``F3Yzq9zdlpuEM!aVG#++T5QYkG53oPkjo&65$rdO`eP!BVBHnJL}TUJlc2m zYL63xJ+{?4c(FEZY4u&5Xv3>@zD}lD?WcD7xG#;f7b?Xz)L5z#?sH4+FBc4mVjHoG zIsCnHK<`E6Ee!z7G?{pyV#EWW8b<>5sR$Mj)X;VJV3mNLD}({@iWC5w{Yit`atg>h zJOanx^mliMOJoANU^>0~m*1?@MZlg0n?9|jXO90|i|LeXa=58%yKy&$)aC_X@*Dz3XypU|U;4|AIVk_a<1hc1J7)fGzLyiLN>=eI;zD9Zic&ZyBV+9# zs_U-@u*v3+Yj=#UO*M_{w&qVY7x_*<<4jj>7ao5R9yk&>sSl?tp_!cY8o{>zpUd{%l`x8|lJS$%|9_Ls3QRd$fETN1Xa%VMp%~Mq?DLX+#6dw;5CWh`zZ4XBjw>JsiBL=W7J}S}zoT0}TbbV=nX(4brf) z4>TFJ*8wKis2{nYNJ7*y67u?sSbDfRV;<1i7lwaofR=h(*bqlTHun)}TOkYueRL*J zV5=JSu@y}G5r>W37}rI^rx0v$^>ZS_%Lj7vXwSyHRHY)$=wWzcu2iJJYJs&^%8DH> zeWSgWi66VrsQ#5c4|D|f-P@s39ZR4*#i2bT;6)7mbT$rjtLqa@j(WXsV$5)rI5$v%neQwa=>R5CDqY%%es?m_9 zTmAQ@^oBirAoY<1tkhi_#qJt}akzDnJX(431Ull#t^UFEkxgx;O#Daw!8?Hr3vnbf*rc{aI&n{$4|U^6O?;DDb;OE^KN^@9>K}!Ff)`p`@zEUU zCiUOD-pPzKqS;3leoP&8&7XU>=^CdFeRoiBSb?YNWVN5Ql}qFmoLm1rYkU4o5J$F) zCl6`4^5EV(8@a2?#e@0#)9}$oJUCb?dVY|@pS84Hom;AYH(TsmzJupT8cs6VoTBj&j`pIN>4v?8D2uc?d-%^SVGsrGZQV9h$mV4G1-RA zWDoKj6<>QxeqQevH|^gNLAkvz%0B>K>?Zg5;3WZxUHJUMNFVVa=T#1Y+0{9yu->o0 zf*Y^il!jo>O)RByY$Cnop~@gttf?^Pi;_|I zO{!VyTX(LR*iaJiK&bbXF%Kq$;>XevtgR~@^Tq|j=<0JpEJ|b!>O=Q!cbS3#kEGCu zD6)Jgp52I3Vx$&hi`^j1VpS>-x9j6bLzd`1hM!oc(1kc9nj;-ULFX*1QAhToyIDU; zqCPu}530)Izc6^tOpLlf-h=mCTZLUcxRUG2fjK|xPZEr2W_tRL zyxnVWW9tlfknyVit)7@@w5G7CZ?1;IF#FntuDA*w#gWbrvXcE~qo??Gu`^Q#=KASq ze{E>Q%G}**yMPEs8h)BWesnZ36I=Y?1Ug5>j6~MzHzRGUSXQaqdZ#;i@G%AnHlp#= zMlVIY4m&tf)WHXLewat@oz884dqm<^gdgPC%osQVK=)5n`2Y}~XQ}*NzQSJp)*%51Tr+R7y`5_X(^fde|2W zvYoap{xP;M4j?Z74${8^rk4h-+4I;T0Ix&i#=NXC>PEi(O)m2OstfZgGwytNdT(RH zO}nkUOtAp^6phw@oSWq-u@9{(vj9liJCmChCm-%{|4kwy!wYXmVE{5PrGZXM{!QNZ zAJG^Y5nivKn##ohuRqZ_Tja0mmdFEnPc7Owr2xRaPY$b|qX5VR<)>YO1aO9{P zg;HgvGRN1kgB`$jVwK%>npm_EKF?bALr+r9G4vsT-ojLWB3;` zDFGN4s?)albUrMb5QGHF+>*ajpQvF`Gu2MW3r$jdVN<883C84?G z?s)DJT$9FZJ%Qo*Xs9mda$bhj;_PjHWh94fMbq0)4PWs-C2;J@p6s#`{Is`BY$L8H zJen?g*m@%P{?xT`+vtpJL1%e*VmQz_`t%2Lx1!mZj@kWujgXvrk)YD_n0 z$VS3Hkdb3p8J93_D;>S(EG(W7H{O2Pdpz>pt${2=_2LWRKVHVH*%$R{cSao0@zkJ2 zGfZnAUr%}2TLNJ1pQJXloaED-XJNe-1zgVPggMSDV_ z=)J@$@P=JPS5i&dxYcZfXvdw9^Kag4s6-#aMaov+7rB#yT2~Ye0ciemMEs#q>QB1} bn$dNYcWqg!(6nz>U>zu@NetAng&-=`?P43_O+bF0%Qxui^oJQv$!~Yps z)94MSOUfyWX@TN6OEVrVm$fkpi-#otl<=aAq;<~ef-e1HNAjE7rj*eYDd|nSSfAb| zMRJ$YNM=}Ua&TJ|%8t{NJblPmQF4;7QY%QBX1h6EY}kS@ofL>aChKA@F)2qyOhgoNuOt$oE z#vdvvROww1gd!h2&`$s6u8Me}&p9jd=|ido;eePmg|5lwC=b<>y8Ur3v%F# zH>dgON(>;^6%dS#Fb|J2pN%)4b+Rh7ZdQfX%_?Y*VO5x$tWFN3RoI)fjf5Z{i*5rG3j3z_9Mc-J;Z!YA2+lp?JYtIt4Rb;rY8lf zYU42W4XKE$$-RM*moXT{P#n~F%GTIZLM42y2(wp@aArqoHxSh4MsYdv^*bU*y)bN|r+H$Zgdk&Pf+sN$K8AjYxsJ?z?8 zzE0W*Rx+a+!OCr9Be*t-woVv+_BrZ5JD?X}{b=@r5Xn2<{v6tmmN>6^p;k@t-4?1) z`l?l-p_)mR*+F2VJE(OuY2pR~RN2YyQi67TJyEa3Z1SHX*RG`Vt55DD$5x~d4g{jO z{8vEwArC~NN`G1;y+oh5BDz!M^U~8=^(BydjdgW;x(+AH33dVXyAJkWmAbX1wO92cfTjsD2|og0eg|h`KGcq1)`nlbCRA)#_(t5Bo(uS2UgBpd literal 0 HcmV?d00001 diff --git a/test/request/arc_of_circle/normal_v20.slvs b/test/request/arc_of_circle/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..78d983bc1353a59630c4d270834ffc3745d27777 GIT binary patch literal 5379 zcmd^D&2pPC5We#oJ(~gSq`h$Hv}tdhj5A3OogNfhaTsGD62^8qeW$S9|N8ysCXEYvlaU3TU)>SMaXzzjo4Jo}5qj0fM^S#rXm|lK{GN~v z4c{>OKp9OIl%trhqwG_}cpgf_jL{{1aQTj8w|7lxLRTcGx9#HEx`=pmAJb4K!?ziP zst0<}3z=yap>;J5p*MyOcxDKwk4?u+PiCULp$9bvs zJGDWVHt;ZBL1J5pI*txHj}E$zo>~)wKI?!iwDxm_)_yK%4alA=UYF*lD=~mvRX{K{ z!aX?6eLCKK+R3WW+F2D^JFB2Qg;n9MvpPAFR^hMHI>uk;^;rK|No?H}lZ*BT-gc3M zzm9)|yOI6~|C!cSW75CW{6`%B_89j$ecDocQNG$n5-8zooiKg%6K3WK@bW3au5HjurWzF1RCG{ymE=)=kTnv++;dPS z39KcJIB1upuvC5XzU%t{s*;p#NURj__@DyTmOHh!K}jpIBh^^YYPUd_G98!;Dn@%Y zgCp0;l#$_a>WSQe6At}SLA5SWM*$ZwRW{@5AVT<(PrVM+XgxX|73-{ZFp?Qn2Lq>G z2g`7(fn&vry=^^sX?hrL`rL0i;0B1UJh2f(2vt125yUuFv4>q7Bi30P!ANFQBN(}j zYy{gz(bfsWZJ)z_+X1}*>qoN}gh<};_UF)iw1mCtg-Ye)yDe0Kj8&-uO*NG&y@SA~ z?x5DuR1-H4pvq2mmlCw&>pAsW%qDjq+IFQnzsm9uTDGFva3B!H<-Y>b4|yOGRr>QH z=_UHi6{$N_J}*73Rb2wP*BDo)r|WRCoM9JGKjvWnm8lzBTKl!oa>o#=AJqj$g<@gA k2xz(>lkg(|=67^9`a^B`y>0l_YeL0_h5v{<)3X8p3s)Opi2wiq literal 0 HcmV?d00001 diff --git a/test/request/arc_of_circle/test.cpp b/test/request/arc_of_circle/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/request/arc_of_circle/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/request/circle/normal.png b/test/request/circle/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..91aec4f64f501f1e0d3e7e9e61fbe5f7a7e328f8 GIT binary patch literal 4789 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 TjBms)R8d~czeRb=a{>Pcw_xVw literal 0 HcmV?d00001 diff --git a/test/request/circle/normal_v20.slvs b/test/request/circle/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..cdd28109357efe490807eed7065d17d551bf4c7e GIT binary patch literal 4919 zcmd^DO>>(t5WVv^dNzY`(&>dmr%8M3WSmKQ==7l2ilYezBH^!e`lH(Z!LGzgNCW}K z$*I10ysKU9dvB!$|Nis$I#0Lsx*!WWzq}-T)0FH#<(VisVOd!_NSa=-wV3NVO@vqwnJ`3{&KF|gbWMunXYdPuvo%12Aou5- zrb+N|xm3)x5E$cfO`yh*^Cjg5k)l&P(sJ=IVcDceNk%b{EK0Ve-*Wz_tRT&YD2ipl zxIk>~RPy(h$tS~8xa$Uua^;+@SXQ;c6!Pk-|1&kO2q$ZK971^>fQV@%wN~aJcjT$*T1FS(RQttKdC_RT*xxIysV78E?}%Cf?@t*!VL=Y~2-;^Y#ngcaUVf zjsN)YGy53#hR^BKhKkZ1xZ0>Lb+~f^ZCI({Y>j5^Sg6UjfkBaHFyR0ldIA$`jr7(;oYNi?#)>L#*c$t-~JZO#NG>ihYX##6YBM+`Ca(F8F9{sQf zD!Q_quSsegaC*@JbN|*n_kg68InZttv>MJBqRN4b)#PZeW^m@Z7?l}LcTeUHoUrNF z3aa-B15^J(i)&8DNvF}Yq<2d9`(Iyg9O9Xz*t4ICBQ?tSz1<c8$r%9lY7{)adN$CBRIv3Y6PdYk&WOR$!(o5eC>16zji<` zz#M4yg2b%Pc>8teURp9mYcGJK?u8{2C4u+e>fQzy%zb2_b^g@s3`Ai{&@E&P?I3z~ zy^;ec+$X*VqPo6nLyaDcuR2~FNmc2xF|@{`G`PT?Ih|Vb z2LP&}>T@1U+6%O}#T2ndWNtll7?lRxdd(128eSZ+zN4$L?eE4%RG@0p4H z_)u-4hEl{o$n()711{E1gB2+aCMS~)JzNkebnV}z*>nlo*JCU7MaTNl9G(4bIYq&~ z0Msts4@UryDFgq-F(d}49D)!aT0$F;btxzytw{r*MidJylIci*mi<4viF6|^EX6T( z*j&K9)zBO{d?s$<-M?On-zIfu_tt>l}7;G_5THAx$6H5$p2!6urpzTSx2gVH^0DURr^+A$>+Ug zkl-^7G_*sC{=~)g@-eUNjUbTmq2*v!%21whu0m!Q;+qv$aTU#mIObf12IPd~Rh9iQ zeR1`yUTFcs?hiN6$}v~1uPb*;YM;hMj(M^JjnCU5X}|29LxOxW%!3n*K;E!UumEr{#*f`GTWM7@lL;_Nn}mlNTZ%6!Q$5FGlzikz|9U$>B>e} z3d-AS-FE?`rqTZOj&yqoZAdl(og0B;o!;me;i%lAOhM&6$d*rbyO8LKos@I^ZEapw zc4>Lw=$s=c&}ATh4VTJ2nB_pXM{BG67)>h=-t3s!tpm9fqbV0<2H7vEm#}oRvq#rX zYGlT|+E%=Va^et;T;g2)&6|A>{YehuWFit1+98u|$J&jZgozDnGTp|;CZM`)<`uLv zv|K|1)9b}be~dzzYN#aY{fxxjf)F8L)K{mKwEC|}U{76#La)}NOFg1cOSOspi>ARA zL`?!+jxuS`>wtc&Nh4z_;&VM8xH8n#Fwz7IBK2G;JGNdX&I)2MT-;1=XxnHTWtG#} z9&PK?XRH}P9b2OZcQB&PO{@DA4?H~YzMgQ(qFA)##AOuza_}#>15J{76N_VgIDw0^ z&sd-_Z_2Txwc5{gyxO-~6LLXf*6wrmnfQ@_cv^@@iw|PV=v-0kn(-t7&tI`d&?wAn zEmn06+xP)4lDF7b?1rJgNQSqvM!yl+u17(MaD^%-e&UMsp1Ec=YVu3_q~oWy?bwhi zfd#txWkZd6NK6Jf-3INx!s!_oS#FF{HZu3*;lDwC-m*2JFyTtxI?hNI#nRU%A7>Cm zu@-tZ+8g5O$aV?%8nYrECQzz$of-`U*M6fKyHi+euTaddZ>A|g@$f1}@G8M|->A+W zhJRV<0F&eJ6DsfNoW3?}Gj`SrLU3YzEJxBmtocK#G*{yz32Rr?35@wEZ2Py=k0cAK zue>hJJt|MYN8AH|sQ+G5fXVB$=oXz7g$QoK^xQRH)jG?B2g_UQ(O@q?Hh}9OddaQ| zK(JO>JS%ytUKow#?0XS+i;hHdnS4b@iTt6pr1b=#rP~+@3lUALxqju!M(!y*U1JYid!7ax2cN!0fKb z72fo3gVlb8mw#$tIX2o5TmNUKt{}Bw=pZiJzE9~av$<*bQHX3!#pUqK;3(87>FOfZ zQ^}Deczb$thI3~_yin198%u;6v(LCotkS~^RSzRvbBGF(JOO&Wy#?{+gqo0%>^DbKB?08LXCrY`ZtI?l}2 zaf?WJ3V>zX@0XQnpj~f5B^vkf$QAs|1bx?UB~6?g@};|~SMKHNHNVnok7l{;Jn~}Z z!iW0!ZO*>MP`DvjxH>p7jHUO`NcK)GaJ6K$N8mE2H(k{Fy`ToB*XXYOP!qMI1<)EK z1`_vPR|A*z@~qb`(REHYuAH8dRcIr^xiq$OL%amGC7x2Pr(YHI5UowN%(AByF2`V@ z*QzCKgDuCyQG;+{oIg|m9TK+F8@bpqnEUAm_`{5Pep$!Xce6akgrNMjC3zdX0x~N6rLj*VYUL(#w$rk5IBoQR?SqpF{wU`i45U)0t;g7` zqCWfyZV#KJgrX}goihF?6Z_e#a2H{x%Jb4MY4s~nP};$~@;vpJ#8RY^41wMdr{uV| zqMAM`ik&Q0_f;(4vw>C%s}cE0Pm0G?1*ObBbCtaiLI!>yM{aVfQ?y0f$*v1Y54Yr# z@5AI@DwE{^*QI?Mk2dV-<#XqtwUl>m3E_=_B!vgh%6a4AU8f41V$2SAlSvQpXzyRY z^RTV^C5R)Tr2^AbY6Tzh(y5+Fl}Mo>ud!Xvp-v6-79ZPsX15$ogM#9`e97{xI_-eo ziSoun2$#_L^HcXE|FO(kFf#wvHLNcFCwd~rsx(0Mmm|4(0_MAUVwAs zaamVcNZL;@M+@x-S5L_E;rc97ztsaW%nAW>YG9np?|1LTqd7N(ZSm-@?7<2x1IP;Q zXrc8PiTT-Z^1;1fsXy)PPr{5P!XRsXM9TneQp9X}bp?P8msU3YX?P!Z`D%VxHe9n$ ze^U&#{k^mQ(vsB~G;3tbt+Hilj>KU$9)Q@|j|Qhdw{t-h1FIjh#Q@>@2b_;hOI1Gj z)FXT*XM-uj*IFf4d6t!wfIY|GH}2<6ByELfK;F+QTjuF5h`HMS!MC|Wuup*_8xMtZ zMBDL)MEyH7I$vzB3iCA|Hvselu=@VBn_Z=aLMxo1tl3A;{eyd3rJ}S>`g9@@Ko&(5 zgJv}h*kH}W-hGAy%pGuksO$2W&&N#xUE!_JW{WI)?f2#{)wo1?UI9QFD@FK8iT&=s z3F(yAC*+a9gn0s5K)e9-xVeo4s+6KbeR&=Z#OCzTy?mZM<1TgJEit|uID!yJ1Rjz} z;&#NRdze#a_k96kGX=}{cr|{F0pSLFpdwh@#R9oP*#@(j+i7CAji|3rHyk;Mp!2Wl zGmJs2HW+ydGZ1rX%TDWEqR-2ChNXZ^+W0k1>F@P96S@nrPwz~KfLPxay2AAwIWW5u z3Zl13g5INnHxZPgfGj%z54uG*!mCb_XS=FD3Xo>hCxYt|Rlw{-scc@F>wZ^fhKLDI zfbH+}7a_JNOG|+^6JMxEvk;JNH<{32A_f+>>0VYI2=EIT>4$mz2vIU-Q8MrTxX*A8w`#9bWGk%lW>W&K zmPgmb8wP6w~4@d@z_HlXtQk;;Qp$p-fs)zr>t?JDtPmO5?rv( zg+$*O7qN~+r*jj#d#H0}CQYwN5pTb3#uW#qvGQ3YzlOJIgHIxE-;eKlkuwEnIcfEtKli!)S~|fmnZ9YTofmQ1X@1B* zBp@JS4nDDXF@YU8sbs~@|8iH>mtE8EL?-W*(~WD0UnRO$&Z6T{VAH<70!I05ZO+^^ zOj1ISA1P^m;0_yI5yCIP4G}lbcTDBRiO^L!>a=nEOV`Xdwk*WlmdE2g!|eKF)R}^? z>cmP1D2H9IOwONORLFBGxY7~+e3HFzCP9q6Ys8Q?-m#D!acx0gb*HcO zQ*tV4P8DFgySt6cu9n~l_m78*0nYbh*nvkX3(pCD`#E|3OKoA*>xuA`r><;1RjD^U zI4C^-nb>T|X*(NR2vzSXa~20NuzrA=O0oZ^L#lsK_gldi-*4Q=zGm+UpT~jycUINufSgS(Hs`sZ^|bt+)AA~OCz0$Uip z!f*pIL@_M6IL@;iN1IKp%!TD+T6|1#Sw%v-z%YRuw>*I2=C&zC@E%m~rd_N~@6$59 z%U~oTEO!MlTb5D}!wekX=cueONKvH#kY)K{4U-*808&8_@rQIALP#FX2$K{k5 ze|U-*Zb1?KaDF=Pl7x}i!ezh@3ob?EIZhy!c`#2-L6AxV5H?bQl_ZgFGcNs32LP5x%AFy z{<;DqDc2RCj7?Av&QlMktB0MeQq;~WMeVE-^c+^Hy3XoiB&}3mr*(?H&g)qHB_mdK z#bVWdmD>i1>g)MWP`A$#HNMoE#`netccJM|2=4WH>Tl0e2b%hn%EZ>&fKr?2)~9g0 z(G83z*O;t+5|yJ%k>_xkpjAm4 zcKEr12Km+drtei8LOI@oOai2>I6!v7Te%67Lf2wPz`V@$j>c73IOL_3Hrk^ZY*_`v zEEDc~EO+EdoPMrTwJxHg5~pd(Xr|SHn(zgmdL8OzWpp^w)~t0ff|*nYBTu~!mgin2 z&MUS*+7_?Ip3~&>ipj@? zWnyg5?YB&Qxw3tkn~>uzpJxup`)a`R+*D!Vg!Gdak8gA|`Xg%jjy(LPXr{{RPQL$i IhG$FsF9rlbIRF3v literal 0 HcmV?d00001 diff --git a/test/request/cubic/normal_v20.slvs b/test/request/cubic/normal_v20.slvs new file mode 100644 index 0000000000000000000000000000000000000000..9c93a8eb7522e38a2d45967466b222235d86ddaa GIT binary patch literal 6129 zcmd^D&2HN;48Hp{c8=knq}vWY3|qI`P^4&g7Z2hCS4_7n~?dvgBI+ zi;ErBOA&q~MSdhD!oPn1xy;i&zAR9T*XP&Bahy*i-xcn?yN|r;&ljTdSm0>IWa4** zwm5o4@GT}di!l{q`j8YK6GF>KDi#E9@U2UqP;qtLlxFx2mH4V%Tx;(Wn%tx~lEKhj z!Q4`+>_Km=`J99)E>Z4tAN^B1=P+eLr-B9%ym{5BWVSDoz^M#IzTD;BHv3*I(J zV6W#t!Q4Je;C!hyjqi;Q?o6|v5Zvq2%-^17jx_Trm5Hsl0Z_Zqy-(rxR(CL-Tx0I~ z(_7=m9j2wZYe^x0&)IY1NWmT7%e1Xb0x@5Dc5Fw;Gq&8Y#ukX9Y_)AJP{NlwA$;)@ zmgWiU%25J*VEf-i&Nsk1)u*=AN%GeqwzldZ_B<<-@+d0@>yhUOnWVLrH2es?0)qVN zebYBA0cAPaqErE_tpvap!E3b$vqD#5N5Z1a)wU)~csT5(RX*CI8SJ?ZhI?k*_jvBe zlO6iGO4YiOj!GQTRMAYU1Gw-dpL!jtWo2|Y%Ga!QFoKy>2P03t4wmP>PFz%Mf3PiF z&sC4ZRloPE4wwMw$`cy_T&Uvdjlh6<28NA|;cM1LFoK!X2u5rZ8^N}twROU9-S1Jq z?torki$Sv&p!wyDw_k_mr3EfjFI12(?rneq>8pYQ4GK*t)S#saEj4ImLMshAlaTq) z38q`$xw;Ai*;1*>R#k#_vU*OvfQQaKM7D*fj<3=@MwZR1Rveg!D$JaT93$IiIXXVo z9dpKa=%;UPo>eRVqdfXMYhc5u!J9LYW3-s9W7PQ18Q_@FJe_Lw=~9df&&1fE+i#ib za^?H7aG}OqJ`Xg%jx;*@*Xr?Oa&c6S2hG$FsFO*R_ AnE(I) literal 0 HcmV?d00001 diff --git a/test/request/cubic/test.cpp b/test/request/cubic/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/request/cubic/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/request/cubic_periodic/normal.png b/test/request/cubic_periodic/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4c66fccdc51cf437ef68249f0cc8c4063221de GIT binary patch literal 5354 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 L(9|IB0L1t|h&3K6 literal 0 HcmV?d00001 diff --git a/test/request/cubic_periodic/normal.slvs b/test/request/cubic_periodic/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..d4f9c72e0bf1f5dd2181402e3b59b3e1580f51e0 GIT binary patch literal 5595 zcmd^DOLNmO5Wf3waE`~1w7|iK4is)oCY^=@!$EbF)>B7zCFfO!9|inDBw0__a%?9Z z4&>75uJ-ZmuC!nB>-V3VBHzNB5~Of`y#Su)ea6M6^dJ0f64akih^j*glM5;n|0A%5 z$r}t;5JQwgBE)Ht7dTn1YGWZJk6HOC!=y^2b&25;u6(is@ccilim=L($NXQ&>NkouKS{)@)W00wJzNqlxo zDEu&BZRcXod#MdOwNaNg3WUEc$X$);2px5Xj=Dp~&cx`*bwFlXcU-1*$E8{ea^SN! zr}^nhj6$wEz$!MvJUY!h9&a9ZR+VYpRb^UtRjKxrsxou4s*{0bW%g!S$Jm>79cn-2 zh1F9r34`{x+;x+f1G4}Z!_Ce7$Aq66b2TFTrC~lM{9D6*G9vza(|$|>z;tjlfjNBI zKvLO6Mhf{dq_4Io1^1lv7?ejUQcfN=bn6y~vH?0CLgOi0gDOQz_*xO-SC25YBgAyE z%VNMiwCOr`< zRNytpm4d#CLP4q3LJ>;Z=vwSawP+ZGkrCWc<#VSgMO)@ zI{Dln;0&h9W?Ubbi%{0n>_fft2dATaowW~EGNbxn;WYc;*qR!+=-77e;w>+a9{L}B zK7O>v4PaAw;vg^=s(I!hFrJ`%_q#Thud@zu4hl&Drq@% zO3)7bNYoiyS^hq8Qd6B^ee{qxNRU3*6N#$vd6BqCp3d*wK-5J1D>R_7wA&6o6kE635Ts~#7_=_;gQH|UUCXhZ z6a$u9NRj;bkrJ8w`u*ps$Ts+@L<>B>yg{DleI~`a^dJ0964akih^l>wlQWQs?>SoG zzk%D$M>kh*X?3`dXv)hHp7VoL)Rs^ zrBvAwoT1%^BBvEWXQE)j|^buE!he?`G$_(XL7@|d$Zt&NFJaQ@U{w@e2M!h&d*SFmHxgm0K z{N!(w&}YWYk8mbxQIPaL&FdP6a8#oHpGq}D1g%&j`>c~8%P?StN*0jygj}-JxSAFleHVl$q8YmucN`L2IQP`0QP1e!74`%5?=8Vaq;-tF$?H)2DJNEU#Uu>cUozKCVh&6K&W4+t z_{W5w8hte){JCL1Cj48&eljBdd((al0AxBi2w;w%)|giIvLS_h=E1A&Nx?l|OpLWe zDi(a|uVIcBIZStG525jtt+CETO88n4;#ZF_wIjqZza<%X2Mf@w;46@pZrj!iY0@B8 z6VyTMWnQJ#URI8+5P>ITl2$Eg_z~wy2J&0*-P}TiDlf&3a=W40})<^e= zV+qm+duF0IK5ZthB~Rl!bt0-G{#7Eb#aO4@vm~m4Pn*er<~lwV^dN()6-^Tk2i99PZw8|=Uv$SmWBm)?OjQ&fe$xvd?eJWQ{{<=6 BgdqR` literal 0 HcmV?d00001 diff --git a/test/request/cubic_periodic/test.cpp b/test/request/cubic_periodic/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/request/cubic_periodic/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/request/datum_point/normal.png b/test/request/datum_point/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..9d2eef7705883bbf7fb43986c76e9a44d1ec3f4b GIT binary patch literal 4187 zcmchbe>BwT9>b49II zD0GfZ8wQad4Ku!FPf|+qbB&p?XB0IV)-+@=?w8D*8P;U?oO}Op=A7p|&-gs=&*$@c zf1XL$wZk2?*laNX0Oj$m>mC3!@Kb*}+VBcHD6I4_M&{2yk9^9iU@kwSb{bF#r!WO~CdvNCW7g|3{l9NKRtrehO!DQkqqfJ^7>9 zhc9ibU`rU(7~$k))+>B_miSAHq)>x))WzE0`eA?aT$?k&_?mvaUX_SnqaKkY!XrTqfsNetvLBS2#A8|F$C zEf40A26&nP!r@ewl_eJ7+eMbZ!dkuoA3#_pL4uTx4?gAss?HFlEihFC3r-sgN!aAo zj#3G{V~=41Skakrr;Oo{?bqg&UK}R`!r<~)= zU>%hjOU>)7azFqK8m+RdNC6rTIkuHWF9H`8=h{BQyG;P-C%J%_qFkq-1(vXBU3u65 zF!h>K9Q#^%EL}iPPgAKGM(;zq6m2iOh&Hof=b{gU{pn;0kF55srZ_$V zoT|36{uTg;e}yQ3;LmCM&R0Q&DXC^?qCe{Ay#ZFLvQe(ST1SbAEi0tl)&`C#x+dEn z4~S4;Cyea#)h*eNjeG}Pry)nbc}?nYk1jOAgVmU4ab%bWC&zl9{oYiR-SKo%wx*;z zO49_BRP$&|B&euZ^1aESi;%_#M6OSWEu1x5qD+)8t+1_;u{KYcN_LHGtgM|uatdej zleb+6+Tfm5TjWA?hkfUOPt9+gFU;{sza_CY)BtiB<7}L;m5*g#r_wV0SzY7ntn%(S zoSFEr46(j1LU(PYQLI*Cpe6M!g{1W?LzJq!uKPZVg>vlh)Wb2lnVKfs)9x5|Q_Miz zFUGrCNBz!&lu%E@$W>G6>$28VQ-<&csRr4PvjYV}Y-UO%v9`xNa^Gxfsi|vmXL)M# zVil%-8nwzjD$#0VmS>uQZrlt5OfS|u4E{X3Mb+^Cbs5F>w(+0jit^YY)GG+1IBf<{ z`V8tZ`YF`z-LtJs&4|)K=J@Vd`v)DP)_;}24SS8SGn@qI_A{MDu(07nIkUN~W@buj zFE6{XUv3)H8_Pd!HcI6&r&}RM96Q#1^K3{d3}Mb>fGMJow=xujoZ7emvMLRM@BqRf zbM7F(^CKV4jvktJ8ktO*ZRV=fR1Roy(Q1k`Zt?~q{%&Y13M~8<{+wx{lcvb#{ey%w@T1Bv6%^l}@@gMaj zv-2QTB%aK`$Y)BLiCFK};chs| zgBCE{F-xZiKV7N`E6Uol-C-ITDH)b>qbmN%i3Vt>R1ZO4y(Ne+if955+T6Z4FZWUb znZ`pi z5=lu=o)qna_LYt7yrKmJeR>7Dt9KA-(NA|BLqOu|#JDh+^Z;`qfNSnp$I$f2)w#-& zq1J=$`#3Ya!^^;BPB?!-NKYO7(7C>;`1KKz76>%NBQa$f^bMq_Ylv7$4~_u{+cbn8 z>Anc4vf8T_ZFB%&wqS=u^_8o1fS^jGDfHlb_#b+J+9~Zd>1GMF+kV1YnSs6tE|g~k zYqzG*67OxT2jbBmKaB82t|su~te8iNa*6?j^^L~(fz{t;dtD9o%19~z-W=-ak zZwmp z#-VZK;7vBfd`MoC#HPJ5&e8*wm+uCglZ2NH7EtdGZYgo$@HusZ=^~x6cjNq+=Z(H2 zJgJ`$gy=Rd#bved0PhqtJO@k08}E&^*n%$#hf3+uVAmGt(E3}O1Dvgm=dFU$_> zd^Ga?Y1t3jbWc-&pq@m_}X#T$*+3#xpamz|3!rX3ye>4Cd-|TQL{3jvqzc=%b%m4rY literal 0 HcmV?d00001 diff --git a/test/request/datum_point/normal.slvs b/test/request/datum_point/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..50f88770f08431241ac8461beb650b8d3b384b83 GIT binary patch literal 4333 zcmd^C&2pPC5We#oJ(~fXbb8^?Y0}<08E4`iIz1>LJB+a)5@0)>K2+Nm>vO`M!Ymnh@Mz+*{ z$LWf4$^t4-93*kV{ne^+Mxoe5>F0=x%vatiry*V0Vn@=4Wmn4Rnq>5$UtC)kk%%5+ z>Z=Szo&H2*?&ry$T*2uRx3yxC%Xj=a~2X-Ck5i0Xe$;9lMW;TBG0jrlGYbO z4(wH!cjwHyUf__W*rj$aJ zJ~)mi^Ff1t`t!%~#P_wGu_Dj*ZWt(5F5%HSVpW^C5LZF@FA94{IN8ceV#`|s@Lfli zy%by4vDO{bdP7>z!FUCUO@$da+8aFD8$Nn&Obl9X0J7AY&y`y9xu9)9c5FFwx}TxM z0CH6U$=C#U?=tuKbocont5R!bRcg(wg7y+trF)ar*_pIT|0bwi@eTX)6m zx_^|LE|TxWpwBrKS$mHvVL6LoXjn?HE_ZHY<0?f^?yek$e!^fGL3*gMv~Ocm zds_HbC(Pgcgsbiet`_Y2ww_|DLt#zD0EM?Ki?V~Nkz8Vqg)&88E$PHTyEK7!#dqgN za}T15C45U_t$^!?3fSRG{c?elR$@!3v7psXMVB%in2b6`e>S5d*U6NT;d-8kJb)7p z{aQgaJ{-;hE@A3yrqw})a221;I#kQ$>~wUjSFJ-UnMrkM;cV8yFrI7RSg~SnT9C)4 zhw-K_r%gxP0NIrnHi8VHi`Q%fxsY`1ao465>s1?}mCU3@XyrDs5llO^uM@`GzWAqY zNAvVOn^FqAfAG9OQjZ2=`%ngdZ-{IhKfAlo zccpXt!(dp8l(RKUsv7%Xs!;z=rMe-U#IliH*~yTl@5w@zV#hhw`n}qqPaAj`uON|) z|DL0R-lK#5qvuv&&_q2cORfD}skNUA+D6KrE9XM{>jMTUR~3+qO>hs+bDvLlpZBsV zwRTpe*3K$u&tX-%o2<@8(klH;TBrD%ypHw1D2c7RVs_a*$ZQu$`kVQmbYIZtEfsll z*C}B+a$#sVO0X{XqOlc~Vp%SoEsXIrf#m}5P~&J{W19wA_*N&(-~5D&_6fcg?7H@t zVyZ=9O+^od*GbOugQ}6-Ri1+~MPMyy#X-9)g$KcR?}xeWP?e-SCXrUa^+N@0<$L|) zfRa{XN2#%()#^l-5)Mp89itn~;K((YGBRAx6OnuJghRhpsaoF$qY{^CYBba8AVc_y zPqPlyav2Rr$9mN|G{8)%LnBYK4wms;Cyo^>_O=CiYnaU X#%w*yf5p*k=~VH~!7H~Ho-OfzGIkP* literal 0 HcmV?d00001 diff --git a/test/request/datum_point/test.cpp b/test/request/datum_point/test.cpp new file mode 100644 index 0000000..c83a901 --- /dev/null +++ b/test/request/datum_point/test.cpp @@ -0,0 +1,13 @@ +#include "harness.h" + +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); +} diff --git a/test/request/line_segment/line_segment.png b/test/request/line_segment/line_segment.png deleted file mode 100644 index d1dfb503e50e16d407b8958dd84037ba7b039132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4300 zcmcIo3sh2R9{)h`RhDL{m1R>i){L5z=3`Q^m*r8LrhKJ|G^CYU_VAIK3QgrS8Sab? zJ}TLcX)~lq4>tApIuaS{m>#6(Jez0O+N;ZQtT`=K27~^VBOJ!;7zh>1Vl9D8A zN+=VV+?SQoSMnF8rYJaooXus27oW6i)xFjbEo4P_sRmqr&{kC-&ZO=I14;0l?f`$DMNT5X?KP8iBEz?7h4ma8m4Xi}_XR0=y=9*% zb+z29r6^t>0P77^s(PG)-(Thn=$EF4kU$J>UI;vXSCiH+%jc-#bG^T>Xmm@2^Tae zY5?a%R`1UbYb4+5T#vJliRquEV>XFd(I{cHEd)x03qMWikqzq#?|*C3jxkxnh#^h zx?fE}##K4LdRii@RS!a0U$}m)f+Zm5XxZ`UvZh+U-W!IEI)FUn#m$x`t{)k`HGH+4 zWqv`pr9)~UZKI4|(4#Ct#vCOMXToPQkT@I9R^92cCIQ}-OQmrx1CVh^Ufe8ooRfIm zkFeZ{@*i(z5DLe*se&bEYlWP7V5KXrDkV`OxrULB^jt}Diu}UMTRQfZ!h@tzik+#X z`}t+W$|}pPuu2rw9^EG@|DOelZbE;gPIs= zh3vwsR4hgJ;?K(uKDyZkK-uuIw^qbh0sHwxl%6Ojd$s$KDx%F4Rkt)^zWVl1)x!in z7C_-xS2E=rT^{}%if+(kVQ)o5nY2b&6(?CFN#pb|eTBRb1P>PTm5@Q#>jR`gll*4u z@z$tLd>iap6YnLJoK}DDI{%`M3SnbV<*6E>uwc-o!nY;Wk{8bBj`ok1BuOyh_c771 z1K0hO9xSO>(5Td)l@(c5;#)CC{%Bra4U3S6AYR+t9%fexerZJCu~1Y) zmVg}l^JX+@D5J6H%;nN^Vi@5hez!QE?AsCJ@>mC5h16Q)>*CFe(MNhP4PFutPl`bO z6mFEztnBWvs*~>~<{1OXN7h*5;SukUQ`P0P!-` zLiQdN#Q04!O-r?^sm9I6tVJ>DBoK=%jwNe=wlo>XnFmF>?RRGSw`zeW#1@3r9YiUm zi%+|(O3Y3Y5xpQSq6<4yjg;r7G?)6Yz<>qjaw(izIETQYko;ivv~+)U69I+~eNcYF z$&9mVBcU^eS+(usu#-xn1h_fKr(yyfLx$~VFVF?_wK5Y-dGgotQs0>#rRdEHSeopI z*uRzhL`QCrb9IuBsTj`0tP^6)v}@JI3Nl*DicNgvSz&77B=J9CstVy2ju-yq;%#c6 zzg8BFxad(0LCehKa>I&FgG~g4#8kkt*)}@}{kvvF6{mMRVm0N!a93?<|MN`vx)zcH0+I?7oKGBh&p>`} zY)yCOcGMbE=BaQj3G6leZ3$=H)}chiGx46i6PhLX%6Rr0uOQ3Em{ zijo8_ZWNrRV-pAa&tU5r)slZ+eqi+{KwsFP#$Q(w=KN!sz%)<|Jg{e4K5jh2w`J!< zm{-Kqw<5#q7W0cb#VxH@;~u6y&kGKC#>MVycsi>2_nq9LF|R`R*Msv*9ZHIM4V|cK z4YoD5J(iExh}gRTM2U;gPh9+Y&{F=fOE;W`DPIeGziW6ukklhxOIvPDF_pmKVWK_p z$@(Fi-_LQgy1Tyy_EQ9K7q*Le^pW)*-eI@QUJFdySLM} H;?DgGHx|g{ diff --git a/test/request/line_segment/normal.png b/test/request/line_segment/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..189436b5fea5b76caada587eeb81886d1f415833 GIT binary patch literal 4303 zcmcJTdo+~$8pnT_LF9IvG?gNIZ|!}s4JCGRsjbuwT|{p2b|ys%xic;^YSpn4r_>md zc6Cz5Z738*ui8-&Wilh0QAuLl;!M-H&3S3YnxScHuXX;InYG^adoR!L`F=m&=bfY- zPWCEFOO*fsDqFYM?E*m7ZR(>aj~uB!Kz<2;I%%ujhTTzF{j3ck?XFrUp4FdQOvkON z+li@M@nmj5)*qR~S7RcK%vSFSZf=vnUXUkwS zb2uj?cCT-@OZR{y01bbjq-{7h#kYqo1MAOpgo`Hav;o+kG=-gM$m>bTkhrS!#?=-V zvMj-7dKgPxRMzz3iqQ&ij>*})d1Yj_24K~bbj#$vb469E2?gHWH? zq8!Tu5?7TjUrb#^#2~;p(!+lhl{LLMfu@!pTgqiDj!o<5;h1R%^6jV%GTe| z0pxQFgcf<%5>_X@5t26RbYl)I2UqvD+kg{Yd%{UuF4!B&(p+^Hm8jy2d$ZF7D^-Q0>XzRQE_u10cqDa)8q(_Gk)MG z8(xhE&@Pd`$b0C^SI=zL%(5>ECKmq|>0i-V~ZVoEv z2aoDoS&Ldb1_grD>PbE?DE#(_$7eBy$@L~K@d(Yjwg3<0}31Iizo2JPLla6_601AD0PufBngH_Vw1s#` z2uSQX;s)6$I9zHw#FLAoobT&zX$IhI#8exr!-GH+Mpjw(E#7Jq>1m=u^R#PGaYYFm zl`VcIqN#FpLyNUU^!l<6;}quPI9x55$a|RBso@4&#A604Q;ma`C>dF(64Aj5Iqt!R zh&IZz_&0r8?iTX7MFsvyh9wBNK83V=7f#toTxFNZnz8DxU&h~umYqj(?HqSmp$d&? z_Vj_eUkJa{l{5Tzucr8lu|Vst=osz}unillRb#^>`Wgu+`*z4(J@U0;t#yTWUjkdMt%7Bmi zKaT>0qvTk*@>(nzgj+}OhFA$Pu5LMKS@(xpDlZIPj^fVk{FiK^Iq7h+J%NTmFgf0!pW0# z)K$QGs)=0Qp|*$X81=n!a8|8KKINzHIQ)Z)7Z^o7*q_irwDhY8OkVEhLf_2z5WnSn z(1066(km&jyell?9g@cLVAjchG zPZ+b7wbtPmgkrD<|B^N1@s&;}`%%q{%a~5GF$lWdlHtD;V0~ zSY)b8U6GZ$2qfD>RzEr$08Dzif0XSTB~bg$o^6FGN6A33br&J4_Xdwn8AR0`o1~$m zdTtZVder_U4@Q@pQz>>@fO-n2;Cdd}#5btvpDQTFYGiAVE9P%=G`_9|8oG*QIbEop zf~01AT24X0;kYsO*>1smk6f!T>vWcmJ-9vOMl5adEFbY6J2=Q1_0)1Uz$D!*f^};b z=JTo|Wa5oV9M%uV4$BcJOMjtyZ>E#{pV!~`8w#r>z@er{@ZnllzA%t?n zCy`6`^Qz1~owkF7 zwqV3l&`9D{`aYqpXe#AJ4;CMezRPQj-Frs+T&_0*GqdE!!e1pQNv$MXsRpi zx_~b0jh~dkJihI7jN8V1@Dl$xn8S}fD^K_pV@_p;t=*3|X&2RB=KY47md)fhco_3c+t&2A;S%~ghZrLfd4G(k*{0S8a4&nO-|Jj5 zH1u*^wwl1mLOW$c3O`UIqKBL<1JrVPTCYoW`3-JC+xq&7<9n+vC7B`9#5=Ag^K`}~ zovD{&9Z&PV-P^AkMtR+=@=^dNr|0EZ6$$3f;lP}CD)ID_o~(0+Z81(tGPuu1-EQrc V8luMU$R8D8>n10=!i`Yk{{SSx$Qb|t literal 0 HcmV?d00001 diff --git a/test/request/line_segment/line_segment_v21.slvs b/test/request/line_segment/normal.slvs similarity index 100% rename from test/request/line_segment/line_segment_v21.slvs rename to test/request/line_segment/normal.slvs diff --git a/test/request/line_segment/line_segment_v20.slvs b/test/request/line_segment/normal_v20.slvs similarity index 100% rename from test/request/line_segment/line_segment_v20.slvs rename to test/request/line_segment/normal_v20.slvs diff --git a/test/request/line_segment/test.cpp b/test/request/line_segment/test.cpp index b203ace..c83a901 100644 --- a/test/request/line_segment/test.cpp +++ b/test/request/line_segment/test.cpp @@ -1,17 +1,13 @@ #include "harness.h" -TEST_CASE(load_v20) { - CHECK_LOAD("line_segment_v20.slvs"); - CHECK_RENDER("line_segment.png"); +TEST_CASE(roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); } -TEST_CASE(roundtrip_v21) { - CHECK_LOAD("line_segment_v21.slvs"); - CHECK_RENDER("line_segment.png"); - CHECK_SAVE("line_segment_v21.slvs"); -} - -TEST_CASE(migrate_v20_to_v21) { - CHECK_LOAD("line_segment_v20.slvs"); - CHECK_SAVE("line_segment_v21.slvs"); +TEST_CASE(migrate_from_v20) { + CHECK_LOAD("normal_v20.slvs"); + CHECK_RENDER("normal.png"); + CHECK_SAVE("normal.slvs"); } diff --git a/test/request/ttf_text/normal.png b/test/request/ttf_text/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..1e35997ef5c70cc4a9dddcdecc8f1ef1f2ae6934 GIT binary patch literal 5390 zcmcIo3pA8#+kOn=5E6yb-i?y%3dOEyi_yWM96HIVp;1bjFvyuPWUK5p8-+^7x9t>W z%;YSmsg$G)gCWCAg`7>r7|k?%Z-tNS-PgDN^{+LvX1(vc>wfR&zOVawuIssUz}if9 zk;)9`@go?K5k<0f+s#F}P#NyzHIY$+Tx8K($)z zpBCK^=bmi@!<)=5KSx?K0|(Ft)=dXmZr2!d?K|tj*P*qTfw9a!@7?nX?C(x;%8`Qs z^xB!I3p#+uSsv!f1I;xvy|8yeui%P;^SbxH^n_XxWBY72%WpTSAucG_2$rsA61Q?* zBPkY`VaKo~0I2CqM_t(Iu@l#`;{aNI78nDtx;qH4{EE~xKpr0{IR2f8!Q-C!LW`8_Y)CI6hM>N@liGklFXHaUZY;P(A)O5?~3T@8)Q}O57EWcfuu@h-I zaiGttu`7CBD~ITgWwr=0KsBFp(ZPEwl2X2N zmeLWUs4y{OF9_B16HaEd7xGmBFg-pUb>Tqv)oeL}5TUM_?Pv=;=^zqp{%PrSg)Zlu ze)PSAEllZ!78QJWtYq~J;64w3Spg%rMM4B@R+x#pfE|pHnOS^Epd>#tX+&+xWxfc0 z=e6kyp;0CqPt9ie?aK7k?65JMs{8++in&5lZ+$*K0alp?hB}juVV#G8|C6` zNBtsBHp>B-r!&LewZT#6+k-ModB(^$rF=;|Ynh?vEZ{zaT$@yg;qCfe z@9w`?iCX_3CbWp!yrB*cPC~GS@KI8mM;NQFp<0bd&aEv#M+=C)$WoGTv3cn2x2POUz@|5S3_ zE&h_WmyMi%5!BWABtF1%2Kco@GMu8NVVwLXCo)^^B_6t~PI*}!EScg~6IiV=gk+MR zC^%wOA;{L>k6aqKZ2hI$2Xte>W24yDy%`E&XV;|OkWxxL;8nM+!o(Jn>45czN%uVr zPy0AZ^}OvsEwx`0mDukQ?Dv6lqw8a9v*V4aNjHfAghP_-s~?~;R#LY}*WdDwa@wgY%F%c#>wK3KE z8n%{WzNxO|T=pHk)bnr+Y$@uV0q@KfR*^`(3HttC8F||#-qfbC#-n?PrJHE_g^|10 zJ8CVpr{3+<7R9+VS9Kc}dy+>t6j_p9mWwGFGyT)rhkMmo&f)#dXUKX7!u*E%!&n?l z-8j-Pb9H9E41~VhMdwtwPiS1P-Gfz={QRwnIj*Xjm#$V%9zs-&_22#2!CUiNMplU8 z>V^t(c??#A5Ytg_TX<#)sGF>qWrNGB9W@!(1)-qMmJD zvLqW#4~IkL!d2ezskIdR^I#dGT}{ClD*cvA5!atAMXgp~=7)u;xDaq0I>&&{QHD@K zJyij>{bgMe%8T}7Uq=sL7DPi^PII3WBrd&8zrHDW-%Aktm|UWO;PVac%mdS-5Z?`=Jy;qPo1=+;G6D9UiJ#R zQeQTDS5x*u0JIG})Tc+CqGh$@3$;G*<44pcVuG|^kffBb8#1i1Nl{H23w_9lyZ?a^cDLJ2mrfJKK|8@iedbaw zJw3E~t@OA$1^nWVu;VqVr>8@^y7h^_q*^nu_u_H_;?*CZkuYifo2>K42ZQY5E^4-2 zpu(bm_R%EDW~qy8rMt?-?t&nz`?~s#(>bk*=W3lA2dtn%tq4*Xt)-{O(IYqt_S8RO z-zve82#drvTFxJiORt)h9D6A<0K;5=>Mu(PupD}4nnq(KxD4|Q5Ypprk#L#YJ_^1D zcY_PA6#LzvO`av&$zDHx-%U)ZA?|IrVB5BYxq;QF4x ze%>#a)9L2sme)pZ+lJH}*{~tl5HV;(j19c3O2NC3g2;EYnuu;L+|k0VH58jOW$ZuB^jFb4I4z5{Yi?!`{gIDllnN z?x#&FO!$To{dm|9S6Mu;_g&)NXGy%2b{}R^^dp+zQXc#I`c5GYOD3=rhGRAcLn+@b zGHuD>WW|sSlgo-&Nm@KkPESFhcitPph=wJ`(|4d!*>()lR9?f}Q`guyZtE(GB!W@D zMy1=}%2?04++N;DDA_Jb(GY6HQMC%0$;L}V1nvG?nY!#lA4XBZ1hRwfuWHbrhY6NH zGKMl9l-bE>Uu*uMe{U5ZhYIer>-D*n^w%q|H>Iw{FzG<|F^v*8va`U{=14_$9zDmm zbc8Hw2#JH|iTvWysuee>kq12jH;MyYXv6oecZLIfKroT~@7@SfgV!_joJ7G;?X>I= zZvG(7*zmRD{bw0OE%}n;99Q-|I(<%RkX5ic{32HbjJtkOk9b^4s3=D9Yb`Tha?Vv~ zXw)bw@96)mz~-1mNCakPooxjmWZJM8BP}Z<3Kt07xo@5CJ~!unB8gcs_vyj!k>_)) zA>)8OvLDBoEpCotFBRcbn^;7ig#kxkN8C>1%!a z4X6FjGU{8Ze6DA2fqzy(0KI=&_Vrz;)uY%hFh8LYek3F4NZ?$rG-M%eE`aFYcBFos zaiev7&=x}cKTG0ST@9t>7qQjqWSKZ)H5D!Pkw1-4v11y__9Ps^kpJ}rmf)kmWmE%M{N2jxTDX2;<$2KUOjJhJlGsN zDVkHbS}kX5lP2hESsu~SPJW`&&_fQ7fv(M*(6aj8?RCQm|7w8YyH>hI`oS_CK*I%g zwj3HkR_NBoD*_ z%ko7UfpNvCxGiRlG-!KNDw?x39uBIdh>Sf-V2L^fcTp3l?m>5M2sQ`X%{n%$4gkmbf;NUf_rnAjTEf!w<#UiCrX?kxsrJ!yZakk(;hX@PgXKj z1#jptlkS9^3*{8~hA>%9y`8N|t9mO0UAQ9GvXf;;i}S~DA;livi>dosAEGk*x#37b zntJQe{O1*(w6ekSds-H`yffjLs-hm8;H zaui;jcD5QA(b%1-!S0!qK;ODY{pDflG7EP3m<$gNQq9@D=uT^;SbmapaXfcu!qe;F z&n@!fXQv3P-VhI7=Xg$$D0Tf0YLqk+`oRo$k^mp9=t%SQt^q=-@RkQ%2bxrjI6ubt{br`M3iwms><(DjZD(<4a$a zovf%9Xb8{tCVF%tEWDZu0*Zx=v{x^LMYgXeCDKh_o#1A%k{=BBzkOZl_n~yc3G40M z->u71aJd@OzXD**3oW8Jk===RSqW_~P6)DuI0a0Rmq5)6`L0Cgz3_wpx?mQq^mnf^ zb-VIGe6xT!79OI^Vd?p2M}lJ!Klz5sK2w>3&N;ze M6YD*>yU>yU22fj42><{9 literal 0 HcmV?d00001 diff --git a/test/request/ttf_text/normal.slvs b/test/request/ttf_text/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..3022dcf0b25c755db851dfb563ca3461fd117bc8 GIT binary patch literal 5134 zcmd^D&2pPC5We#oJ)6Ne>GZ;()26v~GES2oIz1>@PMBas1o$VNK2+Nm>7gEetd+) z_=72Ox*>V=!~5yIU#)5oEm(#qEU}c4Grpo+(}cu>F&e|1xPe5>W06?yP?{fT1b7*B4KtZ9=u*p;dL7lpkboNUA+@x?2F z^yh&ndrkJdr`&ljH|*nv0ovP=)K!=s*I}>gu;2B<85p!&Ps)Pp_A9t|hrgr`6)j40k4s{`3t(t@l5kt^{MN>ojJV#N z6)YW=!7>DRkmD)c)};_C;%j+Wyt;=I(*tZwMcCQ4u0*N>p@yOZp_GS{B>F=4rLw+e zaEP4KtW2uSZ0VQf+JO5E80A6MQ!L!TLz)CzQ#w9TE@yB9eG9&~cQ&#z#y2EY3>X#2 zfP3RwU0G26hU`f;7Qfm5s8WXmQ(W1wM>E>84yLvYqh!ExPoCiPbCas`$T=!;k*11f zS{;Omxx}+whh`BT9gec~qIEEWnN$ZO&vqRgt3)S`72EDz%lxV6VZ7+$u;_>vAiDCI zjUY^@;s>j&e*ZbolPxxQwq8Ml_gmQ$X0V zG=7{VboU|8O2KKIiCRIEd65_pItrRUC>_lj; z+0g)VzGB?KRa}*KOe}9_aW*RwnlW^wOA&9`*PP!eDe(R-2qH;68kC!B75uFwa&dg` zKakLu&g}<-VJ&hV-^5u};}A?W>i?-!XOz=aHnJ}}8L|umSx6=JyrS=&1kbxf2*PQBTTJ>poX%-RFX~k#gY6xzK+4fI-St1ten=+@t5Y&!@Z3 zds&rQH>*^~vJd|m&Yf0-&v@3GBynGA3+p8H>S<99`ngKgd6zjTahaw;Gp!CXM5y_+>rgGigW;H1FItBN zm`QbLd16^4ZoL$vLJ fOu|Pm;yW0PJ?b3)ql|CacB