summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/polygon
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/polygon')
-rw-r--r--src/boost/libs/polygon/CMakeLists.txt17
-rw-r--r--src/boost/libs/polygon/Jamfile.v220
-rw-r--r--src/boost/libs/polygon/benchmark/Jamfile.v242
-rw-r--r--src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_points.pngbin0 -> 10492 bytes
-rw-r--r--src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_segments.pngbin0 -> 10402 bytes
-rw-r--r--src/boost/libs/polygon/benchmark/input_data/voronoi_point.txt10001
-rw-r--r--src/boost/libs/polygon/benchmark/input_data/voronoi_segment.txt5915
-rw-r--r--src/boost/libs/polygon/benchmark/voronoi_benchmark.cpp156
-rw-r--r--src/boost/libs/polygon/benchmark/voronoi_benchmark_points.cpp151
-rw-r--r--src/boost/libs/polygon/benchmark/voronoi_benchmark_segments.cpp205
-rw-r--r--src/boost/libs/polygon/example/Jamfile.v243
-rw-r--r--src/boost/libs/polygon/example/gtl_custom_point.cpp120
-rw-r--r--src/boost/libs/polygon/example/gtl_custom_polygon.cpp146
-rw-r--r--src/boost/libs/polygon/example/gtl_custom_polygon_set.cpp203
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_001.txt10
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_002.txt16
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_003.txt10
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_004.txt10
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_005.txt8
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_006.txt9
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_007.txt14
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_008.txt12
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_009.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_010.txt25
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_011.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/polygon/polygon_012.txt14
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_001.txt2
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_002.txt3
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_003.txt3
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_004.txt3
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_005.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_006.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_007.txt12
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_008.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_009.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_010.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_011.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_012.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_013.txt14
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_014.txt13
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_015.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_016.txt101
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_017.txt3
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_018.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_019.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_020.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_021.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_022.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_023.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_024.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_025.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_026.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_027.txt12
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_028.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_029.txt10
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_030.txt14
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_031.txt15
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_032.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_033.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_034.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_035.txt22
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_036.txt102
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_037.txt102
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_038.txt222
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_039.txt322
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_040.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_041.txt8
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_042.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_043.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_044.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_045.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_046.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_047.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_048.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_049.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_050.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_051.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_052.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_053.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_054.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_055.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_056.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_057.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_058.txt9
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_059.txt12
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_060.txt12
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_061.txt9
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_062.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_063.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_064.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_065.txt89
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_066.txt195
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_067.txt193
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_068.txt98
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_069.txt83
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_070.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_071.txt94
-rw-r--r--src/boost/libs/polygon/example/input_data/primary/primary_072.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_001.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_002.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_003.txt11
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_004.txt101
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_005.txt101
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_006.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_007.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_008.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_009.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_010.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_011.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_012.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_013.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_014.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_015.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_016.txt8
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_017.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_018.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_019.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_020.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_021.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_022.txt5
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_023.txt8
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_024.txt7
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_025.txt4
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_026.txt6
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_027.txt8
-rw-r--r--src/boost/libs/polygon/example/input_data/random/random_028.txt7
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_001.pngbin0 -> 9500 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_002.pngbin0 -> 12207 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_003.pngbin0 -> 7968 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_004.pngbin0 -> 8940 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_005.pngbin0 -> 7298 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_006.pngbin0 -> 6019 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_007.pngbin0 -> 14067 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_008.pngbin0 -> 10448 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_009.pngbin0 -> 3888 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_010.pngbin0 -> 8950 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_011.pngbin0 -> 14867 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/polygon/polygon_012.pngbin0 -> 11417 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_001.pngbin0 -> 2842 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_002.pngbin0 -> 2861 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_003.pngbin0 -> 2877 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_004.pngbin0 -> 5182 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_005.pngbin0 -> 3211 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_006.pngbin0 -> 2981 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_007.pngbin0 -> 9544 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_008.pngbin0 -> 17041 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_009.pngbin0 -> 14278 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_010.pngbin0 -> 6278 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_011.pngbin0 -> 4652 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_012.pngbin0 -> 2953 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_013.pngbin0 -> 12323 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_014.pngbin0 -> 13061 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_015.pngbin0 -> 4778 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_016.pngbin0 -> 47851 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_017.pngbin0 -> 6351 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_018.pngbin0 -> 8900 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_019.pngbin0 -> 9141 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_020.pngbin0 -> 5768 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_021.pngbin0 -> 4957 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_022.pngbin0 -> 7705 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_023.pngbin0 -> 5431 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_024.pngbin0 -> 5344 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_025.pngbin0 -> 6234 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_026.pngbin0 -> 12161 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_027.pngbin0 -> 15319 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_028.pngbin0 -> 8837 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_029.pngbin0 -> 14114 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_030.pngbin0 -> 27849 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_031.pngbin0 -> 26276 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_032.pngbin0 -> 7399 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_033.pngbin0 -> 5549 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_034.pngbin0 -> 10666 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_035.pngbin0 -> 31164 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_036.pngbin0 -> 61406 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_037.pngbin0 -> 50157 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_038.pngbin0 -> 7359 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_039.pngbin0 -> 7862 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_040.pngbin0 -> 8257 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_041.pngbin0 -> 7631 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_042.pngbin0 -> 10438 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_043.pngbin0 -> 10944 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_044.pngbin0 -> 9482 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_045.pngbin0 -> 12269 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_046.pngbin0 -> 8573 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_047.pngbin0 -> 7449 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_048.pngbin0 -> 11755 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_049.pngbin0 -> 14124 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_050.pngbin0 -> 5447 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_051.pngbin0 -> 12672 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_052.pngbin0 -> 7824 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_053.pngbin0 -> 6396 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_054.pngbin0 -> 11227 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_055.pngbin0 -> 12364 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_056.pngbin0 -> 4297 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_057.pngbin0 -> 7456 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_058.pngbin0 -> 11550 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_059.pngbin0 -> 13852 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_060.pngbin0 -> 13852 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_061.pngbin0 -> 12784 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_062.pngbin0 -> 6202 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_063.pngbin0 -> 10667 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_064.pngbin0 -> 12733 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_065.pngbin0 -> 38011 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_066.pngbin0 -> 48815 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_067.pngbin0 -> 47665 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_068.pngbin0 -> 42123 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_069.pngbin0 -> 36872 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_070.pngbin0 -> 5049 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_071.pngbin0 -> 37845 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/primary/primary_072.pngbin0 -> 4264 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_001.pngbin0 -> 8550 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_002.pngbin0 -> 7787 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_003.pngbin0 -> 7724 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_004.pngbin0 -> 27628 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_005.pngbin0 -> 27628 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_006.pngbin0 -> 8754 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_007.pngbin0 -> 10159 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_008.pngbin0 -> 11149 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_009.pngbin0 -> 10923 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_010.pngbin0 -> 9809 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_011.pngbin0 -> 9952 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_012.pngbin0 -> 7909 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_013.pngbin0 -> 12090 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_014.pngbin0 -> 11311 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_015.pngbin0 -> 8121 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_016.pngbin0 -> 12758 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_017.pngbin0 -> 8311 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_018.pngbin0 -> 9593 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_019.pngbin0 -> 11819 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_020.pngbin0 -> 12134 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_021.pngbin0 -> 9570 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_022.pngbin0 -> 9476 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_023.pngbin0 -> 10424 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_024.pngbin0 -> 9721 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_025.pngbin0 -> 7163 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_026.pngbin0 -> 11099 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_027.pngbin0 -> 12574 bytes
-rw-r--r--src/boost/libs/polygon/example/output_data/random/random_028.pngbin0 -> 12887 bytes
-rw-r--r--src/boost/libs/polygon/example/voronoi_advanced_tutorial.cpp145
-rw-r--r--src/boost/libs/polygon/example/voronoi_basic_tutorial.cpp198
-rw-r--r--src/boost/libs/polygon/example/voronoi_visual_utils.hpp186
-rw-r--r--src/boost/libs/polygon/example/voronoi_visualizer.cpp509
-rw-r--r--src/boost/libs/polygon/index.html24
-rw-r--r--src/boost/libs/polygon/meta/libraries.json18
-rw-r--r--src/boost/libs/polygon/test/Jamfile.v226
-rw-r--r--src/boost/libs/polygon/test/gtl_boost_unit_test.cpp3866
-rw-r--r--src/boost/libs/polygon/test/polygon_90_data_test.cpp52
-rw-r--r--src/boost/libs/polygon/test/polygon_interval_test.cpp271
-rw-r--r--src/boost/libs/polygon/test/polygon_point_test.cpp205
-rw-r--r--src/boost/libs/polygon/test/polygon_rectangle_formation_test.cpp44
-rw-r--r--src/boost/libs/polygon/test/polygon_rectangle_test.cpp45
-rw-r--r--src/boost/libs/polygon/test/polygon_segment_test.cpp485
-rw-r--r--src/boost/libs/polygon/test/polygon_set_data_test.cpp114
-rw-r--r--src/boost/libs/polygon/test/voronoi_builder_test.cpp681
-rw-r--r--src/boost/libs/polygon/test/voronoi_ctypes_test.cpp334
-rw-r--r--src/boost/libs/polygon/test/voronoi_diagram_test.cpp125
-rw-r--r--src/boost/libs/polygon/test/voronoi_geometry_type_test.cpp34
-rw-r--r--src/boost/libs/polygon/test/voronoi_predicates_test.cpp636
-rw-r--r--src/boost/libs/polygon/test/voronoi_robust_fpt_test.cpp405
-rw-r--r--src/boost/libs/polygon/test/voronoi_structures_test.cpp150
-rw-r--r--src/boost/libs/polygon/test/voronoi_test_helper.hpp260
261 files changed, 28395 insertions, 0 deletions
diff --git a/src/boost/libs/polygon/CMakeLists.txt b/src/boost/libs/polygon/CMakeLists.txt
new file mode 100644
index 000000000..931f58a17
--- /dev/null
+++ b/src/boost/libs/polygon/CMakeLists.txt
@@ -0,0 +1,17 @@
+# Copyright 2018 Glen Joseph Fernandes
+# (glenjofe@gmail.com)
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (http://www.boost.org/LICENSE_1_0.txt)
+
+cmake_minimum_required(VERSION 3.5)
+
+project(BoostPolygon LANGUAGES CXX)
+
+add_library(boost_polygon INTERFACE)
+
+add_library(Boost::polygon ALIAS boost_polygon)
+
+target_include_directories(boost_polygon INTERFACE include)
+
+target_link_libraries(boost_polygon INTERFACE Boost::config)
diff --git a/src/boost/libs/polygon/Jamfile.v2 b/src/boost/libs/polygon/Jamfile.v2
new file mode 100644
index 000000000..cbae96c15
--- /dev/null
+++ b/src/boost/libs/polygon/Jamfile.v2
@@ -0,0 +1,20 @@
+# Boost Build v2 Jamroot for Polygon unit
+#
+# Copyright 2010 Intel Corporation
+#
+# Use, modification and distribution is subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+project
+ : requirements
+ <warnings>all
+ <toolset>intel:<warnings>on
+ <toolset>intel-win:<cxxflags>"/bigobj"
+ <toolset>gcc:<cxxflags>"-pedantic -Wall -Wstrict-aliasing -fstrict-aliasing -Wno-long-long"
+ <toolset>msvc:<cxxflags>"/W4 /bigobj"
+ <include>../..
+ <include>.
+ ;
+
+
diff --git a/src/boost/libs/polygon/benchmark/Jamfile.v2 b/src/boost/libs/polygon/benchmark/Jamfile.v2
new file mode 100644
index 000000000..53c19a3a0
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/Jamfile.v2
@@ -0,0 +1,42 @@
+# Copyright Andrii Sydorchuk 2010-2012.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+# Path constants required by the benchmarks.
+path-constant GMP_ROOT : /home/slevin/Workspace/Libraries/gmp ;
+path-constant MPFR_ROOT : /home/slevin/Workspace/Libraries/mpfr ;
+path-constant CGAL_ROOT : /home/slevin/Workspace/Libraries/cgal ;
+path-constant SHULL_ROOT : /home/slevin/Workspace/Libraries/s_hull ;
+
+project voronoi-benchmark
+ :
+ requirements
+ <include>$(CGAL_ROOT)/include
+ <include>$(SHULL_ROOT)/include
+ <toolset>gcc:<library>$(GMP_ROOT)/lib/libgmp.so
+ <toolset>gcc:<library>$(MPFR_ROOT)/lib/libmpfr.so
+ <toolset>gcc:<library>$(CGAL_ROOT)/lib/libCGAL.so
+ <toolset>gcc:<library>$(CGAL_ROOT)/lib/libCGAL_Core.so
+ <toolset>gcc:<library>$(SHULL_ROOT)/s_hull.so
+ <toolset>gcc:<library>$(BOOST_ROOT)/libs/timer/build//boost_timer
+ <toolset>gcc:<library>$(BOOST_ROOT)/libs/thread/build//boost_thread
+ <toolset>gcc:<library>$(BOOST_ROOT)/libs/test/build//boost_unit_test_framework
+ ;
+
+alias "benchmark-general"
+ :
+ [ run voronoi_benchmark.cpp ]
+ ;
+
+alias "benchmark-points"
+ :
+ [ run voronoi_benchmark_points.cpp ]
+ ;
+
+alias "benchmark-segments"
+ :
+ [ run voronoi_benchmark_segments.cpp ]
+ ;
diff --git a/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_points.png b/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_points.png
new file mode 100644
index 000000000..c3825054d
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_points.png
Binary files differ
diff --git a/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_segments.png b/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_segments.png
new file mode 100644
index 000000000..0bbc03625
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_segments.png
Binary files differ
diff --git a/src/boost/libs/polygon/benchmark/input_data/voronoi_point.txt b/src/boost/libs/polygon/benchmark/input_data/voronoi_point.txt
new file mode 100644
index 000000000..a9fb87f4f
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/input_data/voronoi_point.txt
@@ -0,0 +1,10001 @@
+10000
+-1901163173 -797183991
+1072538781 2038566753
+-1722099487 2031547532
+-1500282383 -1246565046
+-1533785272 -41239070
+1577075827 -78210248
+-1102193165 244389016
+530954850 58192926
+-1261330763 69171810
+-1306794927 259316249
+403175311 -1077123435
+426126601 -2100971833
+-2139884750 325575595
+-1661445746 479738928
+2116797514 1964838271
+1168122864 169246856
+-177635709 -2118406464
+59092446 -941898791
+-1746533660 1634170612
+-1844027101 1691580855
+954482790 -2033451287
+1052573310 -678601803
+-899861567 1023180380
+1839138703 -1247183390
+-230606913 1027627479
+1597786564 776752486
+295512346 -1614652009
+710238273 1160791766
+6269997 832929268
+-1339156185 1025118479
+1340643437 1299176876
+700453225 -1989191690
+-1349301462 -1021264476
+800302101 -1638627234
+-1102125324 -1922304558
+-1681577042 -1646753081
+-1375491576 1873771789
+192794234 1384679003
+1001337608 -1027787262
+-808297724 218075712
+-1564536813 -621518211
+-916152412 2082092279
+1845343876 -1912357572
+547516807 803945681
+754673669 -705242851
+-706237956 354737508
+466851611 2012923271
+1217350015 1952408450
+842212720 -1515373126
+-1353827043 -1654014041
+-505102299 -1928059273
+1983454679 748799938
+345373202 945208299
+-136755580 494582433
+-1527969343 -197389551
+1738712516 1301383829
+-1252030420 357671661
+-1843819984 1238141935
+1306785789 -964306446
+1052139237 -638735686
+-2124765692 776132039
+-1838545493 -614850178
+-165444477 -1607941657
+-106850613 1507299019
+578481769 124926251
+2124305214 -2096435197
+1689864674 1754240714
+81576947 -970762633
+-1585074153 -1905955994
+1773007096 -1925229085
+-2138058716 -632884665
+-1108403020 -1770496081
+-1814467658 -654139631
+-1664276877 -1774620494
+-1827107716 2037090397
+-162914878 648905475
+1129581726 357665942
+1254638875 -250811995
+1412689776 1053766545
+2020349395 -1161539412
+-594233272 -1694048696
+-929431994 -661893617
+1823890393 -2116522354
+61666661 954777997
+521459593 1153825647
+838071470 -1046269160
+175799525 1935759389
+2097851509 -74070491
+-623069170 1121236284
+-1308426882 784874833
+1759830598 1563201328
+1436115709 1940492304
+-1506206446 493415253
+581939505 -1535810742
+691104126 -1662057554
+1078865446 772303351
+-1239415888 211974514
+-2120773905 -634218051
+499931141 -542763880
+1905751147 -1211021147
+-1679925364 711853754
+-1915052958 -1529731008
+107928040 1301484570
+-1249905397 1490401626
+1011013213 -2042622173
+509762090 1529334998
+-1199804963 1296037639
+-982582953 -911388850
+-1287953346 -837851908
+788332905 -498242496
+-485962700 -1765344131
+1119836441 -1719531138
+2138314375 -2060924655
+1751718732 -744192613
+-60325638 -1807331708
+1808623439 863289820
+1946739554 1748371283
+-787992055 1009249517
+-1678571644 1082190096
+-1583797830 -141975953
+1287019851 2119124338
+79068230 -1228378990
+-1950932300 59309620
+1657150125 336720040
+-682184474 1853329423
+-543193283 1802132126
+1413673963 -1298722211
+-1896558785 675170212
+-1072507908 406847410
+1951540296 -192269484
+1572745544 311159715
+-1988023285 -271180513
+-1238632495 -1418563758
+1737892412 1058529
+488824291 1420600179
+1994561889 -1126228829
+35774456 -106841514
+1590668523 -700366584
+710594513 241214568
+1163150024 -1390230566
+1694060915 1185229629
+1273122848 -1350743459
+-309910062 -1844920978
+-838857196 -1224968724
+-1694829549 -38875197
+-374371035 -58865889
+-882311593 -658445678
+1646932569 -1866494927
+181103285 -489997954
+-1700781154 783037602
+-529085584 814846051
+-2043986558 1008821295
+-417716912 -813743516
+2066323455 -1094474141
+1947505191 -1976260924
+180390564 -1300788208
+633577629 -577152987
+-1927803378 1768824722
+802577466 -1038806291
+-213868743 -1151410603
+-1165996733 262293498
+289402562 -661007203
+735198031 -1289171067
+-574789350 -768813340
+1568144854 -706601756
+1331630016 734392962
+-126493586 624057542
+1583328231 -1330778133
+1415367625 137012765
+-1405811491 756314065
+-2060099605 -98830877
+145901505 676467954
+-810687287 1255559991
+-472348786 -1764207339
+-1689036859 99717550
+1797645844 1666589077
+-1429540280 -1763343873
+-355798611 602821363
+-1919219987 312718403
+-580672633 -939157780
+-338823957 1229072681
+-1369896274 -610685798
+-252917642 489400275
+-1202864513 870528273
+-867365019 2030036207
+-395976310 1079595991
+1751463105 -1416025908
+-536736748 1612333403
+1963784343 -866889871
+1555891403 372761082
+-1645133683 -1819453242
+-799113651 -1040024774
+2085697559 -2065168699
+1365864314 -515659124
+-312509359 -1097578501
+-1449599877 -355647384
+1109330417 659005365
+2031191692 849335973
+-1709074322 -1191476096
+414703299 -320183848
+-484850439 373262601
+-427846100 1579843811
+214921674 -1122120946
+2059012310 174939087
+721793841 -142531754
+-73958202 1558382214
+-923278980 -1121996456
+-491302555 1549146899
+937168377 -750914534
+-2062573877 -65050
+-2078733429 -934080282
+812784384 -641132310
+130499436 441106038
+982269560 -1277070118
+143533253 1964966422
+-1579253373 541897201
+-548748267 56390423
+-1000185536 601215905
+547987285 368659482
+-1568242145 539386559
+1533420648 -1893355000
+-1061420216 -770391458
+1351745449 1071620562
+772539467 -87733530
+1095029215 -295825048
+-1104713822 980787111
+-402178176 180133683
+-87724492 2084015454
+-465048108 1972832424
+1014569295 -1580115071
+-1608001062 1603446489
+1490265848 2001621132
+-1682590015 1065735990
+244667177 -542248298
+-500522556 -828654878
+1903657582 264085928
+-298959569 -659322997
+-1444563850 -710650076
+1877901567 1574914371
+-401283961 1644426163
+-860433050 -592860905
+1155492893 -16009401
+389268912 810923383
+-610172036 -490584634
+418188500 -1523182490
+-64704951 -2061568286
+-377130554 609180383
+311984829 1831696049
+748541720 -1956947018
+-1086427848 -1964996727
+794652339 2103431649
+-1843280189 -389471683
+386628013 -1456573114
+-54005612 -1384491184
+-1996911836 745704099
+-236598823 789846274
+-1839426052 -1262651085
+1546919300 -418542895
+-1711105004 -579493163
+1699344788 667542268
+-951880116 -1009717111
+1582993476 -181312468
+-141692335 104431378
+-135991166 1216750172
+428972915 355320246
+148114153 294686755
+-1247719495 -73967835
+-1567122657 1891390767
+-2068951607 1701860873
+954989048 1852918165
+1910112944 -142861662
+671585808 -844739541
+-424595914 -731723196
+-1746177713 718795934
+488996068 -1474968781
+550657206 -192773748
+-1170780301 -624157347
+-624751639 -2135659991
+-1465113398 106140691
+-1960607086 -1897731148
+1217617815 1529420960
+-766287364 -369616215
+-1388404657 -1692711996
+-1494705897 1076749749
+1865753258 -56242651
+-503828153 -1721172385
+968634499 409738094
+137749223 -1808721764
+549783200 -1595492157
+-1136633191 -1837600654
+-1292764942 462586994
+340217772 1344907407
+-422494652 1283055500
+116237892 1337837032
+-1371171908 -103186897
+1948117481 -670868257
+-1549018782 -1411740450
+1589626229 -2145956312
+-608056711 -1732722658
+105087506 217685359
+1965426864 1121382773
+713929602 -11507906
+-1820131323 -1747317183
+1132683396 -812985964
+-1722886981 -733312617
+-1652192107 854383194
+-2032814625 232799022
+-2003494404 471295099
+-979092031 1736668487
+-1704350728 -1299939568
+-1432695160 1552515252
+514015890 266393190
+338389119 1932150807
+-1943223200 1986237244
+364460421 1921077881
+1375922810 1913893698
+-1411941707 -3777360
+-1412387489 159682536
+1473039835 898630667
+1948201809 100703752
+-1919714935 -855998956
+-1619467405 -1417058590
+-1601661500 2066931948
+-1687741646 458119424
+-1635549406 1572324960
+-2107800755 1431882283
+549991626 -530653
+-859513316 -242140569
+-1592665662 1231749361
+-2009052379 -366166142
+-1403722045 1411373893
+1943773802 -922000741
+49088507 516195751
+555750684 -1181082443
+-233050826 -1379291551
+930588171 -1518470196
+-913218677 1423447355
+-1941849036 714940631
+-622604803 1203047653
+51776507 -1211698451
+-27566204 207290373
+707307453 -1561002893
+-839394293 -1575976368
+-1589609094 -930048167
+1857445999 18607743
+1496210481 -756126547
+682629567 1119839749
+2119155830 2116350794
+36886130 -522565353
+-67253884 -1148961987
+1774461376 1631411057
+-282137351 -419032165
+1871536055 -1448476842
+1363108749 486959927
+-1992860114 -1024791090
+388398617 -360044669
+1544863831 1943103074
+964376190 106057477
+1828365088 1566813183
+1703834828 2859603
+-1380063605 1305390991
+-342456799 -1722248377
+1822239838 -1213657544
+317882232 460911073
+-2086549215 1284706390
+1186138780 118083920
+1625325811 2099925680
+1311451765 -458604979
+826918712 1673402260
+1450376156 -1834765432
+1167164817 2113367376
+1140424140 953431617
+959190113 384340388
+-1378573393 -1834950799
+-851440686 -950026275
+613573842 183662332
+-1032892484 -141948964
+26429497 1483982628
+-2105544929 -1849983792
+1400139429 -778350011
+-1512376055 1619562328
+34934426 597125261
+1469975897 -60107338
+383030189 321187247
+2085296263 -402743289
+933729589 896229917
+1009654420 115180643
+-325900197 -582834351
+1903203394 -937832359
+1574071778 2081311626
+459389863 928550946
+-1437683824 -371914142
+-1092807811 -926762733
+-1020782439 -1912953090
+1065143168 -1051481294
+-1025820038 -1199186937
+2114886190 -783771297
+-864543976 1415183045
+-407130487 1226832492
+1654656205 1474060295
+-275127970 1148072391
+1001055618 760189300
+-1022963514 1039173112
+-1309506963 -2142265766
+-1512953492 2127490371
+1992549527 -1977755538
+826049182 1087000798
+-198495682 1204578187
+-1849583411 688130410
+413423406 -1055214603
+453646427 -1053261222
+-33843269 1299675872
+-1484114741 -83777592
+-1669189246 -1000300207
+-908456567 981814954
+450241889 496954157
+-1718348213 30140166
+1946039878 -99050225
+-1536854088 -125177648
+1748048703 -789694423
+-1396895665 1762346041
+-858113112 -1963803482
+1777647221 500253517
+-1440874896 1852223386
+175887845 742739529
+-2124484112 1322449392
+1136014522 -1099248030
+-244555402 101748502
+1438832079 189340292
+-1323901384 758465272
+506429723 -1128363997
+1296109151 1372792742
+335919454 59664576
+132326313 2017666520
+1249449311 -2113325720
+1981224730 987733256
+-1874285006 1558909813
+1593158661 467788942
+-1824368991 1743927726
+-635284823 467329723
+551597105 -2106948583
+-1165695152 -58711748
+-1081300344 115005302
+1530902579 -307810478
+1883738388 -1960771407
+-1692238813 1915857680
+-155258731 792892897
+-1941377781 916634345
+-730038381 1874213271
+-1820760063 -161644773
+1945907978 -1605824783
+-138262711 -1744593558
+953199478 2101543170
+454035865 552156920
+2135173428 -1273496584
+-917296326 -310091448
+-389016067 829870928
+-1097566504 -585553022
+112098314 -1018515896
+1841907618 478237753
+-597446572 -681925336
+1147175455 1386791586
+-1277058502 -1024090997
+450875192 230036247
+-991341744 -1316662647
+-744386917 1299352912
+437548180 125318934
+1982559667 -44183934
+527179214 1295514480
+168466510 -1885774886
+-1864640620 423944844
+1110771421 -1815415331
+-932796361 -602571803
+591091466 757549049
+-1717284933 -1656288785
+447753731 -537594623
+1232114953 -1726143743
+912518935 -16835697
+-948589149 -1120733628
+-1899972725 -350868056
+257289389 -1375211114
+1133696384 2075149141
+-485446835 -1181566062
+-236566301 1363092395
+1836329265 104558336
+324524409 402768098
+1547993062 -1547264436
+-712408549 980726699
+-405036778 193968659
+513760995 -79522830
+-1424764849 477644197
+1786249360 -1297678299
+-115617203 30110687
+1257206255 -645026438
+-1281790064 2122651073
+516727663 1710719608
+-1408442994 313539517
+-207097498 1976593604
+930225585 -1960598242
+2078877779 -650972816
+619490269 -949811428
+1025738235 824950437
+534016760 -131893965
+971576238 -1726388104
+-388088651 -1377805333
+-722863805 -1791742259
+977301845 845066179
+1877620695 1277416229
+835096684 -532033862
+195545095 -498246707
+2037751494 -840905079
+1129922493 1313888044
+349899486 -78007894
+703502646 -941778118
+912210534 -813969526
+1114534678 546982105
+-716235508 1701768146
+-1983153820 771854968
+-1548341038 574240077
+1895686485 -972788834
+541179350 -1958833601
+490348339 -210124500
+-909009754 1267193889
+-1621114271 818111470
+-250003863 1926346972
+-1780619173 -2002534213
+-284141276 1415970568
+210461267 -1405490789
+-838124951 1340397896
+1682132464 506090642
+-1507577009 996826812
+-487816215 955093195
+1142638420 1369546849
+-1112519469 -1770946765
+-1798811566 -1594992831
+920460358 -1122006520
+-1391368254 -423337581
+1001384892 265819661
+-636725227 1369094538
+128631566 278597146
+2114987486 893710100
+442153463 -468888171
+900396459 -1629078366
+-2117931037 333202289
+297045891 -1296732755
+2125948616 2003593706
+1979659703 -1757859569
+-1032634626 -1773609656
+-761679777 -888601645
+983255094 387744613
+-1298429197 -1397366956
+1392930798 459727364
+1234817130 -1751664687
+222558038 -1295749754
+-366863814 -707357177
+-298432854 1050220154
+2040250099 235779551
+146355335 476164935
+-1515203596 1770385934
+-406764527 -1248386176
+1299540444 405468328
+1341037154 -1738780064
+961098682 -174693098
+-1392701123 1790620332
+22374512 2134035431
+1114477686 1153574015
+-1339495922 -622679243
+1812084065 -2146290028
+-1134799132 1224530716
+1902566265 2085505168
+-103527492 -504598100
+-527527712 1454026437
+-342886137 -1372045257
+-1584113019 -974439057
+442567720 -395614679
+-1897855609 -631893220
+-965320043 722806637
+-1248816204 -1677336509
+-320569039 1117899471
+-1180106321 480869322
+-463959939 1519842813
+1299016650 1357243782
+-1063995674 1589602091
+1695013653 677954492
+-675087485 -404070919
+-170070332 -1856987227
+-822144243 1639075177
+-872609511 -624081065
+1875217521 2044201340
+-248901635 2073777098
+40524694 873868071
+2100649595 1012247611
+-1501841302 -185692419
+-518979637 32980940
+1498562114 -1585944219
+-914608656 -1260823604
+1039737614 1301535339
+641181282 647044542
+-2003965410 -275579916
+-1355868191 -1912551297
+1029819672 -1978779081
+-396258216 -817003043
+772539121 1091297560
+1959443035 -263767710
+1435844702 835996941
+-24703833 1235082867
+874769097 -1942530329
+1307377028 1901793965
+139953704 -2117563382
+-92849202 -1678365068
+-992448193 -1805760039
+302340880 860178944
+-1614241596 -1063931300
+-1066977639 2139895351
+593585671 -1938618211
+-2078539950 -1041038331
+1602552792 -2093705757
+568909885 223019564
+979335087 1527957080
+-1410675387 -1885310343
+-1326193230 532461043
+-229271264 1031465172
+47156505 -1255536199
+1425570095 -2132317352
+-1077875409 1270408121
+-865776454 922374570
+1991832759 -2044595912
+-1894830227 -1766621388
+-787445264 -1973838009
+734894529 966476333
+-1778537855 -1919144045
+454799610 1397976468
+546659315 282019590
+1044719303 1129742944
+-779999543 -1318325742
+1075877587 -982379697
+-1386037993 2049269330
+-1998615970 -539180307
+1853010770 638258737
+-1901283408 -347728837
+1235725476 1530133294
+1098917240 1492769271
+-981018312 -1448717938
+-1256996240 583341214
+-637863974 636239050
+-1228095766 -485671168
+-147771508 -96262131
+1829009710 1567724299
+496720218 30840598
+-1865884404 -1722535048
+478364879 1635016796
+830747412 325716876
+-412913283 -37632305
+-542611919 -1139490972
+861638393 355798384
+468685018 538688934
+-1060769674 -937684640
+-126070766 1971903365
+-476758151 2064371989
+-1229723019 -2118350063
+1305761636 -1679708185
+-920625099 -1939999114
+230874750 -1191686217
+-641309641 1480591215
+-1990430288 -454665154
+2074412230 1572885389
+-1621260711 1719575665
+1679507169 2035548622
+265219331 688513909
+-368181161 1426713688
+-310945134 1830455217
+1667210413 -1686486093
+811749952 -2070334555
+50802924 1638944856
+219529671 262345690
+2022538251 1712608640
+2132515468 1454717822
+300267003 996620889
+1866569094 1795721817
+1624867395 -1057600756
+82569162 -2104923677
+1843629688 -996565009
+2056144854 2076976074
+-232560079 1486861106
+-2090667063 1202527372
+24332246 952247388
+1518189219 1379544341
+-1198138023 -351653016
+-503930472 -1868065928
+-280203377 -883149994
+1663546558 1597802531
+312446333 -1209744882
+-611714120 1005880311
+469422634 442537516
+-1028171030 -1396913669
+-711770975 -528241376
+-1169572957 -481623064
+730452078 1060671154
+227659917 1457514290
+1833027809 539519287
+1782865458 40695551
+-529374212 714992401
+1979509958 1476199433
+-1775446676 -1561786342
+1562036604 -1711847518
+472942306 1974000497
+-1448866404 -263087436
+-2067468781 1389639477
+1232646634 805504556
+1873530425 -1639813926
+-1325516315 635519148
+2018725110 1062143666
+-854010312 2095045600
+1891878485 1066682671
+-277179807 1371085871
+1615303730 1442762056
+803782616 1491071300
+-1933306305 1871890622
+202398474 -645260617
+-721941665 1925982316
+1081268714 140538093
+-1558566108 1844134146
+1869736878 -2096504653
+-2063937495 1971796924
+-177534887 -1239186303
+1246047268 1607127803
+-1291781323 783378886
+-668554191 -1477814606
+-725850787 -229966886
+67052802 -1651665846
+808870618 -818683237
+1911693195 -1332460060
+2002345655 2012155586
+1514081427 -1565104530
+-1873274794 772168079
+-776885977 -1441386414
+-141870348 -652628467
+574433228 592525481
+-1559702421 1833432685
+1722033780 -149197815
+-1732088021 1069453942
+-628535063 -1325095948
+2057810430 -2053011372
+-1249473469 -562015311
+-1869532159 1249247689
+2002213944 -719953798
+-1876148222 675182239
+1147917049 -863736680
+1086815646 987491576
+1919420283 -1571832924
+-1517832102 -976136700
+-711949544 1588008042
+1398903971 -983086925
+1805052744 -1064410670
+-1059158347 1065930884
+-1839097659 -141973712
+-743098561 1256660337
+408908223 -271842045
+1600427129 -1974392888
+-1535913866 -1263276445
+-1990968971 -121114639
+880675086 -2042481386
+1796068184 -241175483
+-1893177701 1309968130
+101966380 -1844221665
+-2022800020 -1485326845
+1767839190 -943540964
+-539712832 -485360305
+1354418076 1000524087
+1470373675 -1749596557
+-772757089 -349627418
+-195304588 -828738603
+-1719952266 653452838
+-1110380786 -1477882045
+1660701243 2006772381
+1078645198 -1871608338
+555282107 929611365
+-329620369 -406478313
+-1570085127 507414012
+1860446119 2019771029
+1497527008 -41589536
+-1743233590 -110411269
+-920557288 -2112846472
+-82983282 -593030543
+-1926094389 526998850
+-1991258778 1523976324
+-1185787071 -357842343
+373756379 395374988
+744802312 1156732634
+2088245322 -942774522
+120606 1106364195
+-1662340091 1305818783
+-320052373 1067560495
+1703925127 -966533396
+-1710584335 1240766896
+-1524060104 1722455456
+1983034994 1889277953
+1682485951 1027077607
+-430655579 1947478074
+-1616961904 -1667388894
+124508217 -237049888
+692133355 3322149
+930628187 -1908704427
+-1951099862 88112098
+-620786548 1827316483
+-132876226 -1206378649
+1881921913 -1870030952
+-457191408 -1666697365
+-855987678 855930698
+-1538791223 2086779743
+646992316 -1546996701
+-434858393 -558461769
+936858898 1484904769
+1803336533 -1951449714
+-893710953 1831759368
+-825119276 40096480
+-470892339 -1930830616
+-1672912270 -1224106662
+-873823546 -1983297149
+-1164970841 -1637368213
+1602052651 248778848
+-1188021078 -921599948
+-1578303249 -1060970529
+-398033145 750662728
+-1502938384 270364163
+1537399727 -1928538932
+1490893258 1440377564
+1680106108 1855833790
+1157739852 1132295415
+-1193261325 -34821498
+45579446 331388875
+500686048 979500533
+857116961 -1762514269
+-2136390715 492566528
+1696710365 -680482459
+1039811104 1748211680
+1407110139 -1355844278
+-1156907626 -1101740369
+1822471712 1142633986
+-1983708301 309910039
+-648200923 -1230559775
+-1687473122 -640328988
+-541518756 -990962193
+-1283802682 1290256967
+-1773872181 -1034465411
+-270535007 565902582
+38170773 316809045
+-531169032 -2084856979
+-1656860208 118804140
+2046920483 316805477
+89110254 402040709
+-1827911191 -422503943
+-1228111635 1722602703
+-1988435878 -1189945802
+-75227268 -1380553169
+260296214 -1926320021
+702759876 2053012039
+-1472571321 -683453224
+1506451206 -844829387
+-1226578653 -1569942866
+490295903 655726631
+1757805328 -475503002
+1077076343 -434080194
+1207840943 376599713
+163553541 -413163167
+1652577848 -2078586643
+-1527281497 1682882541
+-503476128 -1533130065
+-22335774 220015630
+-1463525620 1948922654
+-1387861650 512071353
+-1858383419 669792091
+-1307333312 -1576873626
+-1110381632 -1923281974
+1489164041 977966850
+107123926 456886094
+-512137248 -1668781044
+-542324725 138314661
+-572426907 -218253448
+1297446538 51343227
+2101428900 977823102
+1448701525 553608288
+-1221878978 1337362631
+504447085 -1289093998
+-1399019810 455478418
+-2089871701 -337445695
+-1382116499 603289176
+-587344309 -1714894789
+1495539687 -812345007
+654514963 1212721643
+1330869400 1026704350
+1857750584 -415344679
+1170323119 309100685
+1356540141 -532148477
+-504614927 -1322343507
+-427057639 -709238642
+1059436788 1243617941
+-1291778016 -1515088078
+598134010 1952301848
+1083822053 -1381958211
+-577220135 372721116
+-464390237 -1983214107
+356079929 -1279277408
+-1726333459 -1147057140
+1516235179 -1926000012
+595656338 -545096133
+1280441998 1716687719
+225143763 401614007
+534645117 1064291799
+816713388 -447521804
+367093078 109767123
+-453558559 239315401
+-1515963124 981856502
+-574245446 78927294
+649035281 1653875946
+1103978275 1365854411
+1079697720 524183819
+-819036358 -529129074
+-1332837594 -1984098581
+-1973712822 -1531116798
+1112271124 643307200
+-789503879 -1382632899
+341290032 2012013282
+-999753924 630098473
+892058030 -1012974523
+-783290717 -199702706
+-1223543003 1213832447
+-1195206871 1576688466
+-992651423 -405719234
+-2053833877 -1822479235
+-629518005 150383627
+1424345385 1573386051
+-2009983501 -801135400
+-82660237 22482621
+111484101 -1596064304
+-646476652 1540333441
+702823860 906411910
+1885079674 622381792
+731804146 232677863
+-2097455491 1262620407
+2012276990 2117678251
+1754419672 -1639977803
+461658547 -1195339547
+-136362838 1158636666
+942297579 1891239568
+1658354312 -1904754835
+-1023557500 2080189117
+-516492590 -328604056
+1612066833 1387815117
+-683781273 447441160
+1321632297 12544255
+-1231929822 1634184766
+-834102553 1074753420
+-2145498838 1815629840
+941143860 -960344921
+-478992685 -943383663
+-2119528593 1444986236
+100729823 1742503565
+1145845180 -243061624
+360121902 1720393457
+1878602594 4458979
+-1089931369 -1199136631
+-952420434 81590894
+1721261648 -448453634
+-1824442441 397153516
+259294889 982534957
+-383689102 389358745
+688954799 378533341
+-1837703963 -2044645519
+-71575683 1418424089
+-1868879980 486523610
+-1905942553 -131288777
+146581621 -203344556
+1264728605 -1121757858
+-1094313058 -245354349
+819800004 1098007645
+2039612049 2071436122
+-617566842 1816660287
+221014467 -1536905806
+433530003 -822014869
+-811266996 38633702
+183700592 1115043259
+415281035 -115851121
+404120551 -1109272981
+1218513585 -423745477
+2092228062 256284317
+-1558751814 -1719247935
+710681928 -860921801
+-102633208 1707619453
+-919074418 1236705144
+1044383795 -1939801653
+945556268 -921125085
+1286818827 -207943952
+1306422946 -1198972372
+-1070597006 -319494174
+529664312 -768176207
+-2076490409 725651068
+-1110707428 444944454
+-229983347 756062602
+-291663413 -168914749
+-1265817305 -1680790041
+-1512484106 742975815
+1527876230 328377946
+-404379589 -528598985
+1370119933 969100428
+-1407508406 -196010456
+1000872927 -1121578119
+-223772357 -856391057
+-129146648 -146516436
+-452923106 1358238388
+38348228 153769595
+-1270932538 -1150610159
+214264389 933057181
+1832682888 568692499
+280801541 -1407810559
+1418068710 -706879532
+1932445410 -1765486044
+-1433478461 2074128238
+2131449258 -1013388923
+1540894445 -2031030020
+-2108689601 -731716680
+1879263342 1767729840
+740806054 -1872251025
+955335973 1141923349
+1604836730 732564493
+-411151062 1020658255
+1498111077 1166256179
+-801901555 -1851468789
+1763158387 -948309824
+1532786539 1788220229
+416005781 -1931502081
+-1578964211 401565388
+-450370370 1504776328
+1591643302 1293474608
+57087678 -1201592554
+100146696 305289192
+5196750 1868910565
+-305939714 -2101435663
+60794352 -2140836164
+58692915 -2079322276
+1683714322 1695529645
+-1013770155 -1532053347
+-2042992794 722950585
+1370533167 1305914704
+60640013 1156223085
+1055984998 1360276890
+367901995 2042112700
+908381827 1571146766
+-1070917368 -298097114
+426912336 -1931102295
+-317050145 213289127
+-211024294 1067901432
+1594927761 107489781
+-581372766 677141886
+1850834022 -642685567
+367267138 1766469915
+-1696001652 -2007337036
+668397274 1353419974
+772475764 44699372
+-1248065726 426576247
+536217169 1932035045
+1220242183 784224943
+1792758820 -86303200
+1209052295 -32877849
+695301040 734537954
+-1466111752 -470291895
+1580174206 -410620181
+-928874273 337746970
+-258186339 -772474458
+1250610931 1291883925
+1385348791 -1329427878
+-1158476568 887385094
+1986041232 1591489164
+660284742 28728757
+317600913 2114929783
+147179290 355291062
+1370806384 -797050565
+1639869926 -984816204
+1004299398 -1817999802
+709422366 -551058461
+556867383 -1699707738
+154071859 399305658
+-558047040 -1906033221
+-1818912914 1183106823
+265748500 1668156753
+1249114101 686008352
+-61664891 1388456347
+-783818178 -1386254010
+2031014878 -1797158786
+-1605100242 1542635697
+-1056760457 1896193156
+-1026912871 2032757402
+100908514 -1309130114
+-871433416 683415915
+1221552369 1717492285
+178381090 1320729238
+-1709374389 1216428113
+-125095648 51418846
+1823096654 399018221
+364835351 -704557769
+1159607956 -1761965694
+140685943 -929803430
+1750968695 -222813391
+-1994111703 103300609
+-1543933170 -2112816435
+-1952578248 642285516
+1046618408 -927757687
+-207510742 266987516
+-1845759182 -977984729
+23555760 -1556674676
+-980936744 383465635
+922287259 -835911515
+1730716431 -1546743605
+-422022765 1543665030
+1756200156 2000825587
+-820964095 -737702445
+1137055578 -181111269
+552975788 -1379652906
+-1237053575 -1515996293
+143313975 1869743975
+-1253983956 503721724
+-424318180 -2054913313
+1764699038 -1537683911
+-1394613766 -2124828493
+-632750765 802229624
+-1809323984 -989418519
+-833227833 327044392
+-772304030 -373489954
+-1548494392 204290869
+-270862256 1911113220
+-451008662 -1645875630
+-1529676414 -442977036
+1464354130 631690440
+-464245395 -1542349141
+1121511457 493543798
+-1713819422 -1368061618
+-52048636 1824737098
+784826023 284034070
+-2126863179 661333461
+2092341403 1927447945
+-1833241952 -667823448
+1036008933 -175500135
+2045639224 556319100
+1385143733 2111016993
+267258421 1154431601
+-21629263 -374181615
+1947163131 -318975231
+-946715036 1328753453
+-1780787663 -490202258
+-530164896 615153978
+-1478381754 301626801
+-1617376580 360675697
+673908162 -2106389230
+1993114083 258229197
+2035338137 -1827285071
+1388307823 -932307106
+16859521 178260160
+-333967834 2008070733
+-449778515 259621938
+-744733328 -779111748
+18361184 83465068
+-940679045 -727818254
+1341904419 -1758354788
+-358871215 52103792
+2035056418 1274518839
+-170674212 419426020
+1768112150 -212442022
+-1989446493 -258980031
+1899645387 786882479
+-1846793473 -1918693916
+220264845 1786322236
+-483064526 1745617268
+317157319 -354514878
+-325961138 1922878527
+-1520436189 -531115811
+-1979044260 -1964186340
+-147052085 997634834
+-1502970493 -1848186412
+-550339805 -75310919
+-1584431526 1224365679
+1108516970 -1228552040
+1562659096 -1562756141
+2123521779 1877425581
+-1369747622 1302191583
+41753 -266448631
+-1083318294 -72500673
+-554111228 -1525363781
+-2078013096 -392028908
+2056256521 1092211357
+460697916 -62818493
+-951555883 -805932014
+1869419744 -2134618893
+3357469 -266455382
+-200745074 -727314079
+1645636307 756941195
+-781965764 -916247870
+-937353785 -113647692
+-1294355124 1785565366
+-358115023 2041545713
+414856731 599411496
+1763139380 -1709019826
+-1451396622 -2119575016
+-845767446 -520690099
+-836435450 976318685
+331945717 -331281258
+-216975396 -1836190844
+1438401820 1150240261
+385831234 67049898
+1162998704 -74538416
+-1567056264 -1565156895
+-917306453 -1962260568
+500559685 1293617597
+-1178541490 1925251411
+2133030260 1388683417
+415657706 1285174037
+1777477176 1824856783
+462261728 -1902632065
+-109009777 -1056428874
+-117981747 1402570557
+-588766975 216588038
+-1423792350 -1206406844
+-1545054804 -356155101
+-1856078235 -1716928915
+1212090731 1692195254
+-1678323453 -356135048
+1292046055 1644994642
+1373602728 1848156167
+-477564820 -1712413486
+2054564316 -1666191713
+13824239 -247853785
+-1412311328 534284096
+914993235 -1808445457
+1237375560 2129357517
+1854458620 2135352118
+-1270756632 980411376
+2107878899 532414465
+1365597607 -1570642332
+300952820 586416901
+-939530169 -831581401
+1801498470 364754526
+-1770844473 -1093062297
+1534503920 1084510958
+-1867430263 1167997129
+744585398 316824746
+-297849073 -167545628
+270459816 1200505756
+-1341745190 1264962437
+-1223687598 -896248355
+856115047 -1697253
+-1506814398 397258524
+-142052144 -1169624027
+-637287369 774725688
+896327046 609801822
+-1332426432 1505324544
+-1051287845 1530345727
+353775403 -254444913
+160099211 -702458552
+1323416540 -1493896018
+-689028847 929460483
+1996023034 -1340298052
+763311321 -1640849903
+-1417360047 -768840960
+1714534968 -1219888223
+-974627943 224754004
+647058213 -1508599543
+699122434 -404819089
+1916976924 -1355166704
+-91425913 -701049214
+-317021880 -1535264391
+1732480737 -707675541
+1431206406 460836484
+1455329326 610580735
+-1716384592 -751363024
+-1705062628 -1375364201
+-1691457476 -531045724
+660072343 2047486764
+120142480 -1365977952
+1063479274 -1802962226
+1667257016 403939225
+-1018348105 602813065
+1459553093 1744251460
+34859580 891052242
+664253192 28429655
+671480666 -1232649344
+-1893393164 1126639636
+-1780657214 357916156
+503620561 -1835864841
+1353043697 -55694292
+112377646 -143656599
+1876032517 -92258336
+1436235637 -1384589388
+1889784789 -28020575
+-510057659 315765154
+-1465917396 1648144508
+-252959873 -934218883
+1809007761 -1267519218
+1369082545 -581620192
+-838323243 642017783
+-1871241277 1327800791
+-1419296125 1261859279
+1396462655 -1786093357
+785256261 -44547164
+444055023 -1324354049
+-235516964 1356499810
+-1016907019 -13280420
+1616127513 1065545357
+-1690609716 -512300865
+-1400517954 -887614539
+-72917133 91939980
+1230026877 -2064045890
+-1904250933 2049154573
+-2053421858 -203416478
+1032759033 -1913971770
+-1246549312 -244682045
+-257827208 1977089721
+-1618411315 438525125
+-1514509472 205271919
+1200318052 1419752883
+113504615 198460972
+2130973062 -185803019
+236600350 1150804286
+1362778966 1253040685
+352864992 -399570959
+-605926767 1864811404
+386746077 -1918943043
+488526784 1543424212
+855036565 -360117699
+1618563495 855318833
+1081269228 788879285
+-1780758398 -2045918467
+271978661 -1263707584
+-690502488 1330712818
+757652417 2033761218
+1370012844 1072195719
+895406948 1728671761
+2143545258 1187282755
+-1868716397 1832856337
+1132038754 1308867052
+1778010078 187501157
+1001313931 246481000
+-1770066348 -267671214
+-1776296994 2044263588
+1640360936 948888066
+1426126962 -922572762
+-676406682 -708348927
+-749079866 296386209
+-761756458 288589609
+-1966166298 -1982253792
+827822953 1788021112
+-770807870 -943711732
+-195011082 2128512201
+1550174916 -1170128342
+916869163 -1382493303
+-929009397 -1504064272
+365424414 282367353
+1080816070 2014683605
+454433280 -127010728
+1972427024 -1226313455
+-1573086645 -75696011
+-784862655 -2126079294
+-623236802 1663180888
+1241160526 1337183631
+208077758 331081255
+-758067957 1027042709
+1471690727 245558757
+-1878320059 840962860
+-507963504 296164504
+1628557447 -1963946144
+1778021917 672414268
+-2112122038 2129501920
+1646312354 -1673743559
+-549378987 2074870679
+-394174291 -400091239
+1833837089 2003006686
+799672252 -296134930
+-1734199727 943045894
+-2143406531 1576732978
+-1357671021 -1348569323
+1661977418 456624926
+1983351381 -1419589111
+1016453846 1080526677
+-1431068791 -1952069330
+1365973696 371246042
+602856123 -1168898620
+172340373 1983053580
+1225914702 1955787300
+1151330592 2085911755
+-784602833 -1596775027
+-1470275785 2067302920
+-1117602804 643231486
+-2046037223 -1857134937
+2012418181 1714647512
+-668205550 1936078081
+-709518030 1029693075
+814692363 -242135079
+1837687149 -1320445370
+-1862892733 -359382774
+-2084221291 -1096121441
+738431169 899131687
+1004735056 1032019447
+-1450613486 -1093434575
+-1627492642 -807111136
+1458307115 1255216729
+-89168694 1843866258
+982959439 -2058705294
+1124796244 -276072343
+1362438158 -1173315453
+366567504 1363967544
+-1458683310 -893157731
+-1264615752 -481907404
+-1739470489 -194831629
+-55821409 -1022079950
+452390845 -22596092
+631698013 -290639966
+-466689028 -582723561
+2024925330 1278389455
+707104337 -1059323463
+2050783805 -1350840350
+2020637398 584485336
+143705475 -1058525481
+-1980994756 -74682296
+1041352983 -125258452
+-887096938 1007006970
+-1985020932 1451212960
+912973059 158056441
+798486261 245695624
+-828736693 1176146952
+1270330525 -919253439
+1334138191 -1671410698
+355976026 2091414608
+612762049 -1838608042
+-1580692869 -1110319660
+-1589115531 -1889367929
+-252954909 1226891386
+2145056186 1556524047
+1050540890 -2093065523
+1056346113 -1604329822
+-1673553378 96756623
+1054807382 -1961836532
+-399209922 -610379427
+-1689300326 -413304771
+-2108637788 -244919809
+-134071448 1366802034
+1100992848 -1346750714
+947096238 -2140794255
+1679329335 320056772
+1084955385 460914770
+1428759255 -2130105809
+532601985 -69014304
+506085422 -1949499654
+-1630636701 845704500
+-28090263 895367792
+-1818025379 334763486
+1007522227 770179664
+-1451277475 -1524595885
+34702837 1935036258
+-1474100472 -1476743157
+-2124619057 429040348
+1824924638 -1532010062
+-1727656461 -55294146
+90367699 -1578878823
+-1531073736 -1477289953
+-318728974 1461957101
+44342466 -1630555975
+-1383886320 2099615932
+1081183461 -813137777
+-685282916 988287024
+-898996905 964629648
+1629045111 -1737517737
+969779763 -2053239022
+314603525 1932240309
+49089212 -177994041
+435931188 -949436650
+287919034 2049270758
+43954079 928921301
+-1648275000 1473075628
+1695390118 -734726993
+-1533105326 768775642
+-520946698 865425111
+-10263410 966085145
+-1111585444 -1790763368
+1419382460 384749747
+1028707388 -1166439644
+-423835505 -1903400778
+-766955049 1187535362
+1047628773 -318504129
+-1223618183 817628850
+2043906088 -717934055
+-1876343211 1276841267
+38051082 466352702
+218205993 298838065
+-1016628669 1832940647
+1853688984 -1063011176
+77500676 1200505906
+-561581170 -1438704436
+1852128002 -993992913
+727936708 -1317787067
+-469225360 1272983912
+1516924332 1293277223
+-1454990385 -812660872
+1435271952 119442015
+1865044947 1344665891
+-593163119 1125498245
+147404529 797712560
+108896820 1013024622
+148924488 2096495502
+978457386 1612087336
+663725475 -1704787490
+1356742334 573413296
+735151615 1705434770
+-1583482491 966426641
+-83814433 -1617709164
+-714226310 -597240025
+-759803190 -870924485
+-1071714374 -2088390521
+-939851953 257539717
+378075916 -541689527
+1834450340 -141346882
+349462534 -295809418
+-1367587657 -1516970668
+-376560716 694146263
+1648360258 1423797584
+983443647 -1304197353
+-407181057 -2066831905
+-530462270 1335004942
+147421592 -982779657
+-392046059 -1026243421
+1890776410 261258322
+53246881 1655533547
+1971950043 -1077799216
+375171380 -2062261718
+-1456427666 -1825341837
+275200660 -1103920384
+-1555867075 1100839097
+908832482 -1977948690
+660682655 -199102426
+-1042221970 -1537482021
+199248550 249534536
+-1125426346 404268753
+1011717231 1077490435
+784992230 547166131
+-391646312 -681932686
+-1780931517 -2115849826
+1893268157 1146122728
+-1982738237 -302406568
+-693526343 241475906
+-853490901 401724073
+1072392 345563996
+728678098 -994040640
+-1981422354 -770638163
+1238718878 114461690
+-1732697023 -39382612
+-615362764 1185104644
+917852852 1563351824
+-60750939 688473893
+-1178473633 -1606790545
+796559626 -515783824
+-1440221225 1797341726
+-1931237122 -2132294845
+38127149 -1144788880
+-1015915487 490424894
+570892062 1841003856
+-140931227 -1107911614
+-935607721 -520437111
+-1937867499 1806670765
+893799048 -2075884502
+1212042748 -807766856
+-974211188 -1279280112
+-1332751599 1917474001
+-1160404478 1504980408
+-751799651 -1626093314
+1473838547 739580128
+-1381060811 526378740
+1313853900 -1325882842
+-1305678958 -1757705624
+-791409447 -1007819008
+-1599660029 274526593
+104399489 959678458
+895736203 1939569348
+-1561501992 467059566
+1226836024 1266148040
+-1686156522 1370413817
+619560786 -518873468
+1928663995 1285967858
+831056234 1880105478
+-1358705195 -1542715205
+1486687355 -1032283953
+-2041644318 433829162
+-633400497 -1884361270
+864704075 -1616405956
+1378191852 1026773643
+753112111 1199138281
+-732074000 -1226002511
+-1313091887 -2124311788
+636860648 -898928604
+-1758498925 -774562365
+-254097941 1274052751
+-1793275322 -563645196
+1416040000 1596279516
+202737265 798115992
+-590351497 -1061626749
+7690217 -928567050
+846889239 672528489
+-2063681687 513240733
+-553889345 80383597
+881328102 1778406181
+-1951680850 -1033641088
+1282526276 -686588407
+-2078985227 -1079775279
+707008620 -63936970
+-561287883 -160590780
+1403733627 1111990934
+560246179 -170085614
+-1696987747 709959134
+975045825 -789128451
+-941111687 -1860671775
+867899302 1742746429
+2105272498 925914726
+-1793917501 -1258294720
+1169837293 -1812318140
+1382517469 -477479745
+96081825 527867518
+-877302572 -63980651
+-685062404 109371406
+-1991260109 -1393148483
+-1215258984 -1157022773
+-704359079 -1900254506
+1603012539 -988098948
+-962878992 1984551977
+-1038307881 2074335396
+2130686590 -1702463821
+1068238294 -311482972
+-361871618 1290324695
+-140655268 39867934
+1824401362 1976774020
+-1175647362 88458054
+-1358983140 683995299
+-1874578847 950048998
+632489993 247697542
+-151182571 -813621396
+-237064686 860338964
+1054989361 -451365583
+807693685 -230216218
+280764501 93373762
+940485603 314566254
+801251249 -1330019277
+-698962823 -665539499
+-939096977 1408208512
+-28805803 -1134746553
+-350425450 1009277061
+-256484809 -1306868319
+-1960207202 -871992760
+179911889 -1595639767
+1821998530 -1666497605
+1617975768 -1043458414
+1085222005 721610810
+-66418923 -405279425
+920688040 1689366435
+893845452 1978543691
+-832923089 1647078006
+1637017238 -368514265
+-1445432901 -2043175821
+1111496031 -1698145397
+1841929935 -194234191
+684863620 808882810
+-261264220 684550765
+1249873116 655217460
+-718122241 299299491
+-1637893871 -617313064
+-1806414743 -1846928507
+-2000710950 369441497
+-481543796 -73199709
+-322904062 -1860244893
+1106772239 2017406504
+326543497 892349388
+1327179229 -1446347524
+-1375412520 -974295871
+1289326419 -824866880
+55428324 -167552079
+-575380239 -2019646036
+727428237 -807024479
+884812221 1861746074
+1027145878 231445006
+1945805276 -606860821
+-709482337 -1850110862
+-25175687 1227051252
+174393606 857550765
+940436503 -1275073409
+558184913 -1028988243
+1556927025 1244488300
+496940433 2065790818
+-2138498827 -2072165387
+328609064 630856094
+-2067753535 -1677964789
+1578864698 1034931915
+1141205810 7977276
+1746680014 -728212884
+-171277472 1327770370
+-1201712006 -130265366
+-724836842 422853576
+-1725816653 1522861091
+-401571283 -1695617290
+1765343580 1249011584
+-1044973093 269593636
+-1650340086 -985247831
+542631360 -2104301481
+1695641552 1595189693
+-101284238 1744073502
+684059089 282517599
+-2126548317 -1546741305
+1356023014 257771138
+-1068245006 86652130
+164071526 -780191598
+-859581527 -728916049
+-731473973 1671486060
+-534564949 1157333442
+-528018284 756131344
+178424469 1882510572
+-1665544526 -324671564
+-42750395 61506790
+454987712 818102119
+1907265885 -1748211405
+1491454076 -36644990
+-1587902562 -1152761659
+-2080206848 -2125424874
+-879296529 -516736956
+-81406321 324019305
+-2061636507 -1886975358
+485068989 184696528
+864510993 -622645483
+-935714499 1600309799
+493832903 -2060420639
+853289236 1559145777
+-146608092 1330519167
+811162687 -584196666
+1420037077 2105800732
+-682612901 2069715817
+-598087648 -668060652
+112582947 1474783677
+975139265 -919597814
+1752205787 2087525569
+1938251695 174763708
+-565961268 -1983852956
+2102069326 -1449185860
+-1856011933 -1267481852
+-679256442 1463291277
+1500307369 1757808052
+-441284830 -1362239271
+116789790 -1655916386
+-741672422 -1087241889
+315845131 364229261
+-24513999 -392384218
+-989496830 -2131543026
+-211363249 -497029050
+-1097289219 -749420722
+1753194524 750879893
+-1671175662 -1139016979
+-1624464860 2133524170
+-1741003127 2122044753
+2015758946 -588951637
+444998820 422391742
+-306955749 -293377009
+-671063033 -360571825
+-581561719 -1379744912
+179866584 87120960
+-357025806 -1328224693
+-1140715811 -1087233383
+-1469382695 1735678416
+1002191284 1410165777
+-2134349347 -813527488
+-827747803 -1030368788
+1185791981 -1330104065
+740558921 -471424830
+-1078794135 -1437798600
+901771985 -1510472634
+-2027437445 1303921488
+-648030764 -2013301122
+1309598614 1607382569
+-1817755630 1450633933
+2040128159 1274891364
+-1593004197 -1604101950
+-1852901169 1208008604
+1112935423 1039013773
+-1195852585 -827296516
+1094028346 16177818
+2012408768 -1128908086
+-1233928519 -734219486
+1610706561 -1125033382
+-2030183897 -394353353
+-983051191 599125201
+-1259994029 -558410781
+-1979569717 686909083
+-460888131 17250960
+-691646921 1573487773
+-1115329948 -1127007434
+431399040 -1374890055
+656278570 1911971619
+-728834357 -1433505530
+-430488370 -508766742
+1220314681 1772306513
+-796412655 409595395
+268885678 -369625719
+-1933633655 -1878084219
+-279591904 -1678672311
+1323733067 -1147034713
+1208356419 -794066055
+1271037088 -2097031691
+224716843 -1163343023
+1301151878 -405745993
+-876741115 -318871059
+855051151 -1917018062
+-1572868407 -512040829
+-835886430 -1211054436
+885218281 -2008099532
+-1577424635 -696003999
+1769911163 2027440504
+-1994027282 -992947782
+1302368408 484464972
+-251779183 195427413
+1107152870 -2099494105
+729028600 1727255487
+972250018 -371417937
+-941314200 -689924581
+-492610140 826641619
+-1828402878 1147019595
+1549384808 918581360
+-1646462455 2024314283
+1590215198 1365893215
+1322311522 967533496
+-815011902 61436422
+1393626729 814152584
+54872865 1812889341
+1444926227 787823106
+286839024 -1898070596
+-1004431780 -834640089
+1496982008 1569801548
+1187745713 633579172
+-379258408 -739734035
+-1814546058 950484817
+-921346026 -1283558171
+1394532314 -1756825691
+-1444653174 1602608887
+1230939001 -2055781700
+-1357756481 195203037
+417344641 669004059
+1620689252 207728399
+-1538021206 -1925802733
+-105755746 -1404319239
+-174890161 520824977
+-1758768503 -265594630
+-485214000 2136494174
+-1380184833 1281351859
+831953643 1414338436
+2006564923 -1802937537
+1347233466 707587849
+-43016701 -1167710954
+-2007021552 -1896591455
+-696343904 423114434
+1471046937 520607336
+-1979165316 -1871997012
+-526757541 209882796
+1441764165 1499920591
+1187437275 -1470592704
+-1344449009 -263208171
+1239085193 -1797971094
+-538055145 -1324157927
+-1456150260 -856727814
+1640027601 1706619743
+-1899094600 -99816730
+1413350209 1297528693
+-502557411 1308842033
+-229957934 -382447116
+-168830907 1573440790
+837667446 -1123363642
+1025708770 -1533922953
+-2027354370 -605729925
+1891412963 132024014
+1402782394 -1194458827
+-208484730 -115492631
+902697650 1646550788
+2001391919 826741257
+1159122091 -1229465385
+434966845 479250128
+547448122 345240324
+-1529196498 -312000016
+954358245 -75370715
+-1784675584 -327938905
+158967169 414294094
+-694482987 1509802179
+1627316570 1638256650
+652404136 473461994
+1517175813 1185329443
+-1168110462 -2019804230
+1742996651 558525502
+2128992586 1556024704
+-651004876 -1582694012
+809229872 1326154296
+404089024 418109226
+241396766 -421262540
+2103530328 -700215012
+54643117 -2048284762
+2100966603 131354015
+-477917790 -596202225
+-934526476 78879989
+-1456022833 -587022188
+569850165 -1578680794
+-1277715717 978325879
+600028941 -1283506060
+1129804078 -1390765461
+800993059 1244410819
+-295455988 -72791368
+13772591 -48864139
+863783681 866864646
+1461050195 725126522
+-1738920391 855858573
+1706425164 1448003452
+-805092704 -221828121
+1935539385 1133660212
+1102833124 -2046261652
+-318329347 -329042567
+1944842458 89651733
+1215906481 531327437
+-39237370 -455845673
+371503000 -2112812597
+301870105 -1769825613
+898489298 -1551976420
+834041132 -1397168585
+1086050202 775045658
+-531571721 -532016192
+-2094386479 2129136599
+-908618291 -200276548
+1802810173 -949554091
+-849203261 -624823410
+-1448784408 1504217107
+1990649132 -1433187487
+-2067284226 1207525983
+-2094290903 -1706146015
+-1219587364 -2067980919
+-1140439135 -1180985036
+-1842561249 1953766856
+1313333572 -344514416
+1963531105 -684884035
+624707604 -744306514
+-1125003409 -1707938278
+-387844057 1262648564
+-1151909400 192418365
+-693591955 855583691
+1327122694 -1114366688
+955504139 1954801895
+-1542990713 -1005288515
+718337074 1878502112
+1746605143 -1332854319
+-65384043 -1612052124
+-1970470558 -1089369753
+364257889 670464691
+1262268490 -1705089024
+-1884249811 1718308737
+-540456055 550486581
+1440772283 -1066161175
+-2030589666 -2079550434
+-1424077519 1837622706
+-1825657817 -753115807
+-68350725 -284732447
+-734538672 639609709
+-794197277 1632526584
+1253463809 -108005105
+-878842359 1855887516
+978577469 632766991
+-2029052252 2000286878
+-679484201 822005631
+-217001975 -1680496298
+739450806 1688283683
+1209721405 651625197
+-458282526 -1840985214
+-1820381498 -1164316081
+-2027903733 1737373336
+985456386 -49728916
+-1628723110 1317592053
+1905999819 -645361513
+674536635 475529182
+-1388167461 -822765662
+-844457116 -1693131276
+1855443237 1506112848
+-1446988932 -216158143
+681638594 -1365017328
+610600506 -1359245910
+1710695696 590062659
+1007091266 -1533350103
+-845857758 1156125749
+800755990 -159431288
+1523375003 603211559
+-881935759 1942684029
+1070670070 208895837
+1589545713 -1779950997
+-258448759 -1023280321
+571647985 164128589
+1727847436 1314894966
+-886006277 -2104518220
+1352771508 -1109816159
+-168416008 -298130138
+-1554545947 2063093289
+2061375846 857640710
+-1979242392 1229633493
+2012437610 538277114
+702453926 614320328
+1675650625 1483165588
+-2041289135 1604361059
+1511319288 415482343
+2117515086 -130471937
+-271725583 -720849341
+-1339777855 1539523751
+-1798996246 521566206
+183672312 1096493058
+-301981917 -368250946
+869409007 2032549015
+-1167496279 79596949
+1407473886 787536881
+-1296884603 755282112
+187786093 -127883298
+73874167 -792917039
+-832793720 -681390310
+-509438960 -1277505052
+1203337001 1187737156
+-845236814 1122545068
+1488319833 1136137904
+1212398950 -1634007663
+-1125254948 1475090556
+1087922940 -836143626
+-1136973664 -1604607127
+-1630446558 844688376
+991242196 -128421196
+1173228205 -1362625672
+-1430494934 -1985385852
+1194908806 -282731326
+275211243 -1060007370
+-245459470 285764270
+-1400138584 1015699071
+922789003 -2105526228
+1821404256 971940754
+-2039522007 -1524887732
+-1708645166 434000315
+-1545034502 -1710852750
+-1322503002 -962251467
+48030853 1196308787
+1133344222 -1815788638
+1004892394 -1773749922
+-2116303865 -657955891
+-1763961488 -454026121
+1699788750 -1953226959
+-1783847092 917471686
+-215551399 604867942
+2113517746 -588737808
+-270960183 1463189118
+681727342 -1998248501
+-1532477331 113122379
+-83450982 1823019170
+-953336191 -1635975498
+1022688074 1149640206
+-1652422714 -1242375761
+-1318289011 1252791092
+358235268 82497991
+-948648616 1835366897
+1910415113 1082825444
+-764894238 1880111075
+1010842772 174414339
+-1724400745 -1389871564
+286141392 -656458370
+-1905128531 -991927944
+371967217 -1192519800
+-612677431 -2058059241
+-947023009 362127010
+-330515307 732269089
+-2074237423 1567146690
+-1766034779 -1412919154
+187168429 523823308
+1213140917 1866589602
+555440809 -202155194
+-1224018025 -1123689434
+289935123 -1731949323
+-902499161 176710760
+-1000759443 -1035162867
+-1142664373 -1693284188
+482655180 -857869867
+-226041399 -1945985427
+54999782 1398481638
+-79629689 -16097882
+-835886513 1886340290
+1707463677 -1097383436
+-163455056 -2129318779
+1756696891 -141344012
+1988901669 -1733386562
+1007185112 -2126969745
+1481980941 -478615234
+104909461 -173834794
+644499767 -1996824820
+-2041008881 74594407
+225248489 656094109
+1420806814 -2027392526
+1042015777 -1705667914
+776313855 588281900
+1622586160 -812211865
+1836393036 606358139
+996911218 107081221
+-109774375 -1390384082
+1229324778 -1536087876
+1291406287 -1367010776
+-1169879784 -2132478127
+1695515014 1612958808
+1806725237 -1445492492
+10736844 1317456182
+1846304683 -402400580
+617623935 -1722934953
+1196734215 1186050551
+-1663453651 -2073629261
+-1179548943 -76833871
+769206701 -2136991816
+-1125564966 -1548901739
+-802999593 -1951821037
+1638898455 1093421003
+1718054441 -616947272
+1244173664 1921528362
+-178722968 740211092
+-330448059 -1591006485
+-1154820891 -1616543044
+-501659803 1770466271
+-254779812 -1312559287
+-829773738 -501481034
+1169058616 -1751383258
+-1039711336 1580907020
+98156534 -1291857530
+-466797800 1699971825
+-783361510 1410319929
+1885640023 -1519137315
+1615282307 -1381449603
+-389739349 -1452640860
+-366467239 -1728666702
+-1996585554 299174559
+-801303888 2133118850
+-226891255 -1876522839
+-1106848012 -1101693232
+1792529755 507923998
+1984106195 1057446192
+-1803510325 -1714794155
+405633875 -1358425648
+2144883458 -1213160280
+38070996 -1366694259
+-966030426 701457449
+-1862966750 1550273123
+-1892092305 1248546806
+-1122718293 1053428657
+-967463820 -1269183235
+-1696522583 -1330619482
+1043330713 618862515
+37114564 1056557496
+1380614055 1622122198
+-94353743 -244171347
+272565282 -176836601
+-1600248251 879871358
+297479570 -1622684942
+-282813446 -338142894
+1922804272 -1759638744
+618559309 -380082993
+1015390328 -1060040558
+721491583 -2018815756
+902944979 313904518
+-928313938 2000690098
+-1744860860 405670056
+875908856 282275065
+-825025186 -456359369
+127657569 394386202
+-244890140 571109315
+1617863535 -616538232
+1193853663 -1209951240
+1179621262 432734869
+1513363218 455337464
+-38149179 -126810988
+280311812 2081081541
+1883139718 -345649676
+514374032 1590011131
+-992838382 1965873236
+-1066943125 681851071
+1199361734 -1586057376
+12813651 172566764
+1718556172 -1391402066
+-196947227 -225216156
+413375010 -1371649316
+-2097164850 2133694043
+1120379333 -1174461004
+-1368659132 1161005005
+-1914336504 -205529352
+1639137352 -984632154
+1747880938 812809315
+-1645668718 1098170624
+-1490032324 191996877
+-1700891254 -293772947
+-1914470904 -532677506
+601652993 -371897094
+-1613028551 -1969810522
+-1894423896 1613137720
+893035675 1596667582
+143957154 -1920583338
+-802715991 1787202185
+-1816150636 -747687166
+1922025023 1248851161
+-1871207194 867448094
+-1433210630 -2132008749
+1683200298 -1219634198
+-779282006 1803730642
+674534923 1960747717
+1345082545 -1927272464
+-455094749 -284867980
+-443508198 -1459384496
+-1850448352 -1846790690
+731923637 -141091623
+1967375963 1086168132
+-463194738 1588018313
+922368384 -1517227251
+554627530 -187489983
+-1875676515 2073543850
+784895150 361570206
+55522084 -1695135657
+-1556759495 1635862266
+-1034470211 2132720750
+940335173 -874569552
+-2099212997 -1995056955
+-1067912063 -516069885
+506375039 196386799
+-1895347563 1736962917
+1095941725 -291953277
+-322497335 258170420
+-1419288679 -828209568
+1486212581 -1847043818
+-449461395 1807554945
+-1926452498 1675967781
+931818267 880060011
+223171751 -1334191621
+1133783309 620237833
+961357550 205533203
+-873135729 1896021234
+87917373 913140247
+-1990676665 -42943093
+871438667 -898564519
+973902685 686705922
+-440023154 -965592830
+332522759 1756104674
+-185754243 1060843211
+1350766851 -1913657906
+-822346640 235748577
+-1683937969 854325863
+-2066541720 1549774038
+1811716924 -1422121798
+1890323459 -1101479838
+-2137397847 -1169315458
+1963139575 -23432852
+-1628187431 710401343
+-1244579250 664630723
+-1276090935 -1768007832
+-565458824 -1463452186
+668310338 677641533
+-1983573387 1735047028
+-1319638740 741724753
+-1629037866 -7577144
+-2060598807 -997785433
+1147887456 188316143
+230950172 747631250
+-1250393787 -1669493621
+1800845616 950602849
+1730805063 -912652173
+-799130329 794633290
+-403776375 1881713487
+-87350446 -1524110406
+-1495987376 -649689953
+1405470514 2065744781
+-365624198 754643425
+9455506 -2097213854
+1410365217 -2049358581
+730078930 -697518149
+1205721695 -547605113
+-40300967 -259707400
+567682671 -224168352
+739995716 -2119360941
+1569446726 -1914716174
+-882112818 -1175340437
+-1340154127 -1306930001
+182957140 -895938058
+1116979196 -442589577
+1579188981 1570751451
+-1982181908 561719383
+-75774032 -506884512
+-1034265611 366076363
+46897487 -1914248606
+915674669 -780790485
+-473793419 1383323764
+-1031740313 -139561511
+726589845 -1581253904
+245588822 -280220916
+606826849 2090347177
+408931774 -1447184475
+-1022134711 199181269
+-1794255970 -932304631
+1778413655 1300550505
+-225412115 -1505769531
+-1858587413 1461650474
+-290384196 52006883
+979619908 -1845396729
+2064105535 490849638
+-1305177946 -744890645
+1691412346 1612951669
+-700108390 1091336040
+193429467 135142514
+-1444737643 1008637699
+1056995735 -2112833295
+-239576163 460205551
+2032938655 -391451440
+-109714912 1563648167
+-1016801785 -162845560
+1769514160 1564606160
+300355517 1786562694
+-1296988525 790774177
+-859352901 -1323483759
+1290330354 -712231582
+-576624685 -1666644479
+-772139161 1664655705
+653839506 -569516491
+-667957612 -923759661
+-1832955096 -334192948
+1091956806 1355846704
+-434736540 1617762698
+1491911478 238184966
+-927936059 -581239816
+-865861286 -1202592093
+-1443703690 -1352660858
+-1115984455 -534241181
+-409069293 -1495090964
+854291810 410502339
+-1147507849 1529919070
+-1752723225 -1379217649
+-254785567 1498995887
+8437155 -178982873
+1563752255 257790013
+-604387638 1134523569
+625286315 -1228508304
+-1119294737 1582863692
+-1206952318 580766764
+1109211320 -1146874172
+1686970947 -1662905759
+-1389744916 -587160713
+1799500154 488496891
+280426165 -1296081090
+-419241629 1204110011
+495260898 470509615
+704765711 200090789
+-984839417 132892040
+278009489 -1334156944
+-1300177808 -2021875784
+335163650 525897887
+105415106 1256628934
+-2037221731 295185389
+-2027250059 8223923
+-1206686364 1391114013
+1007854171 -71086940
+1558304556 1690065344
+-1823736780 -650729737
+-713315078 1532304329
+315532950 1639555884
+392041818 1703844239
+-2019438089 -444711035
+-17525581 682687269
+2027165698 -322540560
+-502453520 425174010
+1713688742 1479876549
+-34198107 874062481
+-921410281 -872829775
+1341137926 230821759
+330017109 812200832
+-1904679729 825529389
+-364095855 1966008668
+887103782 -2093309725
+1106102631 1363694936
+1317164381 -1523006561
+865954748 -1144748546
+13102668 319956195
+1699446693 -158205291
+125146037 1964201966
+1017103128 -640450668
+-661797677 66007050
+-1320086695 -763479950
+472129135 535621882
+116060218 -1808654525
+-794491538 -1565680591
+-1601561815 817867794
+602921991 -1218698660
+1281621959 -1193965761
+-2045251276 561917987
+-1165768343 1675966240
+728609192 -1433961690
+-162534443 -62502075
+1493550682 -95976233
+1829797944 1608886702
+677064302 1369943373
+-987278443 -514833780
+1572542886 -505731438
+227424562 1134947246
+1740804694 837223560
+39506301 -369037181
+1423797463 -539390164
+2079383565 -979195997
+-35732879 -1970526532
+-1260104117 1056184464
+2043423408 744626985
+1757601134 -1383341003
+-947750633 -1728622466
+-2057577220 624874003
+-484417821 -31085046
+-1331470674 -1155306685
+-1895909434 -371148151
+1730142458 -1846298284
+1441698707 905369452
+-2065917875 -275452560
+1977885031 -213556033
+-194653347 379059664
+2032143351 -1319435703
+-971546951 -182273570
+-1205178631 -853707965
+648388617 101768094
+1769347508 1241019338
+-752634487 -734833348
+-363247891 -1388755389
+-1122675368 1888513109
+1184072706 1997160338
+1718120083 -646911424
+723816171 341983515
+1281125946 907284112
+1021199208 -1128712883
+1371118975 517931995
+-891723458 2098400805
+-1818641049 -417398634
+658533818 116769240
+1374215501 1655072455
+-1259172907 -1576681465
+-1071675838 -1820900043
+707480718 -1791393597
+421063518 1495426956
+128018523 221586473
+1223687621 -1214214558
+14365475 1164831857
+-152198428 1467726410
+-1261475287 -1584426118
+1635299388 -1981679242
+73215017 -965623976
+-1153190659 1567911282
+1836255303 -256390512
+1266989716 416096032
+-1688075766 1064070675
+-1582096791 1692021545
+-1801734361 -1491328439
+-1774426178 60416332
+-978158928 -41433280
+-1433030363 783463939
+-586682331 -1935276513
+-1834072278 1359385173
+-1801396651 462840525
+593233466 -839153956
+174251998 -2030346371
+1217458828 -1962591389
+746527371 -42923877
+-1389285120 1530381669
+-1695489501 1083809001
+111160802 -1310665860
+168978812 1008887462
+1429794345 -1024733677
+408777038 439194294
+-460939661 -341157321
+-260524875 -2056900630
+299552753 563191462
+-592147763 1130741349
+1728972076 1217754435
+-1003818258 -687911673
+-2015674260 -461777623
+1833705113 -592593528
+1799028886 -673174283
+758524345 2144921695
+-170591459 -493016466
+-756944453 -1928711186
+-1552797859 -1905993969
+176841679 -765253947
+-19129248 1306597214
+-984132265 -1762967983
+-423805930 2060968160
+-324587105 1474428718
+314289365 -1789778215
+861298430 422593897
+1727574326 -1332890533
+87999808 151314283
+-324593511 387918257
+198737444 -353011984
+-572000287 -212224654
+-1386745633 567385082
+1381760446 -186867916
+-1259157272 1000989704
+-1570246796 -1267267254
+1161947091 -1657297258
+-1550886817 456271675
+-112095439 -850468692
+-64453927 -73066578
+215005303 154827534
+-1458386946 -1418196777
+-1269162405 1577104946
+-1277072145 -772355616
+2055430703 895211439
+-354194124 -2004343078
+2002217513 -2054282795
+1543080050 1733237170
+1682759715 -452531232
+-623096182 -478937510
+-41216146 2011573852
+1384544918 1357066872
+967393007 -620625923
+-108911809 1974368102
+587001596 -1760148994
+1636595864 758853596
+-406862107 -1750518437
+-573176693 -295107738
+1380946474 109970386
+-121412164 139810956
+263301169 -410543033
+-870705489 -1753399169
+1164150786 210547571
+-1312736113 -1921229077
+-225846688 800218585
+1943231803 1227900771
+478189638 -1710649718
+-879608115 32775760
+132895321 1120694499
+1435563141 -840772307
+1298498981 -366656588
+-5609924 1992617856
+1578056936 2066078739
+-617138273 587022261
+-223311526 1437021733
+1617223291 1192448778
+683435421 -1247188834
+449743215 14354544
+1575834269 -1302889531
+-2131811312 1663976498
+-2018672122 -1876593128
+-599180228 1197312882
+671311512 -2058761033
+-2023517274 1498471618
+23816314 -72304867
+-1379558480 1857200767
+-1477821607 1592600845
+684520895 -1309632313
+1512474925 1648793019
+-443803817 1268692572
+-1973390445 1580434404
+717353113 337737809
+1118704452 -118886692
+-1739211060 -1476765243
+-1631663875 -1990953703
+-1492337360 498342160
+791297395 1095859550
+1449194732 973808552
+-1798474684 -1738662083
+382480483 1988773995
+1091629340 -531361646
+-1188645873 -867105390
+136708506 601596512
+-1419499423 -1276908347
+882650571 1006918882
+-83800648 -456245596
+1014914208 -560319782
+1057545866 218109466
+-467526677 1676113632
+-1306294634 -62160942
+-1593796168 2075077232
+-1916931300 1983342415
+-1639105325 606418010
+580285867 -788867412
+-1843188987 2005946160
+-1514788789 -194772234
+-500478994 786957385
+782698772 -456257616
+374342877 958241096
+5300575 96412100
+445119027 2050237133
+-1351431889 -18449911
+-1064848916 -103610781
+622330845 -255338164
+1264090123 234897273
+150190582 -888675672
+-486222563 -1701609642
+-1824616787 1756177850
+516506131 -1785724810
+-546979553 -832339746
+-1191309886 1253688249
+601218964 -1349404670
+-765381700 -641150140
+-558771923 -937503378
+491693386 1704632198
+502663579 992998129
+2143891151 1264551632
+-1631527512 81749573
+-267891034 -847483537
+-1669451857 -1740173415
+-827421346 -1783846464
+-494449578 1025348606
+-1974454440 1819327577
+338850429 -1301938721
+1199170550 -103326485
+1777970818 -1513349929
+-148838577 -558159004
+-970525810 237330672
+98294136 953338059
+626130101 -410990430
+2038968683 414087600
+265689416 -1893908387
+-1123760788 -331288554
+-935145711 2026621910
+2040303193 -1771541787
+-920543651 -1260898001
+312055404 -1104252829
+835545509 265397465
+2137830488 1883972775
+2142782348 644580933
+1182831522 -1828996091
+741271647 -676099533
+1467539003 1454169640
+239502494 1733562482
+-2130944298 1135183362
+1576545354 -1557477110
+-965881724 -352965114
+-421026115 1330663690
+1317362310 -252892916
+-645931377 -1418908914
+-1763660718 -15404620
+1851401821 920744194
+-1064554250 1002328299
+1250155634 -1398855677
+134395495 -2142433668
+-124907578 36417636
+1215641811 -2069161932
+1074496557 -1467829401
+-170329563 -821551113
+1933475220 40724430
+-884846021 450238265
+1460330240 -1097164147
+1268765495 1975150476
+413314819 -1069887912
+-1667815644 -1170752493
+-535236594 1642160042
+-757381351 6889755
+1391428634 241582098
+-797038477 -146669211
+-1586815111 -1123813134
+-1497919780 815217190
+337262614 -1287751216
+-1917183278 -669741772
+-179514568 576783209
+1001184548 -436094293
+901671490 -456137613
+-227738350 -1161734705
+-271175755 -147128599
+-795021776 491585464
+1496089704 -117036808
+-1442616575 253191528
+-1633017685 1919870145
+282243834 -2145677485
+-133103808 -1003294062
+1443496870 -284948802
+-240450772 -1606954414
+-2016789426 1621861276
+-1542381476 -1939014646
+863199783 -805460042
+426551730 -594317050
+-537093765 -2101429879
+-718651384 -1588288147
+144676658 -152174355
+1287745812 1124722077
+1975253092 -1877372773
+-1625949142 250306713
+2066151937 -1424153304
+-1496638101 -958714826
+-1510441505 652150246
+-1479146036 2029136638
+-1304962177 -225598531
+31275817 -885389371
+-1916744688 -849367096
+-475598165 -515925448
+1159502275 1249143648
+-1017839781 -189196208
+-1993299074 -175943094
+1325142051 -1451738396
+174046425 -8829686
+94331929 -2094639152
+-1769232508 -486018653
+-1927668612 -2054868967
+-1009650038 -596312615
+1629693909 104955256
+417472952 -1870143982
+-1305721380 -250379869
+138809730 1713028881
+414370630 1109567787
+851736397 -1138919582
+-368083217 -1550638816
+-542937308 737084221
+1048179619 1100358132
+657114587 1462553831
+-817202441 2122786264
+-1585891862 99423213
+-360474908 1867990916
+1663548708 1075357600
+302464973 757669431
+1683225807 -1649999641
+748583806 359452028
+-1694356737 514463950
+-457892962 1456699049
+-1638317054 -225421524
+-1588176264 1488623576
+-299350617 -559209884
+-1770595342 -851314316
+-1395283928 892442971
+424625534 400038700
+-1234909978 -351679198
+1920189663 593960130
+1457619315 1845597197
+-1236488977 -1643083274
+-21925854 -344891677
+-1680125664 1541882500
+1013247107 2027291829
+2110395106 -1631988212
+-1733207907 -1303693391
+-1591264041 912382649
+-1467153702 1831508104
+-1509716197 -2139582867
+1269951494 -661786843
+574100327 1541419398
+-1366143285 -1072821816
+-723122434 -1921124631
+-26447642 -274513678
+1130921524 -92306592
+765838786 1417333205
+198926431 -770834181
+156800639 -364215495
+564811817 -1353577363
+-1074753866 -351992563
+-434031319 -624314799
+-1671227498 -1624860976
+-1099643232 2022139959
+-146330926 526312974
+-386484871 1676314194
+586646394 363000977
+-1752895951 1334183300
+-237469281 -1230767224
+-1299971868 474218639
+-449262878 1831129168
+-258653842 -887092911
+46439057 1302863127
+-1160761758 191778932
+-442003159 853314244
+404299562 1928726130
+1627799944 791122941
+-1722541667 536013488
+1224308414 -2048032759
+-447855743 496390691
+-302556520 842068774
+-565472865 -1608775582
+-675320547 -1008279605
+-1357860502 -1430135505
+-1762211858 -146100990
+573808589 1552454700
+2005072330 -1750877693
+-850428248 -2082737209
+828028265 -1388621227
+-387820247 -592524927
+1749470927 973182941
+46278598 -451539304
+-16066493 992007556
+176308356 -893795863
+-1953544544 1663552548
+1101387441 829813615
+-1327374790 1643109708
+2144676735 -1205274686
+-659539644 -468975252
+1347930980 -1078165818
+586594450 -1624307056
+-1133781341 -382504377
+-1714447059 -812163342
+-813654031 1811380674
+250666895 -349987897
+647531020 -733359518
+846014741 -1991963632
+-1602918963 -872272071
+1853508062 -783269434
+-1484401690 1983806214
+1153362655 -381315007
+1487164514 -341576970
+-764181341 121814155
+-1227602003 1675331788
+-1759875091 1151853803
+1214855218 -345211552
+260016866 -1408955970
+816331666 410488652
+1316681720 -1062379864
+1598961624 -472832184
+-85679409 1066149102
+447695075 -431859586
+-1114171490 -1109356982
+554567617 -1988233099
+1421243400 -930238067
+-1533851235 1865275999
+1156191759 -1340703641
+-1951401496 444927977
+550528554 -1780937674
+141030085 -2065722538
+-2030606756 729749717
+1537428008 -45499258
+-1283076755 -700421215
+1832330189 -1340138451
+1176826207 1707892869
+-789430749 -1441821604
+-719381161 -1919770489
+1533069204 -1400901547
+-1438596972 -100947659
+90760571 959945528
+-150213772 -856568729
+1280427178 -360538316
+-1318941171 488271300
+-754799986 536842946
+50697851 1889748468
+2005887672 -2008612252
+-616524084 -672371861
+-1471362971 -1701170489
+1096515968 -564089464
+14532132 -35543504
+-2088936199 -1391300122
+114079333 1025815505
+1569492633 769558944
+1375328949 -860471349
+795068541 -1621170595
+1579040614 992630764
+1353884416 -1521190163
+-1263931575 -506455916
+1097796502 -627501726
+902238156 1460346667
+-324611733 -1442900399
+-767711804 -2078081137
+591354579 1983505022
+809432868 1097597892
+-1848836655 544196571
+-868148702 -553607011
+-1906517254 -718034829
+-645749128 73143603
+567114202 -1660441080
+-506392536 1043470932
+509276604 1534385825
+-726604255 2056192572
+231465688 -1077562459
+-889204460 -513864879
+-1665484976 -857067923
+-1615252849 290228429
+-1519954511 285339668
+-1064854697 1489884648
+113805305 2130991882
+180953038 1065329354
+-748434636 298975479
+-192580135 1403052356
+269615120 -1789327090
+-497879578 948872632
+-820958930 -240019189
+-786883838 66219196
+-645097487 -1273857173
+246113147 798930107
+-1104781313 -309601603
+967188474 -2110936007
+-657786349 -1324450461
+-1995459157 458049279
+2040834712 161608016
+902816502 1509962348
+278781455 265128098
+1011409449 -413164262
+-1332432346 562329459
+-942385880 1185104557
+-1216159090 -997744956
+-1286802960 -1820604091
+-683545538 -466718410
+660490886 -1403427940
+1309209620 231697874
+-446739940 -547209562
+-2008198873 -1832015477
+1370453631 942668357
+-1235599367 2073040339
+-773291766 201558001
+456493337 -967083184
+-261812765 1188139858
+-477658408 1586832202
+1645697496 1496695788
+629926500 -1381675800
+896209579 2050244356
+8798712 69084282
+905824906 676631397
+1680253803 -742596398
+-1471460336 -1737098816
+-913554667 -1854783730
+-458829672 -1280952642
+1841914682 1485213970
+-1488099200 -298323910
+2029925295 -548970970
+-1557124225 554757231
+289623058 2145693362
+1167263687 73974889
+-1752680832 -1941724494
+1496162725 -1780245875
+1961952061 -818454295
+1950376155 130371031
+1319965196 46057990
+124889344 -952286502
+-1582375628 703630796
+-691126950 1425928879
+965543820 -659690798
+1855854115 -276551865
+-1611787770 1424489925
+-190671664 -689246891
+992621441 -1392583156
+1654964616 116714255
+-885667495 -679438054
+-1690499162 -1240583079
+1290245181 -2010393912
+-1783982321 123607648
+-1205594112 -289952540
+1000677071 1327937498
+-1985154196 1183898222
+1030689085 749193043
+-781116834 -109448406
+383130044 1088630057
+-66048515 -981924886
+-1819972220 224962783
+-197104954 1656936507
+-658572228 -441658513
+-77450805 998505241
+-1153186217 640060648
+-1723766033 15847144
+-1837800439 140378594
+2040763488 844625228
+-192280136 -834052387
+-1631084934 -287126289
+413012645 518422355
+-1110643173 -686111248
+107536198 2115401353
+1590277723 -331129041
+250247088 1743468218
+-2043356956 1579129086
+-1527967389 1958063910
+1297866394 1131744930
+1150842211 -2110095157
+1305443217 124080798
+98822002 -845032103
+827016784 294146878
+1562507965 1517469055
+1422404845 815178043
+-1923136974 377168523
+90228526 -1399365309
+-872876536 -103824753
+440613264 405355105
+374613636 1038672161
+-1523210392 -1276686416
+-1030850921 1840582773
+873196227 2126886956
+-1342725085 607686394
+1497427956 -1847366199
+-1030621821 1011144348
+-719137536 -701081159
+-1081957818 -1458876431
+224004919 -917641125
+547838381 1598956528
+1224573662 1375603601
+1927993469 2003925783
+1983308624 429632915
+1169609941 416518975
+-1335850383 884241527
+-1393881200 966658145
+1166302790 -2116815252
+2104654888 1390196938
+-1136969166 1468022593
+1500882076 348851997
+-808148994 -484485214
+1460076812 -447419864
+-1331159633 1676370760
+1672060612 -978352183
+-122280922 -538849973
+1999833030 2021726420
+446704286 -377375589
+1908269522 387532995
+499091264 1377215195
+-1692943999 -1899541781
+350887177 -1287739641
+941783020 -204824148
+-533608273 1089275191
+-442401793 916192248
+1095144419 -1260335487
+632059987 -23741071
+465701359 -819358833
+-2038700065 321694383
+743025782 317456993
+703060714 -492903313
+-308515469 1643266611
+1267408022 -795249823
+867512147 615628418
+773807581 -1316110932
+1446748234 348015541
+-1331123530 1162510740
+2064165018 473061782
+1307140233 534699630
+735475971 -1178533127
+-1978107218 -252439576
+398017697 -2049573823
+1946629950 1828648751
+-722923966 -920461842
+717311087 -268828162
+-1162585791 -604180681
+-1830662541 -1209387271
+516211341 692919179
+614638114 307349344
+-1624870504 1368136495
+-2055813479 1826782014
+-2063693933 661743383
+-1582756091 2108107447
+360633728 1534523023
+-2094417886 967629574
+-1814250598 526106460
+1865056493 213508135
+-976512788 646550261
+-1318705189 -1713730729
+2027944012 1186518268
+1417799458 1596259842
+-100892614 2028912235
+327512771 -443741244
+-714435674 -46649704
+-234534717 336476368
+796211448 -465709555
+-713507846 1821477229
+-1939002416 1953372415
+417159320 -2116194257
+987736550 22833911
+1950235340 877887846
+810165232 -1314200191
+1165124502 -1259617075
+-1680108600 125803819
+1724497877 1644663878
+-301232038 1686687021
+2123576186 -1628504102
+-1822767079 -738843312
+-111913106 -797113904
+1231853831 1502188216
+-1951555146 248851806
+1595329796 -453528575
+1288477203 698635533
+-253351162 707224906
+-772123447 -619759921
+861016582 -1877672944
+-75958081 1907832388
+1387664766 -1968117038
+871290858 -478606060
+1091457216 -1423552725
+-148441678 416479721
+-1845606378 1035210839
+1491255932 777585605
+1187057155 -1885828666
+-451209786 -1735455791
+1873179344 1459013212
+-1603257357 1034245122
+328870979 229768774
+-320697220 1969655147
+523615872 -665784868
+2033786621 -1154188549
+1738148592 -785503203
+1222481384 -443139426
+1836789856 583588325
+308287224 -1039389089
+1055545322 -1051389258
+2132770713 949267469
+267704328 -355869755
+-317342538 -42353553
+-1670435626 -540538648
+1560627988 1340544935
+2121116642 1524768159
+-929693629 -441159965
+-1132835592 -275451629
+-1654104617 -1712814821
+-1933388495 -1589984101
+-1730470441 1588510430
+1687765477 1442829026
+-1374220905 1560255902
+-1481711638 -646338511
+159389826 2101467786
+881786572 -1050667619
+1100818823 834234501
+-1177950530 1078182660
+-1265065012 -1327757293
+-1173122390 1072785785
+946471224 170501279
+1159466747 2065851642
+-1222581861 1341258416
+-171002391 1673004357
+1477849773 -610601287
+2034618083 1008479865
+-491370836 -1687247092
+-1022392612 1436176014
+-680105919 -1507408795
+-17413295 -1470733571
+1834784733 -1149840469
+-2001444 -1650460444
+-809074693 198311377
+2123325573 2052836667
+-1299723308 -963542975
+-543492757 -150156473
+1047303784 -883636726
+574192274 1102422675
+643210282 -1641667479
+-1107706783 1844867656
+-681732347 -655320807
+171034684 -169683138
+1502205742 -2099512408
+-714257552 -1047184456
+530421452 624397722
+1641841229 1498917064
+-1912530071 696932205
+36270287 1751374928
+1715831470 -588434693
+1466179324 -1674661516
+-96910837 1243724114
+-181123367 -285701913
+-1372006623 -500561369
+1677056004 1794415769
+1210561583 114798731
+742433197 -364983339
+1541453759 519127679
+1829063209 -1810152291
+-576080401 -822939270
+-501857393 1012704150
+1122337465 -1204302778
+1266690908 -256000285
+1746035219 1607338201
+-1742978932 1122382444
+905644366 -1884080359
+-1734347656 -1780416390
+-654309435 -214799068
+-707529225 -189079225
+-593451857 -1435720541
+-581232924 -450643761
+488966685 -1965164144
+-2141769338 2000138486
+14650814 -360375534
+-2135717134 769362282
+508149163 -1049500623
+-1853615058 -1140578055
+1281690428 1726549507
+-1972838483 265242908
+1258694009 -146227650
+-1414504193 -494444738
+-861453416 534799326
+-1755972728 2041536533
+438657513 815363905
+-1393664917 -1812577233
+894829423 1193007316
+885500024 464776953
+-1940931207 1931882825
+2030363557 -397712192
+-555595883 -465863782
+1731874776 -335749245
+-1638566469 -145326251
+152224677 245449894
+1751231634 -1965265064
+-861862889 21207875
+-1625657973 1319788956
+-45955701 -1903875314
+2062437874 -492622956
+1572382020 -2143129577
+1654399461 460484031
+-484530735 -2143957392
+1967640902 -1120172792
+799989745 1409493611
+1558453483 -2069124845
+799612853 -409367007
+-145573544 -1621349687
+447307439 98433594
+572944994 -932900787
+1934600075 -1111930528
+1276394348 -1941670337
+-356345990 -392098955
+-516373110 -2003289787
+663206935 414571353
+1236605662 -522580057
+-1755403916 878157612
+1406905173 -799472483
+-2137613655 1749962488
+203043386 890980021
+-28309040 657326198
+-1321829985 263419031
+12563480 519699645
+852099587 -1412011840
+-1848351713 -399838067
+352734599 1278662139
+-1112691739 -1097021513
+69957191 -1827352852
+1471058908 -1269698693
+902725409 -1714216663
+1716651084 949032033
+-255632518 1488606658
+2055391461 915335163
+-1265952435 389462445
+1582202416 803532512
+-1697639896 -226684855
+2023090871 -603431192
+2130969466 -795914588
+-1907031922 -679865252
+-620894440 -952625808
+-1801928035 -1493378690
+-1228828483 -753712137
+-1488920171 122303178
+-1441192755 1115427361
+-1743759991 -447223976
+175567112 1601843715
+145220240 -1928537865
+1443392078 -400815574
+1335176436 1201419208
+-899128788 1756408857
+-2147398672 163565885
+546680899 -952161948
+1205913764 413762541
+405169438 956527650
+443192081 598407831
+966732372 742132455
+-392868057 496667976
+1767817413 -210331640
+-831402109 -587599198
+-412062126 -654782241
+-1174188128 210022327
+1104080073 1218043863
+1729477360 1023050476
+-892719194 1790215397
+1260370466 987632667
+-904031033 407687484
+1462015699 2051929253
+-1155814680 80145700
+-1116526657 -866241355
+22683002 1121568115
+-2139286943 2079221039
+-1352626588 1845882711
+1947752848 -1487287976
+209971112 502652949
+1783553460 1507025266
+-859431346 -20320473
+-1648587571 1492779380
+757752050 225192618
+-1744303006 -1220755876
+1614681355 -1263155325
+292694242 -757346546
+733859750 282475415
+579950653 -1096511221
+-1959406614 -450845642
+1264472417 -1466804625
+773538334 1868775070
+1704600349 408257389
+73987761 -1561429113
+2001590110 -905615069
+-675897227 -869678996
+18897463 -1411926528
+-988090566 1257473906
+-1948427359 -1182971767
+672272524 107722114
+116690196 740881728
+-1059044066 1609233947
+344460103 924721805
+1210015766 570296738
+-203299725 -367843284
+345827556 -61889007
+-1433564267 1200370115
+-396826687 207226367
+1884010432 1258089459
+-1581715875 372783345
+353153801 -212593950
+151678288 -1676472010
+1659835284 -229686802
+-1926258734 1824142326
+1798680775 -519269822
+2125160596 1564484886
+1020278553 1110047789
+-554355865 2035375080
+1263552392 -970016425
+-1657102793 -760156686
+1439823895 1025084625
+-1066116611 -208146528
+2147470279 -704888677
+-101373428 -1874970741
+511635629 -909564471
+1619192199 -273773512
+-1566748270 -2039464394
+64166164 -1160499406
+-1219374455 -694975016
+1341462321 -1933134420
+153064912 -875019693
+380517302 -733325814
+-1162342137 1315342474
+806867108 -684278619
+895196813 -1811782056
+-2140145753 -1234545495
+1381151561 1784799433
+-749002894 -53054168
+-961643633 -122180710
+967027508 2133787862
+-1159868449 -1678506061
+-780967420 -1054985354
+-2050757032 -78126332
+-587927949 1296960706
+-1456942304 1857448619
+-1326205778 -1737061223
+2050047794 -1795810045
+2072441826 -862020602
+567258370 -1206524934
+1029476653 -951496031
+1998586944 52286602
+852375228 2267489
+946990985 479986488
+1866960701 -62385462
+-14267180 -1218844649
+-1473756042 -1231037157
+-52562617 148416082
+-364498402 -1875917140
+471873753 -1434478370
+-1387851025 -680245799
+-2002838709 -1421692296
+1135337425 -158855376
+1037090944 -298453622
+861508242 -1265068918
+470637281 -112931034
+-615647292 -2042512513
+-892965216 -1659738186
+-1666372320 -1520386385
+-750475490 300327099
+-254260036 -934561187
+-1269311541 -184835829
+1155288337 -146440053
+546977162 452515233
+-221532855 552161868
+2089474934 1235734491
+1483466398 2127548826
+1256065528 2110027378
+1591288816 593074871
+-427338721 -920465561
+445546274 -1800882984
+1048559937 -721522018
+-881405183 708918528
+-1417880321 -1780506892
+-1629892453 -406046978
+-1664748156 -1008020069
+1602427510 -1804854215
+886378111 1246404441
+761548407 938231630
+971583467 -498086068
+-1785793972 -2081508503
+-1571500593 -2099894554
+-716226372 1869494506
+-728481420 -470789792
+-1354902839 -1210058114
+383537429 1538939446
+-87989872 1111102277
+-617698785 1064200435
+-550322746 1386633366
+-1203073047 -324935938
+1606122566 1069207024
+251572557 506042803
+-1549817327 874908089
+487855377 1257979672
+-169588126 -1407104961
+-529081490 1215169406
+-1818940659 -696724264
+458626553 1547652815
+-1777659106 2000884804
+-1166213788 -91677318
+-1298647623 1333072254
+1135306982 -2099479627
+1768119011 -1590912698
+-113230886 1381880308
+1437282466 1851603672
+-2137188672 -1441213639
+-785518031 -1048022516
+-338044578 -22343971
+-338074090 -1080348814
+-1861080185 1060841076
+108962547 -26302843
+-1697555860 118127034
+439376241 161913089
+1509253706 780030613
+1588627211 1955626952
+-1493279611 1066400667
+1538941498 233696808
+-696585735 -391805437
+-2104060045 1105326593
+-629029798 -400262863
+1636041687 1880719211
+1773420713 892521510
+-256290712 -890171896
+-1563176017 99954573
+1011161951 1697741350
+-1253470853 -1647412382
+913524916 1198122453
+1811085811 -351679933
+1301981783 638516894
+2009756554 -425936907
+341736607 233339025
+-1088006360 707026040
+-1922956836 -521624135
+1246447166 185292007
+-821231368 213459261
+1928462149 -1702168670
+-620899071 -782315737
+-231871833 -607718128
+-908362884 -1598648208
+342168501 552354048
+-2030413957 964733643
+1534535089 -1674002650
+-2087040576 -1169831769
+675145200 -544033731
+762532826 97960775
+-1344307354 1191320619
+-698370284 1772074313
+-213422581 1870975638
+36087294 -1557566034
+581847067 2072663078
+1380586159 -675760097
+806729896 -713278027
+625102314 -1512487585
+-2028500839 -1431763594
+1691603528 675500292
+577755441 1643075432
+-914588515 502900598
+-38739587 116573229
+1548121486 346303007
+810020797 1391071184
+936447912 467891475
+816122875 -453092357
+57230096 -1902820162
+775918626 -896030267
+2043182688 -1679411488
+-141673968 -1471070276
+-242135392 -470307049
+-371795873 785429651
+957321351 311929331
+515703509 1738021107
+2113000816 982055679
+1295910333 -1872219560
+-1761302886 -927215553
+222200482 -585212410
+1416026691 1982452945
+-1397070216 -1238226181
+-298249746 -928578013
+1456980450 610451809
+-1974993574 1009581719
+1834520720 -1066219365
+953649920 -1970289227
+1000138471 -2066017389
+-87294519 -36222069
+1598509219 1030484063
+1552308938 1760637965
+757161390 -1561072267
+1205400848 -612877232
+-1921633685 -1838177363
+1326124570 -905370075
+502685355 2049683849
+-959369120 -1237111021
+1374973881 -2071212012
+215656281 33238728
+-1244615331 -1416882564
+1759595993 690509297
+-658426742 -1709025030
+-2088601967 -95950812
+898020791 -151514355
+922135796 240472261
+-890359613 1546738042
+-1911197363 -1100046908
+1446152275 785839201
+2024624980 307469791
+514326651 -455366309
+-2019058496 -1184579651
+300541507 848927286
+-810679360 -144488927
+-532329111 -1541732359
+2130556950 -2050321516
+1317407495 -1206994813
+110393563 -1298013754
+151687676 -1864891352
+-727569066 1063236257
+-1336219461 134987581
+-879306726 566041285
+22663543 391325225
+466482417 -518016881
+1326419727 -1076495679
+1744136657 -896234002
+-342527523 -1271544061
+493679467 -2131414855
+-780583538 -1169261167
+-796048954 194739991
+-1279171655 -2007638871
+506467411 1438394150
+-1953120319 -1742737685
+-1770654919 1109727480
+-29982341 825805175
+2138853699 -247425535
+623403493 -732771616
+1197993662 -515383644
+-1272129239 475380699
+-712516798 1722025647
+-1586112337 1743525806
+1699803531 -1616098399
+1222473244 -1178968697
+1482258422 879644050
+-792935896 1608645462
+-700080107 -733398370
+177595094 -715831791
+-1140173134 -226144123
+1534022207 1855050795
+1470656910 1612647022
+-1690124722 -737971258
+238423748 -189313460
+1615463062 454161300
+1053031417 -146957266
+1246639351 733302156
+248498998 -1813383138
+-495758091 -2060343171
+-1198729405 1446593417
+1568169082 -695874738
+-1007311745 -1218690051
+1803241706 -1060917450
+-1996024819 -676267364
+917603678 146089453
+-20628072 1675693263
+1318223331 1479166807
+-1054584472 -822497577
+-64909366 -51794621
+-478820817 -125807276
+428956720 -815327316
+-789773913 1959035597
+1164823208 -70888612
+1191784846 -16289427
+566597957 2041890391
+628160278 -1830845587
+-1244625562 -1610438341
+1857093313 1174288453
+1039283108 1321917156
+742180086 429437412
+-876212160 178531260
+-1806991287 2078074144
+849995487 301450497
+1974234327 -1185731445
+-1817198924 453349020
+-1127821783 -10208059
+-851393695 -1880750979
+-133938957 -580230817
+-643907988 1328832215
+-1356355967 689978080
+574449263 -2007909411
+13292441 1316691127
+524233104 1356488716
+-378603963 1069163597
+1061853180 725078090
+-1474068319 -1095797185
+1909225531 2087010952
+-1556595390 -765225128
+1498305969 2135978521
+312578746 -2103224077
+1667409776 203659481
+-633077381 -1155864229
+-957233186 1333548582
+861994404 -1987581028
+-901624896 -114287765
+-223676029 938651272
+-134020012 2036246585
+-57364185 -1208063002
+-1180747628 1198871116
+-707754851 -1362111570
+-608946384 -1917316110
+-335076125 428741025
+114955353 1885846423
+1404693396 1453543454
+-967748914 1305411357
+-2026467428 510815024
+1906988264 1046653713
+-471471293 -487938277
+1961655129 -923705498
+257760031 383961422
+-1296224326 249116783
+-518649750 67651807
+122921008 1238492924
+-1163719826 1812053953
+-1930835367 -618433294
+-1330080503 1557073966
+-1637367116 2125628883
+-15567926 755829093
+1682548056 -1432310674
+-1159292258 -697832954
+445864245 -1797348766
+779769118 2106809594
+1455884090 -367273407
+-900418992 148808412
+-854634321 2001515477
+-1133629466 -334619138
+924623532 -686887377
+-1515834134 1745885951
+-1970883776 -1928728327
+1737164128 1310183662
+389617092 -1942560697
+-152233545 416793350
+829882888 1571084567
+-1109680329 1217435945
+1394392005 1921210908
+-180516541 -130598624
+1036551266 -1434271839
+-640122577 2075021352
+-694230678 -1393241086
+-2124481247 -1218090380
+-89752437 -2147423950
+692603085 1726024938
+327053125 -1730301131
+-591173292 -730370389
+-1654644418 1351534375
+1722633509 956567503
+-345092723 1180746951
+563332389 -164662858
+-1475983241 -1720167937
+982741501 -135830266
+-1876187438 293978712
+295814813 -2025869960
+-1301458448 -2111721290
+505831257 131409362
+-1709892724 1754434870
+77243626 -1563739733
+187180005 -1297424748
+-1712696052 337307322
+-1245493669 -905723058
+-218929714 1273473660
+725263567 -1928540208
+232600536 992506460
+1855792011 733444304
+160873698 -2079808107
+1978934609 58346110
+319512382 -1894275200
+453811390 -2117299340
+-1730986509 1841515651
+1883763297 -205415652
+-443814361 -1276735536
+1359031292 -467123986
+179355499 1297792562
+-1447260667 -1019156047
+-229843510 -210824871
+-511831963 2127784796
+-370731714 -1483373252
+-1109671806 1941300707
+-1152026012 65943777
+-779391664 1623898258
+1498104056 -1351329648
+947427442 -1311612720
+-848692400 -1047196901
+-1415946903 -16583209
+1686393195 736071199
+-1467900364 805714828
+96356663 357162612
+-1868370012 1838320019
+-1993902969 1260031221
+-1863665086 918180584
+-156428627 50852145
+914575682 -88762559
+-1153346148 274169722
+-1786028143 -840005555
+1628132658 669826106
+1024528906 -709849459
+1604019714 1194933568
+-173974722 -1256978741
+1632592597 139125078
+1653042427 1036465428
+-2110033211 884125712
+-756598006 -1538793143
+1548472413 1542271200
+879920013 573355819
+2006687404 -1527936327
+-97349817 150629017
+-338103175 1462693584
+282210367 1167597550
+2119508482 -1912614928
+1066268196 1485682701
+1434157737 -1476463649
+1337562405 -2088253524
+-1380240977 -95535057
+-431417598 -838140993
+-1460191569 40657667
+-838952558 201140912
+418508953 1375568675
+-1214026192 -1520752239
+-348764212 246806819
+1758578280 392685745
+1872561992 -94440323
+1527335446 -354142980
+775593248 -1825235574
+561877104 1390783366
+1158421832 -1861570420
+2016692689 -1710270657
+66491423 1181160233
+-2036190436 725939508
+805765088 -1354917537
+-1736153145 2126077355
+1025230119 -889403610
+985463116 2108633918
+1587480638 -1699707260
+1270983683 729730066
+-2101896927 -645192201
+-1467624635 -796515249
+1012639165 1364983433
+1491937789 -1939694592
+-435469650 353859310
+-1898416720 1930767584
+1060889268 -899172658
+1454983330 -323178719
+479617771 1798339156
+-684732088 696460960
+-1625167198 633182771
+1638239288 -2019023374
+-1472163933 59012673
+1615986410 -286779484
+-998138987 -1136958950
+-1637380644 855792841
+-304392907 868951476
+657261022 881542416
+-64083107 -1321472644
+442329333 -2015931175
+-1716696556 1937252746
+-800724849 -1836761420
+459385690 1840909237
+-81190732 1253791746
+-137614053 -1138248574
+522440119 -1126923895
+-729690340 117616519
+-1274090434 455861717
+1483380182 -335181215
+1076071957 1037467377
+-744610043 -828840551
+-1327101714 1333750164
+-225879905 -711276456
+747080991 1516604641
+-392291507 836991545
+1743289641 -1898747970
+1045008857 1837277849
+-1524789684 663763957
+-1836780703 -1468898537
+-338310311 204442396
+-2005493604 -247873136
+980591350 -1006968431
+1716472137 -1363784520
+-626022846 166257110
+421736874 1970833838
+1476312133 -753430181
+1512359086 974539461
+680135078 1712907847
+422955929 -172281426
+-651534514 -1092478759
+-175595958 1863794127
+942486287 1333632309
+-1977606271 -1197396960
+1309893079 -87717999
+-571178886 -1007630547
+1590947433 1394508965
+-384737766 -1632425614
+139953816 311164873
+1062502852 -387399103
+-1835417251 1338169383
+1132127340 1083223096
+-1135400901 1917812709
+-1838386700 268186570
+-311126361 -1758910861
+-91796537 1734884764
+-1270136371 -1735551849
+-1507036866 405356964
+-75687063 -2139454662
+-1438326678 -257672198
+202041695 1698257343
+916100036 2136157026
+-1903999862 -912363566
+1579342515 -124262133
+-373917781 1154588277
+-1211782301 1997367654
+-1515550446 1884310804
+328728713 885891856
+2026658383 317862423
+-1048002615 -1882285617
+-524493335 -2061326212
+-1174472081 -509648772
+-1919739318 -1306370797
+-297390984 866803495
+-739528357 -1542762540
+-1444779962 -1768708198
+914832112 36798686
+1461358126 -412473342
+-1299145691 -187190060
+-733236253 -1270733375
+926638886 -1955434019
+-2001306826 949630642
+729636557 -1288139783
+41355965 -993157261
+-627972242 -755102491
+-1384530782 -1276479119
+229988849 -1651657319
+331726024 -1981260425
+-1733490910 -1843135784
+-1912704845 -1748182002
+-1794673567 1625483045
+-1531259851 -1871414684
+1331042951 407358608
+1197790387 1040434548
+325674643 -1690834796
+2013672119 368586841
+-819422749 335038235
+-747732406 -1563241762
+1215642187 -1916697685
+-258165308 434255119
+-1990763778 1295648510
+-512600433 2034380106
+1759105344 -1168093010
+2024492526 -1477505571
+-736914819 -558151982
+-274997954 656768807
+-1616233190 -1268241293
+-1546391132 1918122723
+-79250398 296234910
+147921860 -1161370683
+1586582735 -989923465
+-832056333 1632696798
+-188485996 -232837203
+511472574 472259201
+272598631 1139283956
+-282910684 -274960179
+1407524440 1035227100
+1877765984 1836951196
+-918112617 1349144406
+-101634846 1439224741
+1736735254 -1954961828
+1698631580 1754424162
+-1492520973 2116846075
+1565145233 -1672236657
+-936742513 1960302622
+-723669064 -1496845364
+1075794428 -93577600
+-899464706 1777744299
+770946220 715590897
+-806939263 1885584132
+-890096774 -691392448
+-1461165110 -286897219
+1568377815 1022299601
+-802354371 1568397712
+-1460801941 122977682
+657160344 -1319086074
+69042776 -2006476645
+212051467 -866694642
+-721969554 -1425414819
+1072207795 -1322221362
+-1516888923 93337922
+573806942 -1419360856
+-113154890 -85431827
+27854983 703923006
+1318218461 -2043249975
+35220639 318700685
+-373777981 -1741982423
+76180597 898824520
+-1548518396 1569547116
+-2041622402 1187133306
+-1120070027 319169210
+321288724 650815705
+-46259366 -394423228
+756256732 275523720
+-683852956 -2054387178
+-1830302855 2018301050
+-1049013188 -1810192768
+-1258254680 -614720011
+828297937 -1799332418
+-1771611483 2104427547
+304011268 -1539101125
+-1499266568 -775911931
+-1248428549 -1153019849
+2065926724 -768689704
+-1482929110 1963996779
+290677179 994202780
+1654058029 -757861613
+-1803087272 -1470689194
+-114291404 1341698917
+1161246988 -1480847202
+-1141148595 -1462401551
+-679355290 1835972755
+1351615815 226082769
+25632160 1927923331
+-2044391729 -206061081
+-1873356100 901017222
+-1514605674 -576946431
+1785252388 -401635011
+-956343085 -2016489908
+-1624449572 594975014
+-1793933848 -782379866
+1684083676 -638264333
+-317532245 1387769132
+1842242415 960344753
+-110159118 1255273463
+1064153358 -334915078
+126091397 2072247239
+-529669307 900548207
+-1751260005 -379057225
+-1938355412 1693388971
+-169636928 789727781
+1087967464 1703212332
+1191934336 116851495
+-830822733 -813023051
+783748655 649304256
+-600309340 361332229
+859094796 -1663977892
+-1448503145 -497878546
+-1322340084 1262889964
+1419119762 -2090732863
+661563908 1278078333
+-1536174001 -1608618451
+521238114 128170564
+330815958 1752467829
+-493773650 -703786082
+-1335800322 614203901
+1361125696 -591602263
+934356464 1891042626
+481627746 -1873396840
+48499265 -1515476270
+-1743152973 -399999651
+1467081942 -961307138
+-900674297 392575496
+-72804209 590987167
+1355032835 -1462101397
+723946973 -2077470433
+1882553684 1371590996
+-1887990619 -707936591
+-1767837171 1113341347
+-2094930023 -189528072
+-1844363272 589180333
+-577564736 1067818534
+1406532254 1331958337
+645234490 2089394829
+-799802027 -2128333172
+128519340 1720804894
+1991735832 -859048351
+-2026768941 1518574804
+1069503695 -1115372364
+1156351763 -909488237
+166978829 1576281912
+-1081177621 1335154556
+1638072883 -579949041
+1200197822 -1066055940
+1710835173 -1071778262
+-1740670622 -407335007
+-2084862243 1053359186
+1859759965 -1329625966
+-366062250 -1540948947
+-2121481270 379631245
+1867742781 -2031122249
+-1158675752 -112342218
+1488114125 1390753325
+431063672 1636499769
+2013501830 -1839767985
+1421701710 243712155
+-2066658416 606356846
+55236241 -1955998758
+-1079956481 409400478
+-2066539124 -107529659
+-105226505 1819105981
+-1253752516 -1463551132
+1198497423 -1368960452
+1816612327 -1174682444
+-415605906 65369166
+1186061006 -778868156
+-756795563 827083536
+-1920579077 440478933
+439350949 -375695563
+-1905358312 2064853912
+-698168499 993103677
+-487727703 -1776876131
+127231473 2009809902
+-894710903 2002857612
+-1304176110 1625125457
+-618323867 -709652526
+260364797 -1077878046
+-2006451359 1923792044
+896259860 1889910597
+841809973 216837184
+1233609163 885800124
+-1426147760 1827243700
+-1077649233 -2109550967
+4827667 1489486487
+-1111157303 18632336
+-978216364 -433630254
+1336953422 -1402575714
+184711188 1721107458
+-1431696805 1773944050
+1778853341 436347309
+421959233 -1587062967
+843116996 2041924372
+-1101347245 1354273446
+1587968788 -661708634
+1088933715 964149376
+-2060793499 -629528744
+-341654899 -829001564
+2130188608 -1099760652
+464934227 -831741972
+-1412513372 52117844
+-831874857 -734834132
+-943296596 -72522983
+-279661700 2130232172
+146619770 2142899429
+-832515074 -397786585
+-1149538808 -1033294490
+-150560014 -1805812549
+187209269 -1529118299
+-585923828 -1203089993
+167004992 2105687349
+-1044154819 -971246563
+-136499481 -1254936695
+1557758388 1991739482
+982502329 -284820094
+1267745458 -767628860
+1576410015 -1248756212
+2020083468 -1116496978
+1844549950 1393946253
+-323498406 -1949537491
+793216861 384601269
+-1427181484 -107210060
+-1502008863 359230108
+171285968 -1679600589
+1066549587 538935545
+1325263813 -425983069
+376145321 2122096838
+-326069497 309318899
+2036972529 -947477312
+1720967860 1071201464
+-1967460521 111711720
+-1414480454 -2039802323
+-623475773 1438757774
+96155708 494241370
+790152148 467904203
+-445262272 -854810303
+1804249629 -1055094750
+-1299144925 1316947342
+813687554 -2017803229
+87596548 1707522866
+-2041170078 -1509388212
+456098537 -925651542
+-1024508983 1980113002
+1662413875 797010057
+-1140685245 -1223105448
+-769477 -1052425502
+319320923 -2123169624
+-1116667912 -1225649362
+653279091 155465968
+-116760757 -94365326
+407481437 1893080460
+-1450703056 1541672015
+284106563 1985795937
+-9685563 -1973556801
+-686701750 -2044164018
+-1746926390 -699592842
+-1646960529 377278448
+613648550 -2055236037
+1926569004 -616069282
+1775550046 450088003
+1730911653 467146062
+-1840697957 1212429584
+-1780991061 62377979
+197637157 -698298459
+-1377104934 -438741420
+379356695 -705009698
+-467841690 -1847542983
+-677018643 204651867
+-1963933434 -403367979
+-265283993 862506004
+1595958813 -18070704
+462147568 -1270264496
+1106015439 -1783001276
+-2075073608 966943753
+728727740 1346543326
+134773462 305281942
+-1306474362 706509543
+1389863052 618511602
+-426703484 769706615
+740908718 -1358490384
+1115247008 1143991740
+-212879797 99750491
+-1720231119 143503971
+-784603867 -464121234
+172458006 788205182
+1172186709 2098393099
+514688420 -542833506
+1376135220 -1843578259
+-2015977037 1731896176
+-1065687119 -1590701991
+-315053208 -949485135
+-2117194819 -427935045
+-1461528032 -1662833828
+-1459333634 -671514111
+-1410527923 -652589646
+1076452744 -874370838
+-1736064247 -1943653490
+-1439328458 -1342539735
+-697619037 -108183942
+-1973372698 -1867597081
+-1104791234 -1930419554
+948952340 -717470230
+-149868469 1973269218
+1317371132 -543538953
+502274331 -1319385186
+-401494522 1643210808
+-906387417 -1026714534
+1779012775 554160642
+-836920754 -1022203936
+-1787638987 -1386092958
+135436365 1937490230
+-525970103 1152274227
+-1064581644 -1599235323
+-1406318341 -948584249
+2058393867 -754462811
+210403586 1955834885
+1831050944 568328629
+-389728881 -330743908
+1260352159 1640400195
+1662045450 -1545608608
+-739095371 1165692870
+728646291 -1313639957
+-620758441 71434701
+1425327369 716398648
+40938125 1524164800
+343208477 431364310
+26365051 -1443641781
+-1401463980 911334059
+-2107526811 1509128018
+-250439173 1637985314
+-413028030 -1231504320
+110157228 -1204254211
+583125314 -2044667709
+1503459796 -266629770
+1594658440 -1542556866
+-497296048 -1504756804
+750783026 -1903532597
+-1212037003 -1330080145
+1478239909 -517124831
+-1116587712 -2055845206
+-327153064 1105382328
+381790590 -991676323
+1268786219 808229664
+943054722 -1479967838
+-5434429 277317990
+1338286647 -1751525455
+-1598843882 52386071
+1107172141 -1003145832
+1035512426 1871055041
+1819196884 351633592
+-1844250486 996197374
+-1784634283 2107091469
+-21390940 -1934045945
+-1537215187 1469812384
+-1535804264 890259298
+1515467006 1009320746
+2028413052 80434853
+1358409214 -649891014
+274872160 -1424476634
+-1254918281 -2060043828
+-1274478350 -546663586
+-1178703941 530683914
+-863076541 585553433
+-813902609 -1894522709
+1065128151 -1294712739
+-1932171288 1921994660
+-1603550268 -358387638
+-1991622511 -1977924028
+-1012274761 1513959211
+-770762114 777981926
+-1794859976 1115018786
+158333873 1037318931
+2044627997 -526673575
+689650181 -711438738
+961361310 1783183569
+1469776963 1850881612
+-941101978 -1951609117
+1922682465 -1434101592
+776137871 1290792819
+1471787588 857375770
+1074057809 -447343397
+1655598706 -363582543
+1707666170 -2089635457
+311504703 -178251284
+70850975 -13488552
+1201578527 -1787592729
+341351765 833596769
+-311349910 1856024497
+-948926668 1230300556
+-216171385 1684066211
+309988438 1296818903
+888813887 1150323044
+-567765379 1613425719
+1642681568 15914049
+-737613743 1304968402
+1326309219 1568760293
+1329641349 -856297156
+-656378353 469693292
+1448180065 1594651037
+1897405427 2128402535
+-951085381 1357563705
+-1439887746 -702026492
+-1496165762 -564099743
+604162147 -1465066714
+1817110902 -1962699792
+1261983779 -1852641934
+-1792881965 1669605379
+384905762 844947723
+1117608806 685907464
+1985825183 1136938486
+-1703671855 -540133386
+-956762474 -1302767170
+-1848438292 -83536925
+-308290277 1463793303
+-1357288190 -1303409076
+-726409148 -1482881090
+1577197863 313613561
+627765245 369884537
+1288977550 1115917570
+-332525902 203969901
+1687114942 -630356003
+1101295293 1747855248
+59153033 -660666072
+630715309 -1022897557
+1940712086 1037067790
+-68889545 2125883430
+371225179 -1878682252
+-621173597 -1864275220
+-1674056572 -820876448
+-728837951 -2107383465
+879292832 1271195688
+1203854328 1036288796
+974187299 -2004029250
+1427201265 -1448263826
+1599282860 1930456965
+514199942 -1650092870
+-915060703 -2033146983
+692800936 1884205192
+-1009519736 -1526870118
+-1376204002 -141559232
+1406703849 121525012
+-378489095 1128973198
+152681995 746761064
+-723072186 -1877272114
+-1827984381 -695733483
+2109660240 1377153709
+2091951161 1653126840
+-1348435782 1292142688
+-1121933784 -1262668173
+-322519177 1151470252
+-1862570204 538697050
+-218991842 383099722
+-1301135546 -1724923985
+949308592 2045737991
+1614063041 -1429323888
+-789306125 88711743
+2075787196 -1665704913
+762398227 138016976
+415052998 2054849992
+2130045978 1845538886
+-28284397 -1413376443
+1738489568 1365674185
+-227489241 1457556618
+-1474217461 409064740
+1626298095 -1754685609
+466618326 -263955183
+380310510 -770662476
+-238421104 -2051773871
+111634066 2038460688
+879763151 -1314764340
+1473261482 938329786
+876012973 -501060379
+-1805929498 73035553
+40489288 389509634
+1563024173 -425270569
+-1339996552 625529801
+374262687 1255553436
+-1425831043 1506402562
+890246133 -879358258
+-2057232066 759624002
+1275537608 446993917
+-1961851793 -296421687
+104462212 -392069377
+-809260231 865720031
+133845837 -1850185074
+78028609 1667309283
+297385202 -353185474
+631627474 2121880396
+1514652685 -1141800418
+382470754 678061881
+2081989261 618080085
+889124736 -1540659766
+125305762 621652725
+2072648304 448303945
+166614523 -702860944
+-1689996816 -2075528557
+2128104902 -103648774
+117883543 -263165872
+-1611679870 -1054029854
+2008752470 -1871268812
+-930086540 -293068372
+1180414849 694395735
+-1856799726 958793229
+407186210 -362472965
+889913202 -1673251150
+1095450143 1180393014
+-1715185586 1818812597
+-2015492188 -1904303333
+-871602752 -1417698547
+-1311388039 -1153321862
+-1595191994 -1924533645
+1411407401 432455590
+-2131601566 1577705880
+710751959 397700514
+1096421676 1586331458
+210392079 -996433914
+2130317643 -1076604308
+1805201400 -384410165
+-124278366 -1840952027
+-1778320375 1241229914
+-1137717408 1071182412
+-329811118 502779947
+-366354535 -1623334495
+-2062165425 -402586739
+-1644775590 683943640
+-221258080 946380175
+1802531158 -805113897
+-943551283 1904718109
+-711498226 1606978449
+-1141840292 -905641778
+1452701085 1581490949
+-803911464 -1602538070
+2124318466 578963886
+-1584760660 753859417
+422421543 -1451102630
+-2001706149 -1557705357
+-1823481309 -2020131952
+1188379220 1785004093
+-883972852 -2099857750
+-2085719523 961230557
+-320242218 781841786
+1155220108 -915728858
+-1004129524 1765007749
+388286292 -1871115562
+1618021434 1548566651
+-2112942675 41767160
+-1719597020 -1307368778
+-833917162 -1084529903
+-1784335526 2108100933
+688789208 -2105926299
+-1500215250 2099417822
+-681707347 1971461614
+-2019366358 1636250256
+-1918460980 1214334782
+1934155125 1635862135
+487966884 -219503466
+323069399 -404726355
+1431980110 -1313645791
+-1769255316 -1224233044
+2114279209 1446932852
+1778426250 -768468397
+323286149 -1713332554
+-1763334352 -472699950
+-1783051400 621450212
+-1074956523 -603752403
+-222218277 -333174947
+-316111028 1908332458
+350413686 1914540815
+1376028700 -856008968
+248051492 2053680781
+-448131554 -941423006
+-1668340410 -1739703740
+-761083358 2069159167
+-147659318 -1164746483
+577946475 1675743637
+-890361028 1815434726
+-1990835082 -286993621
+-533403039 2071856946
+-566990935 -1154746902
+933365251 -359190084
+-1092609124 -812918283
+-2025768181 151652563
+1434737828 -153855194
+1396769948 1745567494
+-1882398610 -1525184077
+695817027 -477591640
+-1707087594 -985470488
+209713812 -582973264
+1689313890 1207340497
+-1464291746 -1768183565
+-45673153 631357006
+-1529074273 -907668322
+-540988151 1137124498
+1600556441 -1590692812
+533355654 -420292053
+-1824631385 2017787345
+359445356 679154831
+-101457374 -1337832659
+1738565178 -1986692514
+823508363 824979517
+1169197617 1289630674
+1250390963 -290281309
+1259708114 -951607506
+340522474 524423966
+-182088677 -241933940
+-1878705225 -1108094117
+-1816520981 -117637908
+1787266767 -74132495
+-941540211 1267712662
+-740405740 -1075050338
+999764078 1548846333
+630989637 -1759923420
+-450058573 -1534704501
+836349261 -1176236185
+1356484083 -1776401026
+113058337 2020058597
+1838564236 -1440363205
+-501520497 248122606
+129830705 -1250628286
+-936206259 -1286143225
+2105050723 827502650
+2024813749 113191432
+-1763708968 226712213
+1947695594 -1661724573
+1937137131 -544906127
+1821887414 1340305077
+2108070024 -1464311938
+1070727714 -54244922
+-1571416622 -1559740167
+-1245306986 1273608227
+-36093706 264763585
+674139406 695944436
+1221657989 -2010787932
+1213108349 -230303801
+-1933369619 -1148723467
+-2029426978 -1968151618
+1931917340 -561503647
+1303116851 1341685782
+1329934762 1719432168
+-2077936445 -1143863927
+700317158 1116123779
+-2109782186 -554806956
+-1068873653 1411213034
+1616192867 -1078275153
+-1355181250 -400906101
+2027063096 -1200977190
+1628068114 -496047306
+-317690895 -2054023616
+-908380047 -774499383
+-1170135478 1588475075
+1162995988 2004807033
+471954839 -1711016477
+-1489864838 -234201894
+-1522905997 -615416935
+1784681048 -23542501
+-301172834 1281710657
+-914129206 1469578779
+860306363 -2142161946
+2003079769 1513515658
+860019645 -377747559
+-1537710412 -1004340638
+1858011555 1958785485
+-2090073628 2088041233
+-1743152823 -1834985818
+-1554187755 -2071195964
+154880938 1480516358
+1389086617 -153833755
+769656071 658486083
+1871085236 -677087703
+1326228627 1382753640
+-312579726 -1660028026
+-1625454141 1069125336
+-1842621019 1249709021
+548723623 -364221727
+-1454074221 -514252077
+-619199691 -1199987949
+386715096 2003866029
+1460900456 629671082
+-491197838 -1710499583
+-782336085 -221046436
+580597425 -1865048820
+-22147493 2142806927
+-1022726446 1126348130
+-883665864 -1109746490
+718030111 -1304079524
+873445785 1797728485
+-1675082559 710808323
+-711209622 810970349
+-946709564 -1074016550
+501745052 -174437110
+-853461506 1278193531
+-1167833574 -1526592436
+-1696309353 -2075589163
+338401992 -1257504605
+275594068 -822596319
+999242536 -1171703282
+-1016598839 -1098002598
+-196822648 638411702
+1394615355 -149735669
+1736117649 -1198030136
+-345302905 -353799407
+-961332072 -643290103
+-1554655182 -1370122843
+91096423 -467788206
+1989027986 -1160151654
+1178230807 1252725306
+1921417819 1021467432
+-975808760 -1437133173
+-2053110849 2130928499
+821036220 -344250413
+-1817699116 -1218789614
+-165130913 238559905
+1158168632 -148503747
+1664294133 -1632885542
+1585293071 486124308
+-128818796 2123617217
+-396230529 -948230055
+-1629239500 738024937
+-1347320899 838921593
+-1555754383 -497472902
+9834919 -1355888408
+-1029027916 71669899
+-134624055 721784575
+927927659 1522718455
+-451509772 -2115574683
+-601217980 -1038161836
+-1006941006 640686595
+-1354978883 1731875480
+-2109089535 1984336325
+-919880638 -493208750
+985550668 -392154179
+-402066716 785527725
+1471973786 -1462783464
+37330968 -812766557
+-1262063848 -302392189
+-1821703199 -2051835852
+1999973381 -500052531
+156714510 1544698139
+-1909653336 1456875880
+-501021978 1824058370
+177369766 -825564836
+-88921035 -625243011
+401868010 1379697516
+-257475377 1249924659
+-913005221 1493609879
+-433894999 536266992
+-1187356854 -1185719388
+-908897269 1802405688
+-270621771 -1472155023
+-1085195189 98946139
+1870143814 -1577551266
+-1780015744 1279363053
+1797213469 -140613825
+-1956782003 1761739439
+-1787836579 -1791175392
+-1571708769 686961420
+-1069262609 -755969828
+-661122701 945720877
+732896930 1929073106
+-19743068 -1372609758
+-308222686 -1207044004
+-730829062 1702425172
+1046910859 -1974620079
+790508377 899450954
+1165644810 -2090928574
+1593753003 -466401188
+347408164 120675606
+751627912 -1480555239
+-191959082 1785222313
+-902384838 -671221663
+-716847484 -806133300
+-1040054511 78262496
+-2133225685 -1848912875
+2076613686 2091643484
+1479859582 -966240738
+1700447356 -786214316
+1002649338 -1658452642
+1024317572 -1535090240
+-29500231 -845159950
+291785863 1472974029
+-980083516 -450642089
+735592161 1344895472
+-1729682096 -1684156953
+-1066612778 -269508954
+-361748021 611138422
+383479463 -1579415893
+2085020453 -1759147470
+-1364192686 -1513557070
+1094165077 924018090
+-835269519 540874309
+-613839746 830326537
+1096454430 -1987647408
+-93004364 -812244084
+717626615 2030033837
+-352832468 -674899931
+-1235595093 1788130405
+-2032362643 2117794590
+-583652576 -1206937375
+6406109 -2138491995
+-1276487306 629581540
+-1973223244 -1227127278
+-1220622801 -78929986
+-15576624 1514693867
+-332538617 1863308290
+460051384 -373120653
+303510202 -273479422
+1261329598 682735166
+2041532226 495114334
+-60444024 -940494820
+1988618062 -1876685211
+873193071 1395073548
+-24234558 1466198146
+982244771 -660351316
+709543537 -1407601416
+1080990171 -2007498702
+-1522192566 1701616804
+998253960 1237804386
+-1945755955 -809713336
+850815894 -737582222
+-905096367 -1711766747
+-1088676105 -275089196
+-918929716 -1931527401
+462420608 1843551784
+-2024327693 -2003590788
+-1021158015 -1224420556
+1352741088 620155187
+-423264708 1818265790
+440501617 782737667
+2116405551 584812601
+1550212210 1743301022
+216077868 -1989788904
+346261292 -1613655527
+-1355477728 -1733849750
+-3651972 -143560866
+2026440614 29695779
+821140841 -1459897638
+-1202871271 1204077696
+442769181 -1772937943
+2124887767 1071905313
+-505037219 -277920853
+-1473144261 -1621541699
+-17430203 -1315509782
+-1350718008 512358349
+-1383129596 1843776193
+1211136670 263915430
+1170381969 -620010879
+1836281322 12265610
+-865722035 1726842090
+1689079468 1445723905
+237841352 -2100798948
+-206592155 2147129879
+1280614541 -445087733
+-2019698860 1974133337
+555197726 -1819303446
+-430009452 -147043496
+-1372920972 -921541239
+1822272057 1660686855
+83874911 2126568421
+1062660819 1848783270
+1604349766 -836554724
+-1164181496 1949148336
+-826413967 1087674482
+1694933611 -1148614848
+-1874715204 23277473
+-1157488495 1898489064
+-222847478 -1736602209
+-1776683627 -1856336843
+-2032894900 -1531544984
+1690431029 -295511777
+1026894290 769828833
+-1117919736 615555629
+-708994072 173203089
+-208492946 148519749
+-635763071 -1740248042
+-944049429 960819829
+1613666258 -2140866379
+1455901093 1455097100
+-1323931893 -2145718376
+730676637 803804672
+-366482403 1445956037
+-744150192 -236616183
+-1064705792 -919240873
+-530216601 930603345
+-6677286 920560039
+-826876607 -1795184028
+29756262 675257641
+1888462075 -1101864880
+1063028829 1398260855
+-1848916362 -1989046464
+54473573 1170212968
+228479401 -1498843631
+-1235909447 -2083322471
+867503795 -626858021
+947323747 -33836492
+1000499767 -1545187199
+-828011055 361494476
+643095079 -2009020070
+1087794948 -1134146933
+1792392653 -1388905383
+-788928421 1190794468
+-1519009360 1959295732
+-2093331996 677328056
+1235937303 1549845168
+1034997468 2124887089
+-1051829772 877384058
+83237107 470717584
+-1197089022 298414720
+903203079 -1120708859
+-1067559221 39093767
+-1691298094 -1805462357
+700345890 -1989000673
+508127106 -1903778678
+433113480 -311051560
+1337540965 1771494274
+-1799404492 1754740153
+-82598833 -454239482
+1966066895 -1839718207
+1182981371 616051015
+1987520126 -1876422453
+-690888295 794192659
+776255408 1186620726
+-1217554409 -992741783
+2051955598 -1768679534
+997130767 -1081880719
+713450033 -1726050181
+189071308 1868412276
+-720307716 -1443708015
+1294661891 92301789
+177826450 549634543
+1585889520 -1524518705
+-720369768 -1674004757
+-1971395048 44208900
+1547896535 1391243564
+-590111947 -2096162739
+1014196445 834710341
+-202739979 964053612
+429611959 1892213917
+863933736 -965130393
+1363444748 -634866592
+-1283586269 2074272591
+-1482513773 -2856466
+-1956820655 58514672
+1267082230 291485879
+-1658270286 809110475
+418411938 -1829622970
+-2138819097 1241251645
+1490108541 1297714262
+8205972 316103179
+1457606859 578951705
+538421525 1337668633
+-936756535 479277452
+-977619868 -1033788830
+1430305048 4612505
+712412435 -200454127
+1466363396 -56898843
+1005159701 771714320
+2131601322 -1555754960
+1934143242 -1071567822
+1988815925 -243821402
+894110595 -1596838136
+-2132445629 -1582342245
+1832046505 88062696
+-162167091 -1992247652
+1236675835 -472276573
+325821727 533937915
+-565932949 -989321512
+-1134135939 -1021403438
+-626834675 -1066068789
+1026617764 -102833931
+-1555658139 -844992257
+1428946992 822070185
+-1868932519 579303359
+139378757 333653273
+-196840005 -982031699
+-54976294 -423475191
+1456842101 -1377252943
+858996244 -1116419325
+-280241242 -1249402267
+1241080381 42945970
+309941080 750799232
+-1388378235 -965319732
+-377516701 1374151470
+308857974 34547031
+341517460 -247549682
+-37468079 1496343751
+2008798482 536618975
+-1185572060 -1434236650
+215333821 492471454
+-1587709118 -2103324434
+1754444908 -771104335
+150698196 1552011737
+516629208 890732784
+-1507175963 509305011
+1791090830 -618014926
+-1858375390 -1920135874
+2068080147 -1095301812
+-579979919 1104550093
+-875819275 -1479367107
+-571472732 -1993408237
+-457661836 -163353327
+-1215721731 -36077553
+973864726 431071226
+1364700728 -2105595980
+-1161796562 766979252
+477826639 -2054015191
+1768378820 -1337518751
+1069143058 -1789337075
+-1907765037 -1700288130
+1052023785 -1944318406
+411200724 -643243679
+-776626487 716885624
+-1993253471 -1896013655
+1815093261 1756420250
+1635002614 1528416977
+969194159 -1449158374
+22187352 636375191
+-1669150889 823767418
+-1311148305 1742406572
+-802090203 -493867244
+350358820 672726918
+455677928 -1778380549
+42091110 2069019870
+-781661526 -435034960
+1152928899 1986924011
+-463570130 1423117873
+-1805972852 -101052982
+2137211080 -22677589
+1232866506 264934227
+-1363031761 1776505269
+-321854901 -1514071908
+1783378552 1703785505
+1520803510 1062439231
+13170923 -866543308
+-1229115283 1037903373
+-1823105070 -1434569969
+626761704 752143225
+-1370641437 1018911709
+1791842242 1340658764
+-43007648 -1749646007
+1602755619 795508587
+-2005493542 -779957148
+820497719 1044258698
+489314902 -406736046
+1346986128 921783322
+-1523414731 1772158573
+-143120485 -2136983365
+-1382353658 1790593522
+-1008786020 189159613
+-1939350651 -1181881727
+-576700010 1296196249
+503641088 1010550535
+-1961597270 1256045163
+646241212 -545025776
+-72949842 -1626486285
+-310215094 1449136804
+608760756 1227433282
+218339275 137276906
+-1526858379 1022625057
+-117967041 1637909329
+-762392623 1943279133
+-86245234 -1071177788
+-1302340552 368356363
+-823012004 -1455289476
+-670493822 -371836782
+754459898 273695955
+278681123 -1366187482
+1714351293 1370727022
+1542597494 1488204102
+692338923 -1993401849
+430176723 484298867
+-1230247171 -1004907745
+2016090989 1690255956
+227254335 1485803976
+-65270466 -1959248835
+769230183 -1589459590
+-2124454545 -2031994877
+636298996 -1100594939
+1633447338 -474026713
+1412282089 -1997966700
+-790467178 -1951134541
+200503929 175995425
+-1605150012 470843407
+639936346 2062279558
+-1063727459 -1746905340
+2063276251 -1641554916
+296879360 1479724323
+-889306724 -1542240325
+914090080 -1080382313
+1562085245 1695159201
+-1266494565 928547605
+-668058017 -2113338288
+-2079131114 1871077499
+1232366794 -1647816833
+-424496799 466932683
+-820706979 63916064
+1454195986 1594204998
+-2044681174 -936438008
+1517317370 1297618796
+-646243679 1453112356
+-293235800 359296295
+-1723450087 205633894
+982632320 963476565
+912281077 218654951
+1114410224 -1679211068
+-1924857707 -1359036097
+1017382101 1823970754
+958480334 -1476635306
+-1099323130 -1416314067
+-1065116292 -1673238363
+201268902 -1168268769
+-168034875 -342860508
+-217222975 -36224526
+-1051821424 -1616531133
+-992985782 755519262
+368164729 304875289
+976483827 1217253174
+-1074540321 58796520
+822107687 661330673
+-1573179133 497506665
+-1292967267 -477273705
+1553475725 -900796372
+-283021984 -510662248
+-231826540 1800883537
+1841517407 46659228
+-184680990 97386543
+-1599170238 470474154
+1308761197 -443896316
+-1182975938 2090414853
+-458205928 -1327313198
+1231108903 -947758205
+-1023329596 -819169166
+-631567711 1655925533
+-477543861 663037756
+-1191878739 -2147158062
+821729956 -1367916671
+-793312373 1148954890
+-1055696381 1196374867
+602830092 -644201584
+-961410310 -1981005544
+-1250172097 1000818275
+-1835075477 1913817645
+-729796102 639889876
+761129267 -500686345
+-1313387650 -1342732000
+-852739224 -1481299460
+-1836897398 554486809
+821394742 318284950
+1731314116 -669431676
+-424134970 -1261632762
+-1386579452 -1907441771
+1816212486 -1282834744
+2026469820 -577377844
+-589842515 -498658260
+-747084952 1253396129
+858841206 996604397
+985700969 844906818
+798233443 421686394
+1025704262 1231955193
+1950762054 1917964210
+863992813 -1094902836
+-1243455768 1184079918
+-1428246203 7034049
+-714654138 -677478699
+1918276095 345899327
+1057543314 -1201551334
+456513948 -171028506
+728273569 1719443751
+1345683611 1974060367
+448265604 -216489575
+-127639941 -2050600016
+-1956493851 -2025398196
+332349292 -968543411
+-1737492362 1520400314
+827500054 -618477395
+1622772658 676485668
+904097714 1491518385
+-1971030180 2124145333
+828730935 1326392711
+2006508697 1824537480
+1037306716 980377967
+1153696505 520465604
+1154180181 538576538
+-1236983779 -677262951
+-1597479555 -1649373698
+-1892223772 660627509
+1449746283 1718120268
+203355134 186316314
+-526469429 1109734802
+1718649134 1519973104
+1646265212 -731456343
+997410676 -279620309
+1071501521 -1337550554
+-432691173 -2032740342
+-1494798173 1933261885
+-221100539 874193736
+-539893001 1123872794
+-134895899 205211831
+1679747560 -1859990975
+1176119736 743188794
+542184426 842881767
+-628831344 -1215566848
+-1451957856 -374708225
+-390658406 -1870444787
+19424639 -809914603
+1865154088 1642469460
+1871836763 1397771756
+-878347560 945393838
+-531633997 729496863
+1671263505 -1495269473
+2061171832 972149035
+1795756363 -2085070669
+1769381123 1490212861
+1586625604 693963522
+-1968776125 -1455656583
+-1754161794 -86888959
+1031834786 1848911603
+1503628278 -1787621095
+640313277 333996578
+1987997926 1369781349
+-1599853918 -1985800832
+-1584778494 -358825552
+-1511644703 -1135979423
+1479891288 1917870476
+-1518773302 2072187372
+-2035019098 296346093
+-1496486393 -1924503403
+341401970 1359216883
+-783078314 -193406064
+-2091576148 -1482899211
+415498065 -467008744
+-608365113 -1622559005
+-517395838 331136635
+1338607351 222914194
+776586248 87193897
+885403164 12464292
+-1261303609 -372536027
+-1418384569 2077333596
+2099984118 511413535
+665593089 278523947
+678051045 -356099825
+-818113146 -787617661
+1675455646 -1584218761
+16773991 -1525631247
+-841634679 961939515
+-243223141 320805881
+-87035707 866074791
+1129840849 1086417255
+-583799097 -1390505412
+1212707737 634335214
+-1930630822 898374218
+161252443 1735514524
+1996982893 -1113772724
+-1303756740 1948897889
+132504557 -467710519
+-2102360772 -1675990368
+-996172839 -599750341
+-1120364537 807126335
+310375786 1850509524
+1949536925 -531990028
+-2129153143 1942598528
+1343598897 -1667863643
+-1927179279 -472844684
+-1725272478 -1469089460
+539648497 -1765061504
+1258426414 220415617
+-1521299267 1190902152
+-1193629526 -423103952
+-1668550183 -1887163601
+-354006595 -462389207
+714936486 -1106507250
+-464020582 -1850382334
+303409648 1090464668
+-1178734600 -914934179
+2088659494 1072100805
+153274532 1391637893
+-1272507023 -1060343865
+-600091598 79526001
+2146542048 1772156170
+-1789284066 517286774
+-1836977698 -168631693
+-1262088447 -939271476
+831369293 585257125
+1588202686 1692826532
+332224884 2083510740
+1451805126 -2145861115
+1532674546 -1626600620
+-1462375683 -584551064
+1612272271 -1845244103
+-838151852 2053915682
+404324421 -298785136
+-1889919987 -1003452159
+223033422 1995784743
+1115106637 1331254312
+-143008703 -278618066
+-785863188 -535380701
+910112243 -1691841121
+-1270224666 1435664725
+-170304835 614496505
+1616607465 -1517401441
+-2091554841 -1078651938
+406002547 1860306745
+-506311041 1316543376
+-37477349 1712987406
+-990017956 -1163566346
+-923171310 1086996363
+-1001792112 1362720366
+-2129691758 -1212617380
+-2141890401 -1238201375
+1876019375 1718932253
+-1113597850 -63321606
+-1474255843 -960819931
+36475851 -1976271947
+1543586716 759584812
+-1884103473 419678798
+107752236 1558972736
+-908744628 -510975628
+-482036525 103580720
+1628718086 1492673314
+-970578231 -929212808
+-1705822002 534648036
+1430319158 -307633232
+140045275 -715348749
+30954748 -521737976
+-178916544 1912826569
+-1992637567 -1355060916
+-432458868 103187846
+-1481090804 1050998469
+989844790 860499138
+820402779 861021722
+119514388 1677765132
+680561904 1054630030
+1367063823 -1649767934
+-2023312671 -1751915835
+326481913 -1566071304
+-1875596855 522108288
+611234585 -1398904530
+-1858772770 960322271
+1875599396 479977381
+2020424 -2074317655
+917558066 -1493996514
+424601159 -205266748
+60884880 857289738
+-1985505261 1994786071
+-892074405 -909674123
+-536382303 -972169942
+2048683054 -964178514
+-2141194154 -46590453
+637457781 1180384202
+1377276599 355282697
+947566354 1723539104
+1426866160 391818371
+1810199337 559704094
+-579572965 -1435015124
+-824726528 -1985922330
+-1625242736 -1751528626
+-2004648352 1833259324
+863376739 300774060
+-754979055 1113602842
+-1713420825 1643652221
+-1146136931 -495770468
+1809345561 1309743545
+-963627726 -396729827
+-1384593017 -306692175
+-345892394 -194239968
+1723065309 1101157358
+313665750 -1219286161
+1350779036 1948075657
+764126248 -1745794327
+370709209 -536429293
+1362995818 1706625574
+1660285016 -178702125
+1644913656 -1428929743
+-882024238 -58816499
+-849570530 627926815
+220316439 -1517633966
+574950379 385023551
+-1029077225 -42107226
+1892798791 1172841615
+1863484812 -590977580
+912661395 58809064
+1497662911 1142661545
+306471860 935411158
+-513392279 1154360584
+831912085 1035525190
+-2127366378 -1701286970
+-1566910987 -1057962070
+-1221847074 -1596299558
+443661501 1891565764
+-1460057088 1310955783
+-1559447398 971641214
+-744436639 -571205249
+1437216238 -1265707744
+-1206696367 1376013463
+-1609236218 185447955
+-641110752 654316346
+1044337644 1061596855
+2046103843 1955928340
+617991101 473926202
+-528894517 2007647665
+350929180 -1187782896
+-858211860 -904798503
+-958034527 268772020
+-1853158021 1366912605
+-1340233642 -207668809
+-28817520 403094898
+1744155697 1129727232
+306246599 1478185861
+1538217631 1526689793
+290367101 1515457114
+-799062890 505104845
+2114538235 195137895
+-771384985 -1821238905
+1892269941 1404119813
+-1781697394 134874635
+2076879784 1695141109
+-699476789 1516236063
+-713510433 596690809
+-1381339957 -728781563
+134618028 -1637274540
+-1578021192 -1116331413
+1998734057 -525652091
+1385267652 2087712148
+-1995735445 1759289086
+1545691007 309706537
+1672352508 1006864383
+-2052763777 1934975298
+1874589843 541882191
+1331844124 249588503
+263789656 -1215597983
+-1041840070 -59921450
+-1527064884 2089823732
+-339842304 -1398817221
+-1041175051 376720858
+-1009936419 -1170396945
+-1347733006 -1025146390
+-1734973993 422343334
+1678985426 -115014175
+-92009028 1778872497
+1931431030 1637851413
+-247986544 845189673
+-1256874532 1418195614
+1128873267 -1426444905
+224761154 -848105187
+1072515439 1844575733
+10893431 875395218
+888971134 -1664099386
+783980232 1011391276
+-1690996074 -1518460808
+-2003502997 91150434
+-1641941069 -315301188
+478878403 -2042408833
+11164780 1087544093
+1826428317 2098930300
+-607498441 1883685246
+-289368454 -1708579854
+1559248535 -1419527053
+1555529346 -1614280384
+1161637094 -768237464
+-389653563 1696682668
+669608500 631135195
+1205295011 1662545324
+295657912 1601717223
+-1615745989 2071950740
+939276460 -1107566207
+803092924 -163835388
+696389734 -861260367
+585542107 606346713
+749756424 -560857537
+-62309014 -398051937
+101349438 -1693600929
+-1238684153 -1677467906
+-453942010 998387896
+-939630352 2022277732
+53311279 -869568285
+-1382048502 1146162103
+-1567525213 -1286266131
+-1016130868 -555839663
+1805773968 1374047164
+1159591892 -1788202078
+1588384834 1618139508
+-1478080232 -1468630865
+-1137329039 976013066
+-340832450 -1220719643
+1218884879 1543437605
+-1643371903 -1421339639
+-756147379 -1229781470
+-799772074 1112356671
+1066822501 -497119370
+1630082355 37322250
+1962175644 -1996319614
+-970896339 -64759761
+-1796272259 1665728382
+-8922630 -154998583
+-1019524984 499295761
+2028301550 -1828929100
+642730108 -389900899
+1631928796 -979927891
+-1662911749 128561804
+571465668 1263440374
+1898039514 -1176657422
+434319167 1348394700
+412473183 964522492
+309449125 513356268
+-1707340080 796429141
+557848397 1998581070
+-1677766075 -557551876
+811403247 -376071897
+-1979893004 1461569305
+1026828642 1323380332
+796786173 681623968
+2057511885 1679687353
+523844047 -149052726
+-1171244049 -1119366199
+-792298578 -654575050
+1195831315 1122182707
+-1862269695 -62830287
+924540563 -719462592
+1008822980 1335681981
+2057540558 -2074456950
+215762955 -1041691562
+928742920 -251446061
+-1778447133 746043902
+159848384 -459371840
+1904064505 -230431719
+-502112543 312274612
+-1994085824 1286902258
+1458240000 163755941
+1656785615 -1693135778
+-47627873 -1701520090
+110099783 -1286195231
+-2092204471 -376406976
+1601812805 232692259
+-1790953771 -1910263735
+-1207257340 1631556996
+-1248509882 -1643630936
+-1615143250 -1701390720
+240727132 -60114505
+724288861 -1761324627
+2037015861 986115110
+1445477082 2014141186
+828610116 1480458354
+1302640390 -1972902725
+1209264479 316510425
+-341518738 858740987
+-871054539 1917524857
+-1081753713 -1526035427
+-826055822 1205284267
+2082846466 1550704974
+-132291584 -1665884927
+1369154955 582973324
+316616976 -1849441125
+-1484710001 -1406743147
+-1055172780 -1026127841
+-121480319 -381554132
+-879295863 -265587108
+-1844450220 -143366478
+1537590270 209567536
+272335342 1968377033
+194341726 102820485
+733402725 -1954997516
+480104542 738121373
+-415267211 -1904756787
+1148841294 732736847
+221619744 -472191095
+71167893 1131390103
+1285801647 -1392064918
+-1762306092 -296047956
+2021876179 -1409582695
+814383494 1523404779
+-516123001 -273218429
+-754171134 -2051509912
+-1732822543 -370555884
+1808291670 2055055693
+-1142690227 1632085850
+1558887995 434364115
+2076422864 -1621212738
+274111994 -774953580
+23664446 -164730482
+-1244813448 1779693375
+-703396104 110300429
+1471473070 -101910497
+2076083442 2083788987
+-69751156 -348133239
+1368413417 262710636
+397388636 -230017420
+-272206409 -840155646
+1749334667 1613183640
+1862131685 -1138792972
+265233718 1162253656
+-831993894 -360966171
+-773977552 -577472990
+2003540241 2087006683
+-1243021596 -207684144
+1260064681 -777270968
+1043315838 94403863
+-1998185193 -1522008321
+398911315 -1121091658
+914890938 -1771114243
+-1786498517 441407784
+767249461 -1995704925
+-297452255 1131762421
+-1679396897 -999655602
+-1441126076 215394842
+2038544038 -114066360
+619327586 681132070
+2059266360 1689836122
+556324384 -1556347650
+1969331411 416082718
+69097245 290223056
+-626068050 -66445703
+1332397989 1115748147
+1378161974 -2134834168
+-1080188222 235457749
+-1734685660 1514367714
+1316236875 -1919725201
+-1083653226 -676075894
+1415215296 -1648030554
+1609838182 1978019461
+1343782175 1042821820
+1022617934 -354833373
+-197521851 1343046145
+-1751915511 773541859
+197227752 -951329200
+607876947 -1357296476
+1547412558 -1526071278
+-705128259 -1217847262
+-185063662 428178923
+1902562323 579776480
+2008098170 1069559888
+1169673611 -7850217
+529121091 -1379478256
+2007990520 -857391067
+-54490559 -85241824
+206970603 -422100818
+584846588 401423204
+2020209364 1791700532
+1266480560 1068823683
+1262386376 -1993240175
+-1033229706 -1513550593
+-150831522 -1109514699
+1845977082 -1265927692
+1177936784 233037454
+1349214476 1629196547
+666814758 214142334
+-295296220 -1854550243
+-231532752 -515826633
+22544247 853002290
+527392285 1048298548
+-80909088 -1590703063
+-275320312 1746969452
+934548822 -1338726059
+1989518232 -1024988267
+76546217 2063396435
+1908077577 1288281562
+1545728491 -323502923
+-837349083 985299877
+-966881628 1553648309
+261064724 -33110376
+-339420936 -1400318519
+1453863131 639932114
+-1315159855 482063011
+217134958 845322831
+-600213119 752398202
+873558595 1983256457
+1809023566 -496661396
+1049445624 -575195565
+-2062530886 1569593787
+-1434473508 -1891326037
+289355259 -1238584254
+-1045837043 -286901402
+457986420 1738860795
+-672617881 395811744
+624904732 538191375
+-1056845338 -509452428
+1145559772 -707784832
+-1148711770 612774921
+-1862068498 2050843670
+-2097107605 1431218654
+-670937589 -2112641169
+-1217476749 -1944864181
+-37902244 505843240
+-198199352 333669486
+-52989786 1584958754
+2020188671 918221611
+2062845179 1814128560
+-45324513 1285709354
+135574095 -1475157307
+1373935219 -2135744589
+-1544103517 274392838
+588840028 1474430586
+1484972732 1980617771
+-547153008 1967040307
+1473718745 875586722
+-1146788198 -1986420035
+-2024287892 518491797
+1440232276 -1027956742
+570323392 -1220843734
+328580136 1110345334
+-2146180643 -1051501045
+1422285748 -839714768
+1768040711 198733705
+292093995 1385339692
+-134304137 -1123621309
+752450189 -1638360901
+509524498 1261658694
+-731373319 -228977119
+2120806224 -1966692049
+-2088894073 1033531068
+6358902 -1903895093
+1239903757 251490999
+-667517411 1184596580
+-12433640 18985894
+-379541875 334469548
+-668172304 1243014393
+-669238105 -264022505
+337745396 409745752
+-500977442 1375718934
+1606090505 -911276712
+1717875096 -1996527470
+388651105 -873373368
+24982473 979493466
+-1929160312 -125211763
+601225073 33516553
+-67460959 -982039231
+-1578771177 510207698
+2110508103 -1962183549
+1557233528 698225024
+-193394207 1549254026
+-992758536 -922372707
+1166070492 -1687299118
+102042492 455982386
+-1684906493 -637331383
+-1180905146 966490788
+-885174051 -1505911664
+284480850 1690583335
+-1281290978 -20354719
+2131950768 -1038014185
+785160154 584901184
+-767854736 -890712677
+-1435886859 1113319649
+422397833 1843942040
+-366046297 -292170493
+-1356600247 -1701737611
+191006115 -1922845315
+1411394499 347592544
+-587473134 -393149863
+1861081416 1466335255
+-1469026255 -2102448958
+307089368 -1750507357
+-1111394393 2001165990
+1426242398 -1512738915
+-1827679226 -1058212133
+660574789 -1282629171
+423322840 -121531002
+1587155472 -1998170514
+412941724 -345468118
+-1791405433 1693491349
+-1842132488 676319444
+1621844412 427451974
+2108850961 1693536240
+794368708 965494321
+-664790973 1952271557
+-1453262268 -2004418266
+7094754 977235112
+417891382 -1362888657
+-1448070274 -382351124
+1558460777 1906878488
+1713865149 -1558780296
+1387953574 -1455682766
+-894856045 -2020551891
+-987680727 1863471188
+385559984 2036703154
+-363026871 -91030278
+143956770 2073311025
+-128869451 542855725
+-1237302792 -553234261
+-1775041652 -578514452
+1167006954 -203458251
+-740529373 1767504086
+-297906187 514795552
+1925292390 97898984
+-1908351635 -41693614
+-1695924724 898061467
+-1992885001 -595973634
+-334184195 -809452586
+-600682243 199128731
+1197390412 51015591
+-1391540413 -1137881075
+-2030326800 -1721441503
+-221348039 2128206481
+959726504 72267020
+1951419492 1658756549
+1103925825 56196800
+-847225882 -1344318610
+501757262 2073923127
+-1320838941 -1869534794
+162698109 -847367288
+-787464570 -1617514942
+-1523142877 -776950999
+547001309 -1835110895
+1680691080 -331801379
+1753062184 -1757219243
+1849014151 1000636112
+-1689309305 1826108793
+-490149914 -709205556
+-1989168937 1078416863
+1462136354 -354132300
+1467714451 1087245580
+294017961 -1594183619
+-1492711770 -1215358090
+657288189 366388792
+952835661 1202118682
+1890190296 586215940
+1865820048 1199481948
+30729903 489169620
+1022432632 1776170616
+-1911483774 -1178416874
+1689136809 -1747864380
+512882191 -1778598887
+688793938 -1808516519
+-166295368 556208073
+1237874284 413918902
+1817226856 1331810540
+-1807680802 1474951890
+-1154895347 1691747314
+1810255635 -1090276492
+65655649 1244393176
+-1137292767 -2021448989
+1084665581 -779636174
+-1445561957 235323821
+1441417620 -1161056565
+-1219457551 -1976809755
+647153536 -1896523119
+-1500156183 807337217
+2079322634 -1485751794
+-1758290841 -1094054131
+-1797842806 -1168976753
+2036874985 -892794424
+1083894669 399942207
+-146747563 -1611845420
+873594539 -1245847838
+-1283733797 1468021665
+-1345026501 645536175
+-416948886 336302640
+1723612150 1558951831
+801728087 488384055
+743106188 1271761160
+-2008542442 849884832
+568839984 1031559659
+559054257 -537705034
+-1107257379 -1707004904
+1397615021 -634536581
+-722130645 811500230
+2114967852 -909968673
+7884546 -1388830552
+1654018075 -703232484
+-255615075 482955774
+-1064545248 766094656
+580604228 -1348782321
+-980760715 -962035814
+780672819 -1287850156
+1764934004 -899874938
+-233880522 -1849226472
+1363596321 156982081
+872147850 1833254981
+947597760 -1038800351
+1826223098 1651793641
+279916195 2024948120
+1799113734 -1836666717
+1324589707 -2095416741
+1607187101 74064426
+-139365442 677261620
+-2106116556 -1208286498
+83451027 -1906583380
+802466876 106189169
+676679096 641206879
+118373547 -1058743613
+1398171815 -1751505250
+378865518 143666502
+1442920274 -248365618
+-1278189526 -2052858312
+1268371237 1577850155
+2075203090 2135245574
+-1256244935 -8805340
+829483173 620763421
+-2002531889 -2062787564
+1655783015 -1428197984
+-1262809202 -575043592
+-1648199375 1919579913
+252689058 1698172866
+-87754904 -1929123209
+-1666500171 -1846417920
+-503220869 1347815457
+-346575284 295587277
+-373616048 666490389
+-1701744612 1902447421
+1003404979 -1307655014
+-16413036 -764757073
+544675123 498025342
+1639448818 -108019053
+1964052581 1889357646
+-27456852 -2141695502
+-1334284980 -1137939603
+974043404 -1870305909
+1962111281 1057925572
+-882453261 -1420415907
+398882840 1949836191
+1237182625 231434391
+-315220317 2090347601
+1321793626 -382668680
+1974468257 76941763
+-242547083 -1759507202
+-2003975877 -810367740
+-961963905 -1320165640
+1865864192 -2115091281
+-1086170025 -892938729
+-966446615 1229235470
+-1531364389 -1833346810
+-902144908 738774210
+-1684690508 66409627
+-1515330770 924468736
+662744555 1071515584
+-337209869 -1099379226
+-1804314403 -590284080
+-1414161461 1440982479
+-380540642 225485452
+1097246317 -1296468011
+-732024665 1686202840
+-173156130 -94012208
+832062615 -1642903986
+-251241099 -2135151267
+-634929926 2144031349
+681720015 -916543248
+1630488868 75357799
+1205818495 -850207452
+2071926130 -1494411929
+1123894890 1509871504
+-655034720 1465289988
+1132386141 1664803016
+-215263658 1699115777
+-1032950192 1378788948
+1577048079 720876832
+1029249852 1962927256
+2063005014 -641840007
+-439353458 -535085547
+706110447 1772414632
+1315762232 914184317
+1233803431 -1170683896
+860352125 -328297357
+1331150788 -2117141261
+1023996822 462665553
+786719970 297972847
+971105040 1994974776
+-599497204 208067316
+-1433703219 -1439387476
+-1996301658 457746946
+183678765 646649311
+922366335 183343091
+-288444972 1644330255
+-1938007437 2097391170
+245527266 -293084582
+1494023346 332142190
+-817728568 -1792564494
+1530118160 1298786945
+-248088653 1048297235
+-1966832772 1019082888
+-1979261227 -131361604
+-1748475311 557752643
+506786603 620825740
+-1800368519 1224859817
+910748066 861131622
+331717046 1949982519
+407863676 -1389787459
+1774968736 -126330559
+1290165965 1081148743
+-816631922 1067926216
+-647034047 -212980274
+1196262875 -1367255070
+1581023223 380930578
+1665960323 -412290684
+989823270 -2028957889
+2075361726 1870461516
+1479065089 -2096587909
+-966093467 235908812
+1739978769 -2082004303
+-1491442581 -1647344260
+-457448643 456416066
+1259170340 -1070337445
+249773849 -520051535
+-2128839536 -171107106
+1043168836 -1409491312
+-77561657 866679857
+-878787492 206250280
+573480130 -11694076
+1344233024 346971738
+-228747916 413160053
+-2089554345 1118452210
+1449999657 1931128986
+1175232695 1319529602
+-2027596840 1764279527
+-187065632 1424276509
+-1799815943 -2104363806
+-1469657762 -1271131574
+-1533039908 -1935376922
+1031314238 490701097
+-1938213425 94989764
+-1399932287 -412327014
+-268720713 -1061983987
+-1248891158 986660964
+217530983 -1873600264
+-352877310 1105037088
+-1675584357 1628662021
+1083951621 -1223128286
+1616167713 1853767546
+611560253 735714969
+-1881624179 -741053915
+683803610 13447364
+1649361314 -628157877
+1731021514 13268989
+-1360479210 -1842850275
+-593511606 -1412336896
+405946404 -383456538
+-577083335 -581696112
+-1503226221 1276160996
+-855026298 141858174
+-459901395 -189140122
+1153934931 -1456233554
+-138644116 794804472
+-1742454048 -270798709
+1029360096 -671968123
+478157929 -1287549575
+-982742999 1710328781
+-1695681837 532547034
+415281473 -187450118
+-247800781 -99273432
+1802467499 636669960
+-1193551453 -1909138793
+-1086149603 30282867
+-2124934757 1822366363
+748452472 -1969346699
+380714352 -317921436
+-1098246953 -1860268665
+-127784796 53852358
+-1657858836 1474978590
+1645103705 1659709249
+2083993740 -860286786
+996916726 -1239595814
+-1678601372 -1998370038
+1723526040 -910910723
+-1579385840 2124038213
+-381738695 1578170094
+218337059 -1642601169
+-1842129486 -721381629
+-665877872 828895506
+-1762148221 -508376991
+-1124109584 2143080809
+-1634020562 405803249
+803328144 -1217215535
+-445578200 79346011
+-446596115 381134370
+-1137279678 -904543765
+1750474984 699821831
+547634229 -2092866077
+2024839644 -1293505427
+1571388545 -737993767
+2053292949 -556900151
+-144782914 1136895417
+609430856 1093647744
+-1270439004 185844945
+1471956380 1430288778
+422968181 -2103677160
+599001027 -1313234103
+-1676826772 -2003980821
+943811451 632340577
+1032516499 -577670048
+764236900 -1367277833
+-1995645762 -734888304
+887817713 1229085318
+-1027357052 -1041791513
+-1774817923 659969100
+-197185778 1127710075
+-504432557 -333192681
+1898862671 84295571
+-1586718770 1990612799
+-1779462554 -1309369223
+1070017570 888718728
+-2091001420 888268506
+623576352 -1887961815
+1991924467 1688803005
+-1180651224 -1271816267
+-1713183195 -1601791340
+-1599908314 1016863101
+1054128205 -1301028878
+1666802832 1222797619
+842363403 1021760438
+-1267978575 220506814
+-1216095286 -1932531596
+-1276217397 768932740
+-203329470 1371077258
+1092458754 959250687
+19772977 1149380738
+1597398729 -1025661203
+2044394824 1807214539
+-2116433237 -1288649261
+1628395175 1355005932
+1005700651 -1544020202
+1343102744 -237478170
+1081826688 182825343
+-983323957 -944787991
+456624842 453087996
+88676072 74575322
+-55403605 -1251330065
+-1931568331 6741843
+713501127 876521749
+1772974682 563609627
+473506022 910020706
+647422328 -1531886959
+1349425587 -1920596099
+-464737229 99105924
+713478169 -1947734849
+-595798826 -1700571502
+-2133203171 -112934589
+10317334 1229973238
+-799796032 -279644397
+875830863 -366695820
+1375447671 -767710911
+2120620923 -1591251105
+2145245596 154302830
+794157248 1055405001
+-729335264 -1965909173
+-196077360 1640227264
+1174780554 -871595371
+-612993125 2110155291
+762280395 1661814361
+1389048981 -758203979
+-286632831 -1546486463
+-506194413 1803417504
+940985 -2126627121
+1140898179 1075586201
+692056079 -1240468349
+1955837542 -1615446247
+-17982334 -1834646786
+-318108605 2026611158
+45451875 -488269653
+-1725926793 1782534491
+1141357235 1972118323
+-1602562238 -720616594
+-624132181 1354114895
+357401210 -417295768
+-1260898945 -1932315395
+554684988 610543519
+-60700337 906595416
+-564621652 1142251857
+-1606153565 1520426069
+-1431973162 -2109677196
+-1073807066 -172499980
+-564231229 938525129
+1047016902 1987807554
+-1371175594 2055583211
+-1489452398 120594692
+-1181859484 -2123029698
+1515520843 1032688699
+-29759725 755366937
+-308617859 -754801603
+179417326 1993702209
+-1406827468 -1307033802
+2129641867 1826858596
+-429303459 2139666179
+-151562282 -1184451554
+-469750765 -1539503626
+801660530 1834372031
+967777847 -535753864
+1156404490 -640057322
+-1389863100 -216986920
+1341381167 2011074171
+-1337240198 -1518639439
+301771206 2028316399
+-941681295 1197042194
+-1766072316 -1383644376
+87037164 -1896289037
+-916402800 -102781072
+2088914860 1439162874
+1228758155 -911932166
+19057802 574202859
+1625524247 334752836
+-630585184 1433945052
+-1836140007 -456301689
+-829903097 588801994
+372955710 -2097652480
+-1966495143 1512470993
+-1917848945 1997039017
+1001714483 -2420892
+203409528 1614232469
+1728034875 -711942502
+-454889691 2007255678
+-2057921410 102104820
+604823542 947505393
+107937894 -1311308595
+-1051310566 1136484133
+1055846287 2024353120
+876255201 1075755165
+307045736 -1328653374
+1473221439 -611977625
+-815028204 2114711723
+506115621 -1424273523
+-1850638749 -1101409096
+1936624065 -1750987845
+-1211215613 -1058155564
+1011844048 340033048
+-315527896 1450386593
+-385703164 285570623
+1436362734 779856372
+-379465727 40861571
+-1893176180 -874895892
+63767266 2129677503
+375426782 1907866972
+-984192007 -737840896
+640402385 -548003963
+191784774 -1704189269
+-726733199 1794355097
+-1788938507 696950593
+299174624 -471075003
+-619210956 1747791559
+-952030786 959687802
+482311636 1417078137
+-847114999 675893759
+-1858274193 1967166332
+1318382700 755247617
+827271745 -1773627840
+1363877739 -2123512965
+-1507687268 1939481254
+-1145934838 1824086636
+-242330114 -895397988
+-1136124474 342749655
+-63637694 -1034523625
+1387274501 2016338217
+-739983218 1899696375
+-805774384 833985660
+188105549 409523915
+1573837704 1873125521
+1344127605 -693100874
+-649832353 1849920799
+1785702808 -244659550
+-960204979 -253748913
+61849032 -1295219834
+587467499 238125070
+450435300 -243563944
+231941065 370626241
+-2115856311 -367335942
+-2130760286 2007183567
+2106350294 -1254299973
+889926378 -1127892969
+-1144629568 763251367
+-889491152 1273560644
+-551904735 -1337679331
+1580882971 -1142476145
+-158994235 -621083380
+-356900395 -1109813487
+1315015229 -772899166
+407289803 659566302
+-1768858563 -1722922934
+-29059078 1288626032
+342113059 2054918387
+-573612683 -1613933768
+1556476351 911128074
+229226246 1816391060
+-1858784951 -1592897790
+-1397074179 -1178133041
+-1651354114 1697135027
+913745129 -1295980009
+789099760 -1622312903
+1502596087 -624103343
+-1668814561 926898914
+-160644076 590124681
+-1088248906 -2132918578
+762263598 -280118479
+1160178270 1919823471
+-1509094547 -1583733689
+1428130664 757471788
+935059089 1110132768
+-1178225278 252593134
+1578131025 1500567398
+-1449204176 -317832070
+-1287924702 -551626704
+-233164258 1904646740
+-1117758901 1688654763
+79513890 374336304
+508100446 1552024830
+-51592839 1029335411
+536228858 1466647830
+946825627 -1211973481
+-1021325403 708988086
+81196936 1804615972
+-91942740 -1425628724
+-1094026656 -420613183
+1899712418 -1602404756
+776042862 -1937550019
+1982285355 -2124908112
+1133330965 1124621826
+-1860996252 475860925
+-1243811662 1055817212
+1330147329 1767189698
+359086864 -1785134581
+-997821740 1622457940
+1417553312 478434770
+1613933237 987451690
+-689551399 -1147468973
+979005263 1971924218
+-924258232 -561387751
+-2120201858 1780996582
+-420960256 577126757
+2043643284 -546314241
+-739481949 628753672
+-1483153137 -974607882
+2115230204 -1160867211
+1198558659 1774459844
+1492847627 -1109066026
+1890872531 86132223
+-365914130 -1066844104
+729953566 -887536040
+-1774536330 -1510574871
+125131076 1660094048
+198690711 620270362
+1861039919 1588415294
+605013062 -1015012621
+-495303537 568859507
+1213423355 1437609943
+1149356059 130656991
+23331752 -1118391934
+1926742713 -1185453968
+-619786836 -699474658
+-1673579564 -1399148083
+238289678 -819477625
+-566697156 1096063384
+1050036205 -1123795247
+-1796108557 1160112019
+-1855511580 2047849504
+1741330857 -173862421
+-80383272 -1967526641
+546966229 1528227025
+378914366 -956530515
+927531118 1427984049
+-562574958 60492774
+252637362 1610325399
+88589826 98985063
+2064248551 539621792
+2115992428 821315224
+757845564 -1538028904
+-1029340817 1510467271
+-740944738 -1996600665
+-1890183173 -714324653
+932265685 1347550458
+1015388195 -1558412090
+-776426506 -1349395512
+475058379 -1472556013
+1394573370 -1357164447
+1542837809 -2055230429
+269943283 1596256053
+-1731376920 -949940930
+-1482796420 -176597097
+-1950880605 376714963
+1010296369 657306760
+1919609811 -846938099
+-2064183162 -1958178184
+1700488714 -294450180
+2030817864 1725893584
+-124128303 762820596
+-226650398 -482338246
+-1552305940 -1578052003
+375560929 -147180784
+-585538162 -157261952
+172174064 -1272153856
+-2137142583 801813014
+1096506729 -1966717914
+-1129672854 -1063292163
+-1641505117 -530760111
+-1202981350 1019920315
+-421400825 -1581085558
+-1541982088 1922759341
+-2121693814 1268338168
+213743469 -1531472562
+-1080112131 -727113627
+965644748 1048067508
+-1888531665 1407747958
+538566664 -488165544
+1010813995 2034984733
+-303133484 -723451148
+1922975943 1076636418
+-2006942673 -34039634
+714362597 -1804731041
+-96423125 -440925192
+59205196 1342699047
+1616040490 2036559994
+1087750608 382451011
+1567849624 547445623
+-456329022 1615442370
+-1807559070 1974203878
+-1464182453 -1421249166
+572708743 1570777479
+-2029654928 -50662252
+-336870629 388839406
+1503056039 -1078950720
+848576154 803427377
+-2090766407 1092177978
+-174742148 1944603707
+510052787 -743482219
+-1573380919 -993823128
+-414421332 2096871801
+889095791 139604064
+1528082887 -46132678
+-514588614 -56962714
+-1879977920 -2088782444
+-1665983043 -1332950072
+-641715138 475214727
+-1990643125 -1682725615
+178398576 -1455191445
+1710771124 -2044619818
+376487953 -1717078117
+944523688 243246880
+485552323 1435627021
+-500101391 1999805398
+-1155213233 1865957089
+929419208 590885467
+892718648 1013301794
+161969328 -1958383355
+-913001268 -46336689
+-1147069504 -1574183202
+-814560849 273708555
+-1170292834 -1337308272
+-1585299749 660784180
+569405413 1651583294
+1210228764 142695343
+-1762860796 -1903257848
+533022822 208798908
+-1604365352 1390779459
+931500439 2056094432
+1273486819 -532857194
+-1964457656 -724778361
+1691282731 -1778613605
+641514206 -1891030338
+-1592924856 240139631
+-1603829237 1602058188
+-2002323089 -56142752
+-627337087 -1577879687
+853693257 1361354202
+-630052934 -1148676174
+-1801203099 -116103965
+-594080709 406274294
+-1790285068 1964570580
+1426640088 1421513563
+-1159500131 426819182
+1686719592 -1644086275
+1608378668 -438794663
+732351327 -165719915
+-476710324 1799938953
+94133073 1060971350
+-1708393120 -707035298
+1571570531 -1211777012
+-805400066 -210654091
+-374174985 -2071859681
+-58832790 -1849554901
+1929752992 -1949482038
+-86954632 -1383348766
+-1875825232 1544827702
+1651754430 718210139
+936393955 1052268883
+-667581442 199302732
+-1613356843 -1639618003
+-1938160880 1579453274
+-608456153 -929811382
+-1480526624 -853294247
+924516375 2126587688
+-58459465 1656855620
+2047228077 1210834947
+-1328893744 -1450622502
+-1859531721 -1252387906
+667645156 -1143822959
+-655935998 -1701659936
+1756209637 -1496215212
+1921423295 1052220134
+-777510551 -557963566
+-478505464 -2135559457
+1337195832 1076892251
+541049455 1013175176
+-1225041425 25564038
+78236463 -1666023957
+-256070387 -1142126736
+545296512 525516040
+-2043846669 -231328153
+138747388 -1404457978
+-1081402609 -1428796525
+-1307948073 -1942296354
+2139377833 116815962
+-1052950371 638118818
+1493775784 -1228038328
+-1534685028 470710651
+-711456167 2123654348
+-1388530942 -1199528461
+-1103532676 1928285636
+675532944 125679016
+-1754950653 -1145526725
+540444129 464067686
+272017192 -771130451
+-511943470 -2086128338
+-713019533 -1688079945
+-1969690369 -746147695
+-406046246 -1055718723
+669463280 1113591142
+-1689036171 -1211505420
+260294437 841544991
+2132221996 -2098201715
+-162157808 -597464599
+-1536071874 -690429581
+1874223798 -895665888
+-1053747485 1751627253
+2014784253 -968879432
+925975849 1576195290
+1950804346 -2142149815
+-68727343 1806697463
+-1122026937 -153231535
+527747080 -842672580
+-396400242 -1857853461
+-695360664 771372408
+16921046 760555295
+305860930 -1985383748
+-339659265 1212779979
+1840559559 -1348780661
+866865640 13025587
+-634461569 1163519843
+-731474678 -429536876
+579101102 960899000
+-1872247239 -1054116192
+-1025678576 1446862970
+313742810 -1170828216
+-309673129 -993570304
+994375525 1112778353
+-1239047321 393142746
+-763753197 -1382748955
+-1546767055 1934844048
+-1967740915 1079339005
+190044649 -271123181
+-2092351980 2015316437
+-1231384499 -1943144438
+728643350 -1978146341
+1117849561 -1808024720
+381065028 831888701
+-1009754153 196419566
+-267855366 180895366
+-2109081795 1543698145
+-1711504579 -1857323327
+143306202 -1143359559
+-22045462 -709085490
+-360900289 63276327
+87955437 -372617672
+1734434911 -423799670
+391645886 1669559799
+-446055040 156345830
+-1473511162 1690885482
+-1334674676 1872839321
+-1232620262 -244093440
+1244770269 1028650947
+1279109799 -1934032110
+-1048460792 825696771
+-1053892252 1393660400
+-178005610 -1239566198
+-1624918750 -1156838814
+-388906211 463172243
+-181681181 -1737257394
+1858148274 404696396
+1278545710 -669489026
+1687839266 181316511
+666526303 -769672381
+147805343 -1149949958
+378751283 688025256
+1255347664 389618732
+785126758 -855969227
+-651509434 -708509701
+-189480100 166204634
+-145250924 -52121266
+1285992843 -1584966378
+709958172 1951011720
+-336869220 202368349
+-797463822 368773757
+-122526798 -2031369348
+514514980 1904094345
+-1717398504 291655481
+1795198216 1496110237
+-220383665 -289489146
+285952896 1825148657
+-1542637125 -1967670932
+1044848719 -2142740193
+-1184024886 436808821
+-817342675 -936501770
+-1981002140 428359818
+-709396532 946103737
+930226268 -1509366758
+1205446834 -1765559911
+-1896695059 1738991870
+-764159766 -1525580946
+898760325 179895341
+701020587 816492361
+-1454503447 -440757034
+1956892152 632251646
+19822725 -1645563712
+1882464459 1179893895
+1006821398 -1643301214
+-16859163 680951624
+-1419608319 1497674052
+-677983207 -1149808079
+492239127 61111908
+1412593925 -718451050
+1296818461 -591115679
+-1403948408 84175777
+-2077368642 819709889
+787659990 1808329636
+1431352813 -1938079507
+-684241061 182530857
+318050046 32828951
+1200932953 413040027
+685877197 861643791
+721673380 1727497974
+856513539 159079074
+-1581093439 1504659101
+1689900256 1650642708
+1234557688 -753661123
+-2078554120 114077869
+1978888979 1726406244
+-1513244121 1179402799
+945509796 2025323107
+2362554 -1680558744
+-1996389314 1467515850
+-1876480558 1819023951
+930843206 1871947496
+1904513440 267428689
+210936443 -377417734
+-2102059691 975245217
+855231032 19857116
+212944546 -320237247
+125867490 -1141923415
+-1928735484 -1095431690
+1040139193 226209882
+-605258325 1145749905
+-1243238838 -1063448935
+-797096722 -252291661
+-937102777 94925018
+210391150 1050393964
+-1022034767 -125768847
+-1569224452 -1157378782
+1603632140 1432197134
+-536886574 1505237962
+-1916813897 417014274
+430095842 1255189115
+299807091 -911047077
+-1028352194 -1793264140
+923196398 1274928264
+-1311812708 -539157131
+-560181536 -162266045
+1272747189 -44137837
+443725040 -19525017
+1311584789 793516250
+-1253058061 -1891897661
+763818576 1740376222
+-2143605598 -1766350722
+-709396672 -173532781
+-1603418348 1617793174
+-616184730 597147683
+-1654138687 1882512785
+-282366246 378711365
+1537597554 1546728022
+253112236 1014573161
+1426440265 1854577899
+206463599 315453517
+-1471812082 800915331
+-963129960 -760446434
+-1347095605 1513467505
+1112359034 364584360
+-334413773 298772112
+-72938706 1558683013
+-1389598638 1270594866
+165416739 1812669106
+954136667 -97311088
+-1089358471 -1275958061
+-1135133366 513710004
+-1462654016 -443052394
+1076840860 1531929460
+840327299 -1808649344
+-1387699503 -1279961938
+-118350530 -1840459789
+1044618047 1886794014
+-573597563 522965105
+-1980338565 -67649743
+1693200605 609827830
+-364555753 -1953106230
+1544897628 1003146532
+245484014 -2073784500
+1156243362 -1600154106
+935265301 -1826827829
+605221868 2081112018
+2084554047 997559965
+1483612350 -689932830
+-2016623411 -1165027717
+682849191 1215125444
+-2124247728 -276852367
+-1186640637 244401381
+-1221864618 -1702798646
+1424162807 1791324133
+-1616117456 973704044
+-165343552 -939687122
+204652010 -349076745
+974770567 1612951307
+317670252 1475474300
+1401830888 -736854589
+520696051 -368750648
+-2116806871 -1068998051
+-571905091 963323737
+506140428 1331637067
+989630019 -840489950
+-1719808749 1542378647
+-248393798 -1545498223
+1921642336 1546094331
+-1062366155 -343376838
+-777069237 -1997001860
+672646272 631464948
+-1092359344 2102542108
+1764969124 108869182
+1687564213 2078861864
+-178730232 -866681339
+-108656309 91140052
+699742100 367416079
+-707569737 -2013601476
+-41679834 -1857036954
+1528724825 185509960
+-1528097525 77931350
+1460212485 -140693813
+-757897540 1848443640
+145753540 -1582972172
+555779156 -1770806458
+-262579245 2035090522
+-792926723 517174778
+-2018931653 -1244677475
+1076069524 -421483151
+-1847476869 687928119
+-1577108384 1821920159
+-948397555 -357227003
+-822610116 1840443580
+1290107325 1386708758
+891330032 448171422
+985944317 -1902173707
+229880314 1971662304
+692198819 -1263189778
+1791086293 1175235756
+-750370020 -529782180
+-89542075 64759608
+1481090179 -37184802
+-1029552568 -1085105577
+229623907 321057859
+550953931 -149759633
+-192706225 -884757199
+-112637135 -1315868050
+1047790314 -1027250209
+-1890932918 -1363311741
+-1585684338 -1066544480
+1115934048 1424693810
+-659584783 -1324394186
+-1361843042 1395357522
+932614762 -1576242029
+-1528348630 -356882193
+1764986298 1423005294
+-1584772351 1326007849
+1965595766 -488951631
+-260894569 -1496714371
+-814676921 -2118069018
+511106539 1436391945
+-1062273026 -1491196543
+-696504366 -1851181947
+2121655676 1425063809
+-1258437935 -1307962396
+1740704567 2067494904
+1479927955 -642688510
+588111506 1040463063
+-33591037 427196777
+-971606310 763090765
+1553677181 396504672
+1974490910 -845594267
+-1811981108 1003255193
+1374121098 91055868
+1431714021 405549896
+808208515 -678553906
+49304059 -85278066
+-1379485220 1763495191
+2099498130 -1684224410
+332652900 -616576290
+854459344 -2027316420
+-1652416928 478688036
+-354303226 -1994157940
+1188712088 1638827100
+1739905485 2108578525
+1520584881 1528385344
+-1443148836 927204743
+-443313457 31342465
+-715362079 -772554296
+1322429207 1915161360
+1951636557 1322790883
+-1262949507 901374853
+1282930658 -41857242
+-345673431 221140977
+-366412207 -816929699
+-1697901808 137542165
+170715434 -1689807569
+1023833344 475547228
+112075224 1562834344
+-355926631 -674151511
+-2126961555 -1276238424
+-1962422563 1525751321
+599850623 -122969618
+1327495347 -353059204
+1336814386 1613179447
+-1359072570 1423295485
+1772938045 -2045451321
+522048677 196579878
+1117663306 -1183453642
+258563528 2089595704
+179903118 2024660577
+295960658 -1014114139
+1578327919 1436251136
+2108573415 1693496474
+-2093863366 368328980
+-1560807889 1943873611
+1700476934 619207497
+-528821140 -1861713821
+409565452 -1569060526
+902367213 1083494777
+-1591602489 1250285990
+1542307677 -206879919
+548819062 323831281
+185634083 -1574647645
+1368208989 -2117085291
+-143096262 -1062002927
+-1598654285 1980633179
+1693194401 1801285306
+-421616899 1212764657
+2021485014 1102870737
+-353951621 -321948247
+269519482 285477468
+1600915796 -1466256253
+1040268384 -1887351157
+-884290187 -1976311592
+1823088509 378710363
+-298684225 -1926334171
+-1460136406 648162972
+-1471609878 -409455757
+-381164628 -919751154
+1996043523 -236324351
+1555270370 1463505454
+-1797505986 -436342822
+-1761711897 1411654567
+1358775152 -1800675379
+-1705269614 986333227
+1311905309 695384941
+-1966319082 2043345300
+-1775794678 1070434007
+1371848618 2069923762
+-292723956 -1959116396
+-1354559613 -221835004
+-323276438 2025758586
+1808201562 -228438668
+-1937122497 736225246
+-1211737322 1028296543
+396758835 -224230554
+317544277 -488347258
+2076977824 1117368605
+15791802 -1184370222
+-886087232 661696639
+1268045973 -1095087614
+-1921853282 227909546
+164130643 -369417127
+289633751 1333099698
+-1314831603 134644918
+-184808300 -1190751341
+1037800399 -2100965597
+1164945023 -881130503
+1582609082 1355013784
+-1278385010 -1277951720
+-246971724 1723709298
+867692088 2102418957
+678830518 -1156973745
+-1586277565 1575993988
+579011747 1196962077
+345933124 -1777755109
+-701186976 729009179
+1787857520 1691723626
+-1723888638 -835885743
+1509788821 781641742
+-385947706 470785992
+-624524403 1587551160
+-1127795775 -963585295
+1826626907 -1144708677
+-1875517769 670080866
+1686168552 422056588
+-491121379 909244253
+1016558862 -863959363
+1455455860 -2135210417
+1506782081 -144824462
+-1914656294 1936537079
+-1296346152 -453699029
+-532411843 -611479400
+463877254 -1793146930
+729955370 -131708395
+401757548 -1031110099
+286216310 1333409861
+980871870 544929719
+-376911572 613199972
+1971251505 1606992132
+160761679 -1659474990
+-720574924 1269213101
+487470983 1513797684
+1226678875 -338093081
+1731248830 -1787084731
+-1546334708 -1107308694
+1521579228 577031612
+2109856449 -694325339
+1011637317 2025841610
+-327568121 441103412
+-769384597 1580608377
+495380720 2052505197
+-1335106948 -583015152
+1524688777 1446801606
+279917822 -1061921175
+-278352417 615023350
+1836380201 1264790495
+1171223443 -1685474271
+167646363 1620841283
+-267742100 1965327106
+-1388642382 -1672168407
+1658361967 1467407528
+2050275408 1408448667
+639216176 1794311473
+1141977348 481694840
+-487933381 721033937
+939254918 -1872347393
+-1185511013 -1944313275
+-1599748782 549382080
+602325449 -1390886320
+-1599337239 -1505169080
+26176352 1335286419
+-218467907 2046940201
+2108096362 1770082618
+-214663445 -1416908678
+597353990 -1832993466
+951177906 271412404
+618556920 -511350490
+589452625 -566942279
+-226132814 -1593026447
+1732235370 -850393785
+897121378 -68667326
+-1162623460 311193542
+950583585 1875176745
+-519697680 1548134381
+-1838583394 948098480
+1247749060 -1121064943
+-483091140 703897084
+1266012656 -1217159805
+-514250645 1592989421
+1099004659 -1483157803
+-148662833 -212733408
+-956837535 -2029216032
+-454561552 -1280354542
+1278751846 -1948682596
+4156040 1458036233
+881312036 854773388
+-1281269457 1000845035
+-1652817918 186504454
+1480859878 1722380759
+496976176 109120885
+-883282469 -1761488124
+-694639888 1799815536
+2014296159 656608329
+1875370919 1629052039
+1547060959 -355518064
+339668378 -1459147311
+-1498086746 1944011876
+1361279550 -1961065831
+-1866433197 -859776983
+1072683323 696515068
+-2022251696 2081700573
+154438620 1980890709
+427646594 1310571658
+-1449332184 1144339092
+1781873338 133343230
+947924240 -850472367
+1513609996 -918548833
+-1011005824 -1800035335
+-33038828 -1899255204
+1492512888 127470125
+2035783410 -433512097
+1438931168 1337616337
+1528110450 234905519
+25317810 1382617678
+-155127800 307276663
+1377692858 17591682
+-476492271 1344563000
+-1390826352 -1867086899
+1198201253 -22147460
+997157228 -45682929
+266447673 833007233
+1796036722 -46037936
+-2146667381 1620202456
+1123712805 -1159240712
+-1357439917 1850491415
+-692146213 2094411015
+-977257645 -919334996
+960723242 2005667197
+399620446 -1501156002
+-1796866674 8678542
+-1938145507 -676762034
+23355537 148202889
+1356037485 -1287470379
+495785132 -1459006823
+-1103142233 -1009697163
+-2115985822 -1939048569
+788029930 61127139
+1481640960 -571521911
+-1250800493 1461335478
+-317520580 -1552814482
+-571484289 670589271
+-1981709352 1190222449
+1111025520 1759929241
+-879160714 -1032872302
+1434541897 -1299466048
+1105400765 1834482299
+-1333494643 77825650
+-1171576159 -806944113
+1065889234 1884002235
+1566213714 331805195
+-1964250890 -1128421875
+1828795336 -270536493
+-859601073 121946162
+1971744636 -1631030331
+987974856 -462904215
+1413714376 1199830820
+764251608 270614581
+-1719068473 939128728
+-1170218560 -1390636932
+-1347317209 -1263327011
+-485370959 -1139561661
+962315684 544005176
+-1435745111 -1463463824
+-116490184 -890231774
+-1751442562 -826891621
+-992451236 -1684779917
+484205908 -866892556
+-1400337920 -370048262
+-1407339515 -219239221
+2004944509 2138314716
+-76801147 643818949
+81676428 798160285
+2018506477 -530424367
+-662977646 -158013517
+573827235 1686858247
+881480226 -650248242
+1281605698 871287981
+-348875971 -623178972
+449554444 -1656994754
+-112562674 2069786854
+-57280244 -2032303641
+-1916269936 -370430896
+-1426418236 684045145
+-820413104 -364702054
+263815107 -7020053
+-559428740 -1572592149
+532777956 -1191923010
+736796024 273692508
+-597629737 115278028
+970514936 1845436526
+1963674951 1895052541
+-1595503915 -1419819850
+-530761277 -1759603686
+1578569719 -1324777147
+1612389083 -1305694363
+2091876460 -1099072914
+-77875430 -779542892
+-1745878756 1961156923
+1507336545 -2067470480
+777492078 1919754727
+-963257639 -349439372
+-322556390 -1862861851
+-183188337 -155214136
+-1594458890 1526223501
+1465413736 1368313567
+1469194775 424835783
+-415283536 -537213559
+-456400751 -1386299205
+-1387859039 -211331222
+113449376 -1943098643
+1153186936 -869092982
+185593365 728110634
+1987875763 -974502141
+-321656846 2146726625
+802001155 1838499321
+198200506 1917066543
+1054331810 90786890
+-1886963760 1140291822
+-2128284085 -806517245
+2121737431 354236
+-1685849388 -664680002
+-759649799 196061032
+1650240594 1497601538
+-205957890 -1648506920
+-1047743836 -1407488549
+123582635 -150409692
+266686077 924718153
+1290183391 -284968669
+-2078009040 952017539
+-2000977821 1712118680
+516459168 -1782702055
+-1263554505 186265679
+1447005691 208431133
+27394978 933876614
+1993381147 -141232116
+837209909 -1751672396
+-807084934 -889499579
+621076844 1359207014
+-2025385627 -2102218355
+-1841588014 -1080337827
+1451396449 -639080633
+1507822587 1744243353
+591442637 -79520876
+-2106995876 43827649
+-1451760282 -719654853
+-121666825 686661376
+691574250 -377775968
+-1240297990 1339119594
+-1794903244 -2063452973
+2136750470 372850307
+629293263 1782709008
+348997163 706609844
+151964416 -160477659
+12922009 -2122188129
+-486389219 -222067824
+-1221930663 1049553340
+920019436 -1202559939
+-1203491071 920829338
+1074783623 -546786160
+-215947192 74029176
+293734265 1158774133
+-1537524172 -166394024
+639811449 487480637
+-592660156 677928137
+1267931573 -1892549889
+655439934 1659532355
+-973766030 596385459
+1768410456 1886274382
+111390883 1725080449
+-399325929 -1399077579
+-1992871692 1668393359
+946132529 1424676082
+-1806889613 -1172397067
+-1053688888 -1183845571
+599750786 1027876353
+-1048741238 -1397027771
+253139066 -1300919828
+-249269171 1595806954
+315244743 -1947941075
+1319919382 1771036958
+1002743533 2081030471
+-1806462165 1845378544
+697740622 -1855959703
+-1215774083 -1084501777
+-716773127 1640842627
+-1572735515 -369454072
+242176650 -1020858281
+2126041035 1357407508
+189201510 2066628838
+1558694541 -2101247180
+1135064466 776537227
+-1894267443 -1651849033
+843681600 1936945813
+-204598476 1627260760
+1012273238 1027985737
+-1526735277 -86003680
+1732742878 -1140411936
+-1183037686 621501318
+1637112438 -2137094607
+-919760844 -201216744
+1174837523 680079825
+-667186215 -745783548
+-1580653593 782331839
+877544856 -104578498
+1318199386 -885694765
+2056863324 1255970367
+-79452828 1149029233
+1957885483 59917794
+692615407 -1375957137
+-32935314 388350002
+1799389072 802220326
+1814753391 -1012997158
+-781670665 -779160435
+-1896303292 1081407079
+-945908945 1012251903
+-894617441 -868456579
+-1121271320 1249414826
+-317761382 -997000007
+-1945319911 1556006074
+-1900079720 973361474
+-1570642950 -316485545
+-2079538429 1142360866
+1705944473 -1400286205
+-599146978 -1399046783
+-325423483 1213411103
+-104117170 104252101
+1804632631 -1661504341
+1533364132 -398183116
+1928895916 -1425738460
+-670668410 -1938716613
+-127568101 817012869
+1196074071 1395783100
+-1136288853 683930661
+-786405055 -333573491
+-1107605355 -1373747076
+-283008699 1024047055
+-506470234 -802419192
+-1763273725 325049537
+-961265436 -2099203613
+1094577866 221575223
+-994083238 -362528406
+-1645718693 -313474465
+986491325 689067042
+-1849188937 -194810620
+407828397 -2099357221
+1751908062 -1453979564
+457095299 -1125219895
+-2051869486 112980688
+-166231900 1040868780
+-1211309223 -1753613224
+151457897 -26953019
+1755838325 1501937684
+-83508324 134038288
+1904107586 -706823826
+1047120138 103616813
+-383657401 -1060249492
+1359053290 350537285
+1718218998 1580749253
+10362107 1945211478
+1245122125 -280413048
+479451711 -744679762
+-220956619 -1745587476
+-125704448 -1807530641
+-1769184236 -1303638994
+2039689570 2059783593
+-1287156415 -2073265135
+952847483 2039388791
+1071527090 1534608996
+-1618097950 371094377
+1905590532 1201362215
+-314665692 -2046961721
+18300355 -32891065
+-1093975926 -754945208
+32284996 1211012250
+-250055661 -828896233
+-1253114174 -228211432
+-1857241136 -2135726708
+295059040 898822363
+-1171915888 1755419671
+183888478 -781920554
+777398620 1090306021
+-896380360 196956979
+1478132591 -119203462
+-706832490 587799870
+9960986 -1756632862
+2085927843 -2013841578
+1137808462 -1748893155
+1603108264 657028895
+1948904083 -2098797894
+1660408377 -1364781752
+-409442177 1610953925
+-869664201 -1600087650
+-774054256 -78465273
+1081859122 -1339739983
+-1091304179 1464330330
+-1714067706 -638717798
+873085090 1030236039
+403259754 -613234402
+838762766 -655716959
+-2123614835 -1614830324
+-1501732737 1395492620
+839924681 -454591487
+204489226 -1647385364
+-1748483098 -1089647466
+-915341371 1006829731
+1731609656 1328093496
+2009897707 265914482
+-44690765 -2041132141
+375157510 -416894633
+-1086528265 -51238645
+181885137 2131471863
+-1562889227 1277813846
+-1237895106 86931189
+1763520503 -1786309411
+-1531141094 362210645
+807863083 655977153
+1328541972 1140982803
+-905139324 964972118
+-369731132 865696674
+-1593012248 803022281
+1365091847 501820959
+1152078912 388545252
+1062266791 652027603
+-1818090619 -2009966050
+-1197749469 2123398625
+647458034 1620661534
+-1074995164 -1093572592
+408376198 1915689208
+-1780738548 451112878
+1298708881 -86524767
+-1026891347 835863807
+1213953901 1257649031
+678061490 1007522860
+998689954 -656924071
+-1311989870 1502054252
+1266223952 -1320698975
+1360262126 -1053934540
+-206771555 599238102
+1652340333 2082561856
+-787345526 -759853086
+-1755747841 -952073930
+1508569985 -544715400
+-470080567 -2003010108
+-1271506700 -2011332960
+-634971861 -169520933
+-11230399 -396380816
+201423381 1303778793
+-1140520507 -1416073945
+-29780679 369530630
+-501594766 1880125631
+-47380112 478077136
+313201509 1499808603
+1294384646 1809144992
+377424451 -93216033
+-1742545822 -561044861
+-1388122026 1107704539
+-1095261318 1728095725
+380516841 2059025167
+-278669927 238655702
+-939588724 -822177557
+1681996406 623444031
+-644578586 2043762547
+-22475556 -646558541
+1143301149 -124007439
+-1207351770 -260695994
+-626723033 1350533427
+908634197 1422106433
+1275693104 -1091885385
+-509119784 1079096128
+-666762500 871698224
+1863641572 1030537051
+2026211010 70882600
+529969125 1472939266
+2015320972 133949308
+2137679290 -1885010796
+938570786 1777498128
+1425895515 -2061007102
+-236909554 1992112984
+1397256499 -1922852135
+-1051703852 876090639
+-406700907 -1968307159
+240099872 -1394518433
+-2117618634 -1073461891
+-2030295550 943832269
+1055608559 -727477400
+799577837 -827568115
+626215751 -726913315
+-63059881 -2142633949
+-535976112 1891821401
+-831920869 1751756303
+1136578046 -1673923220
+2083269797 -321327054
+8167233 -671325148
+1223616104 -809168379
+1639199491 1819933001
+-1504252212 -1043516852
+-289167555 1149603235
+191188248 -1672472031
+1232310765 -1989038677
+37784278 1747416029
+-1368264692 -2085254744
+1373062689 -524643396
+1144070694 1948106741
+-2061679201 2122562515
+-1659959767 1400084497
+-748735966 -1200336684
+613051855 -757643526
+750269543 -1823117622
+-386109617 -803381500
+1776656921 649282119
+-232634571 -521867924
+390805934 -1726163263
+-802842876 -942193034
+1423792497 -71992472
+1997861688 -2113603552
+-807438314 -1729021851
+-1332826142 249897620
+-296590776 -1893716946
+-1826918498 -494812860
+-761600021 1098781302
+177500216 -340156672
+-1197803181 1415381229
+1802577864 -93047218
+1739005287 -1530249920
+1483907925 -1310376560
+-657673503 -1755835308
+919334978 -525452484
+-925864233 1168605918
+-1304678857 250052490
+-1229780181 -1664242067
+1206428181 -956471907
+364624839 219633327
+-662896063 589796361
+-708146867 1609382848
+1429945803 452863636
+-1834785251 -2066245147
+-43145711 -1524387941
+661173490 -1244275973
+-1796462023 1630887017
+231774205 -220150981
+2065507893 -1523824137
+1876594433 -271185273
+-1074193965 1242556047
+-486890578 -1679428715
+-642315547 199607214
+898502438 290006637
+1843378924 -179102984
+330169068 -1435718021
+-1852191329 -959416980
+-1263894272 -586324557
+1582886512 1183439283
+-779718841 -1474294381
+-1244649246 -1494128387
+-430930144 542239034
+1893169720 -721256047
+-406881722 741428783
+-1490305890 -536893334
+673181949 -1180162278
+-1030901250 1706608709
+-1300901572 -1673680864
+2077972091 -692112381
+-862484446 1956384718
+-1691474804 855064972
+1740725650 121643914
+-542374789 1667523595
+694516397 -1122324953
+-350819584 2091630390
+1129058070 -1102052645
+-88869999 1022576123
+-83324608 -911282121
+1296263953 -1751021917
+65319273 -90087316
+-1246286739 1569010506
+1514989728 -505652183
+-923869512 -21367334
+1225175462 -184615007
+763425239 441336499
+1532545341 545970241
+-1363406628 -1917359837
+944772251 -467734060
+42610624 16678976
+-1254033516 932233801
+-979550630 -1052614488
+-1509410133 1966105437
+1880253300 -1118424220
+-1233318262 1650451624
+2137984899 -1063860860
+-824055034 833725274
+-475811475 1710199022
+1483983343 1394437849
+936422485 -283642396
+2010495996 294465676
+1056802908 1417975422
+850514787 661578402
+361737840 1128486437
+-1518529875 544296902
+-1235525797 -2107350633
+-615264590 508594697
+-1990060898 -196467666
+-149489091 2049388033
+-21487090 -564750754
+-1388594243 -541207672
+-1385175369 357703889
+2040815007 -154774071
+-1684167000 1663593799
+-589078778 -1642458384
+207665615 46105347
+-227680284 1625725200
+-798010315 -1536132378
+629032523 2010272249
+-853018304 319910579
+-1552098842 2091842643
+1388613430 587586789
+-2095726485 1538919924
+-197667126 -603307565
+1636067677 1779603608
+810010661 -1783482368
+502645066 -1179747694
+-29440011 -723179633
+-915656815 327450971
+-409286424 -73933222
+-1331963900 131851119
+296823430 1850978054
+223254831 -418851040
+980768630 493047001
+-943359101 1542259163
+-1113196129 -920968365
+1157063169 541309244
+907515454 1508161588
+-1497841360 1324656241
+1127161196 440876255
+113747007 760872255
+-1358970348 -1884520026
+665235219 748493635
+117404545 614292436
+-336209763 1069830388
+1511011675 -397910069
+-1621032434 241384241
+-1904476612 -612669454
+738099430 88878563
+-1482110714 -1195914876
+1114892849 -295903954
+-223622204 50915470
+90252478 -1751752489
+-442211768 -1893084249
+-2132672105 1239881819
+1389684040 248424131
+670379401 2135674493
+2126119492 -1223926997
+1334788792 -1767890609
+1562881527 -177034433
+2057706835 1279051511
+-1502540671 -1926453870
+280310434 579204893
+-756959234 -8531198
+787301006 -1894580042
+-386684026 1145456995
+1390342299 722775330
+-372030061 705551056
+-404111366 -1100597038
+-937755532 -1549906820
+1779222121 1369078923
+-1118787221 -1982203717
+343233758 -1829415243
+-409887733 -1742097621
+770612197 -1092031132
+201406171 -180451467
+-832958633 395842807
+-1915584942 -1330593229
+-487408845 2027663372
+1523233723 -1816240011
+165611875 -1138613224
+1895414072 -1640507284
+-154927785 -2009719975
+-1722570233 -526062027
+-1660879362 -1263326175
+1430134971 369030613
+-1607703468 1212788966
+-1643766695 1015989884
+30049742 -621645639
+-1949149866 -744694318
+1394969510 -1914797633
+-503208677 24662175
+1611324284 -122634767
+1704864929 -110644586
+-818796032 271848551
+-42426972 233309576
+586469475 -469575550
+651680856 257858674
+-1166603691 -97935432
+1851897191 -931659452
+721321746 1202257652
+-167214616 673435776
+896716072 -1079974089
+-1915469717 -1598525805
+566158709 1580321390
+760344884 -1854453585
+213658594 1353090436
+1803655470 183608396
+141263174 -1368947635
+-1005746845 -1786319660
+216006264 1935407583
+97922946 -1941408449
+1200589807 -1956253749
+-42933932 -748978743
+-1700679653 1395556153
+-2131419801 320800625
+1813503493 -877838751
+-1714396753 1416222044
+1083542999 1854244573
+14112822 -1332696279
+206526271 -589232057
+-1533171656 -1282386765
+-698401078 150044319
+1593001777 -1805822297
+1269425966 2143940754
+-2043797930 -635448446
+1311031816 717248570
+-113231274 -1171981171
+365577351 -420648659
+-420226081 -1604700228
+-1941797662 429380217
+-1378395748 937421515
+653519647 1641550950
+133493916 -1806043202
+-229638276 581286132
+-1267563232 123468576
+-1998570456 393546421
+1615386051 553210945
+486694350 1184333124
+2087184599 -1254887314
+889701159 2133065683
+-1851978134 -756952249
+1290032605 -1010082740
+1559378225 676090254
+545458041 163736081
+-1081782696 -1755861621
+-1614416186 -656646669
+-198525863 1150115857
+1404659838 -2027974068
+1874197491 604061593
+873639275 -191386671
+-1778929739 -447144011
+-1378084881 -785403023
+-415586345 -1133310406
+1517081349 1804478385
+2067906578 -1728661303
+464167286 -81722646
+-1948431365 1331070734
+-940976990 -739792490
+-817306065 -988579595
+4887772 994740333
+-1132322817 -1974971393
+-1527899066 -652352583
+-333676842 2127856548
+1455325644 1699352941
+1024453655 72063735
+-505604481 1587778883
+-959170861 827218647
+1913873670 -2011636183
+-1845180046 1935113051
+1906450963 1927766983
+-243941925 2066978224
+-1479208358 -565728696
+1335170028 -424075789
+-723399832 -1006263072
+99304755 1709638645
+-1160313363 1776984030
+1086753722 1609532710
+1323723355 -1602245748
+333647983 552946152
+123303890 -685418668
+-1752298422 342088089
+-1722670827 -687128693
+1615965489 1963671074
+-1895111676 -2033135664
+-415840787 -403588047
+-1225520790 231252402
+-781611702 -736890422
+-1382426313 50022708
+-1716728398 667031111
+-589552695 -639111354
+1303474234 -791255293
+2024698754 -1556345713
+-520623905 321449435
+1696055700 1289655041
+-1016073075 600036401
+30000217 681818240
+1481701028 -920471548
+1552455828 -164251776
+-1127398631 984356916
+1397201509 -1820957449
+1488861688 -742459389
+1398161642 281053297
+-2121552151 216074112
+-295403466 1441881357
+797546499 -693249642
+135269571 -235172751
+1800332903 1125164708
+-897245549 587206995
+733797536 -1353724604
+-838652600 -1246825906
+1530558682 -2138594825
+1803460463 288403612
+-1486507033 158152991
+1098846907 -1694104619
+-1636681217 -855776089
+152266308 -1136753897
+1419820372 473832885
+-711373289 335259215
+-58668567 1358391379
+34754755 858313605
+790104276 -1819619619
+1743030116 -816490848
+105115797 887268178
+846844455 -275129052
+-311248297 -552409413
+73786159 1787621277
+1022480068 1827136110
+-1487661151 -1492600983
+22795937 1221006081
+1285109712 -1260269772
+1295961315 532617507
+299701633 2053317396
+-1843622462 679143825
+711935 -526973363
+-2011698421 -855456339
+1644694020 -1120637344
+-1455513559 1052276429
+-2094878245 229251154
+-833334430 1683424571
+-1696113305 -1338043385
+-2076799689 1270190251
+616542148 1782850424
+1460017858 1442825219
+-375313020 -1235323494
+-40182361 -1010719558
+-2046536240 394831666
+2068610425 1331553929
+934492586 -2117636008
+812757370 -816267451
+-1602963878 -631099849
+-28830667 -1211992797
+-698130875 -1132232184
+1043475662 964847248
+-249777208 507276745
+-951128327 -1056908610
+-1079411083 1529259233
+538543154 1293748874
+694286462 1136211542
+-187425159 -1531287724
+-1627491462 500836060
+581546383 -704197661
+967781520 -279942756
+431999984 1992930389
+-1345594375 -493482967
+-1882812295 102094902
+114702928 -1014566980
+762040490 -1949222487
+2006997706 -1425765898
+-524635978 -1215692382
+1712612758 1764074367
+-46896162 1701727577
+949208134 -203583935
+2053343177 1189225061
+2122642752 1281405313
+-1270017450 -1283330039
+-2016220398 -718475472
+2007239538 -2089323197
+-335036721 -1897684917
+-1084202719 -1057642331
+902701519 696952834
+272068118 984337259
+-327756282 -1428872468
+875918610 -226136798
+480028861 -1627386169
+-461869630 608876487
+-756202277 -1786307382
+-1790323711 493135787
+-773254219 1276501138
+577611444 -1207881191
+361297128 461030524
+265872647 -503284310
+302258544 -390533575
+1056449015 -594622537
+1493272123 -315923358
+-1969237163 -1978126860
+-38702614 55644195
+1126943987 -654522676
+-219523226 272537942
+1181676984 683614847
+1233524033 -1955528268
+-895906921 -760393775
+1170187066 -1670044134
+-658031110 -766012170
+2054282475 -1129186677
+578071738 1585811138
+627256206 995333971
+1525927229 -289409048
+-2080968807 -106779915
+901468197 1445880473
+-521279659 388966562
+1745575710 2136630052
+-392547428 1953251145
+1141696186 1523839854
+435722977 -24141507
+1412805266 -1626781747
+-73636405 -1316954236
+-1759668943 37641875
+-1193384504 -373193870
+-1743811680 629198098
+1757923123 1730708398
+-160670057 14481596
+656412385 974623349
+-1277670230 -517754958
+-816069425 -502107586
+405470298 164642395
+1056504917 1678953361
+36980310 505710866
+432868275 1073963709
+-509494643 -1153750972
+2110480741 -477014564
+2036619089 1745581487
+-1693406775 -140392670
+-1874019473 -145858294
+-961776992 -883998549
+-13370661 -1389117361
+2112962055 1698877958
+673654428 2045120027
+-67965438 2097949628
+840268065 2000049367
+-1383783093 -221395892
+-1711725898 -1579031395
+1206300439 -604942338
+-214252745 1469669678
+-2044228492 -311029564
+-1531653535 -26634283
+-636871209 2099033520
+-789188815 -160186186
+2004903767 1515031497
+1314674261 1024674829
+1012884956 1188397449
+-531575344 -326100624
+-1674641593 -453909026
+-618160184 -411567945
+762880612 -1258037076
+344928988 686461096
+758819116 225134710
+712534023 1080352926
+-37358744 -134575065
+-1216705205 1020972898
+629621920 -754529452
+2039894191 -904793388
+1449324516 2060780004
+1719149922 -1061862119
+612204457 -1197981615
+1574984596 56944474
+179970583 -606411453
+937344758 -1988298845
+1826030893 1122613733
+1647912013 1547521972
+-1977644260 1432185276
+794583531 -699306106
+926214336 419025596
+2049443804 -1932661391
+-1550345327 -920138234
+950473573 -1236724742
+-2011316874 -1978512570
+-1707294767 813847156
+1146957736 182212364
+854121641 -576906549
+1651358883 -1475911935
+1390557544 166466476
+2112701491 -1351627364
+1870515129 -1446413559
+349229135 2109587659
+1910325228 683257219
+-1242772702 -854629313
+1259120074 -670838079
+522656977 1400851593
+-1245797559 -1376439083
+-1280889585 -1585902591
+-1260672212 -663784609
+-1914489782 1206524233
+-706486503 787024892
+-142539933 -34114874
+516205694 549037546
+797587252 1367924430
+582617592 365803782
+2033310513 -1698358399
+1206042178 1905607643
+-59308812 742959376
+244169355 1358988792
+-933061397 -1648568828
+1511188468 1517869867
+-601366267 846812229
+1466992465 -886680866
+-320667750 51397488
+268880748 -1415367115
+-847402625 536514803
+-281267665 607839724
+-1809733146 -1269023855
+1964209619 666617069
+1896506973 -979941702
+-1104360801 -518154476
+543264662 -592367781
+-1043569385 -704552815
+-634936833 -883565522
+882766580 362485630
+-462688981 -1871518443
+534868451 -1503376728
+-1268726980 -69916860
+1048329995 -1628589327
+1806113968 -138974691
+1392730500 -1138824922
+820740954 -1803481288
+145189597 -208735552
+991258094 -248512040
+1580649285 441137293
+-1943856301 1564349108
+-975997551 562618679
+-746946099 -1423719498
+-1042769435 -956363745
+191991016 -1867777649
+1829230296 82377119
+-30796929 -1271713201
+937304228 1550470808
+550058866 973074884
+1225966389 1264176463
+1612340089 -1973678579
+1207125457 -1270909417
+1140936286 867009473
+-765196258 2066758773
+-663376978 -647118653
+1895723362 -1895992976
+41643950 532040725
+1965536176 -529409425
+475121145 -1831673130
+-1615106427 399658487
+-1140882637 839514941
+262123090 1905471960
+2116333478 -455237691
+-400926404 -987903421
+-1478091646 -1312756334
+293877261 -1797901971
+2002299839 -1853045852
+1123595477 960054092
+-502949702 80478806
+-942304110 -1431830004
+-1985177511 -1932904098
+-1518635768 -51343839
+39007078 -44953129
+2035776627 -1796742352
+1158459178 866281735
+1900544483 1595445768
+212737034 359898068
+1928802995 89513558
+-915967525 1197126271
+-553365096 -408456364
+1061585381 1047711205
+2031226674 -1787956004
+-402910995 241075193
+1036304935 1949412082
+319631052 -1126268403
+1526699805 -2023420954
+693286903 -492568373
+1607624869 139616208
+-533668917 1229097478
+-384050240 -812002732
+-872315710 2136792129
+-831857061 1482287854
+-1044532211 -534940554
+-2009193036 316160339
+1481465203 -1143819404
+2006714539 -1264693077
+-738667847 1914241975
+-561045610 -1669715653
+-2081200434 928351975
+1125820299 -1988472698
+1565245647 -15847542
+-1448862362 622003981
+-1049228833 767543539
+626685921 1904168363
+1870396011 -1173194934
+-1070140511 1448395341
+-854002910 1526433980
+-673059425 -1439254801
+1799131834 2127260813
+-911268353 1917852429
+2034344084 642757248
+1911471480 261881246
+1074222705 -1671731974
+-1475506983 1027351464
+-487312131 624124737
+1557969357 1490402318
+-135849082 1567113649
+685072313 -915863543
+-855661730 1195301196
+-1533356224 1980623317
+-828286450 1793649965
+-166457042 1922107945
+731980802 -242842718
+-1694591931 -291847736
+725207586 1707418025
+297862328 -686749198
+126157002 -1508539807
+-767292555 -1843683742
+1088269421 -1210168009
+-301912725 2077428498
+1467331777 -1060166483
+-1433532028 2071565740
+1500104878 590235656
+1598433486 818817399
+-1215906754 1638004427
+-1589926770 101360564
+-699951050 1908847737
+-1760680862 403489902
+-1483667023 -698863046
+1969700294 1013987986
+1906279253 -1792218024
+165705396 -2048559113
+1924397574 -1983531386
+-63731037 -985912876
+898486797 -333379558
+893793983 1184216463
+2105198869 -738419287
+-696324256 646835430
+2091146865 -800956143
+-1762843732 87795708
+1572473449 735837950
+461739232 -88582209
+241806546 1020915724
+1899182978 42287688
+1893743756 1154437888
+1944865736 1994481104
+1111413630 -1360681016
+327474191 1031546652
+469600551 -429358003
+-1543982483 1707132943
+-432555439 -1858764572
+-1334562322 -80481140
+624648736 -1042671115
+-1464241632 571561693
+-446800768 -224794785
+-662389350 111056204
+-408030603 1564298377
+-2015009865 1795924174
+-44691006 -2002571691
+249716379 -1360879703
+1056044133 -186004842
+-549605414 21580060
+1454461850 -219614494
+825755332 1260983468
+-606354210 1573971666
+864295412 -408262293
+715253639 -1815935253
+1551033440 1388114586
+1376920716 -1781452787
+806965409 200890776
+-1262511108 -1353936405
+470500079 -2142001675
+-2135733924 -215937984
+414498943 569728036
+1809283276 -619389119
+-1181340288 -1939825321
+-1149899725 784342992
+-892831352 453075052
+-489704621 406528635
+1088151720 -345087672
+1293391651 593191529
+-2110402007 -2131818328
+-2127402249 2144279014
+-2055751543 1342865663
+504398255 -2097930430
+1486698600 -556255652
+988641806 -1008955392
+208809221 348297030
+796206754 -1973577570
+673710920 200226530
+-1789637430 812416199
+2097450442 -1803706122
+-597629122 -292167393
+342546861 -1547275996
+-1355701910 1572825955
+-342592323 587156441
+-789176983 1265339566
+-924129314 -346733832
+-586555519 445451393
+557596649 -2029407492
+2074542212 -1303410481
+-678144199 1996049634
+-845164777 834703523
+291822797 -2074592377
+-1502384124 46894540
+659254670 1288547648
+-183409574 -761022414
+-366812289 -1240404603
+9071409 505582868
+-964597752 -1230279923
+-1415449576 1657930383
+763569906 1484327884
+1500143497 661669017
+471750143 2114644694
+1851833462 -1180942404
+688701519 -1611507537
+590391907 696547742
+1206375919 -743840687
+523947728 -1835011698
+-605738829 -408175746
+-418717142 1916200065
+-522332793 -406874308
+-1369265131 -1030942560
+-1563515924 -1851458568
+-2131936936 1938085828
+1649269166 -1457885967
+543385403 1424265311
+1949786382 629309955
+224252224 26646178
+960722664 -204502009
+-464828595 1912607702
+2047630112 659410358
+-61029418 542856613
+-1251523066 1173102182
+115840092 87459749
+642121318 -1820441418
+-525104489 -1121394638
+-1055099081 998703346
+340714093 -2079387230
+-533825373 -2063828764
+56280276 -597688044
+-1160807910 -69583606
+-1176199733 -1614880958
+1284132896 975363640
+1718484829 1413481816
+-406567776 -553060434
+1885291781 -851798945
+623717372 503598307
+2005229190 -961718201
+-370799854 1926637187
+-894784553 -497179605
+1025585141 -560454911
+-89560044 -1671878758
+-203346162 1923963760
+1139410253 -1672935561
+-246175113 -690607805
+-26002265 1454359696
+-1762248583 -118800263
+-640014903 672310488
+-1522968184 -1968406096
+-54841683 -1664789671
+-289954309 -1848291713
+-265806864 -71371235
+2086587077 803876227
+1592107847 -1303037308
+1266605237 -1945575421
+-1803612380 -309274710
+-2117266602 -914075733
+1184585129 1646679309
+1873425281 1909497435
+2132519062 -1250783401
+1861684603 -1106962925
+776330761 659412147
+1185744345 -1105201225
+1264716471 -1441487499
+-1166175239 -13166139
+218883003 2091180948
+1416553703 -729263663
+382992105 -1178013352
+567787196 878246949
+-1272119613 1042662709
+705166154 1979688571
+2118483662 -1427100173
+-570025677 1995042349
+378542377 11697631
+707602147 -1717597800
+722858124 -1334811092
+-1377728384 -642133779
+677653626 -254724802
+-2125588184 323843525
+1311458187 304514005
+1615368669 -846321124
+-1816218674 -607417691
+-1197766045 -661473001
+213947151 -1234343778
+-1780251255 -757169240
+1872355088 120044775
+1772772074 -15421549
+-634810457 -226487637
+-141711713 -533263404
+1573273912 -10748094
+2085842754 -67170491
+1765087727 1284211130
+1119360554 -1981192225
+897964626 -937774519
+-1387493295 1456134084
+-1903234688 61785189
+1416366116 822922285
+380801981 -977437936
+1102640362 -792447346
+-1481835575 897224081
+1326669274 572762876
+770298816 1418513553
+-1666419126 -1607011372
+1151087027 -2123431078
+-671443657 -1402954543
+-1276549867 249167770
+1584604823 449951018
+-2122246733 -1318726326
+1208773874 -710924633
+227612269 495108193
+1173462810 874423044
+544124993 1294808595
+-1519116021 -1075704065
+965557915 -429231926
+-1135692672 1059610326
+-448357829 -1170912257
+-1359315581 453575531
+412329476 -1737733396
+2120842056 1708010983
+494444316 1096854062
+450910991 1839404078
+2131675694 -1722701869
+496883755 -167143304
+-369491222 -1260454451
+708242226 -1347236284
+-328394327 -1109504118
+1620335021 -1522880611
+-1923240905 1655787755
+1077352811 -961838116
+356776956 -1867643316
+-924330276 -811972324
+1441127811 1065621794
+372028565 1929534678
+771323998 933648451
+270001145 1758145769
+822747946 451746337
+-1736221649 -1865781340
+821392820 1944280111
+-164182804 977313986
+-603370649 -1515802712
+1748352914 -1525594356
+919132823 -1033964695
+-1813888538 -1550662784
+507734976 1570659405
+1533937723 1939352909
+1761885600 737009502
+-1682269264 -1933164945
+909984827 843476917
+-1353439680 535917457
+-197905180 305855052
+-356999100 -209842921
+1928643406 708408630
+-1230967744 56507700
+1466918558 -152018916
+-1162193982 528888610
+-17750207 2065829128
+-623003127 1870556444
+-1210699853 -984101501
+-946921891 -40233527
+-371682369 1113957934
+-255557727 738041232
+1962715093 2019284347
+1239518381 -1620651229
+-275884022 1734011482
+-1626435955 1435784683
+-1046572126 -1579368643
+27836477 2116078758
+82390310 734941726
+-1772110690 19721009
+1562523483 47505845
+-2055265854 1302273394
+1891306710 2045666091
+816378447 -190064013
+-802481409 1516385141
+165628115 680553339
+114083534 235061155
+443396925 906560508
+-443324564 -1970470556
+-98397653 -1723668854
+31630702 -1262642983
+-1549859580 2082249330
+-148642135 -244274123
+921037759 429002525
+-1809484339 485800427
+-1682384296 2054783601
+-300628157 163673956
+-1056596976 -116563923
+1554548993 -873093169
+-56202291 346523056
+532464838 390748549
+1319696453 264986198
+2035415667 89823011
+1230427175 1056306868
+-622075807 -1424846448
+-2003505504 -1542859024
+1747581754 77494525
+-810245326 -159525742
+183666744 1240445488
+-1246750325 1412475008
+-712025070 1079995156
+528942450 520979909
+1640389242 814393119
+-841795880 609869927
+-858313897 111035221
+1268119973 1145373843
+1184438136 1428139383
+1113749929 1521184614
+-2025240735 -888710651
+-541619909 1934179969
+-1736682663 793617686
+-646506088 1518427618
+-267674305 -1622734711
+2058196498 -1543088938
+-2048099364 1119370061
+956964296 -1880361089
+-1647344668 -579021222
+-1167674478 1603865198
+-461457684 -1602471059
+855006982 15303544
+1184820715 1947451322
+264323869 713654198
+402608931 235262058
+326274602 -960683115
+132511321 -1390802394
+1634148529 -2090302033
+1211637134 -1435249494
+906129436 946708976
+1193479324 -2040401253
+361814343 1241825736
+807404460 1681592309
+708867198 -31077895
+-1566817255 1773172184
+827699718 1434354561
+-1336372078 -651101972
+-1563624911 -466841704
+-1023054769 -1738913692
+-1625073497 -1633205032
+-313529726 -657021131
+-1320509615 -399807468
+-1216411678 -1162360338
+132951480 106684853
+7563030 810695035
+49930752 609579037
+1656523221 -82252531
+1155584758 -442446648
+-1708671597 1318512098
+2113745428 1736070982
+-2106238458 345421614
+-1632575265 -344624368
+-828496874 238104586
+1229409464 65280215
+-445537377 6990658
+-520309244 81282093
+1856096616 313383418
+-1474830559 1259173764
+-308568979 813282644
+974501716 215150379
+-546594669 -363708006
+807482604 -1656745414
+-1490860269 -1013571933
+1191408342 -648292786
+2000415804 -1023552416
+-250692343 1262073276
+1735431218 -531200198
+447458769 -364986079
+-57650737 -253737133
+875763951 -128134651
+-1597652900 229216241
+325761802 -663210265
+-824256885 1061024171
+97616772 -28970370
+1272430399 1681640710
+765750847 -1568097126
+509271084 669662659
+-1224006463 228271312
+2043855067 713804997
+901399098 -327843837
+-693829284 473745244
+1772754427 1660736451
+-1849439991 973607706
+1030337917 -310129457
+-527116201 1624474662
+-843233124 1674757171
+1756257633 1371830351
+-1139313106 -2107863309
+-1610934127 532504429
+918000257 -1426102759
+-2040619896 -1343781032
+-963915505 1522462692
+1820430094 -1616637145
+-311784600 340142614
+1083588236 -1830239844
+-2115260579 1429472385
+1085891589 2020954213
+-716650099 -1277158582
+-1129589492 -492422966
+1604531179 -1965476904
+619079125 1095565079
+-1203244319 2035667835
+2052731738 343739988
+-538120822 1827156839
+954239341 735481654
+-1168537880 -1822764914
+-2098977209 1820486860
+247551772 -531512906
+987235324 -1578001303
+846906151 -291253963
+1419594942 -1396374586
+-1850323306 -1783982829
+1619384572 1289635644
+-1378785046 338451703
+-1865977618 -595070577
+770546135 79960169
+74709172 1673255496
+313895169 -240167913
+371258008 -1325819683
+821132141 -972131978
+-199156795 -1861419583
+-1395795412 1197794113
+342354612 1893395106
+1199331600 -1706142252
+-1758403257 -280966505
+1791438338 341026717
+1002751420 -1888425665
+148551605 883985705
+-1800534367 1772494606
+846618577 1149256095
+-381886506 500402751
+919659584 470576991
+1182181947 -2097743709
+-471613430 -1442579755
+-2002471367 713044746
+-630821207 -1465206714
+1438668247 -2010482751
+-1007160722 -946200127
+-1399236880 1234889698
+-1953875796 -1401419485
+-148376996 -1090688785
+410321057 511570793
+937190353 942321291
+91084445 2128721188
+1237782077 1624290122
+-1738765920 1133390366
+1591779612 -1093324710
+523198634 48475877
+-502293926 -600959239
+1673787160 782850855
+696657472 1865897428
+-1344064237 1025072882
+-634415857 1594362072
+2030267818 615377156
+-1837595767 855057056
+353259726 836335581
+1940019949 275340322
+326177746 -210265
+-1435519354 782240455
+-1084313491 1817798449
+1513919568 -1615376760
+578856872 1773146144
+-2013219287 362247332
+885498797 1220583594
+1685314666 462671477
+-288503813 -1084128675
+958424375 212616107
+-1014167631 1213624105
+1281103623 145879970
+-1973177590 1171762977
+539398847 401080332
+-2001925879 1737025639
+1707206648 152737634
+-1488737000 1178732913
+1762857103 1286312237
+2050806700 -1005727468
+-99965324 756678377
+745922132 1892552063
+-1343621923 508756461
+-64353412 -429303736
+1871446683 1075428995
+1108264340 -1379329986
+1316900833 -590398275
+-836973620 1816412113
+1404325928 549003227
+-1641759758 -675736131
+-1759729212 -164854622
+33268947 1814785167
+-49587142 -1020326176
+-484969589 -588111390
+2127299218 -991455802
+-350228752 -21968142
+648612808 2052908279
+806985562 464482071
+998430749 -1278396859
+769962362 -1053086802
+-1098052455 1493342796
+-533404421 830573005
+-656119319 -1184936747
+1883307672 1807243030
+-2061299928 -185224929
+-1329864735 -1663783540
+1789883884 -1698038679
+775981722 -1506439178
+13593048 115907061
+1337270011 -705389237
+-723371533 -459768289
+-1709951143 1471113554
+58933608 313675715
+1312009138 -292955375
+-973805173 1958631398
+1931432642 -909020589
+456629841 -806776334
+-599654488 -532662931
+-291024893 1938733013
+-387892436 -964752953
+444403085 337992385
+1811078724 1023698967
+-1862709187 750466621
+-1661137526 -412892655
+-1512724081 1512094305
+-2140379658 -1972051458
+1874518779 752169725
+991607932 1339192800
+1748755568 -1473929663
+-2057312529 -413879899
+-833838796 556030588
+-150203012 648686656
+-970684529 -1794851100
+1817014213 2125412991
+201141856 5090273
+-1995734870 -725542352
+-1431259660 1537337168
+1062498410 -1543548269
+1725137037 1456113590
+652343370 1165086023
+648850293 -837414747
+679543379 1457862961
+1777057728 -754893460
+1453160627 42890807
+1035812347 -433645177
+1055512598 1847764914
+29200619 -2043577670
+-482825014 -2122201370
+-1430103487 1001249124
+1060071018 -816478777
+-2041257430 -963586983
+1096279435 1322754940
+791455101 -931712614
+633127399 -682037364
+2025665632 -713200885
+1149735940 -875449434
+268541286 -2076491856
+-1505867749 -836207763
+-240768999 1445102651
+578326021 -1969664430
+-1480551154 -640269323
+571235300 -1049588168
+22156150 -2050069251
+-2060825694 -1723671740
+-1498595169 -1971151961
+-1185948895 -616669748
+-1878284245 -1773237775
+-1537672467 -1842773674
+-1545066238 82668069
+538325333 -1660700675
+1647498314 936162212
+-941582362 1548646630
+-2110087926 -2141206683
+-369472652 116774534
+-1444946202 1205811311
+-416533893 -1764590525
+1649608537 -1485943746
+-1260349247 148014159
+-1957214110 1842278835
+-2109761356 1337669499
+-7993441 1496343290
+-709377782 855941123
+-1850215366 -1137310933
+-346209316 778985542
+448104513 -509374568
+1110920614 371692183
+-2031229693 1315568517
+-929009656 2063361417
+1093529716 807958383
+-1043307589 985108752
+393476688 -1472403275
+-215189873 1815498421
+-55827501 -789602301
+-576764074 323060440
+-1544901756 -1978514274
+1595033982 1898297635
+745852231 -1603889225
+1963206782 1795670523
+-1852966700 498387202
+1181599844 1213062045
+-1118874455 -427235805
+-2011988424 1746408168
+-1811706537 448776463
+1624174551 576572279
+1615760377 -1555599852
+-1318504415 355271142
+791045810 -294504727
+1076740825 1000722261
+1041917403 1385118186
+1885469661 1348521385
+-1605590007 -472317606
+1365783595 2008867318
+-42665976 -1826476928
+846828551 -1264209269
+-1197217207 -1616140621
+-553389342 -493234563
+256934323 1056042631
+1002142928 493019584
+-963660407 -1466672029
+-801931722 -561751773
+-332146423 -1357364966
+1839259810 -1167666237
+-1327727416 1624925641
+1420187486 -1874048130
+-1137808029 675059266
+-632191029 -456912279
+-208473367 1967083418
+58279300 1376547359
+-1592548177 -1089493148
+-481011558 -1306993523
+936143959 -2004420660
+-332691435 1042956467
+489108487 -83655720
+797707760 1673531680
+-776832410 2141986911
+1660588332 -2012721864
+-1151429708 1306888600
+1675667289 1773543672
+-1016875609 572662042
+556086432 988309953
+-2087737314 1105399664
+-1396651847 1455519774
+1512106608 -826178251
+282960829 425915199
+1004711510 -2136321189
+-539583190 1923458124
+1885081331 -1276698882
+1595604671 1624660600
+1807492768 -1293984287
+-1192761855 1889114273
+1180613365 1226265434
+1201476964 158544750
+-111615230 -489717632
+-332679016 -1001579510
+-1041418014 399756272
+-760414062 1515182792
+-1302464270 -155162139
+-515448758 1124224835
+-201110746 -705015430
+1710194064 -1832676744
+1875452851 -1191090533
+-1196346322 1945139248
+-1418083212 -535412285
+-1357227443 339122934
+145586300 812434169
+391340824 -1217905951
+-228879459 -401131331
+-1680799480 -295807424
+378238716 2040409206
+-547310819 1778081465
+882905658 -6168344
+1828722154 -228514623
+559547149 -1883105543
+-1496755348 1147325418
+-243219003 1906250465
+-144112328 -748708847
+1580475908 1208081818
+-599958169 -1923269497
+353726376 538118525
+-2068812950 902156392
+-637884166 1983897169
+-1848045933 -2070099231
+2007668202 1337295808
+1138725917 613891871
+-715056333 -1592173463
+-334092679 -337338558
+-330118238 -1186029064
+-1686488944 513415648
+887429082 -1378296386
+379839336 418736860
+-2134134829 -1854933367
+414893641 170114091
+-475536267 -93822240
+1293163714 330586628
+-301776756 -2006290018
+-61797415 1774210333
+299084274 347204326
+1949257320 -2006060222
+-829297000 2104452074
+-851503546 -1479310859
+1810774125 1956080501
+1422791078 195203570
+362104223 772906014
+-273487261 -724895360
+1736464283 1933772107
+-750961683 1055128902
+1302223183 860063223
+201099410 -1799133735
+-316234755 1272761757
+2102008114 -1458952635
+-67342581 2123714944
+87783131 -1811497430
+-1466933385 2057219319
+1069658407 1115048637
+1653877404 -1786437931
+-1398659144 -1421584199
+472575496 -1661151254
+964977302 -985198572
+750546374 -400119229
+231863294 1298876619
+-1395728082 258349236
+253982993 -216176539
+2146477322 -433562343
+-476733364 -2023556121
+-1424167903 -20761507
+1894630757 177993782
+19890616 96691485
+-1051517245 117190896
+-1123244833 2056134606
+94944847 1700393431
+753726878 -1353401923
+637974453 -961809379
+-1491647975 1652223346
+1263730721 -1625294262
+-877441080 -1781264041
+316458199 -1611795166
+1209951161 -1398410223
+1878665695 1233579679
+-1898651214 -1500205731
+1210741041 2035986654
+1694384777 1130960464
+1798469661 725960597
+1743121647 1902555998
+-1763286599 972344277
+-1391243117 -518641995
+-618701727 -978504535
+2005386197 -1082329729
+1112468772 -523921631
+-1088390669 -1101352012
+-1153742377 975240675
+-1596471679 1212517800
+1916958259 -2124064260
+264720454 -1449843124
+627808955 -224100545
+212140515 -1622078029
+-1612679672 -1178884779
+1110738153 416419808
+-2028399782 -1470122966
+1178022652 -534181706
+-44719433 -885735665
+937441216 2037640510
+1847692466 -925533144
+1087813460 -1133512294
+-574585648 668297147
+778826677 2120303014
+1595314161 -486417468
+114440907 858790123
+-2139939434 -1443608721
+-1601275805 -179102383
+1793579644 118809579
+247148796 1333305411
+1704244211 1741469918
+-1647254676 629764807
+1905676616 -673303631
+2074081794 -1202208253
+-201319594 -1641898611
+491696999 686274943
+377117450 923451528
+-1726021627 2083544775
+-1638118047 -1845435911
+417280462 -1450841159
+417725548 -1168370250
+-965224827 -1645581162
+-498135094 2099106580
+-299390841 216900056
+1076216442 1738437223
+1850429920 877297556
+465036701 -470430891
+-1816974856 1766904018
+-103513469 146830165
+-768422244 -717139607
+-1935065992 -171497881
+432452639 950722184
+-1883475431 -739051166
+-461224574 1795241886
+63713116 401934344
+-1977241105 -341679104
+971318700 -1149160652
+370294949 443700997
+418808294 1287246010
+-784372386 -618767756
+1267563781 2031182438
+1039977827 1632170189
+-967202827 1306161451
+1059220175 1784527774
+-1380996313 340027924
+-499024356 -673109779
+-644266080 823652088
+930495337 1333312445
+-944722049 59235161
+-1279281481 -1036465307
+1397371003 2140872647
+1876620552 -1217766616
+-870707055 1160101246
+-1210529177 904288424
+1348001264 -300343035
+-2046723957 -1841406681
+-1683053755 538738719
+-1602631640 -807212650
+-1826952052 -66348769
+-757394113 1895202834
+1649803751 -1950503682
+805521919 -1226669185
+-1241758163 621432123
+-1995493359 1381656533
+689335799 -290272691
+1911311942 1355099300
+-455611706 -1097272111
+-1748100598 672340865
+1508166310 1150494067
+-180158249 91127151
+-168389612 -1781759341
+152456683 -1381198403
+1690051733 686971616
+1927675293 -814558945
+-1237396343 1632525912
+1739449861 553991703
+758695936 593942517
+889470721 -836023744
+-1653588337 526037459
+-738616649 -1318023913
+-310881751 1744046011
+1133428893 -1613343738
+2103658725 -996698877
+-1421186719 1129128204
+1927211939 730264242
+-1096964485 1624323836
+208996624 1280483541
+-1449173040 -1241407489
+226588047 -212453122
+-302089972 -892959511
+298313483 1934126963
+-1440745489 1362939789
+-1517951772 2144860702
+1490222440 1190417839
+-617566069 412719667
+-1967383505 2057033840
+1050430939 -1035241650
+801513555 1856649742
+867372708 -825942796
+1123770393 -872618351
+614247671 1925231581
+2080877725 1801319073
+-1588279725 756457258
+-1291278799 597566976
+1623136295 -1329407136
+-1992518580 1578040057
+-1816189415 1398363750
+1303616468 -1681524862
+692283793 1902878214
+1158093964 704031269
+708583368 1830784640
+-1217771610 1770848955
+-22547367 2031530021
+1927839190 -400646071
+1842048741 -687817102
+1389756279 503629649
+813709103 1725173710
+-1515963930 -1896260610
+-510154298 -65374075
+-602811604 -1906211853
+-1326414800 -597937996
+-2041201102 1759861050
+-1685803403 1983713567
+-1842025120 36570961
+1188706246 741663828
+-1790477455 -1271526920
+591429549 1679631172
+1624132318 -1276913317
+-1011354347 -1004913239
+1981103850 446408943
+208820572 -544946859
+-1605194931 -1678681424
+-606562962 -143261050
+-2017318158 2056711676
+1557417146 1413352545
+1697652753 1923018155
+384518118 -1152027769
+-1658748627 1919281146
+1992230452 1781487727
+-547552861 2126074288
+2008988048 404635804
+-1047174537 616977580
+-488580536 827507768
+386233005 -982159586
+1473779885 155285832
+-427827536 1725123487
+1224758763 -2108424494
+1819727197 -377178152
+-1424534684 941861820
+-32292965 596414985
+-1837930170 130306276
+-1296332802 889191603
+-523319728 -590770232
+919334609 -1939649012
+-784871009 -1559503957
+-674383353 129048946
+1399717264 -646506201
+-1704187615 2086836212
+-1760816559 767774098
+1496640956 1798249702
+1782175915 -1304536906
+-1439653264 -49246801
+1668782377 -500648904
+968111339 -932127047
+-778333418 -1816345304
+1804864946 359369948
+-827807367 -301882142
+-2014123920 -799520401
+-1155243258 564567031
+-718444992 -570503675
+120888852 878110760
+-1672872686 -2021595953
+1086757889 -1470633110
+-194723319 -1352664297
+403116975 -226213782
+-338695342 -1448481705
+1617829326 -1536328433
+1668339637 -77497842
+-1324474715 -1053791859
+1629370376 -1791690919
+-2140440863 -183936151
+-2067201279 -1164207233
+-1459071543 -1659776284
+1792944454 502488213
+-175816928 -1954373758
+709740191 -897517030
+674755717 590289623
+-444461421 -288565979
+-1280464989 1071730537
+1273648357 1377797300
+492214020 1439902531
+-665812902 1285549625
+885436714 -119025140
+-1567717725 256825825
+-878432292 -1851355712
+-1785149916 -1857604797
+324120713 475362516
+-2123912891 1811801367
+392490476 1309717951
+1693716375 -776415617
+1649895639 -1101375728
+517514703 2100292389
+-205768300 -1167763648
+432575930 1838778396
+1457996189 -809013611
+1533422361 2052108292
+1703017263 -1965745509
+-1315342562 -1863696391
+612183874 744785674
+1616918661 -1576266493
+1287307158 934240096
+-1027377936 -767660529
+572269732 -174438563
+-585847224 1525271407
+-41789831 -1374285582
+1371436705 -1152105803
+1140253647 -901719441
+1035360671 1945576258
+-149771841 900486983
+331481483 -1969641925
+130688424 205133302
+1840820436 -1984860552
+1859843279 400796689
+-711987201 -777487221
+780081896 -668025684
+-1011773705 -1124166281
+754292215 -1546514148
+777523861 -330287362
+-2130213550 1643350721
+487517734 1360318112
+663699485 -229271791
+-407109495 676861831
+471811303 1593402079
+387289521 500127114
+-1059348472 -1071590125
+-642305040 -124309434
+-719523197 -1093094528
+2135103263 1470901564
+-1808989768 -2023757242
+937058919 1443787991
+-27415580 1226956565
+1687695724 1771328295
+-430032928 1178728881
+1811514890 -1542660087
+1643317429 -1755869373
+-345174443 1548151526
+-1365817848 -596681197
+-1870376931 1671186256
+2116327947 1322277950
+1352095537 -529310259
+261193663 556505828
+498750245 1742917664
+1242717549 594310939
+-428733050 -474565227
+-617943103 -300715413
+2039057394 363068864
+-101829912 1590139008
+-1850211785 -1249212154
+1644629732 -2106349847
+1817148941 -1850036804
+1359867334 1755677075
+1087181784 53970918
+-674056939 -461331937
+1499971995 1289524294
+577600670 -143493479
+-2147344042 -1591610269
+-1209245316 1035144519
+-1415577712 924653287
+-197578875 95135146
+-45463703 248328765
+208979439 1933280883
+953493350 783564890
+-1447937258 -553354878
+273102005 812048225
+-1979726896 -2006964898
+685401195 -193067580
+-1461485630 -2031646970
+1225815447 987577164
+-1533828732 -2146625638
+2049588147 -414214702
+-1010869363 -1885365127
+-1588735657 404737179
+539899022 621386407
+-615855010 380099331
+-455235899 2057102972
+-1430443944 974073802
+-2094872110 34701186
+-1264284868 1902262438
+294140758 -1379616237
+408972048 1093180811
+1757801512 -612406108
+-643444358 -970250684
+2088874307 84298572
+-1344070938 -199254859
+1543207425 1226837273
+-1801018488 1215099203
+-1104610046 -1187173651
+718848326 -1401611705
+1170620315 -1676789349
+105353146 918155683
+901827408 -1745806052
+1776318322 -1787391100
+-1016560167 1097033493
+-1043919338 1543291479
+-1250196885 1022221785
+-286015720 -1055205211
+113525977 1320545951
+-1844487662 1770679888
+-290872044 1837678737
+-1023850565 2134821034
+1167414469 77175078
+1294702810 1192263404
+-672480058 1931944339
+1619575930 1688688827
+686019609 1033481601
+-1001887773 -469260247
+-1277368916 317268548
+1255110483 -960803194
+896213559 -760139444
+476584136 938789849
+-685345424 -1811369133
+583850679 -857184852
+1739828265 321623826
+-1587268606 -939863408
+-1189692636 -23228203
+82487345 509160734
+892865335 -1266600322
+-2014535356 528986619
+-1241582236 452061139
+-399235512 -1607989622
+1089680246 -337477889
+-1280945421 -2049398738
+738718132 617770634
+1112546742 -2139493464
+-355271003 -1136522067
+1880116456 -281291769
+177143434 -310617990
+-1822132997 303085643
+366747140 1399897092
+-1484651998 -1462304179
+1136355572 -1603756712
+1274839369 -763191341
+1876902209 -74235265
+824066874 -1281104604
+1408526719 -669574734
+84413109 -258858541
+-115044206 997067420
+-1531155294 1040604949
+618076100 -1633567316
+2056104197 1228675055
+-2111902414 -514656173
+239260823 294186658
+-1743090097 1401866805
+-1157808540 -2029435328
+709477281 -1184923625
+-427638746 -97984037
+-554214377 -1946665908
+-2139301994 1405163539
+-951490726 -1151128564
+337592648 580844490
+-31271076 945976897
+1581627482 616449008
+-820903593 -886378904
+1865054690 292629516
+1271823238 -2132961603
+-29729353 635604651
+2073377261 1396239505
+-989599508 482025531
+28105921 1566026263
+-22957129 1409726590
+401123788 1844066542
+-1566753187 1776442404
+-2087500327 -1649164979
+-821494605 1873118021
+-549755071 -1954104157
+1322966524 338300923
+-1287022755 -509809669
+-392616867 289738788
+-783192214 1782798458
+-1014946487 -968816968
+632844775 987038913
+-113961353 -940582195
+-363481691 438972646
+172251636 -2091608966
+2129107050 -1878433398
+-415054129 -255212286
+-1385994530 -2133682457
+1638483385 538630542
+-127393846 827353897
+-1215702692 -885702882
+-1846282111 -868129042
+320672089 -805361811
+1773417303 -2028441280
+1707541760 -266050372
+641035648 2089508470
+-1588856152 -1939082148
+1680654855 -1189386972
+1550498717 -915678041
+1151481114 1468522509
+-588437564 -1063552117
+-1453162613 1234676105
+1043509527 1191728770
+-724631416 138546405
+100438495 -461128206
+-388817101 -1754013087
+1553658664 671023158
+1249752024 -1299766529
+2130755024 1520453225
+363384021 321399411
+2032095620 -294553552
+-1865215171 801350874
+-1183991297 1544276553
+-305996201 -1102133185
+1096812014 1763289829
+-149642341 1370879383
+718104464 834091370
+-2094944924 -222909374
+2106733752 -640749324
+-949129631 1555856343
+1671193725 1480746897
+-717567717 -206552942
+290119941 -1468458358
+-422676125 1541097933
+1422293560 373348808
+-1004063888 -271512421
+-1067198754 -446307801
+-369545603 53972157
+506906430 -1694989096
+347050033 83582536
+1718166674 1993823487
+169625464 -548855
+385061473 -1254598875
+-1486310814 -83777791
+1657151444 -855960883
+-1088414767 -1101392531
+-1952655787 751133829
+-1307067215 -1353346914
+139259463 1337704561
+-926863197 -794593188
+1106206123 116411504
+-118423620 1680385163
+-1871678110 2086533676
+-995536554 1201748033
+734235478 -1073011068
+-619131675 -2121983110
+1990741079 -1323386123
+-543567834 -791195399
+26210899 -693792545
+-843650311 -2043785636
+-1996710450 -1196896697
+-1353382453 -1822939257
+1133304810 -1771469729
+461605301 -702762036
+184762678 -423162669
+-1300568854 -261141221
+-991047456 -2030379988
+-684871460 784916120
+-2062915237 -1811139692
+-1765411675 2139710261
+-1883119150 2122485922
+561866379 -486601292
+-1332606651 764875440
+-129046051 -51782531
+801281942 168058252
+838334926 1975993095
+-1204930751 769323039
+-818103900 -1046786290
+1631264586 1510641309
+-467510155 1985829381
+874347113 345162894
+-2014206785 1953439331
+-665303574 417549739
+-2073042726 487602805
+223785357 1711557807
+438834186 -1729841871
+1536500520 -2055496587
+-1582443030 1294129730
+-1031247624 155969479
+539032826 -136343743
+1398736049 1910741278
+-912182479 1631772144
+-1817041980 -2119224796
+-338585496 -1245754256
+1580229869 1663958757
+1361881760 814817622
+667785167 -2114030756
+421291914 937473872
+-691292663 -63509151
+540732431 -337691136
+-201350683 1185439647
+1353281119 542171841
+-824030265 1913070923
+1930956976 -1682862436
+1753260964 668064561
+1724011613 1399434257
+899945451 1729163997
+1084159283 -1738958219
+643495396 1635139786
+52152640 -1486384641
+-1518381075 -452447191
+-1283331214 1167673978
+-1300837243 1870087781
+1056509777 912221895
+-1475196527 754546759
+-2046657939 1919912780
+-1934731744 -1435410308
+-1898530066 494090764
+936660736 -1096768309
+-1157213316 -698915103
+1879611897 -651271852
+1777400714 -1436506678
+1192001343 -1932625175
+735983505 79527084
+1828565797 1082126072
+-1516537306 465994126
+413717591 79315662
+53672331 812263187
+673851609 -1310384944
+-883269380 -2099257268
+-2107607952 1214125374
+-1940088119 1048735223
+865870566 1835772089
+201819197 1785803318
+-2016645345 -913359941
+-1983865721 819770965
+-832547463 1837477514
+1267897651 -1782454936
+1923711545 59539181
+616726901 -1049780280
+665054960 -1983181718
+-1042001463 -1917880630
+160367594 -270813272
+-1182621523 1797152512
+-249939068 -1167192965
+-1698441606 1006772761
+1929954607 137148320
+-644812667 1029741468
+-1650608613 -1550843855
+538808021 -595433234
+-2019536470 941193477
+-1898660206 1679479879
+-2131352800 -1400412348
+-1419963350 -1989963990
+-2049629513 321670541
+-159162204 -1839438736
+-571200157 746029171
+-1696433027 -54984763
+-93675368 1077470140
+877753460 2094956066
+-336885332 1735202678
+-664523558 -367024805
+-1859546497 -1432625460
+-1977811683 -881414431
+-252194663 1872180695
+1925031991 -703839538
+-474076008 -2123952824
+1011483449 -703852574
+1492591488 1568655267
+1075896215 620720092
+-566749586 1799621145
+1027799440 509153580
+1858047288 -566729481
+1005933748 629045506
+1330132506 -629558659
+1280543468 401474870
+-259304942 1190433453
+-1250327701 994326182
+613738515 -831784601
+-1792202022 -205902064
+1553899911 1428748134
+2001483395 -446213370
+1694973887 -389053460
+2022032299 1028702474
+1736370369 -24388593
+919083238 -1544972550
+-1329264100 1685673362
+-1806940161 1158076428
+-1896433051 -126686164
+374417278 714822110
+1858203648 -465552642
+792806289 1841813985
+1897757983 2069111889
+634411953 -457278623
+-1793046128 954523463
+61805682 -574425634
+352038488 114732074
+-1611227738 656632887
+-1679983756 1974851984
+1775076013 -1721142082
+115781606 611719372
+-150459580 -292108182
+1523175470 -1883574428
+-809026808 -1413314796
+1013664306 -1081416464
+-1916307869 -603735769
+255776341 -1954617741
+-1322192713 336325336
+-500831478 -1864597608
+1951734573 -2009784526
+2092065776 -2109684082
+-1493346705 1927408007
+-1656801590 -1736696494
+1899584525 -1629554515
+-422356817 -308564254
+860938823 -633256279
+155406986 1276294349
+372758037 1901850306
+-1655962253 1112129906
+1612242773 559536741
+-1141252989 -1625802642
+-974608811 1276958185
+-435569069 1633447816
+-1824854575 2044008130
+1436582502 -1437739200
+-2102808240 -53367658
+1350634444 1633974053
+2003412859 -637878599
+1932645965 300937323
+-774585102 -175626712
+-2107089693 1842700529
+-126425283 -22960225
+1074355418 -2139405766
+1873170900 -486335245
+975958856 288294250
+-2002603490 1474417761
+-1544658911 -2137911461
+-1976526916 746209653
+-1831576890 -1349730937
+-775479823 -1938867306
+669673671 394512152
+-576900137 2012713230
+-1816548580 -1535289559
+-1200601914 1822487179
+2017925107 -1996222403
+-1307302281 1156567198
+300960481 -2085928849
+-1916381781 -2116776043
+-1241103276 -488674187
+1011660823 827126372
+-291352114 672403542
+-1143445607 1285599961
+-2002621594 267165650
+-1336573883 1496915858
+-1291775372 1743740184
+639828598 1542281571
+-432543551 240110358
+-1509562991 -1095963562
+-771857294 1076803221
+-474133212 24980586
+1777349945 1438087100
+1817787127 -72430858
+1719515510 -443952524
+-1035358156 -955554341
+1957053267 -749994905
+733128809 670978076
+1507708916 106607715
+-418341916 -2036224232
+706069937 -406261230
+-734378486 -1449962500
+1279672444 -1037567628
+173333301 -1024800350
+1862359019 -1386304284
+144581361 -903640163
+682312167 1456696083
+-920651920 -1197157896
+1038155034 -2101239238
+-982291904 679345144
+766328497 -591688790
+739871451 -519585029
+-404387239 1322161372
+17337929 1923510202
+1141773376 -1128357414
+114801267 -732392493
+-1972119630 1177549506
+-1207533974 78818991
+-1048124624 1107482234
+-1387749174 -783361650
+1557877173 1502698520
+1746228007 -1300117690
+447456825 921036121
+654688151 -1716312939
+94363877 28726375
+-302883768 -348393766
+1356010879 -241754718
+1846318220 1034236527
+-905023990 -689356361
+149833357 -891177981
+-1783690569 1127192984
+-1950530200 1289193189
+1942939397 447972447
+1875331913 -1709802039
+416142046 -1306466513
+737593791 -1585279484
+1832951973 1782962504
+660326768 -492578741
+203997008 1341129561
+-1257932670 1962000098
+699820939 509739275
+1676689586 1975949687
+1304716131 -1006703028
+1518747040 -137665817
+-791218264 -6073336
+-2144557680 1133151419
+-2072666619 335781586
+1407990718 -2010414169
+-1962927591 -96243610
+-384146936 -1324696425
+-270950514 -1266843198
+-943482961 -288835157
+2035560647 -1683626869
+-505511662 -89543201
+1790277853 -427322119
+-1721385072 1106960998
+-1680559285 451508798
+-1150828068 -657373215
+1316883314 -108950176
+509977428 1399260741
+-1848744621 555698103
+1918511945 -119063573
+-344808139 1143160518
+-1737090340 900074785
+38803874 334051437
+-934117582 -1000971846
+-1913150800 1575000836
+1873987540 -523446087
+194553256 -549424855
+-875273354 -703354478
+-472847571 1965695846
+1564726597 419395901
+617468293 -1691972996
+1888132761 1301922602
+971069345 753840342
+-1601124968 1780507034
+-204146117 -1765938969
+-920798108 -1116217080
+-2089994029 2142649829
+632999722 -1965875819
+-1930784220 739127796
+608946170 -383705589
+655407937 -1500835169
+-1009743708 -572352625
+-1187165170 2125744402
+1738303193 -1149172678
+526237914 -727137009
+266520290 -582237614
+-629452328 342066375
+1936454852 -900024092
+433470362 682804676
+1588112931 299968975
+128175458 1431647055
+-829558224 348678982
+-418123863 1882500041
+13448653 -1218910266
+-60900583 244443125
+734372573 2073231097
+92791490 1119086893
+1957555642 -1586994352
+-802438535 -1787791349
+-1557142475 994847367
+-998738272 -464388914
+1674800235 1905151958
+935606096 726723984
+-255498772 -1088682682
+-971700289 1244627328
+1615809186 1971762362
+-1649026301 348388524
+-1473031204 -1676474342
+-1787878674 533124982
+-377645856 -807998918
+1597615280 869324311
+-997342863 1360717738
+-2013513641 1782333096
+1681693394 -938942762
+1390203305 -1900879765
+519536326 1628111834
+1599594144 -1792645425
+2115441707 669109081
+470526232 603172926
+1348786485 -1342432481
+1765536011 -1200558153
+641679137 1173538449
+-811249039 395392600
+-1692150649 1055193319
+-246851020 1178139244
+-1825561337 -2110175071
+2079191833 627330710
+1351970349 1368926958
+-2131253144 -1168829129
+676222172 -2146754889
+77964560 -981259960
+662442201 1411520369
+1628838979 -582066220
+-257368804 -1259157957
+-2139839149 1576555878
+1161171890 538475837
+-1471052663 -1397104922
+-324865972 -769984557
+1453880636 -1061429625
+1423476781 2016942803
+-196921045 -121307762
+243060694 465478462
+-142819626 1928264518
+-1947674880 686761339
+339897222 664508332
+-1468044254 -677978934
+1095169693 639939965
+1216116958 -438260404
+-471602451 -1096165242
+-949820797 -1628178081
+800862913 323212368
+-1079944795 -646966998
+-994293303 -421317642
+1535815459 -1596655262
+-109250695 -1308341378
+-2005754719 -1435853427
+-1932292824 -787935194
+-269491008 1149051147
+612817610 -672204902
+-216770624 860413304
+241791005 632420341
+-1892969748 747745633
+-793771017 58633211
+-1063345897 -638250351
+-1665439640 -957165590
+-1373989957 1168483220
+1416322801 1999666597
+887406942 -198039163
+1250157213 220061985
+-1058938528 -897110043
+1472521132 -2037943888
+-163379464 -841064413
+1973958990 700236182
+-1879771251 -1129412734
+1791582468 2060496107
+880501962 638245771
+-828833827 -872596126
+-832952696 106987052
+-1620432493 1891554876
+1401406766 -619344053
+-1119714713 2056908558
+518719653 196961978
+759801458 76914664
+2040038388 -694014566
+-1272163823 1247744835
+333948822 -2130452559
+812228231 -1103557929
+515837553 1591488902
+753128549 1875767008
+-304181696 1636210135
+-2016487528 1451225467
+242311898 493002471
+920467784 1774528131
+-460977278 1375126070
+1850458077 391724984
+-390786845 -760764535
+-1276716500 -774278781
+1363792498 -1595873350
+-1116716210 -1725898896
+-363874522 917251436
+-1499174810 1280909240
+-1716454956 542731419
+-567839113 2029566486
+1534165381 -39988994
+-673124009 -1395793427
+651437279 -9116757
+1973871741 -1726990145
+-1832881905 2060154894
+-1976835750 -609393317
+-1836654132 1036971527
+1954623967 -2005064248
+477115118 -174557524
+1793228683 -284771233
+891064014 -1595760371
+-1998690472 1337208671
+565991092 1935164563
+-256650096 -957542957
+-992616485 458317503
+552487921 -1688511628
+-991663024 915066071
+-1386140934 -400796394
+-492521855 505914917
+-1402764407 652076704
+1077779558 1138282558
+544234448 528841206
+96829490 -1607869980
+-119496055 2076841932
+-992083229 346520161
+272274886 -2064625615
+975896820 -886761959
+-717961574 -162553912
+-1264202883 1828387253
+-1163203041 878280979
+1251731214 564725635
+1971205631 275898329
+695528727 1192981042
+1594475528 139492951
+1204072056 -891823904
+1855775562 1940038023
+-195708411 41485181
+330021915 296964802
+-1022517703 787231816
+-1084383852 958705420
+362353652 -53715644
+10247882 154239862
+-1731207439 -467402030
+233480125 1762181172
+1493701526 -1615824474
+1288051327 762293840
+1323034080 974326040
+1403290934 -1206665419
+-1118363809 -1403633427
+-1334222479 -1960861315
+-366106359 -1888096668
+-76135219 -700466066
+-1288723945 -270963534
+170236927 -854149834
+-893154900 -854605512
+1947369706 964628711
+-172619768 -327216758
+-1191181756 2122561345
+-249008729 -80598873
+-954752707 -1762667337
+1244349399 1622455979
+-1358479321 1121150902
+636856208 -1928506974
+-980184829 1495125682
+-18591809 -317782893
+-408341333 1020028062
+-916664093 -1899577884
+752157712 -489993405
+-395541917 -1624562924
+-1582242938 1805473138
+1332159400 -1504982919
+-679303646 1769448229
+794548739 745517729
+350655364 -2111114207
+-1148290102 1849004399
+644652466 -2128179476
+1707434800 -1512524755
+-271119954 170585956
+-1280920218 -218918561
+-238561758 -1014719832
+2109397139 1699107957
+-655960909 109244012
+709079196 1508776807
+-1422662389 176746283
+299356167 805721529
+-239321294 1719435174
+2053453353 -910996748
+1668451744 1405799975
+-399064533 -2055219476
+1760225728 -591434018
+-1925081498 2069828494
+-724928633 -1863849714
+-618749060 -1409927801
+1409672244 -763997840
+1894584972 965658847
+-1679572434 -397627843
+-1270288803 1545571548
+-59983420 253354045
+-1091934312 -1751693037
+-1029545837 1162197407
+-60606295 -1972909681
+592677234 721715796
+1476187973 -305141384
+-1811943145 769550806
+2096872772 855049459
+-831595770 1360881561
+-991868608 -330517995
+-509037274 130400083
+1552351343 -1277554670
+-281301503 -1510967984
+1030168338 -949551421
+-2086275561 1922380735
+-319297926 1582724996
+241832225 1921307114
+-78762069 872381608
+1760899366 552783320
+-494628691 1872484822
+1859582476 2110381923
+-2121361662 281638450
+-1003267893 1417197494
+-1010411131 -2016826843
+-1304779734 56052749
+656594281 -1195561662
+-1145885546 255870437
+1709593092 -282151419
+501657983 -309227206
+-1368895375 1991345112
+-1934790092 2081605810
+559078476 1970768414
+-1396944972 1375962946
+-469801802 -84837866
+-1105237485 -2107701908
+957300965 970086016
+1811363017 -1874817474
+-841025035 1046128407
+-101655763 -765478385
+981656986 1199599551
+916698367 1786370889
+525387380 1669684251
+-781870867 460098809
+-954024713 2043988957
+848517029 909709234
+-1164802531 1795545806
+1106312348 -1913184506
+1378415570 1268491682
+-851493679 -594662840
+-566300652 -760448165
+1058709829 2087689525
+-1689626035 -4903232
+-2105278890 -242430285
+-1534315197 -138251066
+1304463406 861905952
+1040358230 1078016479
+-1963771248 820226305
+-1051145289 1806014817
+-1821840814 235803567
+-433823880 -1749704097
+1916339670 1830615164
+970995070 75886319
+-3316919 -1239930005
+-1780137130 -1277030369
+-1839078836 -1696101865
+-1182732835 1539734721
+-438308666 1638058081
+-1447043275 400714462
+-2133381036 -2105296877
+47709119 432349918
+-147365818 714877661
+-628608336 -1457414126
+-342506950 -81328756
+2116822330 -1956163642
+-65532820 852636234
+1937768042 402313705
+-533687746 366207868
+1318252007 1235385257
+-825184573 166728153
+427059838 -1208982146
+1469845069 -1763143178
+-911543621 -1692975338
+-750268113 1725806238
+1966307903 203158671
+-683720056 -1876719698
+-369454368 1142130697
+-446294751 -1348733882
+-1933523464 54402825
+505720821 -482370760
+705401249 -740201981
+1045761740 1270763003
+610989136 1877858256
+1056723396 -1861544405
+1903368693 1591112135
+-1291458640 -945287373
+2034569823 474509191
+-1989276663 656948595
+-573827682 1839058567
+-639526446 -1627296701
+1731022190 1110677628
+1952182123 2015232952
+1368495815 1924127027
+671952638 -125848922
+-993500272 -204624208
+-1503785751 -1943192494
+468553792 2058582936
+927745795 -2021111358
+1672254901 2111431890
+615755218 -1369685468
+-653243333 -1838954723
+186050826 1857933031
+263853873 -1968011227
+1697127177 583770427
+1097723674 1805945126
+1075250197 1069530723
+-1398503530 -270205857
+-1103758513 -1486397895
+-1175121905 -2040163647
+-1552552753 -498388288
+-1214318422 -999096537
+1265880247 1191864615
+-356053032 2064294697
+-710462714 -1243891289
+501177294 -1141698003
+1159545215 -1835784379
+-1764664774 -1665187674
+1315995539 -1421529170
+89466755 -1103186494
+-1552379186 1611082001
+1630094338 -166319622
+-1640967313 -1269885955
+-416192021 734766347
+-1257433605 368954093
+241444438 1505228369
+-1281110674 -1587445097
+1364303154 1112606377
+-1842443438 926299292
+-560586331 1092207578
+-754196620 -286421161
+139148859 535306659
+76506894 -1473093674
+-1944852071 1830782548
+-1320298672 -1919609459
+799243689 971988199
+205971748 -1485061923
+-1200457643 1785772137
+-2089008296 -578717802
+-1457066505 -533155948
+-1952687951 -830827325
+1458408684 -1303264734
+1176015349 -1420615854
+527153269 -704283123
+-453030159 -1946072297
+-70040061 -1155156390
+-620491551 1809898789
+24150790 -29600583
+2061278841 294651653
+-1443044736 -2101790263
+-1220785015 -862536004
+-246977011 -190046847
+1838847371 1484647466
+-1724881223 188583183
+-2086144574 -1401900120
+1892075699 -1691382341
+-1814744452 1033546256
+1186602472 507966580
+217292755 1781683442
+-670416513 -1794216941
+467281203 378324833
+65888631 878715905
+380959204 -1059479787
+-1052134513 1387460462
+1784620286 1331225652
+46558049 -1358594636
+-804729941 -1140125540
+1850105641 -254000153
+-795453341 174003686
+53868564 1085156298
+-1998564437 319180230
+913796521 -441650995
+-161675987 510434084
+-1498067872 789599691
+1859377670 158612707
+-299845948 -2048759839
+-272369793 751938647
+-731171299 1493298061
+-1824885916 -283044390
+861797829 -1053140519
+-1240739342 -654291277
+293230554 -1954518273
+-1117091685 -1920965628
+527684442 -1827055709
+556490354 -599167945
+-1715716914 -132465860
+893301356 103869204
+220188484 -1936168804
+-1370525360 -902169206
+-711740388 -1298578778
+1421641004 458907431
+878816077 -1590735980
+-216957651 131256423
+-2094918571 -551297983
+-1719578907 -134901068
+-6332413 1539917149
+1203059017 -1882599639
+234263731 438352660
+-1998285593 -1806531494
+304472939 1106534511
+737025745 1867393412
+132496228 478682105
+-351147096 -1905489172
+-1640029563 -1496647873
+63517167 -906271481
+-1279671727 1228597253
+668834581 18169098
+534815909 1848869295
+-1916687761 -521657171
+1174990970 447074068
+-1605045832 526852916
+410778996 -1538645149
+-1309846326 -1362007979
+-99336750 -268188152
+1032873397 1901330515
+-2033871023 -760512196
+-713288943 1664880020
+1441481568 -1920566699
+1534037387 1616513459
+-1516473725 885112958
+1271080264 655539909
+-795233732 346194063
+-1414046187 -870674743
+-1726325331 -675472980
+709055242 2138656974
+-815296131 -691258416
+43794240 1206639335
+-2115580426 985026596
+1649809039 1716385099
+-1238284957 -1100268102
+1505123474 -754243674
+535386782 1097503224
+1178357046 -1475329244
+839902703 1823968534
+199022090 675721331
+-1524327942 33069447
+1204755734 -748477598
+1034070636 -1181220924
+-488748153 3789741
+1711857677 -873423018
+-1667475904 1505329292
+1594496220 485234845
+1780221089 -1458606462
+383441490 1976558516
+-1656568798 983292274
+687370078 -1907250088
+-351355982 -1372284016
+-1808485147 78584151
+-328629777 160525709
+-2146636037 -2022138808
+-1340120842 375189885
+-2056951488 -657194859
+-1245257790 1982456278
+1880340505 -1710538245
+-833034918 672259743
+-347387695 -1930385039
+1721717813 1706744521
+-458631110 -1781371982
+553855406 -2378385
+-1639477015 183401705
+-1106754833 -659149319
+-1296017614 -1207002694
+-1240573705 -936817586
+-132008091 471901189
+516068176 1659517776
+-25495160 -300772260
+1160021939 -1119918307
+1731518670 1926170091
+-1654746709 1631519483
+-628015900 226109805
+1670683104 -938552689
+1584861072 339046146
+-1922625103 1672033229
+1951267680 -2126759919
+-372586431 654125071
+-594051942 1747909431
+-1346391281 -1251079426
+-1965507576 -1043209675
+-2008722097 1432426091
+-1434772993 -1503574682
+2126922426 1067375810
+1570542918 -711967882
+1859684252 -850750558
+1386987631 -337647991
+1993366468 1659936966
+1058490450 -1295581013
+-23804290 1945454478
+-1087889833 -1704413459
+1790845687 1705134114
+479855153 689350048
+-48727064 1777023629
+-1499163464 -1183917994
+-702872376 2093384498
+1766189962 1116220965
+796527367 -1023032417
+1249130706 2027666570
+-1242148888 -584998500
+-1379958865 -1486584142
+-833997147 83828099
+372233100 512161809
+-483562324 856574555
+-1404699716 -176447370
+1390497122 1625196840
+-641264619 -598203149
+-1148528082 1791922295
+-368848220 2132512699
+515171984 1663579782
+887576251 720489322
+250034355 1109721776
+-1446596581 -188577952
+-33472766 1525717382
+-1701310819 1984748099
+-466714269 1984649804
+-978238339 -880352220
+-1637796009 -2022751903
+-62270990 -1589288422
+-662194112 442284920
+1653073185 918634267
+559962469 -1850310408
+1771435110 -1617730094
+20261735 -463725633
+-267834422 1014145543
+1309676769 -2131345014
+2078030418 1362895927
+632285646 -1047315017
+446783632 211307517
+-1912792630 996172853
+-1633137271 -249676860
+365846096 -1436995793
+-596398283 -2123785303
+-1600572633 -268376147
+-2117972445 820123810
+1851924443 1088040679
+975291573 21442543
+21587009 2065376153
+1441344444 832392722
+559733168 -604502472
+-1113224705 -1434558074
+1646611693 1459829175
+1796591765 736669447
+-1851739166 -1890296110
+706281487 -1198905648
+1885587141 1763286781
+166468276 -484910254
+620591673 -1572242138
+-2041320574 -603568725
+834939072 896126825
+-531256070 555159928
+878656363 511457913
+-1635472682 1319797878
+953773624 562203336
+-1124895681 1908313360
+28091837 -305404432
+-2004298640 -498808002
+-1980716736 1213213317
+-1179646635 546489593
+743626740 873009567
+-1343112160 130939566
+-1577896429 -776209492
+1310349677 989072090
+-872858561 -2020960838
+2147119887 1229470378
+-870359560 -1239233464
+123848286 -1717934222
+-1541335562 651566511
+-69366224 1641135443
+-1341863317 1957176288
+-1038528436 493684733
+-1808868594 1386105402
+-1450862284 -420553551
+945574077 -2104856673
+-1309139797 -118444126
+399219387 -1261033656
+-151909072 -587308770
+1270089092 -1681368071
+1550296132 1007437457
+388077422 -1585027747
+-859072967 1133430070
+-2015103580 -1496332554
+-1492465199 -1026741607
+16346657 -745045497
+154381053 -69833157
+997818801 -420022171
+1031795940 -14099558
+-1396419118 -163688022
+-607694434 -738097001
+-1755159454 -997208736
+-358508174 151252825
+-1431673344 1512765875
+748439517 -930963204
+86090045 1505282996
+-121794035 2028467472
+-683951418 -595287791
+-1779434952 -1611624933
+-1840691084 1801172690
+496702184 -2038465791
+-1128203267 -1289361455
+-67692429 -1821050027
+-1449833350 318162093
+1708917863 -1360670261
+2034586430 -1351039172
+-1120798590 1451444196
+1976007795 -332030712
+294736889 -2103926666
+513061124 -601603191
+-635268352 -1808753796
+58152642 424277592
+-1575030815 -267934034
+1845826355 -1118758961
+2032092001 -1930852978
+-1117237033 -879124416
+-1743468299 -212794539
+-307273778 -387912512
+363962135 -35480975
+2020139558 -260181219
+1446971626 -793081508
+456196951 -473677764
+-1815400656 -1643291321
+1931475596 529096976
+-5724732 -1267088501
+-2126787086 -1168378195
+594579951 -490852251
+1859033123 1950304714
+679620324 -1379587761
+72449621 459525143
+1201407307 -21239688
+-659195246 -1696534091
+1406748699 -386167059
+-813498397 -203564775
+-979203929 -1922338891
+-1214025864 592466879
+-1603442986 -1342561333
+204569361 2139396751
+1355986100 1249204998
+-2028506925 760170497
+-820439711 228635729
+-992409983 1645259343
+1699927090 774418213
+1365826862 -1922377647
+-1163542484 -1946956116
+1147999006 913009849
+-2012709882 -746260583
+1597960448 1012134944
+-1618887809 -2134870994
+996298321 1069765860
+614184949 -1540266681
+1824478147 32478319
+1260237111 1254566648
+-1177333213 1180185652
+-1170737781 -452178450
+-943044218 -143900581
+-1817602569 -1960604850
+1099111161 -998009006
+286830121 -1035006295
+-200492217 191340103
+-1230773860 -1224917755
+-195680155 -1543859830
+-1873028542 1004715431
+-1841589539 118492086
+668521998 1190872296
+-1456585535 1878324909
+253292424 1553481849
+-1322334616 270917657
+-1843700026 671670643
+990677368 2086566190
+1311913235 1308680522
+-2106373619 -1490840229
+938123940 2024131416
+-193459532 733078335
+1622614283 -1494736147
+-1554981953 -1931073710
+1329810796 -1272404338
+-1423810142 1975879260
+-1606055437 -745966521
+-1610353088 147599141
+-96026047 -734713393
+-472982974 -902078039
+-1417533241 -1734281205
+-970661924 408598669
+1359884229 -234149886
+-871105994 -1207798865
+1963429150 1388135402
+-1411501783 -1045107861
diff --git a/src/boost/libs/polygon/benchmark/input_data/voronoi_segment.txt b/src/boost/libs/polygon/benchmark/input_data/voronoi_segment.txt
new file mode 100644
index 000000000..bb7e3028d
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/input_data/voronoi_segment.txt
@@ -0,0 +1,5915 @@
+5914
+-974944161 -1462225549 -1038624817 -1509057224
+-915606392 -1418587696 -974944161 -1462225549
+-898682283 -1406141461 -915606392 -1418587696
+-891067100 -1400541146 -898682283 -1406141461
+-810549462 -1341327310 -891067100 -1400541146
+-809534544 -1340580925 -810549462 -1341327310
+-649076248 -1222577575 -809534544 -1340580925
+-637799181 -1214284257 -649076248 -1222577575
+-621612957 -1202380674 -637799181 -1214284257
+-512886046 -1122421331 -621612957 -1202380674
+-475133347 -1094657450 -512886046 -1122421331
+-467566090 -1089092380 -475133347 -1094657450
+-370726603 -1017875222 -467566090 -1089092380
+-297755734 -964211390 -370726603 -1017875222
+-228670454 -913405076 -297755734 -964211390
+-175985832 -874660044 -228670454 -913405076
+-139031540 -847483323 -175985832 -874660044
+-118290553 -832230101 -139031540 -847483323
+-103700505 -821500369 -118290553 -832230101
+2059167 -743723177 -103700505 -821500369
+30209841 -723020764 2059167 -743723177
+52423862 -706684252 30209841 -723020764
+68447119 -694900518 52423862 -706684252
+77685909 -688106177 68447119 -694900518
+87227650 -681089043 77685909 -688106177
+87240729 -681079425 87227650 -681089043
+116618421 -659474646 87240729 -681079425
+128795136 -650519713 116618421 -659474646
+174003914 -617272524 128795136 -650519713
+174668635 -616783679 174003914 -617272524
+238137275 -570107924 174668635 -616783679
+249269848 -561920868 238137275 -570107924
+263799686 -551235416 249269848 -561920868
+276345219 -542009249 263799686 -551235416
+290797714 -531380675 276345219 -542009249
+325169335 -506103288 290797714 -531380675
+374371774 -469919103 325169335 -506103288
+399372493 -451533213 374371774 -469919103
+432873135 -426896356 399372493 -451533213
+488858857 -385723647 432873135 -426896356
+491399963 -383854881 488858857 -385723647
+644323628 -271392607 491399963 -383854881
+682298742 -243465159 644323628 -271392607
+683192809 -242807650 682298742 -243465159
+683444575 -242622497 683192809 -242807650
+689361812 -238270875 683444575 -242622497
+704016629 -227493511 689361812 -238270875
+705413580 -226466173 704016629 -227493511
+711533244 -221965684 705413580 -226466173
+793886739 -161401733 711533244 -221965684
+832522702 -132988287 793886739 -161401733
+-1783887806 296249582 -1808672228 -19822944
+-1780594780 338245126 -1783887806 296249582
+-1750460887 722538759 -1780594780 338245126
+-1748677306 745284543 -1750460887 722538759
+-1740375989 851150154 -1748677306 745284543
+-1251457156 273868793 -1215947358 299706144
+-1215947358 299706144 -1132488515 360431791
+-1132488515 360431791 -1085705634 394471571
+-1085705634 394471571 -1031887649 433630176
+-1031887649 433630176 -987743478 465750000
+-987743478 465750000 -977792174 472990687
+-977792174 472990687 -974245814 475571061
+-974245814 475571061 -955327929 489335939
+-955327929 489335939 -884935805 540554086
+-884935805 540554086 -884398703 540944887
+-884398703 540944887 -866093453 554264005
+-866093453 554264005 -856767628 561049586
+-856767628 561049586 -841752249 571974954
+-841752249 571974954 -814253044 591983703
+-814253044 591983703 -776845150 619202131
+-776845150 619202131 -757596950 633207350
+-757596950 633207350 -718716491 661497234
+-718716491 661497234 -673554360 694357738
+-673554360 694357738 -649203002 712076075
+-649203002 712076075 -616910099 735572775
+-616910099 735572775 -504225877 817563155
+-504225877 817563155 -493415141 825429176
+-493415141 825429176 -479698251 835409748
+-479698251 835409748 -460415955 849439776
+-460415955 849439776 -427930228 873076777
+-427930228 873076777 -427757773 873202257
+-427757773 873202257 -279368610 981171976
+-279368610 981171976 -257737570 996910978
+-257737570 996910978 -211687605 1030417480
+-211687605 1030417480 -117514496 1098938954
+-117514496 1098938954 -64112948 1137794555
+-64112948 1137794555 -63394440 1138317350
+-63394440 1138317350 -48647651 1149047289
+-48647651 1149047289 -44361697 1152165800
+-44361697 1152165800 23025520 1201197541
+23025520 1201197541 138910768 1285517025
+138910768 1285517025 355982459 1443460968
+355982459 1443460968 392816666 1470261974
+392816666 1470261974 438295262 1503352742
+1254444672 1473301628 1009753850 1459506392
+1336350173 1477919315 1254444672 1473301628
+1359652523 1479233061 1336350173 1477919315
+1617477729 1493768790 1359652523 1479233061
+1643202699 1495219119 1617477729 1493768790
+-1838978143 -1129228660 -1891222925 -1127796015
+-1650658806 -1134392710 -1838978143 -1129228660
+-1554022976 -1137042636 -1650658806 -1134392710
+-1523348866 -1137883774 -1554022976 -1137042636
+-1477133038 -1139151094 -1523348866 -1137883774
+-1467799718 -1139407030 -1477133038 -1139151094
+-569100327 1033813901 -572938000 1042330598
+-479698251 835409748 -569100327 1033813901
+-467401532 808120448 -479698251 835409748
+-466522027 806168620 -467401532 808120448
+-442178886 752145488 -466522027 806168620
+-433958329 733902146 -442178886 752145488
+-432489669 730642846 -433958329 733902146
+-418765513 700185728 -432489669 730642846
+-377612439 608857416 -418765513 700185728
+-355109701 558918567 -377612439 608857416
+-346816555 540514134 -355109701 558918567
+-334168609 512445379 -346816555 540514134
+-300857192 438519540 -334168609 512445379
+-283569820 400154810 -300857192 438519540
+-279449855 391011644 -283569820 400154810
+-275700213 382690309 -279449855 391011644
+-263041922 354598595 -275700213 382690309
+-259481354 346696861 -263041922 354598595
+-240644222 304892852 -259481354 346696861
+-238185642 299436687 -240644222 304892852
+-215125406 248260621 -238185642 299436687
+-203439407 222326651 -215125406 248260621
+-197562816 209285118 -203439407 222326651
+-188135354 188363373 -197562816 209285118
+-180206438 170767250 -188135354 188363373
+-176704835 162996374 -180206438 170767250
+-135110441 70688668 -176704835 162996374
+-132207420 64246185 -135110441 70688668
+-130367868 60163787 -132207420 64246185
+-108305406 11202014 -130367868 60163787
+-106637565 7500685 -108305406 11202014
+-75139838 -62400151 -106637565 7500685
+-50884193 -116229109 -75139838 -62400151
+-45411564 -128374156 -50884193 -116229109
+-25816638 -171859886 -45411564 -128374156
+-3137958 -222189191 -25816638 -171859886
+12853625 -257678260 -3137958 -222189191
+13547887 -259218991 12853625 -257678260
+15098323 -262659771 13547887 -259218991
+21080809 -275936309 15098323 -262659771
+50144200 -340434784 21080809 -275936309
+56241770 -353966718 50144200 -340434784
+94933026 -439831681 56241770 -353966718
+108454728 -469839505 94933026 -439831681
+108634529 -470238527 108454728 -469839505
+111086491 -475680004 108634529 -470238527
+150271393 -562640483 111086491 -475680004
+169644778 -605634561 150271393 -562640483
+174668635 -616783679 169644778 -605634561
+191162266 -653386909 174668635 -616783679
+211474136 -698463708 191162266 -653386909
+215543397 -707494350 211474136 -698463708
+224956510 -728384254 215543397 -707494350
+235838632 -752534231 224956510 -728384254
+265014447 -817282201 235838632 -752534231
+265576487 -818529499 265014447 -817282201
+287737604 -867710210 265576487 -818529499
+293308161 -880072581 287737604 -867710210
+302578356 -900645316 293308161 -880072581
+330746242 -963156455 302578356 -900645316
+339207147 -981933185 330746242 -963156455
+366859849 -1043301010 339207147 -981933185
+381728991 -1076299118 366859849 -1043301010
+383250032 -1079674666 381728991 -1076299118
+425581702 -1173618559 383250032 -1079674666
+506688972 -1353614592 425581702 -1173618559
+513453041 -1368625646 506688972 -1353614592
+517098866 -1376716585 513453041 -1368625646
+595067677 -1549747645 517098866 -1376716585
+669561781 -1715067513 595067677 -1549747645
+743867371 -1879969025 669561781 -1715067513
+266694561 678391819 261979416 687935316
+269165862 673389883 266694561 678391819
+282095638 647219900 269165862 673389883
+284801752 641742701 282095638 647219900
+327629867 555058211 284801752 641742701
+333032028 544124187 327629867 555058211
+368536625 472262563 333032028 544124187
+382330155 444344335 368536625 472262563
+386371851 436163905 382330155 444344335
+393068578 422609669 386371851 436163905
+418630905 370871290 393068578 422609669
+419055076 370012764 418630905 370871290
+437341709 333000453 419055076 370012764
+438402729 330852939 437341709 333000453
+472348857 262145670 438402729 330852939
+486567257 233367501 472348857 262145670
+489939957 226541125 486567257 233367501
+503815848 198456197 489939957 226541125
+552321299 100280727 503815848 198456197
+560640019 83443563 552321299 100280727
+575749530 52861777 560640019 83443563
+582775377 38641400 575749530 52861777
+610346581 -17162967 582775377 38641400
+628133987 -53164836 610346581 -17162967
+666544124 -130907299 628133987 -53164836
+685687598 -169653862 666544124 -130907299
+686885015 -172077446 685687598 -169653862
+689440316 -177249398 686885015 -172077446
+704810579 -208358949 689440316 -177249398
+711533244 -221965684 704810579 -208358949
+717434616 -233910114 711533244 -221965684
+721596891 -242334595 717434616 -233910114
+723465290 -246116252 721596891 -242334595
+725217058 -249661846 723465290 -246116252
+736130733 -271751223 725217058 -249661846
+811344220 -423983999 736130733 -271751223
+849958649 -502139950 811344220 -423983999
+855605046 -513568308 849958649 -502139950
+864384125 -531337243 855605046 -513568308
+874184216 -551172717 864384125 -531337243
+905490586 -614537092 874184216 -551172717
+979195490 -763716480 905490586 -614537092
+1006368765 -818715434 979195490 -763716480
+1028737988 -863990943 1006368765 -818715434
+1031534599 -869651310 1028737988 -863990943
+1050152606 -907334322 1031534599 -869651310
+1096174672 -1000483399 1050152606 -907334322
+1109797068 -1028055251 1096174672 -1000483399
+1188907597 -1188175675 1109797068 -1028055251
+1203586301 -1217885504 1188907597 -1188175675
+1207972326 -1226762859 1203586301 -1217885504
+1245254575 -1302222467 1207972326 -1226762859
+1342122651 -1498284323 1245254575 -1302222467
+1529449927 -1877436419 1342122651 -1498284323
+1661905242 -2145527168 1529449927 -1877436419
+-1530043239 -1276258013 -1524970410 -1288445414
+-1524970410 -1288445414 -1511364611 -1321133150
+-1511364611 -1321133150 -1493502751 -1364046012
+-1493502751 -1364046012 -1470219002 -1419984884
+-1470219002 -1419984884 -1374624200 -1649650020
+-1374624200 -1649650020 -1339488917 -1734062031
+-1339488917 -1734062031 -1324164325 -1770879144
+-1324164325 -1770879144 -1322228593 -1775529710
+-1419527418 -1881385304 -1662450753 -2104484427
+-1361069435 -1827697895 -1419527418 -1881385304
+-973103385 -1471392539 -1361069435 -1827697895
+-915606392 -1418587696 -973103385 -1471392539
+-899514389 -1403808911 -915606392 -1418587696
+-896141766 -1400711517 -899514389 -1403808911
+-824944236 -1335324195 -896141766 -1400711517
+-816035177 -1327142176 -824944236 -1335324195
+-689170179 -1210630233 -816035177 -1327142176
+-680498113 -1202665867 -689170179 -1210630233
+-650198163 -1174838601 -680498113 -1202665867
+-521991700 -1057094666 -650198163 -1174838601
+-488028472 -1025903071 -521991700 -1057094666
+-443008387 -984556934 -488028472 -1025903071
+-418018751 -961606624 -443008387 -984556934
+-385057860 -931335569 -418018751 -961606624
+-373541211 -920758757 -385057860 -931335569
+-339267362 -889281889 -373541211 -920758757
+-243685125 -801499820 -339267362 -889281889
+-172109341 -735765111 -243685125 -801499820
+-100915353 -670381042 -172109341 -735765111
+-93934253 -663969647 -100915353 -670381042
+-82268622 -653256012 -93934253 -663969647
+-79567364 -650775195 -82268622 -653256012
+-43900388 -618018889 -79567364 -650775195
+-31745214 -606855661 -43900388 -618018889
+8583463 -569818081 -31745214 -606855661
+27737924 -552226755 8583463 -569818081
+46906000 -534622927 27737924 -552226755
+51314826 -530573890 46906000 -534622927
+59609651 -522955980 51314826 -530573890
+111086491 -475680004 59609651 -522955980
+114348807 -472683916 111086491 -475680004
+115029712 -472058577 114348807 -472683916
+118439401 -468927142 115029712 -472058577
+148322477 -441482731 118439401 -468927142
+285224729 -315752643 148322477 -441482731
+294497472 -307236619 285224729 -315752643
+296927374 -305005014 294497472 -307236619
+309056640 -293865579 296927374 -305005014
+353640250 -252920298 309056640 -293865579
+357252874 -249602489 353640250 -252920298
+368210932 -239538684 357252874 -249602489
+422444580 -189730874 368210932 -239538684
+433645260 -179444246 422444580 -189730874
+477630889 -139048147 433645260 -179444246
+483988743 -133209137 477630889 -139048147
+512512207 -107013384 483988743 -133209137
+553125994 -69713960 512512207 -107013384
+570619967 -53647616 553125994 -69713960
+610346581 -17162967 570619967 -53647616
+682735100 49318152 610346581 -17162967
+773024578 132239388 682735100 49318152
+786371776 144497363 773024578 132239388
+817337032 172935641 786371776 144497363
+833102554 187414589 817337032 172935641
+839482277 193273682 833102554 187414589
+846034627 199291316 839482277 193273682
+863410696 215249378 846034627 199291316
+890170710 239825591 863410696 215249378
+940581640 286122643 890170710 239825591
+1047386985 384211938 940581640 286122643
+1077735403 412083717 1047386985 384211938
+1093055122 426153242 1077735403 412083717
+1116502666 447687305 1093055122 426153242
+1149615463 478097870 1116502666 447687305
+1171949099 498608928 1149615463 478097870
+1178868206 504963388 1171949099 498608928
+1429342826 734997559 1178868206 504963388
+1495490016 795746684 1429342826 734997559
+1514395210 813109084 1495490016 795746684
+1525463786 823274389 1514395210 813109084
+1581727981 874947039 1525463786 823274389
+1675288804 960872656 1581727981 874947039
+1954660881 1217446053 1675288804 960872656
+1970004780 1231537784 1954660881 1217446053
+-1841807027 2054792830 -1594067594 1622002104
+-1594067594 1622002104 -1424956812 1326572439
+-1424956812 1326572439 -1284686902 1081526605
+-1284686902 1081526605 -1258422764 1035644222
+-1258422764 1035644222 -1254488811 1028771766
+-1254488811 1028771766 -1239399839 1002411946
+-1239399839 1002411946 -1230888686 987543307
+-1230888686 987543307 -1192479064 920443259
+-1975973431 -1379384408 -1917486379 -1190259724
+-1917486379 -1190259724 -1702661548 -495598655
+-1702661548 -495598655 -1675411221 -407481554
+-1675411221 -407481554 -1641969443 -299343676
+-1641969443 -299343676 -1623721631 -240337254
+-1623721631 -240337254 -1584254163 -112714608
+-1584254163 -112714608 -1484040859 211336764
+-1484040859 211336764 -1475673460 238393721
+-1475673460 238393721 -1469496873 258366432
+-1469496873 258366432 -1451585677 316284367
+-1451585677 316284367 -1424810854 402863872
+-1424810854 402863872 -1423619267 406717007
+-1423619267 406717007 -1393669571 503562831
+-1393669571 503562831 -1382161046 540776986
+-1382161046 540776986 -1372663700 571487759
+-1372663700 571487759 -1370224565 579374985
+-1370224565 579374985 -1361238492 608432496
+-1361238492 608432496 -1269267021 905832943
+-1269267021 905832943 -1244465318 986032132
+-1244465318 986032132 -1239399839 1002411946
+-1239399839 1002411946 -1235304962 1015653207
+-1235304962 1015653207 -1213864696 1084982800
+-1213864696 1084982800 -1213734911 1085402475
+-1213734911 1085402475 -1193213787 1151759917
+-1193213787 1151759917 -1150872189 1288676396
+-1150872189 1288676396 -1142123619 1316965914
+-1142123619 1316965914 -1095566635 1467513335
+-94723021 1710432269 -50781240 1630514321
+-50781240 1630514321 -19253174 1573173489
+-19253174 1573173489 77135680 1397868824
+77135680 1397868824 138910768 1285517025
+138910768 1285517025 191462818 1189939381
+191462818 1189939381 206289551 1162973655
+206289551 1162973655 212363081 1151927583
+212363081 1151927583 233709142 1113105002
+233709142 1113105002 243150839 1095933167
+243150839 1095933167 243585334 1095142939
+243585334 1095142939 315869254 963678483
+315869254 963678483 326988210 943456176
+326988210 943456176 369313041 866479014
+369313041 866479014 369747460 865688928
+369747460 865688928 378274912 850179850
+378274912 850179850 381560971 844203419
+381560971 844203419 384991401 837964414
+384991401 837964414 414717390 783901062
+414717390 783901062 439306344 739180557
+439306344 739180557 450718069 718425785
+450718069 718425785 464750648 692904404
+464750648 692904404 476788154 671011510
+476788154 671011510 477628357 669483413
+477628357 669483413 535483429 564261039
+535483429 564261039 548162801 541200768
+548162801 541200768 632191050 388376625
+632191050 388376625 634394837 384368546
+634394837 384368546 635437864 382471568
+635437864 382471568 638595781 376728190
+638595781 376728190 638641085 376645795
+638641085 376645795 639548466 374995519
+639548466 374995519 674801155 310880629
+674801155 310880629 702075470 261276194
+702075470 261276194 711101352 244860610
+711101352 244860610 715407351 237029189
+715407351 237029189 738609385 194831107
+738609385 194831107 753654158 167468826
+753654158 167468826 770750466 136375369
+770750466 136375369 773024578 132239388
+773024578 132239388 797906416 86986208
+797906416 86986208 804602982 74807007
+804602982 74807007 821138265 44733899
+821138265 44733899 823102375 41161728
+823102375 41161728 840984488 8639108
+840984488 8639108 843302717 4422893
+843302717 4422893 928210208 -150000351
+928210208 -150000351 933870419 -160294709
+933870419 -160294709 951268016 -191936126
+951268016 -191936126 974971004 -235045305
+974971004 -235045305 993827484 -269340027
+993827484 -269340027 1008940624 -296826648
+1008940624 -296826648 1018358603 -313955348
+1018358603 -313955348 1056217176 -382809621
+1056217176 -382809621 1106980115 -475133367
+1106980115 -475133367 1130424818 -517772797
+1130424818 -517772797 1271902178 -775080985
+1271902178 -775080985 1288699405 -805630494
+1288699405 -805630494 1330924198 -882425714
+1330924198 -882425714 1410652056 -1027428637
+1410652056 -1027428637 1562808452 -1304159038
+1562808452 -1304159038 1627435442 -1421697658
+1627435442 -1421697658 1629878157 -1426140279
+-1677964111 530045439 -1659646703 528339135
+-1659646703 528339135 -1618898284 524543338
+-1618898284 524543338 -1577813320 520716191
+-1577813320 520716191 -1528881399 516158084
+-1528881399 516158084 -1494389352 512945081
+-1494389352 512945081 -1393669571 503562831
+-1393669571 503562831 -1286532514 493582799
+-1286532514 493582799 -1283711185 493319987
+-1283711185 493319987 -1104184994 476596761
+-1104184994 476596761 -987743478 465750000
+-987743478 465750000 -970546751 464148091
+-970546751 464148091 -963605873 463501534
+-963605873 463501534 -946386552 461897520
+-946386552 461897520 -870475710 454826272
+-870475710 454826272 -834481633 451473352
+-834481633 451473352 -820071170 450130988
+-820071170 450130988 -786506708 447004391
+-786506708 447004391 -730921043 441826475
+-730921043 441826475 -692693959 438265545
+-692693959 438265545 -566951295 426552364
+-566951295 426552364 -552507171 425206864
+-552507171 425206864 -520698361 422243810
+-520698361 422243810 -485543254 418969041
+-485543254 418969041 -410381387 411967562
+-410381387 411967562 -366301608 407861442
+-366301608 407861442 -283569820 400154810
+-283569820 400154810 -268012040 398705572
+-268012040 398705572 -245571474 396615188
+-245571474 396615188 -203690100 392713854
+-203690100 392713854 -189990197 391437680
+-189990197 391437680 -187741798 391228237
+-187741798 391228237 -179604766 390470257
+-179604766 390470257 -174492578 389994046
+-174492578 389994046 -149421318 387658608
+-149421318 387658608 -98602759 382924757
+-98602759 382924757 -45451316 377973593
+-45451316 377973593 -30498183 376580679
+-30498183 376580679 11567353 372662190
+11567353 372662190 15350326 372309798
+15350326 372309798 64889761 367695100
+64889761 367695100 84288035 365888112
+84288035 365888112 89983696 365357550
+89983696 365357550 114011375 363119323
+114011375 363119323 212328613 353960875
+212328613 353960875 283018210 347375997
+283018210 347375997 334031986 342623962
+334031986 342623962 339074526 342154239
+339074526 342154239 380750380 338272049
+380750380 338272049 437341709 333000453
+437341709 333000453 444768174 332308663
+444768174 332308663 545264630 322947217
+545264630 322947217 552114950 322309096
+552114950 322309096 577126564 319979213
+577126564 319979213 619649223 316018142
+619649223 316018142 632173595 314851472
+632173595 314851472 674801155 310880629
+674801155 310880629 885447065 291258540
+885447065 291258540 940581640 286122643
+940581640 286122643 1010998842 279563139
+1010998842 279563139 1011119742 279551877
+1011119742 279551877 1037746618 277071530
+1037746618 277071530 1040807769 276786378
+1040807769 276786378 1071548353 273922831
+1071548353 273922831 1102471971 271042234
+1102471971 271042234 1272027575 255247789
+1272027575 255247789 1300054802 252636996
+1300054802 252636996 1337864198 249114975
+1337864198 249114975 1357339651 247300798
+1357339651 247300798 1529682216 231246742
+1529682216 231246742 1549105866 229437390
+1549105866 229437390 1678621791 217372721
+1678621791 217372721 1877897362 198809802
+-724280153 -805303633 -700385611 -810515466
+-700385611 -810515466 -658545656 -819641517
+-658545656 -819641517 -551845484 -842914755
+-551845484 -842914755 -546938364 -843985086
+-546938364 -843985086 -515384604 -850867532
+-515384604 -850867532 -510128171 -852014056
+-510128171 -852014056 -483191059 -857889527
+-483191059 -857889527 -410665263 -873708715
+-410665263 -873708715 -339267362 -889281889
+-339267362 -889281889 -299532949 -897948684
+-299532949 -897948684 -228670454 -913405076
+-228670454 -913405076 -195452913 -920650423
+-195452913 -920650423 -75762666 -946757031
+-75762666 -946757031 -51434299 -952063488
+-51434299 -952063488 124113237 -990353581
+124113237 -990353581 141919122 -994237367
+141919122 -994237367 144727916 -994850016
+144727916 -994850016 184761617 -1003582091
+184761617 -1003582091 247255603 -1017213160
+247255603 -1017213160 291462957 -1026855583
+291462957 -1026855583 325950011 -1034377834
+325950011 -1034377834 330616905 -1035395768
+330616905 -1035395768 366859849 -1043301010
+366859849 -1043301010 385084227 -1047276076
+385084227 -1047276076 479651392 -1067902886
+479651392 -1067902886 607917662 -1095880080
+607917662 -1095880080 806020087 -1139089803
+806020087 -1139089803 881779556 -1155614314
+881779556 -1155614314 893402995 -1158149596
+893402995 -1158149596 1010119613 -1183607602
+1010119613 -1183607602 1177489661 -1220114038
+1177489661 -1220114038 1207972326 -1226762859
+1207972326 -1226762859 1233732538 -1232381627
+1233732538 -1232381627 1280448974 -1242571327
+1280448974 -1242571327 1376706434 -1263566821
+1376706434 -1263566821 1408401397 -1270480065
+1408401397 -1270480065 1562808452 -1304159038
+1562808452 -1304159038 1566834289 -1305037145
+-1420635840 -361967957 -1416134622 -373607351
+-1416134622 -373607351 -1393778460 -431416622
+-1393778460 -431416622 -1327246341 -603457484
+-1327246341 -603457484 -1316097638 -632286154
+-1316097638 -632286154 -1315345182 -634231878
+-1315345182 -634231878 -1289199735 -701839603
+-1289199735 -701839603 -1223757613 -871061914
+-1223757613 -871061914 -1201699946 -928099330
+-1201699946 -928099330 -1187578015 -964616265
+-1187578015 -964616265 -1145232409 -1074114874
+-1145232409 -1074114874 -1122173796 -1133740568
+-1122173796 -1133740568 -1093497210 -1207893391
+-1093497210 -1207893391 -1077540096 -1249155803
+-1077540096 -1249155803 -1074253792 -1257653632
+-1074253792 -1257653632 -1057480445 -1301026682
+-595026207 466007926 -592955936 466809664
+-592955936 466809664 -526603237 492505569
+-526603237 492505569 -509869121 498986063
+-509869121 498986063 -380566085 549060267
+-380566085 549060267 -355109701 558918567
+-355109701 558918567 -333595955 567250032
+-333595955 567250032 -317316933 573554285
+-317316933 573554285 -306348526 577801937
+-306348526 577801937 -214144547 613509071
+-214144547 613509071 -203560381 617607921
+-203560381 617607921 -173591796 629213627
+-173591796 629213627 -143642817 640811740
+-143642817 640811740 -947034 696072451
+-947034 696072451 53517266 717164427
+53517266 717164427 89219676 730990628
+89219676 730990628 99732786 735061960
+99732786 735061960 205056965 775850054
+205056965 775850054 310186759 816562871
+310186759 816562871 371984171 840494684
+371984171 840494684 381560971 844203419
+381560971 844203419 411505617 855799854
+411505617 855799854 459027519 874203300
+459027519 874203300 490900735 886546598
+490900735 886546598 528408205 901071831
+528408205 901071831 584920051 922956744
+584920051 922956744 735843539 981403736
+735843539 981403736 788821233 1001920005
+788821233 1001920005 789353949 1002126306
+789353949 1002126306 839877966 1021692358
+839877966 1021692358 979118597 1075615019
+979118597 1075615019 1023077127 1092638504
+1023077127 1092638504 1255165533 1182517617
+1255165533 1182517617 1317601206 1206696606
+1317601206 1206696606 1418651548 1245829604
+1418651548 1245829604 1421142513 1246794260
+1421142513 1246794260 1453696434 1259401170
+1453696434 1259401170 1542608344 1293833410
+-1249990843 -38058074 -1255593782 -39252799
+-1158456167 -18539963 -1249990843 -38058074
+-1131296872 -12748735 -1158456167 -18539963
+-1115100956 -9295249 -1131296872 -12748735
+-1055517329 3409880 -1115100956 -9295249
+-1054259737 3678039 -1055517329 3409880
+-1017239248 11571987 -1054259737 3678039
+-942961134 27410449 -1017239248 11571987
+-836472520 50117217 -942961134 27410449
+-790512384 59917384 -836472520 50117217
+-762903867 65804400 -790512384 59917384
+-762280924 65937231 -762903867 65804400
+-752093744 68109463 -762280924 65937231
+-717387877 75509860 -752093744 68109463
+-695196998 80241663 -717387877 75509860
+-680944613 83280726 -695196998 80241663
+-679771129 83530950 -680944613 83280726
+-634579097 93167332 -679771129 83530950
+-600058799 100528160 -634579097 93167332
+-565042625 107994725 -600058799 100528160
+-560179789 109031637 -565042625 107994725
+-543251644 112641257 -560179789 109031637
+-523271774 116901602 -543251644 112641257
+-454594328 131545824 -523271774 116901602
+-385856518 146202916 -454594328 131545824
+-338839019 156228546 -385856518 146202916
+-330671884 157970040 -338839019 156228546
+-260720743 172885854 -330671884 157970040
+-188135354 188363373 -260720743 172885854
+-156610449 195085488 -188135354 188363373
+-140523963 198515639 -156610449 195085488
+-134834704 199728771 -140523963 198515639
+-127419654 201309896 -134834704 199728771
+-97279245 207736792 -127419654 201309896
+-94979678 208227133 -97279245 207736792
+-69057135 213754646 -94979678 208227133
+-66190544 214365894 -69057135 213754646
+-29638762 222159900 -66190544 214365894
+-21770882 223837583 -29638762 222159900
+-15348415 225207057 -21770882 223837583
+-14693080 225346796 -15348415 225207057
+20205821 232788354 -14693080 225346796
+192364295 269498030 20205821 232788354
+306631956 293863539 192364295 269498030
+-828841564 902819953 -791016644 872970156
+-791016644 872970156 -721545786 818146749
+-721545786 818146749 -698096018 799641203
+-698096018 799641203 -616910099 735572775
+-616910099 735572775 -583514567 709218461
+-583514567 709218461 -545783793 679442960
+-545783793 679442960 -527232415 664803012
+-527232415 664803012 -490554785 635858608
+-490554785 635858608 -447503081 601884059
+-447503081 601884059 -380566085 549060267
+-380566085 549060267 -353250088 527503660
+-353250088 527503660 -334168609 512445379
+-334168609 512445379 -262977691 456264575
+-262977691 456264575 -225919710 427020014
+-225919710 427020014 -208880174 413573146
+-208880174 413573146 -201264134 407562896
+-201264134 407562896 -193303552 401280747
+-193303552 401280747 -185402637 395045686
+-185402637 395045686 -179604766 390470257
+-179604766 390470257 -173758609 385856721
+-173758609 385856721 -137737298 357430255
+-137737298 357430255 -99699697 327412620
+-99699697 327412620 -87182316 317534442
+-87182316 317534442 -72274251 305769641
+-72274251 305769641 -69985486 303963446
+-69985486 303963446 -67596069 302077820
+-67596069 302077820 -59214046 295463090
+-59214046 295463090 -32957965 274742922
+-32957965 274742922 -8183599 255192061
+-8183599 255192061 20205821 232788354
+20205821 232788354 28754626 226042006
+28754626 226042006 54928407 205386785
+54928407 205386785 87664008 179553260
+87664008 179553260 222142913 73428306
+222142913 73428306 224529431 71544968
+224529431 71544968 225865904 70490281
+225865904 70490281 233854294 64186188
+233854294 64186188 294091339 16649708
+294091339 16649708 329673508 -11430205
+329673508 -11430205 334306775 -15086580
+334306775 -15086580 391948771 -60575158
+391948771 -60575158 480349439 -130337155
+480349439 -130337155 483988743 -133209137
+483988743 -133209137 500158849 -145969888
+500158849 -145969888 543875961 -180469548
+543875961 -180469548 587396604 -214814163
+587396604 -214814163 589028862 -216102271
+589028862 -216102271 625763440 -245091617
+625763440 -245091617 629491517 -248033654
+629491517 -248033654 643408261 -259016148
+-1229489944 -1107894779 -1187578015 -964616265
+-1187578015 -964616265 -1168570871 -899639170
+-1168570871 -899639170 -1128381808 -762250378
+-1128381808 -762250378 -1120744975 -736143393
+-1120744975 -736143393 -1087947418 -624022921
+-1087947418 -624022921 -1059670668 -527357110
+-1059670668 -527357110 -1058175206 -522244781
+-1058175206 -522244781 -1040391433 -461449855
+-1040391433 -461449855 -1037796007 -452577230
+-1037796007 -452577230 -1023146073 -402495529
+-1288671639 1853122124 -1094851068 1632436855
+-1094851068 1632436855 -1014089584 1540481344
+-1014089584 1540481344 -935077636 1450517866
+-935077636 1450517866 -912365336 1424657503
+-912365336 1424657503 -859528933 1364497658
+-859528933 1364497658 -743465074 1232346650
+-743465074 1232346650 -641846242 1116642837
+-641846242 1116642837 -612762497 1083527910
+-612762497 1083527910 -591014755 1058765801
+-591014755 1058765801 -569100327 1033813901
+-569100327 1033813901 -453045245 901672886
+-453045245 901672886 -427930228 873076777
+-427930228 873076777 -427873531 873012222
+-427873531 873012222 -321935917 752391017
+-321935917 752391017 -307859893 736363972
+-307859893 736363972 -270823524 694194140
+-270823524 694194140 -217734790 633746988
+-217734790 633746988 -210517514 625529354
+-210517514 625529354 -203560381 617607921
+-203560381 617607921 -123711718 526691753
+-123711718 526691753 -120484330 523017030
+-120484330 523017030 -112534245 513965015
+-112534245 513965015 -106641466 507255462
+-106641466 507255462 -89072436 487251258
+-89072436 487251258 -77637137 474230958
+-77637137 474230958 -32395649 422718728
+-32395649 422718728 -14978256 402887179
+-14978256 402887179 11567353 372662190
+11567353 372662190 13527121 370430786
+13527121 370430786 21779094 361035039
+21779094 361035039 36133819 344690663
+36133819 344690663 40371427 339865698
+40371427 339865698 44074960 335648833
+44074960 335648833 44608225 335041654
+44608225 335041654 78707669 296215823
+-1866174779 1473150336 -2129814465 1723720676
+-1826001943 1434968978 -1866174779 1473150336
+-1760810088 1373008863 -1826001943 1434968978
+-1444915312 1072773864 -1760810088 1373008863
+-1342202955 975153242 -1444915312 1072773864
+-1313176800 947565993 -1342202955 975153242
+-1269267021 905832943 -1313176800 947565993
+-1044353671 692069169 -1269267021 905832943
+-991541620 641875157 -1044353671 692069169
+-901775427 556558922 -991541620 641875157
+-890860289 546184877 -901775427 556558922
+-884935805 540554086 -890860289 546184877
+-883328272 539026243 -884935805 540554086
+-849241124 506628889 -883328272 539026243
+-826233411 484761732 -849241124 506628889
+-786506708 447004391 -826233411 484761732
+-723720369 387330545 -786506708 447004391
+-723264679 386897444 -723720369 387330545
+-716882353 380831508 -723264679 386897444
+-679381903 345190058 -716882353 380831508
+-620184642 288927369 -679381903 345190058
+-573851411 244891004 -620184642 288927369
+-549051075 221320090 -573851411 244891004
+-541865855 214491061 -549051075 221320090
+-535469394 208411690 -541865855 214491061
+-518848763 192614989 -535469394 208411690
+-485137105 160574511 -518848763 192614989
+-473189332 149219022 -485137105 160574511
+-454594328 131545824 -473189332 149219022
+-386512733 66839222 -454594328 131545824
+-348364513 30582114 -386512733 66839222
+-347767651 30014840 -348364513 30582114
+-331645950 14692336 -347767651 30014840
+-306542258 -9166896 -331645950 14692336
+-252020948 -60985434 -306542258 -9166896
+-228233112 -83594042 -252020948 -60985434
+-223684819 -87916863 -228233112 -83594042
+-190571041 -119389100 -223684819 -87916863
+-178582649 -130783195 -190571041 -119389100
+-121073164 -185441776 -178582649 -130783195
+-100949656 -204567706 -121073164 -185441776
+-76520414 -227785922 -100949656 -204567706
+-38213872 -264193504 -76520414 -227785922
+-24587050 -277144806 -38213872 -264193504
+-981316 -299580339 -24587050 -277144806
+24891745 -324170801 -981316 -299580339
+47808891 -345951881 24891745 -324170801
+56241770 -353966718 47808891 -345951881
+85958638 -382210440 56241770 -353966718
+124230900 -418585439 85958638 -382210440
+148322477 -441482731 124230900 -418585439
+216540009 -506318531 148322477 -441482731
+235865895 -524686380 216540009 -506318531
+252411436 -540411713 235865895 -524686380
+263799686 -551235416 252411436 -540411713
+274688986 -561584903 263799686 -551235416
+288126576 -574356354 274688986 -561584903
+329505290 -613683812 288126576 -574356354
+451110750 -729260953 329505290 -613683812
+465143326 -742597896 451110750 -729260953
+481041698 -757708141 465143326 -742597896
+529036223 -803323446 481041698 -757708141
+721123396 -985888327 529036223 -803323446
+747530719 -1010986567 721123396 -985888327
+765957726 -1028500096 747530719 -1010986567
+847814877 -1106299362 765957726 -1028500096
+875644369 -1132749269 847814877 -1106299362
+880287871 -1137162579 875644369 -1132749269
+-1208295723 -300144205 -1209892946 -292190098
+-1203000155 -326515923 -1208295723 -300144205
+-1198975029 -346560888 -1203000155 -326515923
+-1191980077 -381395466 -1198975029 -346560888
+-1178257558 -449733054 -1191980077 -381395466
+-1176072050 -460616796 -1178257558 -449733054
+-1159865056 -541326971 -1176072050 -460616796
+-1149448813 -593199441 -1159865056 -541326971
+-1120744975 -736143393 -1149448813 -593199441
+-1099780865 -840543809 -1120744975 -736143393
+-1098917016 -844845746 -1099780865 -840543809
+-1079550965 -941287896 -1098917016 -844845746
+-1060964372 -1033848376 -1079550965 -941287896
+-1030920632 -1183464987 -1060964372 -1033848376
+-1017416875 -1250713152 -1030920632 -1183464987
+-1013331237 -1271059464 -1017416875 -1250713152
+-1010069652 -1287302022 -1013331237 -1271059464
+-994582895 -1364425449 -1010069652 -1287302022
+-986686065 -1403751340 -994582895 -1364425449
+-974944161 -1462225549 -986686065 -1403751340
+-973103385 -1471392539 -974944161 -1462225549
+-949424281 -1589313522 -973103385 -1471392539
+-931531073 -1678420972 -949424281 -1589313522
+-897168955 -1849542928 -931531073 -1678420972
+-878242435 -1943796232 -897168955 -1849542928
+-872589995 -1971945154 -878242435 -1943796232
+-1455004352 1960188019 -1353484384 1646687052
+-1353484384 1646687052 -1351849647 1641638867
+-1351849647 1641638867 -1322616332 1551364286
+-1322616332 1551364286 -1241613819 1301222699
+-1241613819 1301222699 -1193213787 1151759917
+-1193213787 1151759917 -1184670674 1125378171
+-1184670674 1125378171 -1172455690 1087657420
+-1172455690 1087657420 -1143196854 997304028
+-1143196854 997304028 -1115625150 912160623
+-1115625150 912160623 -1044353671 692069169
+-1044353671 692069169 -1026244756 636147537
+-1026244756 636147537 -986960893 514836141
+-986960893 514836141 -974245814 475571061
+-974245814 475571061 -972844264 471242975
+-972844264 471242975 -970546751 464148091
+-970546751 464148091 -966953846 453052940
+-966953846 453052940 -930189584 339522254
+-930189584 339522254 -924695285 322555462
+-924695285 322555462 -921787259 313575271
+-921787259 313575271 -919060123 305153678
+-919060123 305153678 -875130377 169495463
+-875130377 169495463 -868633279 149431957
+-868633279 149431957 -859189089 120267617
+-859189089 120267617 -858384271 117782280
+-858384271 117782280 -857480915 114992653
+-857480915 114992653 -857145917 113958155
+-857145917 113958155 -855955596 110282359
+-855955596 110282359 -836472520 50117217
+-836472520 50117217 -827484788 22362453
+-827484788 22362453 -824858688 14252869
+-824858688 14252869 -792901990 -84431714
+-792901990 -84431714 -790642712 -91408525
+-790642712 -91408525 -763381610 -175592770
+-763381610 -175592770 -738665408 -251918182
+-738665408 -251918182 -732988271 -269449589
+-732988271 -269449589 -730332486 -277650844
+-730332486 -277650844 -726385658 -289838933
+-726385658 -289838933 -701549794 -366533869
+-701549794 -366533869 -684439954 -419370283
+-684439954 -419370283 -678202772 -438631152
+-678202772 -438631152 -668132701 -469728256
+-668132701 -469728256 -666662260 -474269082
+-666662260 -474269082 -660354473 -493747982
+-660354473 -493747982 -629629174 -588629918
+-629629174 -588629918 -628771442 -591278655
+-628771442 -591278655 -613284901 -639102207
+-613284901 -639102207 -605221684 -664002003
+-605221684 -664002003 -565780907 -785797957
+-565780907 -785797957 -555943760 -816175778
+-555943760 -816175778 -555291992 -818188484
+-555291992 -818188484 -546938364 -843985086
+-546938364 -843985086 -537154496 -874198376
+-537154496 -874198376 -503659073 -977634653
+-503659073 -977634653 -488028472 -1025903071
+-488028472 -1025903071 -470692542 -1079437670
+-470692542 -1079437670 -467566090 -1089092380
+-467566090 -1089092380 -438135599 -1179975854
+-438135599 -1179975854 -406659105 -1277177531
+-406659105 -1277177531 -398715982 -1301706467
+-398715982 -1301706467 -390847682 -1326004342
+-390847682 -1326004342 -380525730 -1357879273
+-380525730 -1357879273 -372350046 -1383126373
+-372350046 -1383126373 -354243649 -1439040231
+-354243649 -1439040231 -335163710 -1497960455
+-335163710 -1497960455 -333546172 -1502955529
+-333546172 -1502955529 -231135879 -1819205882
+-231135879 -1819205882 -165855696 -2020795785
+-165855696 -2020795785 -139185614 -2103154914
+-2144955609 917228118 -2015211199 853197207
+-2015211199 853197207 -1917081590 804768700
+-1917081590 804768700 -1874311340 783660908
+-1874311340 783660908 -1750460887 722538759
+-1750460887 722538759 -1664369510 680051308
+-1664369510 680051308 -1629174303 662681919
+-1629174303 662681919 -1570834671 633890392
+-1570834671 633890392 -1548012363 622627223
+-1548012363 622627223 -1437779093 568225368
+-1437779093 568225368 -1382161046 540776986
+-1382161046 540776986 -1286532514 493582799
+-1286532514 493582799 -1280779117 490743407
+-1280779117 490743407 -1085705634 394471571
+-1085705634 394471571 -999376278 351866674
+-999376278 351866674 -972428906 338567721
+-972428906 338567721 -930027112 317641768
+-930027112 317641768 -927267699 316279955
+-927267699 316279955 -921787259 313575271
+-921787259 313575271 -804043465 255466854
+-804043465 255466854 -783640661 245397749
+-783640661 245397749 -749291562 228445928
+-749291562 228445928 -697624535 202947436
+-697624535 202947436 -695143363 201722938
+-695143363 201722938 -681655210 195066323
+-681655210 195066323 -642371818 175679350
+-642371818 175679350 -617679366 163493236
+-617679366 163493236 -561148023 135594128
+-561148023 135594128 -549811483 129999367
+-549811483 129999367 -538199830 124268833
+-538199830 124268833 -532540511 121475870
+-532540511 121475870 -523271774 116901602
+-523271774 116901602 -394713365 53456003
+-394713365 53456003 -348364513 30582114
+-348364513 30582114 -347553069 30181654
+-347553069 30181654 -326633956 19857742
+-326633956 19857742 -293763711 3635758
+-293763711 3635758 -238373781 -23700045
+-238373781 -23700045 -234013683 -25851821
+-234013683 -25851821 -201235299 -42028470
+-201235299 -42028470 -181567248 -51734963
+-181567248 -51734963 -172182412 -56366528
+-172182412 -56366528 -87931160 -97945848
+-87931160 -97945848 -50884193 -116229109
+-50884193 -116229109 -37842649 -122665317
+-37842649 -122665317 -7703487 -137539468
+-7703487 -137539468 20756695 -151585016
+20756695 -151585016 100425241 -190902698
+100425241 -190902698 111190238 -196215394
+111190238 -196215394 121387789 -201248046
+121387789 -201248046 141472285 -211160061
+141472285 -211160061 233115939 -256387648
+233115939 -256387648 239124172 -259352805
+239124172 -259352805 278646485 -278857689
+278646485 -278857689 289808927 -284366530
+289808927 -284366530 301415580 -290094596
+301415580 -290094596 309056640 -293865579
+309056640 -293865579 413265090 -345294091
+413265090 -345294091 453442107 -365122082
+453442107 -365122082 484510403 -380454775
+484510403 -380454775 491399963 -383854881
+491399963 -383854881 529560014 -402687467
+529560014 -402687467 570258380 -422772752
+570258380 -422772752 577845266 -426517000
+577845266 -426517000 586818284 -430945326
+586818284 -430945326 723520113 -498409832
+723520113 -498409832 742162789 -507610285
+838109902 -1239003195 881779556 -1155614314
+881779556 -1155614314 885998260 -1147558536
+885998260 -1147558536 920464672 -1081743600
+920464672 -1081743600 921041630 -1080641877
+921041630 -1080641877 949302708 -1026676263
+949302708 -1026676263 975910564 -975867541
+975910564 -975867541 1000776082 -928385879
+1000776082 -928385879 1004524071 -921228951
+1004524071 -921228951 1031534599 -869651310
+1031534599 -869651310 1033444165 -866004922
+1033444165 -866004922 1043809057 -846212761
+1043809057 -846212761 1054652875 -825506074
+1054652875 -825506074 1070817494 -794639114
+1070817494 -794639114 1085220389 -767136234
+-1419527418 -1881385304 -1426330346 -1916493671
+-1404476116 -1803708962 -1419527418 -1881385304
+-1374624200 -1649650020 -1404476116 -1803708962
+-1329204762 -1415250644 -1374624200 -1649650020
+-1305025922 -1290469154 -1329204762 -1415250644
+-1283412327 -1178926310 -1305025922 -1290469154
+-1241421889 -962223220 -1283412327 -1178926310
+-1223757613 -871061914 -1241421889 -962223220
+-1176523842 -627299176 -1223757613 -871061914
+-1173546229 -611932393 -1176523842 -627299176
+-1159865056 -541326971 -1173546229 -611932393
+-1147410228 -477050441 -1159865056 -541326971
+-1146533930 -472528068 -1147410228 -477050441
+-1142702469 -452754768 -1146533930 -472528068
+-1134439821 -410113122 -1142702469 -452754768
+-1099436749 -229470237 -1134439821 -410113122
+-1084085588 -150246393 -1099436749 -229470237
+-1082002861 -139497911 -1084085588 -150246393
+-1078340603 -120597831 -1082002861 -139497911
+-1070476309 -80011999 -1078340603 -120597831
+-1054259737 3678039 -1070476309 -80011999
+-1053230869 8987788 -1054259737 3678039
+-1051231087 19308207 -1053230869 8987788
+457021926 -418080138 498750615 -422216213
+498750615 -422216213 520778492 -424399577
+520778492 -424399577 566399834 -428921485
+566399834 -428921485 586818284 -430945326
+586818284 -430945326 593864624 -431643746
+-846246213 -1694528145 -808907651 -1657796683
+-808907651 -1657796683 -721439487 -1571750694
+-721439487 -1571750694 -666739754 -1517940342
+-666739754 -1517940342 -642690905 -1494282512
+-642690905 -1494282512 -630257619 -1482051383
+-630257619 -1482051383 -569637836 -1422417237
+-569637836 -1422417237 -535257212 -1388595620
+-535257212 -1388595620 -516903808 -1370540630
+-1104184994 476596761 -1172326522 454368485
+-1043783327 496300237 -1104184994 476596761
+-986960893 514836141 -1043783327 496300237
+-942510967 529336039 -986960893 514836141
+-890860289 546184877 -942510967 529336039
+-887866922 547161336 -890860289 546184877
+-866093453 554264005 -887866922 547161336
+-840235408 562699093 -866093453 554264005
+-840109026 562740319 -840235408 562699093
+-824099564 567962726 -840109026 562740319
+-751790544 591550469 -824099564 567962726
+-746764483 593190008 -751790544 591550469
+-687153714 612635487 -746764483 593190008
+-608081532 638429425 -687153714 612635487
+-561513326 653620323 -608081532 638429425
+-527232415 664803012 -561513326 653620323
+-484503501 678741504 -527232415 664803012
+-418765513 700185728 -484503501 678741504
+-409773857 703118873 -418765513 700185728
+-408249589 703616101 -409773857 703118873
+-307859893 736363972 -408249589 703616101
+-239873582 758541615 -307859893 736363972
+-238837257 758879672 -239873582 758541615
+-193997334 773506791 -238837257 758879672
+-168283057 781894980 -193997334 773506791
+-34245787 825618942 -168283057 781894980
+32640510 847437753 -34245787 825618942
+97722767 868668072 32640510 847437753
+106582745 871558263 97722767 868668072
+298445764 934145417 106582745 871558263
+326988210 943456176 298445764 934145417
+468935855 989760561 326988210 943456176
+476254290 992147889 468935855 989760561
+553694114 1017409339 476254290 992147889
+631616606 1042828240 553694114 1017409339
+636307711 1044358513 631616606 1042828240
+673983958 1056648787 636307711 1044358513
+681856294 1059216802 673983958 1056648787
+722766411 1072561989 681856294 1059216802
+744081269 1079515055 722766411 1072561989
+750506111 1081610886 744081269 1079515055
+870826577 1120860323 750506111 1081610886
+898492770 1129885243 870826577 1120860323
+978037371 1155833287 898492770 1129885243
+1304428175 1262304411 978037371 1155833287
+1374740603 1285240852 1304428175 1262304411
+1406103202 1295471566 1374740603 1285240852
+1440728902 1306766729 1406103202 1295471566
+1522906391 1333573641 1440728902 1306766729
+1639940147 1371750929 1522906391 1333573641
+352753925 311265766 350148781 310669991
+377637045 316956329 352753925 311265766
+438402729 330852939 377637045 316956329
+444768174 332308663 438402729 330852939
+499029375 344717751 444768174 332308663
+571562991 361305590 499029375 344717751
+617852687 371891661 571562991 361305590
+627658219 374134104 617852687 371891661
+630534177 374791812 627658219 374134104
+638564609 376628306 630534177 374791812
+638641085 376645795 638564609 376628306
+722196934 395754327 638641085 376645795
+952832132 448498690 722196934 395754327
+1049169811 470530320 952832132 448498690
+1138956137 491063711 1049169811 470530320
+1144521596 492336485 1138956137 491063711
+1171949099 498608928 1144521596 492336485
+1177183882 499806080 1171949099 498608928
+1257014075 518062585 1177183882 499806080
+1283432753 524104318 1257014075 518062585
+1466003358 565856706 1283432753 524104318
+1469235783 566595935 1466003358 565856706
+1583727648 592779278 1469235783 566595935
+1754305354 631788989 1583727648 592779278
+-1050082033 454348089 -1031887649 433630176
+-1031887649 433630176 -988872199 384648562
+-988872199 384648562 -948871705 339100072
+-948871705 339100072 -930027112 317641768
+-930027112 317641768 -927765241 315066180
+-927765241 315066180 -919060123 305153678
+-919060123 305153678 -833277922 207473642
+-833277922 207473642 -821846581 194456796
+-821846581 194456796 -781753556 148802941
+-781753556 148802941 -770817935 136350569
+-770817935 136350569 -762564293 126952162
+-762564293 126952162 -728932707 88655937
+-728932707 88655937 -728213509 87836987
+-728213509 87836987 -717387877 75509860
+-717387877 75509860 -704244181 60543157
+-704244181 60543157 -678543118 31277403
+-678543118 31277403 -672781588 24716760
+-672781588 24716760 -664925649 15771217
+-664925649 15771217 -663149499 13748717
+-663149499 13748717 -627416449 -26940441
+-627416449 -26940441 -590082530 -69452507
+-590082530 -69452507 -543683473 -122287028
+-543683473 -122287028 -519367236 -149975883
+-519367236 -149975883 -506091562 -165092869
+-506091562 -165092869 -463322015 -213794474
+-463322015 -213794474 -446890334 -232505199
+-446890334 -232505199 -427525114 -254556339
+-427525114 -254556339 -423283679 -259386054
+-423283679 -259386054 -410196487 -274288416
+-410196487 -274288416 -384603331 -303431295
+-384603331 -303431295 -376796545 -312320868
+-376796545 -312320868 -368961968 -321242087
+-368961968 -321242087 -341930375 -352022913
+-341930375 -352022913 -287597329 -413891853
+-287597329 -413891853 -279268002 -423376442
+-279268002 -423376442 -200348194 -513242284
+-200348194 -513242284 -181747122 -534423291
+-181747122 -534423291 -155432742 -564387427
+-155432742 -564387427 -124848891 -599213202
+-124848891 -599213202 -80681513 -649506515
+-80681513 -649506515 -79567364 -650775195
+-79567364 -650775195 -64322772 -668134184
+-64322772 -668134184 -41349872 -694293383
+-41349872 -694293383 2059167 -743723177
+2059167 -743723177 25924024 -770898045
+25924024 -770898045 54567624 -803514461
+54567624 -803514461 100017714 -855268396
+100017714 -855268396 122024772 -880327792
+122024772 -880327792 154348472 -917134729
+-1606626050 1625270102 -1594067594 1622002104
+-1594067594 1622002104 -1322616332 1551364286
+-1322616332 1551364286 -1287659828 1542267805
+-1287659828 1542267805 -1001140356 1467708894
+-1001140356 1467708894 -935077636 1450517866
+-935077636 1450517866 -929415447 1449044435
+-929415447 1449044435 -869126850 1433355965
+-869126850 1433355965 -395413473 1310084924
+-395413473 1310084924 -334926018 1294344707
+-334926018 1294344707 -254109650 1273314442
+-254109650 1273314442 -215647139 1263305618
+-215647139 1263305618 -15197607 1211144071
+-15197607 1211144071 23025520 1201197541
+23025520 1201197541 176225661 1161331365
+176225661 1161331365 182629396 1159664967
+182629396 1159664967 212363081 1151927583
+212363081 1151927583 269301421 1137110926
+269301421 1137110926 398373016 1103523549
+398373016 1103523549 421321249 1097551895
+421321249 1097551895 489074272 1079921011
+489074272 1079921011 521941871 1071368111
+521941871 1071368111 595809204 1052146143
+595809204 1052146143 631616606 1042828240
+631616606 1042828240 635258786 1041880461
+635258786 1041880461 659032191 1035694078
+659032191 1035694078 673384658 1031959239
+673384658 1031959239 699968574 1025041496
+699968574 1025041496 788821233 1001920005
+788821233 1001920005 789547095 1001731119
+789547095 1001731119 830335906 991116939
+830335906 991116939 873958380 979765375
+873958380 979765375 944493915 961410418
+944493915 961410418 964941903 956089384
+964941903 956089384 985395807 950766811
+985395807 950766811 1130482417 913011961
+1130482417 913011961 1155793669 906425395
+1155793669 906425395 1277539336 874744392
+1277539336 874744392 1282749258 873388651
+1282749258 873388651 1297904140 869445005
+1297904140 869445005 1369481878 850818843
+1369481878 850818843 1404035780 841827128
+1404035780 841827128 1514395210 813109084
+1514395210 813109084 1523345216 810780088
+1523345216 810780088 1528993600 809310249
+1528993600 809310249 1557384686 801922240
+1557384686 801922240 1586992440 794217627
+1586992440 794217627 1913549999 709239891
+1913549999 709239891 2063775811 670147704
+-365637685 -369904107 -341930375 -352022913
+-341930375 -352022913 -331063869 -343826871
+-331063869 -343826871 -310614243 -328402780
+-310614243 -328402780 -278826596 -304427006
+-278826596 -304427006 -234892364 -271289694
+-234892364 -271289694 -208514195 -251394010
+-208514195 -251394010 -188541355 -236329532
+-188541355 -236329532 -155065467 -211080407
+-155065467 -211080407 -140065074 -199766388
+-140065074 -199766388 -121073164 -185441776
+-121073164 -185441776 -78152255 -153068761
+-78152255 -153068761 -45411564 -128374156
+-45411564 -128374156 -37842649 -122665317
+-37842649 -122665317 -13506992 -104310193
+-13506992 -104310193 14667139 -83059908
+14667139 -83059908 25664909 -74764860
+25664909 -74764860 97875901 -20299855
+97875901 -20299855 152973370 21257308
+152973370 21257308 221682343 73080922
+221682343 73080922 222142913 73428306
+222142913 73428306 226819765 76955812
+226819765 76955812 356914812 175079758
+356914812 175079758 390232894 200209859
+390232894 200209859 410108120 215200711
+410108120 215200711 433058922 232511310
+433058922 232511310 472348857 262145670
+472348857 262145670 550002939 320716115
+550002939 320716115 552114950 322309096
+552114950 322309096 587560958 349044180
+587560958 349044180 617852687 371891661
+617852687 371891661 621424851 374585958
+621424851 374585958 634394837 384368546
+634394837 384368546 640625467 389067986
+640625467 389067986 643007527 390864651
+643007527 390864651 643891615 391531473
+643891615 391531473 968220733 636156101
+968220733 636156101 999980862 660111119
+999980862 660111119 1131683822 759447830
+1131683822 759447830 1147072114 771054420
+1147072114 771054420 1215493548 822661158
+1215493548 822661158 1281242196 872251952
+1281242196 872251952 1282749258 873388651
+1282749258 873388651 1304566272 889844093
+1304566272 889844093 1379306698 946216919
+1379306698 946216919 1474318016 1017879027
+1474318016 1017879027 1475959291 1019116955
+1475959291 1019116955 1968680212 1390750786
+1968680212 1390750786 1983104618 1401630367
+-931531073 -1678420972 -1167896817 -1832483812
+-826071673 -1609682692 -931531073 -1678420972
+-730788025 -1547576952 -826071673 -1609682692
+-697066583 -1525597366 -730788025 -1547576952
+-642786434 -1490217646 -697066583 -1525597366
+-630257619 -1482051383 -642786434 -1490217646
+-549372297 -1429330450 -630257619 -1482051383
+-484248919 -1386883129 -549372297 -1429330450
+-476708690 -1381968419 -484248919 -1386883129
+-464506427 -1374015002 -476708690 -1381968419
+-390847682 -1326004342 -464506427 -1374015002
+-357959867 -1304568113 -390847682 -1326004342
+-342655693 -1294592876 -357959867 -1304568113
+-104257471 -1139205269 -342655693 -1294592876
+-51979474 -1105130548 -104257471 -1139205269
+11044870 -1064051375 -51979474 -1105130548
+124113237 -990353581 11044870 -1064051375
+139490336 -980330811 124113237 -990353581
+139975824 -980014371 139490336 -980330811
+149083922 -974077726 139975824 -980014371
+193278297 -945271898 149083922 -974077726
+234383863 -918479351 193278297 -945271898
+254071594 -905646917 234383863 -918479351
+276533998 -891005956 254071594 -905646917
+281886320 -887517320 276533998 -891005956
+285189239 -885364483 281886320 -887517320
+293308161 -880072581 285189239 -885364483
+342140089 -848244004 293308161 -880072581
+381510856 -822582196 342140089 -848244004
+481041698 -757708141 381510856 -822582196
+497288160 -747118721 481041698 -757708141
+571989303 -698428628 497288160 -747118721
+599681448 -680378929 571989303 -698428628
+644914704 -650895960 599681448 -680378929
+671710895 -633430242 644914704 -650895960
+685744453 -624283190 671710895 -633430242
+795028203 -553052204 685744453 -624283190
+825285174 -533330756 795028203 -553052204
+843689875 -521334599 825285174 -533330756
+848121061 -518446359 843689875 -521334599
+855605046 -513568308 848121061 -518446359
+914417452 -475234470 855605046 -513568308
+1008312234 -414033990 914417452 -475234470
+1052781093 -385049254 1008312234 -414033990
+1056217176 -382809621 1052781093 -385049254
+1124420849 -338354568 1056217176 -382809621
+1297139391 -225776879 1124420849 -338354568
+1318979906 -211541264 1297139391 -225776879
+1416671979 -147865716 1318979906 -211541264
+-855155309 -144618939 -877361846 -137124182
+-763381610 -175592770 -855155309 -144618939
+-709856255 -193657698 -763381610 -175592770
+-705237138 -195216661 -709856255 -193657698
+-672964300 -206108817 -705237138 -195216661
+-658003956 -211157966 -672964300 -206108817
+-639010317 -217568362 -658003956 -211157966
+-612257546 -226597483 -639010317 -217568362
+-577237733 -238416749 -612257546 -226597483
+-574190077 -239445340 -577237733 -238416749
+-510635871 -260895028 -574190077 -239445340
+-449183129 -281635468 -510635871 -260895028
+-419972623 -291494079 -449183129 -281635468
+-384603331 -303431295 -419972623 -291494079
+-373464390 -307190713 -384603331 -303431295
+-372312149 -307579597 -373464390 -307190713
+-352746598 -314183015 -372312149 -307579597
+-310614243 -328402780 -352746598 -314183015
+-256851105 -346547960 -310614243 -328402780
+-196953698 -366763471 -256851105 -346547960
+-95590896 -400973645 -196953698 -366763471
+-39428517 -419928575 -95590896 -400973645
+-14785135 -428245772 -39428517 -419928575
+-11958200 -429199869 -14785135 -428245772
+9504963 -436443735 -11958200 -429199869
+46692256 -448994531 9504963 -436443735
+70989640 -457194953 46692256 -448994531
+104893554 -468637600 70989640 -457194953
+108454728 -469839505 104893554 -468637600
+115029712 -472058577 108454728 -469839505
+120275461 -473829029 115029712 -472058577
+216540009 -506318531 120275461 -473829029
+255471878 -519458125 216540009 -506318531
+290797714 -531380675 255471878 -519458125
+299498648 -534317260 290797714 -531380675
+349054564 -551042493 299498648 -534317260
+365965037 -556749816 349054564 -551042493
+461887008 -589123698 365965037 -556749816
+465171646 -590232271 461887008 -589123698
+505971096 -604002178 465171646 -590232271
+572444957 -626437256 505971096 -604002178
+644914704 -650895960 572444957 -626437256
+678861584 -662353108 644914704 -650895960
+721990326 -676909156 678861584 -662353108
+731951942 -680271224 721990326 -676909156
+794586028 -701410369 731951942 -680271224
+979195490 -763716480 794586028 -701410369
+998432080 -770208873 979195490 -763716480
+1070817494 -794639114 998432080 -770208873
+1206819091 -840539960 1070817494 -794639114
+1225842150 -846960285 1206819091 -840539960
+1269900712 -861830150 1225842150 -846960285
+1330924198 -882425714 1269900712 -861830150
+1747049039 -1022868789 1330924198 -882425714
+1854345392 -1059081550 1747049039 -1022868789
+2014984655 -1113297665 1854345392 -1059081550
+2071302876 -1132305191 2014984655 -1113297665
+-1460900508 -403720226 -1416134622 -373607351
+-1416134622 -373607351 -1285944510 -286031766
+-1285944510 -286031766 -1232547043 -250112646
+-1232547043 -250112646 -1181196274 -215570286
+-1181196274 -215570286 -1131606399 -182212436
+-1131606399 -182212436 -1084085588 -150246393
+-1084085588 -150246393 -1077857249 -146056747
+-1077857249 -146056747 -1055988389 -131346120
+-1055988389 -131346120 -1028334452 -112744019
+-1028334452 -112744019 -911069336 -33862751
+-911069336 -33862751 -859045330 1132478
+-859045330 1132478 -827484788 22362453
+-827484788 22362453 -782336373 52732646
+-782336373 52732646 -762903867 65804400
+-762903867 65804400 -762521846 66061375
+-762521846 66061375 -752883037 72545158
+-752883037 72545158 -729656631 88168972
+-729656631 88168972 -728932707 88655937
+-728932707 88655937 -685743354 117708319
+-685743354 117708319 -680654775 121131276
+-680654775 121131276 -658496344 136036691
+-658496344 136036691 -617679366 163493236
+-617679366 163493236 -563798218 199737717
+-563798218 199737717 -550869367 208434627
+-550869367 208434627 -541865855 214491061
+-541865855 214491061 -491167496 248594560
+-491167496 248594560 -463862237 266962115
+-463862237 266962115 -439983588 283024676
+-439983588 283024676 -417922991 297864280
+-417922991 297864280 -410793179 302660323
+-410793179 302660323 -336033724 352949111
+-336033724 352949111 -327215005 358881240
+-327215005 358881240 -279449855 391011644
+-279449855 391011644 -268012040 398705572
+-268012040 398705572 -225919710 427020014
+-225919710 427020014 -218402781 432076461
+-218402781 432076461 -197618519 446057507
+-197618519 446057507 -185843494 453978267
+-185843494 453978267 -123660568 495807144
+-123660568 495807144 -118879413 499023305
+-118879413 499023305 -106641466 507255462
+-106641466 507255462 2294952 580534226
+2294952 580534226 16424810 590039022
+16424810 590039022 117897358 658297030
+117897358 658297030 120104151 659781483
+120104151 659781483 137636636 671575141
+137636636 671575141 147421560 678157212
+147421560 678157212 153137194 682001973
+153137194 682001973 358972636 820462251
+358972636 820462251 384991401 837964414
+384991401 837964414 411505617 855799854
+411505617 855799854 446261122 879179001
+446261122 879179001 461224397 889244416
+461224397 889244416 614210354 992154187
+614210354 992154187 621624826 997141714
+621624826 997141714 673384658 1031959239
+673384658 1031959239 686840311 1041010515
+686840311 1041010515 732540289 1071751731
+732540289 1071751731 744081269 1079515055
+744081269 1079515055 749687345 1083286120
+749687345 1083286120 858740180 1156643194
+858740180 1156643194 888172530 1176441590
+888172530 1176441590 926650204 1202324544
+926650204 1202324544 938987596 1210623594
+938987596 1210623594 997962769 1250294697
+997962769 1250294697 1264758922 1429761698
+1264758922 1429761698 1336350173 1477919315
+1336350173 1477919315 1356549911 1491507167
+1356549911 1491507167 1809664522 1796305866
+-537942776 214540408 -516532851 214209849
+-516532851 214209849 -508233709 214081715
+-508233709 214081715 -428912473 212857036
+-428912473 212857036 -421881106 212748476
+-421881106 212748476 -369949895 211946685
+-369949895 211946685 -312073730 211053107
+-312073730 211053107 -304726540 210939670
+-304726540 210939670 -298275518 210840070
+-298275518 210840070 -197562816 209285118
+-197562816 209285118 -143640354 208452584
+-143640354 208452584 -142283077 208431628
+-142283077 208431628 -129813897 208239110
+-129813897 208239110 -118726361 208067924
+-118726361 208067924 -97279245 207736792
+-97279245 207736792 -95132421 207703646
+-95132421 207703646 -67926966 207283608
+-67926966 207283608 -61165986 207179222
+-61165986 207179222 -39585479 206846030
+-39585479 206846030 313533 206230010
+313533 206230010 6825515 206129469
+6825515 206129469 54928407 205386785
+54928407 205386785 116626683 204434196
+116626683 204434196 279713745 201916217
+279713745 201916217 360651975 200666573
+360651975 200666573 390232894 200209859
+390232894 200209859 419326364 199760671
+419326364 199760671 464303291 199066250
+464303291 199066250 503815848 198456197
+503815848 198456197 582580649 197240110
+582580649 197240110 738609385 194831107
+738609385 194831107 789800332 194040746
+789800332 194040746 813839837 193669588
+813839837 193669588 820021160 193574152
+820021160 193574152 839482277 193273682
+839482277 193273682 843429660 193212737
+843429660 193212737 879011121 192663377
+879011121 192663377 912395797 192147936
+260033783 1982043891 313404379 1975942450
+313404379 1975942450 644709189 1938066976
+644709189 1938066976 875180438 1911719010
+875180438 1911719010 891794597 1909819644
+891794597 1909819644 908639662 1907893881
+-26875620 334353518 -21012324 334834127
+-21012324 334834127 18996608 338113623
+18996608 338113623 40371427 339865698
+40371427 339865698 47176205 340423480
+47176205 340423480 52044547 340822533
+52044547 340822533 212328613 353960875
+212328613 353960875 298948261 361061011
+298948261 361061011 321901146 362942438
+321901146 362942438 348807428 365147922
+348807428 365147922 385110450 368123648
+385110450 368123648 404009066 369672751
+404009066 369672751 418630905 370871290
+418630905 370871290 439800457 372606540
+439800457 372606540 545512441 381271657
+545512441 381271657 632191050 388376625
+632191050 388376625 640625467 389067986
+640625467 389067986 641673075 389153858
+641673075 389153858 642494634 389221200
+642494634 389221200 722196934 395754327
+722196934 395754327 937802336 413427310
+937802336 413427310 1071713941 424403924
+1071713941 424403924 1093055122 426153242
+1093055122 426153242 1103527993 427011694
+1103527993 427011694 1154782072 431212945
+1154782072 431212945 1179863909 433268881
+1179863909 433268881 1186052699 433776170
+1186052699 433776170 1208489375 435615285
+1208489375 435615285 1405557861 451768813
+1405557861 451768813 1433837391 454086861
+1433837391 454086861 1494706315 459076232
+1494706315 459076232 1615031575 468939186
+1615031575 468939186 2001586007 500624709
+-1258620479 -1356418020 -1208118529 -1274000146
+-1208118529 -1274000146 -1190913824 -1245922513
+-1190913824 -1245922513 -1172951250 -1216608057
+-1172951250 -1216608057 -1122173796 -1133740568
+-1122173796 -1133740568 -1060964372 -1033848376
+-1060964372 -1033848376 -1042337273 -1003449433
+-1042337273 -1003449433 -980341444 -902273845
+-980341444 -902273845 -865055278 -714129811
+-865055278 -714129811 -830961940 -658490367
+-830961940 -658490367 -775577195 -568103898
+-775577195 -568103898 -775427083 -567858919
+-775427083 -567858919 -767719298 -555280013
+-767719298 -555280013 -726567152 -488120778
+-726567152 -488120778 -692680737 -432819027
+-692680737 -432819027 -684439954 -419370283
+-684439954 -419370283 -669646806 -395228248
+-669646806 -395228248 -668561428 -393456939
+-668561428 -393456939 -632679465 -334898505
+-632679465 -334898505 -626002445 -324001781
+-626002445 -324001781 -624513610 -321572042
+-624513610 -321572042 -591093552 -267031372
+-591093552 -267031372 -574190077 -239445340
+-574190077 -239445340 -567256631 -228130136
+-567256631 -228130136 -544374685 -190787392
+-544374685 -190787392 -530669840 -168421441
+-530669840 -168421441 -519367236 -149975883
+-519367236 -149975883 -508668339 -132515561
+-508668339 -132515561 -477107570 -81009204
+-477107570 -81009204 -464847615 -61001275
+-464847615 -61001275 -417451821 16347431
+-417451821 16347431 -394713365 53456003
+-394713365 53456003 -386512733 66839222
+-386512733 66839222 -361236580 108089249
+-361236580 108089249 -335453888 150165934
+-335453888 150165934 -330671884 157970040
+-330671884 157970040 -300469954 207258807
+-300469954 207258807 -298275518 210840070
+-298275518 210840070 -293862227 218042446
+-293862227 218042446 -292106417 220907883
+-292106417 220907883 -245327451 297249944
+-245327451 297249944 -240644222 304892852
+-240644222 304892852 -209444617 355809798
+-209444617 355809798 -188723570 389626011
+-188723570 389626011 -187741798 391228237
+-187741798 391228237 -185402637 395045686
+-185402637 395045686 -177637014 407718983
+-177637014 407718983 -172668868 415826868
+-172668868 415826868 -169604446 420827926
+-169604446 420827926 -160288583 436031173
+-160288583 436031173 -123660568 495807144
+-123660568 495807144 -119502782 502592542
+-119502782 502592542 -112534245 513965015
+-112534245 513965015 -101553446 531885394
+-101553446 531885394 -33340447 643207240
+-33340447 643207240 -947034 696072451
+-947034 696072451 42425518 766855332
+42425518 766855332 61837274 798534814
+61837274 798534814 73560072 817666118
+73560072 817666118 91278625 846582337
+91278625 846582337 106582745 871558263
+106582745 871558263 243585334 1095142939
+243585334 1095142939 243997794 1095816063
+243997794 1095816063 253582173 1111457521
+253582173 1111457521 269301421 1137110926
+269301421 1137110926 287879988 1167430667
+287879988 1167430667 321982869 1223085684
+492917577 -425913523 498750615 -422216213
+498750615 -422216213 512029813 -413799103
+512029813 -413799103 529560014 -402687467
+529560014 -402687467 609873661 -351780120
+609873661 -351780120 618068321 -346585879
+618068321 -346585879 710525391 -287981342
+710525391 -287981342 736130733 -271751223
+736130733 -271751223 742488198 -267721501
+742488198 -267721501 757089700 -258466240
+757089700 -258466240 762431526 -255080288
+762431526 -255080288 785437208 -240497981
+785437208 -240497981 928210208 -150000351
+928210208 -150000351 957202204 -131623579
+957202204 -131623579 974558396 -120622239
+974558396 -120622239 1098145344 -42285817
+1098145344 -42285817 1166884769 1285131
+1166884769 1285131 1193102517 17903427
+1193102517 17903427 1214857469 31692951
+1214857469 31692951 1413234564 157435611
+1413234564 157435611 1529682216 231246742
+1529682216 231246742 1546197401 241715003
+1546197401 241715003 1560129008 250545646
+1560129008 250545646 1619588185 288234247
+-782329904 1154532293 -746348005 1110934256
+-746348005 1110934256 -693846441 1047319907
+-693846441 1047319907 -649587223 993692526
+-649587223 993692526 -504225877 817563155
+-504225877 817563155 -479729609 787881865
+-479729609 787881865 -470654218 776885524
+-470654218 776885524 -435033191 733724745
+-435033191 733724745 -432489669 730642846
+-432489669 730642846 -409773857 703118873
+-409773857 703118873 -397528337 688281395
+-397528337 688281395 -335450751 613064109
+-335450751 613064109 -320124320 594493596
+-320124320 594493596 -306348526 577801937
+-306348526 577801937 -221917432 475499669
+-221917432 475499669 -197618519 446057507
+-197618519 446057507 -181321039 426310408
+-181321039 426310408 -180829511 425714841
+-180829511 425714841 -173883469 417298559
+-173883469 417298559 -172668868 415826868
+-172668868 415826868 -149421318 387658608
+-149421318 387658608 -124716400 357724504
+-124716400 357724504 -99699697 327412620
+-99699697 327412620 -86010708 310826141
+-86010708 310826141 -77854423 300943449
+-77854423 300943449 -76260756 299012457
+-76260756 299012457 -70520038 292056625
+-70520038 292056625 -66842705 287600926
+-66842705 287600926 -47135072 263721862
+-47135072 263721862 -22237676 233554539
+-22237676 233554539 -15453698 225334625
+-15453698 225334625 -15348415 225207057
+-15348415 225207057 -6323544 214271930
+-6323544 214271930 313533 206230010
+313533 206230010 49434664 146711616
+49434664 146711616 152973370 21257308
+152973370 21257308 186201363 -19003915
+186201363 -19003915 221225201 -61441101
+221225201 -61441101 222969906 -63555100
+222969906 -63555100 271986709 -122947084
+271986709 -122947084 291656469 -146780259
+291656469 -146780259 307160687 -165566191
+307160687 -165566191 332749854 -196571709
+332749854 -196571709 368210932 -239538684
+368210932 -239538684 369304068 -240863200
+369304068 -240863200 378660843 -252200483
+378660843 -252200483 424851473 -308168091
+424851473 -308168091 463097761 -354509808
+463097761 -354509808 484510403 -380454775
+484510403 -380454775 488858857 -385723647
+488858857 -385723647 512029813 -413799103
+512029813 -413799103 520778492 -424399577
+520778492 -424399577 548306338 -457754127
+548306338 -457754127 619346308 -543830828
+619346308 -543830828 640161273 -569051610
+640161273 -569051610 685744453 -624283190
+685744453 -624283190 700421764 -642067185
+700421764 -642067185 731951942 -680271224
+731951942 -680271224 747091431 -698615224
+747091431 -698615224 776918917 -734756169
+776918917 -734756169 804314348 -767950276
+804314348 -767950276 825180663 -793233276
+825180663 -793233276 953395294 -948586559
+953395294 -948586559 975910564 -975867541
+975910564 -975867541 1070104015 -1089998523
+1070104015 -1089998523 1132412925 -1165496099
+1132412925 -1165496099 1157269008 -1195613364
+1157269008 -1195613364 1177489661 -1220114038
+1177489661 -1220114038 1245254575 -1302222467
+1245254575 -1302222467 1444016164 -1543055085
+1444016164 -1543055085 1501255879 -1612410489
+1501255879 -1612410489 1642826397 -1783946643
+1642826397 -1783946643 1911542893 -2109541229
+-455407954 -1534786226 -557200701 -1775268467
+-428258389 -1470646213 -455407954 -1534786226
+-422135845 -1456181890 -428258389 -1470646213
+-391484389 -1383768766 -422135845 -1456181890
+-380525730 -1357879273 -391484389 -1383768766
+-357959867 -1304568113 -380525730 -1357879273
+-352592953 -1291888945 -357959867 -1304568113
+-320239611 -1215455166 -352592953 -1291888945
+-297977157 -1162860801 -320239611 -1215455166
+-281529211 -1124003035 -297977157 -1162860801
+-230270181 -1002905149 -281529211 -1124003035
+-195452913 -920650423 -230270181 -1002905149
+-175985832 -874660044 -195452913 -920650423
+-163338759 -844781720 -175985832 -874660044
+-160491115 -838054248 -163338759 -844781720
+-140884116 -791733316 -160491115 -838054248
+-91172907 -674292111 -140884116 -791733316
+-87204198 -664916157 -91172907 -674292111
+-82268622 -653256012 -87204198 -664916157
+-80681513 -649506515 -82268622 -653256012
+-63386928 -608648589 -80681513 -649506515
+-54255095 -587074914 -63386928 -608648589
+-37169402 -546710489 -54255095 -587074914
+-30401674 -530721939 -37169402 -546710489
+-15338500 -495135654 -30401674 -530721939
+1985540 -454208141 -15338500 -495135654
+1994130 -454187847 1985540 -454208141
+9504963 -436443735 1994130 -454187847
+12596647 -429139727 9504963 -436443735
+34278529 -377916945 12596647 -429139727
+47808891 -345951881 34278529 -377916945
+50144200 -340434784 47808891 -345951881
+60843427 -315158189 50144200 -340434784
+83903136 -260680334 60843427 -315158189
+103643126 -214045214 83903136 -260680334
+105581310 -209466315 103643126 -214045214
+111190238 -196215394 105581310 -209466315
+124244158 -165375909 111190238 -196215394
+125906608 -161448422 124244158 -165375909
+146272269 -113335172 125906608 -161448422
+152550923 -98502044 146272269 -113335172
+154777696 -93241363 152550923 -98502044
+186201363 -19003915 154777696 -93241363
+224453271 71365044 186201363 -19003915
+224529431 71544968 224453271 71365044
+226819765 76955812 224529431 71544968
+279713745 201916217 226819765 76955812
+291706835 230249524 279713745 201916217
+337098942 337486983 291706835 230249524
+339074526 342154239 337098942 337486983
+348807428 365147922 339074526 342154239
+350208091 368456946 348807428 365147922
+374579375 426033355 350208091 368456946
+382330155 444344335 374579375 426033355
+399115067 483998174 382330155 444344335
+402144122 491154225 399115067 483998174
+403573178 494530325 402144122 491154225
+477628357 669483413 403573178 494530325
+479004471 672734440 477628357 669483413
+488547142 695278706 479004471 672734440
+509928558 745791646 488547142 695278706
+575412270 900494904 509928558 745791646
+584920051 922956744 575412270 900494904
+612217732 987446679 584920051 922956744
+614210354 992154187 612217732 987446679
+635258786 1041880461 614210354 992154187
+636307711 1044358513 635258786 1041880461
+636737513 1045373907 636307711 1044358513
+-1355170591 1646779958 -1598900167 2024093171
+-1351849647 1641638867 -1355170591 1646779958
+-1287659828 1542267805 -1351849647 1641638867
+-1142123619 1316965914 -1287659828 1542267805
+-1121199540 1284573737 -1142123619 1316965914
+-1000081804 1097073628 -1121199540 1284573737
+-949557236 1018857487 -1000081804 1097073628
+-910516734 958419613 -949557236 1018857487
+-773323329 746033061 -910516734 958419613
+-759731343 724991562 -773323329 746033061
+-733547067 684456171 -759731343 724991562
+-718716491 661497234 -733547067 684456171
+-687153714 612635487 -718716491 661497234
+-666118735 580071627 -687153714 612635487
+-635339355 532422645 -666118735 580071627
+-592955936 466809664 -635339355 532422645
+-583260982 451801085 -592955936 466809664
+-566951295 426552364 -583260982 451801085
+-528491923 367014126 -566951295 426552364
+-516768191 348864836 -528491923 367014126
+-511069828 340043306 -516768191 348864836
+-484364266 298700923 -511069828 340043306
+-478170634 289112677 -484364266 298700923
+-474183743 282940646 -478170634 289112677
+-463862237 266962115 -474183743 282940646
+-444110475 236384780 -463862237 266962115
+-432660231 218658871 -444110475 236384780
+-428912473 212857036 -432660231 218658871
+-426422647 209002583 -428912473 212857036
+-404767387 175478480 -426422647 209002583
+-385856518 146202916 -404767387 175478480
+-361236580 108089249 -385856518 146202916
+-323160359 49144161 -361236580 108089249
+-313191539 33711617 -323160359 49144161
+-293763711 3635758 -313191539 33711617
+-281819939 -14854172 -293763711 3635758
+-252020948 -60985434 -281819939 -14854172
+-232837519 -90682943 -252020948 -60985434
+-230720194 -93960735 -232837519 -90682943
+-197952606 -144687626 -230720194 -93960735
+-155065467 -211080407 -197952606 -144687626
+-146471368 -224384771 -155065467 -211080407
+-141093111 -232710751 -146471368 -224384771
+-119250533 -266524838 -141093111 -232710751
+-90315305 -311318925 -119250533 -266524838
+-58383945 -360751268 -90315305 -311318925
+-58251262 -360956672 -58383945 -360751268
+-24448148 -413286643 -58251262 -360956672
+-14785135 -428245772 -24448148 -413286643
+1985540 -454208141 -14785135 -428245772
+2132447 -454435566 1985540 -454208141
+25312035 -490319454 2132447 -454435566
+51314826 -530573890 25312035 -490319454
+64506903 -550996299 51314826 -530573890
+67483700 -555604622 64506903 -550996299
+128795136 -650519713 67483700 -555604622
+155772498 -692282865 128795136 -650519713
+160607761 -699768244 155772498 -692282865
+170178506 -714584536 160607761 -699768244
+176153236 -723833904 170178506 -714584536
+216498631 -786291858 176153236 -723833904
+226540055 -801836799 216498631 -786291858
+256372875 -848020432 226540055 -801836799
+266037064 -862981383 256372875 -848020432
+274333455 -875824871 266037064 -862981383
+275687889 -877921644 274333455 -875824871
+281886320 -887517320 275687889 -877921644
+330746242 -963156455 281886320 -887517320
+341488629 -979786544 330746242 -963156455
+385084227 -1047276076 341488629 -979786544
+404348230 -1077098319 385084227 -1047276076
+412591639 -1089859788 404348230 -1077098319
+457818415 -1159874517 412591639 -1089859788
+566021904 -1327382319 457818415 -1159874517
+581347821 -1351108087 566021904 -1327382319
+734098033 -1587577840 581347821 -1351108087
+742711827 -1600912695 734098033 -1587577840
+789024248 -1672608089 742711827 -1600912695
+123722109 -1421494395 121474948 -1436879785
+131798203 -1366200716 123722109 -1421494395
+139362239 -1314412887 131798203 -1366200716
+142285086 -1294401359 139362239 -1314412887
+152782000 -1222533322 142285086 -1294401359
+165993421 -1132080181 152782000 -1222533322
+169841429 -1105734455 165993421 -1132080181
+173099900 -1083425049 169841429 -1105734455
+184761617 -1003582091 173099900 -1083425049
+186659513 -990587980 184761617 -1003582091
+193278297 -945271898 186659513 -990587980
+210471033 -827560331 193278297 -945271898
+211487829 -820598748 210471033 -827560331
+214910083 -797167990 211487829 -820598748
+216498631 -786291858 214910083 -797167990
+222337779 -746313623 216498631 -786291858
+222374820 -746060021 222337779 -746313623
+224956510 -728384254 222374820 -746060021
+227756770 -709212030 224956510 -728384254
+230406106 -691073118 227756770 -709212030
+244467504 -594800533 230406106 -691073118
+247952228 -570942065 244467504 -594800533
+249269848 -561920868 247952228 -570942065
+252411436 -540411713 249269848 -561920868
+253599797 -532275490 252411436 -540411713
+255471878 -519458125 253599797 -532275490
+285224729 -315752643 255471878 -519458125
+287368922 -301072237 285224729 -315752643
+287498187 -300187216 287368922 -301072237
+288545542 -293016402 287498187 -300187216
+289808927 -284366530 288545542 -293016402
+294151940 -254631710 289808927 -284366530
+302292800 -198894606 294151940 -254631710
+307160687 -165566191 302292800 -198894606
+309311321 -150841692 307160687 -165566191
+316787751 -99653659 309311321 -150841692
+328788598 -17488820 316787751 -99653659
+329673508 -11430205 328788598 -17488820
+332036055 4745178 329673508 -11430205
+340203404 60663644 332036055 4745178
+341139261 67071075 340203404 60663644
+356914812 175079758 341139261 67071075
+360651975 200666573 356914812 175079758
+365144437 231424605 360651975 200666573
+372078373 278898400 365144437 231424605
+377637045 316956329 372078373 278898400
+380750380 338272049 377637045 316956329
+385110450 368123648 380750380 338272049
+385274874 369249392 385110450 368123648
+393068578 422609669 385274874 369249392
+396293151 444686987 393068578 422609669
+402208261 485185302 396293151 444686987
+402985845 490509099 402208261 485185302
+403573178 494530325 402985845 490509099
+423273461 629410032 403573178 494530325
+432071095 689643794 423273461 629410032
+435229374 711267231 432071095 689643794
+439306344 739180557 435229374 711267231
+451352830 821657873 439306344 739180557
+459027519 874203300 451352830 821657873
+460087565 881461002 459027519 874203300
+461224397 889244416 460087565 881461002
+469842328 948247835 461224397 889244416
+476254290 992147889 469842328 948247835
+477927564 1003604109 476254290 992147889
+486498668 1062286917 477927564 1003604109
+489074272 1079921011 486498668 1062286917
+490808041 1091791416 489074272 1079921011
+503576745 1179213458 490808041 1091791416
+514083549 1251149209 503576745 1179213458
+523499191 1315614223 514083549 1251149209
+532367067 1376328903 523499191 1315614223
+549415460 1493052213 532367067 1376328903
+581438018 1712297445 549415460 1493052213
+597552925 1822629561 581438018 1712297445
+605916131 1879888977 597552925 1822629561
+606739903 1885529004 605916131 1879888977
+-1858342315 -196637368 -1777662687 -171934159
+-1777662687 -171934159 -1584254163 -112714608
+-1584254163 -112714608 -1372144290 -47768910
+-1372144290 -47768910 -1317292939 -30974033
+-1317292939 -30974033 -1285174416 -21139697
+-1285174416 -21139697 -1276213405 -18395934
+-1276213405 -18395934 -1177626802 11790193
+-1177626802 11790193 -1100807992 35311263
+-1100807992 35311263 -1084430248 40325947
+-1084430248 40325947 -1034063341 55747737
+-1034063341 55747737 -900854998 96534659
+-900854998 96534659 -883046617 101987388
+-883046617 101987388 -855955596 110282359
+-855955596 110282359 -851178450 111745068
+-851178450 111745068 -849926806 112128308
+-849926806 112128308 -843011250 114245775
+-843011250 114245775 -770817935 136350569
+-770817935 136350569 -764576704 138261565
+-764576704 138261565 -691717718 160570181
+-691717718 160570181 -681654046 163651566
+-681654046 163651566 -675033860 165678594
+-675033860 165678594 -642371818 175679350
+-642371818 175679350 -563798218 199737717
+-563798218 199737717 -551568182 203482419
+-551568182 203482419 -535469394 208411690
+-535469394 208411690 -516532851 214209849
+-516532851 214209849 -506678300 217227204
+-506678300 217227204 -444110475 236384780
+-444110475 236384780 -392430599 252208586
+-392430599 252208586 -371170255 258718269
+-371170255 258718269 -363181423 261164361
+-363181423 261164361 -362904799 261249060
+-362904799 261249060 -245327451 297249944
+-245327451 297249944 -238185642 299436687
+-238185642 299436687 -162536675 322599564
+-162536675 322599564 -145507523 327813701
+-145507523 327813701 -133213447 331578012
+355982459 1443460968 340422021 1462388448
+497423050 1271414787 355982459 1443460968
+514083549 1251149209 497423050 1271414787
+570229228 1182854460 514083549 1251149209
+583706709 1166460658 570229228 1182854460
+644600918 1092389870 583706709 1166460658
+656376938 1078065698 644600918 1092389870
+673983958 1056648787 656376938 1078065698
+676451826 1053646910 673983958 1056648787
+686840311 1041010515 676451826 1053646910
+699968574 1025041496 686840311 1041010515
+735843539 981403736 699968574 1025041496
+775244904 933476516 735843539 981403736
+790517204 914899522 775244904 933476516
+802138264 900763842 790517204 914899522
+814004910 886329434 802138264 900763842
+853899428 837802350 814004910 886329434
+892783522 790504331 853899428 837802350
+934490334 739772800 892783522 790504331
+950576264 720206120 934490334 739772800
+965927282 701533375 950576264 720206120
+999980862 660111119 965927282 701533375
+1138956137 491063711 999980862 660111119
+1141659411 487775490 1138956137 491063711
+1149615463 478097870 1141659411 487775490
+1164271834 460270084 1149615463 478097870
+1183334168 437082951 1164271834 460270084
+1186052699 433776170 1183334168 437082951
+1196337032 421266464 1186052699 433776170
+1302270080 292411119 1196337032 421266464
+1313737471 278462359 1302270080 292411119
+1337864198 249114975 1313737471 278462359
+1339589150 247016770 1337864198 249114975
+1413234564 157435611 1339589150 247016770
+1447807468 115381656 1413234564 157435611
+1525055414 21418432 1447807468 115381656
+1593936057 -62366932 1525055414 21418432
+-1814319969 1380407355 -1864446949 1387338113
+-1760810088 1373008863 -1814319969 1380407355
+-1627189958 1354534007 -1760810088 1373008863
+-1424956812 1326572439 -1627189958 1354534007
+-1241613819 1301222699 -1424956812 1326572439
+-1150872189 1288676396 -1241613819 1301222699
+-1121199540 1284573737 -1150872189 1288676396
+-964702766 1262935863 -1121199540 1284573737
+-843027653 1246112573 -964702766 1262935863
+-781597447 1237618986 -843027653 1246112573
+-743465074 1232346650 -781597447 1237618986
+-525621486 1202226720 -743465074 1232346650
+-412834102 1186632283 -525621486 1202226720
+-313378155 1172881103 -412834102 1186632283
+-234668254 1161998356 -313378155 1172881103
+-148009628 1150016586 -234668254 1161998356
+-114845201 1145431139 -148009628 1150016586
+-63394440 1138317350 -114845201 1145431139
+-52875641 1136862978 -63394440 1138317350
+-51989365 1136740438 -52875641 1136862978
+167101833 1106448008 -51989365 1136740438
+243150839 1095933167 167101833 1106448008
+243997794 1095816063 243150839 1095933167
+382525982 1076662599 243997794 1095816063
+486498668 1062286917 382525982 1076662599
+504688481 1059771921 486498668 1062286917
+-1926925002 -2122423818 -1641340853 -1425729920
+-1641340853 -1425729920 -1639402774 -1421001900
+-1639402774 -1421001900 -1565446557 -1240582764
+-1565446557 -1240582764 -1542820631 -1185385919
+-1542820631 -1185385919 -1523348866 -1137883774
+-1523348866 -1137883774 -1508673502 -1102082638
+-1508673502 -1102082638 -1370523021 -765059042
+-1370523021 -765059042 -1316097638 -632286154
+-1316097638 -632286154 -1309795218 -616911150
+-1309795218 -616911150 -1257026750 -488180374
+-1257026750 -488180374 -1240518928 -447908884
+-1240518928 -447908884 -1239145512 -444558382
+-1239145512 -444558382 -1233539687 -430882748
+-1233539687 -430882748 -1232472344 -428278922
+-1232472344 -428278922 -1198975029 -346560888
+-1198975029 -346560888 -1197057426 -341882819
+-1197057426 -341882819 -1131606399 -182212436
+-1131606399 -182212436 -1101737886 -109347010
+-1101737886 -109347010 -1101471283 -108696621
+-1101471283 -108696621 -1093304371 -88773114
+-1093304371 -88773114 -1055517329 3409880
+-1055517329 3409880 -1053230869 8987788
+-1053230869 8987788 -1046958267 24290052
+-1046958267 24290052 -1045976772 26684447
+-1045976772 26684447 -1034063341 55747737
+-1034063341 55747737 -1014128087 104380581
+-1014128087 104380581 -995687034 149368263
+-995687034 149368263 -983219182 179784085
+-983219182 179784085 -968309123 216157767
+-968309123 216157767 -927765241 315066180
+-927765241 315066180 -927267699 316279955
+-927267699 316279955 -924695285 322555462
+-924695285 322555462 -917623970 339806215
+-917623970 339806215 -877544754 437581058
+-877544754 437581058 -870475710 454826272
+-870475710 454826272 -856023014 490084200
+-856023014 490084200 -849241124 506628889
+-849241124 506628889 -835911016 539148219
+-835911016 539148219 -825661121 564153246
+-825661121 564153246 -824099564 567962726
+-824099564 567962726 -814253044 591983703
+-814253044 591983703 -796225927 635961571
+-796225927 635961571 -779453098 676879556
+-779453098 676879556 -767685654 705586705
+-767685654 705586705 -759731343 724991562
+-759731343 724991562 -721545786 818146749
+-721545786 818146749 -715992792 831693497
+-715992792 831693497 -649587223 993692526
+-649587223 993692526 -635346094 1028434327
+-635346094 1028434327 -624437785 1055045581
+-624437785 1055045581 -612762497 1083527910
+-612762497 1083527910 -598211160 1119026476
+-598211160 1119026476 -593108907 1131473625
+-1498072772 -2038626908 -1361069435 -1827697895
+-1361069435 -1827697895 -1324164325 -1770879144
+-1324164325 -1770879144 -1210375318 -1595690688
+-1210375318 -1595690688 -1087913612 -1407149830
+-1087913612 -1407149830 -1010069652 -1287302022
+-1010069652 -1287302022 -1002024906 -1274916409
+-1002024906 -1274916409 -983624056 -1246586637
+-983624056 -1246586637 -965535872 -1218738244
+-965535872 -1218738244 -913854186 -1139169620
+-913854186 -1139169620 -912631976 -1137287918
+-912631976 -1137287918 -898105269 -1114922740
+-898105269 -1114922740 -700385611 -810515466
+-700385611 -810515466 -663869251 -754295231
+-663869251 -754295231 -660213628 -748667069
+-660213628 -748667069 -605221684 -664002003
+-605221684 -664002003 -594429792 -647386911
+-594429792 -647386911 -581808028 -627954565
+-581808028 -627954565 -562406443 -598084072
+-562406443 -598084072 -521892347 -535708962
+-521892347 -535708962 -504207173 -508481039
+-504207173 -508481039 -503306879 -507094955
+-503306879 -507094955 -448870340 -423284985
+-448870340 -423284985 -393772017 -338456139
+-393772017 -338456139 -387964099 -329514325
+-387964099 -329514325 -376796545 -312320868
+-376796545 -312320868 -373464390 -307190713
+-373464390 -307190713 -373206504 -306793675
+-373206504 -306793675 -351475774 -273337253
+-351475774 -273337253 -334677669 -247475053
+-334677669 -247475053 -289383789 -177741034
+-289383789 -177741034 -240326954 -102213605
+-240326954 -102213605 -232837519 -90682943
+-232837519 -90682943 -228233112 -83594042
+-228233112 -83594042 -215702868 -64302600
+-215702868 -64302600 -201235299 -42028470
+-201235299 -42028470 -196355142 -34515027
+-196355142 -34515027 -140891092 50876888
+-140891092 50876888 -133243737 62650682
+-133243737 62650682 -132207420 64246185
+-132207420 64246185 -120030228 82994072
+-120030228 82994072 -61860904 172551002
+-61860904 172551002 -49866502 191017466
+-49866502 191017466 -39585479 206846030
+-39585479 206846030 -29638762 222159900
+-29638762 222159900 -27704022 225138607
+-27704022 225138607 -26604803 226830954
+-26604803 226830954 -22237676 233554539
+-22237676 233554539 -8183599 255192061
+-8183599 255192061 42734468 333585024
+42734468 333585024 44074960 335648833
+44074960 335648833 47176205 340423480
+47176205 340423480 54534817 351752728
+54534817 351752728 61141662 361924563
+61141662 361924563 64889761 367695100
+64889761 367695100 174266022 536089734
+174266022 536089734 197327915 571595601
+197327915 571595601 224911171 614062516
+224911171 614062516 230517931 622694630
+230517931 622694630 263049294 672779601
+263049294 672779601 266694561 678391819
+266694561 678391819 358972636 820462251
+358972636 820462251 371984171 840494684
+371984171 840494684 378274912 850179850
+378274912 850179850 391208864 870092836
+391208864 870092836 409812532 898734863
+409812532 898734863 468935855 989760561
+468935855 989760561 477927564 1003604109
+477927564 1003604109 521941871 1071368111
+521941871 1071368111 532938730 1088298768
+532938730 1088298768 583706709 1166460658
+583706709 1166460658 595242366 1184220844
+595242366 1184220844 645861048 1262152877
+464214131 1667378307 446931452 1641459451
+560393335 1811618382 464214131 1667378307
+605916131 1879888977 560393335 1811618382
+644709189 1938066976 605916131 1879888977
+745597309 2089369019 644709189 1938066976
+-1158913674 -399359610 -1134439821 -410113122
+-1134439821 -410113122 -1037796007 -452577230
+-1037796007 -452577230 -1012138053 -463851020
+-1012138053 -463851020 -993560041 -472013971
+-993560041 -472013971 -873570663 -524735833
+-873570663 -524735833 -860588130 -530440199
+-860588130 -530440199 -780015135 -565842986
+-780015135 -565842986 -775427083 -567858919
+-775427083 -567858919 -774536399 -568250275
+-774536399 -568250275 -671529890 -613510073
+-671529890 -613510073 -663305025 -617123978
+-663305025 -617123978 -613284901 -639102207
+-613284901 -639102207 -594429792 -647386911
+-594429792 -647386911 -578099263 -654562345
+-578099263 -654562345 -403710827 -731186487
+-403710827 -731186487 -373015594 -744673597
+-373015594 -744673597 -343386398 -757692302
+-343386398 -757692302 -243685125 -801499820
+-243685125 -801499820 -160491115 -838054248
+-160491115 -838054248 -153723142 -841028013
+-153723142 -841028013 -139031540 -847483323
+-139031540 -847483323 -100281482 -864509623
+-100281482 -864509623 -29304466 -895696054
+-29304466 -895696054 136270878 -968447832
+136270878 -968447832 137510064 -968992314
+137510064 -968992314 149083922 -974077726
+149083922 -974077726 186659513 -990587980
+186659513 -990587980 247255603 -1017213160
+247255603 -1017213160 284376202 -1033523496
+284376202 -1033523496 338833351 -1057451300
+338833351 -1057451300 338886873 -1057474817
+338886873 -1057474817 381728991 -1076299118
+381728991 -1076299118 388071441 -1079085913
+388071441 -1079085913 412591639 -1089859788
+412591639 -1089859788 515737553 -1135180838
+515737553 -1135180838 705004486 -1218342409
+705004486 -1218342409 925717954 -1315321202
+925717954 -1315321202 976938766 -1337827000
+976938766 -1337827000 1037685678 -1364518448
+1037685678 -1364518448 1342122651 -1498284323
+1342122651 -1498284323 1444016164 -1543055085
+1444016164 -1543055085 1465478486 -1552485366
+1465478486 -1552485366 1715504403 -1662343690
+1715504403 -1662343690 1814262300 -1705736699
+-392064042 2063203344 -350214066 1823581892
+-350214066 1823581892 -335135758 1737247646
+-335135758 1737247646 -309270957 1589152908
+-309270957 1589152908 -303420021 1555652061
+-303420021 1555652061 -267542546 1350227509
+-267542546 1350227509 -254109650 1273314442
+-254109650 1273314442 -234668254 1161998356
+-234668254 1161998356 -232884625 1151785784
+-232884625 1151785784 -230669752 1139104032
+-230669752 1139104032 -211687605 1030417480
+-211687605 1030417480 -197814482 950983796
+-197814482 950983796 -183727760 870327099
+-183727760 870327099 -168283057 781894980
+-168283057 781894980 -167579559 777866944
+-167579559 777866944 -143642817 640811740
+-143642817 640811740 -142164841 632349259
+-142164841 632349259 -123711718 526691753
+-123711718 526691753 -122874380 521897387
+-122874380 521897387 -119502782 502592542
+-119502782 502592542 -118879413 499023305
+-118879413 499023305 -113329171 467244143
+-113329171 467244143 -111792414 458445097
+-111792414 458445097 -98602759 382924757
+-98602759 382924757 -94321487 358411374
+-94321487 358411374 -87182316 317534442
+-87182316 317534442 -86010708 310826141
+-86010708 310826141 -83880756 298630621
+-83880756 298630621 -82191683 288959451
+-82191683 288959451 -79649280 274402355
+-79649280 274402355 -78159712 265873493
+-78159712 265873493 -76765888 257892846
+-76765888 257892846 -74120152 242744087
+-74120152 242744087 -70924564 224447031
+-70924564 224447031 -70153970 220034819
+-70153970 220034819 -69057135 213754646
+-69057135 213754646 -67926966 207283608
+-67926966 207283608 -61860904 172551002
+-61860904 172551002 -43416901 66945716
+-43416901 66945716 -26553552 -29609179
+-26553552 -29609179 -18553073 -75417723
+-18553073 -75417723 -13506992 -104310193
+-13506992 -104310193 -7703487 -137539468
+-7703487 -137539468 -3412798 -162106774
+-3412798 -162106774 6946294 -221420086
+6946294 -221420086 13243404 -257475602
+13243404 -257475602 13547887 -259218991
+13547887 -259218991 14153568 -262686951
+14153568 -262686951 17194909 -280100836
+17194909 -280100836 24891745 -324170801
+24891745 -324170801 34278529 -377916945
+34278529 -377916945 45698670 -443305527
+45698670 -443305527 46692256 -448994531
+46692256 -448994531 50694858 -471912329
+50694858 -471912329 59609651 -522955980
+59609651 -522955980 64506903 -550996299
+64506903 -550996299 65279025 -555417253
+65279025 -555417253 68356944 -573040576
+68356944 -573040576 87224617 -681071677
+87224617 -681071677 87227650 -681089043
+87227650 -681089043 88724328 -689658612
+88724328 -689658612 93482082 -716900203
+93482082 -716900203 97998814 -742761766
+97998814 -742761766 99402315 -750797826
+99402315 -750797826 99906361 -753683856
+99906361 -753683856 122024772 -880327792
+122024772 -880327792 137510064 -968992314
+137510064 -968992314 138786716 -976302071
+138786716 -976302071 139490336 -980330811
+139490336 -980330811 141919122 -994237367
+141919122 -994237367 161568565 -1106744673
+161568565 -1106744673 165993421 -1132080181
+165993421 -1132080181 185019277 -1241017003
+185019277 -1241017003 190735195 -1273744777
+190735195 -1273744777 195368237 -1300272297
+195368237 -1300272297 206444969 -1363694617
+206444969 -1363694617 221170714 -1448010186
+221170714 -1448010186 244200116 -1579870207
+244200116 -1579870207 269176562 -1722878466
+269176562 -1722878466 286889279 -1824296606
+-929362981 -337803818 -857847720 -366513355
+-857847720 -366513355 -805686073 -387453454
+-805686073 -387453454 -745350275 -411675036
+-745350275 -411675036 -692680737 -432819027
+-692680737 -432819027 -678202772 -438631152
+-678202772 -438631152 -667397850 -442968748
+-667397850 -442968748 -660671293 -445669099
+-660671293 -445669099 -646669644 -451290009
+-646669644 -451290009 -644109357 -452317827
+-644109357 -452317827 -604047719 -468400422
+-604047719 -468400422 -508828924 -506625654
+-508828924 -506625654 -504207173 -508481039
+-504207173 -508481039 -484635523 -516338005
+-484635523 -516338005 -325081309 -580390451
+-325081309 -580390451 -279920488 -598520095
+-279920488 -598520095 -239663271 -614681206
+-239663271 -614681206 -179489718 -638837655
+-179489718 -638837655 -129262791 -659001068
+-129262791 -659001068 -100915353 -670381042
+-100915353 -670381042 -91172907 -674292111
+-91172907 -674292111 -41349872 -694293383
+-41349872 -694293383 30209841 -723020764
+30209841 -723020764 61706900 -735665142
+61706900 -735665142 88561560 -746445845
+88561560 -746445845 99402315 -750797826
+99402315 -750797826 101694863 -751718161
+101694863 -751718161 159520560 -774932072
+159520560 -774932072 187315792 -786090365
+187315792 -786090365 214910083 -797167990
+214910083 -797167990 226540055 -801836799
+226540055 -801836799 246071516 -809677632
+246071516 -809677632 265014447 -817282201
+265014447 -817282201 265859833 -817621578
+265859833 -817621578 320811726 -839681812
+320811726 -839681812 342140089 -848244004
+342140089 -848244004 439678116 -887400282
+439678116 -887400282 747530719 -1010986567
+747530719 -1010986567 778178252 -1023289905
+778178252 -1023289905 807285454 -1034974883
+807285454 -1034974883 894234683 -1069880328
+894234683 -1069880328 903674904 -1073670070
+903674904 -1073670070 921041630 -1080641877
+921041630 -1080641877 1044373225 -1130152888
+1044373225 -1130152888 1132412925 -1165496099
+1132412925 -1165496099 1188907597 -1188175675
+1188907597 -1188175675 1266592091 -1219361826
+1266592091 -1219361826 1376706434 -1263566821
+1376706434 -1263566821 1380772458 -1265199110
+-1970336709 -1231344736 -1917486379 -1190259724
+-1917486379 -1190259724 -1838978143 -1129228660
+-1838978143 -1129228660 -1713970218 -1032049472
+-1713970218 -1032049472 -1599053525 -942715049
+-1599053525 -942715049 -1475298703 -846510004
+-1475298703 -846510004 -1370523021 -765059042
+-1370523021 -765059042 -1352867365 -751333813
+-1352867365 -751333813 -1289199735 -701839603
+-1289199735 -701839603 -1180169079 -617080892
+-1180169079 -617080892 -1173546229 -611932393
+-1173546229 -611932393 -1149448813 -593199441
+-1149448813 -593199441 -1111327926 -563564866
+-1111327926 -563564866 -1062594812 -525680512
+-1062594812 -525680512 -1058175206 -522244781
+-1058175206 -522244781 -993560041 -472013971
+-993560041 -472013971 -985925201 -466078766
+-985925201 -466078766 -911937089 -408561576
+-911937089 -408561576 -857847720 -366513355
+-857847720 -366513355 -756293016 -287566330
+-756293016 -287566330 -746669564 -280085211
+-746669564 -280085211 -744974594 -278767568
+-744974594 -278767568 -732988271 -269449589
+-732988271 -269449589 -697005486 -241477140
+-697005486 -241477140 -672579357 -222488653
+-672579357 -222488653 -658003956 -211157966
+-658003956 -211157966 -641673370 -198462827
+-641673370 -198462827 -604173778 -169311236
+-604173778 -169311236 -600760197 -166657571
+-600760197 -166657571 -564634914 -138574347
+-564634914 -138574347 -543683473 -122287028
+-543683473 -122287028 -523241039 -106395401
+-523241039 -106395401 -485212666 -76832745
+-485212666 -76832745 -464847615 -61001275
+-464847615 -61001275 -377246599 7098371
+-377246599 7098371 -347767651 30014840
+-347767651 30014840 -347553069 30181654
+-347553069 30181654 -323160359 49144161
+-323160359 49144161 -292399364 73057273
+-292399364 73057273 -221643812 128061522
+-221643812 128061522 -214925263 133284417
+-214925263 133284417 -176704835 162996374
+-176704835 162996374 -139371410 192018789
+-139371410 192018789 -127419654 201309896
+-127419654 201309896 -118726361 208067924
+-118726361 208067924 -98218648 224010297
+-98218648 224010297 -88073278 231897148
+-88073278 231897148 -81836985 236745143
+-81836985 236745143 -74120152 242744087
+-74120152 242744087 -64446557 250264188
+-64446557 250264188 -47135072 263721862
+-47135072 263721862 -32957965 274742922
+-32957965 274742922 42734468 333585024
+42734468 333585024 44608225 335041654
+44608225 335041654 52044547 340822533
+52044547 340822533 77386351 360522852
+77386351 360522852 79729812 362344622
+79729812 362344622 84288035 365888112
+84288035 365888112 245376981 491116116
+245376981 491116116 323229343 551637313
+323229343 551637313 327629867 555058211
+327629867 555058211 423273461 629410032
+423273461 629410032 476788154 671011510
+476788154 671011510 479004471 672734440
+479004471 672734440 510869669 697505941
+510869669 697505941 665437888 817664835
+665437888 817664835 790517204 914899522
+790517204 914899522 811685325 931355284
+811685325 931355284 820568103 938260616
+820568103 938260616 824971423 941683688
+824971423 941683688 873958380 979765375
+873958380 979765375 988839235 1069071939
+988839235 1069071939 994244729 1073274084
+-893566865 557377933 -923456421 610952082
+-887866922 547161336 -893566865 557377933
+-884398703 540944887 -887866922 547161336
+-883328272 539026243 -884398703 540944887
+-856023014 490084200 -883328272 539026243
+-834481633 451473352 -856023014 490084200
+-814259613 415227332 -834481633 451473352
+-813673396 414176595 -814259613 415227332
+-773992287 343052033 -813673396 414176595
+-762853554 323086928 -773992287 343052033
+-718182903 243019093 -762853554 323086928
+-698223351 207243520 -718182903 243019093
+-695143363 201722938 -698223351 207243520
+-689425870 191474885 -695143363 201722938
+-681994905 178155596 -689425870 191474885
+-675033860 165678594 -681994905 178155596
+-658496344 136036691 -675033860 165678594
+-634579097 93167332 -658496344 136036691
+-631873628 88318040 -634579097 93167332
+-617380350 62340236 -631873628 88318040
+-613238220 54915868 -617380350 62340236
+-599296394 29926489 -613238220 54915868
+-580749924 -3316270 -599296394 29926489
+-561732644 -37402911 -580749924 -3316270
+-523241039 -106395401 -561732644 -37402911
+-508668339 -132515561 -523241039 -106395401
+-496187715 -154885876 -508668339 -132515561
+-463322015 -213794474 -496187715 -154885876
+-454762664 -229136286 -463322015 -213794474
+-448207354 -240886045 -454762664 -229136286
+-440047715 -255511413 -448207354 -240886045
+-433154902 -267866115 -440047715 -255511413
+-419972623 -291494079 -433154902 -267866115
+-396650922 -333295979 -419972623 -291494079
+-393772017 -338456139 -396650922 -333295979
+-337275350 -439720967 -393772017 -338456139
+-308892302 -490594843 -337275350 -439720967
+-302318751 -502377299 -308892302 -490594843
+-289551515 -525261340 -302318751 -502377299
+-260369511 -577567268 -289551515 -525261340
+-239663271 -614681206 -260369511 -577567268
+-222231473 -645926023 -239663271 -614681206
+-212735420 -662946783 -222231473 -645926023
+-172109341 -735765111 -212735420 -662946783
+-140884116 -791733316 -172109341 -735765111
+-120596844 -828096296 -140884116 -791733316
+-118290553 -832230101 -120596844 -828096296
+-100281482 -864509623 -118290553 -832230101
+-62516912 -932198974 -100281482 -864509623
+-51434299 -952063488 -62516912 -932198974
+11044870 -1064051375 -51434299 -952063488
+42945404 -1121230005 11044870 -1064051375
+74385727 -1177583754 42945404 -1121230005
+107514778 -1236964381 74385727 -1177583754
+-413622038 1594902451 -515452333 1765462477
+-377517460 1534429313 -413622038 1594902451
+-377145160 1533805730 -377517460 1534429313
+-366386643 1515785818 -377145160 1533805730
+-267542546 1350227509 -366386643 1515785818
+-215647139 1263305618 -267542546 1350227509
+-148009628 1150016586 -215647139 1263305618
+-144701321 1144475358 -148009628 1150016586
+-144310959 1143821523 -144701321 1144475358
+-117514496 1098938954 -144310959 1143821523
+-91898220 1056033130 -117514496 1098938954
+32640510 847437753 -91898220 1056033130
+52491299 814188797 32640510 847437753
+61837274 798534814 52491299 814188797
+72196640 781183457 61837274 798534814
+99732786 735061960 72196640 781183457
+113083189 712700785 99732786 735061960
+136569629 673362318 113083189 712700785
+137636636 671575141 136569629 673362318
+140605075 666603171 137636636 671575141
+144008697 660902296 140605075 666603171
+183422069 594887113 144008697 660902296
+197327915 571595601 183422069 594887113
+201666427 564328837 197327915 571595601
+245376981 491116116 201666427 564328837
+277494161 437321642 245376981 491116116
+314862237 374732214 277494161 437321642
+319029452 367752364 314862237 374732214
+321901146 362942438 319029452 367752364
+334031986 342623962 321901146 362942438
+337098942 337486983 334031986 342623962
+352753925 311265766 337098942 337486983
+372078373 278898400 352753925 311265766
+400088065 231983741 372078373 278898400
+410108120 215200711 400088065 231983741
+419326364 199760671 410108120 215200711
+437128547 169943014 419326364 199760671
+503597563 58611146 437128547 169943014
+505643777 55183852 503597563 58611146
+527055162 19320986 505643777 55183852
+531451869 11956747 527055162 19320986
+570619967 -53647616 531451869 11956747
+587796268 -82416956 570619967 -53647616
+625219707 -145099114 587796268 -82416956
+636476579 -163953741 625219707 -145099114
+641874753 -172995379 636476579 -163953741
+655254329 -195405417 641874753 -172995379
+663031408 -208431588 655254329 -195405417
+667848097 -216499272 663031408 -208431588
+679490759 -236000077 667848097 -216499272
+683378475 -242511783 679490759 -236000077
+683444575 -242622497 683378475 -242511783
+683919830 -243418522 683444575 -242622497
+710525391 -287981342 683919830 -243418522
+798315595 -435025002 710525391 -287981342
+845866456 -514670023 798315595 -435025002
+848121061 -518446359 845866456 -514670023
+856070443 -531761127 848121061 -518446359
+871116627 -556962640 856070443 -531761127
+905490586 -614537092 871116627 -556962640
+998432080 -770208873 905490586 -614537092
+1029319266 -821943175 998432080 -770208873
+1043809057 -846212761 1029319266 -821943175
+1063237884 -878754954 1043809057 -846212761
+1074183769 -897088696 1063237884 -878754954
+1131838873 -993657757 1074183769 -897088696
+1178328851 -1071525858 1131838873 -993657757
+1266592091 -1219361826 1178328851 -1071525858
+1280448974 -1242571327 1266592091 -1219361826
+1290728296 -1259788615 1280448974 -1242571327
+1465478486 -1552485366 1290728296 -1259788615
+1501255879 -1612410489 1465478486 -1552485366
+1616586962 -1805583574 1501255879 -1612410489
+1737155963 -2007529877 1616586962 -1805583574
+-1748453402 -297985693 -1888400787 -362666474
+-1623721631 -240337254 -1748453402 -297985693
+-1348496291 -113133805 -1623721631 -240337254
+-1295069190 -88440906 -1348496291 -113133805
+-1218657524 -53125018 -1295069190 -88440906
+-1155148799 -23772601 -1218657524 -53125018
+-1131296872 -12748735 -1155148799 -23772601
+-1113584447 -4562419 -1131296872 -12748735
+-1049138605 25223113 -1113584447 -4562419
+-1045976772 26684447 -1049138605 25223113
+-903210205 92668195 -1045976772 26684447
+-883046617 101987388 -903210205 92668195
+-857145917 113958155 -883046617 101987388
+-856264171 114365679 -857145917 113958155
+-853779610 115513992 -856264171 114365679
+-852033065 116321209 -853779610 115513992
+-781753556 148802941 -852033065 116321209
+-767615200 155337397 -781753556 148802941
+-695625994 188609316 -767615200 155337397
+-689425870 191474885 -695625994 188609316
+-681655210 195066323 -689425870 191474885
+-573851411 244891004 -681655210 195066323
+-543762578 258797439 -573851411 244891004
+-478170634 289112677 -543762578 258797439
+-469094717 293307377 -478170634 289112677
+-469046489 293329667 -469094717 293307377
+-426397239 313041267 -469046489 293329667
+-424051517 314125411 -426397239 313041267
+-340256607 352853682 -424051517 314125411
+-327215005 358881240 -340256607 352853682
+-275700213 382690309 -327215005 358881240
+-245571474 396615188 -275700213 382690309
+-208880174 413573146 -245571474 396615188
+-206299951 414765672 -208880174 413573146
+-181321039 426310408 -206299951 414765672
+-180964407 426475236 -181321039 426310408
+-160288583 436031173 -180964407 426475236
+-139552522 445614950 -160288583 436031173
+-111792414 458445097 -139552522 445614950
+-77637137 474230958 -111792414 458445097
+-7970694 506429344 -77637137 474230958
+66381701 540793480 -7970694 506429344
+183422069 594887113 66381701 540793480
+224911171 614062516 183422069 594887113
+235434676 618926262 224911171 614062516
+270259683 635021659 235434676 618926262
+284801752 641742701 270259683 635021659
+376432238 684092413 284801752 641742701
+435229374 711267231 376432238 684092413
+450718069 718425785 435229374 711267231
+509928558 745791646 450718069 718425785
+665437888 817664835 509928558 745791646
+794874148 877487592 665437888 817664835
+814004910 886329434 794874148 877487592
+840063064 898372972 814004910 886329434
+964941903 956089384 840063064 898372972
+994207899 969615521 964941903 956089384
+1022625150 982749385 994207899 969615521
+1078629134 1008633266 1022625150 982749385
+1081878443 1010135029 1078629134 1008633266
+1326679789 1123277138 1081878443 1010135029
+1336308389 1127727278 1326679789 1123277138
+1390424985 1152738847 1336308389 1127727278
+1436768515 1174157866 1390424985 1152738847
+1627791630 1262444791 1436768515 1174157866
+1867420330 1373196210 1627791630 1262444791
+-1251391342 -417431457 -1285607633 -321516739
+-1248486466 -425574373 -1251391342 -417431457
+-1241794486 -444333254 -1248486466 -425574373
+-1240518928 -447908884 -1241794486 -444333254
+-1237555690 -456215398 -1240518928 -447908884
+-1180169079 -617080892 -1237555690 -456215398
+-1176523842 -627299176 -1180169079 -617080892
+-1128381808 -762250378 -1176523842 -627299176
+-1100294320 -840984902 -1128381808 -762250378
+-1098917016 -844845746 -1100294320 -840984902
+-1070814950 -923621134 -1098917016 -844845746
+-1042337273 -1003449433 -1070814950 -923621134
+-984573503 -1165372174 -1042337273 -1003449433
+-965535872 -1218738244 -984573503 -1165372174
+-956771096 -1243307564 -965535872 -1218738244
+-937662545 -1296872434 -956771096 -1243307564
+-935971828 -1301611834 -937662545 -1296872434
+-900566351 -1400860062 -935971828 -1301611834
+-899514389 -1403808911 -900566351 -1400860062
+-898682283 -1406141461 -899514389 -1403808911
+-842930049 -1562425485 -898682283 -1406141461
+-826071673 -1609682692 -842930049 -1562425485
+-808907651 -1657796683 -826071673 -1609682692
+-784629276 -1725853547 -808907651 -1657796683
+-761855793 -1789691912 -784629276 -1725853547
+1183029115 1774770771 1254444672 1473301628
+1254444672 1473301628 1264758922 1429761698
+1264758922 1429761698 1285616751 1341713771
+1285616751 1341713771 1304428175 1262304411
+1304428175 1262304411 1311802937 1231173055
+1311802937 1231173055 1317601206 1206696606
+1317601206 1206696606 1335199602 1132407842
+1335199602 1132407842 1336308389 1127727278
+1336308389 1127727278 1355625300 1046184086
+1355625300 1046184086 1379306698 946216919
+1379306698 946216919 1393020130 888327901
+1393020130 888327901 1404035780 841827128
+1404035780 841827128 1416811498 787896515
+1416811498 787896515 1429342826 734997559
+1429342826 734997559 1434517804 713152232
+1434517804 713152232 1468358062 570301093
+1468358062 570301093 1469235783 566595935
+1469235783 566595935 1481897740 513145548
+1481897740 513145548 1494706315 459076232
+1494706315 459076232 1544166002 250290221
+1544166002 250290221 1546197401 241715003
+1546197401 241715003 1549105866 229437390
+1549105866 229437390 1598963761 18970406
+1598963761 18970406 1648022623 -188123590
+1648022623 -188123590 1654506878 -215495815
+1654506878 -215495815 1715841182 -474408587
+1715841182 -474408587 1719004791 -487763249
+1719004791 -487763249 1727795573 -524872103
+1727795573 -524872103 1747924056 -609841217
+1747924056 -609841217 1854345392 -1059081550
+1854345392 -1059081550 1896055492 -1235153947
+1896055492 -1235153947 1928896418 -1373786563
+-139575003 -267109550 -119250533 -266524838
+-119250533 -266524838 -103049948 -266058765
+-103049948 -266058765 -88846340 -265650143
+-88846340 -265650143 -38213872 -264193504
+-38213872 -264193504 2579838 -263019914
+2579838 -263019914 14153568 -262686951
+14153568 -262686951 15098323 -262659771
+15098323 -262659771 33975828 -262116687
+33975828 -262116687 40901478 -261917443
+40901478 -261917443 83903136 -260680334
+83903136 -260680334 233115939 -256387648
+233115939 -256387648 235612189 -256315833
+235612189 -256315833 262348588 -255546657
+262348588 -255546657 294151940 -254631710
+294151940 -254631710 352637962 -252949132
+352637962 -252949132 353640250 -252920298
+353640250 -252920298 378660843 -252200483
+378660843 -252200483 442894707 -250352546
+442894707 -250352546 560956331 -246956045
+560956331 -246956045 625763440 -245091617
+625763440 -245091617 632138524 -244908213
+632138524 -244908213 655967263 -244222687
+655967263 -244222687 682298742 -243465159
+682298742 -243465159 682789050 -243451054
+682789050 -243451054 683919830 -243418522
+683919830 -243418522 708646185 -242707173
+708646185 -242707173 718300422 -242429431
+718300422 -242429431 721596891 -242334595
+721596891 -242334595 730619911 -242075013
+730619911 -242075013 785437208 -240497981
+785437208 -240497981 870596885 -238048032
+870596885 -238048032 936830651 -236142560
+936830651 -236142560 974971004 -235045305
+974971004 -235045305 1036380737 -233278615
+1036380737 -233278615 1042705743 -233096652
+1042705743 -233096652 1297139391 -225776879
+1297139391 -225776879 1336091592 -224656268
+1336091592 -224656268 1630031381 -216199948
+1630031381 -216199948 1654506878 -215495815
+1654506878 -215495815 1787076935 -211681923
+1787076935 -211681923 2081658360 -203207143
+-1104334171 -1628425713 -949424281 -1589313522
+-949424281 -1589313522 -842930049 -1562425485
+-842930049 -1562425485 -735532205 -1535309301
+-735532205 -1535309301 -697066583 -1525597366
+-697066583 -1525597366 -666739754 -1517940342
+-666739754 -1517940342 -642280056 -1511764672
+-642280056 -1511764672 -574199147 -1494575365
+-574199147 -1494575365 -464860728 -1466969218
+-464860728 -1466969218 -450020781 -1463222377
+-450020781 -1463222377 -422135845 -1456181890
+-422135845 -1456181890 -354243649 -1439040231
+-354243649 -1439040231 -96048261 -1373850155
+-96048261 -1373850155 -72876873 -1367999762
+-72876873 -1367999762 31430862 -1341663779
+31430862 -1341663779 139362239 -1314412887
+139362239 -1314412887 195368237 -1300272297
+195368237 -1300272297 259934157 -1283970467
+259934157 -1283970467 409572127 -1246189348
+409572127 -1246189348 412350205 -1245487929
+838025038 1199465019 901670253 1219692052
+901670253 1219692052 926826358 1227686893
+926826358 1227686893 997962769 1250294697
+997962769 1250294697 1285616751 1341713771
+1285616751 1341713771 1386323940 1373719439
+1386323940 1373719439 1471428210 1400766357
+1471428210 1400766357 1531407131 1419828208
+1531407131 1419828208 1633735034 1452348954
+1633735034 1452348954 1775170566 1497298464
+1775170566 1497298464 1982632917 1563231902
+1982632917 1563231902 2006865240 1570933156
+2006865240 1570933156 2051553381 1585135458
+439800457 372606540 417437724 383136355
+444106695 370578886 439800457 372606540
+499029375 344717751 444106695 370578886
+545264630 322947217 499029375 344717751
+550002939 320716115 545264630 322947217
+569324861 311618110 550002939 320716115
+612004355 291521857 569324861 311618110
+711101352 244860610 612004355 291521857
+727328261 237219937 711101352 244860610
+743235165 229729942 727328261 237219937
+816946369 195021961 743235165 229729942
+820021160 193574152 816946369 195021961
+833102554 187414589 820021160 193574152
+839628093 184341945 833102554 187414589
+851896024 178565413 839628093 184341945
+909972802 151219127 851896024 178565413
+919260057 146846089 909972802 151219127
+925785935 143773286 919260057 146846089
+951190686 131811094 925785935 143773286
+1042897841 88629460 951190686 131811094
+1110524983 56786247 1042897841 88629460
+1159954902 33511459 1110524983 56786247
+1179166122 24465579 1159954902 33511459
+1193102517 17903427 1179166122 24465579
+1282891535 -24375024 1193102517 17903427
+1587626793 -167864003 1282891535 -24375024
+-396650922 -333295979 -502702642 -379463704
+-387964099 -329514325 -396650922 -333295979
+-368961968 -321242087 -387964099 -329514325
+-360805384 -317691263 -368961968 -321242087
+-352746598 -314183015 -360805384 -317691263
+-304801778 -293311092 -352746598 -314183015
+-232080656 -261653248 -304801778 -293311092
+-208514195 -251394010 -232080656 -261653248
+-170801749 -234976569 -208514195 -251394010
+-146471368 -224384771 -170801749 -234976569
+-130259722 -217327320 -146471368 -224384771
+-100949656 -204567706 -130259722 -217327320
+-71305620 -191662703 -100949656 -204567706
+-25816638 -171859886 -71305620 -191662703
+-3412798 -162106774 -25816638 -171859886
+20756695 -151585016 -3412798 -162106774
+83110285 -124440492 20756695 -151585016
+121637981 -107668147 83110285 -124440492
+150250752 -95212087 121637981 -107668147
+154777696 -93241363 150250752 -95212087
+216709707 -66280366 154777696 -93241363
+222969906 -63555100 216709707 -66280366
+328788598 -17488820 222969906 -63555100
+334306775 -15086580 328788598 -17488820
+351778866 -7480416 334306775 -15086580
+451918890 36113757 351778866 -7480416
+496426071 55489165 451918890 36113757
+503597563 58611146 496426071 55489165
+544932723 76605671 503597563 58611146
+560640019 83443563 544932723 76605671
+753654158 167468826 560640019 83443563
+798817322 187129804 753654158 167468826
+813839837 193669588 798817322 187129804
+816946369 195021961 813839837 193669588
+850456729 209610099 816946369 195021961
+863410696 215249378 850456729 209610099
+920997707 240318856 863410696 215249378
+1010943676 279475230 920997707 240318856
+1011119742 279551877 1010943676 279475230
+1058947471 300372826 1011119742 279551877
+1114391131 324509235 1058947471 300372826
+1119458900 326715398 1114391131 324509235
+1120852368 327322019 1119458900 326715398
+1212605161 367264962 1120852368 327322019
+1205329621 -2144704708 1529449927 -1877436419
+1529449927 -1877436419 1616586962 -1805583574
+1616586962 -1805583574 1642826397 -1783946643
+1642826397 -1783946643 1645718082 -1781562171
+-94163870 268666421 -102791782 274009194
+-88573713 265204756 -94163870 268666421
+-79918647 259845169 -88573713 265204756
+-76765888 257892846 -79918647 259845169
+-64446557 250264188 -76765888 257892846
+-26604803 226830954 -64446557 250264188
+-23968401 225198381 -26604803 226830954
+-21770882 223837583 -23968401 225198381
+-6323544 214271930 -21770882 223837583
+6825515 206129469 -6323544 214271930
+71779370 165907261 6825515 206129469
+221682343 73080922 71779370 165907261
+224453271 71365044 221682343 73080922
+225865904 70490281 224453271 71365044
+236170098 64109483 225865904 70490281
+300946950 23996882 236170098 64109483
+332036055 4745178 300946950 23996882
+351778866 -7480416 332036055 4745178
+416720962 -47695343 351778866 -7480416
+491658474 -94099859 416720962 -47695343
+512512207 -107013384 491658474 -94099859
+534825191 -120830539 512512207 -107013384
+621566180 -174544273 534825191 -120830539
+624939885 -176633416 621566180 -174544273
+655254329 -195405417 624939885 -176633416
+667592700 -203045865 655254329 -195405417
+672350842 -205992311 667592700 -203045865
+696796304 -221129987 672350842 -205992311
+699578695 -222852963 696796304 -221129987
+705413580 -226466173 699578695 -222852963
+717434616 -233910114 705413580 -226466173
+730619911 -242075013 717434616 -233910114
+745232404 -251123695 730619911 -242075013
+757089700 -258466240 745232404 -251123695
+821515478 -298361440 757089700 -258466240
+900530702 -347291050 821515478 -298361440
+901289272 -347760789 900530702 -347291050
+962027641 -385372588 901289272 -347760789
+1008312234 -414033990 962027641 -385372588
+1088629374 -463769802 1008312234 -414033990
+1106980115 -475133367 1088629374 -463769802
+1172382804 -515633512 1106980115 -475133367
+1362654005 -633457587 1172382804 -515633512
+1419654357 -668754645 1362654005 -633457587
+-448240046 1933086959 -434753250 1857062948
+-434753250 1857062948 -387995013 1593490452
+-387995013 1593490452 -377517460 1534429313
+-377517460 1534429313 -377393767 1533732063
+-377393767 1533732063 -369852674 1491223516
+-369852674 1491223516 -334926018 1294344707
+-334926018 1294344707 -313378155 1172881103
+-313378155 1172881103 -310781410 1158243454
+-310781410 1158243454 -306649730 1134953500
+-306649730 1134953500 -286004046 1018575408
+-286004046 1018575408 -279368610 981171976
+-279368610 981171976 -241147887 765724773
+-241147887 765724773 -239873582 758541615
+-239873582 758541615 -239644094 757248012
+-239644094 757248012 -217734790 633746988
+-217734790 633746988 -216176796 624964698
+-216176796 624964698 -214144547 613509071
+-214144547 613509071 -192136402 489450893
+-192136402 489450893 -185843494 453978267
+-185843494 453978267 -180964407 426475236
+-180964407 426475236 -180829511 425714841
+-180829511 425714841 -178640403 413375009
+-178640403 413375009 -177637014 407718983
+-177637014 407718983 -174492578 389994046
+-174492578 389994046 -173758609 385856721
+-173758609 385856721 -169566344 362225254
+-169566344 362225254 -168592007 356732994
+-168592007 356732994 -162536675 322599564
+-162536675 322599564 -153541709 271895648
+-153541709 271895648 -144914210 223263117
+-144914210 223263117 -142496016 209631948
+-142496016 209631948 -142283077 208431628
+-142283077 208431628 -140523963 198515639
+-140523963 198515639 -139371410 192018789
+-139371410 192018789 -124374623 107483083
+-124374623 107483083 -120030228 82994072
+-120030228 82994072 -113372947 45467505
+-113372947 45467505 -107427917 11955837
+-107427917 11955837 -106637565 7500685
+-106637565 7500685 -95049558 -57819995
+-95049558 -57819995 -87931160 -97945848
+-87931160 -97945848 -78152255 -153068761
+-78152255 -153068761 -71305620 -191662703
+-71305620 -191662703 -65052458 -226911285
+-65052458 -226911285 -63295691 -236814040
+-352102531 -1505182278 -340953161 -1500428772
+-340953161 -1500428772 -335163710 -1497960455
+-335163710 -1497960455 -46911640 -1375064908
+-46911640 -1375064908 -39618894 -1371955664
+-39618894 -1371955664 31430862 -1341663779
+31430862 -1341663779 142285086 -1294401359
+142285086 -1294401359 190735195 -1273744777
+190735195 -1273744777 220194182 -1261185012
+220194182 -1261185012 388337532 -1189497517
+388337532 -1189497517 407904797 -1181155063
+407904797 -1181155063 425581702 -1173618559
+425581702 -1173618559 457818415 -1159874517
+457818415 -1159874517 515737553 -1135180838
+515737553 -1135180838 607917662 -1095880080
+607917662 -1095880080 765957726 -1028500096
+765957726 -1028500096 778178252 -1023289905
+778178252 -1023289905 789163799 -1018606245
+789163799 -1018606245 794307955 -1016413047
+794307955 -1016413047 953395294 -948586559
+953395294 -948586559 1000776082 -928385879
+1000776082 -928385879 1008829712 -924952234
+1008829712 -924952234 1050152606 -907334322
+1050152606 -907334322 1074183769 -897088696
+1074183769 -897088696 1090161367 -890276687
+1090161367 -890276687 1206819091 -840539960
+1206819091 -840539960 1238653503 -826967438
+1238653503 -826967438 1251525555 -821479471
+1251525555 -821479471 1288699405 -805630494
+1288699405 -805630494 1747924056 -609841217
+1747924056 -609841217 1806226305 -584984200
+1806226305 -584984200 1862098116 -561163393
+-650911164 -500519358 -652892123 -514557584
+-650078874 -494621272 -650911164 -500519358
+-644109357 -452317827 -650078874 -494621272
+-643591127 -448645351 -644109357 -452317827
+-627866674 -337212784 -643591127 -448645351
+-626002445 -324001781 -627866674 -337212784
+-625083070 -317486565 -626002445 -324001781
+-620168913 -282662007 -625083070 -317486565
+-618255572 -269102965 -620168913 -282662007
+-612257546 -226597483 -618255572 -269102965
+-604173778 -169311236 -612257546 -226597483
+-603626240 -165431066 -604173778 -169311236
+-595952907 -111053396 -603626240 -165431066
+-590082530 -69452507 -595952907 -111053396
+-583944832 -25957235 -590082530 -69452507
+-580749924 -3316270 -583944832 -25957235
+-572928036 52114149 -580749924 -3316270
+-567170907 92912491 -572928036 52114149
+-566779722 95684653 -567170907 92912491
+-565042625 107994725 -566779722 95684653
+-564151625 114308870 -565042625 107994725
+-561148023 135594128 -564151625 114308870
+-551568182 203482419 -561148023 135594128
+-550869367 208434627 -551568182 203482419
+-549051075 221320090 -550869367 208434627
+-543762578 258797439 -549051075 221320090
+-535578985 316791107 -543762578 258797439
+-533800438 329394923 -535578985 316791107
+-531098700 348540993 -533800438 329394923
+-528491923 367014126 -531098700 348540993
+-523785076 400369561 -528491923 367014126
+-520698361 422243810 -523785076 400369561
+-513975050 469889072 -520698361 422243810
+-509869121 498986063 -513975050 469889072
+-496032261 597042048 -509869121 498986063
+-490554785 635858608 -496032261 597042048
+-484503501 678741504 -490554785 635858608
+-477739340 726676258 -484503501 678741504
+-470654218 776885524 -477739340 726676258
+-468776948 790188942 -470654218 776885524
+-466522027 806168620 -468776948 790188942
+-465898384 810588116 -466522027 806168620
+-460415955 849439776 -465898384 810588116
+-453045245 901672886 -460415955 849439776
+-428322205 1076874632 -453045245 901672886
+-421856093 1122697239 -428322205 1076874632
+-421008117 1128706484 -421856093 1122697239
+-415613750 1166934091 -421008117 1128706484
+-412834102 1186632283 -415613750 1166934091
+-395413473 1310084924 -412834102 1186632283
+-369852674 1491223516 -395413473 1310084924
+-366386643 1515785818 -369852674 1491223516
+-363263360 1537919204 -366386643 1515785818
+-355672903 1591709566 -363263360 1537919204
+-335135758 1737247646 -355672903 1591709566
+-324395856 1813356799 -335135758 1737247646
+-297386431 2004761188 -324395856 1813356799
+-1908575156 393013513 -2126439478 486247163
+-1879070313 380387103 -1908575156 393013513
+-1780594780 338245126 -1879070313 380387103
+-1759928845 329401271 -1780594780 338245126
+-1484040859 211336764 -1759928845 329401271
+-1462558743 202143629 -1484040859 211336764
+-1396514888 173880582 -1462558743 202143629
+-1236906220 105577069 -1396514888 173880582
+-1119147725 55183071 -1236906220 105577069
+-1097419979 45884820 -1119147725 55183071
+-1084430248 40325947 -1097419979 45884820
+-1049138605 25223113 -1084430248 40325947
+-1046958267 24290052 -1049138605 25223113
+-1017239248 11571987 -1046958267 24290052
+-965972870 -10367133 -1017239248 11571987
+-929584205 -25939431 -965972870 -10367133
+-911069336 -33862751 -929584205 -25939431
+-792901990 -84431714 -911069336 -33862751
+-785845294 -87451583 -792901990 -84431714
+-719349415 -115908070 -785845294 -87451583
+-679782769 -132840365 -719349415 -115908070
+-674634405 -135043574 -679782769 -132840365
+-648983066 -146020901 -674634405 -135043574
+-603626240 -165431066 -648983066 -146020901
+-600760197 -166657571 -603626240 -165431066
+-544374685 -190787392 -600760197 -166657571
+-534940396 -194824736 -544374685 -190787392
+-468048000 -223450911 -534940396 -194824736
+-454762664 -229136286 -468048000 -223450911
+-446890334 -232505199 -454762664 -229136286
+-410246871 -248186536 -446890334 -232505199
+-400227215 -252474384 -410246871 -248186536
+-351475774 -273337253 -400227215 -252474384
+-304801778 -293311092 -351475774 -273337253
+-278826596 -304427006 -304801778 -293311092
+-248364731 -317462967 -278826596 -304427006
+-168152952 -351789087 -248364731 -317462967
+-83499983 -388015786 -168152952 -351789087
+-44273657 -404802442 -83499983 -388015786
+-24448148 -413286643 -44273657 -404802442
+-19711799 -415313533 -24448148 -413286643
+12596647 -429139727 -19711799 -415313533
+45698670 -443305527 12596647 -429139727
+73648779 -455266598 45698670 -443305527
+104893554 -468637600 73648779 -455266598
+108634529 -470238527 104893554 -468637600
+114348807 -472683916 108634529 -470238527
+120896005 -475485747 114348807 -472683916
+235865895 -524686380 120896005 -475485747
+253599797 -532275490 235865895 -524686380
+276345219 -542009249 253599797 -532275490
+287972680 -546985147 276345219 -542009249
+316664171 -559263488 287972680 -546985147
+342975020 -570523048 316664171 -559263488
+367744028 -581122787 342975020 -570523048
+449052739 -615918332 367744028 -581122787
+539289501 -654534580 449052739 -615918332
+542159493 -655762775 539289501 -654534580
+599681448 -680378929 542159493 -655762775
+640938667 -698034693 599681448 -680378929
+767646023 -752258299 640938667 -698034693
+804314348 -767950276 767646023 -752258299
+849762385 -787399474 804314348 -767950276
+882100759 -801238475 849762385 -787399474
+1028737988 -863990943 882100759 -801238475
+1033444165 -866004922 1028737988 -863990943
+1063237884 -878754954 1033444165 -866004922
+1090161367 -890276687 1063237884 -878754954
+1174858948 -926522478 1090161367 -890276687
+1329496453 -992698613 1174858948 -926522478
+1410652056 -1027428637 1329496453 -992698613
+1739874221 -1168317166 1410652056 -1027428637
+1896055492 -1235153947 1739874221 -1168317166
+2063948869 -1307002848 1896055492 -1235153947
+2108014085 -1325860276 2063948869 -1307002848
+233210753 -922238323 234383863 -918479351
+234383863 -918479351 244011493 -887629742
+244011493 -887629742 253428638 -857454587
+253428638 -857454587 256372875 -848020432
+256372875 -848020432 258218338 -842107055
+258218338 -842107055 265576487 -818529499
+265576487 -818529499 265859833 -817621578
+265859833 -817621578 279604594 -773579538
+279604594 -773579538 296667994 -718903653
+296667994 -718903653 329505290 -613683812
+329505290 -613683812 340392467 -578798265
+340392467 -578798265 342975020 -570523048
+342975020 -570523048 346971178 -557718244
+346971178 -557718244 349054564 -551042493
+349054564 -551042493 374371774 -469919103
+374371774 -469919103 382871143 -442684759
+382871143 -442684759 386054507 -432484374
+386054507 -432484374 397377669 -396201810
+397377669 -396201810 413265090 -345294091
+413265090 -345294091 424851473 -308168091
+424851473 -308168091 442894707 -250352546
+442894707 -250352546 462773592 -186655062
+462773592 -186655062 462922079 -186179268
+462922079 -186179268 468249020 -169110268
+468249020 -169110268 477630889 -139048147
+477630889 -139048147 480349439 -130337155
+480349439 -130337155 491658474 -94099859
+491658474 -94099859 512519911 -27254005
+512519911 -27254005 523460166 7801617
+523460166 7801617 527055162 19320986
+527055162 19320986 537913770 54114991
+537913770 54114991 544932723 76605671
+544932723 76605671 552321299 100280727
+552321299 100280727 582580649 197240110
+582580649 197240110 594393834 235092843
+594393834 235092843 612004355 291521857
+612004355 291521857 619649223 316018142
+619649223 316018142 621772885 322822945
+621772885 322822945 638044438 374961531
+638044438 374961531 638564609 376628306
+638564609 376628306 638595781 376728190
+638595781 376728190 642494634 389221200
+642494634 389221200 642875922 390442952
+642875922 390442952 643007527 390864651
+643007527 390864651 709214535 603010341
+709214535 603010341 746027352 720968858
+746027352 720968858 756330882 753984237
+756330882 753984237 794874148 877487592
+794874148 877487592 802138264 900763842
+802138264 900763842 811685325 931355284
+811685325 931355284 814362180 939932673
+814362180 939932673 816462157 946661584
+816462157 946661584 830335906 991116939
+830335906 991116939 839877966 1021692358
+839877966 1021692358 852399659 1061815348
+852399659 1061815348 870826577 1120860323
+870826577 1120860323 877956983 1143708130
+877956983 1143708130 888172530 1176441590
+888172530 1176441590 895722904 1200635089
+895722904 1200635089 901670253 1219692052
+901670253 1219692052 911066311 1249799639
+911066311 1249799639 932064469 1317083583
+932064469 1317083583 1059838074 1726505791
+-1747616665 573669010 -1659646703 528339135
+-1659646703 528339135 -1627956530 512009566
+-1627956530 512009566 -1562451798 478255757
+-1562451798 478255757 -1502221368 447219734
+-1502221368 447219734 -1428998173 409488693
+-1428998173 409488693 -1423619267 406717007
+-1423619267 406717007 -1215947358 299706144
+-1215947358 299706144 -1044411980 211316006
+-1044411980 211316006 -983219182 179784085
+-983219182 179784085 -921288787 147872090
+-921288787 147872090 -881935660 127593892
+-881935660 127593892 -866532228 119656687
+-866532228 119656687 -857480915 114992653
+-857480915 114992653 -856264171 114365679
+-856264171 114365679 -851178450 111745068
+-851178450 111745068 -847097971 109642446
+-847097971 109642446 -762521846 66061375
+-762521846 66061375 -762280924 65937231
+-762280924 65937231 -750639830 59938713
+-750639830 59938713 -731507273 50079935
+-731507273 50079935 -678341166 22684073
+-678341166 22684073 -672046122 19440312
+-672046122 19440312 -664925649 15771217
+-664925649 15771217 -662323236 14430224
+-662323236 14430224 -618201519 -8305172
+-618201519 -8305172 -583944832 -25957235
+-583944832 -25957235 -561732644 -37402911
+-561732644 -37402911 -485212666 -76832745
+-485212666 -76832745 -477107570 -81009204
+-477107570 -81009204 -442038931 -99079656
+-442038931 -99079656 -313674582 -165224277
+-313674582 -165224277 -289383789 -177741034
+-289383789 -177741034 -218642605 -214193123
+-694162522 1190025879 -487330917 1172879468
+-487330917 1172879468 -415613750 1166934091
+-415613750 1166934091 -310781410 1158243454
+-310781410 1158243454 -232884625 1151785784
+-232884625 1151785784 -144701321 1144475358
+-144701321 1144475358 -139792035 1144068377
+-139792035 1144068377 -64112948 1137794555
+-64112948 1137794555 -52875641 1136862978
+-52875641 1136862978 -51966057 1136787573
+-51966057 1136787573 170571410 1118339142
+170571410 1118339142 233709142 1113105002
+233709142 1113105002 253582173 1111457521
+253582173 1111457521 396084246 1099644051
+396084246 1099644051 421321249 1097551895
+421321249 1097551895 490808041 1091791416
+490808041 1091791416 532938730 1088298768
+532938730 1088298768 629895802 1080260994
+629895802 1080260994 656376938 1078065698
+656376938 1078065698 696886837 1074707414
+696886837 1074707414 722766411 1072561989
+722766411 1072561989 732540289 1071751731
+732540289 1071751731 756286890 1069783130
+756286890 1069783130 852399659 1061815348
+852399659 1061815348 880410797 1059493216
+577845266 -426517000 576607395 -429405519
+599245161 -376581267 577845266 -426517000
+609873661 -351780120 599245161 -376581267
+644323628 -271392607 609873661 -351780120
+655967263 -244222687 644323628 -271392607
+661285806 -231812096 655967263 -244222687
+667848097 -216499272 661285806 -231812096
+672350842 -205992311 667848097 -216499272
+675786742 -197974788 672350842 -205992311
+679780800 -188654824 675786742 -197974788
+686885015 -172077446 679780800 -188654824
+687999192 -169477562 686885015 -172077446
+738348994 -51988468 687999192 -169477562
+780377820 46083985 738348994 -51988468
+787314071 62269429 780377820 46083985
+797906416 86986208 787314071 62269429
+830437141 162895253 797906416 86986208
+832925681 168702155 830437141 162895253
+839628093 184341945 832925681 168702155
+843429660 193212737 839628093 184341945
+846034627 199291316 843429660 193212737
+850456729 209610099 846034627 199291316
+863220737 239394363 850456729 209610099
+885447065 291258540 863220737 239394363
+924088046 381425603 885447065 291258540
+937802336 413427310 924088046 381425603
+952832132 448498690 937802336 413427310
+961327493 468322248 952832132 448498690
+815095227 -306250929 821515478 -298361440
+821515478 -298361440 841865950 -273353878
+841865950 -273353878 870596885 -238048032
+870596885 -238048032 933870419 -160294709
+933870419 -160294709 957202204 -131623579
+957202204 -131623579 980191863 -103372866
+980191863 -103372866 1056116444 -10073377
+1056116444 -10073377 1093379090 35716613
+1093379090 35716613 1110524983 56786247
+1110524983 56786247 1264349686 245812858
+1264349686 245812858 1272027575 255247789
+1272027575 255247789 1302270080 292411119
+1302270080 292411119 1356312826 358821241
+1356312826 358821241 1433837391 454086861
+1433837391 454086861 1481897740 513145548
+1481897740 513145548 1502538936 538510364
+-1582923280 -1994951201 -1404476116 -1803708962
+-1404476116 -1803708962 -1339488917 -1734062031
+-1339488917 -1734062031 -1210375318 -1595690688
+-1210375318 -1595690688 -1032719763 -1405296819
+-1032719763 -1405296819 -994582895 -1364425449
+-994582895 -1364425449 -935971828 -1301611834
+-935971828 -1301611834 -933025521 -1298454269
+-933025521 -1298454269 -871897749 -1232943495
+-871897749 -1232943495 -858158294 -1218218889
+-858158294 -1218218889 -810610831 -1167262163
+-810610831 -1167262163 -708162298 -1057467833
+-708162298 -1057467833 -654312755 -999757153
+-654312755 -999757153 -546142356 -883830687
+-546142356 -883830687 -537154496 -874198376
+-537154496 -874198376 -515384604 -850867532
+-515384604 -850867532 -513126102 -848447091
+-513126102 -848447091 -508432535 -843416984
+-508432535 -843416984 -403710827 -731186487
+-403710827 -731186487 -353324585 -677187436
+-353324585 -677187436 -312330982 -633254496
+-312330982 -633254496 -279920488 -598520095
+-279920488 -598520095 -260369511 -577567268
+-260369511 -577567268 -219379373 -533638042
+-219379373 -533638042 -217293250 -531402339
+-217293250 -531402339 -200348194 -513242284
+-200348194 -513242284 -172381514 -483270327
+-172381514 -483270327 -95590896 -400973645
+-95590896 -400973645 -83499983 -388015786
+-83499983 -388015786 -58301057 -361010038
+-58301057 -361010038 -58251262 -360956672
+-58251262 -360956672 -53128210 -355466286
+-53128210 -355466286 -981316 -299580339
+-981316 -299580339 17194909 -280100836
+17194909 -280100836 21080809 -275936309
+21080809 -275936309 33975828 -262116687
+33975828 -262116687 38970965 -256763387
+38970965 -256763387 61923072 -232165561
+61923072 -232165561 76930031 -216082568
+76930031 -216082568 100425241 -190902698
+100425241 -190902698 124244158 -165375909
+124244158 -165375909 127014738 -162406672
+127014738 -162406672 167154149 -119389172
+167154149 -119389172 168114551 -118359907
+168114551 -118359907 216709707 -66280366
+216709707 -66280366 221225201 -61441101
+221225201 -61441101 294091339 16649708
+294091339 16649708 300946950 23996882
+300946950 23996882 335311705 60825669
+335311705 60825669 341139261 67071075
+341139261 67071075 437128547 169943014
+437128547 169943014 464303291 199066250
+464303291 199066250 489939957 226541125
+489939957 226541125 496457277 233525752
+496457277 233525752 569324861 311618110
+569324861 311618110 577126564 319979213
+577126564 319979213 597289501 341587879
+597289501 341587879 627658219 374134104
+627658219 374134104 628223193 374739588
+628223193 374739588 635437864 382471568
+635437864 382471568 641673075 389153858
+641673075 389153858 642875922 390442952
+642875922 390442952 643891615 391531473
+643891615 391531473 914867987 681937477
+914867987 681937477 935197048 703724179
+935197048 703724179 950576264 720206120
+950576264 720206120 972359439 743551199
+972359439 743551199 1130482417 913011961
+1130482417 913011961 1142171230 925538889
+1142171230 925538889 1165281665 950306395
+1165281665 950306395 1326679789 1123277138
+1326679789 1123277138 1335199602 1132407842
+1335199602 1132407842 1409947300 1212515122
+1409947300 1212515122 1423422286 1226956296
+1423422286 1226956296 1453696434 1259401170
+1453696434 1259401170 1522906391 1333573641
+1522906391 1333573641 1633735034 1452348954
+1633735034 1452348954 1979502394 1822908634
+1979502394 1822908634 2141323368 1996332546
+-892815021 -563653521 -900493081 -571566598
+-882537215 -553061122 -892815021 -563653521
+-860588130 -530440199 -882537215 -553061122
+-812443956 -480822383 -860588130 -530440199
+-745350275 -411675036 -812443956 -480822383
+-701549794 -366533869 -745350275 -411675036
+-678905426 -343196382 -701549794 -366533869
+-669959281 -333976405 -678905426 -343196382
+-658709116 -322381884 -669959281 -333976405
+-628710167 -291464699 -658709116 -322381884
+-620168913 -282662007 -628710167 -291464699
+-606114067 -268176957 -620168913 -282662007
+-577237733 -238416749 -606114067 -268176957
+-567256631 -228130136 -577237733 -238416749
+-534940396 -194824736 -567256631 -228130136
+-519146640 -178547550 -534940396 -194824736
+-506091562 -165092869 -519146640 -178547550
+-496187715 -154885876 -506091562 -165092869
+-442038931 -99079656 -496187715 -154885876
+-345991049 -91850 -442038931 -99079656
+-331645950 14692336 -345991049 -91850
+-326633956 19857742 -331645950 14692336
+-313191539 33711617 -326633956 19857742
+-286049317 61684634 -313191539 33711617
+-221643812 128061522 -286049317 61684634
+-215822880 134060627 -221643812 128061522
+-180206438 170767250 -215822880 134060627
+-156610449 195085488 -180206438 170767250
+-143640354 208452584 -156610449 195085488
+-142496016 209631948 -143640354 208452584
+-129022966 223517394 -142496016 209631948
+-108045350 245137113 -129022966 223517394
+-96222894 257321441 -108045350 245137113
+-88573713 265204756 -96222894 257321441
+-79649280 274402355 -88573713 265204756
+-73960504 280265258 -79649280 274402355
+-66842705 287600926 -73960504 280265258
+-59214046 295463090 -66842705 287600926
+-39681164 315593852 -59214046 295463090
+-21012324 334834127 -39681164 315593852
+4021044 360633739 -21012324 334834127
+13527121 370430786 4021044 360633739
+15350326 372309798 13527121 370430786
+174266022 536089734 15350326 372309798
+201666427 564328837 174266022 536089734
+246450301 610483496 201666427 564328837
+270259683 635021659 246450301 610483496
+282095638 647219900 270259683 635021659
+311596134 677623374 282095638 647219900
+414717390 783901062 311596134 677623374
+451352830 821657873 414717390 783901062
+518778899 891147782 451352830 821657873
+528408205 901071831 518778899 891147782
+612217732 987446679 528408205 901071831
+621624826 997141714 612217732 987446679
+659032191 1035694078 621624826 997141714
+676451826 1053646910 659032191 1035694078
+681856294 1059216802 676451826 1053646910
+696886837 1074707414 681856294 1059216802
+734788722 1113769435 696886837 1074707414
+808924678 1190174614 734788722 1113769435
+814784394 1196213690 808924678 1190174614
+892311701 1276114025 814784394 1196213690
+932064469 1317083583 892311701 1276114025
+1057372283 1446226935 932064469 1317083583
+-1974115694 33033844 -1881659693 160963955
+-1881659693 160963955 -1861323858 189102372
+-1861323858 189102372 -1783887806 296249582
+-1783887806 296249582 -1759928845 329401271
+-1759928845 329401271 -1627956530 512009566
+-1627956530 512009566 -1618898284 524543338
+-1618898284 524543338 -1607583214 540199847
+-1607583214 540199847 -1592441890 561150691
+-1592441890 561150691 -1556389307 611036159
+-1556389307 611036159 -1548012363 622627223
+-1548012363 622627223 -1518201943 663875495
+-1518201943 663875495 -1502508645 685590098
+-1502508645 685590098 -1313176800 947565993
+-1313176800 947565993 -1288955985 981080006
+-1288955985 981080006 -1254488811 1028771766
+-1254488811 1028771766 -1252945251 1030907568
+-1252945251 1030907568 -1213864696 1084982800
+-1213864696 1084982800 -1213554262 1085412343
+-1213554262 1085412343 -1184670674 1125378171
+-1184670674 1125378171 -1131318398 1199200989
+230948982 64282420 233854294 64186188
+233854294 64186188 236170098 64109483
+236170098 64109483 335311705 60825669
+335311705 60825669 340203404 60663644
+340203404 60663644 431327359 57645395
+431327359 57645395 496426071 55489165
+496426071 55489165 505643777 55183852
+505643777 55183852 537913770 54114991
+537913770 54114991 575749530 52861777
+575749530 52861777 608067106 51791340
+608067106 51791340 682735100 49318152
+682735100 49318152 765666795 46571250
+765666795 46571250 780377820 46083985
+780377820 46083985 821138265 44733899
+821138265 44733899 826199997 44566242
+826199997 44566242 862769904 43354957
+862769904 43354957 875906654 42919835
+875906654 42919835 991990733 39074845
+991990733 39074845 1026342220 37937039
+1026342220 37937039 1093379090 35716613
+1093379090 35716613 1159954902 33511459
+1159954902 33511459 1183544793 32730103
+1183544793 32730103 1214857469 31692951
+1214857469 31692951 1344005201 27415260
+1344005201 27415260 1525055414 21418432
+1525055414 21418432 1598963761 18970406
+1598963761 18970406 1729869352 14634490
+1729869352 14634490 1734591042 14478097
+-868193676 1104278235 -891914195 1146760588
+-828049649 1032382141 -868193676 1104278235
+-808308424 997026521 -828049649 1032382141
+-715992792 831693497 -808308424 997026521
+-698096018 799641203 -715992792 831693497
+-649203002 712076075 -698096018 799641203
+-642199301 699532770 -649203002 712076075
+-608081532 638429425 -642199301 699532770
+-590235529 606468060 -608081532 638429425
+-580278964 588636312 -590235529 606468060
+-526603237 492505569 -580278964 588636312
+-513975050 469889072 -526603237 492505569
+-485543254 418969041 -513975050 469889072
+-455903906 365886340 -485543254 418969041
+-447276593 350435222 -455903906 365886340
+-443846313 344291750 -447276593 350435222
+-429757820 319059912 -443846313 344291750
+-426397239 313041267 -429757820 319059912
+-417922991 297864280 -426397239 313041267
+-402181594 269672167 -417922991 297864280
+-392430599 252208586 -402181594 269672167
+-386631467 241822610 -392430599 252208586
+-374219851 219593980 -386631467 241822610
+-369949895 211946685 -374219851 219593980
+-359325317 192918559 -369949895 211946685
+-338839019 156228546 -359325317 192918559
+-335453888 150165934 -338839019 156228546
+-292399364 73057273 -335453888 150165934
+-286049317 61684634 -292399364 73057273
+-238373781 -23700045 -286049317 61684634
+-237637829 -25018100 -238373781 -23700045
+-215702868 -64302600 -237637829 -25018100
+-209379444 -75627559 -215702868 -64302600
+-188640004 -112770937 -209379444 -75627559
+-178582649 -130783195 -188640004 -112770937
+-140065074 -199766388 -178582649 -130783195
+-130259722 -217327320 -140065074 -199766388
+-122463545 -231289912 -130259722 -217327320
+-103049948 -266058765 -122463545 -231289912
+-80599109 -306267179 -103049948 -266058765
+-69426878 -326276127 -80599109 -306267179
+-53128210 -355466286 -69426878 -326276127
+-19711799 -415313533 -53128210 -355466286
+-11958200 -429199869 -19711799 -415313533
+1994130 -454187847 -11958200 -429199869
+2132447 -454435566 1994130 -454187847
+23074602 -491941996 2132447 -454435566
+46906000 -534622927 23074602 -491941996
+58179877 -554813920 46906000 -534622927
+68356944 -573040576 58179877 -554813920
+116618421 -659474646 68356944 -573040576
+137285373 -696488201 116618421 -659474646
+142860882 -706473680 137285373 -696488201
+143892304 -708320908 142860882 -706473680
+151468020 -721888664 143892304 -708320908
+187315792 -786090365 151468020 -721888664
+201859828 -812138060 187315792 -786090365
+210471033 -827560331 201859828 -812138060
+244011493 -887629742 210471033 -827560331
+254071594 -905646917 244011493 -887629742
+311318527 -1008173524 254071594 -905646917
+325950011 -1034377834 311318527 -1008173524
+338833351 -1057451300 325950011 -1034377834
+338969186 -1057694575 338833351 -1057451300
+353285119 -1083333747 338969186 -1057694575
+407904797 -1181155063 353285119 -1083333747
+504245403 -1353696629 407904797 -1181155063
+512846778 -1369101294 504245403 -1353696629
+517098866 -1376716585 512846778 -1369101294
+617053029 -1555729865 517098866 -1376716585
+689044608 -1684663451 617053029 -1555729865
+854354401 -1980725637 689044608 -1684663451
+38829647 -1740995270 244200116 -1579870207
+244200116 -1579870207 363059457 -1486618149
+363059457 -1486618149 468609929 -1403807673
+468609929 -1403807673 512846778 -1369101294
+512846778 -1369101294 513453041 -1368625646
+513453041 -1368625646 533743908 -1352706282
+533743908 -1352706282 566021904 -1327382319
+566021904 -1327382319 705004486 -1218342409
+705004486 -1218342409 806020087 -1139089803
+806020087 -1139089803 847814877 -1106299362
+847814877 -1106299362 853844526 -1101568752
+853844526 -1101568752 894234683 -1069880328
+894234683 -1069880328 894827123 -1069415524
+894827123 -1069415524 949302708 -1026676263
+949302708 -1026676263 961574314 -1017048475
+-1367328625 -61079780 -1517071279 -131228239
+-1315110429 -36617638 -1367328625 -61079780
+-1283642674 -21876250 -1315110429 -36617638
+-1276213405 -18395934 -1283642674 -21876250
+-1185428399 24133219 -1276213405 -18395934
+-1119147725 55183071 -1185428399 24133219
+-1090076914 68801586 -1119147725 55183071
+-1014128087 104380581 -1090076914 68801586
+-943649161 137397147 -1014128087 104380581
+-921288787 147872090 -943649161 137397147
+-901272613 157248869 -921288787 147872090
+-875130377 169495463 -901272613 157248869
+-848937556 181765755 -875130377 169495463
+-821846581 194456796 -848937556 181765755
+-778213356 214897221 -821846581 194456796
+-749291562 228445928 -778213356 214897221
+-718182903 243019093 -749291562 228445928
+-704127742 249603376 -718182903 243019093
+-620184642 288927369 -704127742 249603376
+-549904030 321851032 -620184642 288927369
+-533800438 329394923 -549904030 321851032
+-511069828 340043306 -533800438 329394923
+-490995669 349447249 -511069828 340043306
+-474068184 357377101 -490995669 349447249
+-455903906 365886340 -474068184 357377101
+-426313456 379748285 -455903906 365886340
+-366301608 407861442 -426313456 379748285
+-300857192 438519540 -366301608 407861442
+-262977691 456264575 -300857192 438519540
+-242139040 466026652 -262977691 456264575
+-221917432 475499669 -242139040 466026652
+-192136402 489450893 -221917432 475499669
+-122874380 521897387 -192136402 489450893
+-120484330 523017030 -122874380 521897387
+-101553446 531885394 -120484330 523017030
+2294952 580534226 -101553446 531885394
+15449575 586696642 2294952 580534226
+52590229 604095556 15449575 586696642
+93135623 623089456 52590229 604095556
+-1005159139 -1968232079 -1570011284 -2076985615
+-878242435 -1943796232 -1005159139 -1968232079
+-598397545 -1889916431 -878242435 -1943796232
+-231135879 -1819205882 -598397545 -1889916431
+269176562 -1722878466 -231135879 -1819205882
+344584281 -1708359877 269176562 -1722878466
+-1222003264 -1275695641 -1208118529 -1274000146
+-1208118529 -1274000146 -1074253792 -1257653632
+-1074253792 -1257653632 -1058329628 -1255709097
+-1058329628 -1255709097 -1017416875 -1250713152
+-1017416875 -1250713152 -983624056 -1246586637
+-983624056 -1246586637 -956771096 -1243307564
+-956771096 -1243307564 -871897749 -1232943495
+-871897749 -1232943495 -853340302 -1230677404
+-853340302 -1230677404 -689170179 -1210630233
+-689170179 -1210630233 -662981158 -1207432235
+-662981158 -1207432235 -649470950 -1205782474
+-649470950 -1205782474 -621612957 -1202380674
+-621612957 -1202380674 -503746966 -1187987801
+-503746966 -1187987801 -438135599 -1179975854
+-438135599 -1179975854 -297977157 -1162860801
+-297977157 -1162860801 -269187593 -1159345245
+-269187593 -1159345245 -104257471 -1139205269
+-104257471 -1139205269 -12163651 -1127959492
+-12163651 -1127959492 42945404 -1121230005
+42945404 -1121230005 161568565 -1106744673
+161568565 -1106744673 169841429 -1105734455
+169841429 -1105734455 179854307 -1104511761
+179854307 -1104511761 348778755 -1083884029
+348778755 -1083884029 353285119 -1083333747
+353285119 -1083333747 383250032 -1079674666
+383250032 -1079674666 388071441 -1079085913
+388071441 -1079085913 404348230 -1077098319
+404348230 -1077098319 479651392 -1067902886
+479651392 -1067902886 578198611 -1055869070
+-978418967 -539576384 -887249486 -552398392
+-887249486 -552398392 -882537215 -553061122
+-882537215 -553061122 -781652377 -567249489
+-781652377 -567249489 -775577195 -568103898
+-775577195 -568103898 -774536399 -568250275
+-774536399 -568250275 -664088558 -583783576
+-664088558 -583783576 -629629174 -588629918
+-629629174 -588629918 -624944281 -589288798
+-624944281 -589288798 -586442760 -594703623
+-586442760 -594703623 -562406443 -598084072
+-562406443 -598084072 -339395301 -629448191
+-339395301 -629448191 -312330982 -633254496
+-312330982 -633254496 -222231473 -645926023
+-222231473 -645926023 -194619356 -649809370
+-194619356 -649809370 -129262791 -659001068
+-129262791 -659001068 -93934253 -663969647
+-93934253 -663969647 -87204198 -664916157
+-87204198 -664916157 -64322772 -668134184
+-64322772 -668134184 45000570 -683509336
+45000570 -683509336 57481848 -685264694
+57481848 -685264694 77685909 -688106177
+77685909 -688106177 88724328 -689658612
+88724328 -689658612 111843968 -692910141
+111843968 -692910141 137285373 -696488201
+137285373 -696488201 150283040 -698316183
+150283040 -698316183 160607761 -699768244
+160607761 -699768244 195545511 -704681863
+195545511 -704681863 207366837 -706344405
+207366837 -706344405 215543397 -707494350
+215543397 -707494350 227756770 -709212030
+227756770 -709212030 296667994 -718903653
+296667994 -718903653 439610266 -739006946
+439610266 -739006946 465143326 -742597896
+465143326 -742597896 497288160 -747118721
+497288160 -747118721 576875274 -758311793
+576875274 -758311793 617889423 -764079992
+617889423 -764079992 751432073 -782861330
+751432073 -782861330 825180663 -793233276
+825180663 -793233276 862593314 -798494963
+862593314 -798494963 882100759 -801238475
+882100759 -801238475 1006368765 -818715434
+1006368765 -818715434 1029319266 -821943175
+1029319266 -821943175 1054652875 -825506074
+1054652875 -825506074 1120033745 -834701190
+386122129 104914472 431327359 57645395
+431327359 57645395 451918890 36113757
+451918890 36113757 493761784 -7639475
+493761784 -7639475 512519911 -27254005
+512519911 -27254005 553125994 -69713960
+553125994 -69713960 574497375 -92061052
+574497375 -92061052 625219707 -145099114
+625219707 -145099114 639779479 -160323612
+639779479 -160323612 651216600 -172282895
+651216600 -172282895 673718830 -195812466
+673718830 -195812466 675786742 -197974788
+675786742 -197974788 697245853 -220413615
+697245853 -220413615 699578695 -222852963
+699578695 -222852963 704016629 -227493511
+704016629 -227493511 718300422 -242429431
+718300422 -242429431 721363977 -245632853
+721363977 -245632853 725217058 -249661846
+725217058 -249661846 742488198 -267721501
+742488198 -267721501 855854805 -386263863
+855854805 -386263863 879669769 -411166100
+879669769 -411166100 898147602 -430487538
+-1739467890 -336762320 -1787337956 -355134232
+-1641969443 -299343676 -1739467890 -336762320
+-1325122137 -177741776 -1641969443 -299343676
+-1268881673 -156157413 -1325122137 -177741776
+-1147194628 -109455498 -1268881673 -156157413
+-1121789096 -99705183 -1147194628 -109455498
+-1110011459 -95185078 -1121789096 -99705183
+-1093304371 -88773114 -1110011459 -95185078
+-1070476309 -80011999 -1093304371 -88773114
+-989455097 -48917105 -1070476309 -80011999
+-929584205 -25939431 -989455097 -48917105
+-859045330 1132478 -929584205 -25939431
+-824858688 14252869 -859045330 1132478
+-764784323 37308634 -824858688 14252869
+-747774622 43836737 -764784323 37308634
+-731507273 50079935 -747774622 43836737
+-704244181 60543157 -731507273 50079935
+-679454481 70057124 -704244181 60543157
+-679119349 70185743 -679454481 70057124
+-668762601 74160529 -679119349 70185743
+-631873628 88318040 -668762601 74160529
+-600058799 100528160 -631873628 88318040
+-564151625 114308870 -600058799 100528160
+-556028702 117426342 -564151625 114308870
+-538199830 124268833 -556028702 117426342
+-521282649 130761428 -538199830 124268833
+-473189332 149219022 -521282649 130761428
+-404767387 175478480 -473189332 149219022
+-359325317 192918559 -404767387 175478480
+-312073730 211053107 -359325317 192918559
+-307075853 212971228 -312073730 211053107
+-293862227 218042446 -307075853 212971228
+-286147572 221003231 -293862227 218042446
+-215125406 248260621 -286147572 221003231
+-153541709 271895648 -215125406 248260621
+-116383029 286156668 -153541709 271895648
+-83880756 298630621 -116383029 286156668
+-77854423 300943449 -83880756 298630621
+-74321641 302299285 -77854423 300943449
+-69985486 303963446 -74321641 302299285
+-66675195 305233893 -69985486 303963446
+-39681164 315593852 -66675195 305233893
+18996608 338113623 -39681164 315593852
+36133819 344690663 18996608 338113623
+54534817 351752728 36133819 344690663
+77386351 360522852 54534817 351752728
+82283545 362402331 77386351 360522852
+89983696 365357550 82283545 362402331
+277494161 437321642 89983696 365357550
+368536625 472262563 277494161 437321642
+399115067 483998174 368536625 472262563
+402208261 485185302 399115067 483998174
+407354887 487160510 402208261 485185302
+476725776 513784161 407354887 487160510
+548162801 541200768 476725776 513784161
+709214535 603010341 548162801 541200768
+914867987 681937477 709214535 603010341
+940952444 691948355 914867987 681937477
+965927282 701533375 940952444 691948355
+1111611550 757445114 965927282 701533375
+1147072114 771054420 1111611550 757445114
+1229678906 802757839 1147072114 771054420
+1282780616 823137588 1229678906 802757839
+1303066219 830922941 1282780616 823137588
+1896779308 501923279 1913549999 709239891
+1913549999 709239891 1924006544 838502029
+1924006544 838502029 1954660881 1217446053
+1954660881 1217446053 1960643572 1291403129
+1960643572 1291403129 1968680212 1390750786
+1968680212 1390750786 1982632917 1563231902
+1982632917 1563231902 1984311702 1583984764
+1984311702 1583984764 1990507367 1660574585
+-682292363 190812855 -681994905 178155596
+-681994905 178155596 -681654046 163651566
+-681654046 163651566 -680654775 121131276
+-680654775 121131276 -679771129 83530950
+-679771129 83530950 -679609557 76655831
+-679609557 76655831 -679526079 73103745
+-679526079 73103745 -679454481 70057124
+-679454481 70057124 -678543118 31277403
+-678543118 31277403 -678341166 22684073
+-678341166 22684073 -677846296 1626702
+-677846296 1626702 -676869261 -39947468
+-676869261 -39947468 -674917413 -123001201
+-674917413 -123001201 -674634405 -135043574
+-674634405 -135043574 -672964300 -206108817
+-672964300 -206108817 -672579357 -222488653
+-672579357 -222488653 -671388639 -273155316
+-671388639 -273155316 -670363467 -316777771
+-670363467 -316777771 -669959281 -333976405
+-669959281 -333976405 -668561428 -393456939
+-668561428 -393456939 -668348305 -402525601
+-668348305 -402525601 -667397850 -442968748
+-667397850 -442968748 -666795962 -468579905
+-666795962 -468579905 -666662260 -474269082
+-666662260 -474269082 -666216194 -493249813
+-666216194 -493249813 -664088558 -583783576
+-664088558 -583783576 -663488215 -609328962
+-663488215 -609328962 -663305025 -617123978
+-663305025 -617123978 -660213628 -748667069
+-660213628 -748667069 -660029623 -756496734
+-660029623 -756496734 -658545656 -819641517
+-658545656 -819641517 -654312755 -999757153
+-654312755 -999757153 -653458362 -1036112722
+-653458362 -1036112722 -650198163 -1174838601
+-650198163 -1174838601 -649470950 -1205782474
+-649470950 -1205782474 -649344981 -1211142642
+-649344981 -1211142642 -649076248 -1222577575
+-649076248 -1222577575 -645087999 -1392282944
+-645087999 -1392282944 -644983857 -1396714340
+-644983857 -1396714340 -642786434 -1490217646
+-642786434 -1490217646 -642690905 -1494282512
+-642690905 -1494282512 -642280056 -1511764672
+-642280056 -1511764672 -640959643 -1567950058
+-640959643 -1567950058 -639956277 -1610644596
+-1556738026 -1387588084 -1524970410 -1288445414
+-1524970410 -1288445414 -1521470357 -1277522196
+-1521470357 -1277522196 -1488435642 -1174425076
+-1488435642 -1174425076 -1477133038 -1139151094
+-1477133038 -1139151094 -1469533678 -1115434463
+-1469533678 -1115434463 -1352867365 -751333813
+-1352867365 -751333813 -1315345182 -634231878
+-1315345182 -634231878 -1309795218 -616911150
+-1309795218 -616911150 -1281332262 -528081905
+-1281332262 -528081905 -1254160499 -443282306
+-1254160499 -443282306 -1248486466 -425574373
+-1248486466 -425574373 -1246733095 -420102326
+-1246733095 -420102326 -1242368201 -406480052
+-1242368201 -406480052 -1210517368 -307077674
+-1210517368 -307077674 -1208295723 -300144205
+-1208295723 -300144205 -1181196274 -215570286
+-1181196274 -215570286 -1147194628 -109455498
+-1147194628 -109455498 -1141095668 -90421422
+-1141095668 -90421422 -1131651639 -60947817
+-1131651639 -60947817 -1115100956 -9295249
+-1115100956 -9295249 -1113584447 -4562419
+-1113584447 -4562419 -1100807992 35311263
+-1100807992 35311263 -1097419979 45884820
+-1097419979 45884820 -1090076914 68801586
+-1090076914 68801586 -1059553725 164060555
+-1059553725 164060555 -1044411980 211316006
+-1044411980 211316006 -1026480877 267276686
+-1026480877 267276686 -1003865202 337857318
+-1003865202 337857318 -999376278 351866674
+-999376278 351866674 -988872199 384648562
+-988872199 384648562 -966953846 453052940
+-966953846 453052940 -963605873 463501534
+-963605873 463501534 -962316837 467524452
+-962316837 467524452 -955327929 489335939
+-955327929 489335939 -942510967 529336039
+-942510967 529336039 -935435944 551416281
+-1444915312 1072773864 -1597996058 1064411576
+-1309889521 1080149871 -1444915312 1072773864
+-1284686902 1081526605 -1309889521 1080149871
+-1213734911 1085402475 -1284686902 1081526605
+-1213554262 1085412343 -1213734911 1085402475
+-1172455690 1087657420 -1213554262 1085412343
+-1000081804 1097073628 -1172455690 1087657420
+-935813724 1100584378 -1000081804 1097073628
+-868193676 1104278235 -935813724 1100584378
+-823597429 1106714379 -868193676 1104278235
+-746348005 1110934256 -823597429 1106714379
+-694987452 1113739911 -746348005 1110934256
+-641846242 1116642837 -694987452 1113739911
+-598211160 1119026476 -641846242 1116642837
+-429118543 1128263439 -598211160 1119026476
+-421008117 1128706484 -429118543 1128263439
+-306649730 1134953500 -421008117 1128706484
+-230669752 1139104032 -306649730 1134953500
+-144310959 1143821523 -230669752 1139104032
+-139792035 1144068377 -144310959 1143821523
+-114845201 1145431139 -139792035 1144068377
+-48647651 1149047289 -114845201 1145431139
+-45827590 1149201340 -48647651 1149047289
+176225661 1161331365 -45827590 1149201340
+183227212 1161713836 176225661 1161331365
+206289551 1162973655 183227212 1161713836
+287879988 1167430667 206289551 1162973655
+441011093 1175795706 287879988 1167430667
+503576745 1179213458 441011093 1175795706
+570229228 1182854460 503576745 1179213458
+595242366 1184220844 570229228 1182854460
+697622413 1189813523 595242366 1184220844
+767334921 1193621684 697622413 1189813523
+801066118 1195464306 767334921 1193621684
+814784394 1196213690 801066118 1195464306
+895722904 1200635089 814784394 1196213690
+926650204 1202324544 895722904 1200635089
+944218451 1203284239 926650204 1202324544
+961466276 1204226430 944218451 1203284239
+-381087636 1532637491 -377393767 1533732063
+-377393767 1533732063 -377145160 1533805730
+-377145160 1533805730 -363263360 1537919204
+-363263360 1537919204 -303420021 1555652061
+-303420021 1555652061 -209007271 1583628573
+-209007271 1583628573 -50781240 1630514321
+-50781240 1630514321 233888171 1714867938
+233888171 1714867938 414802591 1768476740
+414802591 1768476740 560393335 1811618382
+560393335 1811618382 597552925 1822629561
+597552925 1822629561 870302673 1903451129
+870302673 1903451129 891794597 1909819644
+891794597 1909819644 1014676148 1946232069
+-432660231 218658871 -502541174 217540701
+-414360296 218951690 -432660231 218658871
+-374219851 219593980 -414360296 218951690
+-315815175 220528518 -374219851 219593980
+-292106417 220907883 -315815175 220528518
+-286147572 221003231 -292106417 220907883
+-203439407 222326651 -286147572 221003231
+-144914210 223263117 -203439407 222326651
+-129022966 223517394 -144914210 223263117
+-120721874 223650221 -129022966 223517394
+-98218648 224010297 -120721874 223650221
+-90337697 224136400 -98218648 224010297
+-73213163 224410411 -90337697 224136400
+-70924564 224447031 -73213163 224410411
+-27704022 225138607 -70924564 224447031
+-23968401 225198381 -27704022 225138607
+-15453698 225334625 -23968401 225198381
+-14693080 225346796 -15453698 225334625
+28754626 226042006 -14693080 225346796
+143924433 227884847 28754626 226042006
+291706835 230249524 143924433 227884847
+365144437 231424605 291706835 230249524
+400088065 231983741 365144437 231424605
+433058922 232511310 400088065 231983741
+486567257 233367501 433058922 232511310
+496457277 233525752 486567257 233367501
+594393834 235092843 496457277 233525752
+715407351 237029189 594393834 235092843
+727328261 237219937 715407351 237029189
+733337210 237316086 727328261 237219937
+863220737 239394363 733337210 237316086
+890170710 239825591 863220737 239394363
+920997707 240318856 890170710 239825591
+972245715 241138880 920997707 240318856
+987034769 241375521 972245715 241138880
+1005537724 241671588 987034769 241375521
+1044765645 242299277 1005537724 241671588
+1093338650 243076497 1044765645 242299277
+1264349686 245812858 1093338650 243076497
+1296713639 246330716 1264349686 245812858
+1339589150 247016770 1296713639 246330716
+1357339651 247300798 1339589150 247016770
+1544166002 250290221 1357339651 247300798
+1560129008 250545646 1544166002 250290221
+1657178515 252098543 1560129008 250545646
+-2097538536 1208477630 -2105396822 1242389760
+-2015211199 853197207 -2097538536 1208477630
+-2011736664 838202987 -2015211199 853197207
+-1908575156 393013513 -2011736664 838202987
+-1880358286 271244707 -1908575156 393013513
+-1861323858 189102372 -1880358286 271244707
+-1777662687 -171934159 -1861323858 189102372
+-1748453402 -297985693 -1777662687 -171934159
+-1739467890 -336762320 -1748453402 -297985693
+-1724038116 -403348909 -1739467890 -336762320
+-1702661548 -495598655 -1724038116 -403348909
+-1599053525 -942715049 -1702661548 -495598655
+-1581098725 -1020198294 -1599053525 -942715049
+-1566711940 -1082283902 -1581098725 -1020198294
+-1554022976 -1137042636 -1566711940 -1082283902
+-1542820631 -1185385919 -1554022976 -1137042636
+-1535909933 -1215208767 -1542820631 -1185385919
+-1521470357 -1277522196 -1535909933 -1215208767
+-1511364611 -1321133150 -1521470357 -1277522196
+-1500763797 -1366880551 -1511364611 -1321133150
+-1488317399 -1420592498 -1500763797 -1366880551
+-1458049184 -1551213799 -1488317399 -1420592498
+-88846340 -265650143 -97027764 -240108399
+-76516060 -304144278 -88846340 -265650143
+-69426878 -326276127 -76516060 -304144278
+-58383945 -360751268 -69426878 -326276127
+-58301057 -361010038 -58383945 -360751268
+-44273657 -404802442 -58301057 -361010038
+-39428517 -419928575 -44273657 -404802442
+-15338500 -495135654 -39428517 -419928575
+-8927756 -515149476 -15338500 -495135654
+2254970 -550061040 -8927756 -515149476
+8583463 -569818081 2254970 -550061040
+36389811 -656627246 8583463 -569818081
+40893566 -670687601 36389811 -656627246
+45000570 -683509336 40893566 -670687601
+52423862 -706684252 45000570 -683509336
+61706900 -735665142 52423862 -706684252
+67761096 -754565850 61706900 -735665142
+75922214 -780044197 67761096 -754565850
+100017714 -855268396 75922214 -780044197
+136270878 -968447832 100017714 -855268396
+138786716 -976302071 136270878 -968447832
+139975824 -980014371 138786716 -976302071
+144727916 -994850016 139975824 -980014371
+173099900 -1083425049 144727916 -994850016
+179854307 -1104511761 173099900 -1083425049
+208324298 -1193392759 179854307 -1104511761
+-918953980 -197240504 -966248972 -236249724
+-855155309 -144618939 -918953980 -197240504
+-790642712 -91408525 -855155309 -144618939
+-785845294 -87451583 -790642712 -91408525
+-732275317 -43266713 -785845294 -87451583
+-701746524 -18086364 -732275317 -43266713
+-677846296 1626702 -701746524 -18086364
+-670417241 7754235 -677846296 1626702
+-663149499 13748717 -670417241 7754235
+-662323236 14430224 -663149499 13748717
+-613238220 54915868 -662323236 14430224
+-607103254 59976029 -613238220 54915868
+-568825269 91547963 -607103254 59976029
+-567170907 92912491 -568825269 91547963
+-543251644 112641257 -567170907 92912491
+-532540511 121475870 -543251644 112641257
+-521282649 130761428 -532540511 121475870
+-485137105 160574511 -521282649 130761428
+-426422647 209002583 -485137105 160574511
+-421881106 212748476 -426422647 209002583
+-414360296 218951690 -421881106 212748476
+-386631467 241822610 -414360296 218951690
+-367653236 257475979 -386631467 241822610
+-363181423 261164361 -367653236 257475979
+-362989710 261322487 -363181423 261164361
+-259481354 346696861 -362989710 261322487
+-249531075 354903916 -259481354 346696861
+-203690100 392713854 -249531075 354903916
+-195566826 399413984 -203690100 392713854
+-193303552 401280747 -195566826 399413984
+-178640403 413375009 -193303552 401280747
+-173883469 417298559 -178640403 413375009
+-169604446 420827926 -173883469 417298559
+-139552522 445614950 -169604446 420827926
+-113329171 467244143 -139552522 445614950
+-89072436 487251258 -113329171 467244143
+10364008 569267091 -89072436 487251258
+52590229 604095556 10364008 569267091
+118360406 658343231 52590229 604095556
+120104151 659781483 118360406 658343231
+136569629 673362318 120104151 659781483
+149979044 684422492 136569629 673362318
+152197260 686252091 149979044 684422492
+310186759 816562871 152197260 686252091
+369747460 865688928 310186759 816562871
+371053669 866766298 369747460 865688928
+409812532 898734863 371053669 866766298
+469842328 948247835 409812532 898734863
+553694114 1017409339 469842328 948247835
+595809204 1052146143 553694114 1017409339
+629895802 1080260994 595809204 1052146143
+644600918 1092389870 629895802 1080260994
+716324564 1151548006 644600918 1092389870
+767334921 1193621684 716324564 1151548006
+783722660 1207138399 767334921 1193621684
+843038678 1256062641 783722660 1207138399
+-1363261533 -353289162 -1251391342 -417431457
+-1251391342 -417431457 -1246733095 -420102326
+-1246733095 -420102326 -1235007612 -426825291
+-1235007612 -426825291 -1232472344 -428278922
+-1232472344 -428278922 -1223627622 -433350163
+-1223627622 -433350163 -1197977274 -448057139
+-1197977274 -448057139 -1176072050 -460616796
+-1176072050 -460616796 -1147410228 -477050441
+-1147410228 -477050441 -1144037090 -478984476
+-1144037090 -478984476 -1062594812 -525680512
+-1062594812 -525680512 -1059670668 -527357110
+-1059670668 -527357110 -915688845 -609911045
+-915688845 -609911045 -865086102 -638924815
+-865086102 -638924815 -830961940 -658490367
+-830961940 -658490367 -796283912 -678373485
+-796283912 -678373485 -663869251 -754295231
+-663869251 -754295231 -660029623 -756496734
+-660029623 -756496734 -555943760 -816175778
+-555943760 -816175778 -555540291 -816407112
+-555540291 -816407112 -525651517 -833544247
+-525651517 -833544247 -508432535 -843416984
+-508432535 -843416984 -483191059 -857889527
+-483191059 -857889527 -417105378 -895780650
+-417105378 -895780650 -373541211 -920758757
+-373541211 -920758757 -367231431 -924376556
+-367231431 -924376556 -297755734 -964211390
+-297755734 -964211390 -230270181 -1002905149
+-230270181 -1002905149 -162305293 -1041873741
+-162305293 -1041873741 -51979474 -1105130548
+-51979474 -1105130548 -12163651 -1127959492
+-12163651 -1127959492 74385727 -1177583754
+74385727 -1177583754 152782000 -1222533322
+152782000 -1222533322 185019277 -1241017003
+185019277 -1241017003 220194182 -1261185012
+220194182 -1261185012 259934157 -1283970467
+259934157 -1283970467 288787428 -1300513881
+1293879540 1739434679 1356549911 1491507167
+1356549911 1491507167 1359652523 1479233061
+1359652523 1479233061 1386323940 1373719439
+1386323940 1373719439 1402632488 1309201905
+1402632488 1309201905 1406103202 1295471566
+1406103202 1295471566 1418651548 1245829604
+1418651548 1245829604 1419600898 1242073921
+1419600898 1242073921 1423422286 1226956296
+1423422286 1226956296 1436768515 1174157866
+1436768515 1174157866 1475711074 1020098915
+1475711074 1020098915 1475959291 1019116955
+1475959291 1019116955 1525463786 823274389
+1525463786 823274389 1527474781 815318783
+1527474781 815318783 1528993600 809310249
+1528993600 809310249 1531513610 799340947
+1531513610 799340947 1550310007 724981345
+1550310007 724981345 1583727648 592779278
+1583727648 592779278 1615031575 468939186
+1615031575 468939186 1678621791 217372721
+1678621791 217372721 1729869352 14634490
+1729869352 14634490 1743470377 -39171929
+1743470377 -39171929 1787076935 -211681923
+1787076935 -211681923 1855109798 -480823751
+1855109798 -480823751 1861986607 -508028792
+1861986607 -508028792 1899512098 -656481743
+1899512098 -656481743 2014984655 -1113297665
+2014984655 -1113297665 2063948869 -1307002848
+2063948869 -1307002848 2138311717 -1601186448
+-1056143067 1630304119 -1166961844 1788809239
+-1021172326 1580285146 -1056143067 1630304119
+-929415447 1449044435 -1021172326 1580285146
+-912365336 1424657503 -929415447 1449044435
+-856845684 1345247234 -912365336 1424657503
+-781597447 1237618986 -856845684 1345247234
+-694987452 1113739911 -781597447 1237618986
+-651820415 1051997701 -694987452 1113739911
+-635346094 1028434327 -651820415 1051997701
+-493415141 825429176 -635346094 1028434327
+-473879051 797486526 -493415141 825429176
+-468776948 790188942 -473879051 797486526
+-442178886 752145488 -468776948 790188942
+-429893152 734573088 -442178886 752145488
+-408249589 703616101 -429893152 734573088
+-397528337 688281395 -408249589 703616101
+-344321409 612179036 -397528337 688281395
+-325026098 584580774 -344321409 612179036
+-317316933 573554285 -325026098 584580774
+-242139040 466026652 -317316933 573554285
+-218402781 432076461 -242139040 466026652
+-206299951 414765672 -218402781 432076461
+-201264134 407562896 -206299951 414765672
+-195566826 399413984 -201264134 407562896
+-189990197 391437680 -195566826 399413984
+-188723570 389626011 -189990197 391437680
+-169566344 362225254 -188723570 389626011
+-165771003 356796743 -169566344 362225254
+-145507523 327813701 -165771003 356796743
+-116383029 286156668 -145507523 327813701
+-98736203 260916250 -116383029 286156668
+-96222894 257321441 -98736203 260916250
+-85238974 241611039 -96222894 257321441
+-81836985 236745143 -85238974 241611039
+-73213163 224410411 -81836985 236745143
+-70153970 220034819 -73213163 224410411
+-66190544 214365894 -70153970 220034819
+-61165986 207179222 -66190544 214365894
+-49866502 191017466 -61165986 207179222
+6748173 110040975 -49866502 191017466
+97875901 -20299855 6748173 110040975
+150250752 -95212087 97875901 -20299855
+152550923 -98502044 150250752 -95212087
+166112542 -117899352 152550923 -98502044
+167154149 -119389172 166112542 -117899352
+196926669 -161973083 167154149 -119389172
+226767546 -204654764 196926669 -161973083
+262348588 -255546657 226767546 -204654764
+278646485 -278857689 262348588 -255546657
+288545542 -293016402 278646485 -278857689
+291519944 -297270716 288545542 -293016402
+296927374 -305005014 291519944 -297270716
+304588496 -315962787 296927374 -305005014
+386054507 -432484374 304588496 -315962787
+388704021 -436273998 386054507 -432484374
+399372493 -451533213 388704021 -436273998
+469252726 -551483553 399372493 -451533213
+479916422 -566735936 469252726 -551483553
+497696564 -592167038 479916422 -566735936
+505971096 -604002178 497696564 -592167038
+540552493 -653464268 505971096 -604002178
+542159493 -655762775 540552493 -653464268
+571989303 -698428628 542159493 -655762775
+599182360 -737323107 571989303 -698428628
+617889423 -764079992 599182360 -737323107
+794307955 -1016413047 617889423 -764079992
+799223245 -1023443431 794307955 -1016413047
+807285454 -1034974883 799223245 -1023443431
+853844526 -1101568752 807285454 -1034974883
+875644369 -1132749269 853844526 -1101568752
+885998260 -1147558536 875644369 -1132749269
+893402995 -1158149596 885998260 -1147558536
+962814639 -1257429710 893402995 -1158149596
+1018059171 -1336446473 962814639 -1257429710
+1037685678 -1364518448 1018059171 -1336446473
+1180920198 -1569388102 1037685678 -1364518448
+-901775427 556558922 -996691681 547088629
+-893566865 557377933 -901775427 556558922
+-856767628 561049586 -893566865 557377933
+-840235408 562699093 -856767628 561049586
+-840104023 562712202 -840235408 562699093
+-825661121 564153246 -840104023 562712202
+-749037373 571798399 -825661121 564153246
+-724821119 574214582 -749037373 571798399
+-666118735 580071627 -724821119 574214582
+-602444674 586424723 -666118735 580071627
+-580278964 588636312 -602444674 586424723
+-496032261 597042048 -580278964 588636312
+-447503081 601884059 -496032261 597042048
+-377612439 608857416 -447503081 601884059
+-344321409 612179036 -377612439 608857416
+-335450751 613064109 -344321409 612179036
+-309669417 615636448 -335450751 613064109
+-216176796 624964698 -309669417 615636448
+-210517514 625529354 -216176796 624964698
+-173591796 629213627 -210517514 625529354
+-142164841 632349259 -173591796 629213627
+-33340447 643207240 -142164841 632349259
+33895543 649915728 -33340447 643207240
+117897358 658297030 33895543 649915728
+118360406 658343231 117897358 658297030
+136818513 660184893 118360406 658343231
+144008697 660902296 136818513 660184893
+176444316 664138568 144008697 660902296
+263049294 672779601 176444316 664138568
+269165862 673389883 263049294 672779601
+311596134 677623374 269165862 673389883
+376432238 684092413 311596134 677623374
+432071095 689643794 376432238 684092413
+464750648 692904404 432071095 689643794
+488547142 695278706 464750648 692904404
+510869669 697505941 488547142 695278706
+714203126 717793588 510869669 697505941
+746027352 720968858 714203126 717793588
+918364759 738163866 746027352 720968858
+934490334 739772800 918364759 738163866
+972359439 743551199 934490334 739772800
+1111611550 757445114 972359439 743551199
+1131683822 759447830 1111611550 757445114
+1251991318 771451540 1131683822 759447830
+1266368990 772886076 1251991318 771451540
+1324197087 778655889 1266368990 772886076
+1416811498 787896515 1324197087 778655889
+1495490016 795746684 1416811498 787896515
+1511082467 797302425 1495490016 795746684
+1531513610 799340947 1511082467 797302425
+1557384686 801922240 1531513610 799340947
+1592954783 805471256 1557384686 801922240
+1924006544 838502029 1592954783 805471256
+2091174702 855181274 1924006544 838502029
+267255938 -885067233 272610074 -880529914
+272610074 -880529914 275687889 -877921644
+275687889 -877921644 276213061 -877476591
+276213061 -877476591 287737604 -867710210
+287737604 -867710210 320811726 -839681812
+320811726 -839681812 355658774 -810150961
+355658774 -810150961 439610266 -739006946
+439610266 -739006946 451110750 -729260953
+451110750 -729260953 539289501 -654534580
+539289501 -654534580 540552493 -653464268
+540552493 -653464268 572444957 -626437256
+572444957 -626437256 602385680 -601064231
+602385680 -601064231 618495282 -587412279
+618495282 -587412279 640161273 -569051610
+640161273 -569051610 673160050 -541087062
+673160050 -541087062 723520113 -498409832
+723520113 -498409832 798315595 -435025002
+798315595 -435025002 811344220 -423983999
+811344220 -423983999 855854805 -386263863
+855854805 -386263863 900028294 -348829395
+900028294 -348829395 901289272 -347760789
+901289272 -347760789 957658150 -299991437
+957658150 -299991437 993827484 -269340027
+993827484 -269340027 1036380737 -233278615
+1036380737 -233278615 1047684656 -223699200
+1047684656 -223699200 1184056997 -108131557
+1184056997 -108131557 1282891535 -24375024
+1282891535 -24375024 1344005201 27415260
+1344005201 27415260 1447807468 115381656
+1447807468 115381656 1523470048 179501300
+-525621486 1202226720 -648662068 1296529390
+-487330917 1172879468 -525621486 1202226720
+-429118543 1128263439 -487330917 1172879468
+-421856093 1122697239 -429118543 1128263439
+-286004046 1018575408 -421856093 1122697239
+-257737570 996910978 -286004046 1018575408
+-197814482 950983796 -257737570 996910978
+-158676849 920987324 -197814482 950983796
+-34245787 825618942 -158676849 920987324
+-6606200 804434981 -34245787 825618942
+42425518 766855332 -6606200 804434981
+63339109 750826414 42425518 766855332
+89219676 730990628 63339109 750826414
+113083189 712700785 89219676 730990628
+149979044 684422492 113083189 712700785
+150763260 683821441 149979044 684422492
+153137194 682001973 150763260 683821441
+176444316 664138568 153137194 682001973
+230517931 622694630 176444316 664138568
+235434676 618926262 230517931 622694630
+246450301 610483496 235434676 618926262
+323229343 551637313 246450301 610483496
+333032028 544124187 323229343 551637313
+402144122 491154225 333032028 544124187
+402985845 490509099 402144122 491154225
+407354887 487160510 402985845 490509099
+427638269 471614606 407354887 487160510
+545512441 381271657 427638269 471614606
+556159873 373111086 545512441 381271657
+571562991 361305590 556159873 373111086
+587560958 349044180 571562991 361305590
+597289501 341587879 587560958 349044180
+621772885 322822945 597289501 341587879
+632173595 314851472 621772885 322822945
+702075470 261276194 632173595 314851472
+733337210 237316086 702075470 261276194
+743235165 229729942 733337210 237316086
+789800332 194040746 743235165 229729942
+798817322 187129804 789800332 194040746
+817337032 172935641 798817322 187129804
+826928781 165584184 817337032 172935641
+830437141 162895253 826928781 165584184
+876932908 127259246 830437141 162895253
+891370686 116193621 876932908 127259246
+902922638 107339794 891370686 116193621
+919624204 94539122 902922638 107339794
+991990733 39074845 919624204 94539122
+1019762313 17789720 991990733 39074845
+1056116444 -10073377 1019762313 17789720
+1098145344 -42285817 1056116444 -10073377
+1130615209 -67171874 1098145344 -42285817
+1184056997 -108131557 1130615209 -67171874
+1318979906 -211541264 1184056997 -108131557
+1336091592 -224656268 1318979906 -211541264
+1529583181 -372955090 1336091592 -224656268
+1638842537 -456695339 1529583181 -372955090
+1681849818 -489657646 1638842537 -456695339
+1727795573 -524872103 1681849818 -489657646
+1806226305 -584984200 1727795573 -524872103
+1899512098 -656481743 1806226305 -584984200
+2127997902 -831601373 1899512098 -656481743
+-1713970218 -1032049472 -1746038018 -1021110136
+-1609935671 -1067538928 -1713970218 -1032049472
+-1566711940 -1082283902 -1609935671 -1067538928
+-1508673502 -1102082638 -1566711940 -1082283902
+-1469533678 -1115434463 -1508673502 -1102082638
+-1433912527 -1127585958 -1469533678 -1115434463
+-1283412327 -1178926310 -1433912527 -1127585958
+-1209524329 -1204131830 -1283412327 -1178926310
+-1172951250 -1216608057 -1209524329 -1204131830
+-1142463125 -1227008516 -1172951250 -1216608057
+-1077540096 -1249155803 -1142463125 -1227008516
+-1058329628 -1255709097 -1077540096 -1249155803
+-1013331237 -1271059464 -1058329628 -1255709097
+-1002024906 -1274916409 -1013331237 -1271059464
+-937662545 -1296872434 -1002024906 -1274916409
+-933025521 -1298454269 -937662545 -1296872434
+-824944236 -1335324195 -933025521 -1298454269
+-811036211 -1340068660 -824944236 -1335324195
+-809534544 -1340580925 -811036211 -1340068660
+-656819571 -1392676806 -809534544 -1340580925
+-644983857 -1396714340 -656819571 -1392676806
+-569637836 -1422417237 -644983857 -1396714340
+-549372297 -1429330450 -569637836 -1422417237
+-523016061 -1438321391 -549372297 -1429330450
+-466149913 -1457720223 -523016061 -1438321391
+-450020781 -1463222377 -466149913 -1457720223
+-428258389 -1470646213 -450020781 -1463222377
+-340953161 -1500428772 -428258389 -1470646213
+-333546172 -1502955529 -340953161 -1500428772
+-122689274 -1574885448 -333546172 -1502955529
+236121868 2134066257 313404379 1975942450
+313404379 1975942450 414802591 1768476740
+414802591 1768476740 464214131 1667378307
+464214131 1667378307 549415460 1493052213
+549415460 1493052213 585103051 1420033653
+585103051 1420033653 642791051 1302001177
+642791051 1302001177 697622413 1189813523
+697622413 1189813523 716324564 1151548006
+716324564 1151548006 734788722 1113769435
+734788722 1113769435 749687345 1083286120
+749687345 1083286120 750506111 1081610886
+750506111 1081610886 756286890 1069783130
+756286890 1069783130 789353949 1002126306
+789353949 1002126306 789547095 1001731119
+789547095 1001731119 816462157 946661584
+816462157 946661584 819348653 940755671
+819348653 940755671 820568103 938260616
+820568103 938260616 840063064 898372972
+840063064 898372972 865004224 847342135
+865004224 847342135 892783522 790504331
+892783522 790504331 918364759 738163866
+918364759 738163866 935197048 703724179
+935197048 703724179 940952444 691948355
+940952444 691948355 968220733 636156101
+968220733 636156101 1049169811 470530320
+1049169811 470530320 1071713941 424403924
+1071713941 424403924 1077735403 412083717
+1077735403 412083717 1084926731 397369909
+1084926731 397369909 1090877306 385194741
+1090877306 385194741 1106688670 352843914
+1106688670 352843914 1118288209 329110691
+1118288209 329110691 1119458900 326715398
+1119458900 326715398 1120175444 325249315
+1120175444 325249315 1121466372 322608014
+1870793521 1649677108 1857900883 1657138007
+1984311702 1583984764 1870793521 1649677108
+2006865240 1570933156 1984311702 1583984764
+2065577095 1536956931 2006865240 1570933156
+-1742966439 930545432 -1726736696 932351917
+-1726736696 932351917 -1718582911 933259491
+-1718582911 933259491 -1342202955 975153242
+-1342202955 975153242 -1288955985 981080006
+-1288955985 981080006 -1244465318 986032132
+-1244465318 986032132 -1230888686 987543307
+-1230888686 987543307 -1206001765 990313397
+-1206001765 990313397 -1143196854 997304028
+-1143196854 997304028 -949557236 1018857487
+-949557236 1018857487 -921820488 1021944783
+-921820488 1021944783 -828049649 1032382141
+-828049649 1032382141 -813462830 1034005757
+-813462830 1034005757 -693846441 1047319907
+-693846441 1047319907 -651820415 1051997701
+-651820415 1051997701 -624437785 1055045581
+-624437785 1055045581 -591014755 1058765801
+-591014755 1058765801 -428322205 1076874632
+-428322205 1076874632 -422688739 1077501677
+9346012 -177671086 25210947 -220027078
+25210947 -220027078 35000604 -246163371
+35000604 -246163371 38970965 -256763387
+38970965 -256763387 40901478 -261917443
+40901478 -261917443 60843427 -315158189
+60843427 -315158189 85958638 -382210440
+85958638 -382210440 104848158 -432641423
+104848158 -432641423 118439401 -468927142
+118439401 -468927142 120275461 -473829029
+120275461 -473829029 120896005 -475485747
+120896005 -475485747 153648336 -562927479
+153648336 -562927479 169644778 -605634561
+169644778 -605634561 174003914 -617272524
+174003914 -617272524 188589936 -656214088
+188589936 -656214088 205315539 -700867877
+205315539 -700867877 207366837 -706344405
+207366837 -706344405 222213785 -745982586
+222213785 -745982586 222337779 -746313623
+222337779 -746313623 246071516 -809677632
+246071516 -809677632 258218338 -842107055
+258218338 -842107055 266037064 -862981383
+266037064 -862981383 269137499 -871258880
+269137499 -871258880 272610074 -880529914
+272610074 -880529914 276533998 -891005956
+276533998 -891005956 318048638 -1001841178
+318048638 -1001841178 330616905 -1035395768
+330616905 -1035395768 338886873 -1057474817
+338886873 -1057474817 338969186 -1057694575
+338969186 -1057694575 348778755 -1083884029
+348778755 -1083884029 388337532 -1189497517
+388337532 -1189497517 409572127 -1246189348
+409572127 -1246189348 450515899 -1355500478
+450515899 -1355500478 468609929 -1403807673
+468609929 -1403807673 515125935 -1527995476
+515125935 -1527995476 616318186 -1798157178
+616318186 -1798157178 676101695 -1957766380
+676101695 -1957766380 683182707 -1976671169
+-1872120808 1334204845 -1867950484 1322677744
+-1867950484 1322677744 -1726736696 932351917
+-1726736696 932351917 -1706285404 875822964
+-1706285404 875822964 -1700364750 859457818
+-1700364750 859457818 -1682905725 811199725
+-1682905725 811199725 -1645928315 708991303
+-1645928315 708991303 -1629174303 662681919
+-1629174303 662681919 -1592441890 561150691
+-1592441890 561150691 -1586142454 543738563
+-1586142454 543738563 -1577813320 520716191
+-1577813320 520716191 -1562451798 478255757
+-1562451798 478255757 -1484115981 261729503
+-1484115981 261729503 -1475673460 238393721
+-1475673460 238393721 -1462558743 202143629
+-1462558743 202143629 -1402123723 35096563
+-1402123723 35096563 -1372144290 -47768910
+-1372144290 -47768910 -1367328625 -61079780
+-1367328625 -61079780 -1348496291 -113133805
+-1348496291 -113133805 -1325122137 -177741776
+-1325122137 -177741776 -1285944510 -286031766
+-1285944510 -286031766 -1242368201 -406480052
+-1242368201 -406480052 -1235007612 -426825291
+-1235007612 -426825291 -1233539687 -430882748
+-1233539687 -430882748 -1229286213 -442639679
+-1229286213 -442639679 -1228257277 -445483738
+-1228257277 -445483738 -1220074232 -468102305
+-434753250 1857062948 -1134839641 2134326477
+-350214066 1823581892 -434753250 1857062948
+-324395856 1813356799 -350214066 1823581892
+19733490 1677067168 -324395856 1813356799
+-1034922799 -300881329 -982523978 -296884978
+-982523978 -296884978 -752215196 -279319794
+-752215196 -279319794 -748802595 -279059521
+-748802595 -279059521 -744974594 -278767568
+-744974594 -278767568 -730332486 -277650844
+-730332486 -277650844 -691101106 -274658746
+-691101106 -274658746 -671388639 -273155316
+-671388639 -273155316 -631684333 -270127149
+-631684333 -270127149 -618255572 -269102965
+-618255572 -269102965 -606114067 -268176957
+-606114067 -268176957 -591093552 -267031372
+-591093552 -267031372 -510635871 -260895028
+-510635871 -260895028 -440047715 -255511413
+-440047715 -255511413 -432241632 -254916059
+-432241632 -254916059 -427525114 -254556339
+-427525114 -254556339 -416700652 -253730780
+-416700652 -253730780 -400227215 -252474384
+-400227215 -252474384 -334677669 -247475053
+-334677669 -247475053 -225514518 -239149401
+-225514518 -239149401 -188541355 -236329532
+-188541355 -236329532 -170801749 -234976569
+-170801749 -234976569 -141093111 -232710751
+-141093111 -232710751 -122463545 -231289912
+-122463545 -231289912 -76520414 -227785922
+-76520414 -227785922 -65052458 -226911285
+-65052458 -226911285 -3137958 -222189191
+-3137958 -222189191 6946294 -221420086
+6946294 -221420086 25210947 -220027078
+25210947 -220027078 76930031 -216082568
+76930031 -216082568 95593811 -214659119
+95593811 -214659119 103643126 -214045214
+103643126 -214045214 141472285 -211160061
+141472285 -211160061 179995950 -208221939
+179995950 -208221939 226767546 -204654764
+226767546 -204654764 302292800 -198894606
+302292800 -198894606 332749854 -196571709
+332749854 -196571709 422444580 -189730874
+422444580 -189730874 441855326 -188250455
+441855326 -188250455 462773592 -186655062
+462773592 -186655062 464438395 -186528091
+464438395 -186528091 543875961 -180469548
+543875961 -180469548 621566180 -174544273
+621566180 -174544273 627234015 -174111999
+627234015 -174111999 641874753 -172995379
+641874753 -172995379 651216600 -172282895
+651216600 -172282895 685687598 -169653862
+685687598 -169653862 687999192 -169477562
+687999192 -169477562 696576495 -168823388
+696576495 -168823388 731281546 -166176504
+731281546 -166176504 793886739 -161401733
+793886739 -161401733 832784662 -158435067
+-1542342992 550967496 -1556601223 587836881
+-1528881399 516158084 -1542342992 550967496
+-1502221368 447219734 -1528881399 516158084
+-1451585677 316284367 -1502221368 447219734
+-1425251216 248187885 -1451585677 316284367
+-1396514888 173880582 -1425251216 248187885
+-1329302059 79528 -1396514888 173880582
+-1317292939 -30974033 -1329302059 79528
+-1315110429 -36617638 -1317292939 -30974033
+-1295069190 -88440906 -1315110429 -36617638
+-1268881673 -156157413 -1295069190 -88440906
+-1232547043 -250112646 -1268881673 -156157413
+-1210517368 -307077674 -1232547043 -250112646
+-1203000155 -326515923 -1210517368 -307077674
+-1197057426 -341882819 -1203000155 -326515923
+-1185739156 -371149958 -1197057426 -341882819
+-1154570784 -451746117 -1185739156 -371149958
+-1146533930 -472528068 -1154570784 -451746117
+-1144037090 -478984476 -1146533930 -472528068
+-1111327926 -563564866 -1144037090 -478984476
+-1087947418 -624022921 -1111327926 -563564866
+-1028045793 -778918433 -1087947418 -624022921
+-1015413526 -811583346 -1028045793 -778918433
+-980341444 -902273845 -1015413526 -811583346
+-898105269 -1114922740 -980341444 -902273845
+-892496018 -1129427320 -898105269 -1114922740
+-885773602 -1146810354 -892496018 -1129427320
+-858158294 -1218218889 -885773602 -1146810354
+-853340302 -1230677404 -858158294 -1218218889
+-816035177 -1327142176 -853340302 -1230677404
+-811036211 -1340068660 -816035177 -1327142176
+-810549462 -1341327310 -811036211 -1340068660
+-788975612 -1397113651 -810549462 -1341327310
+-735532205 -1535309301 -788975612 -1397113651
+-730788025 -1547576952 -735532205 -1535309301
+-721439487 -1571750694 -730788025 -1547576952
+-698466676 -1631154515 -721439487 -1571750694
+-598397545 -1889916431 -698466676 -1631154515
+-572218394 -1957611305 -598397545 -1889916431
+284376202 -1033523496 214867690 -1098923894
+291462957 -1026855583 284376202 -1033523496
+311318527 -1008173524 291462957 -1026855583
+318048638 -1001841178 311318527 -1008173524
+339207147 -981933185 318048638 -1001841178
+341488629 -979786544 339207147 -981933185
+366190273 -956544824 341488629 -979786544
+439678116 -887400282 366190273 -956544824
+465595167 -863014989 439678116 -887400282
+529036223 -803323446 465595167 -863014989
+576875274 -758311793 529036223 -803323446
+599182360 -737323107 576875274 -758311793
+640938667 -698034693 599182360 -737323107
+678861584 -662353108 640938667 -698034693
+691455068 -650503928 678861584 -662353108
+700421764 -642067185 691455068 -650503928
+795028203 -553052204 700421764 -642067185
+813422638 -535744923 795028203 -553052204
+-1436096997 -2115886764 -1117825587 -2092060787
+-1117825587 -2092060787 -165855696 -2020795785
+-165855696 -2020795785 676101695 -1957766380
+676101695 -1957766380 804755043 -1948135317
+-345134810 -758960216 -343386398 -757692302
+-343386398 -757692302 -212735420 -662946783
+-212735420 -662946783 -194619356 -649809370
+-194619356 -649809370 -179489718 -638837655
+-179489718 -638837655 -124848891 -599213202
+-124848891 -599213202 -108166846 -587115712
+-108166846 -587115712 -78604493 -565677675
+-78604493 -565677675 -50846490 -545548117
+-50846490 -545548117 -30401674 -530721939
+-30401674 -530721939 -8927756 -515149476
+-8927756 -515149476 23074602 -491941996
+23074602 -491941996 25312035 -490319454
+25312035 -490319454 50694858 -471912329
+50694858 -471912329 70989640 -457194953
+70989640 -457194953 73648779 -455266598
+73648779 -455266598 94933026 -439831681
+94933026 -439831681 104848158 -432641423
+104848158 -432641423 124230900 -418585439
+124230900 -418585439 286871237 -300641867
+286871237 -300641867 287498187 -300187216
+287498187 -300187216 291519944 -297270716
+291519944 -297270716 301415580 -290094596
+301415580 -290094596 352637962 -252949132
+352637962 -252949132 357252874 -249602489
+357252874 -249602489 369304068 -240863200
+369304068 -240863200 441855326 -188250455
+441855326 -188250455 449097079 -182998879
+449097079 -182998879 468249020 -169110268
+468249020 -169110268 500158849 -145969888
+500158849 -145969888 534825191 -120830539
+534825191 -120830539 574497375 -92061052
+574497375 -92061052 587796268 -82416956
+587796268 -82416956 628133987 -53164836
+628133987 -53164836 765666795 46571250
+765666795 46571250 787314071 62269429
+787314071 62269429 804602982 74807007
+804602982 74807007 876932908 127259246
+876932908 127259246 909972802 151219127
+909972802 151219127 947566422 178481280
+947566422 178481280 948969001 179498403
+948969001 179498403 1022798118 233037826
+-1650658806 -1134392710 -1740005019 -1281069345
+-1609935671 -1067538928 -1650658806 -1134392710
+-1581098725 -1020198294 -1609935671 -1067538928
+-1475298703 -846510004 -1581098725 -1020198294
+-1327246341 -603457484 -1475298703 -846510004
+-1281332262 -528081905 -1327246341 -603457484
+-1257026750 -488180374 -1281332262 -528081905
+-1237555690 -456215398 -1257026750 -488180374
+-1230882720 -445260610 -1237555690 -456215398
+-1229286213 -442639679 -1230882720 -445260610
+-1223627622 -433350163 -1229286213 -442639679
+-1191980077 -381395466 -1223627622 -433350163
+-1185739156 -371149958 -1191980077 -381395466
+-1099436749 -229470237 -1185739156 -371149958
+-1062971884 -169607111 -1099436749 -229470237
+-1043363609 -137416873 -1062971884 -169607111
+-1028334452 -112744019 -1043363609 -137416873
+-989455097 -48917105 -1028334452 -112744019
+-965972870 -10367133 -989455097 -48917105
+-942961134 27410449 -965972870 -10367133
+-903210205 92668195 -942961134 27410449
+-900854998 96534659 -903210205 92668195
+-884283085 123740205 -900854998 96534659
+-881935660 127593892 -884283085 123740205
+-876911718 135841527 -881935660 127593892
+-868633279 149431957 -876911718 135841527
+-848937556 181765755 -868633279 149431957
+-833277922 207473642 -848937556 181765755
+-804043465 255466854 -833277922 207473642
+-789639934 279112641 -804043465 255466854
+-762853554 323086928 -789639934 279112641
+-750366850 343585926 -762853554 323086928
+-725767450 383969922 -750366850 343585926
+-723720369 387330545 -725767450 383969922
+-723398662 387858680 -723720369 387330545
+-692693959 438265545 -723398662 387858680
+-649537750 509113624 -692693959 438265545
+-635339355 532422645 -649537750 509113624
+-602444674 586424723 -635339355 532422645
+-590235529 606468060 -602444674 586424723
+-561513326 653620323 -590235529 606468060
+-545783793 679442960 -561513326 653620323
+-521401876 719469923 -545783793 679442960
+-479729609 787881865 -521401876 719469923
+-473879051 797486526 -479729609 787881865
+-467401532 808120448 -473879051 797486526
+-465898384 810588116 -467401532 808120448
+-427873531 873012222 -465898384 810588116
+-427757773 873202257 -427873531 873012222
+-332120372 1030206920 -427757773 873202257
+-865055278 -714129811 -880363917 -722089238
+-796283912 -678373485 -865055278 -714129811
+-671529890 -613510073 -796283912 -678373485
+-663488215 -609328962 -671529890 -613510073
+-628771442 -591278655 -663488215 -609328962
+-624944281 -589288798 -628771442 -591278655
+-589748217 -570989293 -624944281 -589288798
+-521892347 -535708962 -589748217 -570989293
+-484635523 -516338005 -521892347 -535708962
+-471978864 -509757423 -484635523 -516338005
+-374471543 -459060400 -471978864 -509757423
+-337275350 -439720967 -374471543 -459060400
+-287597329 -413891853 -337275350 -439720967
+-274516126 -407090537 -287597329 -413891853
+-264812852 -402045510 -274516126 -407090537
+-196953698 -366763471 -264812852 -402045510
+-168152952 -351789087 -196953698 -366763471
+-90315305 -311318925 -168152952 -351789087
+-80599109 -306267179 -90315305 -311318925
+-76516060 -304144278 -80599109 -306267179
+-24587050 -277144806 -76516060 -304144278
+2579838 -263019914 -24587050 -277144806
+12853625 -257678260 2579838 -263019914
+13243404 -257475602 12853625 -257678260
+35000604 -246163371 13243404 -257475602
+61923072 -232165561 35000604 -246163371
+95593811 -214659119 61923072 -232165561
+105581310 -209466315 95593811 -214659119
+121387789 -201248046 105581310 -209466315
+152952757 -184836458 121387789 -201248046
+196926669 -161973083 152952757 -184836458
+246241613 -136332743 196926669 -161973083
+271986709 -122947084 246241613 -136332743
+316787751 -99653659 271986709 -122947084
+391948771 -60575158 316787751 -99653659
+416720962 -47695343 391948771 -60575158
+493761784 -7639475 416720962 -47695343
+523460166 7801617 493761784 -7639475
+531451869 11956747 523460166 7801617
+582775377 38641400 531451869 11956747
+608067106 51791340 582775377 38641400
+770750466 136375369 608067106 51791340
+786371776 144497363 770750466 136375369
+826928781 165584184 786371776 144497363
+832925681 168702155 826928781 165584184
+851896024 178565413 832925681 168702155
+879011121 192663377 851896024 178565413
+972245715 241138880 879011121 192663377
+993976458 252437355 972245715 241138880
+1034506075 273509935 993976458 252437355
+1040807769 276786378 1034506075 273509935
+1076736895 295467024 1040807769 276786378
+-2077944395 -1592198087 -1652471466 -1426103606
+-1652471466 -1426103606 -1639402774 -1421001900
+-1639402774 -1421001900 -1500763797 -1366880551
+-1500763797 -1366880551 -1493502751 -1364046012
+-1493502751 -1364046012 -1305025922 -1290469154
+-1305025922 -1290469154 -1239584591 -1264922419
+-1239584591 -1264922419 -1190913824 -1245922513
+-1190913824 -1245922513 -1142463125 -1227008516
+-1142463125 -1227008516 -1093497210 -1207893391
+-1093497210 -1207893391 -1030920632 -1183464987
+-1030920632 -1183464987 -984573503 -1165372174
+-984573503 -1165372174 -915974382 -1138592714
+-915974382 -1138592714 -912631976 -1137287918
+-912631976 -1137287918 -892496018 -1129427320
+-892496018 -1129427320 -708162298 -1057467833
+-708162298 -1057467833 -653458362 -1036112722
+-653458362 -1036112722 -531549732 -988522501
+-531549732 -988522501 -503659073 -977634653
+-503659073 -977634653 -432932636 -950024739
+-432932636 -950024739 -429032597 -948502257
+-429032597 -948502257 -385057860 -931335569
+-385057860 -931335569 -367231431 -924376556
+-367231431 -924376556 -299532949 -897948684
+-299532949 -897948684 -163338759 -844781720
+-163338759 -844781720 -153723142 -841028013
+-153723142 -841028013 -120596844 -828096296
+-120596844 -828096296 -103700505 -821500369
+-103700505 -821500369 25924024 -770898045
+25924024 -770898045 67761096 -754565850
+67761096 -754565850 88561560 -746445845
+88561560 -746445845 97998814 -742761766
+97998814 -742761766 115248716 -736027816
+115248716 -736027816 116368608 -735590637
+116368608 -735590637 151468020 -721888664
+151468020 -721888664 162859758 -717441601
+162859758 -717441601 170178506 -714584536
+170178506 -714584536 195545511 -704681863
+195545511 -704681863 205315539 -700867877
+205315539 -700867877 211474136 -698463708
+211474136 -698463708 230406106 -691073118
+230406106 -691073118 246209497 -684903851
+1709541396 -1783226156 1715504403 -1662343690
+1715504403 -1662343690 1725059547 -1468641197
+1725059547 -1468641197 1739874221 -1168317166
+1739874221 -1168317166 1747049039 -1022868789
+1747049039 -1022868789 1759063094 -779319109
+-1003865202 337857318 -1021019264 337469667
+-972428906 338567721 -1003865202 337857318
+-948871705 339100072 -972428906 338567721
+-930189584 339522254 -948871705 339100072
+-917623970 339806215 -930189584 339522254
+-800909159 342443760 -917623970 339806215
+-773992287 343052033 -800909159 342443760
+-750366850 343585926 -773992287 343052033
+-717331696 344332461 -750366850 343585926
+-679381903 345190058 -717331696 344332461
+-619791089 346536704 -679381903 345190058
+-531098700 348540993 -619791089 346536704
+-516768191 348864836 -531098700 348540993
+-490995669 349447249 -516768191 348864836
+-465562663 350021990 -490995669 349447249
+-447276593 350435222 -465562663 350021990
+-440735340 350583042 -447276593 350435222
+-340256607 352853682 -440735340 350583042
+-336033724 352949111 -340256607 352853682
+-263041922 354598595 -336033724 352949111
+-249531075 354903916 -263041922 354598595
+-209444617 355809798 -249531075 354903916
+-168592007 356732994 -209444617 355809798
+-165771003 356796743 -168592007 356732994
+-137737298 357430255 -165771003 356796743
+-124716400 357724504 -137737298 357430255
+-94321487 358411374 -124716400 357724504
+-50872663 359393240 -94321487 358411374
+-40499887 359627646 -50872663 359393240
+4021044 360633739 -40499887 359627646
+21779094 361035039 4021044 360633739
+61141662 361924563 21779094 361035039
+79729812 362344622 61141662 361924563
+82283545 362402331 79729812 362344622
+114011375 363119323 82283545 362402331
+306405252 367467080 114011375 363119323
+319029452 367752364 306405252 367467080
+350208091 368456946 319029452 367752364
+385274874 369249392 350208091 368456946
+404009066 369672751 385274874 369249392
+419055076 370012764 404009066 369672751
+444106695 370578886 419055076 370012764
+556159873 373111086 444106695 370578886
+621424851 374585958 556159873 373111086
+628223193 374739588 621424851 374585958
+630534177 374791812 628223193 374739588
+638044438 374961531 630534177 374791812
+639548466 374995519 638044438 374961531
+924088046 381425603 639548466 374995519
+1047386985 384211938 924088046 381425603
+1077090878 384883193 1047386985 384211938
+1090877306 385194741 1077090878 384883193
+1136829142 386233171 1090877306 385194741
+751432073 -782861330 703282366 -873741525
+767646023 -752258299 751432073 -782861330
+776918917 -734756169 767646023 -752258299
+780678736 -727659696 776918917 -734756169
+794586028 -701410369 780678736 -727659696
+871116627 -556962640 794586028 -701410369
+874184216 -551172717 871116627 -556962640
+885257203 -530273001 874184216 -551172717
+914417452 -475234470 885257203 -530273001
+962027641 -385372588 914417452 -475234470
+1001874673 -310163282 962027641 -385372588
+1008940624 -296826648 1001874673 -310163282
+1042705743 -233096652 1008940624 -296826648
+1047684656 -223699200 1042705743 -233096652
+1130615209 -67171874 1047684656 -223699200
+1166884769 1285131 1130615209 -67171874
+1179166122 24465579 1166884769 1285131
+1183544793 32730103 1179166122 24465579
+1296713639 246330716 1183544793 32730103
+1300054802 252636996 1296713639 246330716
+1313737471 278462359 1300054802 252636996
+1356312826 358821241 1313737471 278462359
+1405557861 451768813 1356312826 358821241
+1466003358 565856706 1405557861 451768813
+1468358062 570301093 1466003358 565856706
+1550310007 724981345 1468358062 570301093
+1586992440 794217627 1550310007 724981345
+1592954783 805471256 1586992440 794217627
+1675288804 960872656 1592954783 805471256
+1696731086 1001343906 1675288804 960872656
+1698562637 1004800867 1696731086 1001343906
+-1607583214 540199847 -1650150500 533174280
+-1586142454 543738563 -1607583214 540199847
+-1542342992 550967496 -1586142454 543738563
+-1520681702 554542610 -1542342992 550967496
+-1437779093 568225368 -1520681702 554542610
+-1379834253 577788942 -1437779093 568225368
+-1370224565 579374985 -1379834253 577788942
+-1308033651 589639357 -1370224565 579374985
+-1026244756 636147537 -1308033651 589639357
+-991541620 641875157 -1026244756 636147537
+-858109104 663897683 -991541620 641875157
+-833271956 667996959 -858109104 663897683
+-779453098 676879556 -833271956 667996959
+-764038873 679423615 -779453098 676879556
+-733547067 684456171 -764038873 679423615
+-673554360 694357738 -733547067 684456171
+-642199301 699532770 -673554360 694357738
+-583514567 709218461 -642199301 699532770
+-521401876 719469923 -583514567 709218461
+-477739340 726676258 -521401876 719469923
+-435033191 733724745 -477739340 726676258
+-433958329 733902146 -435033191 733724745
+-429893152 734573088 -433958329 733902146
+-321935917 752391017 -429893152 734573088
+-241147887 765724773 -321935917 752391017
+-234946299 766748321 -241147887 765724773
+-193997334 773506791 -234946299 766748321
+-167579559 777866944 -193997334 773506791
+-6606200 804434981 -167579559 777866944
+52491299 814188797 -6606200 804434981
+73560072 817666118 52491299 814188797
+83311073 819275483 73560072 817666118
+246573593 846221338 83311073 819275483
+369313041 866479014 246573593 846221338
+371053669 866766298 369313041 866479014
+391208864 870092836 371053669 866766298
+446261122 879179001 391208864 870092836
+460087565 881461002 446261122 879179001
+490900735 886546598 460087565 881461002
+518778899 891147782 490900735 886546598
+575412270 900494904 518778899 891147782
+775244904 933476516 575412270 900494904
+814362180 939932673 775244904 933476516
+819348653 940755671 814362180 939932673
+824971423 941683688 819348653 940755671
+944493915 961410418 824971423 941683688
+994207899 969615521 944493915 961410418
+998794899 970372588 994207899 969615521
+629491517 -248033654 561613600 -328180178
+632138524 -244908213 629491517 -248033654
+646174149 -228335716 632138524 -244908213
+663031408 -208431588 646174149 -228335716
+667592700 -203045865 663031408 -208431588
+673718830 -195812466 667592700 -203045865
+679780800 -188654824 673718830 -195812466
+689440316 -177249398 679780800 -188654824
+696576495 -168823388 689440316 -177249398
+824139519 -18203961 696576495 -168823388
+843302717 4422893 824139519 -18203961
+875906654 42919835 843302717 4422893
+919624204 94539122 875906654 42919835
+951190686 131811094 919624204 94539122
+1044765645 242299277 951190686 131811094
+1071548353 273922831 1044765645 242299277
+1114391131 324509235 1071548353 273922831
+1118288209 329110691 1114391131 324509235
+1123412589 335161278 1118288209 329110691
+1196337032 421266464 1123412589 335161278
+1208489375 435615285 1196337032 421266464
+1283432753 524104318 1208489375 435615285
+1303678438 548009313 1283432753 524104318
+1052781093 -385049254 1048911426 -376551709
+1088629374 -463769802 1052781093 -385049254
+1113611982 -518630023 1088629374 -463769802
+1247639057 -812944969 1113611982 -518630023
+1251525555 -821479471 1247639057 -812944969
+1269900712 -861830150 1251525555 -821479471
+1329496453 -992698613 1269900712 -861830150
+1374109438 -1090665894 1329496453 -992698613
+581438018 1712297445 568734472 1730121650
+677779567 1577121685 581438018 1712297445
+892311701 1276114025 677779567 1577121685
+911066311 1249799639 892311701 1276114025
+926826358 1227686893 911066311 1249799639
+938987596 1210623594 926826358 1227686893
+944218451 1203284239 938987596 1210623594
+978037371 1155833287 944218451 1203284239
+1023077127 1092638504 978037371 1155833287
+1071482607 1024721312 1023077127 1092638504
+1081878443 1010135029 1071482607 1024721312
+1086931909 1003044567 1081878443 1010135029
+1142171230 925538889 1086931909 1003044567
+1155793669 906425395 1142171230 925538889
+1215493548 822661158 1155793669 906425395
+1229678906 802757839 1215493548 822661158
+1251991318 771451540 1229678906 802757839
+1261529681 758068370 1251991318 771451540
+1287984529 720949865 1261529681 758068370
+1332924922 657894499 1287984529 720949865
+-1870484211 1107970524 -2017453579 1340493016
+-1729703912 885239854 -1870484211 1107970524
+-1697337960 834033184 -1729703912 885239854
+-1682905725 811199725 -1697337960 834033184
+-1610363059 696428860 -1682905725 811199725
+-1570834671 633890392 -1610363059 696428860
+-1556389307 611036159 -1570834671 633890392
+-1520681702 554542610 -1556389307 611036159
+-1494389352 512945081 -1520681702 554542610
+-1428998173 409488693 -1494389352 512945081
+-1424810854 402863872 -1428998173 409488693
+-1310336461 221752179 -1424810854 402863872
+-1236906220 105577069 -1310336461 221752179
+-1185428399 24133219 -1236906220 105577069
+-1177626802 11790193 -1185428399 24133219
+-1158456167 -18539963 -1177626802 11790193
+-1155148799 -23772601 -1158456167 -18539963
+-1131651639 -60947817 -1155148799 -23772601
+-1110011459 -95185078 -1131651639 -60947817
+-1101471283 -108696621 -1110011459 -95185078
+-1100764283 -109815178 -1101471283 -108696621
+-1082002861 -139497911 -1100764283 -109815178
+-1077857249 -146056747 -1082002861 -139497911
+-1062971884 -169607111 -1077857249 -146056747
+-982523978 -296884978 -1062971884 -169607111
+-911937089 -408561576 -982523978 -296884978
+-901170943 -425594860 -911937089 -408561576
+-1884366481 -68408424 -1881659693 160963955
+-1881659693 160963955 -1880358286 271244707
+-1880358286 271244707 -1879070313 380387103
+-1879070313 380387103 -1874311340 783660908
+-1874311340 783660908 -1874240824 789636384
+-1874240824 789636384 -1871640724 1009968024
+-1871640724 1009968024 -1870484211 1107970524
+-1870484211 1107970524 -1867950484 1322677744
+-1867950484 1322677744 -1866174779 1473150336
+-1866174779 1473150336 -1865146272 1560305668
+-1865146272 1560305668 -1864503280 1614792662
+-1864503280 1614792662 -1862508387 1783839147
+-1864503280 1614792662 -1968190317 2099071565
+-1850040491 1547243011 -1864503280 1614792662
+-1826001943 1434968978 -1850040491 1547243011
+-1814319969 1380407355 -1826001943 1434968978
+-1718582911 933259491 -1814319969 1380407355
+-1706285404 875822964 -1718582911 933259491
+-1703341617 862073766 -1706285404 875822964
+-1697337960 834033184 -1703341617 862073766
+-1672581434 718405781 -1697337960 834033184
+-1664369510 680051308 -1672581434 718405781
+-1657842175 649564853 -1664369510 680051308
+-889867104 1582152707 -869126850 1433355965
+-869126850 1433355965 -859528933 1364497658
+-859528933 1364497658 -856845684 1345247234
+-856845684 1345247234 -843027653 1246112573
+-843027653 1246112573 -823597429 1106714379
+-823597429 1106714379 -813462830 1034005757
+-813462830 1034005757 -808308424 997026521
+-808308424 997026521 -791016644 872970156
+-791016644 872970156 -773323329 746033061
+-773323329 746033061 -767685654 705586705
+-767685654 705586705 -764038873 679423615
+-764038873 679423615 -757596950 633207350
+-757596950 633207350 -752739233 598356647
+-752739233 598356647 -751790544 591550469
+-751790544 591550469 -749037373 571798399
+-749037373 571798399 -730921043 441826475
+-730921043 441826475 -723398662 387858680
+-723398662 387858680 -723264679 386897444
+-723264679 386897444 -722705888 382888510
+-722705888 382888510 -717331696 344332461
+-717331696 344332461 -704127742 249603376
+-704127742 249603376 -698223351 207243520
+-698223351 207243520 -697624535 202947436
+-697624535 202947436 -695625994 188609316
+-695625994 188609316 -691717718 160570181
+-691717718 160570181 -685743354 117708319
+-685743354 117708319 -680944613 83280726
+-680944613 83280726 -680034829 76753663
+-680034829 76753663 -679526079 73103745
+-679526079 73103745 -679119349 70185743
+-679119349 70185743 -672781588 24716760
+-672781588 24716760 -672046122 19440312
+-672046122 19440312 -670417241 7754235
+-670417241 7754235 -661939576 -53067055
+-661939576 -53067055 -657188989 -87149173
+-657188989 -87149173 -648983066 -146020901
+-648983066 -146020901 -641673370 -198462827
+-641673370 -198462827 -639010317 -217568362
+-639010317 -217568362 -631684333 -270127149
+-631684333 -270127149 -628710167 -291464699
+-628710167 -291464699 -625083070 -317486565
+-625083070 -317486565 -624513610 -321572042
+-624513610 -321572042 -621935996 -340064611
+-621935996 -340064611 -610735524 -420420121
+-610735524 -420420121 -604047719 -468400422
+-604047719 -468400422 -599797250 -498894547
+-599797250 -498894547 -589748217 -570989293
+-589748217 -570989293 -586442760 -594703623
+-586442760 -594703623 -581808028 -627954565
+-581808028 -627954565 -578099263 -654562345
+-578099263 -654562345 -558619047 -794319199
+-558619047 -794319199 -555540291 -816407112
+-555540291 -816407112 -555291992 -818188484
+-555291992 -818188484 -551845484 -842914755
+-551845484 -842914755 -546142356 -883830687
+-546142356 -883830687 -531549732 -988522501
+-531549732 -988522501 -521991700 -1057094666
+-521991700 -1057094666 -512886046 -1122421331
+-512886046 -1122421331 -503746966 -1187987801
+-503746966 -1187987801 -494652456 -1253234518
+-494652456 -1253234518 -476708690 -1381968419
+-476708690 -1381968419 -476061958 -1386608270
+-476061958 -1386608270 -476049011 -1386701151
+-476049011 -1386701151 -466149913 -1457720223
+-466149913 -1457720223 -464860728 -1466969218
+-464860728 -1466969218 -455407954 -1534786226
+-455407954 -1534786226 -424707449 -1755040758
+434956886 -638380585 449052739 -615918332
+449052739 -615918332 465171646 -590232271
+465171646 -590232271 465665783 -589444844
+465665783 -589444844 479916422 -566735936
+479916422 -566735936 490156665 -550417738
+490156665 -550417738 520253176 -502457856
+520253176 -502457856 548306338 -457754127
+548306338 -457754127 566399834 -428921485
+566399834 -428921485 570258380 -422772752
+570258380 -422772752 599245161 -376581267
+599245161 -376581267 618068321 -346585879
+618068321 -346585879 682789050 -243451054
+682789050 -243451054 683192809 -242807650
+683192809 -242807650 683378475 -242511783
+683378475 -242511783 686458869 -237603064
+686458869 -237603064 696796304 -221129987
+696796304 -221129987 697245853 -220413615
+697245853 -220413615 704810579 -208358949
+704810579 -208358949 731281546 -166176504
+731281546 -166176504 824139519 -18203961
+824139519 -18203961 840984488 8639108
+840984488 8639108 862769904 43354957
+862769904 43354957 902922638 107339794
+902922638 107339794 925785935 143773286
+925785935 143773286 946505847 176791216
+946505847 176791216 947566422 178481280
+947566422 178481280 987034769 241375521
+987034769 241375521 993976458 252437355
+993976458 252437355 1010943676 279475230
+1010943676 279475230 1010998842 279563139
+1010998842 279563139 1077090878 384883193
+1077090878 384883193 1084926731 397369909
+1084926731 397369909 1103527993 427011694
+1103527993 427011694 1116502666 447687305
+1116502666 447687305 1141659411 487775490
+1141659411 487775490 1144521596 492336485
+1144521596 492336485 1207542531 592762628
+1207542531 592762628 1287984529 720949865
+1287984529 720949865 1324197087 778655889
+1324197087 778655889 1352733760 824130111
+1352733760 824130111 1369481878 850818843
+1369481878 850818843 1393020130 888327901
+1393020130 888327901 1474318016 1017879027
+1474318016 1017879027 1475711074 1020098915
+1475711074 1020098915 1627791630 1262444791
+1627791630 1262444791 1775170566 1497298464
+1775170566 1497298464 1870793521 1649677108
+1870793521 1649677108 1979502394 1822908634
+1979502394 1822908634 2003983731 1861920531
+-915974382 -1138592714 -944630033 -1130795503
+-913854186 -1139169620 -915974382 -1138592714
+-885773602 -1146810354 -913854186 -1139169620
+-810610831 -1167262163 -885773602 -1146810354
+-680498113 -1202665867 -810610831 -1167262163
+-662981158 -1207432235 -680498113 -1202665867
+-649344981 -1211142642 -662981158 -1207432235
+-637799181 -1214284257 -649344981 -1211142642
+-494652456 -1253234518 -637799181 -1214284257
+-406659105 -1277177531 -494652456 -1253234518
+-382403235 -1283777559 -406659105 -1277177531
+-352592953 -1291888945 -382403235 -1283777559
+-342655693 -1294592876 -352592953 -1291888945
+-72876873 -1367999762 -342655693 -1294592876
+-56282458 -1372515106 -72876873 -1367999762
+-46911640 -1375064908 -56282458 -1372515106
+123722109 -1421494395 -46911640 -1375064908
+221170714 -1448010186 123722109 -1421494395
+363059457 -1486618149 221170714 -1448010186
+515125935 -1527995476 363059457 -1486618149
+595067677 -1549747645 515125935 -1527995476
+617053029 -1555729865 595067677 -1549747645
+734098033 -1587577840 617053029 -1555729865
+748709151 -1591553529 734098033 -1587577840
+1223539396 -1720754960 748709151 -1591553529
+-1402123723 35096563 -1457256436 61607687
+-1329302059 79528 -1402123723 35096563
+-1285174416 -21139697 -1329302059 79528
+-1283642674 -21876250 -1285174416 -21139697
+-1249990843 -38058074 -1283642674 -21876250
+-1218657524 -53125018 -1249990843 -38058074
+-1141095668 -90421422 -1218657524 -53125018
+-1121789096 -99705183 -1141095668 -90421422
+-1101737886 -109347010 -1121789096 -99705183
+-1100764283 -109815178 -1101737886 -109347010
+-1078340603 -120597831 -1100764283 -109815178
+-1055988389 -131346120 -1078340603 -120597831
+-1043363609 -137416873 -1055988389 -131346120
+-918953980 -197240504 -1043363609 -137416873
+-751455651 -277783772 -918953980 -197240504
+-748802595 -279059521 -751455651 -277783772
+-746669564 -280085211 -748802595 -279059521
+-726385658 -289838933 -746669564 -280085211
+-684845548 -309813916 -726385658 -289838933
+-670363467 -316777771 -684845548 -309813916
+-658709116 -322381884 -670363467 -316777771
+-632679465 -334898505 -658709116 -322381884
+-627866674 -337212784 -632679465 -334898505
+-621935996 -340064611 -627866674 -337212784
+-554785065 -372354816 -621935996 -340064611
+-448870340 -423284985 -554785065 -372354816
+-374471543 -459060400 -448870340 -423284985
+-308892302 -490594843 -374471543 -459060400
+-300112703 -494816602 -308892302 -490594843
+-225474746 -530707020 -300112703 -494816602
+-219379373 -533638042 -225474746 -530707020
+-155432742 -564387427 -219379373 -533638042
+-108166846 -587115712 -155432742 -564387427
+-63386928 -608648589 -108166846 -587115712
+-43900388 -618018889 -63386928 -608648589
+10999797 -644418200 -43900388 -618018889
+36389811 -656627246 10999797 -644418200
+87224617 -681071677 36389811 -656627246
+87240729 -681079425 87224617 -681071677
+111843968 -692910141 87240729 -681079425
+142005619 -707413677 111843968 -692910141
+143892304 -708320908 142005619 -707413677
+162859758 -717441601 143892304 -708320908
+176153236 -723833904 162859758 -717441601
+222213785 -745982586 176153236 -723833904
+222374820 -746060021 222213785 -745982586
+235838632 -752534231 222374820 -746060021
+279604594 -773579538 235838632 -752534231
+355658774 -810150961 279604594 -773579538
+381510856 -822582196 355658774 -810150961
+465595167 -863014989 381510856 -822582196
+721123396 -985888327 465595167 -863014989
+789163799 -1018606245 721123396 -985888327
+799223245 -1023443431 789163799 -1018606245
+894827123 -1069415524 799223245 -1023443431
+903674904 -1073670070 894827123 -1069415524
+920464672 -1081743600 903674904 -1073670070
+1038899873 -1138694366 920464672 -1081743600
+1157269008 -1195613364 1038899873 -1138694366
+1203586301 -1217885504 1157269008 -1195613364
+1233732538 -1232381627 1203586301 -1217885504
+1290728296 -1259788615 1233732538 -1232381627
+1527949710 -1373858935 1290728296 -1259788615
+1627435442 -1421697658 1527949710 -1373858935
+1725059547 -1468641197 1627435442 -1421697658
+1755150208 -1483110596 1725059547 -1468641197
+-592421323 -754100964 -565780907 -785797957
+-565780907 -785797957 -558619047 -794319199
+-558619047 -794319199 -525651517 -833544247
+-525651517 -833544247 -513126102 -848447091
+-513126102 -848447091 -510128171 -852014056
+-510128171 -852014056 -431597853 -945450094
+-431597853 -945450094 -429032597 -948502257
+-429032597 -948502257 -418018751 -961606624
+-418018751 -961606624 -370726603 -1017875222
+-370726603 -1017875222 -281529211 -1124003035
+-281529211 -1124003035 -268553950 -1139441110
+-1136111224 -2112158047 -1117825587 -2092060787
+-1117825587 -2092060787 -1005159139 -1968232079
+-1005159139 -1968232079 -897168955 -1849542928
+-897168955 -1849542928 -784629276 -1725853547
+-784629276 -1725853547 -698466676 -1631154515
+-698466676 -1631154515 -640959643 -1567950058
+-640959643 -1567950058 -574199147 -1494575365
+-574199147 -1494575365 -523016061 -1438321391
+-523016061 -1438321391 -476049011 -1386701151
+-476049011 -1386701151 -475961432 -1386604896
+-475961432 -1386604896 -464506427 -1374015002
+-464506427 -1374015002 -398715982 -1301706467
+-398715982 -1301706467 -382403235 -1283777559
+-382403235 -1283777559 -320239611 -1215455166
+-320239611 -1215455166 -269187593 -1159345245
+-269187593 -1159345245 -162305293 -1041873741
+-162305293 -1041873741 -75762666 -946757031
+-75762666 -946757031 -62516912 -932198974
+-62516912 -932198974 -29304466 -895696054
+-29304466 -895696054 54567624 -803514461
+54567624 -803514461 75922214 -780044197
+75922214 -780044197 99906361 -753683856
+99906361 -753683856 101694863 -751718161
+101694863 -751718161 115649996 -736380444
+115649996 -736380444 116368608 -735590637
+116368608 -735590637 142005619 -707413677
+142005619 -707413677 142860882 -706473680
+142860882 -706473680 150283040 -698316183
+150283040 -698316183 155772498 -692282865
+155772498 -692282865 188589936 -656214088
+188589936 -656214088 191162266 -653386909
+191162266 -653386909 244467504 -594800533
+244467504 -594800533 264867329 -572379625
+264867329 -572379625 274688986 -561584903
+274688986 -561584903 287972680 -546985147
+287972680 -546985147 299498648 -534317260
+299498648 -534317260 325169335 -506103288
+325169335 -506103288 382871143 -442684759
+382871143 -442684759 388704021 -436273998
+388704021 -436273998 412928598 -409649406
+412928598 -409649406 453442107 -365122082
+453442107 -365122082 463097761 -354509808
+463097761 -354509808 560956331 -246956045
+560956331 -246956045 589028862 -216102271
+589028862 -216102271 589715491 -215347615
+589715491 -215347615 624939885 -176633416
+624939885 -176633416 627234015 -174111999
+627234015 -174111999 636476579 -163953741
+636476579 -163953741 639779479 -160323612
+639779479 -160323612 666544124 -130907299
+666544124 -130907299 738348994 -51988468
+738348994 -51988468 823102375 41161728
+823102375 41161728 826199997 44566242
+826199997 44566242 891370686 116193621
+891370686 116193621 919260057 146846089
+919260057 146846089 946505847 176791216
+946505847 176791216 948969001 179498403
+948969001 179498403 1005537724 241671588
+1005537724 241671588 1034506075 273509935
+1034506075 273509935 1037746618 277071530
+1037746618 277071530 1058947471 300372826
+1058947471 300372826 1106688670 352843914
+1106688670 352843914 1141785382 391417780
+1141785382 391417780 1179863909 433268881
+1179863909 433268881 1183334168 437082951
+1183334168 437082951 1257014075 518062585
+1257014075 518062585 1434517804 713152232
+1434517804 713152232 1511082467 797302425
+1511082467 797302425 1523345216 810780088
+1523345216 810780088 1527474781 815318783
+1527474781 815318783 1581727981 874947039
+1581727981 874947039 1696731086 1001343906
+1696731086 1001343906 1960643572 1291403129
+1960643572 1291403129 2146986394 1496207589
+242824577 1571223473 263034410 1557619988
+263034410 1557619988 392816666 1470261974
+392816666 1470261974 532367067 1376328903
+532367067 1376328903 551658056 1363343904
+551658056 1363343904 642791051 1302001177
+642791051 1302001177 783722660 1207138399
+783722660 1207138399 801066118 1195464306
+801066118 1195464306 808924678 1190174614
+808924678 1190174614 858740180 1156643194
+858740180 1156643194 877956983 1143708130
+877956983 1143708130 898492770 1129885243
+898492770 1129885243 979118597 1075615019
+979118597 1075615019 988839235 1069071939
+988839235 1069071939 1064122100 1018398128
+1064122100 1018398128 1078629134 1008633266
+1078629134 1008633266 1086931909 1003044567
+1086931909 1003044567 1165281665 950306395
+1165281665 950306395 1277539336 874744392
+1277539336 874744392 1281242196 872251952
+1281242196 872251952 1295652928 862551913
+1295652928 862551913 1352733760 824130111
+1352733760 824130111 1379790850 805917656
+799575713 -656409786 840017369 -532579615
+840017369 -532579615 843689875 -521334599
+843689875 -521334599 845866456 -514670023
+845866456 -514670023 849958649 -502139950
+849958649 -502139950 879669769 -411166100
+879669769 -411166100 900028294 -348829395
+900028294 -348829395 900530702 -347291050
+900530702 -347291050 918890880 -291073173
+918890880 -291073173 936830651 -236142560
+936830651 -236142560 951268016 -191936126
+951268016 -191936126 974558396 -120622239
+974558396 -120622239 980191863 -103372866
+980191863 -103372866 1019762313 17789720
+1019762313 17789720 1026342220 37937039
+1026342220 37937039 1042897841 88629460
+1042897841 88629460 1093338650 243076497
+1093338650 243076497 1102471971 271042234
+1102471971 271042234 1120175444 325249315
+1120175444 325249315 1120852368 327322019
+1120852368 327322019 1123412589 335161278
+1123412589 335161278 1141785382 391417780
+1141785382 391417780 1154782072 431212945
+1154782072 431212945 1164271834 460270084
+1164271834 460270084 1177183882 499806080
+1177183882 499806080 1178868206 504963388
+1178868206 504963388 1207542531 592762628
+1207542531 592762628 1261529681 758068370
+1261529681 758068370 1266368990 772886076
+1266368990 772886076 1282780616 823137588
+1282780616 823137588 1295652928 862551913
+1295652928 862551913 1297904140 869445005
+1297904140 869445005 1304566272 889844093
+1304566272 889844093 1355625300 1046184086
+1355625300 1046184086 1390424985 1152738847
+1390424985 1152738847 1409947300 1212515122
+1409947300 1212515122 1419600898 1242073921
+1419600898 1242073921 1421142513 1246794260
+1421142513 1246794260 1440728902 1306766729
+1440728902 1306766729 1456691038 1355641929
+1456691038 1355641929 1471428210 1400766357
+1471428210 1400766357 1485156155 1442800583
+284483175 -560904279 316664171 -559263488
+316664171 -559263488 346971178 -557718244
+346971178 -557718244 365965037 -556749816
+365965037 -556749816 469252726 -551483553
+469252726 -551483553 490156665 -550417738
+490156665 -550417738 570950733 -546298342
+570950733 -546298342 619346308 -543830828
+619346308 -543830828 673160050 -541087062
+673160050 -541087062 825285174 -533330756
+825285174 -533330756 840017369 -532579615
+840017369 -532579615 856070443 -531761127
+856070443 -531761127 864384125 -531337243
+864384125 -531337243 885257203 -530273001
+885257203 -530273001 1113611982 -518630023
+1113611982 -518630023 1130424818 -517772797
+1130424818 -517772797 1172382804 -515633512
+1172382804 -515633512 1447131872 -501625059
+1447131872 -501625059 1681849818 -489657646
+1681849818 -489657646 1719004791 -487763249
+1719004791 -487763249 1763935115 -485472415
+1763935115 -485472415 1855109798 -480823751
+1855109798 -480823751 2118586206 -467390048
+-2097538536 1208477630 -2145938559 1251009559
+-1871640724 1009968024 -2097538536 1208477630
+-1729703912 885239854 -1871640724 1009968024
+-1703341617 862073766 -1729703912 885239854
+-1700364750 859457818 -1703341617 862073766
+-1502508645 685590098 -1700364750 859457818
+-1450641934 640011790 -1502508645 685590098
+-1379834253 577788942 -1450641934 640011790
+-1372663700 571487759 -1379834253 577788942
+-1283711185 493319987 -1372663700 571487759
+-1280779117 490743407 -1283711185 493319987
+-1132488515 360431791 -1280779117 490743407
+-1026480877 267276686 -1132488515 360431791
+-968309123 216157767 -1026480877 267276686
+-901272613 157248869 -968309123 216157767
+-876911718 135841527 -901272613 157248869
+-859189089 120267617 -876911718 135841527
+-855643307 117151732 -859189089 120267617
+-853779610 115513992 -855643307 117151732
+-849926806 112128308 -853779610 115513992
+-847097971 109642446 -849926806 112128308
+-790512384 59917384 -847097971 109642446
+-782336373 52732646 -790512384 59917384
+-764784323 37308634 -782336373 52732646
+-743244945 18380723 -764784323 37308634
+-701746524 -18086364 -743244945 18380723
+-676869261 -39947468 -701746524 -18086364
+-661939576 -53067055 -676869261 -39947468
+-646879788 -66300970 -661939576 -53067055
+-595952907 -111053396 -646879788 -66300970
+-564634914 -138574347 -595952907 -111053396
+-530669840 -168421441 -564634914 -138574347
+-519146640 -178547550 -530669840 -168421441
+-468048000 -223450911 -519146640 -178547550
+-448207354 -240886045 -468048000 -223450911
+-432241632 -254916059 -448207354 -240886045
+-425241228 -261067723 -432241632 -254916059
+-410196487 -274288416 -425241228 -261067723
+-373206504 -306793675 -410196487 -274288416
+-372312149 -307579597 -373206504 -306793675
+-360805384 -317691263 -372312149 -307579597
+-331063869 -343826871 -360805384 -317691263
+-271364289 -396288380 -331063869 -343826871
+-264812852 -402045510 -271364289 -396288380
+-172381514 -483270327 -264812852 -402045510
+-106935843 -540781262 -172381514 -483270327
+-78604493 -565677675 -106935843 -540781262
+-54255095 -587074914 -78604493 -565677675
+-31745214 -606855661 -54255095 -587074914
+10999797 -644418200 -31745214 -606855661
+40893566 -670687601 10999797 -644418200
+57481848 -685264694 40893566 -670687601
+68447119 -694900518 57481848 -685264694
+93482082 -716900203 68447119 -694900518
+115248716 -736027816 93482082 -716900203
+115649996 -736380444 115248716 -736027816
+159520560 -774932072 115649996 -736380444
+201859828 -812138060 159520560 -774932072
+211487829 -820598748 201859828 -812138060
+253428638 -857454587 211487829 -820598748
+269137499 -871258880 253428638 -857454587
+274333455 -875824871 269137499 -871258880
+276213061 -877476591 274333455 -875824871
+285189239 -885364483 276213061 -877476591
+302578356 -900645316 285189239 -885364483
+366190273 -956544824 302578356 -900645316
+416556115 -1000804231 366190273 -956544824
+-475133347 -1094657450 -499797613 -1179188248
+-470692542 -1079437670 -475133347 -1094657450
+-443008387 -984556934 -470692542 -1079437670
+-432932636 -950024739 -443008387 -984556934
+-431597853 -945450094 -432932636 -950024739
+-417105378 -895780650 -431597853 -945450094
+-410665263 -873708715 -417105378 -895780650
+-373015594 -744673597 -410665263 -873708715
+-353324585 -677187436 -373015594 -744673597
+-339395301 -629448191 -353324585 -677187436
+-325081309 -580390451 -339395301 -629448191
+-308525322 -523648817 -325081309 -580390451
+-302318751 -502377299 -308525322 -523648817
+-300112703 -494816602 -302318751 -502377299
+-279268002 -423376442 -300112703 -494816602
+-274516126 -407090537 -279268002 -423376442
+-271364289 -396288380 -274516126 -407090537
+-256851105 -346547960 -271364289 -396288380
+-248364731 -317462967 -256851105 -346547960
+-234892364 -271289694 -248364731 -317462967
+-232080656 -261653248 -234892364 -271289694
+-225514518 -239149401 -232080656 -261653248
+-197952606 -144687626 -225514518 -239149401
+-190571041 -119389100 -197952606 -144687626
+-188640004 -112770937 -190571041 -119389100
+-172182412 -56366528 -188640004 -112770937
+-167728132 -41100563 -172182412 -56366528
+-167239711 -39426621 -167728132 -41100563
+-140891092 50876888 -167239711 -39426621
+-136607123 65559155 -140891092 50876888
+-135110441 70688668 -136607123 65559155
+-124374623 107483083 -135110441 70688668
+-95132421 207703646 -124374623 107483083
+-94979678 208227133 -95132421 207703646
+-90337697 224136400 -94979678 208227133
+-88073278 231897148 -90337697 224136400
+-85238974 241611039 -88073278 231897148
+-79918647 259845169 -85238974 241611039
+-78159712 265873493 -79918647 259845169
+-73960504 280265258 -78159712 265873493
+-70520038 292056625 -73960504 280265258
+-67596069 302077820 -70520038 292056625
+-66675195 305233893 -67596069 302077820
+-60887191 325070871 -66675195 305233893
+-50872663 359393240 -60887191 325070871
+-45451316 377973593 -50872663 359393240
+-32395649 422718728 -45451316 377973593
+-7970694 506429344 -32395649 422718728
+10364008 569267091 -7970694 506429344
+15449575 586696642 10364008 569267091
+16424810 590039022 15449575 586696642
+33895543 649915728 16424810 590039022
+53517266 717164427 33895543 649915728
+63339109 750826414 53517266 717164427
+72196640 781183457 63339109 750826414
+83311073 819275483 72196640 781183457
+91278625 846582337 83311073 819275483
+97722767 868668072 91278625 846582337
+167101833 1106448008 97722767 868668072
+170571410 1118339142 167101833 1106448008
+182629396 1159664967 170571410 1118339142
+183227212 1161713836 182629396 1159664967
+191462818 1189939381 183227212 1161713836
+220340387 1288910251 191462818 1189939381
+-1239584591 -1264922419 -1263591341 -1313471049
+-1209524329 -1204131830 -1239584591 -1264922419
+-1145232409 -1074114874 -1209524329 -1204131830
+-1079550965 -941287896 -1145232409 -1074114874
+-1070814950 -923621134 -1079550965 -941287896
+-1015413526 -811583346 -1070814950 -923621134
+-978002860 -735928101 -1015413526 -811583346
+-915688845 -609911045 -978002860 -735928101
+-892815021 -563653521 -915688845 -609911045
+-887249486 -552398392 -892815021 -563653521
+-873570663 -524735833 -887249486 -552398392
+-850266465 -477607969 -873570663 -524735833
+-805686073 -387453454 -850266465 -477607969
+-756293016 -287566330 -805686073 -387453454
+-752215196 -279319794 -756293016 -287566330
+-751455651 -277783772 -752215196 -279319794
+-738665408 -251918182 -751455651 -277783772
+-709856255 -193657698 -738665408 -251918182
+-706663465 -187200948 -709856255 -193657698
+-679782769 -132840365 -706663465 -187200948
+-674917413 -123001201 -679782769 -132840365
+-657188989 -87149173 -674917413 -123001201
+-646879788 -66300970 -657188989 -87149173
+-627416449 -26940441 -646879788 -66300970
+-618201519 -8305172 -627416449 -26940441
+-599296394 29926489 -618201519 -8305172
+-586752267 55294361 -599296394 29926489
+-568825269 91547963 -586752267 55294361
+-566779722 95684653 -568825269 91547963
+-560179789 109031637 -566779722 95684653
+-556028702 117426342 -560179789 109031637
+-549811483 129999367 -556028702 117426342
+-518848763 192614989 -549811483 129999367
+-508233709 214081715 -518848763 192614989
+-506678300 217227204 -508233709 214081715
+-491167496 248594560 -506678300 217227204
+-474183743 282940646 -491167496 248594560
+-469063044 293296190 -474183743 282940646
+-469046489 293329667 -469063044 293296190
+-448366131 335151365 -469046489 293329667
+-443846313 344291750 -448366131 335151365
+-440735340 350583042 -443846313 344291750
+-426313456 379748285 -440735340 350583042
+-410381387 411967562 -426313456 379748285
+-353250088 527503660 -410381387 411967562
+-346816555 540514134 -353250088 527503660
+-333595955 567250032 -346816555 540514134
+-325026098 584580774 -333595955 567250032
+-320124320 594493596 -325026098 584580774
+-309669417 615636448 -320124320 594493596
+-270823524 694194140 -309669417 615636448
+-239644094 757248012 -270823524 694194140
+-238837257 758879672 -239644094 757248012
+-234946299 766748321 -238837257 758879672
+-183727760 870327099 -234946299 766748321
+-158676849 920987324 -183727760 870327099
+-91898220 1056033130 -158676849 920987324
+-51989365 1136740438 -91898220 1056033130
+-51966057 1136787573 -51989365 1136740438
+-45827590 1149201340 -51966057 1136787573
+-44361697 1152165800 -45827590 1149201340
+-15197607 1211144071 -44361697 1152165800
+77135680 1397868824 -15197607 1211144071
+158966208 1563353945 77135680 1397868824
+233888171 1714867938 158966208 1563353945
+306496472 1861703035 233888171 1714867938
+-1074512879 1880049947 -1029814640 1628853474
+-1029814640 1628853474 -1021172326 1580285146
+-1021172326 1580285146 -1014089584 1540481344
+-1014089584 1540481344 -1001140356 1467708894
+-1001140356 1467708894 -964702766 1262935863
+-964702766 1262935863 -935813724 1100584378
+-935813724 1100584378 -921820488 1021944783
+-921820488 1021944783 -910516734 958419613
+-910516734 958419613 -863487997 694126146
+-863487997 694126146 -858109104 663897683
+-858109104 663897683 -841752249 571974954
+-841752249 571974954 -840109026 562740319
+-840109026 562740319 -840104023 562712202
+-840104023 562712202 -835911016 539148219
+-835911016 539148219 -826233411 484761732
+-826233411 484761732 -820071170 450130988
+-820071170 450130988 -813833589 415076851
+-813833589 415076851 -813673396 414176595
+-813673396 414176595 -800909159 342443760
+-800909159 342443760 -789639934 279112641
+-789639934 279112641 -783640661 245397749
+-783640661 245397749 -778213356 214897221
+-778213356 214897221 -767615200 155337397
+-767615200 155337397 -764576704 138261565
+-764576704 138261565 -762564293 126952162
+-762564293 126952162 -756773168 94407029
+-756773168 94407029 -752883037 72545158
+-752883037 72545158 -752093744 68109463
+-752093744 68109463 -750639830 59938713
+-750639830 59938713 -747774622 43836737
+-747774622 43836737 -743244945 18380723
+-743244945 18380723 -732275317 -43266713
+-732275317 -43266713 -719349415 -115908070
+-719349415 -115908070 -706663465 -187200948
+-706663465 -187200948 -705237138 -195216661
+-705237138 -195216661 -697005486 -241477140
+-697005486 -241477140 -691101106 -274658746
+-691101106 -274658746 -684845548 -309813916
+-684845548 -309813916 -678905426 -343196382
+-678905426 -343196382 -669646806 -395228248
+-669646806 -395228248 -668348305 -402525601
+-668348305 -402525601 -660671293 -445669099
+-660671293 -445669099 -657947173 -460978185
+-657947173 -460978185 -651989572 -494458888
+-651989572 -494458888 -650911164 -500519358
+-650911164 -500519358 -648864631 -512020519
+-136810617 196379569 -134834704 199728771
+-134834704 199728771 -129813897 208239110
+-129813897 208239110 -120721874 223650221
+-120721874 223650221 -108045350 245137113
+-108045350 245137113 -98736203 260916250
+-98736203 260916250 -94163870 268666421
+-94163870 268666421 -82191683 288959451
+-82191683 288959451 -76260756 299012457
+-76260756 299012457 -74321641 302299285
+-74321641 302299285 -72274251 305769641
+-72274251 305769641 -60887191 325070871
+-60887191 325070871 -40499887 359627646
+-40499887 359627646 -30498183 376580679
+-30498183 376580679 -14978256 402887179
+-14978256 402887179 66381701 540793480
+66381701 540793480 136818513 660184893
+136818513 660184893 140605075 666603171
+140605075 666603171 147421560 678157212
+147421560 678157212 150763260 683821441
+150763260 683821441 152197260 686252091
+152197260 686252091 205056965 775850054
+205056965 775850054 246573593 846221338
+246573593 846221338 298445764 934145417
+298445764 934145417 315869254 963678483
+315869254 963678483 382525982 1076662599
+382525982 1076662599 396084246 1099644051
+396084246 1099644051 398373016 1103523549
+398373016 1103523549 441011093 1175795706
+441011093 1175795706 497423050 1271414787
+497423050 1271414787 523499191 1315614223
+523499191 1315614223 551658056 1363343904
+551658056 1363343904 585103051 1420033653
+585103051 1420033653 677779567 1577121685
+677779567 1577121685 870302673 1903451129
+870302673 1903451129 875180438 1911719010
+875180438 1911719010 990761157 2107629997
+-1950043782 1633720411 -1865146272 1560305668
+-1865146272 1560305668 -1850040491 1547243011
+-1850040491 1547243011 -1627189958 1354534007
+-1627189958 1354534007 -1309889521 1080149871
+-1309889521 1080149871 -1258422764 1035644222
+-1258422764 1035644222 -1252945251 1030907568
+-1252945251 1030907568 -1235304962 1015653207
+-1235304962 1015653207 -1206001765 990313397
+-1206001765 990313397 -1115625150 912160623
+-1115625150 912160623 -863487997 694126146
+-863487997 694126146 -833271956 667996959
+-833271956 667996959 -796225927 635961571
+-796225927 635961571 -776845150 619202131
+-776845150 619202131 -752739233 598356647
+-752739233 598356647 -746764483 593190008
+-746764483 593190008 -724821119 574214582
+-724821119 574214582 -649537750 509113624
+-649537750 509113624 -583260982 451801085
+-583260982 451801085 -552507171 425206864
+-552507171 425206864 -523785076 400369561
+-523785076 400369561 -474068184 357377101
+-474068184 357377101 -465562663 350021990
+-465562663 350021990 -448366131 335151365
+-448366131 335151365 -429757820 319059912
+-429757820 319059912 -424051517 314125411
+-424051517 314125411 -410793179 302660323
+-410793179 302660323 -362989710 261322487
+-362989710 261322487 -362904799 261249060
+-362904799 261249060 -352249691 252035103
+-352249691 252035103 -315815175 220528518
+-315815175 220528518 -307075853 212971228
+-307075853 212971228 -304726540 210939670
+-304726540 210939670 -300469954 207258807
+-300469954 207258807 -260720743 172885854
+-260720743 172885854 -215822880 134060627
+-215822880 134060627 -214925263 133284417
+-214925263 133284417 -136607123 65559155
+-136607123 65559155 -133243737 62650682
+-133243737 62650682 -130367868 60163787
+-130367868 60163787 -113372947 45467505
+-113372947 45467505 -90969807 26094489
+-90969807 26094489 -26553552 -29609179
+-26553552 -29609179 25664909 -74764860
+25664909 -74764860 42720297 -89513431
+42720297 -89513431 83110285 -124440492
+83110285 -124440492 125906608 -161448422
+125906608 -161448422 127014738 -162406672
+127014738 -162406672 152952757 -184836458
+152952757 -184836458 179995950 -208221939
+179995950 -208221939 235612189 -256315833
+235612189 -256315833 239124172 -259352805
+239124172 -259352805 286871237 -300641867
+286871237 -300641867 287368922 -301072237
+287368922 -301072237 294497472 -307236619
+294497472 -307236619 304588496 -315962787
+304588496 -315962787 397377669 -396201810
+397377669 -396201810 412928598 -409649406
+412928598 -409649406 432873135 -426896356
+432873135 -426896356 520253176 -502457856
+520253176 -502457856 570950733 -546298342
+570950733 -546298342 618495282 -587412279
+618495282 -587412279 671710895 -633430242
+671710895 -633430242 691455068 -650503928
+691455068 -650503928 721990326 -676909156
+721990326 -676909156 747091431 -698615224
+747091431 -698615224 780678736 -727659696
+780678736 -727659696 849762385 -787399474
+849762385 -787399474 862593314 -798494963
+862593314 -798494963 1004524071 -921228951
+1004524071 -921228951 1008829712 -924952234
+1008829712 -924952234 1096174672 -1000483399
+1096174672 -1000483399 1116308398 -1017893949
+1116308398 -1017893949 1178328851 -1071525858
+1178328851 -1071525858 1408401397 -1270480065
+1408401397 -1270480065 1527949710 -1373858935
+1527949710 -1373858935 1568043436 -1408529805
+-1724038116 -403348909 -1924900296 -386278274
+-1675411221 -407481554 -1724038116 -403348909
+-1393778460 -431416622 -1675411221 -407481554
+-1254160499 -443282306 -1393778460 -431416622
+-1241794486 -444333254 -1254160499 -443282306
+-1239145512 -444558382 -1241794486 -444333254
+-1230882720 -445260610 -1239145512 -444558382
+-1228257277 -445483738 -1230882720 -445260610
+-1197977274 -448057139 -1228257277 -445483738
+-1178257558 -449733054 -1197977274 -448057139
+-1154570784 -451746117 -1178257558 -449733054
+-1142702469 -452754768 -1154570784 -451746117
+-1040391433 -461449855 -1142702469 -452754768
+-1012138053 -463851020 -1040391433 -461449855
+-985925201 -466078766 -1012138053 -463851020
+-850266465 -477607969 -985925201 -466078766
+-812443956 -480822383 -850266465 -477607969
+-726567152 -488120778 -812443956 -480822383
+-692875602 -490984115 -726567152 -488120778
+-666216194 -493249813 -692875602 -490984115
+-660354473 -493747982 -666216194 -493249813
+-651989572 -494458888 -660354473 -493747982
+-650078874 -494621272 -651989572 -494458888
+-599797250 -498894547 -650078874 -494621272
+-508828924 -506625654 -599797250 -498894547
+-503306879 -507094955 -508828924 -506625654
+-471978864 -509757423 -503306879 -507094955
+-308525322 -523648817 -471978864 -509757423
+-289551515 -525261340 -308525322 -523648817
+-225474746 -530707020 -289551515 -525261340
+-217293250 -531402339 -225474746 -530707020
+-181747122 -534423291 -217293250 -531402339
+-106935843 -540781262 -181747122 -534423291
+-50846490 -545548117 -106935843 -540781262
+-37169402 -546710489 -50846490 -545548117
+2254970 -550061040 -37169402 -546710489
+27737924 -552226755 2254970 -550061040
+58179877 -554813920 27737924 -552226755
+65279025 -555417253 58179877 -554813920
+67483700 -555604622 65279025 -555417253
+150271393 -562640483 67483700 -555604622
+153648336 -562927479 150271393 -562640483
+238137275 -570107924 153648336 -562927479
+247952228 -570942065 238137275 -570107924
+264867329 -572379625 247952228 -570942065
+288126576 -574356354 264867329 -572379625
+340392467 -578798265 288126576 -574356354
+367744028 -581122787 340392467 -578798265
+461887008 -589123698 367744028 -581122787
+465665783 -589444844 461887008 -589123698
+497696564 -592167038 465665783 -589444844
+602385680 -601064231 497696564 -592167038
+615992856 -602220661 602385680 -601064231
+-1565446557 -1240582764 -1723198488 -1376102557
+-1535909933 -1215208767 -1565446557 -1240582764
+-1488435642 -1174425076 -1535909933 -1215208767
+-1433912527 -1127585958 -1488435642 -1174425076
+-1241421889 -962223220 -1433912527 -1127585958
+-1201699946 -928099330 -1241421889 -962223220
+-1168570871 -899639170 -1201699946 -928099330
+-1100294320 -840984902 -1168570871 -899639170
+-1099780865 -840543809 -1100294320 -840984902
+-1028045793 -778918433 -1099780865 -840543809
+-978002860 -735928101 -1028045793 -778918433
+-865086102 -638924815 -978002860 -735928101
+-781652377 -567249489 -865086102 -638924815
+-780015135 -565842986 -781652377 -567249489
+-767719298 -555280013 -780015135 -565842986
+-692875602 -490984115 -767719298 -555280013
+-668132701 -469728256 -692875602 -490984115
+-666795962 -468579905 -668132701 -469728256
+-657947173 -460978185 -666795962 -468579905
+-646669644 -451290009 -657947173 -460978185
+-643591127 -448645351 -646669644 -451290009
+-610735524 -420420121 -643591127 -448645351
+-554785065 -372354816 -610735524 -420420121
+-449183129 -281635468 -554785065 -372354816
+-433154902 -267866115 -449183129 -281635468
+-425241228 -261067723 -433154902 -267866115
+-423283679 -259386054 -425241228 -261067723
+-416700652 -253730780 -423283679 -259386054
+-410246871 -248186536 -416700652 -253730780
+-313674582 -165224277 -410246871 -248186536
+-240326954 -102213605 -313674582 -165224277
+-230720194 -93960735 -240326954 -102213605
+-223684819 -87916863 -230720194 -93960735
+-209379444 -75627559 -223684819 -87916863
+-181567248 -51734963 -209379444 -75627559
+-168879851 -40835614 -181567248 -51734963
+-167239711 -39426621 -168879851 -40835614
+-108305406 11202014 -167239711 -39426621
+-107427917 11955837 -108305406 11202014
+-90969807 26094489 -107427917 11955837
+-43416901 66945716 -90969807 26094489
+6748173 110040975 -43416901 66945716
+49434664 146711616 6748173 110040975
+71779370 165907261 49434664 146711616
+87664008 179553260 71779370 165907261
+116626683 204434196 87664008 179553260
+143924433 227884847 116626683 204434196
+192364295 269498030 143924433 227884847
+283018210 347375997 192364295 269498030
+298948261 361061011 283018210 347375997
+306405252 367467080 298948261 361061011
+314862237 374732214 306405252 367467080
+374579375 426033355 314862237 374732214
+386371851 436163905 374579375 426033355
+396293151 444686987 386371851 436163905
+427638269 471614606 396293151 444686987
+476725776 513784161 427638269 471614606
+535483429 564261039 476725776 513784161
+714203126 717793588 535483429 564261039
+756330882 753984237 714203126 717793588
+853899428 837802350 756330882 753984237
+865004224 847342135 853899428 837802350
+985395807 950766811 865004224 847342135
+1022625150 982749385 985395807 950766811
+1064122100 1018398128 1022625150 982749385
+1071482607 1024721312 1064122100 1018398128
+1255165533 1182517617 1071482607 1024721312
+1311802937 1231173055 1255165533 1182517617
+1374740603 1285240852 1311802937 1231173055
+1402632488 1309201905 1374740603 1285240852
+1456691038 1355641929 1402632488 1309201905
+1531407131 1419828208 1456691038 1355641929
+1617477729 1493768790 1531407131 1419828208
+1854792130 1697638233 1617477729 1493768790
+-2033930685 846042412 -2011736664 838202987
+-2011736664 838202987 -1917081590 804768700
+-1917081590 804768700 -1874240824 789636384
+-1874240824 789636384 -1748677306 745284543
+-1748677306 745284543 -1672581434 718405781
+-1672581434 718405781 -1645928315 708991303
+-1645928315 708991303 -1610363059 696428860
+-1610363059 696428860 -1518201943 663875495
+-1518201943 663875495 -1450641934 640011790
+-1450641934 640011790 -1361238492 608432496
+-1361238492 608432496 -1308033651 589639357
+-1308033651 589639357 -1043783327 496300237
+-1043783327 496300237 -977792174 472990687
+-977792174 472990687 -972844264 471242975
+-972844264 471242975 -962316837 467524452
+-962316837 467524452 -946386552 461897520
+-946386552 461897520 -877544754 437581058
+-877544754 437581058 -814259613 415227332
+-814259613 415227332 -813833589 415076851
+-813833589 415076851 -725767450 383969922
+-725767450 383969922 -722705888 382888510
+-722705888 382888510 -716882353 380831508
+-716882353 380831508 -619791089 346536704
+-619791089 346536704 -549904030 321851032
+-549904030 321851032 -535578985 316791107
+-535578985 316791107 -484364266 298700923
+-484364266 298700923 -469094717 293307377
+-469094717 293307377 -469063044 293296190
+-469063044 293296190 -439983588 283024676
+-439983588 283024676 -402181594 269672167
+-402181594 269672167 -371170255 258718269
+-371170255 258718269 -367653236 257475979
+-367653236 257475979 -352249691 252035103
+-352249691 252035103 -327838731 243412607
+-1794207361 -1430862073 -1652471466 -1426103606
+-1652471466 -1426103606 -1641340853 -1425729920
+-1641340853 -1425729920 -1488317399 -1420592498
+-1488317399 -1420592498 -1470219002 -1419984884
+-1470219002 -1419984884 -1329204762 -1415250644
+-1329204762 -1415250644 -1087913612 -1407149830
+-1087913612 -1407149830 -1032719763 -1405296819
+-1032719763 -1405296819 -986686065 -1403751340
+-986686065 -1403751340 -900566351 -1400860062
+-900566351 -1400860062 -896141766 -1400711517
+-896141766 -1400711517 -891067100 -1400541146
+-891067100 -1400541146 -788975612 -1397113651
+-788975612 -1397113651 -656819571 -1392676806
+-656819571 -1392676806 -645087999 -1392282944
+-645087999 -1392282944 -535257212 -1388595620
+-535257212 -1388595620 -484248919 -1386883129
+-484248919 -1386883129 -476061958 -1386608270
+-476061958 -1386608270 -475961432 -1386604896
+-475961432 -1386604896 -391484389 -1383768766
+-391484389 -1383768766 -372350046 -1383126373
+-372350046 -1383126373 -96048261 -1373850155
+-96048261 -1373850155 -56282458 -1372515106
+-56282458 -1372515106 -39618894 -1371955664
+-39618894 -1371955664 131798203 -1366200716
+131798203 -1366200716 206444969 -1363694617
+206444969 -1363694617 450515899 -1355500478
+450515899 -1355500478 504245403 -1353696629
+504245403 -1353696629 506688972 -1353614592
+506688972 -1353614592 533743908 -1352706282
+533743908 -1352706282 581347821 -1351108087
+581347821 -1351108087 909853073 -1340079253
+909853073 -1340079253 976938766 -1337827000
+976938766 -1337827000 1018059171 -1336446473
+1018059171 -1336446473 1065594883 -1334850567
+-1355170591 1646779958 -1475225618 1653394759
+-1353484384 1646687052 -1355170591 1646779958
+-1094851068 1632436855 -1353484384 1646687052
+-1056143067 1630304119 -1094851068 1632436855
+-1029814640 1628853474 -1056143067 1630304119
+-413622038 1594902451 -1029814640 1628853474
+-387995013 1593490452 -413622038 1594902451
+-355672903 1591709566 -387995013 1593490452
+-309270957 1589152908 -355672903 1591709566
+-209007271 1583628573 -309270957 1589152908
+-19253174 1573173489 -209007271 1583628573
+158966208 1563353945 -19253174 1573173489
+263034410 1557619988 158966208 1563353945
+350847642 1552781649 263034410 1557619988
+616318186 -1798157178 583621999 -1849181442
+669561781 -1715067513 616318186 -1798157178
+689044608 -1684663451 669561781 -1715067513
+742711827 -1600912695 689044608 -1684663451
+748709151 -1591553529 742711827 -1600912695
+909853073 -1340079253 748709151 -1591553529
+925717954 -1315321202 909853073 -1340079253
+962814639 -1257429710 925717954 -1315321202
+1010119613 -1183607602 962814639 -1257429710
+1038899873 -1138694366 1010119613 -1183607602
+1044373225 -1130152888 1038899873 -1138694366
+1070104015 -1089998523 1044373225 -1130152888
+1109797068 -1028055251 1070104015 -1089998523
+1116308398 -1017893949 1109797068 -1028055251
+1131838873 -993657757 1116308398 -1017893949
+1174858948 -926522478 1131838873 -993657757
+1225842150 -846960285 1174858948 -926522478
+1238653503 -826967438 1225842150 -846960285
+1247639057 -812944969 1238653503 -826967438
+1271902178 -775080985 1247639057 -812944969
+1362654005 -633457587 1271902178 -775080985
+1447131872 -501625059 1362654005 -633457587
+1496853683 -424031338 1447131872 -501625059
+1529583181 -372955090 1496853683 -424031338
+1630031381 -216199948 1529583181 -372955090
+1648022623 -188123590 1630031381 -216199948
+1743470377 -39171929 1648022623 -188123590
+1821218689 82158744 1743470377 -39171929
+-1559272060 279018876 -1484115981 261729503
+-1484115981 261729503 -1469496873 258366432
+-1469496873 258366432 -1425251216 248187885
+-1425251216 248187885 -1310336461 221752179
+-1310336461 221752179 -1059553725 164060555
+-1059553725 164060555 -995687034 149368263
+-995687034 149368263 -943649161 137397147
+-943649161 137397147 -884283085 123740205
+-884283085 123740205 -866532228 119656687
+-866532228 119656687 -858384271 117782280
+-858384271 117782280 -855643307 117151732
+-855643307 117151732 -852033065 116321209
+-852033065 116321209 -843011250 114245775
+-843011250 114245775 -756773168 94407029
+-756773168 94407029 -729656631 88168972
+-729656631 88168972 -728213509 87836987
+-728213509 87836987 -695196998 80241663
+-695196998 80241663 -680034829 76753663
+-680034829 76753663 -679609557 76655831
+-679609557 76655831 -668762601 74160529
+-668762601 74160529 -617380350 62340236
+-617380350 62340236 -607103254 59976029
+-607103254 59976029 -586752267 55294361
+-586752267 55294361 -572928036 52114149
+-572928036 52114149 -417451821 16347431
+-417451821 16347431 -377246599 7098371
+-377246599 7098371 -345991049 -91850
+-345991049 -91850 -306542258 -9166896
+-306542258 -9166896 -281819939 -14854172
+-281819939 -14854172 -237637829 -25018100
+-237637829 -25018100 -234013683 -25851821
+-234013683 -25851821 -196355142 -34515027
+-196355142 -34515027 -168879851 -40835614
+-168879851 -40835614 -167728132 -41100563
+-167728132 -41100563 -95049558 -57819995
+-95049558 -57819995 -75139838 -62400151
+-75139838 -62400151 -18553073 -75417723
+-18553073 -75417723 14667139 -83059908
+14667139 -83059908 42720297 -89513431
+42720297 -89513431 121637981 -107668147
+121637981 -107668147 146272269 -113335172
+146272269 -113335172 166112542 -117899352
+166112542 -117899352 168114551 -118359907
+168114551 -118359907 246241613 -136332743
+246241613 -136332743 291656469 -146780259
+291656469 -146780259 309311321 -150841692
+309311321 -150841692 433645260 -179444246
+433645260 -179444246 449097079 -182998879
+449097079 -182998879 462922079 -186179268
+462922079 -186179268 464438395 -186528091
+464438395 -186528091 587396604 -214814163
+587396604 -214814163 589715491 -215347615
+589715491 -215347615 646174149 -228335716
+646174149 -228335716 661285806 -231812096
+661285806 -231812096 679490759 -236000077
+679490759 -236000077 686458869 -237603064
+686458869 -237603064 689361812 -238270875
+689361812 -238270875 708646185 -242707173
+708646185 -242707173 721363977 -245632853
+721363977 -245632853 723465290 -246116252
+723465290 -246116252 745232404 -251123695
+745232404 -251123695 762431526 -255080288
+762431526 -255080288 841865950 -273353878
+841865950 -273353878 918890880 -291073173
+918890880 -291073173 957658150 -299991437
+957658150 -299991437 1001874673 -310163282
+1001874673 -310163282 1018358603 -313955348
+1018358603 -313955348 1124420849 -338354568
+1124420849 -338354568 1496853683 -424031338
+1496853683 -424031338 1638842537 -456695339
+1638842537 -456695339 1715841182 -474408587
+1715841182 -474408587 1763935115 -485472415
+1763935115 -485472415 1861986607 -508028792
+1861986607 -508028792 2028932301 -546434019
diff --git a/src/boost/libs/polygon/benchmark/voronoi_benchmark.cpp b/src/boost/libs/polygon/benchmark/voronoi_benchmark.cpp
new file mode 100644
index 000000000..8b8328c63
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/voronoi_benchmark.cpp
@@ -0,0 +1,156 @@
+// Boost.Polygon library voronoi_benchmark.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <algorithm>
+#include <iomanip>
+#include <iostream>
+#include <fstream>
+#include <list>
+#include <numeric>
+#include <vector>
+
+#define BOOST_TEST_MODULE benchmark_test
+#include <boost/mpl/list.hpp>
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/test/test_case_template.hpp>
+#include <boost/timer.hpp>
+
+#include <boost/polygon/polygon.hpp>
+#include <boost/polygon/voronoi.hpp>
+using boost::polygon::point_data;
+using boost::polygon::segment_data;
+using boost::polygon::voronoi_diagram;
+
+typedef boost::mpl::list<int> test_types;
+const char *BENCHMARK_FILE = "voronoi_benchmark.txt";
+const char *POINT_INPUT_FILE = "input_data/voronoi_point.txt";
+const char *SEGMENT_INPUT_FILE = "input_data/voronoi_segment.txt";
+const int POINT_RUNS = 10;
+const int SEGMENT_RUNS = 10;
+
+boost::mt19937 gen(static_cast<unsigned int>(time(NULL)));
+boost::timer timer;
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(benchmark_test_random, T, test_types) {
+ typedef T coordinate_type;
+ typedef point_data<coordinate_type> point_type;
+ voronoi_diagram<double> test_output;
+
+ std::ofstream bench_file(BENCHMARK_FILE, std::ios_base::out | std::ios_base::app);
+ bench_file << "Voronoi Benchmark Test (time in seconds):" << std::endl;
+ bench_file << "| Number of points | Number of tests | Time per one test |" << std::endl;
+ bench_file << std::setiosflags(std::ios::right | std::ios::fixed) << std::setprecision(6);
+ int max_points = 100000;
+ std::vector<point_type> points;
+ coordinate_type x, y;
+ for (int num_points = 10; num_points <= max_points; num_points *= 10) {
+ points.resize(num_points);
+ timer.restart();
+ int num_tests = max_points / num_points;
+ for (int cur = 0; cur < num_tests; cur++) {
+ test_output.clear();
+ for (int cur_point = 0; cur_point < num_points; cur_point++) {
+ x = static_cast<coordinate_type>(gen());
+ y = static_cast<coordinate_type>(gen());
+ points[cur_point] = point_type(x, y);
+ }
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ }
+ double elapsed_time = timer.elapsed();
+ double time_per_test = elapsed_time / num_tests;
+
+ bench_file << "| " << std::setw(16) << num_points << " ";
+ bench_file << "| " << std::setw(15) << num_tests << " ";
+ bench_file << "| " << std::setw(17) << time_per_test << " ";
+ bench_file << "| " << std::endl;
+ }
+ bench_file.close();
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(benchmark_test_points, T, test_types) {
+ typedef T coordinate_type;
+ typedef point_data<coordinate_type> point_type;
+
+ std::vector<point_type> points;
+ {
+ std::ifstream input_file(POINT_INPUT_FILE);
+ int num_points;
+ coordinate_type x, y;
+ input_file >> num_points;
+ points.reserve(num_points);
+ for (int i = 0; i < num_points; ++i) {
+ input_file >> x >> y;
+ points.push_back(point_type(x, y));
+ }
+ input_file.close();
+ }
+
+ std::vector<double> periods;
+ {
+ for (int i = 0; i < POINT_RUNS; ++i) {
+ voronoi_diagram<double> test_output;
+ timer.restart();
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ periods.push_back(timer.elapsed());
+ }
+ }
+ std::sort(periods.begin(), periods.end());
+ // Using olympic system to evaluate average time.
+ double elapsed_time =
+ std::accumulate(periods.begin() + 2, periods.end() - 2, 0.0);
+ elapsed_time /= (periods.size() - 4);
+
+ std::ofstream bench_file(
+ BENCHMARK_FILE, std::ios_base::out | std::ios_base::app);
+ bench_file << std::setiosflags(std::ios::right | std::ios::fixed) << std::setprecision(6);
+ bench_file << "Static test of " << points.size() << " points: " << elapsed_time << std::endl;
+ bench_file.close();
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(benchmark_test_segments, T, test_types) {
+ typedef T coordinate_type;
+ typedef point_data<coordinate_type> point_type;
+ typedef segment_data<coordinate_type> segment_type;
+
+ std::vector<segment_type> segments;
+ {
+ std::ifstream input_file(SEGMENT_INPUT_FILE);
+ int num_segments;
+ coordinate_type x0, y0, x1, y1;
+ input_file >> num_segments;
+ segments.reserve(num_segments);
+ for (int i = 0; i < num_segments; ++i) {
+ input_file >> x0 >> y0 >> x1 >> y1;
+ point_type p0(x0, y0), p1(x1, y1);
+ segments.push_back(segment_type(p0, p1));
+ }
+ input_file.close();
+ }
+
+ std::vector<double> periods;
+ {
+ for (int i = 0; i < SEGMENT_RUNS; ++i) {
+ voronoi_diagram<double> test_output;
+ timer.restart();
+ construct_voronoi(segments.begin(), segments.end(), &test_output);
+ periods.push_back(timer.elapsed());
+ }
+ }
+ std::sort(periods.begin(), periods.end());
+ // Using olympic system to evaluate average time.
+ double elapsed_time =
+ std::accumulate(periods.begin() + 2, periods.end() - 2, 0.0);
+ elapsed_time /= (periods.size() - 4);
+
+ std::ofstream bench_file(
+ BENCHMARK_FILE, std::ios_base::out | std::ios_base::app);
+ bench_file << std::setiosflags(std::ios::right | std::ios::fixed) << std::setprecision(6);
+ bench_file << "Static test of " << segments.size() << " segments: " << elapsed_time << std::endl;
+ bench_file.close();
+}
diff --git a/src/boost/libs/polygon/benchmark/voronoi_benchmark_points.cpp b/src/boost/libs/polygon/benchmark/voronoi_benchmark_points.cpp
new file mode 100644
index 000000000..75564a975
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/voronoi_benchmark_points.cpp
@@ -0,0 +1,151 @@
+// Boost.Polygon library voronoi_benchmark.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <algorithm>
+#include <iomanip>
+#include <iostream>
+#include <fstream>
+#include <numeric>
+#include <vector>
+#include <utility>
+
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/timer/timer.hpp>
+
+typedef boost::int32_t int32;
+using boost::timer::cpu_times;
+using boost::timer::nanosecond_type;
+
+// Include for the Boost.Polygon Voronoi library.
+#include <boost/polygon/voronoi.hpp>
+typedef boost::polygon::default_voronoi_builder VB_BOOST;
+typedef boost::polygon::voronoi_diagram<double> VD_BOOST;
+
+// Includes for the CGAL library.
+#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
+#include <CGAL/Delaunay_triangulation_2.h>
+typedef CGAL::Exact_predicates_inexact_constructions_kernel CGAL_KERNEL;
+typedef CGAL::Delaunay_triangulation_2<CGAL_KERNEL> DT_CGAL;
+typedef CGAL_KERNEL::Point_2 POINT_CGAL;
+
+// Includes for the S-Hull library.
+#include <s_hull.h>
+
+const int RANDOM_SEED = 27;
+const int NUM_TESTS = 6;
+const int NUM_POINTS[] = {10, 100, 1000, 10000, 100000, 1000000};
+const int NUM_RUNS[] = {100000, 10000, 1000, 100, 10, 1};
+std::ofstream bf("benchmark_points.txt",
+ std::ios_base::out | std::ios_base::app);
+boost::timer::cpu_timer timer;
+
+void format_line(int num_points, int num_tests, double time_per_test) {
+ bf << "| " << std::setw(16) << num_points << " ";
+ bf << "| " << std::setw(15) << num_tests << " ";
+ bf << "| " << std::setw(17) << time_per_test << " ";
+ bf << "|" << std::endl;
+}
+
+double get_elapsed_secs() {
+ cpu_times elapsed_times(timer.elapsed());
+ return 1E-9 * static_cast<double>(
+ elapsed_times.system + elapsed_times.user);
+}
+
+void run_boost_voronoi_test() {
+ boost::mt19937 gen(RANDOM_SEED);
+ bf << "Boost.Polygon Voronoi Diagram of Points:\n";
+ for (int i = 0; i < NUM_TESTS; ++i) {
+ timer.start();
+ for (int j = 0; j < NUM_RUNS[i]; ++j) {
+ VB_BOOST vb;
+ VD_BOOST vd;
+ for (int k = 0; k < NUM_POINTS[i]; ++k) {
+ int32 x = static_cast<int32>(gen());
+ int32 y = static_cast<int32>(gen());
+ vb.insert_point(x, y);
+ }
+ vb.construct(&vd);
+ }
+ double time_per_test = get_elapsed_secs() / NUM_RUNS[i];
+ format_line(NUM_POINTS[i], NUM_RUNS[i], time_per_test);
+ }
+ bf << "\n";
+}
+
+void run_cgal_delaunay_test() {
+ boost::mt19937 gen(RANDOM_SEED);
+ bf << "CGAL Delaunay Triangulation of Points:\n";
+ for (int i = 0; i < NUM_TESTS; ++i) {
+ timer.start();
+ for (int j = 0; j < NUM_RUNS[i]; ++j) {
+ DT_CGAL dt;
+ std::vector<POINT_CGAL> points;
+ for (int k = 0; k < NUM_POINTS[i]; ++k) {
+ int32 x = static_cast<int32>(gen());
+ int32 y = static_cast<int32>(gen());
+ points.push_back(POINT_CGAL(x, y));
+ }
+ // CGAL's implementation sorts points along
+ // the Hilbert curve implicitly to improve
+ // spatial ordering of the input geometries.
+ dt.insert(points.begin(), points.end());
+ }
+ double time_per_test = get_elapsed_secs() / NUM_RUNS[i];
+ format_line(NUM_POINTS[i], NUM_RUNS[i], time_per_test);
+ }
+ bf << "\n";
+}
+
+void run_shull_delaunay_test() {
+ boost::mt19937 gen(RANDOM_SEED);
+ bf << "S-Hull Delaunay Triangulation of Points:\n";
+ // This value is required by S-Hull as it doesn't seem to support properly
+ // coordinates with the absolute value higher than 100.
+ float koef = 100.0 / (1 << 16) / (1 << 15);
+ for (int i = 0; i < NUM_TESTS; ++i) {
+ timer.start();
+ for (int j = 0; j < NUM_RUNS[i]; ++j) {
+ // S-Hull doesn't deal properly with duplicates so we need
+ // to eliminate them before running the algorithm.
+ std::vector< pair<int32, int32> > upts;
+ std::vector<Shx> pts;
+ std::vector<Triad> triads;
+ Shx pt;
+ for (int k = 0; k < NUM_POINTS[i]; ++k) {
+ int32 x = static_cast<int32>(gen());
+ int32 y = static_cast<int32>(gen());
+ upts.push_back(std::make_pair(x, y));
+ }
+ // Absolutely the same code is used by the Boost.Polygon Voronoi library.
+ std::sort(upts.begin(), upts.end());
+ upts.erase(std::unique(upts.begin(), upts.end()), upts.end());
+ for (int k = 0; k < upts.size(); ++k) {
+ pt.r = koef * upts[k].first;
+ pt.c = koef * upts[k].second;
+ pt.id = k;
+ pts.push_back(pt);
+ }
+ s_hull_del_ray2(pts, triads);
+ }
+ double time_per_test = get_elapsed_secs() / NUM_RUNS[i];
+ format_line(NUM_POINTS[i], NUM_RUNS[i], time_per_test);
+ }
+ bf << "\n";
+}
+
+int main() {
+ bf << std::setiosflags(std::ios::right | std::ios::fixed)
+ << std::setprecision(6);
+ run_boost_voronoi_test();
+ run_cgal_delaunay_test();
+ run_shull_delaunay_test();
+ bf.close();
+ return 0;
+}
diff --git a/src/boost/libs/polygon/benchmark/voronoi_benchmark_segments.cpp b/src/boost/libs/polygon/benchmark/voronoi_benchmark_segments.cpp
new file mode 100644
index 000000000..70780206f
--- /dev/null
+++ b/src/boost/libs/polygon/benchmark/voronoi_benchmark_segments.cpp
@@ -0,0 +1,205 @@
+// Boost.Polygon library voronoi_benchmark.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <algorithm>
+#include <iomanip>
+#include <iostream>
+#include <fstream>
+#include <numeric>
+#include <vector>
+#include <utility>
+
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/timer/timer.hpp>
+
+typedef boost::int32_t int32;
+using boost::timer::cpu_times;
+using boost::timer::nanosecond_type;
+
+// Include for the Boost.Polygon Voronoi library.
+#include <boost/polygon/voronoi.hpp>
+typedef boost::polygon::voronoi_diagram<double> VD_BOOST;
+
+// Includes for the CGAL library.
+#include <CGAL/Simple_cartesian.h>
+#include <CGAL/Segment_Delaunay_graph_filtered_traits_2.h>
+#include <CGAL/Segment_Delaunay_graph_2.h>
+
+typedef CGAL::Simple_cartesian<double> K;
+typedef CGAL::Segment_Delaunay_graph_filtered_traits_without_intersections_2<K> GT;
+typedef CGAL::Segment_Delaunay_graph_2<GT> SDT_CGAL;
+typedef SDT_CGAL::Point_2 Point_CGAL;
+typedef SDT_CGAL::Site_2 Site_CGAL;
+
+// Include for the Boost.Polygon library.
+#include <boost/polygon/polygon.hpp>
+typedef boost::polygon::point_data<int32> POINT_POLYGON;
+typedef boost::polygon::segment_data<int32> SEGMENT_POLYGON;
+typedef std::vector<SEGMENT_POLYGON> SSD_POLYGON;
+
+const int RANDOM_SEED = 27;
+const int NUM_TESTS = 6;
+const int NUM_SEGMENTS[] = {10, 100, 1000, 10000, 100000, 1000000};
+const int NUM_RUNS[] = {100000, 10000, 1000, 100, 10, 1};
+std::ofstream bf("benchmark_segments.txt",
+ std::ios_base::out | std::ios_base::app);
+boost::timer::cpu_timer timer;
+
+void format_line(int num_points, int num_tests, double time_per_test) {
+ bf << "| " << std::setw(16) << num_points << " ";
+ bf << "| " << std::setw(15) << num_tests << " ";
+ bf << "| " << std::setw(17) << time_per_test << " ";
+ bf << "|" << std::endl;
+}
+
+double get_elapsed_secs() {
+ cpu_times elapsed_times(timer.elapsed());
+ return 1E-9 * static_cast<double>(
+ elapsed_times.system + elapsed_times.user);
+}
+
+void clean_segment_set(std::vector<SEGMENT_POLYGON>* data) {
+ typedef int32 Unit;
+ typedef boost::polygon::scanline_base<Unit>::Point Point;
+ typedef boost::polygon::scanline_base<Unit>::half_edge half_edge;
+ typedef int segment_id;
+ std::vector<std::pair<half_edge, segment_id> > half_edges;
+ std::vector<std::pair<half_edge, segment_id> > half_edges_out;
+ segment_id id = 0;
+ half_edges.reserve(data->size());
+ for (std::vector<SEGMENT_POLYGON>::iterator it = data->begin();
+ it != data->end(); ++it) {
+ POINT_POLYGON l = it->low();
+ POINT_POLYGON h = it->high();
+ half_edges.push_back(std::make_pair(half_edge(l, h), id++));
+ }
+ half_edges_out.reserve(half_edges.size());
+ // Apparently no need to pre-sort data when calling validate_scan.
+ boost::polygon::line_intersection<Unit>::validate_scan(
+ half_edges_out, half_edges.begin(), half_edges.end());
+ std::vector<SEGMENT_POLYGON> result;
+ result.reserve(half_edges_out.size());
+ for (std::size_t i = 0; i < half_edges_out.size(); ++i) {
+ id = half_edges_out[i].second;
+ POINT_POLYGON l = half_edges_out[i].first.first;
+ POINT_POLYGON h = half_edges_out[i].first.second;
+ SEGMENT_POLYGON orig_seg = data->at(id);
+ if (orig_seg.high() < orig_seg.low())
+ std::swap(l, h);
+ result.push_back(SEGMENT_POLYGON(l, h));
+ }
+ std::swap(result, *data);
+}
+
+std::vector<double> get_intersection_runtime() {
+ std::vector<double> running_times;
+ boost::mt19937 gen(RANDOM_SEED);
+ for (int i = 0; i < NUM_TESTS; ++i) {
+ timer.start();
+ for (int j = 0; j < NUM_RUNS[i]; ++j) {
+ SSD_POLYGON ssd;
+ for (int k = 0; k < NUM_SEGMENTS[i]; ++k) {
+ int32 x1 = gen();
+ int32 y1 = gen();
+ int32 dx = (gen() & 1023) + 1;
+ int32 dy = (gen() & 1023) + 1;
+ ssd.push_back(SEGMENT_POLYGON(
+ POINT_POLYGON(x1, y1), POINT_POLYGON(x1 + dx, y1 + dy)));
+ }
+ clean_segment_set(&ssd);
+ }
+ running_times.push_back(get_elapsed_secs());
+ }
+ return running_times;
+}
+
+void run_boost_voronoi_test(const std::vector<double> &running_times) {
+ boost::mt19937 gen(RANDOM_SEED);
+ bf << "Boost.Polygon Voronoi of Segments:\n";
+ for (int i = 0; i < NUM_TESTS; ++i) {
+ timer.start();
+ for (int j = 0; j < NUM_RUNS[i]; ++j) {
+ SSD_POLYGON ssd;
+ VD_BOOST vd;
+ for (int k = 0; k < NUM_SEGMENTS[i]; ++k) {
+ int32 x1 = gen();
+ int32 y1 = gen();
+ int32 dx = (gen() & 1023) + 1;
+ int32 dy = (gen() & 1023) + 1;
+ ssd.push_back(SEGMENT_POLYGON(
+ POINT_POLYGON(x1, y1),
+ POINT_POLYGON(x1 + dx, y1 + dy)));
+ }
+ clean_segment_set(&ssd);
+ boost::polygon::construct_voronoi(ssd.begin(), ssd.end(), &vd);
+ }
+ double time_per_test =
+ (get_elapsed_secs() - running_times[i]) / NUM_RUNS[i];
+ format_line(NUM_SEGMENTS[i], NUM_RUNS[i], time_per_test);
+ }
+ bf << "\n";
+}
+
+void run_cgal_delaunay_test(const std::vector<double> &running_times) {
+ boost::mt19937 gen(RANDOM_SEED);
+ bf << "CGAL Triangulation of Segments:\n";
+ for (int i = 0; i < NUM_TESTS; ++i) {
+ timer.start();
+ for (int j = 0; j < NUM_RUNS[i]; ++j) {
+ SSD_POLYGON ssd;
+ for (int k = 0; k < NUM_SEGMENTS[i]; ++k) {
+ int32 x1 = gen();
+ int32 y1 = gen();
+ int32 dx = (gen() & 1023) + 1;
+ int32 dy = (gen() & 1023) + 1;
+ ssd.push_back(SEGMENT_POLYGON(
+ POINT_POLYGON(x1, y1),
+ POINT_POLYGON(x1 + dx, y1 + dy)));
+ }
+ clean_segment_set(&ssd);
+
+ typedef std::vector<Point_CGAL> Points_container;
+ typedef std::vector<Points_container>::size_type Index_type;
+ typedef std::vector< std::pair<Index_type, Index_type> > Constraints_container;
+ Points_container points;
+ Constraints_container constraints;
+ points.reserve(ssd.size() * 2);
+ constraints.reserve(ssd.size());
+ for (SSD_POLYGON::iterator it = ssd.begin(); it != ssd.end(); ++it) {
+ points.push_back(Point_CGAL(
+ boost::polygon::x(it->low()),
+ boost::polygon::y(it->low())));
+ points.push_back(Point_CGAL(
+ boost::polygon::x(it->high()),
+ boost::polygon::y(it->high())));
+ constraints.push_back(
+ std::make_pair(points.size() - 2, points.size() - 1));
+ }
+
+ SDT_CGAL sdg;
+ sdg.insert_segments(
+ points.begin(), points.end(),
+ constraints.begin(), constraints.end());
+ }
+ double time_per_test =
+ (get_elapsed_secs() - running_times[i]) / NUM_RUNS[i];
+ format_line(NUM_SEGMENTS[i], NUM_RUNS[i], time_per_test);
+ }
+ bf << "\n";
+}
+
+int main() {
+ bf << std::setiosflags(std::ios::right | std::ios::fixed)
+ << std::setprecision(6);
+ std::vector<double> running_times = get_intersection_runtime();
+ run_boost_voronoi_test(running_times);
+ run_cgal_delaunay_test(running_times);
+ bf.close();
+ return 0;
+}
diff --git a/src/boost/libs/polygon/example/Jamfile.v2 b/src/boost/libs/polygon/example/Jamfile.v2
new file mode 100644
index 000000000..a8dc212ce
--- /dev/null
+++ b/src/boost/libs/polygon/example/Jamfile.v2
@@ -0,0 +1,43 @@
+# Copyright Andrii Sydorchuk 2010-2012.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import cast ;
+import testing ;
+
+lib opengl : : <name>opengl32 ;
+
+project voronoi_example
+ :
+ requirements
+ <include>.
+ <toolset>msvc:<asynch-exceptions>on
+ <library>$(BOOST_ROOT)/libs/timer/build//boost_timer
+ ;
+
+exe voronoi-visualizer
+ :
+ voronoi_visualizer.cpp
+ [ cast _ moccable-cpp : voronoi_visualizer.cpp ]
+ /qt//QtOpenGL
+ :
+ <target-os>windows:<library>opengl
+ ;
+
+alias "basic-tutorial"
+ :
+ [ run voronoi_basic_tutorial.cpp ]
+ ;
+
+alias "advanced-tutorial"
+ :
+ [ run voronoi_advanced_tutorial.cpp ]
+ ;
+
+alias "documentation-examples"
+ :
+ [ run gtl_custom_point.cpp ]
+ [ run gtl_custom_polygon.cpp ]
+ [ run gtl_custom_polygon_set.cpp ]
+ ;
diff --git a/src/boost/libs/polygon/example/gtl_custom_point.cpp b/src/boost/libs/polygon/example/gtl_custom_point.cpp
new file mode 100644
index 000000000..665c82ed6
--- /dev/null
+++ b/src/boost/libs/polygon/example/gtl_custom_point.cpp
@@ -0,0 +1,120 @@
+/*
+Copyright 2008 Intel Corporation
+
+Use, modification and distribution are subject to the Boost Software License,
+Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt).
+*/
+#include <boost/polygon/polygon.hpp>
+#include <cassert>
+namespace gtl = boost::polygon;
+using namespace boost::polygon::operators;
+
+//lets make the body of main from point_usage.cpp
+//a generic function parameterized by point type
+template <typename Point>
+void test_point() {
+ //constructing a gtl point
+ int x = 10;
+ int y = 20;
+ //Point pt(x, y);
+ Point pt = gtl::construct<Point>(x, y);
+ assert(gtl::x(pt) == 10);
+ assert(gtl::y(pt) == 20);
+
+ //a quick primer in isotropic point access
+ typedef gtl::orientation_2d O;
+ using gtl::HORIZONTAL;
+ using gtl::VERTICAL;
+ O o = HORIZONTAL;
+ assert(gtl::x(pt) == gtl::get(pt, o));
+
+ o = o.get_perpendicular();
+ assert(o == VERTICAL);
+ assert(gtl::y(pt) == gtl::get(pt, o));
+
+ gtl::set(pt, o, 30);
+ assert(gtl::y(pt) == 30);
+
+ //using some of the library functions
+ //Point pt2(10, 30);
+ Point pt2 = gtl::construct<Point>(10, 30);
+ assert(gtl::equivalence(pt, pt2));
+
+ gtl::transformation<int> tr(gtl::axis_transformation::SWAP_XY);
+ gtl::transform(pt, tr);
+ assert(gtl::equivalence(pt, gtl::construct<Point>(30, 10)));
+
+ gtl::transformation<int> tr2 = tr.inverse();
+ assert(tr == tr2); //SWAP_XY is its own inverse transform
+
+ gtl::transform(pt, tr2);
+ assert(gtl::equivalence(pt, pt2)); //the two points are equal again
+
+ gtl::move(pt, o, 10); //move pt 10 units in y
+ assert(gtl::euclidean_distance(pt, pt2) == 10.0f);
+
+ gtl::move(pt, o.get_perpendicular(), 10); //move pt 10 units in x
+ assert(gtl::manhattan_distance(pt, pt2) == 20);
+}
+
+//Now lets declare our own point type
+//Bjarne says that if a class doesn't maintain an
+//invariant just use a struct.
+struct CPoint {
+ int x;
+ int y;
+};
+
+//There, nice a simple...but wait, it doesn't do anything
+//how do we use it to do all the things a point needs to do?
+
+
+//First we register it as a point with boost polygon
+namespace boost { namespace polygon {
+ template <>
+ struct geometry_concept<CPoint> { typedef point_concept type; };
+
+
+ //Then we specialize the gtl point traits for our point type
+ template <>
+ struct point_traits<CPoint> {
+ typedef int coordinate_type;
+
+ static inline coordinate_type get(const CPoint& point,
+ orientation_2d orient) {
+ if(orient == HORIZONTAL)
+ return point.x;
+ return point.y;
+ }
+ };
+
+ template <>
+ struct point_mutable_traits<CPoint> {
+ typedef int coordinate_type;
+
+
+ static inline void set(CPoint& point, orientation_2d orient, int value) {
+ if(orient == HORIZONTAL)
+ point.x = value;
+ else
+ point.y = value;
+ }
+ static inline CPoint construct(int x_value, int y_value) {
+ CPoint retval;
+ retval.x = x_value;
+ retval.y = y_value;
+ return retval;
+ }
+ };
+ } }
+
+//Now lets see if the CPoint works with the library functions
+int main() {
+ test_point<CPoint>(); //yay! All your testing is done for you.
+ return 0;
+}
+
+//Now you know how to map a user type to the library point concept
+//and how to write a generic function parameterized by point type
+//using the library interfaces to access it.
diff --git a/src/boost/libs/polygon/example/gtl_custom_polygon.cpp b/src/boost/libs/polygon/example/gtl_custom_polygon.cpp
new file mode 100644
index 000000000..f42dea1d1
--- /dev/null
+++ b/src/boost/libs/polygon/example/gtl_custom_polygon.cpp
@@ -0,0 +1,146 @@
+/*
+Copyright 2008 Intel Corporation
+
+Use, modification and distribution are subject to the Boost Software License,
+Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt).
+*/
+#include <boost/polygon/polygon.hpp>
+#include <cassert>
+#include <list>
+namespace gtl = boost::polygon;
+using namespace boost::polygon::operators;
+
+//first lets turn our polygon usage code into a generic
+//function parameterized by polygon type
+template <typename Polygon>
+void test_polygon() {
+ //lets construct a 10x10 rectangle shaped polygon
+ typedef typename gtl::polygon_traits<Polygon>::point_type Point;
+ Point pts[] = {gtl::construct<Point>(0, 0),
+ gtl::construct<Point>(10, 0),
+ gtl::construct<Point>(10, 10),
+ gtl::construct<Point>(0, 10) };
+ Polygon poly;
+ gtl::set_points(poly, pts, pts+4);
+
+ //now lets see what we can do with this polygon
+ assert(gtl::area(poly) == 100.0f);
+ assert(gtl::contains(poly, gtl::construct<Point>(5, 5)));
+ assert(!gtl::contains(poly, gtl::construct<Point>(15, 5)));
+ gtl::rectangle_data<int> rect;
+ assert(gtl::extents(rect, poly)); //get bounding box of poly
+ assert(gtl::equivalence(rect, poly)); //hey, that's slick
+ assert(gtl::winding(poly) == gtl::COUNTERCLOCKWISE);
+ assert(gtl::perimeter(poly) == 40.0f);
+
+ //add 5 to all coords of poly
+ gtl::convolve(poly, gtl::construct<Point>(5, 5));
+ //multiply all coords of poly by 2
+ gtl::scale_up(poly, 2);
+ gtl::set_points(rect, gtl::point_data<int>(10, 10),
+ gtl::point_data<int>(30, 30));
+ assert(gtl::equivalence(poly, rect));
+}
+
+//Now lets declare our own polygon class
+//Oops, we need a point class to support our polygon, lets borrow
+//the CPoint example
+struct CPoint {
+ int x;
+ int y;
+};
+
+//we have to get CPoint working with boost polygon to make our polygon
+//that uses CPoint working with boost polygon
+namespace boost { namespace polygon {
+ template <>
+ struct geometry_concept<CPoint> { typedef point_concept type; };
+ template <>
+ struct point_traits<CPoint> {
+ typedef int coordinate_type;
+
+ static inline coordinate_type get(const CPoint& point,
+ orientation_2d orient) {
+ if(orient == HORIZONTAL)
+ return point.x;
+ return point.y;
+ }
+ };
+
+ template <>
+ struct point_mutable_traits<CPoint> {
+ typedef int coordinate_type;
+
+ static inline void set(CPoint& point, orientation_2d orient, int value) {
+ if(orient == HORIZONTAL)
+ point.x = value;
+ else
+ point.y = value;
+ }
+ static inline CPoint construct(int x_value, int y_value) {
+ CPoint retval;
+ retval.x = x_value;
+ retval.y = y_value;
+ return retval;
+ }
+ };
+ } }
+
+//I'm lazy and use the stl everywhere to avoid writing my own classes
+//my toy polygon is a std::list<CPoint>
+typedef std::list<CPoint> CPolygon;
+
+//we need to specialize our polygon concept mapping in boost polygon
+namespace boost { namespace polygon {
+ //first register CPolygon as a polygon_concept type
+ template <>
+ struct geometry_concept<CPolygon>{ typedef polygon_concept type; };
+
+ template <>
+ struct polygon_traits<CPolygon> {
+ typedef int coordinate_type;
+ typedef CPolygon::const_iterator iterator_type;
+ typedef CPoint point_type;
+
+ // Get the begin iterator
+ static inline iterator_type begin_points(const CPolygon& t) {
+ return t.begin();
+ }
+
+ // Get the end iterator
+ static inline iterator_type end_points(const CPolygon& t) {
+ return t.end();
+ }
+
+ // Get the number of sides of the polygon
+ static inline std::size_t size(const CPolygon& t) {
+ return t.size();
+ }
+
+ // Get the winding direction of the polygon
+ static inline winding_direction winding(const CPolygon& t) {
+ return unknown_winding;
+ }
+ };
+
+ template <>
+ struct polygon_mutable_traits<CPolygon> {
+ //expects stl style iterators
+ template <typename iT>
+ static inline CPolygon& set_points(CPolygon& t,
+ iT input_begin, iT input_end) {
+ t.clear();
+ t.insert(t.end(), input_begin, input_end);
+ return t;
+ }
+
+ };
+ } }
+
+//now there's nothing left to do but test that our polygon
+//works with library interfaces
+int main() {
+ test_polygon<CPolygon>(); //woot!
+ return 0;
+}
diff --git a/src/boost/libs/polygon/example/gtl_custom_polygon_set.cpp b/src/boost/libs/polygon/example/gtl_custom_polygon_set.cpp
new file mode 100644
index 000000000..4599031f7
--- /dev/null
+++ b/src/boost/libs/polygon/example/gtl_custom_polygon_set.cpp
@@ -0,0 +1,203 @@
+/*
+Copyright 2008 Intel Corporation
+
+Use, modification and distribution are subject to the Boost Software License,
+Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt).
+*/
+#include <boost/polygon/polygon.hpp>
+#include <list>
+#include <time.h>
+#include <cassert>
+#include <deque>
+#include <iostream>
+namespace gtl = boost::polygon;
+using namespace boost::polygon::operators;
+
+//once again we make our usage of the library generic
+//and parameterize it on the polygon set type
+template <typename PolygonSet>
+void test_polygon_set() {
+ using namespace gtl;
+ PolygonSet ps;
+ ps += rectangle_data<int>(0, 0, 10, 10);
+ PolygonSet ps2;
+ ps2 += rectangle_data<int>(5, 5, 15, 15);
+ PolygonSet ps3;
+ assign(ps3, ps * ps2);
+ PolygonSet ps4;
+ ps4 += ps + ps2;
+ assert(area(ps4) == area(ps) + area(ps2) - area(ps3));
+ assert(equivalence((ps + ps2) - (ps * ps2), ps ^ ps2));
+ rectangle_data<int> rect;
+ assert(extents(rect, ps ^ ps2));
+ assert(area(rect) == 225);
+ assert(area(rect ^ (ps ^ ps2)) == area(rect) - area(ps ^ ps2));
+}
+
+//first thing is first, lets include all the code from previous examples
+
+//the CPoint example
+struct CPoint {
+ int x;
+ int y;
+};
+
+namespace boost { namespace polygon {
+ template <>
+ struct geometry_concept<CPoint> { typedef point_concept type; };
+ template <>
+ struct point_traits<CPoint> {
+ typedef int coordinate_type;
+
+ static inline coordinate_type get(const CPoint& point,
+ orientation_2d orient) {
+ if(orient == HORIZONTAL)
+ return point.x;
+ return point.y;
+ }
+ };
+
+ template <>
+ struct point_mutable_traits<CPoint> {
+ typedef int coordinate_type;
+
+ static inline void set(CPoint& point, orientation_2d orient, int value) {
+ if(orient == HORIZONTAL)
+ point.x = value;
+ else
+ point.y = value;
+ }
+ static inline CPoint construct(int x_value, int y_value) {
+ CPoint retval;
+ retval.x = x_value;
+ retval.y = y_value;
+ return retval;
+ }
+ };
+ } }
+
+//the CPolygon example
+typedef std::list<CPoint> CPolygon;
+
+//we need to specialize our polygon concept mapping in boost polygon
+namespace boost { namespace polygon {
+ //first register CPolygon as a polygon_concept type
+ template <>
+ struct geometry_concept<CPolygon>{ typedef polygon_concept type; };
+
+ template <>
+ struct polygon_traits<CPolygon> {
+ typedef int coordinate_type;
+ typedef CPolygon::const_iterator iterator_type;
+ typedef CPoint point_type;
+
+ // Get the begin iterator
+ static inline iterator_type begin_points(const CPolygon& t) {
+ return t.begin();
+ }
+
+ // Get the end iterator
+ static inline iterator_type end_points(const CPolygon& t) {
+ return t.end();
+ }
+
+ // Get the number of sides of the polygon
+ static inline std::size_t size(const CPolygon& t) {
+ return t.size();
+ }
+
+ // Get the winding direction of the polygon
+ static inline winding_direction winding(const CPolygon& t) {
+ return unknown_winding;
+ }
+ };
+
+ template <>
+ struct polygon_mutable_traits<CPolygon> {
+ //expects stl style iterators
+ template <typename iT>
+ static inline CPolygon& set_points(CPolygon& t,
+ iT input_begin, iT input_end) {
+ t.clear();
+ while(input_begin != input_end) {
+ t.push_back(CPoint());
+ gtl::assign(t.back(), *input_begin);
+ ++input_begin;
+ }
+ return t;
+ }
+
+ };
+ } }
+
+//OK, finally we get to declare our own polygon set type
+typedef std::deque<CPolygon> CPolygonSet;
+
+//deque isn't automatically a polygon set in the library
+//because it is a standard container there is a shortcut
+//for mapping it to polygon set concept, but I'll do it
+//the long way that you would use in the general case.
+namespace boost { namespace polygon {
+ //first we register CPolygonSet as a polygon set
+ template <>
+ struct geometry_concept<CPolygonSet> { typedef polygon_set_concept type; };
+
+ //next we map to the concept through traits
+ template <>
+ struct polygon_set_traits<CPolygonSet> {
+ typedef int coordinate_type;
+ typedef CPolygonSet::const_iterator iterator_type;
+ typedef CPolygonSet operator_arg_type;
+
+ static inline iterator_type begin(const CPolygonSet& polygon_set) {
+ return polygon_set.begin();
+ }
+
+ static inline iterator_type end(const CPolygonSet& polygon_set) {
+ return polygon_set.end();
+ }
+
+ //don't worry about these, just return false from them
+ static inline bool clean(const CPolygonSet& polygon_set) { return false; }
+ static inline bool sorted(const CPolygonSet& polygon_set) { return false; }
+ };
+
+ template <>
+ struct polygon_set_mutable_traits<CPolygonSet> {
+ template <typename input_iterator_type>
+ static inline void set(CPolygonSet& polygon_set, input_iterator_type input_begin, input_iterator_type input_end) {
+ polygon_set.clear();
+ //this is kind of cheesy. I am copying the unknown input geometry
+ //into my own polygon set and then calling get to populate the
+ //deque
+ polygon_set_data<int> ps;
+ ps.insert(input_begin, input_end);
+ ps.get(polygon_set);
+ //if you had your own odd-ball polygon set you would probably have
+ //to iterate through each polygon at this point and do something
+ //extra
+ }
+ };
+} }
+
+int main() {
+ long long c1 = clock();
+ for(int i = 0; i < 1000; ++i)
+ test_polygon_set<CPolygonSet>();
+ long long c2 = clock();
+ for(int i = 0; i < 1000; ++i)
+ test_polygon_set<gtl::polygon_set_data<int> >();
+ long long c3 = clock();
+ long long diff1 = c2 - c1;
+ long long diff2 = c3 - c2;
+ if(diff1 > 0 && diff2)
+ std::cout << "library polygon_set_data is " << float(diff1)/float(diff2) << "X faster than custom polygon set deque of CPolygon" << std::endl;
+ else
+ std::cout << "operation was too fast" << std::endl;
+ return 0;
+}
+
+//Now you know how to map your own data type to polygon set concept
+//Now you also know how to make your application code that operates on geometry
+//data type agnostic from point through polygon set
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_001.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_001.txt
new file mode 100644
index 000000000..5bbb057e0
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_001.txt
@@ -0,0 +1,10 @@
+0
+8
+0 0 -3 5
+-3 5 2 10
+2 10 4 6
+4 6 10 12
+10 12 13 6
+13 6 11 1
+11 1 5 1
+5 1 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_002.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_002.txt
new file mode 100644
index 000000000..486bd911e
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_002.txt
@@ -0,0 +1,16 @@
+0
+14
+0 0 -3 5
+-3 5 2 10
+2 10 4 6
+4 6 10 12
+10 12 13 6
+13 6 11 1
+11 1 5 1
+5 1 0 0
+1 2 0 5
+0 5 5 2
+5 2 1 2
+10 3 8 6
+8 6 10 8
+10 8 10 3 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_003.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_003.txt
new file mode 100644
index 000000000..429246051
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_003.txt
@@ -0,0 +1,10 @@
+0
+8
+0 0 0 8
+0 8 4 12
+4 12 9 13
+9 13 13 13
+13 13 13 4
+13 4 10 0
+10 0 5 -1
+5 -1 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_004.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_004.txt
new file mode 100644
index 000000000..bb5a50bd2
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_004.txt
@@ -0,0 +1,10 @@
+0
+8
+0 0 0 8
+0 8 4 12
+4 12 9 13
+9 13 7 7
+7 7 13 4
+13 4 10 0
+10 0 5 -1
+5 -1 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_005.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_005.txt
new file mode 100644
index 000000000..7825f9268
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_005.txt
@@ -0,0 +1,8 @@
+0
+6
+0 0 10 0
+10 0 16 -6
+16 -6 22 0
+22 0 22 -12
+22 -12 10 -12
+10 -12 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_006.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_006.txt
new file mode 100644
index 000000000..064dded3f
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_006.txt
@@ -0,0 +1,9 @@
+0
+7
+0 0 0 10
+0 10 6 10
+6 10 10 7
+10 7 14 10
+14 10 20 10
+20 10 20 0
+20 0 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_007.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_007.txt
new file mode 100644
index 000000000..af811fe66
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_007.txt
@@ -0,0 +1,14 @@
+0
+12
+0 0 8 3
+8 3 10 13
+10 13 16 6
+16 6 16 15
+16 15 25 10
+25 10 15 1
+15 1 27 -1
+27 -1 14 -4
+14 -4 13 3
+13 3 11 -5
+11 -5 10 0
+10 0 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_008.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_008.txt
new file mode 100644
index 000000000..65985418b
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_008.txt
@@ -0,0 +1,12 @@
+0
+10
+0 0 1 8
+1 8 10 7
+10 7 20 10
+20 10 25 9
+25 9 28 5
+28 5 23 -2
+23 -2 24 -7
+24 -7 13 -9
+13 -9 10 -3
+10 -3 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_009.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_009.txt
new file mode 100644
index 000000000..863e93fbd
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_009.txt
@@ -0,0 +1,6 @@
+0
+4
+0 0 0 10
+0 10 30 10
+30 10 30 0
+30 0 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_010.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_010.txt
new file mode 100644
index 000000000..3dc6cf987
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_010.txt
@@ -0,0 +1,25 @@
+0
+23
+-12 4 -12 -4
+-12 -4 -8 -4
+-8 -4 -8 -1
+-8 -1 -9 0
+-9 0 -8 1
+-8 1 -8 4
+-8 4 -12 4
+-4 4 -4 -4
+-4 -4 0 -4
+0 -4 0 4
+0 4 -4 4
+4 4 4 -4
+4 -4 8 -4
+8 -4 8 4
+8 4 4 4
+-4 -8 -8 -8
+-8 -8 -8 -12
+-8 -12 -4 -12
+-4 -12 -4 -16
+-4 -16 -8 -16
+0 -8 2 -8
+2 -8 4 -8
+2 -8 2 -16
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_011.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_011.txt
new file mode 100644
index 000000000..34ec6a546
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_011.txt
@@ -0,0 +1,11 @@
+0
+9
+0 0 1 10
+1 10 4 9
+4 9 4 2
+4 2 0 0
+5 5 6 8
+6 8 10 10
+10 10 9 1
+9 1 6 2
+6 2 5 5 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/polygon/polygon_012.txt b/src/boost/libs/polygon/example/input_data/polygon/polygon_012.txt
new file mode 100644
index 000000000..c338d9770
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/polygon/polygon_012.txt
@@ -0,0 +1,14 @@
+0
+12
+0 0 100 0
+100 0 100 100
+100 100 0 100
+0 100 0 0
+15 15 60 20
+60 20 87 23
+60 20 57 47
+15 85 30 80
+30 80 25 65
+30 80 60 70
+60 70 75 65
+60 70 65 85 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_001.txt b/src/boost/libs/polygon/example/input_data/primary/primary_001.txt
new file mode 100644
index 000000000..5b553c0db
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_001.txt
@@ -0,0 +1,2 @@
+1
+0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_002.txt b/src/boost/libs/polygon/example/input_data/primary/primary_002.txt
new file mode 100644
index 000000000..0b4551478
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_002.txt
@@ -0,0 +1,3 @@
+2
+0 0
+1 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_003.txt b/src/boost/libs/polygon/example/input_data/primary/primary_003.txt
new file mode 100644
index 000000000..fdbbf7a7f
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_003.txt
@@ -0,0 +1,3 @@
+2
+0 0
+0 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_004.txt b/src/boost/libs/polygon/example/input_data/primary/primary_004.txt
new file mode 100644
index 000000000..c64ab2120
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_004.txt
@@ -0,0 +1,3 @@
+2
+0 0
+1 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_005.txt b/src/boost/libs/polygon/example/input_data/primary/primary_005.txt
new file mode 100644
index 000000000..bbadf5572
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_005.txt
@@ -0,0 +1,11 @@
+10
+0 0
+0 1
+0 2
+0 3
+0 4
+0 -1
+0 -2
+0 -3
+0 -4
+0 -5 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_006.txt b/src/boost/libs/polygon/example/input_data/primary/primary_006.txt
new file mode 100644
index 000000000..eb7aea424
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_006.txt
@@ -0,0 +1,11 @@
+10
+0 0
+1 0
+2 0
+3 0
+4 0
+5 0
+-1 0
+-2 0
+-3 0
+-4 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_007.txt b/src/boost/libs/polygon/example/input_data/primary/primary_007.txt
new file mode 100644
index 000000000..88ac7796c
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_007.txt
@@ -0,0 +1,12 @@
+11
+0 0
+1 1
+2 2
+3 3
+4 4
+5 5
+6 6
+7 7
+8 8
+9 9
+10 10 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_008.txt b/src/boost/libs/polygon/example/input_data/primary/primary_008.txt
new file mode 100644
index 000000000..9f4b6f059
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_008.txt
@@ -0,0 +1,11 @@
+10
+-46 -37
+-40 -30
+-34 -23
+-28 -16
+-22 -09
+-16 -02
+-10 05
+-04 12
+02 19
+08 26 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_009.txt b/src/boost/libs/polygon/example/input_data/primary/primary_009.txt
new file mode 100644
index 000000000..99f5f0c58
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_009.txt
@@ -0,0 +1,11 @@
+10
+33333 11111
+66666 0
+99999 -11111
+133332 -22222
+166665 -33333
+199998 -44444
+233331 -55555
+266664 -66666
+299997 -77777
+333330 -88888 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_010.txt b/src/boost/libs/polygon/example/input_data/primary/primary_010.txt
new file mode 100644
index 000000000..4dbbd9369
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_010.txt
@@ -0,0 +1,4 @@
+3
+0 0
+2005 2005
+10025 10025 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_011.txt b/src/boost/libs/polygon/example/input_data/primary/primary_011.txt
new file mode 100644
index 000000000..2573f6120
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_011.txt
@@ -0,0 +1,4 @@
+3
+0 0
+0 4
+1 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_012.txt b/src/boost/libs/polygon/example/input_data/primary/primary_012.txt
new file mode 100644
index 000000000..a14a3f910
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_012.txt
@@ -0,0 +1,5 @@
+4
+0 0
+0 1
+1 0
+1 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_013.txt b/src/boost/libs/polygon/example/input_data/primary/primary_013.txt
new file mode 100644
index 000000000..494c527c2
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_013.txt
@@ -0,0 +1,14 @@
+13
+0 5
+0 -5
+-4 -3
+4 -3
+4 3
+-4 3
+3 -4
+-3 4
+-3 -4
+3 4
+-5 0
+5 0
+0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_014.txt b/src/boost/libs/polygon/example/input_data/primary/primary_014.txt
new file mode 100644
index 000000000..72b1accdd
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_014.txt
@@ -0,0 +1,13 @@
+12
+0 5
+0 -5
+-4 -3
+4 -3
+4 3
+-4 3
+3 -4
+-3 4
+-3 -4
+3 4
+-5 0
+5 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_015.txt b/src/boost/libs/polygon/example/input_data/primary/primary_015.txt
new file mode 100644
index 000000000..f228af2a8
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_015.txt
@@ -0,0 +1,5 @@
+4
+4 3
+4 8
+9 2
+9 9 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_016.txt b/src/boost/libs/polygon/example/input_data/primary/primary_016.txt
new file mode 100644
index 000000000..4deb88682
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_016.txt
@@ -0,0 +1,101 @@
+100
+100 0
+99 6
+99 12
+98 18
+96 24
+95 30
+92 36
+90 42
+87 48
+84 53
+80 58
+77 63
+72 68
+68 72
+63 77
+58 80
+53 84
+48 87
+42 90
+36 92
+30 95
+24 96
+18 98
+12 99
+6 99
+0 99
+-6 99
+-12 99
+-18 98
+-24 96
+-30 95
+-36 93
+-42 90
+-48 87
+-53 84
+-58 80
+-63 77
+-68 72
+-72 68
+-76 63
+-80 58
+-84 53
+-87 48
+-90 42
+-92 36
+-95 31
+-96 25
+-98 18
+-99 12
+-99 6
+-99 0
+-99 -6
+-99 -12
+-98 -18
+-96 -24
+-95 -30
+-93 -36
+-90 -42
+-87 -48
+-84 -53
+-81 -58
+-77 -63
+-73 -68
+-68 -72
+-63 -76
+-58 -80
+-53 -84
+-48 -87
+-42 -90
+-37 -92
+-31 -95
+-25 -96
+-18 -98
+-12 -99
+-6 -99
+0 -99
+6 -99
+12 -99
+18 -98
+24 -96
+30 -95
+36 -93
+42 -90
+47 -87
+53 -84
+58 -81
+63 -77
+68 -73
+72 -68
+76 -63
+80 -59
+84 -53
+87 -48
+90 -42
+92 -37
+95 -31
+96 -25
+98 -19
+99 -12
+99 -6 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_017.txt b/src/boost/libs/polygon/example/input_data/primary/primary_017.txt
new file mode 100644
index 000000000..57e3cccdd
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_017.txt
@@ -0,0 +1,3 @@
+0
+1
+0 0 1 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_018.txt b/src/boost/libs/polygon/example/input_data/primary/primary_018.txt
new file mode 100644
index 000000000..013611c3b
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_018.txt
@@ -0,0 +1,6 @@
+2
+3 1
+1 3
+1
+0 0
+4 4 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_019.txt b/src/boost/libs/polygon/example/input_data/primary/primary_019.txt
new file mode 100644
index 000000000..4068a329a
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_019.txt
@@ -0,0 +1,5 @@
+2
+3 2
+2 3
+1
+4 0 0 4 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_020.txt b/src/boost/libs/polygon/example/input_data/primary/primary_020.txt
new file mode 100644
index 000000000..c1e81b4b4
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_020.txt
@@ -0,0 +1,7 @@
+3
+-2 -2
+-2 4
+-2 10
+1
+0 0
+0 8 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_021.txt b/src/boost/libs/polygon/example/input_data/primary/primary_021.txt
new file mode 100644
index 000000000..c42125315
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_021.txt
@@ -0,0 +1,4 @@
+1
+-1 1
+1
+1 0 1 2 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_022.txt b/src/boost/libs/polygon/example/input_data/primary/primary_022.txt
new file mode 100644
index 000000000..078494210
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_022.txt
@@ -0,0 +1,5 @@
+0
+3
+0 0 4 0
+4 0 0 4
+0 4 4 4 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_023.txt b/src/boost/libs/polygon/example/input_data/primary/primary_023.txt
new file mode 100644
index 000000000..75cb14a69
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_023.txt
@@ -0,0 +1,6 @@
+0
+4
+0 0 4 0
+4 0 4 4
+4 4 0 4
+0 4 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_024.txt b/src/boost/libs/polygon/example/input_data/primary/primary_024.txt
new file mode 100644
index 000000000..66ac2d8bc
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_024.txt
@@ -0,0 +1,4 @@
+0
+2
+0 0 4 0
+2 2 2 4 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_025.txt b/src/boost/libs/polygon/example/input_data/primary/primary_025.txt
new file mode 100644
index 000000000..a6eeea276
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_025.txt
@@ -0,0 +1,5 @@
+1
+5 6
+2
+0 0 4 0
+2 2 2 4 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_026.txt b/src/boost/libs/polygon/example/input_data/primary/primary_026.txt
new file mode 100644
index 000000000..834264e36
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_026.txt
@@ -0,0 +1,6 @@
+2
+0 0
+1 6
+2
+-4 5 5 -1
+3 -11 13 -1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_027.txt b/src/boost/libs/polygon/example/input_data/primary/primary_027.txt
new file mode 100644
index 000000000..710e8a8ca
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_027.txt
@@ -0,0 +1,12 @@
+2
+0 0
+1 6
+8
+-6 5 2 -7
+3 -11 13 -1
+-4 5 5 -1
+4 4 11 4
+4 4 8 10
+11 4 8 10
+8 10 5 13
+8 10 11 13 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_028.txt b/src/boost/libs/polygon/example/input_data/primary/primary_028.txt
new file mode 100644
index 000000000..1ed194d67
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_028.txt
@@ -0,0 +1,5 @@
+0
+3
+0 0 4 2
+4 2 4 -2
+4 -2 0 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_029.txt b/src/boost/libs/polygon/example/input_data/primary/primary_029.txt
new file mode 100644
index 000000000..3ca79ed6d
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_029.txt
@@ -0,0 +1,10 @@
+0
+8
+0 0 0 1
+0 0 1 0
+0 0 -1 0
+0 0 0 -1
+0 0 1 1
+0 0 1 -1
+0 0 -1 1
+0 0 -1 -1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_030.txt b/src/boost/libs/polygon/example/input_data/primary/primary_030.txt
new file mode 100644
index 000000000..fde6cac22
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_030.txt
@@ -0,0 +1,14 @@
+0
+12
+-1 10 1 10
+10 -1 10 1
+-1 -10 1 -10
+-10 -1 -10 1
+-6 8 -2 11
+-8 6 -11 2
+6 8 2 11
+8 6 11 2
+6 -8 2 -11
+8 -6 11 -2
+-6 -8 -2 -11
+-8 -6 -11 -2 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_031.txt b/src/boost/libs/polygon/example/input_data/primary/primary_031.txt
new file mode 100644
index 000000000..d60d5ceec
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_031.txt
@@ -0,0 +1,15 @@
+1
+0 0
+12
+-1 10 1 10
+10 -1 10 1
+-1 -10 1 -10
+-10 -1 -10 1
+-6 8 -2 11
+-8 6 -11 2
+6 8 2 11
+8 6 11 2
+6 -8 2 -11
+8 -6 11 -2
+-6 -8 -2 -11
+-8 -6 -11 -2 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_032.txt b/src/boost/libs/polygon/example/input_data/primary/primary_032.txt
new file mode 100644
index 000000000..40617faa6
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_032.txt
@@ -0,0 +1,6 @@
+3
+0 -4
+2 8
+-16 15
+1
+7 20 7 -20
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_033.txt b/src/boost/libs/polygon/example/input_data/primary/primary_033.txt
new file mode 100644
index 000000000..65514eed1
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_033.txt
@@ -0,0 +1,7 @@
+4
+-6 6
+-5 6
+-4 6
+-3 6
+1
+0 0 0 7 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_034.txt b/src/boost/libs/polygon/example/input_data/primary/primary_034.txt
new file mode 100644
index 000000000..d4e0b97d7
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_034.txt
@@ -0,0 +1,6 @@
+0
+4
+0 -4 2 8
+2 8 -16 15
+0 -4 -16 15
+7 20 7 -20
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_035.txt b/src/boost/libs/polygon/example/input_data/primary/primary_035.txt
new file mode 100644
index 000000000..dce66e788
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_035.txt
@@ -0,0 +1,22 @@
+0
+20
+100 0 95 30
+95 30 80 58
+80 58 58 80
+58 80 30 95
+30 95 0 99
+0 99 -30 95
+-30 95 -58 80
+-58 80 -80 58
+-80 58 -95 30
+-95 30 -99 0
+-99 0 -95 -30
+-95 -30 -80 -58
+-80 -58 -58 -80
+-58 -80 -30 -95
+-30 -95 0 -99
+0 -99 30 -95
+30 -95 58 -80
+58 -80 80 -58
+80 -58 95 -30
+95 -30 100 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_036.txt b/src/boost/libs/polygon/example/input_data/primary/primary_036.txt
new file mode 100644
index 000000000..c73b72cd8
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_036.txt
@@ -0,0 +1,102 @@
+0
+100
+100 0 99 6
+99 6 99 12
+99 12 98 18
+98 18 96 24
+96 24 95 30
+95 30 92 36
+92 36 90 42
+90 42 87 48
+87 48 84 53
+84 53 80 58
+80 58 77 63
+77 63 72 68
+72 68 68 72
+68 72 63 77
+63 77 58 80
+58 80 53 84
+53 84 48 87
+48 87 42 90
+42 90 36 92
+36 92 30 95
+30 95 24 96
+24 96 18 98
+18 98 12 99
+12 99 6 99
+6 99 0 99
+0 99 -6 99
+-6 99 -12 99
+-12 99 -18 98
+-18 98 -24 96
+-24 96 -30 95
+-30 95 -36 92
+-36 92 -42 90
+-42 90 -48 87
+-48 87 -53 84
+-53 84 -58 80
+-58 80 -63 77
+-63 77 -68 72
+-68 72 -72 68
+-72 68 -77 63
+-77 63 -80 58
+-80 58 -84 53
+-84 53 -87 48
+-87 48 -90 42
+-90 42 -92 36
+-92 36 -95 30
+-95 30 -96 24
+-96 24 -98 18
+-98 18 -99 12
+-99 12 -99 6
+-99 6 -99 0
+-99 0 -99 -6
+-99 -6 -99 -12
+-99 -12 -98 -18
+-98 -18 -96 -24
+-96 -24 -95 -30
+-95 -30 -92 -36
+-92 -36 -90 -42
+-90 -42 -87 -48
+-87 -48 -84 -53
+-84 -53 -80 -58
+-80 -58 -77 -63
+-77 -63 -72 -68
+-72 -68 -68 -72
+-68 -72 -63 -77
+-63 -77 -58 -80
+-58 -80 -53 -84
+-53 -84 -48 -87
+-48 -87 -42 -90
+-42 -90 -36 -92
+-36 -92 -30 -95
+-30 -95 -24 -96
+-24 -96 -18 -98
+-18 -98 -12 -99
+-12 -99 -6 -99
+-6 -99 0 -99
+0 -99 6 -99
+6 -99 12 -99
+12 -99 18 -98
+18 -98 24 -96
+24 -96 30 -95
+30 -95 36 -92
+36 -92 42 -90
+42 -90 48 -87
+48 -87 53 -84
+53 -84 58 -80
+58 -80 63 -77
+63 -77 68 -72
+68 -72 72 -68
+72 -68 77 -63
+77 -63 80 -58
+80 -58 84 -53
+84 -53 87 -48
+87 -48 90 -42
+90 -42 92 -36
+92 -36 95 -30
+95 -30 96 -24
+96 -24 98 -18
+98 -18 99 -12
+99 -12 99 -6
+99 -6 100 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_037.txt b/src/boost/libs/polygon/example/input_data/primary/primary_037.txt
new file mode 100644
index 000000000..552fee8e4
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_037.txt
@@ -0,0 +1,102 @@
+80
+99 6
+99 12
+98 18
+96 24
+92 36
+90 42
+87 48
+84 53
+77 63
+72 68
+68 72
+63 77
+53 84
+48 87
+42 90
+36 92
+24 96
+18 98
+12 99
+6 99
+-6 99
+-12 99
+-18 98
+-24 96
+-36 92
+-42 90
+-48 87
+-53 84
+-63 77
+-68 72
+-72 68
+-77 63
+-84 53
+-87 48
+-90 42
+-92 36
+-96 24
+-98 18
+-99 12
+-99 6
+-99 -6
+-99 -12
+-98 -18
+-96 -24
+-92 -36
+-90 -42
+-87 -48
+-84 -53
+-77 -63
+-72 -68
+-68 -72
+-63 -77
+-53 -84
+-48 -87
+-42 -90
+-36 -92
+-24 -96
+-18 -98
+-12 -99
+-6 -99
+6 -99
+12 -99
+18 -98
+24 -96
+36 -92
+42 -90
+48 -87
+53 -84
+63 -77
+68 -72
+72 -68
+77 -63
+84 -53
+87 -48
+90 -42
+92 -36
+96 -24
+98 -18
+99 -12
+99 -6
+20
+100 0 99 6
+95 30 92 36
+80 58 77 63
+58 80 53 84
+30 95 24 96
+0 99 -6 99
+-30 95 -36 92
+-58 80 -63 77
+-80 58 -84 53
+-95 30 -96 24
+-99 0 -99 -6
+-95 -30 -92 -36
+-80 -58 -77 -63
+-58 -80 -53 -84
+-30 -95 -24 -96
+0 -99 6 -99
+30 -95 36 -92
+58 -80 63 -77
+80 -58 84 -53
+95 -30 96 -24 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_038.txt b/src/boost/libs/polygon/example/input_data/primary/primary_038.txt
new file mode 100644
index 000000000..66a50f701
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_038.txt
@@ -0,0 +1,222 @@
+0
+220
+0 0 0 10
+0 0 10 0
+0 10 0 20
+0 10 10 10
+0 20 0 30
+0 20 10 20
+0 30 0 40
+0 30 10 30
+0 40 0 50
+0 40 10 40
+0 50 0 60
+0 50 10 50
+0 60 0 70
+0 60 10 60
+0 70 0 80
+0 70 10 70
+0 80 0 90
+0 80 10 80
+0 90 0 100
+0 90 10 90
+0 100 10 100
+10 0 10 10
+10 0 20 0
+10 10 10 20
+10 10 20 10
+10 20 10 30
+10 20 20 20
+10 30 10 40
+10 30 20 30
+10 40 10 50
+10 40 20 40
+10 50 10 60
+10 50 20 50
+10 60 10 70
+10 60 20 60
+10 70 10 80
+10 70 20 70
+10 80 10 90
+10 80 20 80
+10 90 10 100
+10 90 20 90
+10 100 20 100
+20 0 20 10
+20 0 30 0
+20 10 20 20
+20 10 30 10
+20 20 20 30
+20 20 30 20
+20 30 20 40
+20 30 30 30
+20 40 20 50
+20 40 30 40
+20 50 20 60
+20 50 30 50
+20 60 20 70
+20 60 30 60
+20 70 20 80
+20 70 30 70
+20 80 20 90
+20 80 30 80
+20 90 20 100
+20 90 30 90
+20 100 30 100
+30 0 30 10
+30 0 40 0
+30 10 30 20
+30 10 40 10
+30 20 30 30
+30 20 40 20
+30 30 30 40
+30 30 40 30
+30 40 30 50
+30 40 40 40
+30 50 30 60
+30 50 40 50
+30 60 30 70
+30 60 40 60
+30 70 30 80
+30 70 40 70
+30 80 30 90
+30 80 40 80
+30 90 30 100
+30 90 40 90
+30 100 40 100
+40 0 40 10
+40 0 50 0
+40 10 40 20
+40 10 50 10
+40 20 40 30
+40 20 50 20
+40 30 40 40
+40 30 50 30
+40 40 40 50
+40 40 50 40
+40 50 40 60
+40 50 50 50
+40 60 40 70
+40 60 50 60
+40 70 40 80
+40 70 50 70
+40 80 40 90
+40 80 50 80
+40 90 40 100
+40 90 50 90
+40 100 50 100
+50 0 50 10
+50 0 60 0
+50 10 50 20
+50 10 60 10
+50 20 50 30
+50 20 60 20
+50 30 50 40
+50 30 60 30
+50 40 50 50
+50 40 60 40
+50 50 50 60
+50 50 60 50
+50 60 50 70
+50 60 60 60
+50 70 50 80
+50 70 60 70
+50 80 50 90
+50 80 60 80
+50 90 50 100
+50 90 60 90
+50 100 60 100
+60 0 60 10
+60 0 70 0
+60 10 60 20
+60 10 70 10
+60 20 60 30
+60 20 70 20
+60 30 60 40
+60 30 70 30
+60 40 60 50
+60 40 70 40
+60 50 60 60
+60 50 70 50
+60 60 60 70
+60 60 70 60
+60 70 60 80
+60 70 70 70
+60 80 60 90
+60 80 70 80
+60 90 60 100
+60 90 70 90
+60 100 70 100
+70 0 70 10
+70 0 80 0
+70 10 70 20
+70 10 80 10
+70 20 70 30
+70 20 80 20
+70 30 70 40
+70 30 80 30
+70 40 70 50
+70 40 80 40
+70 50 70 60
+70 50 80 50
+70 60 70 70
+70 60 80 60
+70 70 70 80
+70 70 80 70
+70 80 70 90
+70 80 80 80
+70 90 70 100
+70 90 80 90
+70 100 80 100
+80 0 80 10
+80 0 90 0
+80 10 80 20
+80 10 90 10
+80 20 80 30
+80 20 90 20
+80 30 80 40
+80 30 90 30
+80 40 80 50
+80 40 90 40
+80 50 80 60
+80 50 90 50
+80 60 80 70
+80 60 90 60
+80 70 80 80
+80 70 90 70
+80 80 80 90
+80 80 90 80
+80 90 80 100
+80 90 90 90
+80 100 90 100
+90 0 90 10
+90 0 100 0
+90 10 90 20
+90 10 100 10
+90 20 90 30
+90 20 100 20
+90 30 90 40
+90 30 100 30
+90 40 90 50
+90 40 100 40
+90 50 90 60
+90 50 100 50
+90 60 90 70
+90 60 100 60
+90 70 90 80
+90 70 100 70
+90 80 90 90
+90 80 100 80
+90 90 90 100
+90 90 100 90
+90 100 100 100
+100 0 100 10
+100 10 100 20
+100 20 100 30
+100 30 100 40
+100 40 100 50
+100 50 100 60
+100 60 100 70
+100 70 100 80
+100 80 100 90
+100 90 100 100 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_039.txt b/src/boost/libs/polygon/example/input_data/primary/primary_039.txt
new file mode 100644
index 000000000..ed187312f
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_039.txt
@@ -0,0 +1,322 @@
+100
+5 5
+5 15
+5 25
+5 35
+5 45
+5 55
+5 65
+5 75
+5 85
+5 95
+15 5
+15 15
+15 25
+15 35
+15 45
+15 55
+15 65
+15 75
+15 85
+15 95
+25 5
+25 15
+25 25
+25 35
+25 45
+25 55
+25 65
+25 75
+25 85
+25 95
+35 5
+35 15
+35 25
+35 35
+35 45
+35 55
+35 65
+35 75
+35 85
+35 95
+45 5
+45 15
+45 25
+45 35
+45 45
+45 55
+45 65
+45 75
+45 85
+45 95
+55 5
+55 15
+55 25
+55 35
+55 45
+55 55
+55 65
+55 75
+55 85
+55 95
+65 5
+65 15
+65 25
+65 35
+65 45
+65 55
+65 65
+65 75
+65 85
+65 95
+75 5
+75 15
+75 25
+75 35
+75 45
+75 55
+75 65
+75 75
+75 85
+75 95
+85 5
+85 15
+85 25
+85 35
+85 45
+85 55
+85 65
+85 75
+85 85
+85 95
+95 5
+95 15
+95 25
+95 35
+95 45
+95 55
+95 65
+95 75
+95 85
+95 95
+220
+0 0 0 10
+0 0 10 0
+0 10 0 20
+0 10 10 10
+0 20 0 30
+0 20 10 20
+0 30 0 40
+0 30 10 30
+0 40 0 50
+0 40 10 40
+0 50 0 60
+0 50 10 50
+0 60 0 70
+0 60 10 60
+0 70 0 80
+0 70 10 70
+0 80 0 90
+0 80 10 80
+0 90 0 100
+0 90 10 90
+0 100 10 100
+10 0 10 10
+10 0 20 0
+10 10 10 20
+10 10 20 10
+10 20 10 30
+10 20 20 20
+10 30 10 40
+10 30 20 30
+10 40 10 50
+10 40 20 40
+10 50 10 60
+10 50 20 50
+10 60 10 70
+10 60 20 60
+10 70 10 80
+10 70 20 70
+10 80 10 90
+10 80 20 80
+10 90 10 100
+10 90 20 90
+10 100 20 100
+20 0 20 10
+20 0 30 0
+20 10 20 20
+20 10 30 10
+20 20 20 30
+20 20 30 20
+20 30 20 40
+20 30 30 30
+20 40 20 50
+20 40 30 40
+20 50 20 60
+20 50 30 50
+20 60 20 70
+20 60 30 60
+20 70 20 80
+20 70 30 70
+20 80 20 90
+20 80 30 80
+20 90 20 100
+20 90 30 90
+20 100 30 100
+30 0 30 10
+30 0 40 0
+30 10 30 20
+30 10 40 10
+30 20 30 30
+30 20 40 20
+30 30 30 40
+30 30 40 30
+30 40 30 50
+30 40 40 40
+30 50 30 60
+30 50 40 50
+30 60 30 70
+30 60 40 60
+30 70 30 80
+30 70 40 70
+30 80 30 90
+30 80 40 80
+30 90 30 100
+30 90 40 90
+30 100 40 100
+40 0 40 10
+40 0 50 0
+40 10 40 20
+40 10 50 10
+40 20 40 30
+40 20 50 20
+40 30 40 40
+40 30 50 30
+40 40 40 50
+40 40 50 40
+40 50 40 60
+40 50 50 50
+40 60 40 70
+40 60 50 60
+40 70 40 80
+40 70 50 70
+40 80 40 90
+40 80 50 80
+40 90 40 100
+40 90 50 90
+40 100 50 100
+50 0 50 10
+50 0 60 0
+50 10 50 20
+50 10 60 10
+50 20 50 30
+50 20 60 20
+50 30 50 40
+50 30 60 30
+50 40 50 50
+50 40 60 40
+50 50 50 60
+50 50 60 50
+50 60 50 70
+50 60 60 60
+50 70 50 80
+50 70 60 70
+50 80 50 90
+50 80 60 80
+50 90 50 100
+50 90 60 90
+50 100 60 100
+60 0 60 10
+60 0 70 0
+60 10 60 20
+60 10 70 10
+60 20 60 30
+60 20 70 20
+60 30 60 40
+60 30 70 30
+60 40 60 50
+60 40 70 40
+60 50 60 60
+60 50 70 50
+60 60 60 70
+60 60 70 60
+60 70 60 80
+60 70 70 70
+60 80 60 90
+60 80 70 80
+60 90 60 100
+60 90 70 90
+60 100 70 100
+70 0 70 10
+70 0 80 0
+70 10 70 20
+70 10 80 10
+70 20 70 30
+70 20 80 20
+70 30 70 40
+70 30 80 30
+70 40 70 50
+70 40 80 40
+70 50 70 60
+70 50 80 50
+70 60 70 70
+70 60 80 60
+70 70 70 80
+70 70 80 70
+70 80 70 90
+70 80 80 80
+70 90 70 100
+70 90 80 90
+70 100 80 100
+80 0 80 10
+80 0 90 0
+80 10 80 20
+80 10 90 10
+80 20 80 30
+80 20 90 20
+80 30 80 40
+80 30 90 30
+80 40 80 50
+80 40 90 40
+80 50 80 60
+80 50 90 50
+80 60 80 70
+80 60 90 60
+80 70 80 80
+80 70 90 70
+80 80 80 90
+80 80 90 80
+80 90 80 100
+80 90 90 90
+80 100 90 100
+90 0 90 10
+90 0 100 0
+90 10 90 20
+90 10 100 10
+90 20 90 30
+90 20 100 20
+90 30 90 40
+90 30 100 30
+90 40 90 50
+90 40 100 40
+90 50 90 60
+90 50 100 50
+90 60 90 70
+90 60 100 60
+90 70 90 80
+90 70 100 70
+90 80 90 90
+90 80 100 80
+90 90 90 100
+90 90 100 90
+90 100 100 100
+100 0 100 10
+100 10 100 20
+100 20 100 30
+100 30 100 40
+100 40 100 50
+100 50 100 60
+100 60 100 70
+100 70 100 80
+100 80 100 90
+100 90 100 100 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_040.txt b/src/boost/libs/polygon/example/input_data/primary/primary_040.txt
new file mode 100644
index 000000000..bf55be4fa
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_040.txt
@@ -0,0 +1,11 @@
+10
+858993458 1717986916
+-429496729 1288490187
+-2147483645 -1288490187
+-2147483645 -858993458
+-1717986916 858993458
+-2147483645 -429496729
+429496729 -2147483645
+858993458 -429496729
+-429496729 1717986916
+1717986916 -858993458 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_041.txt b/src/boost/libs/polygon/example/input_data/primary/primary_041.txt
new file mode 100644
index 000000000..76ef90dee
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_041.txt
@@ -0,0 +1,8 @@
+0
+6
+0 0 0 10
+-5 0 -1 0
+-6 2 -1 2
+-4 5 -2 5
+-8 8 -1 8
+-7 -2 -7 7 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_042.txt b/src/boost/libs/polygon/example/input_data/primary/primary_042.txt
new file mode 100644
index 000000000..57d7726d2
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_042.txt
@@ -0,0 +1,5 @@
+0
+3
+-6 -1 -5 3
+-1 0 4 -1
+3 0 4 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_043.txt b/src/boost/libs/polygon/example/input_data/primary/primary_043.txt
new file mode 100644
index 000000000..ccddfcb6d
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_043.txt
@@ -0,0 +1,5 @@
+0
+3
+-5 -2 -4 2
+-5 3 -2 2
+-5 5 -2 2 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_044.txt b/src/boost/libs/polygon/example/input_data/primary/primary_044.txt
new file mode 100644
index 000000000..b4cf7e03a
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_044.txt
@@ -0,0 +1,5 @@
+0
+3
+-9 -8 -4 -3
+-8 -3 -4 -3
+-2 7 -1 3 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_045.txt b/src/boost/libs/polygon/example/input_data/primary/primary_045.txt
new file mode 100644
index 000000000..74c4d69fa
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_045.txt
@@ -0,0 +1,5 @@
+0
+3
+14 76 38 29
+37 47 61 50
+39 37 41 35
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_046.txt b/src/boost/libs/polygon/example/input_data/primary/primary_046.txt
new file mode 100644
index 000000000..5ff83ebce
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_046.txt
@@ -0,0 +1,5 @@
+2
+2 -5
+3 -3
+1
+0 0 2 -7 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_047.txt b/src/boost/libs/polygon/example/input_data/primary/primary_047.txt
new file mode 100644
index 000000000..bd8f67cf4
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_047.txt
@@ -0,0 +1,5 @@
+1
+-35 -49
+2
+-48 -29 -46 -78
+-46 -46 -45 -42 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_048.txt b/src/boost/libs/polygon/example/input_data/primary/primary_048.txt
new file mode 100644
index 000000000..d93dfb4c3
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_048.txt
@@ -0,0 +1,11 @@
+0
+9
+-50 -29 -49 -73
+-48 -29 -46 -78
+-46 -46 -45 -42
+-35 -49 -34 -49
+-30 -2 -29 3
+-43 16 -40 6
+-36 38 -34 49
+-35 39 -31 37
+-28 34 -27 -9 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_049.txt b/src/boost/libs/polygon/example/input_data/primary/primary_049.txt
new file mode 100644
index 000000000..a8b853665
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_049.txt
@@ -0,0 +1,11 @@
+0
+9
+-5 4 -7 8
+-5 4 -5 2
+-5 4 -2 7
+-1 -6 -5 -2
+-1 -6 -3 -10
+-1 -6 5 -6
+5 -1 5 -4
+5 -1 3 4
+5 -1 8 6 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_050.txt b/src/boost/libs/polygon/example/input_data/primary/primary_050.txt
new file mode 100644
index 000000000..7de80dee1
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_050.txt
@@ -0,0 +1,5 @@
+0 4
+2134582590 2134582590 2134582590 2141031480
+2134582590 2134582590 2141031480 2134582590
+2141031480 2134582590 2141031480 2141031480
+2134582590 2141031480 2141031480 2141031480 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_051.txt b/src/boost/libs/polygon/example/input_data/primary/primary_051.txt
new file mode 100644
index 000000000..61eb7d569
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_051.txt
@@ -0,0 +1,5 @@
+0 4
+-1073741800 -1073741800 -687194752 -1159641144
+-1073741800 -1073741800 -408021884 -923417948
+-1073741800 -1073741800 -343597376 -2061584256
+-2147483600 -837518604 -1073741800 -1073741800 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_052.txt b/src/boost/libs/polygon/example/input_data/primary/primary_052.txt
new file mode 100644
index 000000000..877def64f
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_052.txt
@@ -0,0 +1,5 @@
+0
+3
+0 0 0 -1
+0 0 1 1
+0 0 1 -1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_053.txt b/src/boost/libs/polygon/example/input_data/primary/primary_053.txt
new file mode 100644
index 000000000..8beb1d514
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_053.txt
@@ -0,0 +1,5 @@
+2
+1 0
+0 10
+1
+-2 10 -1 0 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_054.txt b/src/boost/libs/polygon/example/input_data/primary/primary_054.txt
new file mode 100644
index 000000000..4ef0f59ac
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_054.txt
@@ -0,0 +1,4 @@
+0 3
+-1073741800 -1073741800 -687194752 -1159641144
+-1073741800 -1073741800 -408021884 -923417948
+-1073741800 -1073741800 -343597376 -2061584256 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_055.txt b/src/boost/libs/polygon/example/input_data/primary/primary_055.txt
new file mode 100644
index 000000000..9f01d2fb2
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_055.txt
@@ -0,0 +1,5 @@
+0
+3
+-3 -4 -1 -2
+-2 4 4 -1
+0 -2 0 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_056.txt b/src/boost/libs/polygon/example/input_data/primary/primary_056.txt
new file mode 100644
index 000000000..886f56df6
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_056.txt
@@ -0,0 +1,5 @@
+1
+9 72
+2
+-2 0 -1 -50
+-1 -50 0 -99 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_057.txt b/src/boost/libs/polygon/example/input_data/primary/primary_057.txt
new file mode 100644
index 000000000..75aa2abc2
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_057.txt
@@ -0,0 +1,6 @@
+5
+-4 -4
+-6 0
+-2 2
+0 4
+-10 2 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_058.txt b/src/boost/libs/polygon/example/input_data/primary/primary_058.txt
new file mode 100644
index 000000000..6b4eda521
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_058.txt
@@ -0,0 +1,9 @@
+0 8
+644245092 214748364 858993456 214748364
+-644245092 -214748364 0 644245092
+-858993456 -214748364 -429496728 -644245092
+0 644245092 -214748364 644245092
+644245092 644245092 0 644245092
+858993456 858993456 644245092 644245092
+644245092 214748364 644245092 644245092
+858993456 214748364 644245092 214748364
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_059.txt b/src/boost/libs/polygon/example/input_data/primary/primary_059.txt
new file mode 100644
index 000000000..df514ff50
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_059.txt
@@ -0,0 +1,12 @@
+0 11
+214748364 -214748364 1073741820 -1073741820
+-858993456 -214748364 -858993456 0
+-214748364 -644245092 -858993456 -214748364
+0 -644245092 -214748364 -644245092
+214748364 -644245092 0 -644245092
+-858993456 0 -858993456 -214748364
+-644245092 214748364 -858993456 0
+-214748364 214748364 -214748364 0
+-214748364 0 429496728 0
+-214748364 0 -214748364 -644245092
+-214748364 -644245092 0 -644245092
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_060.txt b/src/boost/libs/polygon/example/input_data/primary/primary_060.txt
new file mode 100644
index 000000000..083894941
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_060.txt
@@ -0,0 +1,12 @@
+0 11
+1 -1 5 -5
+-4 -1 -4 0
+-1 -3 -4 -1
+0 -3 -1 -3
+1 -3 0 -3
+-4 0 -4 -1
+-3 1 -4 0
+-1 1 -1 0
+-1 0 2 0
+-1 0 -1 -3
+-1 -3 0 -3
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_061.txt b/src/boost/libs/polygon/example/input_data/primary/primary_061.txt
new file mode 100644
index 000000000..eda3d149f
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_061.txt
@@ -0,0 +1,9 @@
+0 8
+-858993456 644245092 0 -429496728
+644245092 214748364 -214748364 214748364
+0 429496728 214748364 644245092
+214748364 644245092 429496728 644245092
+429496728 644245092 644245092 858993456
+-858993456 644245092 -429496728 214748364
+-429496728 644245092 214748364 644245092
+214748364 644245092 429496728 644245092
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_062.txt b/src/boost/libs/polygon/example/input_data/primary/primary_062.txt
new file mode 100644
index 000000000..5e30486b8
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_062.txt
@@ -0,0 +1,4 @@
+0 3
+644245092 214748364 -214748364 214748364
+0 429496728 214748364 644245092
+-429496728 644245092 214748364 644245092
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_063.txt b/src/boost/libs/polygon/example/input_data/primary/primary_063.txt
new file mode 100644
index 000000000..724c6d018
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_063.txt
@@ -0,0 +1,4 @@
+0
+2
+-5 0 -1 -1
+-4 0 -6 3
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_064.txt b/src/boost/libs/polygon/example/input_data/primary/primary_064.txt
new file mode 100644
index 000000000..29d933abd
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_064.txt
@@ -0,0 +1,4 @@
+0 3
+-8 15 24 28
+-37 4 -39 36
+12 -30 44 8
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_065.txt b/src/boost/libs/polygon/example/input_data/primary/primary_065.txt
new file mode 100644
index 000000000..1614082b6
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_065.txt
@@ -0,0 +1,89 @@
+0
+87
+-50061 -49176 -49997 -49195
+-50024 -49880 -49980 -49904
+-50001 -49559 -49983 -49632
+-49990 -49437 -49931 -49440
+-49971 -49300 -49894 -49240
+-49938 -49762 -49923 -49826
+-49938 -49133 -49864 -49064
+-49923 -49874 -49852 -49836
+-49897 -49640 -49866 -49683
+-49895 -49859 -49840 -49829
+-49889 -49210 -49828 -49159
+-49857 -49380 -49795 -49428
+-49841 -49551 -49836 -49502
+-49833 -49320 -49791 -49333
+-49828 -49707 -49779 -49627
+-49821 -49526 -49800 -49565
+-49817 -49714 -49729 -49752
+-49806 -49111 -49733 -49060
+-49796 -49803 -49787 -49787
+-49761 -49652 -49679 -49721
+-49756 -49266 -49727 -49249
+-49754 -49465 -49656 -49532
+-49740 -49146 -49706 -49152
+-49726 -49236 -49710 -49163
+-49717 -49215 -49617 -49303
+-49702 -49809 -49680 -49735
+-49702 -49370 -49678 -49415
+-49677 -49849 -49636 -49917
+-49641 -49057 -49560 -49083
+-49632 -49692 -49548 -49776
+-49627 -49640 -49627 -49572
+-49626 -49932 -49565 -49834
+-49605 -49426 -49547 -49466
+-49597 -49185 -49526 -49250
+-49542 -49652 -49454 -49751
+-49540 -49283 -49471 -49298
+-49537 -49845 -49500 -49927
+-49527 -49420 -49473 -49518
+-49519 -49092 -49483 -49162
+-49517 -49235 -49442 -49292
+-49511 -49972 -49504 -49938
+-49504 -49827 -49458 -49784
+-49494 -49323 -49485 -49413
+-49481 -49509 -49443 -49578
+-49461 -49606 -49427 -49598
+-49435 -49153 -49403 -49183
+-49419 -49762 -49376 -49792
+-49417 -49832 -49334 -49899
+-49408 -49887 -49398 -49973
+-49388 -49221 -49365 -49277
+-49381 -49444 -49374 -49522
+-49379 -49434 -49336 -49457
+-49373 -49220 -49367 -49171
+-49369 -49140 -49317 -49239
+-49367 -49538 -49291 -49562
+-49364 -49102 -49293 -49109
+-49346 -49652 -49332 -49605
+-49343 -49810 -49295 -49850
+-49337 -49198 -49292 -49238
+-49322 -49092 -49309 -49041
+-49317 -49349 -49315 -49396
+-49312 -49203 -49294 -49126
+-49297 -49988 -49256 -49977
+-49295 -49580 -49213 -49491
+-49291 -49641 -49278 -49656
+-49286 -49601 -49250 -49672
+-49283 -49914 -49281 -49847
+-49281 -49590 -49250 -49601
+-49273 -49379 -49232 -49312
+-49257 -49616 -49231 -49621
+-49245 -49884 -49202 -49841
+-49234 -49059 -49156 -49135
+-49225 -49336 -49164 -49360
+-49207 -49354 -49204 -49372
+-49188 -49136 -49160 -49168
+-49171 -49946 -49108 -49855
+-49169 -49415 -49101 -49453
+-49158 -49164 -49136 -49122
+-49130 -49925 -49097 -49841
+-49127 -49675 -49047 -49676
+-49109 -49435 -49011 -49528
+-49104 -49909 -49084 -49859
+-49082 -49602 -48992 -49566
+-49073 -49130 -49002 -49081
+-49064 -49936 -49025 -49978
+-49044 -49020 -49028 -49012
+-49010 -49234 -48949 -49210
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_066.txt b/src/boost/libs/polygon/example/input_data/primary/primary_066.txt
new file mode 100644
index 000000000..45f9dd36d
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_066.txt
@@ -0,0 +1,195 @@
+0
+193
+-50004 -49132 -49976 -49143
+-50000 -49669 -49975 -49629
+-49998 -49048 -49946 -49035
+-49992 -49789 -49931 -49697
+-49987 -49783 -49900 -49859
+-49986 -49922 -49973 -49927
+-49986 -49478 -49972 -49515
+-49984 -49089 -49938 -49107
+-49983 -49675 -49963 -49734
+-49975 -49538 -49940 -49498
+-49971 -49867 -49918 -49886
+-49964 -49980 -49952 -50034
+-49952 -49566 -49904 -49592
+-49952 -49236 -49859 -49215
+-49945 -49509 -49921 -49460
+-49941 -49836 -49865 -49921
+-49940 -49321 -49932 -49403
+-49933 -49797 -49837 -49806
+-49929 -49381 -49858 -49388
+-49928 -49608 -49872 -49696
+-49927 -49805 -49902 -49825
+-49909 -49026 -49858 -48938
+-49898 -49229 -49851 -49251
+-49895 -49633 -49808 -49721
+-49886 -49687 -49837 -49759
+-49878 -49348 -49846 -49395
+-49875 -49084 -49837 -49109
+-49861 -49927 -49842 -49904
+-49857 -49151 -49830 -49181
+-49856 -49372 -49846 -49393
+-49855 -49515 -49784 -49607
+-49851 -49037 -49844 -49073
+-49845 -49220 -49790 -49301
+-49838 -49482 -49826 -49430
+-49836 -49490 -49770 -49397
+-49829 -49370 -49738 -49326
+-49805 -49616 -49781 -49647
+-49802 -49947 -49754 -49975
+-49802 -49824 -49782 -49751
+-49800 -49734 -49712 -49767
+-49795 -49462 -49730 -49430
+-49788 -49139 -49728 -49156
+-49786 -49538 -49747 -49514
+-49783 -49261 -49742 -49187
+-49775 -49133 -49752 -49051
+-49772 -49826 -49770 -49755
+-49770 -49737 -49715 -49701
+-49768 -49969 -49737 -49988
+-49768 -49289 -49708 -49270
+-49756 -49890 -49745 -49906
+-49732 -50045 -49659 -49957
+-49726 -49961 -49689 -49933
+-49725 -49584 -49701 -49520
+-49717 -49454 -49665 -49408
+-49713 -49620 -49696 -49597
+-49705 -49300 -49688 -49280
+-49702 -48946 -49619 -49011
+-49701 -49797 -49672 -49733
+-49699 -49730 -49640 -49673
+-49696 -49538 -49668 -49562
+-49695 -49454 -49644 -49509
+-49683 -49845 -49613 -49847
+-49676 -49455 -49614 -49455
+-49676 -49165 -49665 -49131
+-49669 -49436 -49618 -49397
+-49667 -49273 -49611 -49341
+-49664 -49941 -49644 -49853
+-49655 -49426 -49593 -49405
+-49650 -49039 -49592 -48996
+-49645 -49762 -49558 -49819
+-49642 -49918 -49629 -49925
+-49638 -49409 -49582 -49328
+-49636 -49743 -49559 -49805
+-49629 -49529 -49549 -49487
+-49627 -49096 -49577 -49054
+-49626 -49940 -49562 -50025
+-49612 -49466 -49574 -49398
+-49606 -49583 -49532 -49633
+-49606 -49288 -49556 -49356
+-49600 -49856 -49556 -49907
+-49594 -49166 -49546 -49148
+-49593 -49160 -49557 -49119
+-49586 -49533 -49534 -49534
+-49576 -49655 -49527 -49733
+-49571 -49468 -49564 -49410
+-49555 -49534 -49505 -49544
+-49555 -49314 -49503 -49289
+-49547 -49413 -49535 -49473
+-49543 -49984 -49462 -49886
+-49537 -49835 -49489 -49866
+-49536 -49256 -49515 -49237
+-49530 -49940 -49503 -49875
+-49510 -49342 -49485 -49366
+-49505 -49287 -49455 -49308
+-49499 -49909 -49475 -49880
+-49499 -49648 -49486 -49612
+-49489 -49785 -49482 -49851
+-49488 -49690 -49469 -49624
+-49484 -49727 -49441 -49650
+-49477 -49146 -49461 -49149
+-49474 -49433 -49401 -49411
+-49471 -49873 -49451 -49780
+-49471 -49725 -49415 -49775
+-49460 -49998 -49361 -49980
+-49458 -49621 -49448 -49561
+-49448 -49432 -49420 -49438
+-49443 -49942 -49353 -49975
+-49441 -49662 -49360 -49721
+-49439 -49313 -49375 -49361
+-49438 -49826 -49378 -49771
+-49437 -49884 -49427 -49849
+-49432 -49713 -49416 -49748
+-49423 -49035 -49363 -48938
+-49411 -49201 -49312 -49232
+-49410 -49095 -49399 -49034
+-49399 -49547 -49342 -49497
+-49399 -49230 -49390 -49259
+-49394 -49445 -49361 -49429
+-49393 -49615 -49360 -49660
+-49392 -49185 -49371 -49185
+-49392 -49020 -49390 -49005
+-49369 -49816 -49324 -49864
+-49368 -49828 -49342 -49845
+-49355 -50082 -49274 -49996
+-49354 -49414 -49270 -49512
+-49350 -49378 -49324 -49448
+-49349 -49027 -49317 -49012
+-49345 -49337 -49315 -49263
+-49344 -49983 -49278 -49977
+-49341 -49596 -49321 -49518
+-49338 -49054 -49329 -49121
+-49337 -49788 -49267 -49727
+-49333 -49258 -49320 -49275
+-49329 -49596 -49276 -49520
+-49325 -49228 -49232 -49257
+-49316 -49037 -49266 -49136
+-49313 -49612 -49267 -49604
+-49310 -49276 -49305 -49362
+-49306 -49704 -49294 -49652
+-49302 -49872 -49216 -49849
+-49286 -49089 -49225 -49139
+-49284 -49119 -49278 -49117
+-49276 -49306 -49209 -49406
+-49271 -49927 -49196 -49833
+-49264 -49696 -49176 -49674
+-49253 -49909 -49245 -49992
+-49252 -49804 -49161 -49822
+-49251 -49757 -49177 -49747
+-49249 -49603 -49150 -49595
+-49239 -49989 -49200 -49929
+-49239 -49202 -49205 -49178
+-49233 -49713 -49169 -49751
+-49225 -49327 -49210 -49359
+-49223 -49037 -49158 -48993
+-49219 -49243 -49181 -49336
+-49212 -49235 -49199 -49267
+-49211 -49912 -49138 -49959
+-49210 -49462 -49123 -49497
+-49206 -49814 -49151 -49905
+-49201 -49527 -49188 -49481
+-49190 -49120 -49173 -49206
+-49178 -49656 -49174 -49598
+-49172 -49616 -49110 -49600
+-49164 -49673 -49157 -49768
+-49161 -49414 -49096 -49406
+-49159 -49013 -49077 -49078
+-49154 -49000 -49086 -49047
+-49151 -49787 -49151 -49693
+-49143 -49651 -49123 -49683
+-49141 -49982 -49100 -49949
+-49138 -49607 -49117 -49583
+-49128 -49565 -49115 -49499
+-49123 -49412 -49040 -49426
+-49121 -49732 -49103 -49690
+-49117 -49724 -49102 -49688
+-49114 -49206 -49075 -49124
+-49110 -49937 -49030 -49889
+-49109 -49215 -49071 -49305
+-49092 -49527 -49056 -49604
+-49091 -49133 -49057 -49070
+-49089 -49036 -49022 -49076
+-49079 -49254 -49019 -49331
+-49077 -49768 -49042 -49804
+-49060 -49611 -49029 -49677
+-49060 -49083 -49052 -49170
+-49054 -49751 -49041 -49789
+-49047 -49846 -48991 -49882
+-49045 -49567 -48976 -49528
+-49043 -49787 -49000 -49864
+-49038 -49415 -49028 -49463
+-49033 -49721 -48973 -49756
+-49009 -49823 -48919 -49827
+-49008 -49022 -48959 -49051
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_067.txt b/src/boost/libs/polygon/example/input_data/primary/primary_067.txt
new file mode 100644
index 000000000..0278f75b8
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_067.txt
@@ -0,0 +1,193 @@
+0
+191
+-50042 -49987 -49958 -49945
+-50038 -49880 -49984 -49840
+-50037 -49252 -49945 -49166
+-50037 -49056 -49996 -49148
+-50032 -49217 -49997 -49201
+-50026 -49270 -49960 -49312
+-50015 -49525 -49981 -49615
+-49999 -49338 -49906 -49318
+-49987 -49179 -49967 -49165
+-49979 -49752 -49915 -49671
+-49969 -49530 -49933 -49592
+-49951 -49784 -49879 -49749
+-49951 -49221 -49901 -49194
+-49946 -49228 -49884 -49303
+-49945 -49017 -49892 -49044
+-49942 -49455 -49940 -49549
+-49935 -49727 -49867 -49646
+-49935 -49357 -49857 -49444
+-49929 -49561 -49868 -49576
+-49927 -49909 -49877 -49866
+-49917 -49237 -49913 -49230
+-49914 -49291 -49888 -49357
+-49911 -49876 -49902 -49845
+-49898 -49977 -49854 -49895
+-49898 -49495 -49817 -49490
+-49894 -50000 -49824 -50069
+-49893 -49680 -49865 -49692
+-49882 -49217 -49795 -49150
+-49873 -49323 -49831 -49278
+-49865 -49067 -49777 -49100
+-49859 -49115 -49822 -49170
+-49856 -49764 -49847 -49787
+-49855 -49475 -49796 -49446
+-49847 -49503 -49826 -49601
+-49847 -49227 -49774 -49288
+-49838 -49679 -49810 -49646
+-49821 -49704 -49807 -49760
+-49818 -49528 -49797 -49532
+-49812 -49585 -49753 -49537
+-49805 -49866 -49749 -49911
+-49803 -49243 -49742 -49282
+-49795 -49351 -49763 -49446
+-49790 -49322 -49768 -49409
+-49788 -49759 -49766 -49695
+-49780 -49048 -49765 -49147
+-49773 -49459 -49741 -49530
+-49764 -49068 -49746 -49104
+-49762 -49163 -49758 -49119
+-49760 -49208 -49715 -49126
+-49756 -49583 -49713 -49539
+-49754 -49728 -49690 -49715
+-49752 -49643 -49686 -49622
+-49748 -49983 -49653 -49989
+-49735 -49490 -49710 -49475
+-49733 -49426 -49649 -49404
+-49730 -49073 -49701 -49052
+-49727 -49005 -49681 -48996
+-49722 -49757 -49687 -49773
+-49702 -49179 -49668 -49222
+-49701 -49141 -49666 -49086
+-49698 -49353 -49683 -49290
+-49696 -49526 -49669 -49525
+-49692 -49988 -49637 -50061
+-49691 -49859 -49676 -49844
+-49690 -49445 -49637 -49414
+-49682 -49552 -49675 -49610
+-49679 -49853 -49671 -49918
+-49677 -49383 -49616 -49389
+-49673 -49827 -49666 -49784
+-49663 -49990 -49626 -50052
+-49661 -49742 -49639 -49842
+-49655 -49070 -49627 -48996
+-49650 -49495 -49585 -49491
+-49649 -49907 -49584 -49945
+-49645 -49253 -49640 -49189
+-49644 -49285 -49555 -49253
+-49643 -49740 -49592 -49686
+-49640 -49281 -49602 -49182
+-49630 -49389 -49536 -49479
+-49622 -49335 -49554 -49292
+-49619 -49538 -49606 -49522
+-49606 -49039 -49535 -49096
+-49602 -49383 -49599 -49328
+-49600 -49700 -49596 -49691
+-49599 -49612 -49531 -49514
+-49599 -49560 -49546 -49483
+-49592 -49206 -49563 -49198
+-49588 -49783 -49564 -49811
+-49575 -49789 -49486 -49772
+-49570 -49179 -49482 -49278
+-49557 -49225 -49506 -49269
+-49552 -49621 -49524 -49654
+-49540 -49058 -49532 -49085
+-49534 -49873 -49522 -49964
+-49532 -49626 -49502 -49607
+-49530 -49638 -49432 -49539
+-49527 -49420 -49478 -49505
+-49526 -49716 -49439 -49744
+-49508 -49372 -49498 -49454
+-49508 -49301 -49468 -49382
+-49507 -49275 -49459 -49371
+-49497 -49840 -49422 -49895
+-49494 -49252 -49451 -49251
+-49480 -49732 -49452 -49803
+-49472 -49036 -49460 -49129
+-49459 -49831 -49391 -49775
+-49456 -49427 -49390 -49409
+-49453 -49001 -49452 -48918
+-49441 -48971 -49380 -49025
+-49438 -49914 -49388 -49964
+-49430 -49525 -49342 -49457
+-49427 -49116 -49393 -49180
+-49424 -49378 -49339 -49293
+-49420 -49667 -49378 -49577
+-49419 -49208 -49392 -49286
+-49417 -49885 -49407 -49797
+-49417 -49327 -49345 -49285
+-49404 -49689 -49389 -49637
+-49399 -49430 -49320 -49375
+-49399 -49238 -49370 -49259
+-49394 -49946 -49367 -49866
+-49388 -49703 -49362 -49664
+-49385 -49785 -49311 -49789
+-49382 -49166 -49378 -49154
+-49375 -49211 -49344 -49286
+-49374 -49997 -49313 -50051
+-49367 -49941 -49348 -49969
+-49364 -49787 -49340 -49887
+-49359 -49232 -49315 -49203
+-49351 -49957 -49323 -49869
+-49349 -48969 -49303 -49026
+-49344 -49030 -49342 -49116
+-49333 -49248 -49326 -49316
+-49304 -49695 -49210 -49737
+-49301 -49643 -49244 -49656
+-49300 -49907 -49242 -49908
+-49295 -49272 -49231 -49194
+-49293 -49026 -49291 -48987
+-49290 -49992 -49244 -49950
+-49287 -49539 -49265 -49542
+-49278 -49142 -49261 -49117
+-49277 -49304 -49216 -49313
+-49272 -49800 -49251 -49769
+-49270 -49894 -49239 -49809
+-49269 -49397 -49196 -49319
+-49268 -49911 -49171 -49902
+-49257 -49050 -49208 -49086
+-49250 -49780 -49178 -49731
+-49239 -49113 -49166 -49120
+-49237 -49247 -49203 -49166
+-49230 -49019 -49194 -49061
+-49217 -49465 -49215 -49528
+-49213 -49605 -49116 -49548
+-49212 -49846 -49211 -49815
+-49209 -49912 -49171 -49955
+-49203 -49685 -49188 -49672
+-49203 -49234 -49147 -49333
+-49201 -49854 -49116 -49916
+-49200 -49087 -49190 -49045
+-49188 -49258 -49133 -49220
+-49179 -49615 -49150 -49581
+-49179 -49568 -49137 -49507
+-49168 -49326 -49114 -49385
+-49164 -50078 -49090 -49990
+-49164 -49498 -49157 -49409
+-49160 -49807 -49085 -49875
+-49158 -49601 -49136 -49624
+-49156 -49015 -49063 -49081
+-49155 -49894 -49135 -49907
+-49150 -49949 -49107 -49930
+-49150 -49143 -49147 -49210
+-49149 -49896 -49076 -49946
+-49147 -49219 -49094 -49155
+-49132 -49474 -49113 -49509
+-49129 -49400 -49052 -49347
+-49114 -49721 -49082 -49630
+-49113 -49663 -49106 -49585
+-49109 -49241 -49091 -49330
+-49107 -49230 -49067 -49179
+-49106 -49585 -49097 -49487
+-49104 -49006 -49077 -49043
+-49083 -49910 -49080 -49941
+-49069 -49028 -49010 -48971
+-49068 -49800 -49050 -49796
+-49045 -49223 -49029 -49273
+-49043 -49598 -48998 -49619
+-49037 -49738 -49031 -49678
+-49037 -49062 -49024 -49129
+-49033 -49407 -49023 -49483
+-49008 -49795 -48973 -49798
+-49003 -49428 -48993 -49376
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_068.txt b/src/boost/libs/polygon/example/input_data/primary/primary_068.txt
new file mode 100644
index 000000000..0684c8150
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_068.txt
@@ -0,0 +1,98 @@
+0
+87
+-50021 -49808 -49940 -49833
+-50019 -49363 -49964 -49351
+-49963 -49703 -49912 -49721
+-49948 -49289 -49940 -49212
+-49916 -49137 -49870 -49141
+-49906 -49419 -49873 -49349
+-49903 -49328 -49899 -49307
+-49897 -49741 -49852 -49675
+-49895 -49638 -49828 -49568
+-49893 -49251 -49855 -49313
+-49871 -49502 -49801 -49551
+-49866 -49431 -49834 -49524
+-49861 -49122 -49812 -49030
+-49852 -49901 -49814 -49872
+-49815 -49601 -49716 -49652
+-49799 -49916 -49785 -49916
+-49766 -49501 -49745 -49523
+-49765 -49266 -49672 -49282
+-49763 -49207 -49681 -49170
+-49756 -49650 -49744 -49699
+-49748 -49703 -49663 -49657
+-49736 -49581 -49683 -49534
+-49736 -49463 -49700 -49534
+-49732 -49049 -49674 -49119
+-49722 -49992 -49694 -49963
+-49710 -49415 -49648 -49378
+-49710 -49298 -49670 -49339
+-49688 -49985 -49652 -50004
+-49684 -49416 -49634 -49459
+-49659 -49561 -49573 -49550
+-49654 -49211 -49613 -49161
+-49638 -49058 -49576 -49104
+-49624 -49012 -49543 -49051
+-49621 -49341 -49619 -49317
+-49608 -49406 -49593 -49379
+-49599 -49228 -49538 -49293
+-49598 -49634 -49527 -49534
+-49594 -49713 -49523 -49729
+-49586 -49735 -49580 -49724
+-49564 -49184 -49531 -49109
+-49560 -49651 -49528 -49579
+-49552 -49739 -49457 -49829
+-49549 -49938 -49543 -49953
+-49517 -49670 -49480 -49763
+-49508 -49076 -49493 -49008
+-49507 -49467 -49451 -49459
+-49478 -49308 -49439 -49383
+-49477 -48995 -49393 -49025
+-49468 -49237 -49401 -49183
+-49464 -49517 -49393 -49532
+-49453 -49670 -49395 -49751
+-49448 -49430 -49367 -49380
+-49434 -49371 -49403 -49302
+-49422 -49836 -49384 -49882
+-49408 -49095 -49396 -49110
+-49387 -49237 -49366 -49277
+-49368 -49766 -49365 -49777
+-49366 -49860 -49280 -49911
+-49359 -49526 -49355 -49554
+-49352 -49281 -49275 -49187
+-49346 -49424 -49327 -49370
+-49346 -48957 -49257 -49045
+-49344 -49529 -49311 -49595
+-49344 -49131 -49270 -49077
+-49331 -49505 -49276 -49470
+-49275 -49446 -49269 -49529
+-49274 -48994 -49239 -49083
+-49269 -49530 -49266 -49579
+-49268 -49916 -49229 -49923
+-49254 -49830 -49233 -49777
+-49214 -49820 -49168 -49806
+-49214 -49246 -49207 -49200
+-49209 -49470 -49159 -49503
+-49203 -49239 -49121 -49256
+-49186 -49302 -49156 -49306
+-49185 -49612 -49130 -49664
+-49158 -49718 -49100 -49653
+-49155 -49271 -49056 -49347
+-49138 -49437 -49061 -49374
+-49137 -49475 -49136 -49540
+-49126 -49059 -49069 -49056
+-49113 -49751 -49072 -49794
+-49102 -49977 -49024 -49998
+-49070 -49161 -49052 -49212
+-49053 -49902 -49030 -49948
+-49048 -49413 -49004 -49497
+-49021 -49751 -49015 -49668
+-49478.582149386399 -49780.216848801821
+-49394.596858638746 -49830.083115183246
+-49404.712650811380 -49872.695164891658
+-49392.218561523550 -49808.669479018703
+../../SOC_2010/sweepline/libs/sweepline/test/sweepline_test.cpp(703): error in "segment_random_test2<double>": check verify_output(test_output_small, NO_HALF_EDGE_INTERSECTIONS) == true failed [false != true]
+-49478.582149386399 -49780.216848801821
+-49394.596858638746 -49830.083115183246
+-49404.712650811380 -49872.695164891658
+-49392.218561523550 -49808.669479018703
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_069.txt b/src/boost/libs/polygon/example/input_data/primary/primary_069.txt
new file mode 100644
index 000000000..0fbf4bcb3
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_069.txt
@@ -0,0 +1,83 @@
+0
+81
+-50026 -49688 -49978 -49701
+-49998 -49860 -49969 -49782
+-49974 -49744 -49897 -49748
+-49972 -49661 -49971 -49727
+-49971 -49845 -49902 -49789
+-49967 -49338 -49934 -49244
+-49947 -49670 -49896 -49744
+-49939 -49502 -49885 -49564
+-49937 -49150 -49874 -49115
+-49930 -49608 -49885 -49665
+-49925 -48976 -49888 -49019
+-49919 -49430 -49851 -49399
+-49909 -49052 -49908 -49015
+-49902 -49341 -49895 -49344
+-49899 -49717 -49827 -49792
+-49878 -49284 -49790 -49223
+-49844 -49250 -49784 -49171
+-49792 -49805 -49708 -49872
+-49781 -49381 -49727 -49379
+-49772 -49162 -49702 -49126
+-49768 -49290 -49696 -49324
+-49764 -49266 -49705 -49194
+-49737 -49279 -49659 -49200
+-49701 -49846 -49640 -49812
+-49699 -49415 -49670 -49409
+-49694 -49710 -49670 -49623
+-49688 -49732 -49653 -49759
+-49682 -49014 -49675 -49030
+-49679 -49421 -49641 -49428
+-49671 -49124 -49659 -49117
+-49642 -49113 -49599 -49063
+-49639 -49409 -49547 -49439
+-49629 -49070 -49595 -49043
+-49616 -49830 -49532 -49887
+-49616 -49438 -49544 -49519
+-49615 -49093 -49574 -49097
+-49610 -49583 -49587 -49491
+-49608 -49736 -49550 -49812
+-49599 -49403 -49520 -49408
+-49588 -49924 -49576 -49918
+-49579 -50064 -49483 -49994
+-49559 -49800 -49506 -49870
+-49552 -49543 -49534 -49570
+-49541 -49937 -49469 -49920
+-49513 -49782 -49494 -49816
+-49509 -49996 -49472 -49955
+-49509 -49892 -49452 -49796
+-49482 -50051 -49468 -49972
+-49419 -49411 -49371 -49424
+-49411 -49494 -49328 -49567
+-49407 -49584 -49358 -49547
+-49399 -49236 -49341 -49168
+-49370 -49205 -49284 -49121
+-49364 -49032 -49355 -49119
+-49363 -49029 -49302 -49048
+-49340 -49544 -49242 -49472
+-49335 -49800 -49325 -49866
+-49334 -49786 -49282 -49798
+-49323 -49685 -49229 -49765
+-49311 -49777 -49247 -49789
+-49305 -49633 -49283 -49631
+-49300 -49574 -49261 -49601
+-49295 -49245 -49286 -49278
+-49275 -49861 -49223 -49778
+-49261 -49054 -49235 -49029
+-49260 -49355 -49228 -49436
+-49248 -49991 -49198 -49926
+-49236 -49618 -49152 -49637
+-49225 -50042 -49179 -49961
+-49190 -49250 -49108 -49308
+-49189 -49609 -49168 -49578
+-49164 -49936 -49133 -49922
+-49124 -49640 -49057 -49695
+-49117 -49169 -49041 -49213
+-49111 -49802 -49099 -49894
+-49105 -49697 -49053 -49738
+-49082 -49532 -49031 -49559
+-49063 -49321 -49007 -49234
+-49032 -49130 -48987 -49200
+-49025 -49437 -48988 -49427
+-49008 -49119 -48968 -49214
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_070.txt b/src/boost/libs/polygon/example/input_data/primary/primary_070.txt
new file mode 100644
index 000000000..df3e8f92d
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_070.txt
@@ -0,0 +1,5 @@
+1
+-49400 -49572
+2
+-49431 -49703 -49427 -49798
+-49427 -49798 -49423 -49892 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_071.txt b/src/boost/libs/polygon/example/input_data/primary/primary_071.txt
new file mode 100644
index 000000000..a09a125c7
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_071.txt
@@ -0,0 +1,94 @@
+0
+90
+-50051 -49552 -49991 -49625
+-50042 -49515 -49976 -49442
+-50024 -49188 -49996 -49221
+-50007 -49191 -49933 -49159
+-50000 -49509 -49989 -49549
+-49991 -49047 -49950 -49120
+-49984 -49938 -49909 -49904
+-49959 -49631 -49908 -49568
+-49954 -49626 -49887 -49595
+-49949 -49320 -49859 -49414
+-49916 -49188 -49859 -49241
+-49906 -49611 -49830 -49675
+-49905 -49754 -49847 -49843
+-49892 -49327 -49848 -49239
+-49882 -49416 -49872 -49486
+-49871 -49640 -49797 -49703
+-49846 -49283 -49821 -49368
+-49767 -49927 -49707 -49928
+-49765 -49619 -49762 -49671
+-49764 -49476 -49721 -49531
+-49753 -49486 -49691 -49491
+-49738 -49590 -49712 -49679
+-49736 -49108 -49686 -49138
+-49736 -49008 -49671 -48932
+-49724 -49802 -49627 -49770
+-49717 -49691 -49694 -49699
+-49714 -49152 -49708 -49200
+-49707 -49875 -49621 -49790
+-49700 -49062 -49648 -49109
+-49684 -49680 -49611 -49740
+-49654 -49456 -49562 -49400
+-49611 -49270 -49584 -49339
+-49585 -49234 -49567 -49210
+-49578 -49012 -49527 -49080
+-49561 -49658 -49538 -49670
+-49536 -49144 -49445 -49082
+-49523 -49784 -49500 -49868
+-49509 -49742 -49424 -49733
+-49508 -49070 -49472 -49092
+-49490 -49176 -49439 -49082
+-49477 -49856 -49475 -49779
+-49467 -49051 -49446 -49014
+-49462 -49793 -49457 -49818
+-49460 -49642 -49381 -49620
+-49444 -49977 -49349 -50073
+-49444 -49973 -49396 -49915
+-49425 -49114 -49363 -49182
+-49424 -49002 -49351 -49096
+-49400 -49470 -49311 -49557
+-49392 -49631 -49324 -49704
+-49375 -49195 -49281 -49123
+-49361 -49096 -49314 -49143
+-49345 -49402 -49256 -49437
+-49339 -49476 -49298 -49437
+-49324 -49287 -49242 -49273
+-49290 -49579 -49252 -49548
+-49280 -49601 -49217 -49612
+-49268 -49108 -49169 -49112
+-49257 -49481 -49241 -49480
+-49248 -49521 -49233 -49580
+-49246 -49802 -49245 -49893
+-49236 -49292 -49205 -49336
+-49220 -49157 -49210 -49143
+-49209 -49367 -49171 -49405
+-49205 -49883 -49176 -49926
+-49204 -49128 -49131 -49099
+-49200 -49252 -49128 -49166
+-49194 -49507 -49189 -49496
+-49185 -49344 -49140 -49354
+-49183 -49895 -49144 -49867
+-49183 -49289 -49135 -49213
+-49177 -49192 -49168 -49158
+-49140 -49876 -49120 -49924
+-49140 -49855 -49116 -49874
+-49138 -49132 -49081 -49142
+-49127 -49293 -49090 -49363
+-49096 -49761 -49037 -49744
+-49096 -49101 -49081 -49093
+-49090 -49308 -49083 -49401
+-49086 -49605 -49074 -49539
+-49084 -49865 -49059 -49795
+-49084 -49124 -48989 -49171
+-49077 -49034 -49067 -49009
+-49069 -49979 -49067 -49965
+-49063 -49317 -49050 -49248
+-49036 -49851 -49002 -49942
+-49032 -49126 -49003 -49097
+-49025 -49181 -48951 -49179
+-49022 -49065 -48973 -49118
+-49018 -49876 -48988 -49875
+../../SOC_2010/sweepline/libs/sweepline/test/sweepline_test.cpp(723): error in "segment_random_test2<double>": check test_output_small.num_vertex_records() == test_output_large.num_vertex_records() failed [476 != 526]
+../../SOC_2010/sweepline/libs/sweepline/test/sweepline_test.cpp(725): error in "segment_random_test2<double>": check test_output_small.num_edge_records() == test_output_large.num_edge_records() failed [734 != 795]
diff --git a/src/boost/libs/polygon/example/input_data/primary/primary_072.txt b/src/boost/libs/polygon/example/input_data/primary/primary_072.txt
new file mode 100644
index 000000000..a43fcf3a6
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/primary/primary_072.txt
@@ -0,0 +1,5 @@
+0
+3
+1403829871 74 1403829871 275
+1403829871 275 1403829741 275
+1403829741 275 1403829744 73 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/random/random_001.txt b/src/boost/libs/polygon/example/input_data/random/random_001.txt
new file mode 100644
index 000000000..04742bb03
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_001.txt
@@ -0,0 +1,11 @@
+10
+9 1
+4 3
+9 6
+9 8
+3 9
+6 8
+0 5
+9 5
+3 0
+2 1 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/random/random_002.txt b/src/boost/libs/polygon/example/input_data/random/random_002.txt
new file mode 100644
index 000000000..72905d18c
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_002.txt
@@ -0,0 +1,11 @@
+10
+9 9
+2 6
+3 1
+6 4
+9 1
+9 7
+6 2
+2 4
+3 7
+6 7 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/random/random_003.txt b/src/boost/libs/polygon/example/input_data/random/random_003.txt
new file mode 100644
index 000000000..395e24d54
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_003.txt
@@ -0,0 +1,11 @@
+10
+4 1
+5 4
+5 5
+2 6
+3 4
+0 7
+2 5
+8 9
+0 4
+2 7 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/random/random_004.txt b/src/boost/libs/polygon/example/input_data/random/random_004.txt
new file mode 100644
index 000000000..b287e9328
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_004.txt
@@ -0,0 +1,101 @@
+100
+29 76
+99 94
+74 20
+53 26
+95 55
+94 21
+50 70
+19 93
+31 30
+73 61
+87 23
+60 66
+51 29
+82 51
+74 40
+31 77
+1 82
+43 0
+58 67
+63 32
+19 90
+68 31
+49 63
+76 83
+72 20
+70 11
+80 23
+4 90
+32 56
+63 75
+51 71
+62 10
+80 57
+71 47
+2 8
+67 85
+64 72
+85 6
+53 91
+92 25
+95 79
+24 6
+1 10
+10 85
+11 30
+22 14
+48 55
+82 8
+14 54
+84 60
+33 91
+85 60
+65 81
+60 23
+10 44
+29 32
+21 11
+90 15
+73 71
+41 62
+9 36
+44 80
+27 39
+41 38
+25 23
+86 15
+4 76
+52 6
+39 97
+42 25
+93 93
+97 24
+13 16
+58 62
+48 78
+43 74
+99 85
+13 42
+8 82
+13 9
+51 50
+85 83
+30 11
+58 42
+44 32
+88 74
+37 21
+65 28
+79 94
+50 94
+38 83
+82 13
+30 88
+16 92
+73 66
+24 0
+40 82
+57 25
+55 88
+13 33 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/random/random_005.txt b/src/boost/libs/polygon/example/input_data/random/random_005.txt
new file mode 100644
index 000000000..427ee9cf6
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_005.txt
@@ -0,0 +1,101 @@
+100
+-901943112 1116691472
+2104533928 1889785568
+1030792128 -1288490160
+128849016 -1030792128
+1932735240 214748360
+1889785568 -1245540488
+0 858993440
+-1331439832 1846835896
+-816043768 -858993440
+987842456 472446392
+1589137864 -1159641144
+429496720 687194752
+42949672 -901943112
+1374389504 42949672
+1030792128 -429496720
+-816043768 1159641144
+-2104533928 1374389504
+-300647704 -2147483600
+343597376 730144424
+558345736 -773094096
+-1331439832 1717986880
+773094096 -816043768
+-42949672 558345736
+1116691472 1417339176
+944892784 -1288490160
+858993440 -1675037208
+1288490160 -1159641144
+-1975684912 1717986880
+-773094096 257698032
+558345736 1073741800
+42949672 901943112
+515396064 -1717986880
+1288490160 300647704
+901943112 -128849016
+-2061584256 -1803886224
+730144424 1503238520
+601295408 944892784
+1503238520 -1889785568
+128849016 1760936552
+1803886224 -1073741800
+1932735240 1245540488
+-1116691472 -1889785568
+-2104533928 -1717986880
+-1717986880 1503238520
+-1675037208 -858993440
+-1202590816 -1546188192
+-85899344 214748360
+1374389504 -1803886224
+-1546188192 171798688
+1460288848 429496720
+-730144424 1760936552
+1503238520 429496720
+644245080 1331439832
+429496720 -1159641144
+-1717986880 -257698032
+-901943112 -773094096
+-1245540488 -1675037208
+1717986880 -1503238520
+987842456 901943112
+-386547048 515396064
+-1760936552 -601295408
+-257698032 1288490160
+-987842456 -472446392
+-386547048 -515396064
+-1073741800 -1159641144
+1546188192 -1503238520
+-1975684912 1116691472
+85899344 -1889785568
+-472446392 2018634584
+-343597376 -1073741800
+1846835896 1846835896
+2018634584 -1116691472
+-1589137864 -1460288848
+343597376 515396064
+-85899344 1202590816
+-300647704 1030792128
+2104533928 1503238520
+-1589137864 -343597376
+-1803886224 1374389504
+-1589137864 -1760936552
+42949672 0
+1503238520 1417339176
+-858993440 -1675037208
+343597376 -343597376
+-257698032 -773094096
+1632087536 1030792128
+-558345736 -1245540488
+644245080 -944892784
+1245540488 1889785568
+0 1889785568
+-515396064 1417339176
+1374389504 -1589137864
+-858993440 1632087536
+-1460288848 1803886224
+987842456 687194752
+-1116691472 -2147483600
+-429496720 1374389504
+300647704 -1073741800
+214748360 1632087536
+-1589137864 -730144424 \ No newline at end of file
diff --git a/src/boost/libs/polygon/example/input_data/random/random_006.txt b/src/boost/libs/polygon/example/input_data/random/random_006.txt
new file mode 100644
index 000000000..700f222b1
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_006.txt
@@ -0,0 +1,6 @@
+0
+4
+-27 -32 5 -21
+-18 41 27 9
+-17 -25 12 9
+27 0 40 -20
diff --git a/src/boost/libs/polygon/example/input_data/random/random_007.txt b/src/boost/libs/polygon/example/input_data/random/random_007.txt
new file mode 100644
index 000000000..f4270e3e2
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_007.txt
@@ -0,0 +1,6 @@
+0
+4
+-48 10 -17 19
+-35 -30 -33 -2
+13 -45 18 46
+31 -14 47 18
diff --git a/src/boost/libs/polygon/example/input_data/random/random_008.txt b/src/boost/libs/polygon/example/input_data/random/random_008.txt
new file mode 100644
index 000000000..5263a53fd
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_008.txt
@@ -0,0 +1,6 @@
+0
+4
+-34 7 -21 13
+-9 37 39 10
+7 21 26 -18
+8 45 47 22
diff --git a/src/boost/libs/polygon/example/input_data/random/random_009.txt b/src/boost/libs/polygon/example/input_data/random/random_009.txt
new file mode 100644
index 000000000..b49d69d8f
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_009.txt
@@ -0,0 +1,7 @@
+0
+5
+-21 -9 -9 -34
+-20 1 11 43
+-3 -1 21 18
+34 -18 40 15
+47 43 48 -7
diff --git a/src/boost/libs/polygon/example/input_data/random/random_010.txt b/src/boost/libs/polygon/example/input_data/random/random_010.txt
new file mode 100644
index 000000000..73e87f801
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_010.txt
@@ -0,0 +1,5 @@
+0
+3
+-39 -43 -6 -22
+13 -21 33 38
+24 -42 42 43
diff --git a/src/boost/libs/polygon/example/input_data/random/random_011.txt b/src/boost/libs/polygon/example/input_data/random/random_011.txt
new file mode 100644
index 000000000..178dfba3c
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_011.txt
@@ -0,0 +1,7 @@
+0
+5
+-22 -18 -13 -26
+-16 -36 23 -28
+-12 -11 6 19
+-4 -3 44 -30
+15 -5 47 17
diff --git a/src/boost/libs/polygon/example/input_data/random/random_012.txt b/src/boost/libs/polygon/example/input_data/random/random_012.txt
new file mode 100644
index 000000000..c1959b731
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_012.txt
@@ -0,0 +1,6 @@
+0
+4
+-27 -24 -20 -45
+-15 29 28 20
+-12 -36 19 -21
+1 -21 3 -1
diff --git a/src/boost/libs/polygon/example/input_data/random/random_013.txt b/src/boost/libs/polygon/example/input_data/random/random_013.txt
new file mode 100644
index 000000000..e379eada3
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_013.txt
@@ -0,0 +1,6 @@
+0
+4
+-47 11 -25 -20
+-17 2 3 -46
+-13 29 32 -35
+25 -3 42 37
diff --git a/src/boost/libs/polygon/example/input_data/random/random_014.txt b/src/boost/libs/polygon/example/input_data/random/random_014.txt
new file mode 100644
index 000000000..bb01d6d9a
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_014.txt
@@ -0,0 +1,7 @@
+0
+5
+-36 -8 -18 24
+-17 44 -2 18
+-16 -7 -9 -28
+-14 5 -2 -20
+31 42 33 36
diff --git a/src/boost/libs/polygon/example/input_data/random/random_015.txt b/src/boost/libs/polygon/example/input_data/random/random_015.txt
new file mode 100644
index 000000000..0ae016b0d
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_015.txt
@@ -0,0 +1,5 @@
+0
+3
+-24 17 -19 -12
+-21 -40 3 -17
+28 1 38 -38
diff --git a/src/boost/libs/polygon/example/input_data/random/random_016.txt b/src/boost/libs/polygon/example/input_data/random/random_016.txt
new file mode 100644
index 000000000..7c04741fe
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_016.txt
@@ -0,0 +1,8 @@
+0
+6
+-44 -29 -36 -40
+-40 0 -5 -43
+-7 37 -3 -23
+-4 18 14 30
+6 39 38 32
+12 -20 27 -15
diff --git a/src/boost/libs/polygon/example/input_data/random/random_017.txt b/src/boost/libs/polygon/example/input_data/random/random_017.txt
new file mode 100644
index 000000000..267e54168
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_017.txt
@@ -0,0 +1,5 @@
+0
+3
+-46 -50 -36 -14
+-5 46 -4 -40
+21 45 49 -45
diff --git a/src/boost/libs/polygon/example/input_data/random/random_018.txt b/src/boost/libs/polygon/example/input_data/random/random_018.txt
new file mode 100644
index 000000000..980c7f616
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_018.txt
@@ -0,0 +1,7 @@
+0
+5
+-45 44 -36 -29
+-36 41 -32 -14
+-16 44 23 9
+13 -4 19 -29
+18 -3 48 39
diff --git a/src/boost/libs/polygon/example/input_data/random/random_019.txt b/src/boost/libs/polygon/example/input_data/random/random_019.txt
new file mode 100644
index 000000000..011dbaee2
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_019.txt
@@ -0,0 +1,7 @@
+0
+5
+-29 22 -6 18
+-6 -20 18 19
+-5 28 44 22
+9 -48 22 -15
+11 32 11 39
diff --git a/src/boost/libs/polygon/example/input_data/random/random_020.txt b/src/boost/libs/polygon/example/input_data/random/random_020.txt
new file mode 100644
index 000000000..77b694722
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_020.txt
@@ -0,0 +1,7 @@
+0
+5
+-14 -43 37 -49
+-12 41 -10 -43
+-7 -20 18 -38
+7 34 47 -38
+23 26 42 -3
diff --git a/src/boost/libs/polygon/example/input_data/random/random_021.txt b/src/boost/libs/polygon/example/input_data/random/random_021.txt
new file mode 100644
index 000000000..f959ec61f
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_021.txt
@@ -0,0 +1,7 @@
+0
+5
+-47 32 0 28
+-20 -22 9 -13
+-13 37 21 30
+-7 47 2 47
+26 47 32 1
diff --git a/src/boost/libs/polygon/example/input_data/random/random_022.txt b/src/boost/libs/polygon/example/input_data/random/random_022.txt
new file mode 100644
index 000000000..e8fa87c15
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_022.txt
@@ -0,0 +1,5 @@
+0
+3
+-19 17 -10 9
+-1 -50 25 40
+26 15 48 -3
diff --git a/src/boost/libs/polygon/example/input_data/random/random_023.txt b/src/boost/libs/polygon/example/input_data/random/random_023.txt
new file mode 100644
index 000000000..1d27d9821
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_023.txt
@@ -0,0 +1,8 @@
+0
+6
+-41 -46 -20 -48
+-41 -22 10 -46
+-27 36 28 19
+-10 -10 28 -15
+13 -28 48 -19
+41 -20 47 1
diff --git a/src/boost/libs/polygon/example/input_data/random/random_024.txt b/src/boost/libs/polygon/example/input_data/random/random_024.txt
new file mode 100644
index 000000000..401f12597
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_024.txt
@@ -0,0 +1,7 @@
+0
+5
+-29 26 24 -46
+-24 -48 -15 -19
+-15 -20 -2 -23
+-9 -30 0 -42
+3 21 24 43
diff --git a/src/boost/libs/polygon/example/input_data/random/random_025.txt b/src/boost/libs/polygon/example/input_data/random/random_025.txt
new file mode 100644
index 000000000..4d3ca29d5
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_025.txt
@@ -0,0 +1,4 @@
+0
+2
+-8 -34 29 22
+37 10 48 7
diff --git a/src/boost/libs/polygon/example/input_data/random/random_026.txt b/src/boost/libs/polygon/example/input_data/random/random_026.txt
new file mode 100644
index 000000000..c35bfd7cd
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_026.txt
@@ -0,0 +1,6 @@
+0
+4
+-35 -28 19 26
+-21 16 -19 -4
+9 -34 27 3
+25 48 47 -31
diff --git a/src/boost/libs/polygon/example/input_data/random/random_027.txt b/src/boost/libs/polygon/example/input_data/random/random_027.txt
new file mode 100644
index 000000000..ce38d7a85
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_027.txt
@@ -0,0 +1,8 @@
+0
+6
+-45 46 -24 24
+-37 30 -36 -7
+-18 -47 -4 -14
+-3 -34 40 -33
+5 17 44 -26
+35 -16 45 9
diff --git a/src/boost/libs/polygon/example/input_data/random/random_028.txt b/src/boost/libs/polygon/example/input_data/random/random_028.txt
new file mode 100644
index 000000000..46952bd8a
--- /dev/null
+++ b/src/boost/libs/polygon/example/input_data/random/random_028.txt
@@ -0,0 +1,7 @@
+0
+5
+-30 -27 -18 16
+-14 47 0 -46
+-13 42 13 20
+-10 26 7 -42
+-2 22 22 -42
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_001.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_001.png
new file mode 100644
index 000000000..abb16faca
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_001.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_002.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_002.png
new file mode 100644
index 000000000..3e707daf7
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_002.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_003.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_003.png
new file mode 100644
index 000000000..de62fd7db
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_003.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_004.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_004.png
new file mode 100644
index 000000000..a89a45245
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_004.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_005.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_005.png
new file mode 100644
index 000000000..2b26dcc37
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_005.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_006.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_006.png
new file mode 100644
index 000000000..2fbdcb737
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_006.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_007.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_007.png
new file mode 100644
index 000000000..74fcec91a
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_007.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_008.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_008.png
new file mode 100644
index 000000000..17105a1fc
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_008.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_009.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_009.png
new file mode 100644
index 000000000..b5423620f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_009.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_010.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_010.png
new file mode 100644
index 000000000..a1d1984e6
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_010.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_011.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_011.png
new file mode 100644
index 000000000..3b689b466
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_011.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/polygon/polygon_012.png b/src/boost/libs/polygon/example/output_data/polygon/polygon_012.png
new file mode 100644
index 000000000..1e3f916d4
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_012.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_001.png b/src/boost/libs/polygon/example/output_data/primary/primary_001.png
new file mode 100644
index 000000000..e84069fc8
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_001.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_002.png b/src/boost/libs/polygon/example/output_data/primary/primary_002.png
new file mode 100644
index 000000000..384a35c3c
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_002.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_003.png b/src/boost/libs/polygon/example/output_data/primary/primary_003.png
new file mode 100644
index 000000000..66dc11ef0
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_003.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_004.png b/src/boost/libs/polygon/example/output_data/primary/primary_004.png
new file mode 100644
index 000000000..7d134e28c
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_004.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_005.png b/src/boost/libs/polygon/example/output_data/primary/primary_005.png
new file mode 100644
index 000000000..9715acbcd
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_005.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_006.png b/src/boost/libs/polygon/example/output_data/primary/primary_006.png
new file mode 100644
index 000000000..585f29cdd
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_006.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_007.png b/src/boost/libs/polygon/example/output_data/primary/primary_007.png
new file mode 100644
index 000000000..8d2b31b25
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_007.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_008.png b/src/boost/libs/polygon/example/output_data/primary/primary_008.png
new file mode 100644
index 000000000..99c27aa88
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_008.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_009.png b/src/boost/libs/polygon/example/output_data/primary/primary_009.png
new file mode 100644
index 000000000..4aff6d9df
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_009.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_010.png b/src/boost/libs/polygon/example/output_data/primary/primary_010.png
new file mode 100644
index 000000000..305bade56
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_010.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_011.png b/src/boost/libs/polygon/example/output_data/primary/primary_011.png
new file mode 100644
index 000000000..625ef724d
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_011.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_012.png b/src/boost/libs/polygon/example/output_data/primary/primary_012.png
new file mode 100644
index 000000000..8bd486442
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_012.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_013.png b/src/boost/libs/polygon/example/output_data/primary/primary_013.png
new file mode 100644
index 000000000..f4586746f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_013.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_014.png b/src/boost/libs/polygon/example/output_data/primary/primary_014.png
new file mode 100644
index 000000000..7c281b7ce
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_014.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_015.png b/src/boost/libs/polygon/example/output_data/primary/primary_015.png
new file mode 100644
index 000000000..e3bf7266f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_015.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_016.png b/src/boost/libs/polygon/example/output_data/primary/primary_016.png
new file mode 100644
index 000000000..78b322e36
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_016.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_017.png b/src/boost/libs/polygon/example/output_data/primary/primary_017.png
new file mode 100644
index 000000000..3c2618f8c
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_017.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_018.png b/src/boost/libs/polygon/example/output_data/primary/primary_018.png
new file mode 100644
index 000000000..bfdbf2c79
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_018.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_019.png b/src/boost/libs/polygon/example/output_data/primary/primary_019.png
new file mode 100644
index 000000000..0a51631c6
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_019.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_020.png b/src/boost/libs/polygon/example/output_data/primary/primary_020.png
new file mode 100644
index 000000000..26c82e8c6
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_020.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_021.png b/src/boost/libs/polygon/example/output_data/primary/primary_021.png
new file mode 100644
index 000000000..abf18bbab
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_021.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_022.png b/src/boost/libs/polygon/example/output_data/primary/primary_022.png
new file mode 100644
index 000000000..6408bf132
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_022.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_023.png b/src/boost/libs/polygon/example/output_data/primary/primary_023.png
new file mode 100644
index 000000000..a91f3a259
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_023.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_024.png b/src/boost/libs/polygon/example/output_data/primary/primary_024.png
new file mode 100644
index 000000000..d1643de03
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_024.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_025.png b/src/boost/libs/polygon/example/output_data/primary/primary_025.png
new file mode 100644
index 000000000..c45581a59
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_025.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_026.png b/src/boost/libs/polygon/example/output_data/primary/primary_026.png
new file mode 100644
index 000000000..6eb9c19e9
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_026.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_027.png b/src/boost/libs/polygon/example/output_data/primary/primary_027.png
new file mode 100644
index 000000000..e113fd539
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_027.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_028.png b/src/boost/libs/polygon/example/output_data/primary/primary_028.png
new file mode 100644
index 000000000..ecc88a28d
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_028.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_029.png b/src/boost/libs/polygon/example/output_data/primary/primary_029.png
new file mode 100644
index 000000000..46c9235a1
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_029.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_030.png b/src/boost/libs/polygon/example/output_data/primary/primary_030.png
new file mode 100644
index 000000000..3ec5f6b07
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_030.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_031.png b/src/boost/libs/polygon/example/output_data/primary/primary_031.png
new file mode 100644
index 000000000..180e785b7
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_031.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_032.png b/src/boost/libs/polygon/example/output_data/primary/primary_032.png
new file mode 100644
index 000000000..47077c194
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_032.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_033.png b/src/boost/libs/polygon/example/output_data/primary/primary_033.png
new file mode 100644
index 000000000..3fe9c2d19
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_033.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_034.png b/src/boost/libs/polygon/example/output_data/primary/primary_034.png
new file mode 100644
index 000000000..88c20830f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_034.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_035.png b/src/boost/libs/polygon/example/output_data/primary/primary_035.png
new file mode 100644
index 000000000..d747470a5
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_035.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_036.png b/src/boost/libs/polygon/example/output_data/primary/primary_036.png
new file mode 100644
index 000000000..16d0dbc36
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_036.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_037.png b/src/boost/libs/polygon/example/output_data/primary/primary_037.png
new file mode 100644
index 000000000..36dc9ddda
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_037.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_038.png b/src/boost/libs/polygon/example/output_data/primary/primary_038.png
new file mode 100644
index 000000000..22b2ada08
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_038.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_039.png b/src/boost/libs/polygon/example/output_data/primary/primary_039.png
new file mode 100644
index 000000000..c77211814
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_039.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_040.png b/src/boost/libs/polygon/example/output_data/primary/primary_040.png
new file mode 100644
index 000000000..6c22caa9f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_040.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_041.png b/src/boost/libs/polygon/example/output_data/primary/primary_041.png
new file mode 100644
index 000000000..3a5164665
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_041.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_042.png b/src/boost/libs/polygon/example/output_data/primary/primary_042.png
new file mode 100644
index 000000000..3b6f63b03
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_042.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_043.png b/src/boost/libs/polygon/example/output_data/primary/primary_043.png
new file mode 100644
index 000000000..e0704cbd4
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_043.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_044.png b/src/boost/libs/polygon/example/output_data/primary/primary_044.png
new file mode 100644
index 000000000..daec42641
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_044.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_045.png b/src/boost/libs/polygon/example/output_data/primary/primary_045.png
new file mode 100644
index 000000000..fccf0b706
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_045.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_046.png b/src/boost/libs/polygon/example/output_data/primary/primary_046.png
new file mode 100644
index 000000000..69ec8dcef
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_046.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_047.png b/src/boost/libs/polygon/example/output_data/primary/primary_047.png
new file mode 100644
index 000000000..d1aca8b4f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_047.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_048.png b/src/boost/libs/polygon/example/output_data/primary/primary_048.png
new file mode 100644
index 000000000..49249c21f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_048.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_049.png b/src/boost/libs/polygon/example/output_data/primary/primary_049.png
new file mode 100644
index 000000000..b2be71799
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_049.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_050.png b/src/boost/libs/polygon/example/output_data/primary/primary_050.png
new file mode 100644
index 000000000..2668f055c
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_050.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_051.png b/src/boost/libs/polygon/example/output_data/primary/primary_051.png
new file mode 100644
index 000000000..123bb0c35
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_051.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_052.png b/src/boost/libs/polygon/example/output_data/primary/primary_052.png
new file mode 100644
index 000000000..64a24930b
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_052.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_053.png b/src/boost/libs/polygon/example/output_data/primary/primary_053.png
new file mode 100644
index 000000000..104199800
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_053.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_054.png b/src/boost/libs/polygon/example/output_data/primary/primary_054.png
new file mode 100644
index 000000000..200123762
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_054.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_055.png b/src/boost/libs/polygon/example/output_data/primary/primary_055.png
new file mode 100644
index 000000000..eb26248d5
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_055.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_056.png b/src/boost/libs/polygon/example/output_data/primary/primary_056.png
new file mode 100644
index 000000000..42e0a57b9
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_056.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_057.png b/src/boost/libs/polygon/example/output_data/primary/primary_057.png
new file mode 100644
index 000000000..5bbadc815
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_057.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_058.png b/src/boost/libs/polygon/example/output_data/primary/primary_058.png
new file mode 100644
index 000000000..9d24c0d47
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_058.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_059.png b/src/boost/libs/polygon/example/output_data/primary/primary_059.png
new file mode 100644
index 000000000..d31ea60a3
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_059.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_060.png b/src/boost/libs/polygon/example/output_data/primary/primary_060.png
new file mode 100644
index 000000000..d31ea60a3
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_060.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_061.png b/src/boost/libs/polygon/example/output_data/primary/primary_061.png
new file mode 100644
index 000000000..1beab62ee
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_061.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_062.png b/src/boost/libs/polygon/example/output_data/primary/primary_062.png
new file mode 100644
index 000000000..96f5cfb64
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_062.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_063.png b/src/boost/libs/polygon/example/output_data/primary/primary_063.png
new file mode 100644
index 000000000..b27ca1a03
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_063.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_064.png b/src/boost/libs/polygon/example/output_data/primary/primary_064.png
new file mode 100644
index 000000000..c393c425e
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_064.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_065.png b/src/boost/libs/polygon/example/output_data/primary/primary_065.png
new file mode 100644
index 000000000..81b2b7717
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_065.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_066.png b/src/boost/libs/polygon/example/output_data/primary/primary_066.png
new file mode 100644
index 000000000..797192d98
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_066.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_067.png b/src/boost/libs/polygon/example/output_data/primary/primary_067.png
new file mode 100644
index 000000000..ee770ea10
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_067.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_068.png b/src/boost/libs/polygon/example/output_data/primary/primary_068.png
new file mode 100644
index 000000000..54abfde32
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_068.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_069.png b/src/boost/libs/polygon/example/output_data/primary/primary_069.png
new file mode 100644
index 000000000..b7b327def
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_069.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_070.png b/src/boost/libs/polygon/example/output_data/primary/primary_070.png
new file mode 100644
index 000000000..ecc868708
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_070.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_071.png b/src/boost/libs/polygon/example/output_data/primary/primary_071.png
new file mode 100644
index 000000000..af1a4b073
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_071.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/primary/primary_072.png b/src/boost/libs/polygon/example/output_data/primary/primary_072.png
new file mode 100644
index 000000000..89a06d31a
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/primary/primary_072.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_001.png b/src/boost/libs/polygon/example/output_data/random/random_001.png
new file mode 100644
index 000000000..70bfd60cc
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_001.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_002.png b/src/boost/libs/polygon/example/output_data/random/random_002.png
new file mode 100644
index 000000000..a0c39abfb
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_002.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_003.png b/src/boost/libs/polygon/example/output_data/random/random_003.png
new file mode 100644
index 000000000..180d6023d
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_003.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_004.png b/src/boost/libs/polygon/example/output_data/random/random_004.png
new file mode 100644
index 000000000..1701b36c5
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_004.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_005.png b/src/boost/libs/polygon/example/output_data/random/random_005.png
new file mode 100644
index 000000000..1701b36c5
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_005.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_006.png b/src/boost/libs/polygon/example/output_data/random/random_006.png
new file mode 100644
index 000000000..350b3307d
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_006.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_007.png b/src/boost/libs/polygon/example/output_data/random/random_007.png
new file mode 100644
index 000000000..f87c63055
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_007.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_008.png b/src/boost/libs/polygon/example/output_data/random/random_008.png
new file mode 100644
index 000000000..e03a4ea61
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_008.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_009.png b/src/boost/libs/polygon/example/output_data/random/random_009.png
new file mode 100644
index 000000000..9b165918a
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_009.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_010.png b/src/boost/libs/polygon/example/output_data/random/random_010.png
new file mode 100644
index 000000000..f1fbd7b5f
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_010.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_011.png b/src/boost/libs/polygon/example/output_data/random/random_011.png
new file mode 100644
index 000000000..3399269fa
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_011.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_012.png b/src/boost/libs/polygon/example/output_data/random/random_012.png
new file mode 100644
index 000000000..ae4e39f26
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_012.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_013.png b/src/boost/libs/polygon/example/output_data/random/random_013.png
new file mode 100644
index 000000000..681af5e16
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_013.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_014.png b/src/boost/libs/polygon/example/output_data/random/random_014.png
new file mode 100644
index 000000000..fa460579e
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_014.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_015.png b/src/boost/libs/polygon/example/output_data/random/random_015.png
new file mode 100644
index 000000000..c1053a4ff
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_015.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_016.png b/src/boost/libs/polygon/example/output_data/random/random_016.png
new file mode 100644
index 000000000..fae18c3b1
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_016.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_017.png b/src/boost/libs/polygon/example/output_data/random/random_017.png
new file mode 100644
index 000000000..5434bdd85
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_017.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_018.png b/src/boost/libs/polygon/example/output_data/random/random_018.png
new file mode 100644
index 000000000..7e5efd05c
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_018.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_019.png b/src/boost/libs/polygon/example/output_data/random/random_019.png
new file mode 100644
index 000000000..63025d7a7
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_019.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_020.png b/src/boost/libs/polygon/example/output_data/random/random_020.png
new file mode 100644
index 000000000..e17f4fb6d
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_020.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_021.png b/src/boost/libs/polygon/example/output_data/random/random_021.png
new file mode 100644
index 000000000..82262699a
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_021.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_022.png b/src/boost/libs/polygon/example/output_data/random/random_022.png
new file mode 100644
index 000000000..500134a34
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_022.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_023.png b/src/boost/libs/polygon/example/output_data/random/random_023.png
new file mode 100644
index 000000000..756e8d41c
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_023.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_024.png b/src/boost/libs/polygon/example/output_data/random/random_024.png
new file mode 100644
index 000000000..0c973fca7
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_024.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_025.png b/src/boost/libs/polygon/example/output_data/random/random_025.png
new file mode 100644
index 000000000..a70725817
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_025.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_026.png b/src/boost/libs/polygon/example/output_data/random/random_026.png
new file mode 100644
index 000000000..3f109f2c2
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_026.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_027.png b/src/boost/libs/polygon/example/output_data/random/random_027.png
new file mode 100644
index 000000000..e4cd10018
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_027.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/output_data/random/random_028.png b/src/boost/libs/polygon/example/output_data/random/random_028.png
new file mode 100644
index 000000000..4b4bb7213
--- /dev/null
+++ b/src/boost/libs/polygon/example/output_data/random/random_028.png
Binary files differ
diff --git a/src/boost/libs/polygon/example/voronoi_advanced_tutorial.cpp b/src/boost/libs/polygon/example/voronoi_advanced_tutorial.cpp
new file mode 100644
index 000000000..96ad96993
--- /dev/null
+++ b/src/boost/libs/polygon/example/voronoi_advanced_tutorial.cpp
@@ -0,0 +1,145 @@
+// Boost.Polygon library voronoi_advanced_tutorial.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cmath>
+#include <cstdio>
+#include <ctime>
+#include <string>
+
+// This will work properly only with GCC compiler.
+#include <ieee754.h>
+typedef long double fpt80;
+
+// Random generators and distributions.
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/random/uniform_int_distribution.hpp>
+#include <boost/timer/timer.hpp>
+
+#include <boost/polygon/voronoi.hpp>
+using namespace boost::polygon;
+
+struct my_ulp_comparison {
+ enum Result {
+ LESS = -1,
+ EQUAL = 0,
+ MORE = 1
+ };
+
+ Result operator()(fpt80 a, fpt80 b, unsigned int maxUlps) const {
+ if (a == b)
+ return EQUAL;
+ if (a > b) {
+ Result res = operator()(b, a, maxUlps);
+ if (res == EQUAL) return res;
+ return (res == LESS) ? MORE : LESS;
+ }
+ ieee854_long_double lhs, rhs;
+ lhs.d = a;
+ rhs.d = b;
+ if (lhs.ieee.negative ^ rhs.ieee.negative)
+ return lhs.ieee.negative ? LESS : MORE;
+ boost::uint64_t le = lhs.ieee.exponent; le =
+ (le << 32) + lhs.ieee.mantissa0;
+ boost::uint64_t re = rhs.ieee.exponent; re =
+ (re << 32) + rhs.ieee.mantissa0;
+ if (lhs.ieee.negative) {
+ if (le - 1 > re)
+ return LESS;
+ le = (le == re) ? 0 : 1;
+ le = (le << 32) + lhs.ieee.mantissa1;
+ re = rhs.ieee.mantissa1;
+ return (re + maxUlps < le) ? LESS : EQUAL;
+ } else {
+ if (le + 1 < re)
+ return LESS;
+ le = lhs.ieee.mantissa0;
+ re = (le == re) ? 0 : 1;
+ re = (re << 32) + rhs.ieee.mantissa1;
+ return (le + maxUlps < re) ? LESS : EQUAL;
+ }
+ }
+};
+
+struct my_fpt_converter {
+ template <typename T>
+ fpt80 operator()(const T& that) const {
+ return static_cast<fpt80>(that);
+ }
+
+ template <std::size_t N>
+ fpt80 operator()(const typename detail::extended_int<N> &that) const {
+ fpt80 result = 0.0;
+ for (std::size_t i = 1; i <= (std::min)((std::size_t)3, that.size()); ++i) {
+ if (i != 1)
+ result *= static_cast<fpt80>(0x100000000ULL);
+ result += that.chunks()[that.size() - i];
+ }
+ return (that.count() < 0) ? -result : result;
+ }
+};
+
+// Voronoi diagram traits.
+struct my_voronoi_diagram_traits {
+ typedef fpt80 coordinate_type;
+ typedef voronoi_cell<coordinate_type> cell_type;
+ typedef voronoi_vertex<coordinate_type> vertex_type;
+ typedef voronoi_edge<coordinate_type> edge_type;
+ typedef class {
+ public:
+ enum { ULPS = 128 };
+ bool operator()(const vertex_type &v1, const vertex_type &v2) const {
+ return (ulp_cmp(v1.x(), v2.x(), ULPS) == my_ulp_comparison::EQUAL &&
+ ulp_cmp(v1.y(), v2.y(), ULPS) == my_ulp_comparison::EQUAL);
+ }
+ private:
+ my_ulp_comparison ulp_cmp;
+ } vertex_equality_predicate_type;
+};
+
+// Voronoi ctype traits for 48-bit signed integer input coordinates.
+struct my_voronoi_ctype_traits {
+ typedef boost::int64_t int_type;
+ typedef detail::extended_int<3> int_x2_type;
+ typedef detail::extended_int<3> uint_x2_type;
+ typedef detail::extended_int<128> big_int_type;
+ typedef fpt80 fpt_type;
+ typedef fpt80 efpt_type;
+ typedef my_ulp_comparison ulp_cmp_type;
+ typedef my_fpt_converter to_fpt_converter_type;
+ typedef my_fpt_converter to_efpt_converter_type;
+};
+
+const unsigned int GENERATED_POINTS = 100;
+const boost::int64_t MAX = 0x1000000000000LL;
+
+int main() {
+ boost::mt19937_64 gen(std::time(0));
+ boost::random::uniform_int_distribution<boost::int64_t> distr(-MAX, MAX-1);
+ voronoi_builder<boost::int64_t, my_voronoi_ctype_traits> vb;
+ for (size_t i = 0; i < GENERATED_POINTS; ++i) {
+ boost::int64_t x = distr(gen);
+ boost::int64_t y = distr(gen);
+ vb.insert_point(x, y);
+ }
+
+ printf("Constructing Voronoi diagram of %d points...\n", GENERATED_POINTS);
+ boost::timer::cpu_timer t;
+ voronoi_diagram<fpt80, my_voronoi_diagram_traits> vd;
+ t.start();
+ vb.construct(&vd);
+ boost::timer::cpu_times times = t.elapsed();
+ std::string ftime = boost::timer::format(times, 5, "%w");
+
+ printf("Construction done in: %s seconds.\n", ftime.c_str());
+ printf("Resulting Voronoi graph has the following stats:\n");
+ printf("Number of Voronoi cells: %lu.\n", vd.num_cells());
+ printf("Number of Voronoi vertices: %lu.\n", vd.num_vertices());
+ printf("Number of Voronoi edges: %lu.\n", vd.num_edges());
+ return 0;
+}
diff --git a/src/boost/libs/polygon/example/voronoi_basic_tutorial.cpp b/src/boost/libs/polygon/example/voronoi_basic_tutorial.cpp
new file mode 100644
index 000000000..84f0e4687
--- /dev/null
+++ b/src/boost/libs/polygon/example/voronoi_basic_tutorial.cpp
@@ -0,0 +1,198 @@
+// Boost.Polygon library voronoi_basic_tutorial.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstdio>
+#include <vector>
+
+#include <boost/polygon/voronoi.hpp>
+using boost::polygon::voronoi_builder;
+using boost::polygon::voronoi_diagram;
+using boost::polygon::x;
+using boost::polygon::y;
+using boost::polygon::low;
+using boost::polygon::high;
+
+#include "voronoi_visual_utils.hpp"
+
+struct Point {
+ int a;
+ int b;
+ Point(int x, int y) : a(x), b(y) {}
+};
+
+struct Segment {
+ Point p0;
+ Point p1;
+ Segment(int x1, int y1, int x2, int y2) : p0(x1, y1), p1(x2, y2) {}
+};
+
+namespace boost {
+namespace polygon {
+
+template <>
+struct geometry_concept<Point> {
+ typedef point_concept type;
+};
+
+template <>
+struct point_traits<Point> {
+ typedef int coordinate_type;
+
+ static inline coordinate_type get(
+ const Point& point, orientation_2d orient) {
+ return (orient == HORIZONTAL) ? point.a : point.b;
+ }
+};
+
+template <>
+struct geometry_concept<Segment> {
+ typedef segment_concept type;
+};
+
+template <>
+struct segment_traits<Segment> {
+ typedef int coordinate_type;
+ typedef Point point_type;
+
+ static inline point_type get(const Segment& segment, direction_1d dir) {
+ return dir.to_int() ? segment.p1 : segment.p0;
+ }
+};
+} // polygon
+} // boost
+
+// Traversing Voronoi edges using edge iterator.
+int iterate_primary_edges1(const voronoi_diagram<double>& vd) {
+ int result = 0;
+ for (voronoi_diagram<double>::const_edge_iterator it = vd.edges().begin();
+ it != vd.edges().end(); ++it) {
+ if (it->is_primary())
+ ++result;
+ }
+ return result;
+}
+
+// Traversing Voronoi edges using cell iterator.
+int iterate_primary_edges2(const voronoi_diagram<double> &vd) {
+ int result = 0;
+ for (voronoi_diagram<double>::const_cell_iterator it = vd.cells().begin();
+ it != vd.cells().end(); ++it) {
+ const voronoi_diagram<double>::cell_type& cell = *it;
+ const voronoi_diagram<double>::edge_type* edge = cell.incident_edge();
+ // This is convenient way to iterate edges around Voronoi cell.
+ do {
+ if (edge->is_primary())
+ ++result;
+ edge = edge->next();
+ } while (edge != cell.incident_edge());
+ }
+ return result;
+}
+
+// Traversing Voronoi edges using vertex iterator.
+// As opposite to the above two functions this one will not iterate through
+// edges without finite endpoints and will iterate only once through edges
+// with single finite endpoint.
+int iterate_primary_edges3(const voronoi_diagram<double> &vd) {
+ int result = 0;
+ for (voronoi_diagram<double>::const_vertex_iterator it =
+ vd.vertices().begin(); it != vd.vertices().end(); ++it) {
+ const voronoi_diagram<double>::vertex_type& vertex = *it;
+ const voronoi_diagram<double>::edge_type* edge = vertex.incident_edge();
+ // This is convenient way to iterate edges around Voronoi vertex.
+ do {
+ if (edge->is_primary())
+ ++result;
+ edge = edge->rot_next();
+ } while (edge != vertex.incident_edge());
+ }
+ return result;
+}
+
+int main() {
+ // Preparing Input Geometries.
+ std::vector<Point> points;
+ points.push_back(Point(0, 0));
+ points.push_back(Point(1, 6));
+ std::vector<Segment> segments;
+ segments.push_back(Segment(-4, 5, 5, -1));
+ segments.push_back(Segment(3, -11, 13, -1));
+
+ // Construction of the Voronoi Diagram.
+ voronoi_diagram<double> vd;
+ construct_voronoi(points.begin(), points.end(),
+ segments.begin(), segments.end(),
+ &vd);
+
+ // Traversing Voronoi Graph.
+ {
+ printf("Traversing Voronoi graph.\n");
+ printf("Number of visited primary edges using edge iterator: %d\n",
+ iterate_primary_edges1(vd));
+ printf("Number of visited primary edges using cell iterator: %d\n",
+ iterate_primary_edges2(vd));
+ printf("Number of visited primary edges using vertex iterator: %d\n",
+ iterate_primary_edges3(vd));
+ printf("\n");
+ }
+
+ // Using color member of the Voronoi primitives to store the average number
+ // of edges around each cell (including secondary edges).
+ {
+ printf("Number of edges (including secondary) around the Voronoi cells:\n");
+ for (voronoi_diagram<double>::const_edge_iterator it = vd.edges().begin();
+ it != vd.edges().end(); ++it) {
+ std::size_t cnt = it->cell()->color();
+ it->cell()->color(cnt + 1);
+ }
+ for (voronoi_diagram<double>::const_cell_iterator it = vd.cells().begin();
+ it != vd.cells().end(); ++it) {
+ printf("%lu ", it->color());
+ }
+ printf("\n");
+ printf("\n");
+ }
+
+ // Linking Voronoi cells with input geometries.
+ {
+ unsigned int cell_index = 0;
+ for (voronoi_diagram<double>::const_cell_iterator it = vd.cells().begin();
+ it != vd.cells().end(); ++it) {
+ if (it->contains_point()) {
+ if (it->source_category() ==
+ boost::polygon::SOURCE_CATEGORY_SINGLE_POINT) {
+ std::size_t index = it->source_index();
+ Point p = points[index];
+ printf("Cell #%u contains a point: (%d, %d).\n",
+ cell_index, x(p), y(p));
+ } else if (it->source_category() ==
+ boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) {
+ std::size_t index = it->source_index() - points.size();
+ Point p0 = low(segments[index]);
+ printf("Cell #%u contains segment start point: (%d, %d).\n",
+ cell_index, x(p0), y(p0));
+ } else if (it->source_category() ==
+ boost::polygon::SOURCE_CATEGORY_SEGMENT_END_POINT) {
+ std::size_t index = it->source_index() - points.size();
+ Point p1 = high(segments[index]);
+ printf("Cell #%u contains segment end point: (%d, %d).\n",
+ cell_index, x(p1), y(p1));
+ }
+ } else {
+ std::size_t index = it->source_index() - points.size();
+ Point p0 = low(segments[index]);
+ Point p1 = high(segments[index]);
+ printf("Cell #%u contains a segment: ((%d, %d), (%d, %d)). \n",
+ cell_index, x(p0), y(p0), x(p1), y(p1));
+ }
+ ++cell_index;
+ }
+ }
+ return 0;
+}
diff --git a/src/boost/libs/polygon/example/voronoi_visual_utils.hpp b/src/boost/libs/polygon/example/voronoi_visual_utils.hpp
new file mode 100644
index 000000000..4ef2e9dc2
--- /dev/null
+++ b/src/boost/libs/polygon/example/voronoi_visual_utils.hpp
@@ -0,0 +1,186 @@
+// Boost.Polygon library voronoi_graphic_utils.hpp header file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_POLYGON_VORONOI_VISUAL_UTILS
+#define BOOST_POLYGON_VORONOI_VISUAL_UTILS
+
+#include <stack>
+#include <vector>
+
+#include <boost/polygon/isotropy.hpp>
+#include <boost/polygon/point_concept.hpp>
+#include <boost/polygon/segment_concept.hpp>
+#include <boost/polygon/rectangle_concept.hpp>
+
+namespace boost {
+namespace polygon {
+// Utilities class, that contains set of routines handful for visualization.
+template <typename CT>
+class voronoi_visual_utils {
+ public:
+ // Discretize parabolic Voronoi edge.
+ // Parabolic Voronoi edges are always formed by one point and one segment
+ // from the initial input set.
+ //
+ // Args:
+ // point: input point.
+ // segment: input segment.
+ // max_dist: maximum discretization distance.
+ // discretization: point discretization of the given Voronoi edge.
+ //
+ // Template arguments:
+ // InCT: coordinate type of the input geometries (usually integer).
+ // Point: point type, should model point concept.
+ // Segment: segment type, should model segment concept.
+ //
+ // Important:
+ // discretization should contain both edge endpoints initially.
+ template <class InCT1, class InCT2,
+ template<class> class Point,
+ template<class> class Segment>
+ static
+ typename enable_if<
+ typename gtl_and<
+ typename gtl_if<
+ typename is_point_concept<
+ typename geometry_concept< Point<InCT1> >::type
+ >::type
+ >::type,
+ typename gtl_if<
+ typename is_segment_concept<
+ typename geometry_concept< Segment<InCT2> >::type
+ >::type
+ >::type
+ >::type,
+ void
+ >::type discretize(
+ const Point<InCT1>& point,
+ const Segment<InCT2>& segment,
+ const CT max_dist,
+ std::vector< Point<CT> >* discretization) {
+ // Apply the linear transformation to move start point of the segment to
+ // the point with coordinates (0, 0) and the direction of the segment to
+ // coincide the positive direction of the x-axis.
+ CT segm_vec_x = cast(x(high(segment))) - cast(x(low(segment)));
+ CT segm_vec_y = cast(y(high(segment))) - cast(y(low(segment)));
+ CT sqr_segment_length = segm_vec_x * segm_vec_x + segm_vec_y * segm_vec_y;
+
+ // Compute x-coordinates of the endpoints of the edge
+ // in the transformed space.
+ CT projection_start = sqr_segment_length *
+ get_point_projection((*discretization)[0], segment);
+ CT projection_end = sqr_segment_length *
+ get_point_projection((*discretization)[1], segment);
+
+ // Compute parabola parameters in the transformed space.
+ // Parabola has next representation:
+ // f(x) = ((x-rot_x)^2 + rot_y^2) / (2.0*rot_y).
+ CT point_vec_x = cast(x(point)) - cast(x(low(segment)));
+ CT point_vec_y = cast(y(point)) - cast(y(low(segment)));
+ CT rot_x = segm_vec_x * point_vec_x + segm_vec_y * point_vec_y;
+ CT rot_y = segm_vec_x * point_vec_y - segm_vec_y * point_vec_x;
+
+ // Save the last point.
+ Point<CT> last_point = (*discretization)[1];
+ discretization->pop_back();
+
+ // Use stack to avoid recursion.
+ std::stack<CT> point_stack;
+ point_stack.push(projection_end);
+ CT cur_x = projection_start;
+ CT cur_y = parabola_y(cur_x, rot_x, rot_y);
+
+ // Adjust max_dist parameter in the transformed space.
+ const CT max_dist_transformed = max_dist * max_dist * sqr_segment_length;
+ while (!point_stack.empty()) {
+ CT new_x = point_stack.top();
+ CT new_y = parabola_y(new_x, rot_x, rot_y);
+
+ // Compute coordinates of the point of the parabola that is
+ // furthest from the current line segment.
+ CT mid_x = (new_y - cur_y) / (new_x - cur_x) * rot_y + rot_x;
+ CT mid_y = parabola_y(mid_x, rot_x, rot_y);
+
+ // Compute maximum distance between the given parabolic arc
+ // and line segment that discretize it.
+ CT dist = (new_y - cur_y) * (mid_x - cur_x) -
+ (new_x - cur_x) * (mid_y - cur_y);
+ dist = dist * dist / ((new_y - cur_y) * (new_y - cur_y) +
+ (new_x - cur_x) * (new_x - cur_x));
+ if (dist <= max_dist_transformed) {
+ // Distance between parabola and line segment is less than max_dist.
+ point_stack.pop();
+ CT inter_x = (segm_vec_x * new_x - segm_vec_y * new_y) /
+ sqr_segment_length + cast(x(low(segment)));
+ CT inter_y = (segm_vec_x * new_y + segm_vec_y * new_x) /
+ sqr_segment_length + cast(y(low(segment)));
+ discretization->push_back(Point<CT>(inter_x, inter_y));
+ cur_x = new_x;
+ cur_y = new_y;
+ } else {
+ point_stack.push(mid_x);
+ }
+ }
+
+ // Update last point.
+ discretization->back() = last_point;
+ }
+
+ private:
+ // Compute y(x) = ((x - a) * (x - a) + b * b) / (2 * b).
+ static CT parabola_y(CT x, CT a, CT b) {
+ return ((x - a) * (x - a) + b * b) / (b + b);
+ }
+
+ // Get normalized length of the distance between:
+ // 1) point projection onto the segment
+ // 2) start point of the segment
+ // Return this length divided by the segment length. This is made to avoid
+ // sqrt computation during transformation from the initial space to the
+ // transformed one and vice versa. The assumption is made that projection of
+ // the point lies between the start-point and endpoint of the segment.
+ template <class InCT,
+ template<class> class Point,
+ template<class> class Segment>
+ static
+ typename enable_if<
+ typename gtl_and<
+ typename gtl_if<
+ typename is_point_concept<
+ typename geometry_concept< Point<int> >::type
+ >::type
+ >::type,
+ typename gtl_if<
+ typename is_segment_concept<
+ typename geometry_concept< Segment<long> >::type
+ >::type
+ >::type
+ >::type,
+ CT
+ >::type get_point_projection(
+ const Point<CT>& point, const Segment<InCT>& segment) {
+ CT segment_vec_x = cast(x(high(segment))) - cast(x(low(segment)));
+ CT segment_vec_y = cast(y(high(segment))) - cast(y(low(segment)));
+ CT point_vec_x = x(point) - cast(x(low(segment)));
+ CT point_vec_y = y(point) - cast(y(low(segment)));
+ CT sqr_segment_length =
+ segment_vec_x * segment_vec_x + segment_vec_y * segment_vec_y;
+ CT vec_dot = segment_vec_x * point_vec_x + segment_vec_y * point_vec_y;
+ return vec_dot / sqr_segment_length;
+ }
+
+ template <typename InCT>
+ static CT cast(const InCT& value) {
+ return static_cast<CT>(value);
+ }
+};
+}
+}
+
+#endif // BOOST_POLYGON_VORONOI_VISUAL_UTILS
diff --git a/src/boost/libs/polygon/example/voronoi_visualizer.cpp b/src/boost/libs/polygon/example/voronoi_visualizer.cpp
new file mode 100644
index 000000000..3049c3877
--- /dev/null
+++ b/src/boost/libs/polygon/example/voronoi_visualizer.cpp
@@ -0,0 +1,509 @@
+// Boost.Polygon library voronoi_visualizer.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <iostream>
+#include <vector>
+
+#include <QtOpenGL/QGLWidget>
+#include <QtGui/QtGui>
+
+#include <boost/polygon/polygon.hpp>
+#include <boost/polygon/voronoi.hpp>
+using namespace boost::polygon;
+
+#include "voronoi_visual_utils.hpp"
+
+class GLWidget : public QGLWidget {
+ Q_OBJECT
+
+ public:
+ explicit GLWidget(QMainWindow* parent = NULL) :
+ QGLWidget(QGLFormat(QGL::SampleBuffers), parent),
+ primary_edges_only_(false),
+ internal_edges_only_(false) {
+ startTimer(40);
+ }
+
+ QSize sizeHint() const {
+ return QSize(600, 600);
+ }
+
+ void build(const QString& file_path) {
+ // Clear all containers.
+ clear();
+
+ // Read data.
+ read_data(file_path);
+
+ // No data, don't proceed.
+ if (!brect_initialized_) {
+ return;
+ }
+
+ // Construct bounding rectangle.
+ construct_brect();
+
+ // Construct voronoi diagram.
+ construct_voronoi(
+ point_data_.begin(), point_data_.end(),
+ segment_data_.begin(), segment_data_.end(),
+ &vd_);
+
+ // Color exterior edges.
+ for (const_edge_iterator it = vd_.edges().begin();
+ it != vd_.edges().end(); ++it) {
+ if (!it->is_finite()) {
+ color_exterior(&(*it));
+ }
+ }
+
+ // Update view port.
+ update_view_port();
+ }
+
+ void show_primary_edges_only() {
+ primary_edges_only_ ^= true;
+ }
+
+ void show_internal_edges_only() {
+ internal_edges_only_ ^= true;
+ }
+
+ protected:
+ void initializeGL() {
+ glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_POINT_SMOOTH);
+ }
+
+ void paintGL() {
+ qglClearColor(QColor::fromRgb(255, 255, 255));
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ draw_points();
+ draw_segments();
+ draw_vertices();
+ draw_edges();
+ }
+
+ void resizeGL(int width, int height) {
+ int side = qMin(width, height);
+ glViewport((width - side) / 2, (height - side) / 2, side, side);
+ }
+
+ void timerEvent(QTimerEvent* e) {
+ update();
+ }
+
+ private:
+ typedef double coordinate_type;
+ typedef point_data<coordinate_type> point_type;
+ typedef segment_data<coordinate_type> segment_type;
+ typedef rectangle_data<coordinate_type> rect_type;
+ typedef voronoi_builder<int> VB;
+ typedef voronoi_diagram<coordinate_type> VD;
+ typedef VD::cell_type cell_type;
+ typedef VD::cell_type::source_index_type source_index_type;
+ typedef VD::cell_type::source_category_type source_category_type;
+ typedef VD::edge_type edge_type;
+ typedef VD::cell_container_type cell_container_type;
+ typedef VD::cell_container_type vertex_container_type;
+ typedef VD::edge_container_type edge_container_type;
+ typedef VD::const_cell_iterator const_cell_iterator;
+ typedef VD::const_vertex_iterator const_vertex_iterator;
+ typedef VD::const_edge_iterator const_edge_iterator;
+
+ static const std::size_t EXTERNAL_COLOR = 1;
+
+ void clear() {
+ brect_initialized_ = false;
+ point_data_.clear();
+ segment_data_.clear();
+ vd_.clear();
+ }
+
+ void read_data(const QString& file_path) {
+ QFile data(file_path);
+ if (!data.open(QFile::ReadOnly)) {
+ QMessageBox::warning(
+ this, tr("Voronoi Visualizer"),
+ tr("Disable to open file ") + file_path);
+ }
+ QTextStream in_stream(&data);
+ std::size_t num_points, num_segments;
+ int x1, y1, x2, y2;
+ in_stream >> num_points;
+ for (std::size_t i = 0; i < num_points; ++i) {
+ in_stream >> x1 >> y1;
+ point_type p(x1, y1);
+ update_brect(p);
+ point_data_.push_back(p);
+ }
+ in_stream >> num_segments;
+ for (std::size_t i = 0; i < num_segments; ++i) {
+ in_stream >> x1 >> y1 >> x2 >> y2;
+ point_type lp(x1, y1);
+ point_type hp(x2, y2);
+ update_brect(lp);
+ update_brect(hp);
+ segment_data_.push_back(segment_type(lp, hp));
+ }
+ in_stream.flush();
+ }
+
+ void update_brect(const point_type& point) {
+ if (brect_initialized_) {
+ encompass(brect_, point);
+ } else {
+ set_points(brect_, point, point);
+ brect_initialized_ = true;
+ }
+ }
+
+ void construct_brect() {
+ double side = (std::max)(xh(brect_) - xl(brect_), yh(brect_) - yl(brect_));
+ center(shift_, brect_);
+ set_points(brect_, shift_, shift_);
+ bloat(brect_, side * 1.2);
+ }
+
+ void color_exterior(const VD::edge_type* edge) {
+ if (edge->color() == EXTERNAL_COLOR) {
+ return;
+ }
+ edge->color(EXTERNAL_COLOR);
+ edge->twin()->color(EXTERNAL_COLOR);
+ const VD::vertex_type* v = edge->vertex1();
+ if (v == NULL || !edge->is_primary()) {
+ return;
+ }
+ v->color(EXTERNAL_COLOR);
+ const VD::edge_type* e = v->incident_edge();
+ do {
+ color_exterior(e);
+ e = e->rot_next();
+ } while (e != v->incident_edge());
+ }
+
+ void update_view_port() {
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ rect_type view_rect = brect_;
+ deconvolve(view_rect, shift_);
+ glOrtho(xl(view_rect), xh(view_rect),
+ yl(view_rect), yh(view_rect),
+ -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+ }
+
+ void draw_points() {
+ // Draw input points and endpoints of the input segments.
+ glColor3f(0.0f, 0.5f, 1.0f);
+ glPointSize(9);
+ glBegin(GL_POINTS);
+ for (std::size_t i = 0; i < point_data_.size(); ++i) {
+ point_type point = point_data_[i];
+ deconvolve(point, shift_);
+ glVertex2f(point.x(), point.y());
+ }
+ for (std::size_t i = 0; i < segment_data_.size(); ++i) {
+ point_type lp = low(segment_data_[i]);
+ lp = deconvolve(lp, shift_);
+ glVertex2f(lp.x(), lp.y());
+ point_type hp = high(segment_data_[i]);
+ hp = deconvolve(hp, shift_);
+ glVertex2f(hp.x(), hp.y());
+ }
+ glEnd();
+ }
+
+ void draw_segments() {
+ // Draw input segments.
+ glColor3f(0.0f, 0.5f, 1.0f);
+ glLineWidth(2.7f);
+ glBegin(GL_LINES);
+ for (std::size_t i = 0; i < segment_data_.size(); ++i) {
+ point_type lp = low(segment_data_[i]);
+ lp = deconvolve(lp, shift_);
+ glVertex2f(lp.x(), lp.y());
+ point_type hp = high(segment_data_[i]);
+ hp = deconvolve(hp, shift_);
+ glVertex2f(hp.x(), hp.y());
+ }
+ glEnd();
+ }
+
+ void draw_vertices() {
+ // Draw voronoi vertices.
+ glColor3f(0.0f, 0.0f, 0.0f);
+ glPointSize(6);
+ glBegin(GL_POINTS);
+ for (const_vertex_iterator it = vd_.vertices().begin();
+ it != vd_.vertices().end(); ++it) {
+ if (internal_edges_only_ && (it->color() == EXTERNAL_COLOR)) {
+ continue;
+ }
+ point_type vertex(it->x(), it->y());
+ vertex = deconvolve(vertex, shift_);
+ glVertex2f(vertex.x(), vertex.y());
+ }
+ glEnd();
+ }
+ void draw_edges() {
+ // Draw voronoi edges.
+ glColor3f(0.0f, 0.0f, 0.0f);
+ glLineWidth(1.7f);
+ for (const_edge_iterator it = vd_.edges().begin();
+ it != vd_.edges().end(); ++it) {
+ if (primary_edges_only_ && !it->is_primary()) {
+ continue;
+ }
+ if (internal_edges_only_ && (it->color() == EXTERNAL_COLOR)) {
+ continue;
+ }
+ std::vector<point_type> samples;
+ if (!it->is_finite()) {
+ clip_infinite_edge(*it, &samples);
+ } else {
+ point_type vertex0(it->vertex0()->x(), it->vertex0()->y());
+ samples.push_back(vertex0);
+ point_type vertex1(it->vertex1()->x(), it->vertex1()->y());
+ samples.push_back(vertex1);
+ if (it->is_curved()) {
+ sample_curved_edge(*it, &samples);
+ }
+ }
+ glBegin(GL_LINE_STRIP);
+ for (std::size_t i = 0; i < samples.size(); ++i) {
+ point_type vertex = deconvolve(samples[i], shift_);
+ glVertex2f(vertex.x(), vertex.y());
+ }
+ glEnd();
+ }
+ }
+
+ void clip_infinite_edge(
+ const edge_type& edge, std::vector<point_type>* clipped_edge) {
+ const cell_type& cell1 = *edge.cell();
+ const cell_type& cell2 = *edge.twin()->cell();
+ point_type origin, direction;
+ // Infinite edges could not be created by two segment sites.
+ if (cell1.contains_point() && cell2.contains_point()) {
+ point_type p1 = retrieve_point(cell1);
+ point_type p2 = retrieve_point(cell2);
+ origin.x((p1.x() + p2.x()) * 0.5);
+ origin.y((p1.y() + p2.y()) * 0.5);
+ direction.x(p1.y() - p2.y());
+ direction.y(p2.x() - p1.x());
+ } else {
+ origin = cell1.contains_segment() ?
+ retrieve_point(cell2) :
+ retrieve_point(cell1);
+ segment_type segment = cell1.contains_segment() ?
+ retrieve_segment(cell1) :
+ retrieve_segment(cell2);
+ coordinate_type dx = high(segment).x() - low(segment).x();
+ coordinate_type dy = high(segment).y() - low(segment).y();
+ if ((low(segment) == origin) ^ cell1.contains_point()) {
+ direction.x(dy);
+ direction.y(-dx);
+ } else {
+ direction.x(-dy);
+ direction.y(dx);
+ }
+ }
+ coordinate_type side = xh(brect_) - xl(brect_);
+ coordinate_type koef =
+ side / (std::max)(fabs(direction.x()), fabs(direction.y()));
+ if (edge.vertex0() == NULL) {
+ clipped_edge->push_back(point_type(
+ origin.x() - direction.x() * koef,
+ origin.y() - direction.y() * koef));
+ } else {
+ clipped_edge->push_back(
+ point_type(edge.vertex0()->x(), edge.vertex0()->y()));
+ }
+ if (edge.vertex1() == NULL) {
+ clipped_edge->push_back(point_type(
+ origin.x() + direction.x() * koef,
+ origin.y() + direction.y() * koef));
+ } else {
+ clipped_edge->push_back(
+ point_type(edge.vertex1()->x(), edge.vertex1()->y()));
+ }
+ }
+
+ void sample_curved_edge(
+ const edge_type& edge,
+ std::vector<point_type>* sampled_edge) {
+ coordinate_type max_dist = 1E-3 * (xh(brect_) - xl(brect_));
+ point_type point = edge.cell()->contains_point() ?
+ retrieve_point(*edge.cell()) :
+ retrieve_point(*edge.twin()->cell());
+ segment_type segment = edge.cell()->contains_point() ?
+ retrieve_segment(*edge.twin()->cell()) :
+ retrieve_segment(*edge.cell());
+ voronoi_visual_utils<coordinate_type>::discretize(
+ point, segment, max_dist, sampled_edge);
+ }
+
+ point_type retrieve_point(const cell_type& cell) {
+ source_index_type index = cell.source_index();
+ source_category_type category = cell.source_category();
+ if (category == SOURCE_CATEGORY_SINGLE_POINT) {
+ return point_data_[index];
+ }
+ index -= point_data_.size();
+ if (category == SOURCE_CATEGORY_SEGMENT_START_POINT) {
+ return low(segment_data_[index]);
+ } else {
+ return high(segment_data_[index]);
+ }
+ }
+
+ segment_type retrieve_segment(const cell_type& cell) {
+ source_index_type index = cell.source_index() - point_data_.size();
+ return segment_data_[index];
+ }
+
+ point_type shift_;
+ std::vector<point_type> point_data_;
+ std::vector<segment_type> segment_data_;
+ rect_type brect_;
+ VB vb_;
+ VD vd_;
+ bool brect_initialized_;
+ bool primary_edges_only_;
+ bool internal_edges_only_;
+};
+
+class MainWindow : public QWidget {
+ Q_OBJECT
+
+ public:
+ MainWindow() {
+ glWidget_ = new GLWidget();
+ file_dir_ = QDir(QDir::currentPath(), tr("*.txt"));
+ file_name_ = tr("");
+
+ QHBoxLayout* centralLayout = new QHBoxLayout;
+ centralLayout->addWidget(glWidget_);
+ centralLayout->addLayout(create_file_layout());
+ setLayout(centralLayout);
+
+ update_file_list();
+ setWindowTitle(tr("Voronoi Visualizer"));
+ layout()->setSizeConstraint(QLayout::SetFixedSize);
+ }
+
+ private slots:
+ void primary_edges_only() {
+ glWidget_->show_primary_edges_only();
+ }
+
+ void internal_edges_only() {
+ glWidget_->show_internal_edges_only();
+ }
+
+ void browse() {
+ QString new_path = QFileDialog::getExistingDirectory(
+ 0, tr("Choose Directory"), file_dir_.absolutePath());
+ if (new_path.isEmpty()) {
+ return;
+ }
+ file_dir_.setPath(new_path);
+ update_file_list();
+ }
+
+ void build() {
+ file_name_ = file_list_->currentItem()->text();
+ QString file_path = file_dir_.filePath(file_name_);
+ message_label_->setText("Building...");
+ glWidget_->build(file_path);
+ message_label_->setText("Double click the item to build voronoi diagram:");
+ setWindowTitle(tr("Voronoi Visualizer - ") + file_path);
+ }
+
+ void print_scr() {
+ if (!file_name_.isEmpty()) {
+ QImage screenshot = glWidget_->grabFrameBuffer(true);
+ QString output_file = file_dir_.absolutePath() + tr("/") +
+ file_name_.left(file_name_.indexOf('.')) + tr(".png");
+ screenshot.save(output_file, 0, -1);
+ }
+ }
+
+ private:
+ QGridLayout* create_file_layout() {
+ QGridLayout* file_layout = new QGridLayout;
+
+ message_label_ = new QLabel("Double click item to build voronoi diagram:");
+
+ file_list_ = new QListWidget();
+ file_list_->connect(file_list_,
+ SIGNAL(itemDoubleClicked(QListWidgetItem*)),
+ this,
+ SLOT(build()));
+
+ QCheckBox* primary_checkbox = new QCheckBox("Show primary edges only.");
+ connect(primary_checkbox, SIGNAL(clicked()),
+ this, SLOT(primary_edges_only()));
+
+ QCheckBox* internal_checkbox = new QCheckBox("Show internal edges only.");
+ connect(internal_checkbox, SIGNAL(clicked()),
+ this, SLOT(internal_edges_only()));
+
+ QPushButton* browse_button =
+ new QPushButton(tr("Browse Input Directory"));
+ connect(browse_button, SIGNAL(clicked()), this, SLOT(browse()));
+ browse_button->setMinimumHeight(50);
+
+ QPushButton* print_scr_button = new QPushButton(tr("Make Screenshot"));
+ connect(print_scr_button, SIGNAL(clicked()), this, SLOT(print_scr()));
+ print_scr_button->setMinimumHeight(50);
+
+ file_layout->addWidget(message_label_, 0, 0);
+ file_layout->addWidget(file_list_, 1, 0);
+ file_layout->addWidget(primary_checkbox, 2, 0);
+ file_layout->addWidget(internal_checkbox, 3, 0);
+ file_layout->addWidget(browse_button, 4, 0);
+ file_layout->addWidget(print_scr_button, 5, 0);
+
+ return file_layout;
+ }
+
+ void update_file_list() {
+ QFileInfoList list = file_dir_.entryInfoList();
+ file_list_->clear();
+ if (file_dir_.count() == 0) {
+ return;
+ }
+ QFileInfoList::const_iterator it;
+ for (it = list.begin(); it != list.end(); it++) {
+ file_list_->addItem(it->fileName());
+ }
+ file_list_->setCurrentRow(0);
+ }
+
+ QDir file_dir_;
+ QString file_name_;
+ GLWidget* glWidget_;
+ QListWidget* file_list_;
+ QLabel* message_label_;
+};
+
+int main(int argc, char* argv[]) {
+ QApplication app(argc, argv);
+ MainWindow window;
+ window.show();
+ return app.exec();
+}
+
+#include "voronoi_visualizer.moc"
diff --git a/src/boost/libs/polygon/index.html b/src/boost/libs/polygon/index.html
new file mode 100644
index 000000000..3e6e42f31
--- /dev/null
+++ b/src/boost/libs/polygon/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+ <title>Boost.Polygon Documentation</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
+ <meta http-equiv="refresh" content="0; URL=doc/index.htm" />
+</head>
+
+<body>
+ Automatic redirection failed, please go to <a href=
+ "doc/index.htm">doc/index.htm</a>
+
+<br>
+Copyright (C) 2010 Intel Corporation <br>
+<br>
+Distributed under the Boost Software License, Version 1.0. (See
+accompanying file LICENSE_1_0.txt or copy at
+<a href=http://www.boost.org/LICENSE_1_0.txt>http://www.boost.org/LICENSE_1_0.tx
+t</a>) <br>
+</body>
+</html>
+
diff --git a/src/boost/libs/polygon/meta/libraries.json b/src/boost/libs/polygon/meta/libraries.json
new file mode 100644
index 000000000..bfdf883a8
--- /dev/null
+++ b/src/boost/libs/polygon/meta/libraries.json
@@ -0,0 +1,18 @@
+{
+ "key": "polygon",
+ "name": "Polygon",
+ "authors": [
+ "Lucanus Simonson",
+ "Andrii Sydorchuk"
+ ],
+ "description": "Voronoi diagram construction and booleans/clipping, resizing/offsetting and more for planar polygons with integral coordinates.",
+ "category": [
+ "Algorithms",
+ "Data",
+ "Math"
+ ],
+ "maintainers": [
+ "Lucanus Simonson <lucanus.j.simonson -at- intel.com>",
+ "Andrii Sydorchuk <sydorchuk.andriy -at- gmail.com>"
+ ]
+}
diff --git a/src/boost/libs/polygon/test/Jamfile.v2 b/src/boost/libs/polygon/test/Jamfile.v2
new file mode 100644
index 000000000..16787e3d4
--- /dev/null
+++ b/src/boost/libs/polygon/test/Jamfile.v2
@@ -0,0 +1,26 @@
+# test/Jamfile.v2 controls building of Polygon Library unit tests
+#
+# Copyright (c) 2010 Intel Corporation
+#
+# Use, modification and distribution is subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+run polygon_point_test.cpp ;
+run polygon_segment_test.cpp ;
+run polygon_interval_test.cpp ;
+run polygon_rectangle_test.cpp ;
+run polygon_rectangle_formation_test.cpp ;
+run polygon_set_data_test.cpp ;
+run polygon_90_data_test.cpp ;
+run gtl_boost_unit_test.cpp ;
+
+run voronoi_builder_test.cpp ;
+run voronoi_ctypes_test.cpp ;
+run voronoi_diagram_test.cpp ;
+run voronoi_geometry_type_test.cpp ;
+run voronoi_predicates_test.cpp ;
+run voronoi_robust_fpt_test.cpp ;
+run voronoi_structures_test.cpp ;
diff --git a/src/boost/libs/polygon/test/gtl_boost_unit_test.cpp b/src/boost/libs/polygon/test/gtl_boost_unit_test.cpp
new file mode 100644
index 000000000..c85d5d661
--- /dev/null
+++ b/src/boost/libs/polygon/test/gtl_boost_unit_test.cpp
@@ -0,0 +1,3866 @@
+/*
+ Copyright 2008 Intel Corporation
+
+ Use, modification and distribution are subject to the Boost Software License,
+ Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+*/
+#include <iostream>
+#define BOOST_POLYGON_NO_DEPS
+#include <boost/polygon/polygon.hpp>
+
+namespace gtl = boost::polygon;
+using namespace boost::polygon::operators;
+#include <time.h>
+#include <stdlib.h>
+
+void assert_s(bool c, std::string msg) {
+ if(!c) {
+ std::cout << msg << std::endl;
+ exit( 1);
+ }
+}
+
+namespace boost { namespace polygon{
+ void addpoly(polygon_45_set_data<int>& pset,
+ int* pts, unsigned int numpts) {
+ std::vector<point_data<int> > mppts;
+ for(unsigned int i = 0; i < numpts*2; i += 2) {
+ point_data<int> pt(pts[i], pts[i+1]);
+ mppts.push_back(pt);
+ }
+ polygon_45_data<int> poly;
+ poly.set(mppts.begin(), mppts.end());
+ pset += poly;
+ }
+
+ template <class T>
+ std::ostream& operator << (std::ostream& o, const interval_data<T>& i)
+ {
+ return o << i.get(LOW) << ' ' << i.get(HIGH);
+ }
+ template <class T>
+ std::ostream& operator << (std::ostream& o, const point_data<T>& r)
+ {
+ return o << r.get(HORIZONTAL) << ' ' << r.get(VERTICAL);
+ }
+ template <typename T>
+ std::ostream& operator<<(std::ostream& o, const polygon_45_data<T>& poly) {
+ o << "Polygon { ";
+ for(typename polygon_45_data<T>::iterator_type itr = poly.begin();
+ itr != poly.end(); ++itr) {
+ if(itr != poly.begin()) o << ", ";
+ o << (*itr).get(HORIZONTAL) << " " << (*itr).get(VERTICAL);
+ }
+ o << " } ";
+ return o;
+ }
+ template <typename Unit>
+ inline std::ostream& operator<< (std::ostream& o, const polygon_45_set_data<Unit>& p) {
+ o << "Polygon45Set ";
+ o << " " << !p.sorted() << " " << p.dirty() << " { ";
+ for(typename polygon_45_set_data<Unit>::iterator_type itr = p.begin();
+ itr != p.end(); ++itr) {
+ o << (*itr).pt << ":";
+ for(unsigned int i = 0; i < 4; ++i) {
+ o << (*itr).count[i] << ",";
+ } o << " ";
+ //o << (*itr).first << ":" << (*itr).second << "; ";
+ }
+ o << "} ";
+ return o;
+ }
+
+ template <typename Unit>
+ inline std::istream& operator>> (std::istream& i, polygon_45_set_data<Unit>& p) {
+ //TODO
+ return i;
+ }
+ template <typename T>
+ std::ostream& operator << (std::ostream& o, const polygon_90_data<T>& r)
+ {
+ o << "Polygon { ";
+ for(typename polygon_90_data<T>::iterator_type itr = r.begin(); itr != r.end(); ++itr) {
+ o << *itr << ", ";
+ }
+ return o << "} ";
+ }
+
+ template <typename T>
+ std::istream& operator >> (std::istream& i, polygon_90_data<T>& r)
+ {
+ std::size_t size;
+ i >> size;
+ std::vector<T> vec;
+ vec.reserve(size);
+ for(std::size_t ii = 0; ii < size; ++ii) {
+ T coord;
+ i >> coord;
+ vec.push_back(coord);
+ }
+ r.set_compact(vec.begin(), vec.end());
+ return i;
+ }
+
+ template <typename T>
+ std::ostream& operator << (std::ostream& o, const std::vector<polygon_90_data<T> >& r) {
+ o << r.size() << ' ';
+ for(std::size_t ii = 0; ii < r.size(); ++ii) {
+ o << (r[ii]);
+ }
+ return o;
+ }
+ template <typename T>
+ std::istream& operator >> (std::istream& i, std::vector<polygon_90_data<T> >& r) {
+ std::size_t size;
+ i >> size;
+ r.clear();
+ r.reserve(size);
+ for(std::size_t ii = 0; ii < size; ++ii) {
+ polygon_90_data<T> tmp;
+ i >> tmp;
+ r.push_back(tmp);
+ }
+ return i;
+ }
+ template <typename T>
+ std::ostream& operator<<(std::ostream& o, const polygon_data<T>& poly) {
+ o << "Polygon { ";
+ for(typename polygon_data<T>::iterator_type itr = poly.begin();
+ itr != poly.end(); ++itr) {
+ if(itr != poly.begin()) o << ", ";
+ o << (*itr).get(HORIZONTAL) << " " << (*itr).get(VERTICAL);
+ }
+ o << " } ";
+ return o;
+ }
+ template <typename T>
+ std::ostream& operator << (std::ostream& o, const polygon_set_data<T>& r)
+ {
+ o << "Polygon Set Data { ";
+ for(typename polygon_set_data<T>::iterator_type itr = r.begin(); itr != r.end(); ++itr) {
+ o << "<" << (*itr).first.first << ", " << (*itr).first.second << ">:" << (*itr).second << " ";
+ }
+ o << "} ";
+ return o;
+ }
+ template <typename T>
+ std::ostream& operator<<(std::ostream& o, const polygon_90_with_holes_data<T>& poly) {
+ o << "Polygon With Holes { ";
+ for(typename polygon_90_with_holes_data<T>::iterator_type itr = poly.begin();
+ itr != poly.end(); ++itr) {
+ if(itr != poly.begin()) o << ", ";
+ o << (*itr).get(HORIZONTAL) << " " << (*itr).get(VERTICAL);
+ } o << " { ";
+ for(typename polygon_90_with_holes_data<T>::iterator_holes_type itr = poly.begin_holes();
+ itr != poly.end_holes(); ++itr) {
+ o << (*itr);
+ }
+ o << " } } ";
+ return o;
+ }
+ template <typename T>
+ std::ostream& operator<<(std::ostream& o, const polygon_45_with_holes_data<T>& poly) {
+ o << "Polygon With Holes { ";
+ for(typename polygon_45_with_holes_data<T>::iterator_type itr = poly.begin();
+ itr != poly.end(); ++itr) {
+ if(itr != poly.begin()) o << ", ";
+ o << (*itr).get(HORIZONTAL) << " " << (*itr).get(VERTICAL);
+ } o << " { ";
+ for(typename polygon_45_with_holes_data<T>::iterator_holes_type itr = poly.begin_holes();
+ itr != poly.end_holes(); ++itr) {
+ o << (*itr);
+ }
+ o << " } } ";
+ return o;
+ }
+ template <typename T>
+ std::ostream& operator<<(std::ostream& o, const polygon_with_holes_data<T>& poly) {
+ o << "Polygon With Holes { ";
+ for(typename polygon_with_holes_data<T>::iterator_type itr = poly.begin();
+ itr != poly.end(); ++itr) {
+ if(itr != poly.begin()) o << ", ";
+ o << (*itr).get(HORIZONTAL) << " " << (*itr).get(VERTICAL);
+ } o << " { ";
+ for(typename polygon_with_holes_data<T>::iterator_holes_type itr = poly.begin_holes();
+ itr != poly.end_holes(); ++itr) {
+ o << (*itr);
+ }
+ o << " } } ";
+ return o;
+ }
+ template <class T>
+ std::ostream& operator << (std::ostream& o, const rectangle_data<T>& r)
+ {
+ return o << r.get(HORIZONTAL) << ' ' << r.get(VERTICAL);
+ }
+ template <class T>
+ std::ostream& operator << (std::ostream& o, const segment_data<T>& r)
+ {
+ return o << r.get(LOW) << ' ' << r.get(HIGH);
+ }
+
+
+ template <typename T>
+ typename enable_if<typename is_polygon_90_set_type<T>::type, void>::type
+ print_is_polygon_90_set_concept(const T& ) { std::cout << "is polygon 90 set concept\n"; }
+ template <typename T>
+ typename enable_if<typename is_mutable_polygon_90_set_type<T>::type, void>::type
+ print_is_mutable_polygon_90_set_concept(const T& ) { std::cout << "is mutable polygon 90 set concept\n"; }
+ namespace boolean_op {
+ //self contained unit test for BooleanOr algorithm
+ template <typename Unit>
+ inline bool testBooleanOr() {
+ BooleanOp<int, Unit> booleanOr;
+ //test one rectangle
+ std::vector<std::pair<interval_data<Unit>, int> > container;
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), 1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), -1);
+ if(container.size() != 2) {
+ std::cout << "Test one rectangle, wrong output size\n";
+ return false;
+ }
+ if(container[0] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 10), 1)) {
+ std::cout << "Test one rectangle, first output wrong: Interval(" <<
+ container[0].first << "), " << container[0].second << std::endl;
+ }
+ if(container[1] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 10), -1)) {
+ std::cout << "Test one rectangle, second output wrong: Interval(" <<
+ container[1].first << "), " << container[1].second << std::endl;
+ }
+
+ //test two rectangles
+ container.clear();
+ booleanOr = BooleanOp<int, Unit>();
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), 1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(5, 15), 1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), -1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(5, 15), -1);
+ if(container.size() != 4) {
+ std::cout << "Test two rectangles, wrong output size\n";
+ for(std::size_t i = 0; i < container.size(); ++i){
+ std::cout << container[i].first << "), " << container[i].second << std::endl;
+ }
+ return false;
+ }
+ if(container[0] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 10), 1)) {
+ std::cout << "Test two rectangles, first output wrong: Interval(" <<
+ container[0].first << "), " << container[0].second << std::endl;
+ }
+ if(container[1] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(10, 15), 1)) {
+ std::cout << "Test two rectangles, second output wrong: Interval(" <<
+ container[1].first << "), " << container[1].second << std::endl;
+ }
+ if(container[2] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 5), -1)) {
+ std::cout << "Test two rectangles, third output wrong: Interval(" <<
+ container[2].first << "), " << container[2].second << std::endl;
+ }
+ if(container[3] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(5, 15), -1)) {
+ std::cout << "Test two rectangles, fourth output wrong: Interval(" <<
+ container[3].first << "), " << container[3].second << std::endl;
+ }
+
+ //test two rectangles
+ container.clear();
+ booleanOr = BooleanOp<int, Unit>();
+ booleanOr.processInterval(container, interval_data<Unit>(5, 15), 1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), 1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(5, 15), -1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), -1);
+ if(container.size() != 4) {
+ std::cout << "Test other two rectangles, wrong output size\n";
+ for(std::size_t i = 0; i < container.size(); ++i){
+ std::cout << container[i].first << "), " << container[i].second << std::endl;
+ }
+ return false;
+ }
+ if(container[0] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(5, 15), 1)) {
+ std::cout << "Test other two rectangles, first output wrong: Interval(" <<
+ container[0].first << "), " << container[0].second << std::endl;
+ }
+ if(container[1] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 5), 1)) {
+ std::cout << "Test other two rectangles, second output wrong: Interval(" <<
+ container[1].first << "), " << container[1].second << std::endl;
+ }
+ if(container[2] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(10, 15), -1)) {
+ std::cout << "Test other two rectangles, third output wrong: Interval(" <<
+ container[2].first << "), " << container[2].second << std::endl;
+ }
+ if(container[3] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 10), -1)) {
+ std::cout << "Test other two rectangles, fourth output wrong: Interval(" <<
+ container[3].first << "), " << container[3].second << std::endl;
+ }
+
+ //test two nonoverlapping rectangles
+ container.clear();
+ booleanOr = BooleanOp<int, Unit>();
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), 1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(15, 25), 1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(0, 10), -1);
+ booleanOr.advanceScan();
+ booleanOr.processInterval(container, interval_data<Unit>(15, 25), -1);
+ if(container.size() != 4) {
+ std::cout << "Test two nonoverlapping rectangles, wrong output size\n";
+ return false;
+ }
+ if(container[0] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 10), 1)) {
+ std::cout << "Test two nonoverlapping rectangles, first output wrong: Interval(" <<
+ container[0].first << "), " << container[0].second << std::endl;
+ }
+ if(container[1] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(15, 25), 1)) {
+ std::cout << "Test two nonoverlapping rectangles, second output wrong: Interval(" <<
+ container[1].first << "), " << container[1].second << std::endl;
+ }
+ if(container[2] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(0, 10), -1)) {
+ std::cout << "Test two nonoverlapping rectangles, third output wrong: Interval(" <<
+ container[2].first << "), " << container[2].second << std::endl;
+ }
+ if(container[3] != std::pair<interval_data<Unit>, int>(interval_data<Unit>(15, 25), -1)) {
+ std::cout << "Test two nonoverlapping rectangles, fourth output wrong: Interval(" <<
+ container[3].first << "), " << container[3].second << std::endl;
+ }
+ return true;
+ }
+ }
+
+ void test_assign() {
+ using namespace gtl;
+ std::vector<polygon_data<int> > ps;
+ polygon_90_set_data<int> ps90;
+ assign(ps, ps90);
+ }
+
+ //this is a compile time test, if it compiles it passes
+ void test_view_as() {
+ using namespace gtl;
+ polygon_data<int> p;
+ polygon_45_data<int> p45;
+ polygon_90_data<int> p90;
+ polygon_with_holes_data<int> pwh;
+ polygon_45_with_holes_data<int> p45wh;
+ polygon_90_with_holes_data<int> p90wh;
+ rectangle_data<int> rect(0, 1, 10, 11);
+ polygon_90_set_data<int> ps90;
+ polygon_45_set_data<int> ps45;
+ polygon_set_data<int> ps;
+
+ assign(p, rect);
+ assign(p90, view_as<polygon_90_concept>(p));
+ if(!equivalence(p90, rect))
+ std::cout << "fail 1\n";
+ assign(p45, view_as<polygon_45_concept>(p));
+ if(!equivalence(p45, rect))
+ std::cout << "fail 2\n";
+ assign(p90, view_as<polygon_90_concept>(p45));
+ if(!equivalence(p90, rect))
+ std::cout << "fail 3\n";
+ if(!equivalence(rect, view_as<rectangle_concept>(p)))
+ std::cout << "fail 4\n";
+ if(!equivalence(rect, view_as<rectangle_concept>(p45)))
+ std::cout << "fail 5\n";
+ if(!equivalence(rect, view_as<rectangle_concept>(p90)))
+ std::cout << "fail 6\n";
+ assign(pwh, rect);
+ assign(p90wh, rect);
+ assign(p45wh, rect);
+ if(!equivalence(rect, view_as<rectangle_concept>(pwh)))
+ std::cout << "fail 7\n";
+ if(!equivalence(rect, view_as<rectangle_concept>(p45wh)))
+ std::cout << "fail 8\n";
+ if(!equivalence(rect, view_as<rectangle_concept>(p90wh)))
+ std::cout << "fail 9\n";
+ assign(p90wh, view_as<polygon_90_with_holes_concept>(pwh));
+ if(!equivalence(p90wh, rect))
+ std::cout << "fail 10\n";
+ assign(p45wh, view_as<polygon_45_with_holes_concept>(pwh));
+ if(!equivalence(p45wh, rect))
+ std::cout << "fail 11\n";
+ assign(p90wh, view_as<polygon_90_with_holes_concept>(p45wh));
+ if(!equivalence(p90wh, rect))
+ std::cout << "fail 12\n";
+ assign(p90, view_as<polygon_90_concept>(pwh));
+ if(!equivalence(p90, rect))
+ std::cout << "fail 13\n";
+ assign(p45, view_as<polygon_45_concept>(pwh));
+ if(!equivalence(p45, rect))
+ std::cout << "fail 14\n";
+ assign(p90, view_as<polygon_90_concept>(p45wh));
+ if(!equivalence(p90, rect))
+ std::cout << "fail 15\n";
+ assign(ps, rect);
+ assign(ps90, view_as<polygon_90_set_concept>(ps));
+ if(!equivalence(ps90, rect))
+ std::cout << "fail 16\n";
+ assign(ps45, view_as<polygon_45_set_concept>(ps));
+ if(!equivalence(ps45, rect))
+ std::cout << "fail 17\n";
+ assign(ps90, view_as<polygon_90_set_concept>(ps45));
+ if(!equivalence(ps90, rect))
+ std::cout << "fail 18\n";
+ }
+
+ inline bool testPolygon45SetRect() {
+ std::vector<point_data<int> > points;
+ points.push_back(point_data<int>(0,0));
+ points.push_back(point_data<int>(0,10));
+ points.push_back(point_data<int>(10,10));
+ points.push_back(point_data<int>(10,0));
+ polygon_45_data<int> poly;
+ poly.set(points.begin(), points.end());
+ polygon_45_set_data<int> ps;
+ ps.insert(poly);
+ std::vector<polygon_45_data<int> > polys;
+ ps.get_polygons(polys);
+ std::cout << polys.size() << std::endl;
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ return true;
+ }
+
+ inline bool testPolygon45Set() {
+ polygon_45_formation<int>::Polygon45Formation pf(true);
+ typedef boolean_op_45<int>::Vertex45 Vertex45;
+ std::vector<Vertex45> data;
+ // result == 0 8 -1 1
+ data.push_back(Vertex45(point_data<int>(0, 8), -1, 1));
+ // result == 0 8 1 -1
+ data.push_back(Vertex45(point_data<int>(0, 8), 1, -1));
+ // result == 4 0 1 1
+ data.push_back(Vertex45(point_data<int>(4, 0), 1, 1));
+ // result == 4 0 2 1
+ data.push_back(Vertex45(point_data<int>(4, 0), 2, 1));
+ // result == 4 4 2 -1
+ data.push_back(Vertex45(point_data<int>(4, 4), 2, -1));
+ // result == 4 4 -1 -1
+ data.push_back(Vertex45(point_data<int>(4, 4), -1, -1));
+ // result == 4 12 1 1
+ data.push_back(Vertex45(point_data<int>(4, 12), 1, 1));
+ // result == 4 12 2 1
+ data.push_back(Vertex45(point_data<int>(4, 12), 2, 1));
+ // result == 4 16 2 -1
+ data.push_back(Vertex45(point_data<int>(4, 16), 2, 1));
+ // result == 4 16 -1 -1
+ data.push_back(Vertex45(point_data<int>(4, 16), -1, -1));
+ // result == 6 2 1 -1
+ data.push_back(Vertex45(point_data<int>(6, 2), 1, -1));
+ // result == 6 14 -1 1
+ data.push_back(Vertex45(point_data<int>(6, 14), -1, 1));
+ // result == 6 2 -1 1
+ data.push_back(Vertex45(point_data<int>(6, 2), -1, 1));
+ // result == 6 14 1 -1
+ data.push_back(Vertex45(point_data<int>(6, 14), 1, -1));
+ // result == 8 0 -1 -1
+ data.push_back(Vertex45(point_data<int>(8, 0), -1, -1));
+ // result == 8 0 2 -1
+ data.push_back(Vertex45(point_data<int>(8, 0), 2, -1));
+ // result == 8 4 2 1
+ data.push_back(Vertex45(point_data<int>(8, 4), 2, 1));
+ // result == 8 4 1 1
+ data.push_back(Vertex45(point_data<int>(8, 4), 1, 1));
+ // result == 8 12 -1 -1
+ data.push_back(Vertex45(point_data<int>(8, 12), -1, -1));
+ // result == 8 12 2 -1
+ data.push_back(Vertex45(point_data<int>(8, 12), 2, -1));
+ // result == 8 16 2 1
+ data.push_back(Vertex45(point_data<int>(8, 16), 2, 1));
+ // result == 8 16 1 1
+ data.push_back(Vertex45(point_data<int>(8, 16), 1, 1));
+ // result == 12 8 1 -1
+ data.push_back(Vertex45(point_data<int>(12, 8), 1, -1));
+ // result == 12 8 -1 1
+ data.push_back(Vertex45(point_data<int>(12, 8), -1, 1));
+
+ data.push_back(Vertex45(point_data<int>(6, 4), 1, -1));
+ data.push_back(Vertex45(point_data<int>(6, 4), 2, -1));
+ data.push_back(Vertex45(point_data<int>(6, 12), -1, 1));
+ data.push_back(Vertex45(point_data<int>(6, 12), 2, 1));
+ data.push_back(Vertex45(point_data<int>(10, 8), -1, -1));
+ data.push_back(Vertex45(point_data<int>(10, 8), 1, 1));
+
+ std::sort(data.begin(), data.end());
+ std::vector<polygon_45_data<int> > polys;
+ pf.scan(polys, data.begin(), data.end());
+ polygon_45_set_data<int> ps;
+ std::cout << "inserting1\n";
+ //std::vector<point_data<int> > points;
+ //points.push_back(point_data<int>(0,0));
+ //points.push_back(point_data<int>(0,10));
+ //points.push_back(point_data<int>(10,10));
+ //points.push_back(point_data<int>(10,0));
+ //Polygon45 poly;
+ //poly.set(points.begin(), points.end());
+ //ps.insert(poly);
+ ps.insert(polys[0]);
+
+ polygon_45_set_data<int> ps2;
+ std::cout << "inserting2\n";
+ ps2.insert(polys[0]);
+ std::cout << "applying boolean\n";
+ ps |= ps2;
+ std::vector<polygon_45_data<int> > polys2;
+ std::cout << "getting result\n";
+ ps.get_polygons(polys2);
+ std::cout << ps2 << std::endl;
+ std::cout << ps << std::endl;
+ std::cout << polys[0] << std::endl;
+ std::cout << polys2[0] << std::endl;
+ if(polys != polys2) std::cout << "test Polygon45Set failed\n";
+ return polys == polys2;
+ }
+
+ inline bool testPolygon45SetPerterbation() {
+ polygon_45_formation<int>::Polygon45Formation pf(true);
+ typedef boolean_op_45<int>::Vertex45 Vertex45;
+ std::vector<Vertex45> data;
+ // result == 0 8 -1 1
+ data.push_back(Vertex45(point_data<int>(0, 80), -1, 1));
+ // result == 0 8 1 -1
+ data.push_back(Vertex45(point_data<int>(0, 80), 1, -1));
+ // result == 4 0 1 1
+ data.push_back(Vertex45(point_data<int>(40, 0), 1, 1));
+ // result == 4 0 2 1
+ data.push_back(Vertex45(point_data<int>(40, 0), 2, 1));
+ // result == 4 4 2 -1
+ data.push_back(Vertex45(point_data<int>(40, 40), 2, -1));
+ // result == 4 4 -1 -1
+ data.push_back(Vertex45(point_data<int>(40, 40), -1, -1));
+ // result == 4 12 1 1
+ data.push_back(Vertex45(point_data<int>(40, 120), 1, 1));
+ // result == 4 12 2 1
+ data.push_back(Vertex45(point_data<int>(40, 120), 2, 1));
+ // result == 4 16 2 -1
+ data.push_back(Vertex45(point_data<int>(40, 160), 2, 1));
+ // result == 4 16 -1 -1
+ data.push_back(Vertex45(point_data<int>(40, 160), -1, -1));
+ // result == 6 2 1 -1
+ data.push_back(Vertex45(point_data<int>(60, 20), 1, -1));
+ // result == 6 14 -1 1
+ data.push_back(Vertex45(point_data<int>(60, 140), -1, 1));
+ // result == 6 2 -1 1
+ data.push_back(Vertex45(point_data<int>(60, 20), -1, 1));
+ // result == 6 14 1 -1
+ data.push_back(Vertex45(point_data<int>(60, 140), 1, -1));
+ // result == 8 0 -1 -1
+ data.push_back(Vertex45(point_data<int>(80, 0), -1, -1));
+ // result == 8 0 2 -1
+ data.push_back(Vertex45(point_data<int>(80, 0), 2, -1));
+ // result == 8 4 2 1
+ data.push_back(Vertex45(point_data<int>(80, 40), 2, 1));
+ // result == 8 4 1 1
+ data.push_back(Vertex45(point_data<int>(80, 40), 1, 1));
+ // result == 8 12 -1 -1
+ data.push_back(Vertex45(point_data<int>(80, 120), -1, -1));
+ // result == 8 12 2 -1
+ data.push_back(Vertex45(point_data<int>(80, 120), 2, -1));
+ // result == 8 16 2 1
+ data.push_back(Vertex45(point_data<int>(80, 160), 2, 1));
+ // result == 8 16 1 1
+ data.push_back(Vertex45(point_data<int>(80, 160), 1, 1));
+ // result == 12 8 1 -1
+ data.push_back(Vertex45(point_data<int>(120, 80), 1, -1));
+ // result == 12 8 -1 1
+ data.push_back(Vertex45(point_data<int>(120, 80), -1, 1));
+
+ data.push_back(Vertex45(point_data<int>(60, 40), 1, -1));
+ data.push_back(Vertex45(point_data<int>(60, 40), 2, -1));
+ data.push_back(Vertex45(point_data<int>(60, 120), -1, 1));
+ data.push_back(Vertex45(point_data<int>(60, 120), 2, 1));
+ data.push_back(Vertex45(point_data<int>(100, 80), -1, -1));
+ data.push_back(Vertex45(point_data<int>(100, 80), 1, 1));
+
+ std::sort(data.begin(), data.end());
+ std::vector<polygon_45_data<int> > polys;
+ pf.scan(polys, data.begin(), data.end());
+ polygon_45_set_data<int> ps;
+ std::cout << "inserting1\n";
+ //std::vector<point_data<int> > points;
+ //points.push_back(point_data<int>(0,0));
+ //points.push_back(point_data<int>(0,10));
+ //points.push_back(point_data<int>(10,10));
+ //points.push_back(point_data<int>(10,0));
+ //Polygon45 poly;
+ //poly.set(points.begin(), points.end());
+ //ps.insert(poly);
+ polygon_45_set_data<int> preps(polys[0]);
+
+ ps.insert(polys[0]);
+ convolve(polys[0], point_data<int>(0, 1) );
+
+ polygon_45_set_data<int> ps2;
+ std::cout << "inserting2\n";
+ ps2.insert(polys[0]);
+ std::cout << "applying boolean\n";
+ ps |= ps2;
+ std::vector<polygon_45_data<int> > polys2;
+ std::cout << "getting result\n";
+ ps.get_polygons(polys2);
+ std::cout << preps << std::endl;
+ std::cout << ps2 << std::endl;
+ std::cout << ps << std::endl;
+ std::cout << polys[0] << std::endl;
+ std::cout << polys2[0] << std::endl;
+ if(polys != polys2) std::cout << "test Polygon45Set failed\n";
+ return polys == polys2;
+ //return true;
+ }
+
+ inline int testPolygon45SetDORA() {
+ std::cout << "testPolygon45SetDORA" << std::endl;
+ std::vector<point_data<int> > pts;
+ pts.push_back(point_data<int>(0, 0));
+ pts.push_back(point_data<int>(10, 0));
+ pts.push_back(point_data<int>(10, 10));
+ pts.push_back(point_data<int>(0, 10));
+ polygon_45_data<int> apoly;
+ apoly.set(pts.begin(), pts.end());
+ polygon_45_set_data<int> ps(apoly);
+ polygon_45_set_data<int> ps2(ps);
+ ps2 = apoly;
+ std::vector<polygon_45_data<int> > apolys;
+ apolys.push_back(apoly);
+ ps2.insert(apolys.begin(), apolys.end());
+ apolys.clear();
+ ps2.get(apolys);
+ std::cout << apolys.size() << std::endl;
+ std::cout << (ps == ps2) << std::endl;
+ std::cout << !(ps != ps2) << std::endl;
+ ps2.clear();
+ std::cout << (ps2.value().empty()) << std::endl;
+ ps2.set(apolys.begin(), apolys.end());
+ ps2.set(ps.value());
+ ps.clean();
+ ps2.set_clean(ps.value());
+ ps2.insert(ps.value().begin(), ps.value().end());
+ ps2.clear();
+ for(polygon_45_set_data<int>::iterator_type itr = ps.begin();
+ itr != ps.end(); ++itr) {
+ ps2.insert(*itr);
+ }
+ std::vector<polygon_45_with_holes_data<int> > apolywhs;
+ ps2.get_polygons_with_holes(apolywhs);
+ std::cout << apolywhs.size() << std::endl;
+ ps2 += 1;
+ apolywhs.clear();
+ ps2.get_polygons_with_holes(apolywhs);
+ if(apolywhs.size()) std::cout << apolywhs[0] << std::endl;
+ ps2 -= 1;
+ apolywhs.clear();
+ ps2.get_polygons_with_holes(apolywhs);
+ if(apolywhs.size()) std::cout << apolywhs[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ rectangle_data<int> rect;
+ extents(rect, apolywhs[0]);
+ ps2.clear();
+ ps2.insert(rect);
+ ps2.extents(rect);
+ ps2.clear();
+ ps2.insert(rect);
+ ps2.clear();
+ ps2.insert(apolywhs[0]);
+ apolywhs.clear();
+ ps2.get_trapezoids(apolywhs);
+ if(apolywhs.size()) std::cout << apolywhs[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ ps2 *= ps;
+ std::cout << (ps2 == ps) << std::endl;
+ ps2 ^= ps;
+ std::cout << ps2.empty() << std::endl;
+ axis_transformation atr(axis_transformation::WEST_SOUTH);
+ ps2 = ps;
+ ps.transform(atr);
+ transformation<int> tr(atr);
+ tr.invert();
+ ps.transform(tr);
+ ps.scale_up(2);
+ ps.scale_down(2);
+ std::cout << (ps2 == ps) << std::endl;
+ pts.clear();
+ pts.push_back(point_data<int>(0,0));
+ pts.push_back(point_data<int>(10,10));
+ pts.push_back(point_data<int>(10,11));
+ pts.push_back(point_data<int>(0,21));
+ apoly.set(pts.begin(), pts.end());
+ ps2.clear();
+ ps2.insert(apoly);
+ ps2 -= 1;
+ apolywhs.clear();
+ ps2.get_polygons_with_holes(apolywhs);
+ if(apolywhs.size()) std::cout << apolywhs[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ pts.clear();
+ pts.push_back(point_data<int>(0, 0));
+ pts.push_back(point_data<int>(10, 10));
+ pts.push_back(point_data<int>(0, 20));
+ apoly.set(pts.begin(), pts.end());
+ ps2.clear();
+ ps2.insert(apoly);
+ pts.clear();
+ pts.push_back(point_data<int>(0, 5));
+ pts.push_back(point_data<int>(10, 15));
+ pts.push_back(point_data<int>(0, 25));
+ apoly.set(pts.begin(), pts.end());
+ ps2.insert(apoly);
+ apolywhs.clear();
+ ps2.get_polygons_with_holes(apolywhs);
+ if(apolywhs.size()) std::cout << apolywhs[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ return 0;
+
+ }
+}
+}
+using namespace gtl;
+
+bool testRectangle() {
+ rectangle_data<int> rect, rect2;
+#ifdef BOOST_POLYGON_MSVC
+ horizontal(rect, interval_data<int>(0, 10));
+ vertical(rect, interval_data<int>(20, 30));
+#else
+ horizontal(rect, interval_data<polygon_long_long_type>(0, 10));
+ vertical(rect, interval_data<polygon_long_long_type>(20, 30));
+#endif
+ xl(rect2, 0);
+ xh(rect2, 10);
+ yl(rect2, 20);
+ yh(rect2, 30);
+ if(euclidean_distance(rect, rect2) != 0) return false;
+ if(euclidean_distance(rect2, rect) != 0) return false;
+#ifdef BOOST_POLYGON_MSVC
+ set(rect, HORIZONTAL, interval_data<int>(0, 10));
+ if(!equivalence(horizontal(rect), interval_data<int>(0, 10))) return false;
+ if(!equivalence(vertical(rect2), interval_data<int>(20, 30))) return false;
+#else
+ set(rect, HORIZONTAL, interval_data<polygon_long_long_type>(0, 10));
+ if(!equivalence(horizontal(rect), interval_data<polygon_long_long_type>(0, 10))) return false;
+ if(!equivalence(vertical(rect2), interval_data<polygon_long_long_type>(20, 30))) return false;
+#endif
+ if(xl(rect) != 0) return false;
+ if(xh(rect) != 10) return false;
+ if(yl(rect) != 20) return false;
+ if(yh(rect) != 30) return false;
+ move(rect, HORIZONTAL, 10);
+ if(xl(rect) != 10) return false;
+#ifdef BOOST_POLYGON_MSVC
+ set_points(rect, point_data<int>(0, 20), point_data<int>(10, 30));
+#else
+ set_points(rect, point_data<int>(0, 20), point_data<polygon_long_long_type>(10, 30));
+#endif
+ if(xl(rect) != 0) return false;
+ convolve(rect, rect2);
+ if(xh(rect) != 20) return false;
+ deconvolve(rect, rect2);
+ if(xh(rect) != 10) return false;
+ reflected_convolve(rect, rect2);
+ reflected_deconvolve(rect, rect2);
+ if(!equivalence(rect, rect2)) return false;
+#ifdef BOOST_POLYGON_MSVC
+ convolve(rect, point_data<int>(100, 200));
+#else
+ convolve(rect, point_data<polygon_long_long_type>(100, 200));
+#endif
+ if(xh(rect) != 110) return false;
+ deconvolve(rect, point_data<int>(100, 200));
+ if(!equivalence(rect, rect2)) return false;
+ xh(rect, 100);
+ if(delta(rect, HORIZONTAL) != 100) return false;
+ if(area(rect) != 1000) return false;
+ if(half_perimeter(rect) != 110) return false;
+ if(perimeter(rect) != 220) return false;
+ if(guess_orientation(rect) != HORIZONTAL) return false;
+ return true;
+}
+
+
+bool testPolygon() {
+ int rect[4] = {0, 10, 20, 30};
+ iterator_compact_to_points<int*, point_data<int> > itr(rect, rect+4);
+ iterator_compact_to_points<int*, point_data<int> > itr_end(rect, rect+4);
+ std::vector<point_data<int> > points;
+ points.insert(points.end(), itr, itr_end);
+ polygon_90_data<int> p90;
+ assign(p90, rectangle_data<int>(interval_data<int>(0, 10), interval_data<int>(20, 30)));
+ if(winding(p90) != COUNTERCLOCKWISE) return false;
+ polygon_45_data<int> p45;
+ assign(p45, rectangle_data<int>(interval_data<int>(0, 10), interval_data<int>(20, 30)));
+ if(winding(p45) != COUNTERCLOCKWISE) return false;
+ polygon_data<int> p;
+ assign(p, rectangle_data<int>(interval_data<int>(0, 10), interval_data<int>(20, 30)));
+ if(winding(p) != COUNTERCLOCKWISE) return false;
+ set_compact(p90, rect, rect+4);
+ if(winding(p90) != COUNTERCLOCKWISE) return false;
+ points.clear();
+ points.push_back(point_data<int>(0, 0));
+ points.push_back(point_data<int>(10, 10));
+ points.push_back(point_data<int>(0, 20));
+ points.push_back(point_data<int>(-10, 10));
+ set_points(p45, points.begin(), points.end());
+ if(winding(p45) != COUNTERCLOCKWISE) return false;
+ std::swap(points[1], points[3]);
+ set_points(p, points.begin(), points.end());
+ if(winding(p) == COUNTERCLOCKWISE) return false;
+ point_data<int> cp;
+ center(cp, p);
+ if(cp != point_data<int>(0, 10)) return false;
+ move(p, HORIZONTAL, 3);
+ rectangle_data<int> bounding_box;
+ extents(bounding_box, p);
+ if(bounding_box != rectangle_data<int>(interval_data<int>(-7, 13), interval_data<int>(0, 20))) return false;
+ if(area(p90) != 400) return false;
+ if(area(p45) != 200) return false;
+ if(perimeter(p90) != 80) return false;
+ return true;
+}
+
+bool testPolygonAssign() {
+ polygon_data<int> p;
+ polygon_data<int> p1;
+ polygon_45_data<int> p_45;
+ polygon_45_data<int> p_451;
+ polygon_90_data<int> p_90;
+ polygon_90_data<int> p_901;
+ polygon_with_holes_data<int> p_wh;
+ polygon_with_holes_data<int> p_wh1;
+ polygon_45_with_holes_data<int> p_45_wh;
+ polygon_45_with_holes_data<int> p_45_wh1;
+ polygon_90_with_holes_data<int> p_90_wh;
+ polygon_90_with_holes_data<int> p_90_wh1;
+ assign(p, p1);
+ assign(p, p_45);
+ assign(p, p_90);
+ //assign(p, p_wh);
+ //assign(p, p_45_wh);
+ //assign(p, p_90_wh);
+ //assign(p_45, p);
+ assign(p_451, p_45);
+ assign(p_45, p_90);
+ //assign(p_45, p_wh);
+ //assign(p_45, p_45_wh);
+ //assign(p_45, p_90_wh);
+ //assign(p_90, p);
+ //assign(p_90, p_45);
+ assign(p_901, p_90);
+ //assign(p_90, p_wh);
+ //assign(p_90, p_45_wh);
+ //assign(p_90, p_90_wh);
+ assign(p_wh, p);
+ assign(p_wh, p_45);
+ assign(p_wh, p_90);
+ assign(p_wh1, p_wh);
+ assign(p_wh, p_45_wh);
+ assign(p_wh, p_90_wh);
+ //assign(p_45_wh, p);
+ assign(p_45_wh, p_45);
+ assign(p_45_wh, p_90);
+ //assign(p_45_wh, p_wh);
+ assign(p_45_wh1, p_45_wh);
+ //assign(p_90_wh, p);
+ //assign(p_90_wh, p_45);
+ assign(p_90_wh, p_90);
+ assign(p_90_wh1, p_90_wh);
+ return true;
+}
+
+int testPropertyMerge() {
+ rectangle_data<int> rect1 = construct<rectangle_data<int> >(0, 1, 10, 11);
+ rectangle_data<int> rect2 = construct<rectangle_data<int> >(5, 6, 17, 18);
+ property_merge_90<int, int> pm;
+ pm.insert(rect1, 0);
+ pm.insert(rect2, 1);
+ std::map<std::set<int>, polygon_90_set_data<int> > result;
+ pm.merge(result);
+ std::vector<rectangle_data<int> > rects;
+ std::set<int> key;
+ key.insert(0);
+ result[key].get(rects);
+ std::cout << rects.size() << std::endl;
+ std::vector<polygon_data<int> > polys;
+ result[key].get(polys);
+ std::cout << polys.size() << std::endl;
+ std::vector<polygon_90_with_holes_data<int> > polywhs;
+ result[key].get(polywhs);
+ std::cout << polys.size() << std::endl;
+ return result.size();
+}
+
+bool testPolygonWithHoles() {
+ int rect[4] = {0, 10, 20, 30};
+ iterator_compact_to_points<int*, point_data<int> > itr(rect, rect+4);
+ iterator_compact_to_points<int*, point_data<int> > itr_end(rect, rect+4);
+ std::vector<point_data<int> > points;
+ points.insert(points.end(), itr, itr_end);
+ polygon_45_with_holes_data<int> p45wh;
+ assign(p45wh, rectangle_data<int>(interval_data<int>(0, 10), interval_data<int>(20, 30)));
+ if(winding(p45wh) != COUNTERCLOCKWISE) return false;
+ polygon_45_with_holes_data<int> p45;
+ assign(p45, rectangle_data<int>(interval_data<int>(0, 10), interval_data<int>(20, 30)));
+ if(winding(p45) != COUNTERCLOCKWISE) return false;
+ polygon_45_with_holes_data<int> p;
+ assign(p, rectangle_data<int>(interval_data<int>(0, 10), interval_data<int>(20, 30)));
+ if(winding(p) != COUNTERCLOCKWISE) return false;
+ set_compact(p45wh, rect, rect+4);
+ if(winding(p45wh) != COUNTERCLOCKWISE) return false;
+ points.clear();
+ points.push_back(point_data<int>(0, 0));
+ points.push_back(point_data<int>(10, 10));
+ points.push_back(point_data<int>(0, 20));
+ points.push_back(point_data<int>(-10, 10));
+ set_points(p45, points.begin(), points.end());
+ if(winding(p45) != COUNTERCLOCKWISE) return false;
+ std::swap(points[1], points[3]);
+ set_points(p, points.begin(), points.end());
+ if(winding(p) == COUNTERCLOCKWISE) return false;
+ point_data<int> cp;
+ center(cp, p);
+ if(cp != point_data<int>(0, 10)) return false;
+ move(p, HORIZONTAL, 3);
+ rectangle_data<int> bounding_box;
+ extents(bounding_box, p);
+ if(bounding_box != rectangle_data<int>(interval_data<int>(-7, 13), interval_data<int>(0, 20))) return false;
+ if(area(p45wh) != 400) return false;
+ if(area(p45) != 200) return false;
+ if(perimeter(p45wh) != 80) return false;
+ return true;
+}
+
+using namespace gtl;
+
+typedef int Unit;
+typedef point_data<int> Point;
+typedef interval_data<int> Interval;
+typedef rectangle_data<int> Rectangle;
+typedef polygon_90_data<int> Polygon;
+typedef polygon_90_with_holes_data<int> PolygonWithHoles;
+typedef polygon_45_data<int> Polygon45;
+typedef polygon_45_with_holes_data<int> Polygon45WithHoles;
+typedef polygon_90_set_data<int> PolygonSet;
+typedef polygon_45_set_data<int> Polygon45Set;
+typedef axis_transformation AxisTransform;
+typedef transformation<int> Transform;
+
+bool getRandomBool() {
+ return rand()%2 != 0;
+}
+int getRandomInt() {
+ return rand()%6-2;
+}
+Point getRandomPoint() {
+ int x = rand()%8;
+ int y = rand()%8;
+ return Point(x, y);
+}
+Polygon45 getRandomTriangle() {
+ Point pts[3];
+ pts[0] = getRandomPoint();
+ pts[1] = pts[2] = pts[0];
+ int disp = getRandomInt();
+ bool dir = getRandomBool();
+ x(pts[2], x(pts[2]) + disp);
+ x(pts[1], x(pts[1]) + disp);
+ if(dir)
+ y(pts[1], y(pts[1]) + disp);
+ else
+ y(pts[1], y(pts[1]) - disp);
+ return Polygon45(pts, pts+3);
+}
+
+bool nonInteger45StessTest() {
+ for(unsigned int tests = 0; tests < 10; ++tests) {
+ Polygon45Set ps1, ps2;
+ std::vector<Polygon45> p45s;
+ for(unsigned int i = 0; i < 10; ++i) {
+ Polygon45 p45 = getRandomTriangle();
+ p45s.push_back(p45);
+ ps1.insert(p45);
+ scale_up(p45, 2);
+ ps2.insert(p45);
+ }
+ std::vector<Polygon45> polys;
+ ps1.get(polys);
+ Polygon45Set ps3;
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ scale_up(polys[i], 2);
+ ps3.insert(polys[i]);
+ }
+ Polygon45Set ps4 = ps3 ^ ps2;
+ std::vector<Polygon45> polys_error;
+ ps4.get(polys_error);
+ for(unsigned int i = 0; i < polys_error.size(); ++i) {
+ //if(polys_error[i].size() > 3) return false;
+ if(area(polys_error[i]) != 1) {
+ if(area(polys_error[i]) == 2) {
+ //if two area 1 errors merge it will have area 2
+ continue;
+ }
+ std::cout << "test failed\n";
+ for(unsigned int j =0; j < p45s.size(); ++j) {
+ std::cout << p45s[j] << std::endl;
+ }
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+bool validate_polygon_set_op(Polygon45Set& ps45_o,
+ const Polygon45Set& ps45_1,
+ const Polygon45Set& ps45_2,
+ int op_type) {
+ Polygon45Set s_ps_45_o(ps45_o);
+ Polygon45Set s_ps_45_1(ps45_1);
+ Polygon45Set s_ps_45_2(ps45_2);
+ s_ps_45_o.scale_up(2);
+ s_ps_45_1.scale_up(2);
+ s_ps_45_2.scale_up(2);
+ Polygon45Set s_ps_45_validate;
+ if(op_type == 0) {
+ s_ps_45_validate = s_ps_45_1 + s_ps_45_2;
+ s_ps_45_validate += Rectangle(4, 4, 6, 6);
+ } else if(op_type == 1) {
+ s_ps_45_validate = s_ps_45_1 * s_ps_45_2;
+ s_ps_45_validate -= Rectangle(4, 4, 6, 6);
+ } else if(op_type == 2) {
+ s_ps_45_validate = s_ps_45_1 ^ s_ps_45_2;
+ s_ps_45_validate -= Rectangle(4, 4, 6, 6);
+ } else {
+ s_ps_45_validate = s_ps_45_1 - s_ps_45_2;
+ s_ps_45_validate -= Rectangle(4, 4, 6, 6);
+ }
+ if(s_ps_45_validate != s_ps_45_o) {
+ std::cout << "TEST FAILED\n";
+ std::vector<Polygon45> polys;
+ s_ps_45_o.get(polys);
+ std::cout << "Result:\n";
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ polys.clear();
+ s_ps_45_validate.get(polys);
+ std::cout << "Expected Result:\n";
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ //redo the operation, set breakpoints here
+ switch (op_type) {
+ case 0:
+ ps45_o = ps45_1 + ps45_2;
+ ps45_o.get(polys);//needed to force clean
+ break;
+ case 1:
+ ps45_o = ps45_1 * ps45_2;
+ break;
+ case 2:
+ ps45_o = ps45_1 ^ ps45_2;
+ break;
+ default:
+ ps45_o = ps45_1 - ps45_2;
+ };
+ //redo the check, set breakpoints here
+ if(op_type == 0) {
+ s_ps_45_validate = s_ps_45_1 + s_ps_45_2;
+ s_ps_45_validate += Rectangle(4, 4, 6, 6);
+ s_ps_45_validate.get(polys);
+ } else if(op_type == 1) {
+ s_ps_45_validate = s_ps_45_1 * s_ps_45_2;
+ s_ps_45_validate -= Rectangle(4, 4, 6, 6);
+ } else if(op_type == 2) {
+ s_ps_45_validate = s_ps_45_1 ^ s_ps_45_2;
+ s_ps_45_validate -= Rectangle(4, 4, 6, 6);
+ } else {
+ s_ps_45_validate = s_ps_45_1 - s_ps_45_2;
+ s_ps_45_validate -= Rectangle(4, 4, 6, 6);
+ }
+ return false;
+ }
+ return true;
+}
+
+bool test_two_polygon_sets(const Polygon45Set& ps45_1,
+ const Polygon45Set& ps45_2) {
+ std::cout << "test two polygon sets \n";
+ std::vector<Polygon45> polys;
+ ps45_1.get(polys);
+ std::cout << "LVALUE:\n";
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ polys.clear();
+ ps45_2.get(polys);
+ std::cout << "RVALUE:\n";
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ Polygon45Set ps45_o;
+ std::cout << "OR\n";
+ ps45_o = ps45_1 + ps45_2;
+ polys.clear();
+ ps45_o.get(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ if(!validate_polygon_set_op(ps45_o, ps45_1, ps45_2, 0)) return false;
+ std::cout << "AND\n";
+ ps45_o = ps45_1 * ps45_2;
+ polys.clear();
+ ps45_o.get(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ if(!validate_polygon_set_op(ps45_o, ps45_1, ps45_2, 1)) return false;
+ std::cout << "XOR\n";
+ ps45_o = ps45_1 ^ ps45_2;
+ polys.clear();
+ ps45_o.get(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ if(!validate_polygon_set_op(ps45_o, ps45_1, ps45_2, 2)) return false;
+ std::cout << "SUBTRACT\n";
+ ps45_o = ps45_1 - ps45_2;
+ polys.clear();
+ ps45_o.get(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ if(!validate_polygon_set_op(ps45_o, ps45_1, ps45_2, 3)) return false;
+ return true;
+}
+
+bool test_two_polygons(const Polygon45& p45_1,
+ const Polygon45& p45_2) {
+ Polygon45Set ps45_1, ps45_2;
+ ps45_1.insert(p45_1);
+ ps45_2.insert(p45_2);
+ ps45_1.insert(rectangle_data<int>(10, -100, 20, 100));
+ ps45_2.insert(rectangle_data<int>(0, 10, 100, 20));
+ if(!test_two_polygon_sets(ps45_1, ps45_2)) return false;
+ Polygon45Set ps45_1_c = ps45_1 - Rectangle(0, 0, 2, 5);
+ Polygon45Set ps45_2_c = ps45_2 - Rectangle(0, 0, 2, 5);
+ if(!test_two_polygon_sets(ps45_1_c, ps45_2_c)) return false;
+ if(!test_two_polygon_sets(ps45_1_c, ps45_2)) return false;
+ if(!test_two_polygon_sets(ps45_1, ps45_2_c)) return false;
+ return true;
+}
+
+bool test_45_touch() {
+ using namespace gtl;
+ connectivity_extraction_45<int> ce;
+ rectangle_data<int> rect1(0, 0, 10, 10);
+ rectangle_data<int> rect2(5, 5, 15, 15);
+ rectangle_data<int> rect3(5, 20, 15, 25);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ ce.insert(rect3);
+ std::vector<std::set<int> > graph(3);
+ ce.extract(graph);
+ if(graph[0].size() == 1 && graph[1].size() == 1 && graph[2].size() == 0) {
+ std::set<int>::iterator itr = graph[0].begin();
+ std::cout << *itr << std::endl;
+ std::set<int>::iterator itr1 = graph[1].begin();
+ std::cout << *itr1 << std::endl;
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_45_touch_ur() {
+ using namespace gtl;
+ connectivity_extraction_45<int> ce;
+ rectangle_data<int> rect1(0, 0, 5, 5);
+ rectangle_data<int> rect2(5, 5, 10, 10);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ std::vector<std::set<int> > graph(2);
+ ce.extract(graph);
+ if(graph[0].size() == 1 && graph[1].size() == 1) {
+ std::set<int>::iterator itr = graph[0].begin();
+ std::cout << *itr << std::endl;
+ std::set<int>::iterator itr1 = graph[1].begin();
+ std::cout << *itr1 << std::endl;
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_45_touch_r() {
+ using namespace gtl;
+ connectivity_extraction_45<int> ce;
+ rectangle_data<int> rect1(0, 0, 5, 5);
+ rectangle_data<int> rect2(5, 0, 10, 5);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ std::vector<std::set<int> > graph(2);
+ ce.extract(graph);
+ if(graph[0].size() == 1 && graph[1].size() == 1) {
+ std::set<int>::iterator itr = graph[0].begin();
+ std::cout << *itr << std::endl;
+ std::set<int>::iterator itr1 = graph[1].begin();
+ std::cout << *itr1 << std::endl;
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_45_touch_boundaries() {
+ using namespace gtl;
+ connectivity_extraction_45<int> ce;
+ rectangle_data<int> rect1(0, 0, 10, 10);
+ rectangle_data<int> rect2(10, 0, 20, 10);
+ rectangle_data<int> rect3(20, 0, 30, 10);
+ rectangle_data<int> rect4(0, 10, 10, 20);
+ rectangle_data<int> rect5(10, 10, 20, 20);
+ rectangle_data<int> rect6(20, 10, 30, 20);
+ rectangle_data<int> rect7(0, 20, 10, 30);
+ rectangle_data<int> rect8(10, 20, 20, 30);
+ rectangle_data<int> rect9(20, 20, 30, 30);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ ce.insert(rect3);
+ ce.insert(rect4);
+ ce.insert(rect5);
+ ce.insert(rect6);
+ ce.insert(rect7);
+ ce.insert(rect8);
+ ce.insert(rect9);
+ std::vector<std::set<int> > graph(9);
+ ce.extract(graph);
+ for(unsigned int i = 0; i < 9; ++i) {
+ std::cout << i << ": ";
+ for(std::set<int>::iterator itr = graph[i].begin(); itr != graph[i].end(); ++itr) {
+ std::cout << *itr << " ";
+ } std::cout << std::endl;
+ }
+ if(graph[0].size() == 3 && graph[1].size() == 5 && graph[2].size() == 3 &&
+ graph[3].size() == 5 && graph[4].size() == 8 && graph[5].size() == 5 &&
+ graph[6].size() == 3 && graph[7].size() == 5 && graph[8].size() == 3) {
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_45_concept_interact() {
+ using namespace gtl;
+ std::vector<polygon_45_data<int> > polys;
+ polys += rectangle_data<int>(10, 10, 20, 20);
+ polys += rectangle_data<int>(15, 15, 25, 25);
+ polys += rectangle_data<int>(5, 25, 10, 35);
+ interact(polys, rectangle_data<int>(0, 0, 13, 13));
+ if(polys.size() != 1) return false;
+ return true;
+}
+
+bool test_aa_touch() {
+ using namespace gtl;
+ connectivity_extraction<int> ce;
+ rectangle_data<int> rect1(0, 0, 10, 10);
+ rectangle_data<int> rect2(5, 5, 15, 15);
+ rectangle_data<int> rect3(5, 20, 15, 25);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ ce.insert(rect3);
+ std::vector<std::set<int> > graph(3);
+ ce.extract(graph);
+ if(graph[0].size() == 1 && graph[1].size() == 1 && graph[2].size() == 0) {
+ std::set<int>::iterator itr = graph[0].begin();
+ std::cout << *itr << std::endl;
+ std::set<int>::iterator itr1 = graph[1].begin();
+ std::cout << *itr1 << std::endl;
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_aa_touch_ur() {
+ using namespace gtl;
+ connectivity_extraction<int> ce;
+ rectangle_data<int> rect1(0, 0, 5, 5);
+ rectangle_data<int> rect2(5, 5, 10, 10);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ std::vector<std::set<int> > graph(2);
+ ce.extract(graph);
+ if(graph[0].size() == 1 && graph[1].size() == 1) {
+ std::set<int>::iterator itr = graph[0].begin();
+ std::cout << *itr << std::endl;
+ std::set<int>::iterator itr1 = graph[1].begin();
+ std::cout << *itr1 << std::endl;
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_aa_touch_ur2() {
+ using namespace gtl;
+ connectivity_extraction<int> ce;
+ rectangle_data<int> rect2(5, 5, 10, 10);
+ point_data<int> pts[3] = {
+ point_data<int>(0, 0),
+ point_data<int>(5, 5),
+ point_data<int>(0, 5)
+ };
+ polygon_data<int> poly;
+ poly.set(pts, pts+3);
+ ce.insert(poly);
+ ce.insert(rect2);
+ std::vector<std::set<int> > graph(2);
+ ce.extract(graph);
+ if(graph[0].size() == 1 && graph[1].size() == 1) {
+ std::set<int>::iterator itr = graph[0].begin();
+ std::cout << *itr << std::endl;
+ std::set<int>::iterator itr1 = graph[1].begin();
+ std::cout << *itr1 << std::endl;
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_aa_touch_r() {
+ using namespace gtl;
+ connectivity_extraction<int> ce;
+ rectangle_data<int> rect1(0, 0, 5, 5);
+ rectangle_data<int> rect2(5, 0, 10, 5);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ std::vector<std::set<int> > graph(2);
+ ce.extract(graph);
+ if(graph[0].size() == 1 && graph[1].size() == 1) {
+ std::set<int>::iterator itr = graph[0].begin();
+ std::cout << *itr << std::endl;
+ std::set<int>::iterator itr1 = graph[1].begin();
+ std::cout << *itr1 << std::endl;
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_aa_touch_boundaries() {
+ using namespace gtl;
+ connectivity_extraction<int> ce;
+ rectangle_data<int> rect1(0, 0, 10, 10);
+ rectangle_data<int> rect2(10, 0, 20, 10);
+ rectangle_data<int> rect3(20, 0, 30, 10);
+ rectangle_data<int> rect4(0, 10, 10, 20);
+ rectangle_data<int> rect5(10, 10, 20, 20);
+ rectangle_data<int> rect6(20, 10, 30, 20);
+ rectangle_data<int> rect7(0, 20, 10, 30);
+ rectangle_data<int> rect8(10, 20, 20, 30);
+ rectangle_data<int> rect9(20, 20, 30, 30);
+ ce.insert(rect1);
+ ce.insert(rect2);
+ ce.insert(rect3);
+ ce.insert(rect4);
+ ce.insert(rect5);
+ ce.insert(rect6);
+ ce.insert(rect7);
+ ce.insert(rect8);
+ ce.insert(rect9);
+ std::vector<std::set<int> > graph(9);
+ ce.extract(graph);
+ for(unsigned int i = 0; i < 9; ++i) {
+ std::cout << i << ": ";
+ for(std::set<int>::iterator itr = graph[i].begin(); itr != graph[i].end(); ++itr) {
+ std::cout << *itr << " ";
+ } std::cout << std::endl;
+ }
+ if(graph[0].size() == 3 && graph[1].size() == 5 && graph[2].size() == 3 &&
+ graph[3].size() == 5 && graph[4].size() == 8 && graph[5].size() == 5 &&
+ graph[6].size() == 3 && graph[7].size() == 5 && graph[8].size() == 3) {
+ return true;
+ }
+ std::cout << "test failed\n";
+ return false;
+}
+
+bool test_aa_concept_interact() {
+ using namespace gtl;
+ std::vector<polygon_data<int> > polys;
+ polys += rectangle_data<int>(10, 10, 20, 20);
+ polys += rectangle_data<int>(15, 15, 25, 25);
+ polys += rectangle_data<int>(5, 25, 10, 35);
+ interact(polys, rectangle_data<int>(0, 0, 13, 13));
+ if(polys.size() != 1) return false;
+ return true;
+}
+
+bool test_get_rectangles() {
+ using namespace gtl;
+ polygon_90_set_data<int> ps(VERTICAL);
+ ps += rectangle_data<int>(0, 0, 10, 10);
+ ps += rectangle_data<int>(5, 5, 15, 15);
+ std::vector<polygon_90_data<int> > polys;
+ ps.get_rectangles(polys, HORIZONTAL);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ if(polys.size() != 3) return false;
+ std::vector<rectangle_data<int> > rects;
+ ps.get_rectangles(rects, HORIZONTAL);
+ for(unsigned int i = 0; i < rects.size(); ++i) {
+ std::cout << rects[i] << std::endl;
+ }
+ if(rects.size() != 3) return false;
+ if(!equivalence(rects[2], rectangle_data<int>(5,10,15,15))) return false;
+
+ get_rectangles(polys, rects, VERTICAL);
+ get_rectangles(rects, polys, HORIZONTAL);
+ return equivalence(rects, polys);
+}
+
+bool test_get_trapezoids() {
+ using namespace gtl;
+ polygon_45_set_data<int> ps;
+ ps += rectangle_data<int>(0, 0, 10, 10);
+ ps += rectangle_data<int>(5, 5, 15, 15);
+ std::vector<polygon_45_data<int> > polys;
+ ps.get_trapezoids(polys, HORIZONTAL);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ if(polys.size() != 3) return false;
+ std::vector<polygon_45_data<int> > rects;
+ ps.get_trapezoids(rects, HORIZONTAL);
+ for(unsigned int i = 0; i < rects.size(); ++i) {
+ std::cout << rects[i] << std::endl;
+ }
+ if(rects.size() != 3) return false;
+ if(!equivalence(rects[2], rectangle_data<int>(5,10,15,15))) return false;
+ get_trapezoids(polys, rects, VERTICAL);
+ get_trapezoids(rects, polys, HORIZONTAL);
+ return equivalence(rects, polys);
+}
+
+bool test_SQRT1OVER2() {
+ Point pts[] = {
+ Point(100, 100),
+ Point(0, 100),
+ Point(100, 200),
+ Point(0, 300),
+ Point(100, 400),
+ Point(0, 500),
+ Point(100, 500),
+ Point(100, 600),
+ Point(200, 500),
+ Point(300, 600),
+ Point(400, 500),
+ Point(500, 600),
+ Point(500, 500),
+ Point(600, 500),
+ Point(500, 400),
+ Point(600, 300),
+ Point(500, 200),
+ Point(600, 100),
+ Point(500, 100),
+ Point(500, 0),
+ Point(400, 100),
+ Point(300, 0),
+ Point(200, 100),
+ Point(100, 0),
+ Point(100, 100)
+ };
+ Polygon45 p45(pts, pts+25);
+ std::cout << is_45(p45) << std::endl;
+ std::cout << p45 << std::endl;
+ Polygon45Set ps45;
+ ps45 += p45;
+ ps45.resize(10, SQRT1OVER2, ORTHOGONAL);
+ std::vector<Polygon45> polys;
+ ps45.get(polys);
+ if(polys.size() != 1) return false;
+ Point pts2[] = {
+ Point(90, 90),
+ Point(-10, 90),
+ Point(-10, 100),
+ Point(90, 200),
+ Point(-10, 300),
+ Point(90, 400),
+ Point(-10, 500),
+ Point(-10, 510),
+ Point(90, 510),
+ Point(90, 610),
+ Point(100, 610),
+ Point(200, 510),
+ Point(300, 610),
+ Point(400, 510),
+ Point(500, 610),
+ Point(510, 610),
+ Point(510, 510),
+ Point(610, 510),
+ Point(610, 500),
+ Point(510, 400),
+ Point(610, 300),
+ Point(510, 200),
+ Point(610, 100),
+ Point(610, 90),
+ Point(510, 90),
+ Point(510, -10),
+ Point(500, -10),
+ Point(400, 90),
+ Point(300, -10),
+ Point(200, 90),
+ Point(100, -10),
+ Point(90, -10),
+ Point(90, 90)
+ };
+ Polygon45 p45reference(pts2, pts2+33);
+ std::cout << is_45(polys[0]) << std::endl;
+ std::cout << polys[0] << std::endl;
+ std::cout << p45reference << std::endl;
+ std::cout << is_45(p45reference) << std::endl;
+ if(!equivalence(polys[0], p45reference)) {
+ std::cout << "polys don't match\n";
+ return false;
+ }
+ ps45.resize(-10, SQRT1OVER2, ORTHOGONAL);
+ polys.clear();
+ ps45.get(polys);
+ if(polys.size() != 1) return false;
+ std::cout << is_45(polys[0]) << std::endl;
+ std::cout << polys[0] << std::endl;
+ if(!equivalence(polys[0], p45)) {
+ std::cout << "polys don't match\n";
+ return false;
+ }
+ ps45.resize(11, SQRT1OVER2, UNFILLED);
+ polys.clear();
+ ps45.get(polys);
+ if(polys.size() != 1) return false;
+ std::cout << is_45(polys[0]) << std::endl;
+ std::cout << polys[0] << std::endl;
+ return true;
+}
+
+bool test_scaling_by_floating(){
+ Point pts[] = {
+ Point(1, 1),
+ Point(10, 1),
+ Point(1, 10)
+ };
+ Polygon45 poly(pts, pts+3);
+ Polygon45Set ps45;
+ ps45 += poly;
+ ps45.scale(double(2.5));
+ std::vector<Polygon45> polys;
+ ps45.get(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ std::cout << area(polys[i]) << std::endl;
+ }
+ if(polys.size() != 1) return false;
+ if(area(polys[0]) != 242) return false;
+ scale(ps45, double(1)/double(2.5));
+ polys.clear();
+ ps45.get(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ return equivalence(polys, poly);
+}
+
+bool test_directional_resize() {
+ std::vector<Rectangle> rects;
+ rects.push_back(Rectangle(0, 0, 100, 100));
+ resize(rects, -10, 10, -10, 10);
+ for(unsigned int i = 0; i < rects.size(); ++i) {
+ std::cout << rects[i] << std::endl;
+ }
+ if(rects.size() != 1) return false;
+ if(rects[0] != Rectangle(10, 10, 110, 110)) return false;
+
+ return true;
+}
+
+bool test_self_xor() {
+ std::vector<Rectangle> rects;
+ rects.push_back(Rectangle(0, 0, 10, 10));
+ rects.push_back(Rectangle(5, 5, 15, 15));
+ self_xor(rects);
+ for(unsigned int i = 0; i < rects.size(); ++i) {
+ std::cout << rects[i] << std::endl;
+ }
+ if(rects.size() == 4) return true;
+ else return false;
+}
+
+bool test_grow_and_45() {
+ polygon_45_set_data<int> ps;
+ ps.insert(Rectangle(0, 0, 5, 5));
+ ps.insert(Rectangle(5, 5, 15, 15));
+ grow_and(ps, 2);
+ std::vector<polygon_45_data<int> > rects;
+ ps.get_trapezoids(rects);
+ for(unsigned int i = 0; i < rects.size(); ++i) {
+ std::cout << rects[i] << std::endl;
+ }
+ if(rects.size() != 1) return false;
+ return equivalence(rects, Rectangle(3, 3, 7, 7));
+}
+
+bool test_self_xor_45() {
+ polygon_45_set_data<int> ps;
+ ps.insert(Rectangle(0, 0, 10, 10));
+ ps.insert(Rectangle(5, 5, 15, 15));
+ self_xor(ps);
+ std::vector<polygon_45_data<int> > rects;
+ ps.get_trapezoids(rects);
+ for(unsigned int i = 0; i < rects.size(); ++i) {
+ std::cout << rects[i] << std::endl;
+ }
+ if(rects.size() == 4) return true;
+ else return false;
+}
+
+bool testViewCopyConstruct() {
+ PolygonSet ps1, ps2;
+ ps1.insert(Rectangle(0, 0, 10, 10));
+ ps2.insert(Rectangle(5, 5, 15, 15));
+ PolygonSet psr = ps1 - ps2;
+ std::vector<Rectangle> rects;
+ rects += psr;
+ for(unsigned int i = 0; i < rects.size(); ++i)
+ std::cout << rects[i] << std::endl;
+ if( rects.size() != 2) return false;
+ Polygon45Set ps45_1, ps45_2;
+ ps45_1.insert(Rectangle(0, 0, 10, 10));
+ ps45_2.insert(Rectangle(5, 5, 15, 15));
+ Polygon45Set ps45_r = ps45_1 - ps45_2;
+ std::vector<Polygon45> polys;
+ ps45_r.get_trapezoids(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i)
+ std::cout << polys[i] << std::endl;
+ if( polys.size() != 2) return false;
+ return true;
+}
+
+bool testpip() {
+ std::vector<Point> pts;
+ pts.push_back(Point(0, 0));
+ pts.push_back(Point(10, 0));
+ pts.push_back(Point(20, 10));
+ pts.push_back(Point(0, 20));
+ pts.push_back(Point(30, 40));
+ pts.push_back(Point(-10, 50));
+ pts.push_back(Point(-20, -20));
+ pts.push_back(Point(0, 0));
+ polygon_data<int> poly;
+ polygon_with_holes_data<int> poly2;
+ polygon_45_data<int> poly45;
+ polygon_45_with_holes_data<int> poly245;
+ polygon_90_data<int> poly90;
+ polygon_90_with_holes_data<int> poly290;
+ poly.set(pts.begin(), pts.end());
+ poly2.set(pts.begin(), pts.end());
+ assign(poly45, Rectangle(0, 0, 100, 100));
+ assign(poly245, Rectangle(0, 0, 100, 100));
+ assign(poly90, Rectangle(0, 0, 100, 100));
+ assign(poly290, Rectangle(0, 0, 100, 100));
+ for(unsigned int i = 0; i < pts.size(); ++i) {
+ if(!contains(poly, pts[i], true)) return false;
+ if(contains(poly, pts[i], false)) return false;
+ if(!contains(poly2, pts[i], true)) return false;
+ if(contains(poly2, pts[i], false)) return false;
+ }
+ if(!contains(poly45, pts[0], true)) return false;
+ if(contains(poly245, pts[0], false)) return false;
+ if(!contains(poly90, pts[0], true)) return false;
+ if(contains(poly290, pts[0], false)) return false;
+ Point pt(0, -10);
+ if(contains(poly, pt)) return false;
+ Point p2(0, 1);
+ if(!contains(poly, p2)) return false;
+ return true;
+}
+
+void testHand() {
+ using namespace gtl;
+ int handcoords[] = {
+12375, 11050, 13175, 10200, 15825, 9275, 18750, 8525, 24150, 8300, 27575, 8400, 31775, 7800,
+35975, 7200, 41375, 4800, 42575, 4200, 43175, 4200, 47375, 2400, 49175, 1800, 51150, 2200,
+52275, 2825, 52625, 4150, 52375, 4975, 51575, 6000, 49275, 6850, 45700, 7950, 43175, 9600,
+39575, 10800, 37775, 12000, 37775, 12600, 37775, 13800, 38975, 14400, 41375, 14400, 45575, 13200,
+48600, 13000, 51575, 13200, 55175, 12600, 58775, 12600, 61175, 13200, 62375, 14400, 62550, 15700,
+61975, 16875, 60775, 17600, 60100, 17675, 58525, 17675, 56150, 17575, 52175, 18000, 47975, 18600,
+45575, 19200, 44375, 19200, 42675, 19325, 41600, 19775, 41600, 20500, 42100, 20825, 44975, 20400,
+48575, 20400, 52775, 21000, 53975, 21000, 57575, 21000, 62375, 21000, 65450, 22000, 66300, 23100,
+66100, 24550, 64750, 25925, 62975, 26400, 61175, 26400, 58775, 26400, 56025, 26050, 53450, 26025,
+50975, 26400, 48575, 26400, 46775, 26400, 43650, 26075, 41375, 26400, 40775, 27000, 40775, 27600,
+42225, 28650, 44375, 29400, 48575, 30000, 50975, 31200, 53975, 31800, 58775, 33000, 61200, 34300,
+62375, 35400, 62375, 37200, 61175, 38400, 60000, 38700, 57575, 38400, 54550, 37575, 50975, 36600,
+49075, 36125, 47750, 36125, 45700, 35425, 42350, 34350, 38900, 33775, 30575, 33000, 26975, 33600,
+25975, 34900, 26375, 36600, 28175, 38400, 30575, 40800, 32375, 43800, 33200, 46200, 33200, 48000,
+32650, 49300, 31425, 50000, 29950, 50125, 28825, 49375, 27575, 48000, 25825, 46000, 23975, 44100,
+22175, 42600, 19775, 39600, 17325, 37300, 14975, 34800, 13175, 31800, 10775, 29400, 9600, 27400,
+10175, 27000, 11375, 27600, 12575, 28800, 14375, 31800, 16175, 34800, 18575, 37200, 21575, 39000,
+22775, 40200, 23975, 41400, 24575, 42600, 26375, 44400, 28325, 46000, 29850, 46775, 31175, 46200,
+31550, 44575, 30575, 43200, 28775, 40800, 25775, 38400, 24575, 34800, 24750, 33175, 26975, 31800,
+29975, 31800, 33575, 31800, 37775, 32400, 39575, 33000, 41975, 33600, 45150, 34175, 46975, 34750,
+48575, 35400, 50975, 35400, 51575, 34800, 51875, 33725, 50775, 32575, 48575, 31800, 45750, 30875,
+43775, 30600, 41375, 29400, 38975, 28800, 35975, 28200, 34775, 27600, 34175, 27000, 34775, 25800,
+37175, 25200, 40175, 25200, 43175, 25200, 46775, 25200, 50975, 25425, 53375, 25200, 55175, 24600,
+55525, 23450, 53975, 22200, 52775, 22200, 49075, 21850, 45950, 21925, 40775, 21600, 37775, 21600,
+35150, 21350, 34325, 20950, 34175, 19800, 35975, 19200, 38375, 19200, 40750, 18900, 42575, 18600,
+44375, 18000, 47975, 17400, 50375, 17125, 52025, 16625, 52775, 15600, 52100, 14625, 49675, 14125,
+48625, 14125, 46775, 14400, 44375, 15000, 41375, 15150, 37700, 15275, 34775, 15600, 32850, 15925,
+31775, 15600, 31425, 14875, 32375, 13800, 36575, 11400, 38975, 10200, 41375, 9000, 43075, 8150,
+43650, 7200, 43325, 6250, 42225, 5825, 40800, 6275, 38900, 6925, 35375, 8400, 32375, 10200,
+27575, 11400, 22775, 12600, 19775, 13225, 16775, 13800, 14975, 14400, 13050, 14000, 11975, 12600,
+ 0, 0 };
+ std::vector<Point> handpoints;
+ for(unsigned int i = 0; i < 100000; i += 2) {
+ Point pt(handcoords[i], handcoords[i+1]);
+ if(pt == Point(0, 0)) break;
+ handpoints.push_back(pt);
+ }
+ polygon_data<int> handpoly;
+ handpoly.set(handpoints.begin(), handpoints.end());
+ int spiralcoords [] = {
+37200, 3600, 42075, 4025, 47475, 5875, 51000, 7800, 55800, 12300, 59000, 17075, 60000, 20400,
+61200, 25800, 61200, 29400, 60600, 33600, 58800, 38400, 55800, 42600, 53200, 45625,
+49200, 48600, 43200, 51000, 35400, 51600, 29400, 50400, 23400, 47400, 19200, 43800,
+16200, 39600, 14400, 35400, 13200, 29400, 13200, 24000, 15000, 18600, 17400, 13800,
+20525, 10300, 24600, 7200, 29400, 4800, 32450, 4000, 34825, 3675, 35625, 3625,
+35825, 7275, 39600, 7200, 43800, 8400, 46800, 9600, 50400, 12000, 53400, 15000,
+55800, 18600, 57000, 23400, 57600, 27000, 57000, 32400, 55200, 37200, 52200, 41400,
+48000, 45000, 42000, 47400, 35400, 48000, 30000, 46800, 24600, 43800, 20325, 39100,
+17850, 34275, 16800, 27600, 17400, 22200, 20400, 16200, 24600, 11400, 28800, 9000,
+32400, 7800, 33200, 7575, 33925, 11050, 35400, 10800, 37200, 10800, 41400, 11400,
+46200, 13200, 49800, 16200, 51600, 19200, 53400, 23400, 54000, 29400, 52800, 33600,
+49800, 39000, 45000, 42600, 39000, 44400, 33600, 43800, 28200, 42000, 24000, 37800,
+21000, 33000, 20400, 26400, 21600, 21000, 24600, 16200, 28200, 13200, 31875, 11625,
+33200, 15625, 36000, 15000, 39000, 15000, 43800, 16800, 46800, 19200, 49200, 23400,
+49800, 27600, 48750, 32700, 46350, 36275, 42600, 39000, 38400, 40200, 31800, 39000,
+28200, 36600, 25200, 31200, 24600, 26400, 26025, 21800, 28200, 18600, 30600, 16800,
+32575, 19875, 34200, 19200, 36000, 18600, 37200, 18600, 40375, 19125, 43200, 21000,
+45600, 24000, 46200, 27600, 45600, 30600, 43800, 33600, 41475, 35625, 37800, 36600,
+33600, 36000, 30000, 33600, 28200, 28800, 28800, 24600, 30000, 22200, 31200, 23400,
+30600, 25200, 30000, 27000, 30600, 30000, 31800, 32400, 34200, 34200, 38400, 34800,
+41400, 33000, 44025, 30225, 44400, 26400, 43200, 23400, 40900, 21200, 37800, 20400,
+34950, 20675, 32400, 22200, 30175, 19475, 28425, 21300, 27000, 24000, 26400, 27600,
+27000, 31800, 31200, 36600, 36600, 38400, 42600, 37200, 46200, 33600, 48000, 30000,
+47650, 24425, 45600, 20400, 42650, 18200, 39000, 16800, 35400, 16800, 33600, 17400,
+32875, 17675, 31100, 13850, 28200, 15600, 25200, 18600, 22800, 22800, 22200, 27000,
+23400, 33600, 26400, 38400, 31675, 41575, 37800, 42600, 40850, 42150, 42800, 41550,
+47050, 39025, 50100, 35375, 52200, 29400, 51675, 23950, 49800, 19200, 46200, 15600,
+41400, 13200, 37800, 12600, 35025, 12750, 33350, 13050, 32400, 9600, 30025, 10325,
+25925, 12725, 22200, 16800, 19800, 21000, 18600, 25800, 18600, 30000, 20400, 35400,
+22575, 39250, 25225, 41825, 28200, 43800, 33600, 46200, 39000, 46200, 44400, 45000,
+48650, 42350, 52800, 37800, 55200, 32400, 55800, 26400, 54600, 21000, 53400, 18000,
+50400, 14400, 47400, 12000, 42600, 9600, 39000, 9000, 36000, 9000, 34775, 9125,
+34300, 5600, 30000, 6600, 25800, 8400, 22025, 11350, 18725, 15125, 16200, 20400,
+15000, 24600, 15000, 30600, 16800, 36600, 20400, 42600, 25800, 46800, 31200, 49200,
+38400, 49800, 45000, 48600, 51000, 45000, 55475, 40225, 58200, 34800, 59400, 30000,
+59400, 25200, 58200, 19800, 55200, 14400, 52225, 11150, 47400, 7800, 44175, 6500,
+40200, 5400, 38400, 5400, 37200, 5400, 0, 0 };
+ std::vector<Point> spiralpoints;
+ for(unsigned int i = 0; i < 100000; i += 2) {
+ Point pt(spiralcoords[i], spiralcoords[i+1]);
+ if(pt == Point(0, 0)) break;
+ spiralpoints.push_back(pt);
+ }
+ polygon_data<int> spiralpoly;
+ spiralpoly.set(spiralpoints.begin(), spiralpoints.end());
+ polygon_set_data<int> handset;
+ handset += handpoly;
+ polygon_set_data<int> spiralset;
+ spiralset += spiralpoly;
+ polygon_set_data<int> xorset = handset ^ spiralset;
+ std::vector<polygon_data<int> > polys;
+ polys += xorset;
+ std::cout << polys.size() << std::endl;
+ for(unsigned int i = 0; i < polys.size(); ++i)
+ std::cout << polys[i] << std::endl;
+}
+
+//void testHandFloat() {
+// using namespace gtl;
+// double handcoords[] = {
+//12375, 11050, 13175, 10200, 15825, 9275, 18750, 8525, 24150, 8300, 27575, 8400, 31775, 7800,
+//35975, 7200, 41375, 4800, 42575, 4200, 43175, 4200, 47375, 2400, 49175, 1800, 51150, 2200,
+//52275, 2825, 52625, 4150, 52375, 4975, 51575, 6000, 49275, 6850, 45700, 7950, 43175, 9600,
+//39575, 10800, 37775, 12000, 37775, 12600, 37775, 13800, 38975, 14400, 41375, 14400, 45575, 13200,
+//48600, 13000, 51575, 13200, 55175, 12600, 58775, 12600, 61175, 13200, 62375, 14400, 62550, 15700,
+//61975, 16875, 60775, 17600, 60100, 17675, 58525, 17675, 56150, 17575, 52175, 18000, 47975, 18600,
+//45575, 19200, 44375, 19200, 42675, 19325, 41600, 19775, 41600, 20500, 42100, 20825, 44975, 20400,
+//48575, 20400, 52775, 21000, 53975, 21000, 57575, 21000, 62375, 21000, 65450, 22000, 66300, 23100,
+//66100, 24550, 64750, 25925, 62975, 26400, 61175, 26400, 58775, 26400, 56025, 26050, 53450, 26025,
+//50975, 26400, 48575, 26400, 46775, 26400, 43650, 26075, 41375, 26400, 40775, 27000, 40775, 27600,
+//42225, 28650, 44375, 29400, 48575, 30000, 50975, 31200, 53975, 31800, 58775, 33000, 61200, 34300,
+//62375, 35400, 62375, 37200, 61175, 38400, 60000, 38700, 57575, 38400, 54550, 37575, 50975, 36600,
+//49075, 36125, 47750, 36125, 45700, 35425, 42350, 34350, 38900, 33775, 30575, 33000, 26975, 33600,
+//25975, 34900, 26375, 36600, 28175, 38400, 30575, 40800, 32375, 43800, 33200, 46200, 33200, 48000,
+//32650, 49300, 31425, 50000, 29950, 50125, 28825, 49375, 27575, 48000, 25825, 46000, 23975, 44100,
+//22175, 42600, 19775, 39600, 17325, 37300, 14975, 34800, 13175, 31800, 10775, 29400, 9600, 27400,
+//10175, 27000, 11375, 27600, 12575, 28800, 14375, 31800, 16175, 34800, 18575, 37200, 21575, 39000,
+//22775, 40200, 23975, 41400, 24575, 42600, 26375, 44400, 28325, 46000, 29850, 46775, 31175, 46200,
+//31550, 44575, 30575, 43200, 28775, 40800, 25775, 38400, 24575, 34800, 24750, 33175, 26975, 31800,
+//29975, 31800, 33575, 31800, 37775, 32400, 39575, 33000, 41975, 33600, 45150, 34175, 46975, 34750,
+//48575, 35400, 50975, 35400, 51575, 34800, 51875, 33725, 50775, 32575, 48575, 31800, 45750, 30875,
+//43775, 30600, 41375, 29400, 38975, 28800, 35975, 28200, 34775, 27600, 34175, 27000, 34775, 25800,
+//37175, 25200, 40175, 25200, 43175, 25200, 46775, 25200, 50975, 25425, 53375, 25200, 55175, 24600,
+//55525, 23450, 53975, 22200, 52775, 22200, 49075, 21850, 45950, 21925, 40775, 21600, 37775, 21600,
+//35150, 21350, 34325, 20950, 34175, 19800, 35975, 19200, 38375, 19200, 40750, 18900, 42575, 18600,
+//44375, 18000, 47975, 17400, 50375, 17125, 52025, 16625, 52775, 15600, 52100, 14625, 49675, 14125,
+//48625, 14125, 46775, 14400, 44375, 15000, 41375, 15150, 37700, 15275, 34775, 15600, 32850, 15925,
+//31775, 15600, 31425, 14875, 32375, 13800, 36575, 11400, 38975, 10200, 41375, 9000, 43075, 8150,
+//43650, 7200, 43325, 6250, 42225, 5825, 40800, 6275, 38900, 6925, 35375, 8400, 32375, 10200,
+//27575, 11400, 22775, 12600, 19775, 13225, 16775, 13800, 14975, 14400, 13050, 14000, 11975, 12600,
+// 0, 0 };
+// std::vector<point_data<double> > handpoints;
+// for(unsigned int i = 0; i < 100000; i += 2) {
+// point_data<double> pt(handcoords[i], handcoords[i+1]);
+// if(pt == point_data<double> (0, 0)) break;
+// handpoints.push_back(pt);
+// }
+// polygon_data<double> handpoly;
+// handpoly.set(handpoints.begin(), handpoints.end());
+// double spiralcoords [] = {
+//37200, 3600, 42075, 4025, 47475, 5875, 51000, 7800, 55800, 12300, 59000, 17075, 60000, 20400,
+//61200, 25800, 61200, 29400, 60600, 33600, 58800, 38400, 55800, 42600, 53200, 45625,
+//49200, 48600, 43200, 51000, 35400, 51600, 29400, 50400, 23400, 47400, 19200, 43800,
+//16200, 39600, 14400, 35400, 13200, 29400, 13200, 24000, 15000, 18600, 17400, 13800,
+//20525, 10300, 24600, 7200, 29400, 4800, 32450, 4000, 34825, 3675, 35625, 3625,
+//35825, 7275, 39600, 7200, 43800, 8400, 46800, 9600, 50400, 12000, 53400, 15000,
+//55800, 18600, 57000, 23400, 57600, 27000, 57000, 32400, 55200, 37200, 52200, 41400,
+//48000, 45000, 42000, 47400, 35400, 48000, 30000, 46800, 24600, 43800, 20325, 39100,
+//17850, 34275, 16800, 27600, 17400, 22200, 20400, 16200, 24600, 11400, 28800, 9000,
+//32400, 7800, 33200, 7575, 33925, 11050, 35400, 10800, 37200, 10800, 41400, 11400,
+//46200, 13200, 49800, 16200, 51600, 19200, 53400, 23400, 54000, 29400, 52800, 33600,
+//49800, 39000, 45000, 42600, 39000, 44400, 33600, 43800, 28200, 42000, 24000, 37800,
+//21000, 33000, 20400, 26400, 21600, 21000, 24600, 16200, 28200, 13200, 31875, 11625,
+//33200, 15625, 36000, 15000, 39000, 15000, 43800, 16800, 46800, 19200, 49200, 23400,
+//49800, 27600, 48750, 32700, 46350, 36275, 42600, 39000, 38400, 40200, 31800, 39000,
+//28200, 36600, 25200, 31200, 24600, 26400, 26025, 21800, 28200, 18600, 30600, 16800,
+//32575, 19875, 34200, 19200, 36000, 18600, 37200, 18600, 40375, 19125, 43200, 21000,
+//45600, 24000, 46200, 27600, 45600, 30600, 43800, 33600, 41475, 35625, 37800, 36600,
+//33600, 36000, 30000, 33600, 28200, 28800, 28800, 24600, 30000, 22200, 31200, 23400,
+//30600, 25200, 30000, 27000, 30600, 30000, 31800, 32400, 34200, 34200, 38400, 34800,
+//41400, 33000, 44025, 30225, 44400, 26400, 43200, 23400, 40900, 21200, 37800, 20400,
+//34950, 20675, 32400, 22200, 30175, 19475, 28425, 21300, 27000, 24000, 26400, 27600,
+//27000, 31800, 31200, 36600, 36600, 38400, 42600, 37200, 46200, 33600, 48000, 30000,
+//47650, 24425, 45600, 20400, 42650, 18200, 39000, 16800, 35400, 16800, 33600, 17400,
+//32875, 17675, 31100, 13850, 28200, 15600, 25200, 18600, 22800, 22800, 22200, 27000,
+//23400, 33600, 26400, 38400, 31675, 41575, 37800, 42600, 40850, 42150, 42800, 41550,
+//47050, 39025, 50100, 35375, 52200, 29400, 51675, 23950, 49800, 19200, 46200, 15600,
+//41400, 13200, 37800, 12600, 35025, 12750, 33350, 13050, 32400, 9600, 30025, 10325,
+//25925, 12725, 22200, 16800, 19800, 21000, 18600, 25800, 18600, 30000, 20400, 35400,
+//22575, 39250, 25225, 41825, 28200, 43800, 33600, 46200, 39000, 46200, 44400, 45000,
+//48650, 42350, 52800, 37800, 55200, 32400, 55800, 26400, 54600, 21000, 53400, 18000,
+//50400, 14400, 47400, 12000, 42600, 9600, 39000, 9000, 36000, 9000, 34775, 9125,
+//34300, 5600, 30000, 6600, 25800, 8400, 22025, 11350, 18725, 15125, 16200, 20400,
+//15000, 24600, 15000, 30600, 16800, 36600, 20400, 42600, 25800, 46800, 31200, 49200,
+//38400, 49800, 45000, 48600, 51000, 45000, 55475, 40225, 58200, 34800, 59400, 30000,
+//59400, 25200, 58200, 19800, 55200, 14400, 52225, 11150, 47400, 7800, 44175, 6500,
+//40200, 5400, 38400, 5400, 37200, 5400, 0, 0 };
+// std::vector<point_data<double> > spiralpoints;
+// for(unsigned int i = 0; i < 100000; i += 2) {
+// point_data<double> pt(spiralcoords[i], spiralcoords[i+1]);
+// if(pt == point_data<double> (0, 0)) break;
+// spiralpoints.push_back(pt);
+// }
+// polygon_data<double> spiralpoly;
+// spiralpoly.set(spiralpoints.begin(), spiralpoints.end());
+// polygon_set_data<double> handset;
+// handset += handpoly;
+// polygon_set_data<double> spiralset;
+// spiralset += spiralpoly;
+// polygon_set_data<double> xorset = handset ^ spiralset;
+// std::vector<polygon_data<double> > polys;
+// polys += xorset;
+// std::cout << polys.size() << std::endl;
+// for(unsigned int i = 0; i < polys.size(); ++i)
+// std::cout << polys[i] << std::endl;
+//}
+
+bool testDirectionalSize() {
+ {
+ PolygonSet ps(VERTICAL);
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(0, -10, 0, -10);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(0, 0, 90, 90) << std::endl;
+ if(rects[0] != Rectangle(0, 0, 90, 90)) return false;
+ }
+ {
+ PolygonSet ps(VERTICAL);
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(0, 0, 0, -10);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(0, 0, 100, 90) << std::endl;
+ if(rects[0] != Rectangle(0, 0, 100, 90)) return false;
+ }
+ {
+ PolygonSet ps;
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(0, -10, 0, 0);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(0, 0, 90, 100) << std::endl;
+ if(rects[0] != Rectangle(0, 0, 90, 100)) return false;
+ }
+ {
+ PolygonSet ps;
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(0, 0, -10, 0);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(0, 10, 100, 100) << std::endl;
+ if(rects[0] != Rectangle(0, 10, 100, 100)) return false;
+ }
+ {
+ PolygonSet ps;
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(-10, 0, 0, 0);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(10, 0, 100, 100) << std::endl;
+ if(rects[0] != Rectangle(10, 0, 100, 100)) return false;
+ }
+ {
+ PolygonSet ps;
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(-10, 10, 0, 0);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(10, 0, 110, 100) << std::endl;
+ if(rects[0] != Rectangle(10, 0, 110, 100)) return false;
+ }
+ {
+ PolygonSet ps;
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(-10, 10, 10, -10);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(10, -10, 110, 90) << std::endl;
+ if(rects[0] != Rectangle(10, -10, 110, 90)) return false;
+ }
+ {
+ PolygonSet ps;
+ ps += Rectangle(0, 0, 100, 100);
+ ps.resize(10, 10, -10, -10);
+ std::vector<Rectangle> rects;
+ ps.get(rects);
+ if(rects.size() != 1) return false;
+ std::cout << rects[0] << std::endl;
+ std::cout << Rectangle(-10, 10, 110, 90) << std::endl;
+ if(rects[0] != Rectangle(-10, 10, 110, 90)) return false;
+ }
+ return true;
+}
+
+bool testMaxCover() {
+ std::vector<Rectangle> rects;
+ rects.push_back(Rectangle(Interval(60, 124), Interval( 1, 3)));
+ rects.push_back(Rectangle(Interval(59, 83), Interval( 9, 28)));
+ rects.push_back(Rectangle(Interval(90, 124), Interval( 3, 29)));
+ rects.push_back(Rectangle(Interval(64, 124), Interval( 29, 35)));
+ rects.push_back(Rectangle(Interval(64, 102), Interval( 35, 49)));
+ rects.push_back(Rectangle(Interval(1, 20), Interval( 44, 60)));
+ rects.push_back(Rectangle(Interval(50, 102), Interval( 49, 71)));
+ rects.push_back(Rectangle(Interval(49, 102), Interval( 71, 72)));
+ rects.push_back(Rectangle(Interval(49, 94), Interval( 72, 75)));
+ rects.push_back(Rectangle(Interval(50, 74), Interval( 75, 81)));
+ rects.push_back(Rectangle(Interval(90, 127), Interval( 75, 81)));
+ rects.push_back(Rectangle(Interval(50, 127), Interval( 81, 82)));
+ rects.push_back(Rectangle(Interval(3, 7), Interval( 60, 88)));
+ rects.push_back(Rectangle(Interval(50, 92), Interval( 82, 94)));
+ rects.push_back(Rectangle(Interval(58, 92), Interval( 94, 111)));
+ std::vector<Rectangle> expected_result;
+ expected_result.push_back(Rectangle(Interval(60, 124), Interval( 1, 3)));
+ expected_result.push_back(Rectangle(Interval(90, 124), Interval( 1, 35)));
+ expected_result.push_back(Rectangle(Interval(90, 102), Interval( 1, 72)));
+ expected_result.push_back(Rectangle(Interval(90, 94 ), Interval(1 ,82)));
+ expected_result.push_back(Rectangle(Interval(90, 92), Interval( 1, 111)));
+ expected_result.push_back(Rectangle(Interval(59, 83 ), Interval(9, 28)));
+ expected_result.push_back(Rectangle(Interval(64, 124), Interval( 29, 35)));
+ expected_result.push_back(Rectangle(Interval(64, 102), Interval( 29, 72)));
+ expected_result.push_back(Rectangle(Interval(64, 94), Interval( 29, 75)));
+ expected_result.push_back(Rectangle(Interval(64, 74), Interval( 29, 111)));
+ expected_result.push_back(Rectangle(Interval(1, 20), Interval( 44, 60)));
+ expected_result.push_back(Rectangle(Interval(3, 7), Interval( 44, 88)));
+ expected_result.push_back(Rectangle(Interval(50, 102 ), Interval(49, 72)));
+ expected_result.push_back(Rectangle(Interval(50, 94), Interval( 49, 75)));
+ expected_result.push_back(Rectangle(Interval(50, 74), Interval( 49, 94)));
+ expected_result.push_back(Rectangle(Interval(58, 74), Interval( 49, 111)));
+ expected_result.push_back(Rectangle(Interval(49, 102 ), Interval(71, 72)));
+ expected_result.push_back(Rectangle(Interval(49, 94 ), Interval(71, 75)));
+ expected_result.push_back(Rectangle(Interval(90, 127), Interval( 75, 82)));
+ expected_result.push_back(Rectangle(Interval(50, 127), Interval( 81, 82)));
+ expected_result.push_back(Rectangle(Interval(50, 92), Interval( 81, 94)));
+ expected_result.push_back(Rectangle(Interval(58, 92), Interval( 81, 111)));
+ std::vector<Rectangle> result;
+ get_max_rectangles(result, rects);
+ std::cout << "result XOR clean: " << equivalence(result, rects) << std::endl;
+ std::cout << "expected result XOR clean: " << equivalence(expected_result, rects) << std::endl;
+ std::vector<Rectangle>& output = result;
+ std::vector<Rectangle>& voutput = expected_result;
+ std::sort(output.begin(), output.end(), less_rectangle_concept< Rectangle, Rectangle>());
+ std::sort(voutput.begin(), voutput.end(), less_rectangle_concept< Rectangle, Rectangle>());
+ if(output != voutput) {
+ std::cerr << "Max Rectangle TEST failed\n";
+ for(unsigned int i = 0; i < output.size(); ++i) {
+ std::cerr << output[i] << std::endl;
+ }
+ std::cerr << "Incorrect result\n";
+ for(unsigned int i = 0; i < voutput.size(); ++i) {
+ std::cerr << voutput[i] << std::endl;
+ }
+ std::cerr << "Max Rectangle TEST failed\n";
+ for(unsigned int i = 0; i < rects.size(); ++i) {
+ std::cout << rects[i] << std::endl;
+ }
+ return false;
+ }
+ return true;
+}
+
+void max_cover_stress_test() {
+ for(unsigned int k = 3; k < 20; k++) {
+ for(unsigned int i = 0; i < k * k; ++i) {
+ std::vector<Rectangle> rects, result;
+ //std::cout << "test " << i << std::endl;
+ for(unsigned int j = 0; j < k; ++j) {
+ int x1 = rand() % 100;
+ int x2 = rand() % 50;
+ int y1 = rand() % 100;
+ int y2 = rand() % 50;
+ rects.push_back(Rectangle(x1, y1, x1+x2, y1+y2));
+ //std::cout << rects.back() << std::endl;
+ }
+ get_max_rectangles(result, rects);
+ }
+ }
+}
+
+// namespace boost { namespace polygon{
+// template <typename GCT, typename T>
+// struct view_of {};
+
+// template <typename T>
+// struct view_of<polygon_45_concept, T> {
+// const T* t;
+// view_of(const T& obj) : t(&obj) {}
+// typedef typename polygon_traits<T>::coordinate_type coordinate_type;
+// typedef typename polygon_traits<T>::iterator_type iterator_type;
+// typedef typename polygon_traits<T>::point_type point_type;
+
+// /// Get the begin iterator
+// inline iterator_type begin() const {
+// return polygon_traits<T>::begin_points(*t);
+// }
+
+// /// Get the end iterator
+// inline iterator_type end() const {
+// return polygon_traits<T>::end_points(*t);
+// }
+
+// /// Get the number of sides of the polygon
+// inline unsigned int size() const {
+// return polygon_traits<T>::size(*t);
+// }
+
+// /// Get the winding direction of the polygon
+// inline winding_direction winding() const {
+// return polygon_traits<T>::winding(*t);
+// }
+// };
+
+// template <typename T1, typename T2>
+// view_of<T1, T2> view_as(const T2& obj) { return view_of<T1, T2>(obj); }
+
+// template <typename T>
+// struct geometry_concept<view_of<polygon_45_concept, T> > {
+// typedef polygon_45_concept type;
+// };
+
+// template <typename T>
+// struct view_of<polygon_90_concept, T> {
+// const T* t;
+// view_of(const T& obj) : t(&obj) {}
+// typedef typename polygon_traits<T>::coordinate_type coordinate_type;
+// typedef typename polygon_traits<T>::iterator_type iterator_type;
+// typedef typename polygon_traits<T>::point_type point_type;
+// typedef iterator_points_to_compact<iterator_type, point_type> compact_iterator_type;
+
+// /// Get the begin iterator
+// inline compact_iterator_type begin_compact() const {
+// return compact_iterator_type(polygon_traits<T>::begin_points(*t),
+// polygon_traits<T>::end_points(*t));
+// }
+
+// /// Get the end iterator
+// inline compact_iterator_type end_compact() const {
+// return compact_iterator_type(polygon_traits<T>::end_points(*t),
+// polygon_traits<T>::end_points(*t));
+// }
+
+// /// Get the number of sides of the polygon
+// inline unsigned int size() const {
+// return polygon_traits<T>::size(*t);
+// }
+
+// /// Get the winding direction of the polygon
+// inline winding_direction winding() const {
+// return polygon_traits<T>::winding(*t);
+// }
+// };
+
+// template <typename T>
+// struct geometry_concept<view_of<polygon_90_concept, T> > {
+// typedef polygon_90_concept type;
+// };
+// }}
+using namespace gtl;
+
+//this test fails and I'd like to get it to pass
+bool test_colinear_duplicate_points() {
+ Point pts[6] = { Point(0, 10), Point(0, 0), Point(100, 0), Point(100, 100), Point(0, 100), Point(0, 10)};
+ Polygon45 p1;
+ p1.set(pts, pts+5);
+ Polygon45 pg;
+ pg.set(pts, pts+6);
+ Polygon45 p2;
+ p2.set(pts+1, pts+6);
+ std::cout << p2 << std::endl;
+ if(!equivalence(view_as<polygon_90_concept>(p2), view_as<polygon_90_concept>(pg))) return false;
+ std::cout << p1 << std::endl;
+ if(!equivalence(view_as<polygon_90_concept>(p1), view_as<polygon_90_concept>(pg))) return false;
+ return true;
+}
+
+bool test_extents() {
+ PolygonSet psT(gtl::VERTICAL);
+ //int xy[] = { 126, 69, 54, 69, 54, 81, 126, 81 };
+ //CPolygonQuery polygon(0, 4, xy);
+ //Rectangle rectIn(54, 69, 126, 81);
+ polygon_data<int> polygon;
+ std::vector<Point> pts;
+ pts.push_back(Point(126, 69));
+ pts.push_back(Point(54, 69));
+ pts.push_back(Point(54, 81));
+ pts.push_back(Point(126, 81));
+ set_points(polygon, pts.begin(), pts.end());
+ psT.insert(view_as<polygon_90_concept>(polygon));
+
+ Rectangle rect, rect2;
+ psT.extents(rect2);
+ gtl::extents(rect, psT);
+
+ if (rect != rect2) {
+ std::cout << "gtl::Rectangles differ: " << gtl::xl(rect) << " " << gtl::xh(rect) << " " << gtl::yl(rect) << " " << gtl::yh(rect) << std::endl;
+ std::cout << " " << gtl::xl(rect2) << " " << gtl::xh(rect2) << " " << gtl::yl(rect2) << " " << gtl::yh(rect2) << std::endl;
+ return false;
+ }
+ return true;
+}
+
+bool test_extents2() {
+ Polygon45Set psT;
+ Point xy[] = { Point(130, 50), Point(50, 50), Point(50, 100), Point(119, 100),
+ Point(119, 59), Point(89, 89), Point(59, 59), Point(119, 59), Point(119, 100), Point(130, 100) };
+ Polygon45 polygon(xy, xy+10);
+
+ psT.insert(polygon);
+ psT += 2;
+
+ Rectangle rect, rect2;
+ psT.extents(rect2);
+ gtl::extents(rect, psT);
+ std::cout << "Extents: " << gtl::xl(rect) << " " << gtl::xh(rect) << " " << gtl::yl(rect) << " " << gtl::yh(rect) << std::endl;
+ std::cout << "Extents: " << gtl::xl(rect2) << " " << gtl::xh(rect2) << " " << gtl::yl(rect2) << " " << gtl::yh(rect2) << std::endl;
+ std::vector<Polygon45WithHoles> pwhs;
+ psT.get(pwhs);
+ for(unsigned int i = 0; i < pwhs.size(); ++i) {
+ std::cout << pwhs[i] << std::endl;
+ }
+ return gtl::equivalence(rect, rect2);
+}
+
+/*************New Polygon Formation Tests********************/
+/*
+ *
+ * Test Input:
+ * +--------------------+
+ * | +-------+ |
+ * | | | |
+ * | | | |
+ * +-----+ | | |
+ * | | | |
+ * | | | |
+ * +-----+ | | |
+ * | | | |
+ * | | | |
+ * | +-------+ |
+ * +--------+ |
+ * | |
+ * | |
+ * +--------+ |
+ * | |
+ * | |
+ * +--------+ |
+ * | |
+ * | |
+ * +--------+ |
+ * | |
+ * | |
+ * +--------------------+
+ *
+ * Test Plan:
+ * a. call 'get(out, param)' , param >=4
+ * b. check if each polygon in the container is <= param
+ * c. check the area of all the pieces sum up to original piece
+ */
+typedef int intDC;
+typedef boost::polygon::polygon_90_with_holes_data<intDC> GTLPolygon;
+typedef boost::polygon::polygon_90_set_data<intDC> GTLPolygonSet;
+typedef boost::polygon::polygon_90_concept GTLPolygonConcept;
+typedef boost::polygon::point_data<intDC> GTLPoint;
+inline void PrintPolygon(const GTLPolygon&);
+inline GTLPolygon CreateGTLPolygon(const int*, size_t);
+int test_new_polygon_formation(int argc, char** argv){
+ // //
+ // Sub-Test-1: do a Boolean and call the new get //
+ // //
+ int coordinates[] = {0,0, 10,0, 10,10, 0,10};
+ int coordinates1[] = {9,1, 20,1, 20,10, 9,10};
+ std::vector<GTLPoint> pts;
+ size_t count = sizeof(coordinates)/(2*sizeof(intDC));
+ size_t count1 = sizeof(coordinates1)/(2*sizeof(intDC));
+ GTLPolygon poly, poly1;
+ GTLPolygonSet polySet;
+
+ poly = CreateGTLPolygon(coordinates, count);
+ poly1 = CreateGTLPolygon(coordinates1, count1);
+
+ polySet.insert(poly);
+ polySet.insert(poly1);
+
+ std::vector<GTLPolygon> result;
+ polySet.get(result, 100);
+
+ if(result.size() > 1){
+ std::cerr << "FAILED: expecting only one polygon because the"
+ " threshold is 100" << std::endl;
+ return 1;
+ }
+
+ if(result[0].size() != 6){
+ std::cerr << "FAILED: expecting only 6 vertices" << std::endl;
+ return 1;
+ }
+
+ if(area(result[0]) != 190){
+ std::cerr <<"FAILED: expecting only 6 vertices" << std::endl;
+ return 1;
+ }
+
+ //expect no more than 1 polygon
+ std::cout << "Found " << result.size() << "polygons after union"
+ << std::endl;
+ for(size_t i=0; i<result.size(); i++){
+ PrintPolygon(result[i]);
+ }
+
+ intDC shell_coords[] = {0,0, 10,0, 10,21, 0,21, 0,15, 3,15, 3,13,
+ 0,13, 0,10, 5,10, 5,8, 0,8, 0,5, 5,5, 5,3, 0,3};
+ intDC hole_coords[] = {4,11, 7,11, 7,19, 4,19};
+ GTLPolygon slice_polygon, slice_hole;
+ count = sizeof(shell_coords)/(2*sizeof(intDC));
+ count1 = sizeof(hole_coords)/(2*sizeof(intDC));
+
+ slice_polygon = CreateGTLPolygon(shell_coords, count);
+ slice_hole = CreateGTLPolygon(hole_coords, count1);
+
+ result.clear();
+ polySet.clear();
+ polySet.insert(slice_polygon);
+ polySet.insert(slice_hole, true);
+
+ polySet.get(result);
+ double gold_area = 0;
+ std::cout << "Found " << result.size() << " slices" << std::endl;
+ for(size_t i=0; i<result.size(); i++){
+ PrintPolygon(result[i]);
+ gold_area += area(result[i]);
+ }
+
+ result.clear();
+ polySet.get(result, 6);
+ double platinum_area = 0;
+ std::cout << "Found " << result.size() << " slices" << std::endl;
+ for(size_t i=0; i<result.size(); i++){
+ PrintPolygon(result[i]);
+ platinum_area += area(result[i]);
+ if(result[i].size() > 6){
+ std::cerr << "FAILED: expecting size to be less than 6" << std::endl;
+ return 1;
+ }
+ }
+
+ std::cout << "platinum_area = " << platinum_area << " , gold_area="
+ << gold_area << std::endl;
+ if( platinum_area != gold_area){
+ std::cerr << "FAILED: Area mismatch" << std::endl;
+ return 1;
+ }
+ std::cout << "[SUB-TEST-1] PASSED\n";
+
+ result.clear();
+ polySet.get(result, 4);
+ platinum_area = 0;
+ std::cout << "Found " << result.size() << " slices" << std::endl;
+ for(size_t i=0; i<result.size(); i++){
+ PrintPolygon(result[i]);
+ platinum_area += area(result[i]);
+ if(result[i].size() > 4){
+ std::cerr << "FAILED: expecting size to be < 4" << std::endl;
+ return 1;
+ }
+ }
+
+ std::cout << "platinum_area=" << platinum_area << ", gold_area="
+ << gold_area << std::endl;
+
+ if( platinum_area != gold_area){
+ std::cerr << "FAILED: Area mismatch" << std::endl;
+ return 1;
+ }
+
+ std::cout << "[SUB-TEST-1] PASSED" << std::endl;
+ return 0;
+}
+
+/*
+ * INPUT:
+ * +--------+
+ * | |
+ * | |
+ * | +---+
+ * | |
+ * | +---+
+ * | |
+ * +--------+
+ * X
+ *
+ * TEST PLAN: as the sweepline moves and reaches
+ * X the number of vertices in the solid jumps by 4
+ * instead of 2. So make sure we don't get a 6 vertex
+ * polygon when the threshold is 4 and 6.
+ */
+int test_new_polygon_formation_marginal_threshold(int argc, char**){
+ std::vector<GTLPoint> pts;
+ GTLPolygon polygon;
+ GTLPolygonSet pset;
+ std::vector<GTLPolygon> result;
+ intDC coords[] = {0,0, 15,0, 15,10, 10,10, 10,15, 5,15, 5,10, 0,10};
+ size_t count = sizeof(coords)/(2*sizeof(intDC));
+
+ polygon = CreateGTLPolygon(coords, count);
+ pset.insert(polygon);
+
+ for(size_t i=0; i<1; i++){
+ pset.get(result, i ? 4 : 6);
+ double gold_area = 175, plat_area = 0;
+ for(size_t i=0; i<result.size(); i++){
+ if(result[i].size() > (i ? 4 : 6) ){
+ size_t expected = i ? 4 : 6;
+ std::cerr << "FAILED: Expecting no more than " <<
+ expected << " vertices" << std::endl;
+ return 1;
+ }
+ PrintPolygon(result[i]);
+ plat_area += area(result[i]);
+ }
+
+ if(plat_area != gold_area){
+ std::cerr << "FAILED area mismatch gold=" << gold_area <<
+ " plat=" << plat_area << std::endl;
+ return 1;
+ }
+ }
+ std::cout << "Test Passed" << std::endl;
+ return 0;
+}
+
+inline void PrintPolygon(const GTLPolygon& p){
+ //get an iterator of the point_data<int>
+ boost::polygon::point_data<int> pt;
+ boost::polygon::polygon_90_data<int>::iterator_type itr;
+
+ size_t vertex_id = 0;
+ for(itr = p.begin(); itr != p.end(); ++itr){
+ pt = *itr;
+ std::cout << "Vertex-" << ++vertex_id << "(" << pt.x() <<
+ "," << pt.y() << ")" << std::endl;
+ }
+}
+
+// size: is the number of vertices //
+inline GTLPolygon CreateGTLPolygon(const int *coords, size_t size){
+ GTLPolygon r;
+ std::vector<GTLPoint> pts;
+
+ for(size_t i=0; i<size; i++){
+ pts.push_back( GTLPoint(coords[2*i], coords[2*i+1]) );
+ }
+ boost::polygon::set_points(r, pts.begin(), pts.end());
+ return r;
+}
+
+/************************************************************/
+
+int main() {
+ test_view_as();
+ //this test fails and I'd like to get it to pass
+ //if(!test_colinear_duplicate_points()) return 1;
+ if(!test_extents2()) return 1;
+ if(!test_extents()) return 1;
+ if(!testMaxCover()) return 1;
+ //max_cover_stress_test(); //does not include functional testing
+ if(!testDirectionalSize()) return 1;
+ testHand();
+ //testHandFloat();
+ if(!testpip()) return 1;
+ {
+ PolygonSet ps;
+ Polygon p;
+ assign(ps, p);
+ }
+ if(!testViewCopyConstruct()) return 1;
+ if(!test_grow_and_45()) return 1;
+ if(!test_self_xor_45()) return 1;
+ if(!test_self_xor()) return 1;
+ if(!test_directional_resize()) return 1;
+ if(!test_scaling_by_floating()) return 1;
+ if(!test_SQRT1OVER2()) return 1;
+ if(!test_get_trapezoids()) return 1;
+ if(!test_get_rectangles()) return 1;
+ if(!test_45_concept_interact()) return 1;
+ if(!test_45_touch_r()) return 1;
+ if(!test_45_touch_ur()) return 1;
+ if(!test_45_touch()) return 1;
+ if(!test_45_touch_boundaries()) return 1;
+ {
+ Point pts[] = {Point(0,0), Point(5, 5), Point(5, 0)};
+ Polygon45 p45(pts, pts+3);
+ pts[1] = Point(0, 5);
+ Polygon45 p452(pts, pts+3);
+ if(!test_two_polygons(p45,p452)) return 1;
+ pts[2] = Point(5,5);
+ p45.set(pts, pts+3);
+ if(!test_two_polygons(p45,p452)) return 1;
+ pts[0] = Point(5,0);
+ p452.set(pts, pts+3);
+ if(!test_two_polygons(p45, p452)) return 1;
+ Point pts2[] = {Point(0,5), Point(5, 5), Point(5, 0)};
+ Point pts3[] = {Point(0,0), Point(5, 5), Point(5, 0)};
+ p45.set(pts2, pts2 + 3);
+ p452.set(pts3, pts3+3);
+ if(!test_two_polygons(p45, p452)) return 1;
+ Point pts4[] = {Point(0, 5), Point(3, 2), Point(3,5)};
+ Point pts5[] = {Point(0,0), Point(5, 5), Point(5, 0)};
+ p45.set(pts4, pts4+3);
+ p452.set(pts5, pts5+3);
+ if(!test_two_polygons(p45, p452)) return 1;
+ }
+ {
+ std::vector<point_data<int> > pts;
+ pts.push_back(point_data<int>(0, 0));
+ pts.push_back(point_data<int>(10, 0));
+ pts.push_back(point_data<int>(10, 10));
+ pts.push_back(point_data<int>(0, 10));
+ std::vector<point_data<int> > pts2;
+ pts2.push_back(point_data<int>(0, 0));
+ pts2.push_back(point_data<int>(10, 10));
+ pts2.push_back(point_data<int>(0, 20));
+ pts2.push_back(point_data<int>(-10, 10));
+ std::vector<point_data<int> > pts3;
+ pts3.push_back(point_data<int>(0, 0));
+ pts3.push_back(point_data<int>(10, 11));
+ pts3.push_back(point_data<int>(0, 20));
+ pts3.push_back(point_data<int>(-100, 8));
+ polygon_data<int> p, p1; p.set(pts3.begin(), pts3.end());
+ polygon_45_data<int> p45, p451; p45.set(pts2.begin(), pts2.end());
+ polygon_90_data<int> p90, p901; p90.set(pts.begin(), pts.end());
+ polygon_with_holes_data<int> pwh, pwh1; pwh.set(pts3.begin(), pts3.end());
+ polygon_45_with_holes_data<int> p45wh, p45wh1; p45wh.set(pts2.begin(), pts2.end());
+ polygon_90_with_holes_data<int> p90wh, p90wh1; p90wh.set(pts.begin(), pts.end());
+ assign(p, p90);
+ assign(p, p45);
+ assign(p1, p);
+ //illegal: assign(p, p90wh);
+ //illegal: assign(p, p45wh);
+ //illegal: assign(p, pwh);
+
+ assign(p45, p90);
+ assign(p451, p45);
+ //illegal: assign(p45, p);
+ //illegal: assign(p45, p90wh);
+ //illegal: assign(p45, p45wh);
+ //illegal: assign(p45, pwh);
+
+ assign(p901, p90);
+ //illegal: assign(p90, p45);
+ //illegal: assign(p90, p);
+ //illegal: assign(p90, p90wh);
+ //illegal: assign(p90, p45wh);
+ //illegal: assign(p90, pwh);
+
+ assign(pwh, p90);
+ assign(pwh, p45);
+ assign(pwh, p);
+ assign(pwh, p90wh);
+ assign(pwh, p45wh);
+ assign(pwh1, pwh);
+
+ assign(p45wh, p90);
+ assign(p45wh, p45);
+ //illegal: assign(p45wh, p);
+ assign(p45wh, p90wh);
+ assign(p45wh1, p45wh);
+ //illegal: assign(p45wh, pwh);
+
+ assign(p90wh, p90);
+ //illegal: assign(p90wh, p45);
+ //illegal: assign(p90wh, p);
+ assign(p90wh1, p90wh);
+ //illegal: assign(p90wh, p45wh);
+ //illegal: assign(p90wh, pwh);
+ pts.clear();
+ pts.push_back(point_data<int>(0, 0));
+ pts.push_back(point_data<int>(3, 0));
+ pts.push_back(point_data<int>(0, 1));
+ p.set(pts.begin(), pts.end());
+ std::cout << std::endl; std::cout << (area(p90));
+ std::cout << std::endl; std::cout << (area(p45));
+ std::cout << std::endl; std::cout << (area(p));
+ std::cout << std::endl; std::cout << (area(p90wh));
+ std::cout << std::endl; std::cout << (area(p45wh));
+ std::cout << std::endl; std::cout << (area(pwh));
+ std::cout << std::endl;
+ point_data<int> pt(1, 1);
+ std::cout << contains(p, pt) << std::endl;
+ std::cout << contains(p90, pt) << std::endl;
+
+ interval_data<int> ivl = construct<interval_data<int> >(0, 10);
+ std::cout << get(ivl, LOW) << std::endl;
+ set(ivl, HIGH, 20);
+
+ std::cout << perimeter(p) << std::endl;
+ if(winding(p) == LOW) std::cout << "LOW" << std::endl;
+ if(winding(p) == HIGH) std::cout << "HIGH" << std::endl;
+ rectangle_data<polygon_long_long_type> rd;
+ std::cout << extents(rd, p) << std::endl;
+ std::cout << rd << std::endl;
+
+ boolean_op::testBooleanOr<int>();
+
+ std::vector<rectangle_data<int> > rects1, rects2;
+ rects2.push_back(rectangle_data<int>(0, 0, 10, 10));
+ print_is_polygon_90_set_concept((polygon_90_set_data<int>()));
+ print_is_mutable_polygon_90_set_concept((polygon_90_set_data<int>()));
+ print_is_polygon_90_set_concept((polygon_90_data<int>()));
+ print_is_polygon_90_set_concept((std::vector<polygon_90_data<int> >()));
+ assign(rects1, rects2);
+ polygon_90_set_data<int> ps90;
+ assign(ps90, rects2);
+ assign(rects2, ps90);
+ assign(ps90, p90);
+ assign(rects2, p90);
+ std::cout << p90 << std::endl;
+ for(unsigned int i = 0; i < rects2.size(); ++i) {
+ std::cout << rects2[i] << std::endl;
+ }
+ bloat(rects2, 10);
+ shrink(rects2[0], 10);
+ for(unsigned int i = 0; i < rects2.size(); ++i) {
+ std::cout << rects2[i] << std::endl;
+ }
+ move(rects2[0], HORIZONTAL, 30);
+ assign(rects1, rects2 + p90);
+ std::cout << "result of boolean or\n";
+ for(unsigned int i = 0; i < rects1.size(); ++i) {
+ std::cout << rects1[i] << std::endl;
+ }
+ rects1 -= p90;
+ std::cout << "result of boolean not\n";
+ for(unsigned int i = 0; i < rects1.size(); ++i) {
+ std::cout << rects1[i] << std::endl;
+ }
+ rects1 += p90;
+ std::cout << "result of boolean OR\n";
+ for(unsigned int i = 0; i < rects1.size(); ++i) {
+ std::cout << rects1[i] << std::endl;
+ }
+ rects1 *= p90;
+ std::cout << "result of boolean AND\n";
+ for(unsigned int i = 0; i < rects1.size(); ++i) {
+ std::cout << rects1[i] << std::endl;
+ }
+ rects1 ^= rects2;
+ std::cout << "result of boolean XOR\n";
+ for(unsigned int i = 0; i < rects1.size(); ++i) {
+ std::cout << rects1[i] << std::endl;
+ }
+ rects2.clear();
+ get_max_rectangles(rects2, p90);
+ std::cout << "result of max rectangles\n";
+ for(unsigned int i = 0; i < rects2.size(); ++i) {
+ std::cout << rects2[i] << std::endl;
+ }
+ rects2.clear();
+ //operator += and -= don't support polygons, so + and - should not exist
+// rects2 += p90 + 6;
+// std::cout << "result of resize\n";
+// for(unsigned int i = 0; i < rects2.size(); ++i) {
+// std::cout << rects2[i] << std::endl;
+// }
+// std::cout << "result of resize\n";
+ std::vector<polygon_90_with_holes_data<int> > polyswh1, polyswh2;
+// polyswh1 += p90 -2;
+// for(unsigned int i = 0; i < polyswh1.size(); ++i) {
+// std::cout << polyswh1[i] << std::endl;
+// }
+// std::cout << "result of resize\n";
+ std::vector<polygon_90_data<int> > polys1, polys2;
+ polys1 += p90;
+ polys1 -= 2;
+// polys1 += p90 -2;
+ for(unsigned int i = 0; i < polys1.size(); ++i) {
+ std::cout << polys1[i] << std::endl;
+ }
+
+ boolean_op_45<int>::testScan45(std::cout);
+ polygon_45_formation<int>::testPolygon45Formation(std::cout);
+ polygon_45_formation<int>::testPolygon45Tiling(std::cout);
+
+ axis_transformation atr;
+ transform(p, atr);
+ transform(p45, atr);
+ transform(p90, atr);
+ transform(pwh, atr);
+ transform(p45wh, atr);
+ transform(p90wh, atr);
+ scale_up(p, 2);
+ scale_up(p45, 2);
+ scale_up(p90, 2);
+ scale_up(pwh, 2);
+ scale_up(p45wh, 2);
+ scale_up(p90wh, 2);
+ scale_down(p, 2);
+ scale_down(p45, 2);
+ scale_down(p90, 2);
+ scale_down(pwh, 2);
+ scale_down(p45wh, 2);
+ scale_down(p90wh, 2);
+ std::vector<polygon_45_data<int> > p45s1, p45s2;
+ std::cout << equivalence(p45s1, p45s2) << std::endl;
+ std::cout << equivalence(p45, p45wh) << std::endl;
+ std::cout << equivalence(p90, p45wh) << std::endl;
+ gtl::assign(p45s1, p90);
+ p90 = polys1[0];
+ move(p90, orientation_2d(HORIZONTAL), 8);
+ std::cout << p90 << std::endl << p45wh << std::endl;
+ polygon_45_set_data<int> ps45 = p90 + p45wh;
+ assign(p45s1, ps45);
+ std::cout << "result\n";
+ for(unsigned int i = 0; i < p45s1.size(); ++i) {
+ std::cout << p45s1[i] << std::endl;
+ }
+ std::cout << equivalence(p, pwh) << std::endl;
+ std::cout << equivalence(p90, pwh) << std::endl;
+ std::cout << equivalence(p45, pwh) << std::endl;
+ std::cout << equivalence(pwh, pwh) << std::endl;
+ p + pwh;
+ p90 + pwh;
+ p45 + pwh;
+ std::cout << testRectangle() << std::endl;
+ std::cout << testPolygon() << std::endl;
+ std::cout << testPropertyMerge() << std::endl;
+ std::cout << testPolygonAssign() << std::endl;
+ std::cout << testPolygonWithHoles() << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationRect(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationP1(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationP2(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationPolys(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationSelfTouch1(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationSelfTouch2(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationSelfTouch3(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testSegmentIntersection(std::cout)) << std::endl;
+ std::cout << (property_merge<int, int>::test_insertion(std::cout)) << std::endl;
+ std::cout << (line_intersection<int>::test_verify_scan(std::cout)) << std::endl;
+ std::cout << (line_intersection<int>::test_validate_scan(std::cout)) << std::endl;
+ std::cout << (scanline<int, int>::test_scanline(std::cout)) << std::endl;
+ std::cout << (property_merge<int, int>::test_merge(std::cout)) << std::endl;
+ std::cout << (property_merge<int, int>::test_intersection(std::cout)) << std::endl;
+ std::cout << (polygon_arbitrary_formation<int>::testPolygonArbitraryFormationColinear(std::cout)) << std::endl;
+ std::cout << (property_merge<int, int>::test_manhattan_intersection(std::cout)) << std::endl;
+ std::cout << (test_arbitrary_boolean_op<int>(std::cout)) << std::endl;
+ }
+ {
+ polygon_set_data<int> psd;
+ rectangle_data<int> rect;
+ set_points(rect, point_data<int>(0, 0), point_data<int>(10, 10));
+ psd.insert(rect);
+ polygon_set_data<int> psd2;
+ set_points(rect, point_data<int>(5, 5), point_data<int>(15, 15));
+ psd2.insert(rect);
+ std::vector<polygon_data<int> > pv;
+ polygon_set_data<int> psd3;
+ psd3 = psd + psd2;
+ psd3.get(pv);
+ for(unsigned int i = 0; i < pv.size(); ++i) {
+ std::cout << pv[i] << std::endl;
+ }
+ psd += psd2;
+ pv.clear();
+ psd3.get(pv);
+ for(unsigned int i = 0; i < pv.size(); ++i) {
+ std::cout << pv[i] << std::endl;
+ }
+ }
+ {
+ polygon_90_set_data<int> psd;
+ rectangle_data<int> rect;
+ set_points(rect, point_data<int>(0, 0), point_data<int>(10, 10));
+ psd.insert(rect);
+ polygon_90_set_data<int> psd2;
+ set_points(rect, point_data<int>(5, 5), point_data<int>(15, 15));
+ psd2.insert(rect);
+ std::vector<polygon_90_data<int> > pv;
+ interact(psd, psd2);
+ assign(pv, psd);
+ for(unsigned int i = 0; i < pv.size(); ++i) {
+ std::cout << pv[i] << std::endl;
+ }
+
+ connectivity_extraction_90<int> ce;
+ ce.insert(pv[0]);
+ ce.insert(psd2);
+ std::vector<std::set<int> > graph(2);
+ ce.extract(graph);
+ if(graph[0].size() == 1) std::cout << "connectivity extraction is alive\n";
+
+ //std::vector<rectangle_data<polygon_long_long_type> > lobs;
+ //get_max_rectangles(lobs, psd);
+ //if(lobs.size() == 1) std::cout << "max rectangles is alive\n";
+
+ std::vector<rectangle_data<int> > rv;
+ rv.push_back(rect);
+ set_points(rect, point_data<int>(0, 0), point_data<int>(10, 10));
+ rv.push_back(rect);
+ self_intersect(rv);
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+
+ assign(rv, rv + 1);
+ std::cout << rv.size() << std::endl;
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ assign(rv, rv - 1);
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ rv += 1;
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ rv -= 1;
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ rv.clear();
+ set_points(rect, point_data<int>(0, 0), point_data<int>(10, 10));
+ rv.push_back(rect);
+ set_points(rect, point_data<int>(12, 12), point_data<int>(20, 20));
+ rv.push_back(rect);
+ grow_and(rv, 7);
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ std::cout << area(rv) << std::endl;
+ std::cout << area(rv) << std::endl;
+
+ scale_up(rv, 10);
+ std::cout << area(rv) << std::endl;
+ scale_down(rv, 7);
+ std::cout << area(rv) << std::endl;
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ keep(rv, 290, 300, 7, 24, 7, 24);
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ keep(rv, 300, 310, 7, 24, 7, 24);
+ if(rv.empty()) std::cout << "keep is alive\n";
+ }
+ {
+// typedef int Unit;
+// typedef point_data<int> Point;
+// typedef interval_data<int> Interval;
+// typedef rectangle_data<int> Rectangle;
+// typedef polygon_90_data<int> Polygon;
+// typedef polygon_90_with_holes_data<int> PolygonWithHoles;
+// typedef polygon_45_data<int> Polygon45;
+// typedef polygon_45_with_holes_data<int> Polygon45WithHoles;
+// typedef polygon_90_set_data<int> PolygonSet;
+// //typedef polygon_45_set_data<int> Polygon45Set;
+// typedef axis_transformation AxisTransform;
+// typedef transformation<int> Transform;
+ //test polygon45 area, polygon45 with holes area
+ std::vector<Point> pts;
+ pts.clear();
+ pts.push_back(Point(10, 10));
+ pts.push_back(Point(15, 10));
+ pts.push_back(Point(10, 15));
+ Polygon45 polyHole;
+ polyHole.set(pts.begin(), pts.end());
+ pts.clear();
+ pts.push_back(Point(10, 0));
+ pts.push_back(Point(20, 10));
+ pts.push_back(Point(20, 30));
+ pts.push_back(Point(0, 50));
+ pts.push_back(Point(0, 10));
+ Polygon45WithHoles polyWHoles;
+ polyWHoles.set(pts.begin(), pts.end());
+ polyWHoles.set_holes(&polyHole, (&polyHole)+1);
+ std::cout << polyWHoles << std::endl;
+ std::cout << area(polyWHoles) << std::endl;
+ std::cout << area(polyWHoles) << std::endl;
+ //test polygon45, polygon45with holes transform
+ AxisTransform atr(AxisTransform::EAST_SOUTH);
+ Polygon45WithHoles p45wh(polyWHoles);
+ transform(polyWHoles, atr);
+ std::cout << polyWHoles << std::endl;
+ Transform tr(atr);
+ tr.invert();
+ transform(polyWHoles, tr);
+ std::cout << polyWHoles << std::endl;
+ if(area(polyWHoles) != 687.5) return 1;
+ //test polygon, polygon with holes transform
+ Polygon ph;
+ assign(ph, Rectangle(10, 10, 20, 20));
+ PolygonWithHoles pwh;
+ assign(pwh, Rectangle(0, 0, 100, 100));
+ pwh.set_holes(&ph, (&ph)+1);
+ std::cout << area(pwh) << std::endl;
+ transform(pwh, atr);
+ std::cout << pwh << std::endl;
+ std::cout << area(pwh) << std::endl;
+ transform(pwh, tr);
+ std::cout << pwh << std::endl;
+ std::cout << area(pwh) << std::endl;
+ if(area(pwh) != 9900) return 1;
+
+ //test point scale up / down
+ Point pt(10, 10);
+ scale_up(pt, 25);
+ if(pt != Point(250, 250)) return 1;
+ std::cout << pt << std::endl;
+ scale_down(pt, 25);
+ if(pt != Point(10, 10)) return 1;
+ std::cout << pt << std::endl;
+ scale_down(pt, 25);
+ if(pt != Point(0, 0)) return 1;
+ std::cout << pt << std::endl;
+
+ //test polygon, polygon with holes scale up down
+ PolygonWithHoles tmpPwh(pwh);
+ scale_up(pwh, 25);
+ std::cout << pwh << std::endl;
+ scale_down(pwh, 25);
+ if(area(pwh) != area(tmpPwh)) return 1;
+ std::cout << pwh << std::endl;
+ scale_down(pwh, 25);
+ std::cout << pwh << std::endl;
+ //test polygon45, polygon45 with holes is45
+ std::cout << is_45(polyHole) << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ pts.clear();
+ pts.push_back(Point(10, 10));
+ pts.push_back(Point(15, 10));
+ pts.push_back(Point(10, 16));
+ polyHole.set(pts.begin(), pts.end());
+ std::cout << is_45(polyHole) << std::endl;
+ if(is_45(polyHole) != false) return 1;
+ //test polygon45, polygon45 with holes snap 45
+ snap_to_45(polyHole);
+ std::cout << is_45(polyHole) << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ std::cout << polyHole << std::endl;
+ //test polygon45, polygon45 with holes scalue up down
+ scale_up(polyHole, 10000);
+ std::cout << polyHole << std::endl;
+ scale_down(polyHole, 3);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 5);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 7);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 13);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_up(polyHole, 3);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ pts.clear();
+ pts.push_back(Point(11, 1));
+ pts.push_back(Point(21, 11));
+ pts.push_back(Point(11, 21));
+ pts.push_back(Point(1, 11));
+ polyHole.set(pts.begin(), pts.end());
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 3);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_up(polyHole, 10000);
+ std::cout << polyHole << std::endl;
+ scale_down(polyHole, 3);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 5);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 7);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 13);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_up(polyHole, 3);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+ scale_down(polyHole, 2);
+ std::cout << is_45(polyHole) << " " << polyHole << std::endl;
+ if(is_45(polyHole) != true) return 1;
+
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_up(polyWHoles, 100013);
+ std::cout << polyWHoles << std::endl;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 3);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+ scale_down(polyWHoles, 2);
+ std::cout << is_45(polyWHoles) << " " << polyWHoles << std::endl;
+ if(is_45(polyWHoles) != true) return 1;
+
+ std::cout << (boolean_op_45<Unit>::testScan45(std::cout)) << std::endl;
+ std::cout << (polygon_45_formation<Unit>::testPolygon45Formation(std::cout)) << std::endl;
+ std::cout << (polygon_45_formation<Unit>::testPolygon45Tiling(std::cout)) << std::endl;
+
+
+ {
+ PolygonSet ps;
+ Rectangle rect;
+ ps.insert(Rectangle(0, 0, 10, 10));
+ std::cout << area(ps) << std::endl;
+ if(area(ps) != 100) return 1;
+ scale_up(ps, 3);
+ std::cout << area(ps) << std::endl;
+ if(area(ps) != 900) return 1;
+ scale_down(ps, 2);
+ std::cout << area(ps) << std::endl;
+ if(area(ps) != 225) return 1;
+ transform(ps, atr);
+ std::vector<Rectangle> rv;
+ rv.clear();
+ ps.get(rv);
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ transform(ps, tr);
+ rv.clear();
+ ps.get(rv);
+ if(rv.size() == 1) {
+ assign(rect, rv.back());
+ std::cout << rect << std::endl;
+ }
+ }
+ //test polygon45set transform
+ pts.clear();
+ pts.push_back(Point(10, 10));
+ pts.push_back(Point(15, 10));
+ pts.push_back(Point(10, 15));
+ polyHole.set(pts.begin(), pts.end());
+ Polygon45Set ps451, ps452;
+ ps451.insert(polyHole);
+ ps452 = ps451;
+ std::cout << (ps451 == ps452) << std::endl;
+ if(ps451 != ps452) return 1;
+ ps451.transform(atr);
+ std::cout << (ps451 == ps452) << std::endl;
+ if(ps451 == ps452) return 1;
+ ps451.transform(tr);
+ std::cout << (ps451 == ps452) << std::endl;
+ if(ps451 != ps452) return 1;
+
+ //test polygon45set area
+ std::cout << area(ps451) << std::endl;
+ if(area(ps451) != 12.5) return 1;
+ //test polygon45set scale up down
+ ps451.scale_up(3);
+ std::cout << area(ps451) << std::endl;
+ if(area(ps451) != 112.5) return 1;
+ ps451.scale_down(2);
+ std::cout << area(ps451) << std::endl;
+ if(area(ps451) != 32) return 1;
+ //test polygonset scalue up down
+ }
+ {
+ std::cout << (testPolygon45SetRect()) << std::endl;
+ testPolygon45SetPerterbation(); //re-enable after non-intersection fix
+ testPolygon45Set();
+ testPolygon45SetDORA(); //re-enable after non-intersection fix
+ polygon_45_set_data<int> ps45_1, ps45_2, ps45_3;
+ ps45_1.insert(rectangle_data<int>(0, 0, 10, 10));
+ ps45_2.insert(rectangle_data<int>(5, 5, 15, 15));
+ std::vector<polygon_45_data<int> > p45s;
+ ps45_3 = ps45_1 | ps45_2;
+ ps45_3.get(p45s);
+ if(p45s.size()) std::cout << p45s[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ p45s.clear();
+ ps45_3 = ps45_1 + ps45_2;
+ ps45_3.get(p45s);
+ if(p45s.size()) std::cout << p45s[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ p45s.clear();
+ ps45_3 = ps45_1 * ps45_2;
+ ps45_3.get(p45s);
+ if(p45s.size()) std::cout << p45s[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ p45s.clear();
+ ps45_3 = ps45_1 - ps45_2;
+ ps45_3.get(p45s);
+ if(p45s.size()) std::cout << p45s[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ p45s.clear();
+ ps45_3 = ps45_1 ^ ps45_2;
+ ps45_3.get(p45s);
+ if(p45s.size() == 2) std::cout << p45s[0] << " " << p45s[1] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ std::vector<point_data<int> > pts;
+ pts.clear();
+ pts.push_back(point_data<int>(7, 0));
+ pts.push_back(point_data<int>(20, 13));
+ pts.push_back(point_data<int>(0, 13));
+ pts.push_back(point_data<int>(0, 0));
+ polygon_45_data<int> p45_1(pts.begin(), pts.end());
+ ps45_3.clear();
+ ps45_3.insert(p45_1);
+ p45s.clear();
+ ps45_3.get(p45s);
+ if(p45s.size()) std::cout << p45s[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ ps45_3 += 1;
+ p45s.clear();
+ ps45_3.get(p45s);
+ if(p45s.size()) std::cout << p45s[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ ps45_3 -= 1;
+ p45s.clear();
+ ps45_3.get(p45s);
+ if(p45s.size()) std::cout << p45s[0] << std::endl;
+ else {
+ std::cout << "test failed\n";
+ return 1;
+ }
+ }
+ {
+ polygon_90_set_data<int> p90sd;
+ p90sd.insert(rectangle_data<int>(0, 0, 10, 10));
+ std::vector<rectangle_data<int> > rects;
+ std::vector<polygon_90_data<int> > polys90;
+ std::vector<polygon_90_with_holes_data<int> > pwhs90;
+ assign(rects, p90sd);
+ assign(polys90, p90sd);
+ assign(pwhs90, p90sd);
+ std::cout << equivalence(rects, polys90) << std::endl;
+ std::cout << equivalence(pwhs90, polys90) << std::endl;
+ pwhs90.clear();
+ assign(pwhs90, polys90);
+ std::cout << equivalence(pwhs90, polys90) << std::endl;
+ }
+ {
+ polygon_45_set_data<int> p45sd;
+ p45sd.insert(rectangle_data<int>(0, 0, 10, 10));
+ std::vector<rectangle_data<int> > rects;
+ std::vector<polygon_45_data<int> > polys45;
+ std::vector<polygon_45_with_holes_data<int> > pwhs45;
+ get_trapezoids(polys45, p45sd);
+ assign(polys45, p45sd);
+ assign(pwhs45, p45sd);
+ std::cout << equivalence(pwhs45, polys45) << std::endl;
+ pwhs45.clear();
+ assign(pwhs45, polys45);
+ std::cout << equivalence(pwhs45, polys45) << std::endl;
+ }
+ {
+ polygon_set_data<int> psd;
+ psd.insert(rectangle_data<int>(0, 0, 10, 10));
+ std::vector<polygon_data<int> > polys;
+ std::vector<polygon_with_holes_data<int> > pwhs;
+ assign(polys, psd);
+ assign(pwhs, psd);
+ std::cout << equivalence(pwhs, polys) << std::endl;
+ pwhs.clear();
+ assign(pwhs, polys);
+ std::cout << equivalence(pwhs, polys) << std::endl;
+ }
+ {
+ polygon_90_set_data<int> ps1(HORIZONTAL), ps2(VERTICAL);
+ ps1 += rectangle_data<int>(0, 0, 10, 120);
+ assign(ps1, ps2);
+ std::cout << equivalence(ps1, ps2) << std::endl;
+ }
+ {
+ std::vector<rectangle_data<polygon_long_long_type> > lobs, input;
+ input.push_back(rectangle_data<polygon_long_long_type>(0, 0, 10, 10));
+ input.push_back(rectangle_data<polygon_long_long_type>(10, 5, 15, 15));
+ get_max_rectangles(lobs, input);
+ if(lobs.size() == 3) std::cout << "max rectangles is correct\n";
+ }
+ {
+ polygon_set_data<int> ps1, ps2, ps3;
+ ps1.insert(rectangle_data<int>(0, 0, 10, 10));
+ ps2.insert(rectangle_data<int>(0, 0, 15, 5));
+ ps3.insert(rectangle_data<int>(0, 0, 20, 2));
+ std::cout << area(ps1 + ps2) << std::endl;
+ keep(ps1, 0, 100, 0, 100, 0, 100);
+ if(empty(ps1)) return 1;
+ rectangle_data<int> bbox;
+ extents(bbox, ps1);
+ std::cout << bbox << std::endl;
+ //resize(ps1, 1);
+ //shrink(ps1, 1);
+ //bloat(ps1, 1);
+ scale_up(ps1, 2);
+ scale_down(ps1, 2);
+ axis_transformation atr;
+ transform(ps1, atr);
+ std::cout << area(ps1) << std::endl;
+ if(area(ps1) != 100) return 1;
+ clear(ps1);
+ if(!empty(ps1)) return 1;
+ ps1 = ps2 * ps3;
+ ps1 *= ps2;
+ ps1 - ps2;
+ ps1 -= ps2;
+ ps1 ^ ps2;
+ ps1 ^= ps2;
+ ps1 | ps2;
+ ps1 |= ps2;
+ }
+ {
+ polygon_45_set_data<int> ps45_1, ps45_2;
+ ps45_1.insert(rectangle_data<int>(0, 0, 10, 10));
+ keep(ps45_1, 0, 1000, 0, 1000, 0, 1000);
+ std::cout << area(ps45_1) << std::endl;
+ std::cout << empty(ps45_1) << std::endl;
+ rectangle_data<int> bbox;
+ extents(bbox, ps45_1);
+ std::cout << bbox << std::endl;
+ resize(ps45_1, 1);
+ shrink(ps45_1, 1);
+ bloat(ps45_1, 1);
+ scale_up(ps45_1, 2);
+ scale_down(ps45_1, 2);
+ axis_transformation atr;
+ transform(ps45_1, atr);
+ std::cout << area(ps45_1) << std::endl;
+ if(area(ps45_1) != 144) return 1;
+ clear(ps45_1);
+ if(!empty(ps45_1)) return 1;
+ }
+ {
+ std::vector<polygon_45_data<int> > p45v;
+ p45v + p45v;
+ p45v *= p45v;
+ p45v += p45v;
+ p45v - p45v;
+ p45v -= p45v;
+ p45v ^ p45v;
+ p45v ^= p45v;
+ p45v | p45v;
+ p45v |= p45v;
+ p45v + 1;
+ p45v += 1;
+ p45v - 1;
+ p45v -= 1;
+ p45v + (p45v + p45v);
+ }
+ {
+ polygon_45_set_data<int> ps45;
+ polygon_90_set_data<int> ps90;
+ std::vector<polygon_90_with_holes_data<int> > p90whv;
+ ps45.insert(ps90);
+ ps45.insert(p90whv);
+ ps45.insert(p90whv + p90whv);
+
+ ps45.insert(polygon_90_with_holes_data<int>());
+ polygon_with_holes_data<int> pwh;
+ snap_to_45(pwh);
+ }
+ {
+ polygon_90_set_data<int> ps90_1, ps90_2;
+ ps90_1.insert(rectangle_data<int>(0, 0, 10, 10));
+ keep(ps90_1, 0, 1000, 0, 1000, 0, 1000);
+ std::cout << area(ps90_1) << std::endl;
+ std::cout << empty(ps90_1) << std::endl;
+ rectangle_data<int> bbox;
+ extents(bbox, ps90_1);
+ std::cout << bbox << std::endl;
+ resize(ps90_1, 1);
+ shrink(ps90_1, 1);
+ bloat(ps90_1, 1);
+ scale_up(ps90_1, 2);
+ scale_down(ps90_1, 2);
+ scale(ps90_1, anisotropic_scale_factor<double>(2, 2));
+ scale(ps90_1, anisotropic_scale_factor<double>(0.5, 0.5));
+ axis_transformation atr;
+ transform(ps90_1, atr);
+ std::cout << area(ps90_1) << std::endl;
+ if(area(ps90_1) != 144) return 1;
+ clear(ps90_1);
+ if(!empty(ps90_1)) return 1;
+ }
+ if(!nonInteger45StessTest()) return 1;
+ {
+ using namespace gtl;
+ typedef polygon_45_property_merge<int, int> p45pm;
+ p45pm::MergeSetData msd;
+ polygon_45_set_data<int> ps;
+ ps += rectangle_data<int>(0, 0, 10, 10);
+ p45pm::populateMergeSetData(msd, ps.begin(), ps.end(), 444);
+ ps.clear();
+ ps += rectangle_data<int>(5, 5, 15, 15);
+ p45pm::populateMergeSetData(msd, ps.begin(), ps.end(), 333);
+ std::map<std::set<int>, polygon_45_set_data<int> > result;
+ p45pm::performMerge(result, msd);
+ int i = 0;
+ for(std::map<std::set<int>, polygon_45_set_data<int> >::iterator itr = result.begin();
+ itr != result.end(); ++itr) {
+ for(std::set<int>::const_iterator itr2 = (*itr).first.begin();
+ itr2 != (*itr).first.end(); ++itr2) {
+ std::cout << *itr2 << " ";
+ } std::cout << " : ";
+ std::cout << area((*itr).second) << std::endl;
+ if(i == 1) {
+ if(area((*itr).second) != 100) return 1;
+ } else
+ if(area((*itr).second) != 300) return 1;
+ ++i;
+ }
+
+
+ property_merge_45<int, int> pm;
+ pm.insert(rectangle_data<int>(0, 0, 10, 10), 444);
+ pm.insert(rectangle_data<int>(5, 5, 15, 15), 333);
+ std::map<std::set<int>, polygon_45_set_data<int> > mp;
+ pm.merge(mp);
+ i = 0;
+ for(std::map<std::set<int>, polygon_45_set_data<int> >::iterator itr = mp.begin();
+ itr != mp.end(); ++itr) {
+ for(std::set<int>::const_iterator itr2 = (*itr).first.begin();
+ itr2 != (*itr).first.end(); ++itr2) {
+ std::cout << *itr2 << " ";
+ } std::cout << " : ";
+ std::cout << area((*itr).second) << std::endl;
+ if(i == 1) {
+ if(area((*itr).second) != 25) return 1;
+ } else
+ if(area((*itr).second) != 75) return 1;
+ ++i;
+ }
+ std::map<std::vector<int>, polygon_45_set_data<int> > mp2;
+ pm.merge(mp2);
+ i = 0;
+ for(std::map<std::vector<int>, polygon_45_set_data<int> >::iterator itr = mp2.begin();
+ itr != mp2.end(); ++itr) {
+ for(std::vector<int>::const_iterator itr2 = (*itr).first.begin();
+ itr2 != (*itr).first.end(); ++itr2) {
+ std::cout << *itr2 << " ";
+ } std::cout << " : ";
+ std::cout << area((*itr).second) << std::endl;
+ if(i == 1) {
+ if(area((*itr).second) != 25) return 1;
+ } else
+ if(area((*itr).second) != 75) return 1;
+ ++i;
+ }
+ }
+ {
+ std::cout << trapezoid_arbitrary_formation<int>::testTrapezoidArbitraryFormationRect(std::cout) << std::endl;
+ std::cout << trapezoid_arbitrary_formation<int>::testTrapezoidArbitraryFormationP1(std::cout) << std::endl;
+ std::cout << trapezoid_arbitrary_formation<int>::testTrapezoidArbitraryFormationP2(std::cout) << std::endl;
+ std::cout << trapezoid_arbitrary_formation<int>::testTrapezoidArbitraryFormationPolys(std::cout) << std::endl;
+ std::cout << polygon_arbitrary_formation<int>::testPolygonArbitraryFormationSelfTouch1(std::cout) << std::endl;
+ std::cout << trapezoid_arbitrary_formation<int>::testTrapezoidArbitraryFormationSelfTouch1(std::cout) << std::endl;
+ typedef rectangle_data<int> Rectangle;
+ polygon_set_data<int> ps;
+ ps += Rectangle(0, 1, 10, 11);
+ ps += Rectangle(5, 6, 15, 16);
+ std::vector<polygon_data<int> > polys;
+ ps.get_trapezoids(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ ps.transform(axis_transformation(axis_transformation::FLIP_X));
+ polys.clear();
+ ps.get_trapezoids(polys);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ polys.clear();
+ ps.get_trapezoids(polys, HORIZONTAL);
+ for(unsigned int i = 0; i < polys.size(); ++i) {
+ std::cout << polys[i] << std::endl;
+ }
+ }
+
+ if(!test_aa_touch()) {
+ std::cout << "test_aa_touch failed\n";
+ return 1;
+ }
+ if(!test_aa_touch_ur()) {
+ std::cout << "test_aa_touch_ur failed\n";
+ return 1;
+ }
+ if(!test_aa_touch_ur()) {
+ std::cout << "test_aa_touch_ur failed\n";
+ return 1;
+ }
+ if(!test_aa_touch_r()) {
+ std::cout << "test_aa_touch_r failed\n";
+ return 1;
+ }
+ if(!test_aa_touch_boundaries()) {
+ std::cout << "test_aa_touch_boundaries failed\n";
+ return 1;
+ }
+ if(!test_aa_concept_interact()) {
+ std::cout << "test_aa_concept_interact failed\n";
+ return 1;
+ }
+
+ {
+ polygon_set_data<int> ps;
+ polygon_90_set_data<int> ps90;
+ rectangle_data<int> rect(0, 1, 10, 100);
+ std::vector<polygon_data<int> > rupolys, rupolys45;
+ ps.insert(rect);
+ ps90.insert(rect);
+ ps.bloat(10);
+ ps90.bloat(10, 10, 10, 10);
+ rupolys.clear();
+ rupolys45.clear();
+ ps.get(rupolys);
+ ps90.get(rupolys45);
+ std::cout << rupolys[0] << std::endl;
+ std::cout << rupolys45[0] << std::endl;
+ if(!equivalence(ps, ps90)) {
+ std::cout << "test manhattan vs general resize up failed\n";
+ return 1;
+ }
+ ps.shrink(10);
+ ps90.shrink(10, 10, 10, 10);
+ if(!equivalence(ps, rect)) {
+ std::cout << "test manhattan vs general resize down failed\n";
+ return 1;
+ }
+ rectangle_data<int> rect2(3, 4, 6, 80);
+ ps -= rect2;
+ ps90 -= rect2;
+ ps.bloat(1);
+ ps90.bloat(1, 1, 1, 1);
+ if(!equivalence(ps, ps90)) {
+ std::cout << "test manhattan vs general with hole resize up failed\n";
+ return 1;
+ }
+ ps.shrink(1);
+ ps90.shrink(1, 1, 1, 1);
+ if(!equivalence(ps, ps90)) {
+ std::cout << "test manhattan vs general with hole resize down failed\n";
+ return 1;
+ }
+ ps.clear();
+ polygon_45_data<int> poly;
+ std::vector<point_data<int> > pts;
+ pts.push_back(point_data<int>(0, 0));
+ pts.push_back(point_data<int>(10, 0));
+ pts.push_back(point_data<int>(0, 10));
+ polygon_45_set_data<int> ps45;
+ set_points(poly, pts.begin(), pts.end());
+ ps.insert(poly);
+ ps45.insert(poly);
+ ps.bloat(9);
+ ps45.resize(9);
+ rupolys.clear();
+ rupolys45.clear();
+ ps.get(rupolys);
+ ps45.get(rupolys45);
+ std::cout << rupolys[0] << std::endl;
+ std::cout << rupolys45[0] << std::endl;
+ pts.clear();
+ pts.push_back(point_data<int>(32, -9));
+ pts.push_back(point_data<int>(-9, 32));
+ pts.push_back(point_data<int>(-9, -9));
+ set_points(poly, pts.begin(), pts.end());
+ if(!equivalence(ps, poly)) {
+ std::cout << "test general resize up failed\n";
+ return 1;
+ }
+ // this test is waived due to rounding differences between 45 and general resizing
+ // general resizing is computing floating point coordinates for the intersection
+ // and rounding those to closest while 45 is computing the normal point and rounding
+ // that to closest, it turns out to result in different intersection point
+ // we want the general to be more accurate to avoid artifacts
+ //if(!equivalence(ps, ps45)) {
+ // std::cout << "test 45 vs general resize up failed\n";
+ // return 1;
+ //}
+ ps.shrink(9);
+ ps45.resize(-9);
+ if(!equivalence(ps, ps45)) {
+ std::cout << "test 45 vs general resize down failed\n";
+ return 1;
+ }
+ pts.clear();
+ pts.push_back(point_data<int>(1, 1));
+ pts.push_back(point_data<int>(7, 1));
+ pts.push_back(point_data<int>(1, 7));
+ set_points(poly, pts.begin(), pts.end());
+ ps.insert(poly, true);
+ ps45.insert(poly, true);
+ ps.bloat(1);
+ ps45.resize(1);
+ rupolys.clear();
+ rupolys45.clear();
+ ps.get(rupolys);
+ ps45.get(rupolys45);
+ std::cout << rupolys[0] << std::endl;
+ std::cout << rupolys45[0] << std::endl;
+ pts.clear();
+ pts.push_back(point_data<int>(12, -1));
+ pts.push_back(point_data<int>(5, 6));
+ pts.push_back(point_data<int>(5, 2));
+ pts.push_back(point_data<int>(2, 2));
+ pts.push_back(point_data<int>(2, 5));
+ pts.push_back(point_data<int>(5, 2));
+ pts.push_back(point_data<int>(5, 6));
+ pts.push_back(point_data<int>(-1, 12));
+ pts.push_back(point_data<int>(-1, -1));
+ pts.push_back(point_data<int>(12, -1));
+ set_points(poly, pts.begin(), pts.end());
+ //waived
+ //if(!equivalence(ps, poly)) {
+ // std::cout << "test general resize up with holes failed\n";
+ // return 1;
+ //}
+ //waived
+ //if(!equivalence(ps, ps45)) {
+ // std::cout << "test 45 vs general resize up with holes failed\n";
+ // return 1;
+ //}
+ ps.shrink(1);
+ ps45.resize(-1);
+ if(!equivalence(ps, ps45)) {
+ std::cout << "test 45 vs general resize down with holes failed\n";
+ return 1;
+ }
+ ps.shrink(10);
+ ps45.resize(-10);
+ if(!equivalence(ps, ps45)) {
+ std::cout << "test 45 vs general resize down 2 with holes failed\n";
+ return 1;
+ }
+ }
+
+ {
+
+ Point pts[] = {construct<Point>(1565, 5735),
+ construct<Point>(915, 5735),
+ construct<Point>(915, 7085),
+ construct<Point>(1565, 7085) };
+ Polygon poly;
+ set_points(poly, pts, pts+4);
+ bool ret=gtl::contains(poly,gtl::construct<Point>(920, 7080));
+ if(!ret) {
+ std::cout << "contains failed!" << std::endl;
+ return 1;
+ }
+ polygon_data<int> poly_aa;
+ set_points(poly_aa, pts, pts+4);
+ ret=gtl::contains(poly,gtl::construct<Point>(920, 7080));
+ if(!ret) {
+ std::cout << "contains 90 failed!" << std::endl;
+ return 1;
+ }
+ polygon_with_holes_data<int> pwh;
+ polygon_90_with_holes_data<int> p90wh;
+ Point pts2[] = {construct<Point>(565, 15735),
+ construct<Point>(15, 15735),
+ construct<Point>(15, 17085),
+ construct<Point>(565, 17085) };
+ set_points(pwh, pts2, pts2+4);
+ set_points(p90wh, pts2, pts2+4);
+ pwh.set_holes(&poly_aa, (&poly_aa)+1);
+ p90wh.set_holes(&poly, (&poly)+1);
+ ret=gtl::contains(pwh,gtl::construct<Point>(920, 7080));
+ if(ret) {
+ std::cout << "contains wh failed!" << std::endl;
+ return 1;
+ }
+ ret=gtl::contains(p90wh,gtl::construct<Point>(920, 7080));
+ if(ret) {
+ std::cout << "contains 90wh failed!" << std::endl;
+ return 1;
+ }
+ std::reverse(pts, pts+4);
+ set_points(poly, pts, pts+4);
+ ret=gtl::contains(poly,gtl::construct<Point>(920, 7080));
+ if(!ret) {
+ std::cout << "reverse contains failed!" << std::endl;
+ return 1;
+ }
+ }
+ {
+// //MULTIPOLYGON
+// (
+// ((200 400,100 400,100 300,200 400)),
+// ((300 100,200 100,200 0,300 0,300 100)),
+// ((600 700,500 700,500 600,600 700)),
+// ((700 300,600 300,600 200,700 300)),
+// ((800 500,700 600,700 500,800 500)),
+// ((900 800,800 700,900 700,900 800)),
+// ((1000 200,900 100,1000 100,1000 200)),
+// ((1000 800,900 900,900 800,1000 800))),
+ int mp1 [7][2*4] = {
+ {200,400,100,400,100,300,200,400},
+ {600,700,500,700,500,600,600,700},
+ {700,300,600,300,600,200,700,300},
+ {800,500,700,600,700,500,800,500},
+ {900,800,800,700,900,700,900,800},
+ {1000,200,900,100,1000,100,1000,200},
+ {1000,800,900,900,900,800,1000,800}
+ };
+ int mp11 [2*5] = {300,100,200,100,200,0,300,0,300,100};
+ polygon_45_set_data<int> pset1;
+ polygon_45_set_data<int> pset2;
+ for(int i = 0; i < 7; ++i) {
+ addpoly(pset1, mp1[i], 4);
+ }
+ addpoly(pset1, mp11, 5);
+// //MULTIPOLYGON
+// (
+// ((200 800,100 800,100 700,200 700,200 800)),
+// ((400 200,300 100,400 100,400 200)),
+// ((400 800,300 700,400 700,400 800)),
+// ((700 100,600 0,700 0,700 100)),
+// ((700 200,600 200,600 100,700 200)),
+// ((900 200,800 200,800 0,900 0,900 200)),
+// ((1000 300,900 200,1000 200,1000 300)))
+ int mp2 [5][2*4] = {
+ {400,200,300,100,400,100,400,200},
+ {400,800,300,700,400,700,400,800},
+ {700,100,600,0,700,0,700,100},
+ {700,200,600,200,600,100,700,200},
+ {1000,300,900,200,1000,200,1000,300},
+ };
+ int mp21 [2*5] = {200,800,100,800,100,700,200,700,200,800};
+ int mp22 [2*5] = {900,200,800,200,800,0,900,0,900,200};
+ for(int i = 0; i < 5; ++i) {
+ addpoly(pset2, mp2[i], 4);
+ }
+ addpoly(pset2, mp21, 5);
+ addpoly(pset2, mp22, 5);
+ polygon_45_set_data<int> orr = pset1 + pset2;
+ polygon_45_set_data<int> inr = pset1 & pset2;
+ std::cout << area(orr)<<std::endl;;
+ std::cout << area(inr)<<std::endl;;
+ std::vector<polygon_45_with_holes_data<int> > polys;
+ assign(polys, orr);
+ std::cout << area(polys) << std::endl;
+ polygon_set_data<int> testbug;
+ testbug.insert(orr);
+ std::cout << area(testbug) << std::endl;
+ polygon_set_data<int> testbug2;
+ for(size_t i = 0; i < polys.size(); ++i) {
+ for(size_t j = 0; j < polys.size(); ++j) {
+ testbug2.clear();
+ testbug2.insert(polys[i]);
+ testbug2.insert(polys[j]);
+ std::cout << i << " " << j << std::endl;
+ std::cout << polys[i] << std::endl;
+ std::cout << polys[j] << std::endl;
+ if(area(testbug2) == 0.0) {
+ std::cout << area(testbug2) << std::endl;
+ std::cout << "Self touch 45 through general interface failed!\n";
+ return 1;
+ }
+ }
+ }
+ }
+
+ {
+ polygon_set_data<int> t_eq;
+ t_eq.insert(rectangle_data<int>(0, 0, 5, 10));
+ t_eq.insert(rectangle_data<int>(0, 5, 5, 10));
+ std::cout << t_eq <<std::endl;
+ polygon_set_data<int> t_eq2;
+ t_eq2 += rectangle_data<int>(0, 0, 5, 10);
+ std::cout << area(t_eq) <<std::endl;
+ std::cout << area(t_eq2) <<std::endl;
+ std::cout << t_eq <<std::endl;
+ std::cout << t_eq2 <<std::endl;
+ if(t_eq != t_eq2) {
+ std::cout << "equivalence failed" << std::endl;
+ return 1;
+ }
+ }
+
+ {
+ using namespace boost::polygon;
+ typedef point_data<int> Point;
+ typedef segment_data<int> Dls;
+ Point pt1(0, 0);
+ Point pt2(10, 10);
+ Point pt3(20, 20);
+ Point pt4(20, 0);
+ Dls dls1(pt1, pt2);
+ Dls dls2(pt1, pt3);
+ Dls dls3(pt1, pt4);
+ Dls dls4(pt2, pt1);
+ typedef std::vector<segment_data<int> > Dlss;
+ Dlss dlss, result;
+ dlss.push_back(dls1);
+ dlss.push_back(dls2);
+ dlss.push_back(dls3);
+ dlss.push_back(dls4);
+ rectangle_data<int> rect;
+ envelope_segments(rect, dlss.begin(), dlss.end());
+ assert_s(area(rect) == 400.0, "envelope");
+ intersect_segments(result, dlss.begin(), dlss.end());
+ dlss.swap(result);
+ for (Dlss::iterator itr = dlss.begin(); itr != dlss.end(); ++itr) {
+ std::cout << *itr << std::endl;
+ }
+ assert_s(dlss.size() == 5, "intersection");
+ Dls dls5(Point(0,5), Point(5,0));
+ dlss.push_back(dls5);
+ std::cout << std::endl;
+ result.clear();
+ intersect_segments(result, dlss.begin(), dlss.end());
+ dlss.swap(result);
+ for (Dlss::iterator itr = dlss.begin(); itr != dlss.end(); ++itr) {
+ std::cout << *itr << std::endl;
+ }
+ assert_s(dlss.size() == 11, "intersection2");
+ }
+
+ {
+ using namespace boost::polygon;
+ std::vector<std::pair<std::size_t, segment_data<int> > > segs;
+ segment_data<int> sarray[2];
+ sarray[0] = segment_data<int>(point_data<int>(0,0), point_data<int>(10,10));
+ sarray[1] = segment_data<int>(point_data<int>(10,0), point_data<int>(0,10));
+ intersect_segments(segs, sarray, sarray+2);
+ std::cout << segs.size() << std::endl;
+ assert_s(segs.size() == 4, "intersection3");
+ }
+
+
+ /*New polygon_formation tests*/
+ if(test_new_polygon_formation(0,NULL)){
+ std::cerr << "[test_new_polygon_formation] failed" << std::endl;
+ return 1;
+ }
+
+ if(test_new_polygon_formation_marginal_threshold(0,NULL)){
+ std::cerr << "[test_new_polygon_formation_marginal_threshold] failed"
+ << std::endl;
+ return 1;
+ }
+
+ std::cout << "ALL TESTS COMPLETE\n";
+ return 0;
+}
diff --git a/src/boost/libs/polygon/test/polygon_90_data_test.cpp b/src/boost/libs/polygon/test/polygon_90_data_test.cpp
new file mode 100644
index 000000000..2b61d41e7
--- /dev/null
+++ b/src/boost/libs/polygon/test/polygon_90_data_test.cpp
@@ -0,0 +1,52 @@
+// Boost.Polygon library polygon_90_data_test.cpp file
+
+// Copyright Andrii Sydorchuk 2015.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/polygon.hpp>
+#include <iostream>
+#include <vector>
+
+using namespace boost::polygon;
+
+void polygon_90_data_test()
+{
+ typedef polygon_90_data<int> polygon_type;
+ typedef polygon_traits_90<polygon_type>::point_type point_type;
+ typedef polygon_type::iterator_type iterator_type;
+
+ std::vector<point_type> data;
+ data.push_back(point_type(0, 0)); // 1
+ data.push_back(point_type(10, 0)); // 2
+ data.push_back(point_type(10, 10)); // 3
+ data.push_back(point_type(0, 10)); // 4
+
+ polygon_type polygon;
+ polygon.set(data.begin(), data.end());
+
+ std::cout << "Interesting: " << std::endl;
+ for (polygon_type::compact_iterator_type it = polygon.begin_compact(); it != polygon.end_compact(); ++it) {
+ std::cout << *it << " ";
+ }
+ std::cout << std::endl;
+
+ iterator_type it = polygon.begin();
+ for (int i = 0; i < 2; i++) {
+ it++;
+ }
+
+ iterator_type it_3rd = it;
+ it++;
+ BOOST_TEST(it != it_3rd);
+}
+
+int main()
+{
+ polygon_90_data_test();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/polygon_interval_test.cpp b/src/boost/libs/polygon/test/polygon_interval_test.cpp
new file mode 100644
index 000000000..070d34f76
--- /dev/null
+++ b/src/boost/libs/polygon/test/polygon_interval_test.cpp
@@ -0,0 +1,271 @@
+// Boost.Polygon library polygon_interval_test.cpp file
+
+// Copyright Andrii Sydorchuk 2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/interval_concept.hpp>
+#include <boost/polygon/interval_data.hpp>
+#include <boost/polygon/interval_traits.hpp>
+
+using namespace boost::polygon;
+
+void interval_data_test()
+{
+ typedef interval_data<int> interval_type;
+ interval_type interval1(1, 2);
+ interval_type interval2;
+ interval2 = interval1;
+
+ BOOST_TEST_EQ(interval1.low(), 1);
+ BOOST_TEST_EQ(interval1.high(), 2);
+ BOOST_TEST_EQ(interval1.get(LOW), 1);
+ BOOST_TEST_EQ(interval1.get(HIGH), 2);
+ BOOST_TEST(interval1 == interval2);
+ BOOST_TEST(!(interval1 != interval2));
+ BOOST_TEST(!(interval1 < interval2));
+ BOOST_TEST(!(interval1 > interval2));
+ BOOST_TEST(interval1 <= interval2);
+ BOOST_TEST(interval1 >= interval2);
+
+ interval1.low(2);
+ interval1.high(1);
+ BOOST_TEST_EQ(interval1.low(), 2);
+ BOOST_TEST_EQ(interval1.high(), 1);
+ BOOST_TEST(!(interval1 == interval2));
+ BOOST_TEST(interval1 != interval2);
+
+ interval2.set(LOW, 2);
+ interval2.set(HIGH, 1);
+ BOOST_TEST(interval1 == interval2);
+}
+
+void interval_traits_test()
+{
+ typedef interval_data<int> interval_type;
+
+ interval_type interval = interval_mutable_traits<interval_type>::construct(1, 2);
+ BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, LOW), 1);
+ BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, HIGH), 2);
+
+ interval_mutable_traits<interval_type>::set(interval, LOW, 3);
+ interval_mutable_traits<interval_type>::set(interval, HIGH, 4);
+ BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, LOW), 3);
+ BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, HIGH), 4);
+}
+
+template <typename T>
+struct Interval {
+ T left;
+ T right;
+};
+
+namespace boost {
+namespace polygon {
+ template <typename T>
+ struct geometry_concept< Interval<T> > {
+ typedef interval_concept type;
+ };
+
+ template <typename T>
+ struct interval_traits< Interval<T> > {
+ typedef T coordinate_type;
+
+ static coordinate_type get(const Interval<T>& interval, direction_1d dir) {
+ return (dir == LOW) ? interval.left : interval.right;
+ }
+ };
+
+ template <typename T>
+ struct interval_mutable_traits< Interval<T> > {
+ typedef T coordinate_type;
+
+ static void set(Interval<T>& interval, direction_1d dir, T value) {
+ (dir == LOW) ? interval.left = value : interval.right = value;
+ }
+
+ static Interval<T> construct(coordinate_type left, coordinate_type right) {
+ Interval<T> interval;
+ interval.left = left;
+ interval.right = right;
+ return interval;
+ }
+ };
+} // polygon
+} // boost
+
+void interval_concept_test1()
+{
+ typedef Interval<int> interval_type;
+
+ interval_type interval1 = construct<interval_type>(2, 1);
+ BOOST_TEST_EQ(interval1.left, 1);
+ BOOST_TEST_EQ(interval1.right, 2);
+
+ set(interval1, LOW, 3);
+ set(interval1, HIGH, 4);
+ BOOST_TEST_EQ(get(interval1, LOW), 3);
+ BOOST_TEST_EQ(get(interval1, HIGH), 4);
+
+ interval_type interval2 = copy_construct<interval_type>(interval1);
+ BOOST_TEST(equivalence(interval1, interval2));
+
+ low(interval2, 1);
+ high(interval2, 2);
+ BOOST_TEST_EQ(low(interval2), 1);
+ BOOST_TEST_EQ(high(interval2), 2);
+
+ assign(interval1, interval2);
+ BOOST_TEST(equivalence(interval1, interval2));
+}
+
+void interval_concept_test2()
+{
+ typedef Interval<int> interval_type;
+
+ interval_type interval1 = construct<interval_type>(1, 3);
+ BOOST_TEST_EQ(center(interval1), 2);
+ BOOST_TEST_EQ(delta(interval1), 2);
+
+ flip(interval1, -1);
+ BOOST_TEST_EQ(low(interval1), -5);
+ BOOST_TEST_EQ(high(interval1), -3);
+
+ scale_up(interval1, 2);
+ BOOST_TEST_EQ(low(interval1), -10);
+ BOOST_TEST_EQ(high(interval1), -6);
+
+ scale_down(interval1, 2);
+ BOOST_TEST_EQ(low(interval1), -5);
+ BOOST_TEST_EQ(high(interval1), -3);
+
+ move(interval1, 5);
+ BOOST_TEST_EQ(low(interval1), 0);
+ BOOST_TEST_EQ(high(interval1), 2);
+
+ convolve(interval1, 1);
+ BOOST_TEST_EQ(low(interval1), 1);
+ BOOST_TEST_EQ(high(interval1), 3);
+
+ deconvolve(interval1, 2);
+ BOOST_TEST_EQ(low(interval1), -1);
+ BOOST_TEST_EQ(high(interval1), 1);
+
+ interval_type interval2 = construct<interval_type>(-1, 2);
+ convolve(interval1, interval2);
+ BOOST_TEST_EQ(low(interval1), -2);
+ BOOST_TEST_EQ(high(interval1), 3);
+
+ deconvolve(interval1, interval2);
+ BOOST_TEST_EQ(low(interval1), -1);
+ BOOST_TEST_EQ(high(interval1), 1);
+
+ reflected_convolve(interval1, interval2);
+ BOOST_TEST_EQ(low(interval1), -3);
+ BOOST_TEST_EQ(high(interval1), 2);
+
+ reflected_deconvolve(interval1, interval2);
+ BOOST_TEST_EQ(low(interval1), -1);
+ BOOST_TEST_EQ(high(interval1), 1);
+}
+
+void interval_concept_test3()
+{
+ typedef Interval<int> interval_type;
+
+ interval_type interval1 = construct<interval_type>(1, 3);
+ BOOST_TEST_EQ(euclidean_distance(interval1, -2), 3);
+ BOOST_TEST_EQ(euclidean_distance(interval1, 2), 0);
+ BOOST_TEST_EQ(euclidean_distance(interval1, 4), 1);
+
+ interval_type interval2 = construct<interval_type>(-1, 0);
+ BOOST_TEST_EQ(euclidean_distance(interval1, interval2), 1);
+ BOOST_TEST(!intersects(interval1, interval2));
+ BOOST_TEST(!boundaries_intersect(interval1, interval2));
+ BOOST_TEST(!intersect(interval2, interval1));
+ BOOST_TEST_EQ(low(interval2), -1);
+ BOOST_TEST_EQ(high(interval2), 0);
+
+ interval_type interval3 = construct<interval_type>(-1, 6);
+ BOOST_TEST_EQ(euclidean_distance(interval1, interval3), 0);
+ BOOST_TEST(intersects(interval1, interval3));
+ BOOST_TEST(!boundaries_intersect(interval1, interval3));
+ BOOST_TEST(intersect(interval3, interval1));
+ BOOST_TEST_EQ(low(interval3), 1);
+ BOOST_TEST_EQ(high(interval3), 3);
+
+ interval_type interval4 = construct<interval_type>(5, 6);
+ BOOST_TEST_EQ(euclidean_distance(interval1, interval4), 2);
+ BOOST_TEST(!intersects(interval1, interval4));
+ BOOST_TEST(!boundaries_intersect(interval1, interval4));
+ BOOST_TEST(!intersect(interval4, interval1));
+ BOOST_TEST_EQ(low(interval4), 5);
+ BOOST_TEST_EQ(high(interval4), 6);
+
+ interval_type interval5 = construct<interval_type>(3, 5);
+ BOOST_TEST_EQ(euclidean_distance(interval1, interval5), 0);
+ BOOST_TEST(!intersects(interval1, interval5, false));
+ BOOST_TEST(boundaries_intersect(interval1, interval5));
+ BOOST_TEST(intersect(interval5, interval1));
+ BOOST_TEST_EQ(low(interval5), 3);
+ BOOST_TEST_EQ(high(interval5), 3);
+}
+
+void interval_concept_test4()
+{
+ typedef Interval<int> interval_type;
+
+ interval_type interval1 = construct<interval_type>(1, 3);
+ interval_type interval2 = construct<interval_type>(3, 5);
+ BOOST_TEST(!abuts(interval1, interval2, LOW));
+ BOOST_TEST(abuts(interval1, interval2, HIGH));
+ BOOST_TEST(abuts(interval1, interval2));
+
+ bloat(interval1, 1);
+ BOOST_TEST_EQ(low(interval1), 0);
+ BOOST_TEST_EQ(high(interval1), 4);
+ BOOST_TEST(!abuts(interval1, interval2));
+
+ bloat(interval1, LOW, 1);
+ BOOST_TEST_EQ(low(interval1), -1);
+ BOOST_TEST_EQ(high(interval1), 4);
+
+ shrink(interval1, LOW, 1);
+ BOOST_TEST_EQ(low(interval1), 0);
+ BOOST_TEST_EQ(high(interval1), 4);
+
+ shrink(interval1, 1);
+ BOOST_TEST_EQ(low(interval1), 1);
+ BOOST_TEST_EQ(high(interval1), 3);
+
+ BOOST_TEST(encompass(interval1, 4));
+ BOOST_TEST_EQ(low(interval1), 1);
+ BOOST_TEST_EQ(high(interval1), 4);
+
+ BOOST_TEST(encompass(interval1, interval2));
+ BOOST_TEST_EQ(low(interval1), 1);
+ BOOST_TEST_EQ(high(interval1), 5);
+
+ interval1 = get_half(interval1, LOW);
+ BOOST_TEST_EQ(low(interval1), 1);
+ BOOST_TEST_EQ(high(interval1), 3);
+
+ BOOST_TEST(join_with(interval1, interval2));
+ BOOST_TEST_EQ(low(interval1), 1);
+ BOOST_TEST_EQ(high(interval1), 5);
+}
+
+int main()
+{
+ interval_data_test();
+ interval_traits_test();
+ interval_concept_test1();
+ interval_concept_test2();
+ interval_concept_test3();
+ interval_concept_test4();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/polygon_point_test.cpp b/src/boost/libs/polygon/test/polygon_point_test.cpp
new file mode 100644
index 000000000..ce57f5b11
--- /dev/null
+++ b/src/boost/libs/polygon/test/polygon_point_test.cpp
@@ -0,0 +1,205 @@
+// Boost.Polygon library polygon_point_test.cpp file
+
+// Copyright Andrii Sydorchuk 2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/point_concept.hpp>
+#include <boost/polygon/point_data.hpp>
+#include <boost/polygon/point_traits.hpp>
+
+using namespace boost::polygon;
+
+void point_data_test()
+{
+ typedef point_data<int> point_type;
+
+ point_type point1(1, 2);
+ point_type point2;
+ point2 = point1;
+ BOOST_TEST_EQ(point1.x(), 1);
+ BOOST_TEST_EQ(point1.y(), 2);
+ BOOST_TEST_EQ(point2.x(), 1);
+ BOOST_TEST_EQ(point2.y(), 2);
+ BOOST_TEST(point1 == point2);
+ BOOST_TEST(!(point1 != point2));
+ BOOST_TEST(!(point1 < point2));
+ BOOST_TEST(!(point1 > point2));
+ BOOST_TEST(point1 <= point2);
+ BOOST_TEST(point1 >= point2);
+
+ point2.x(2);
+ point2.y(1);
+ BOOST_TEST_EQ(point2.x(), 2);
+ BOOST_TEST_EQ(point2.y(), 1);
+ BOOST_TEST(!(point1 == point2));
+ BOOST_TEST(point1 != point2);
+ BOOST_TEST(point1 < point2);
+ BOOST_TEST(!(point1 > point2));
+ BOOST_TEST(point1 <= point2);
+ BOOST_TEST(!(point1 >= point2));
+
+ point2.set(HORIZONTAL, 1);
+ point2.set(VERTICAL, 2);
+ BOOST_TEST(point1 == point2);
+}
+
+void point_traits_test()
+{
+ typedef point_data<int> point_type;
+
+ point_type point = point_mutable_traits<point_type>::construct(1, 2);
+ BOOST_TEST_EQ(point_traits<point_type>::get(point, HORIZONTAL), 1);
+ BOOST_TEST_EQ(point_traits<point_type>::get(point, VERTICAL), 2);
+
+ point_mutable_traits<point_type>::set(point, HORIZONTAL, 3);
+ point_mutable_traits<point_type>::set(point, VERTICAL, 4);
+ BOOST_TEST_EQ(point_traits<point_type>::get(point, HORIZONTAL), 3);
+ BOOST_TEST_EQ(point_traits<point_type>::get(point, VERTICAL), 4);
+}
+
+template <typename T>
+struct Point {
+ T x;
+ T y;
+};
+
+namespace boost {
+namespace polygon {
+ template <typename T>
+ struct geometry_concept< Point<T> > {
+ typedef point_concept type;
+ };
+
+ template <typename T>
+ struct point_traits< Point<T> > {
+ typedef T coordinate_type;
+
+ static coordinate_type get(const Point<T>& point, orientation_2d orient) {
+ return (orient == HORIZONTAL) ? point.x : point.y;
+ }
+ };
+
+ template <typename T>
+ struct point_mutable_traits< Point<T> > {
+ typedef T coordinate_type;
+
+ static void set(Point<T>& point, orientation_2d orient, T value) {
+ (orient == HORIZONTAL) ? point.x = value : point.y = value;
+ }
+
+ static Point<T> construct(coordinate_type x, coordinate_type y) {
+ Point<T> point;
+ point.x = x;
+ point.y = y;
+ return point;
+ }
+ };
+} // polygon
+} // boost
+
+void point_concept_test1()
+{
+ typedef Point<int> point_type;
+
+ point_type point1 = construct<point_type>(1, 2);
+ BOOST_TEST_EQ(point1.x, 1);
+ BOOST_TEST_EQ(point1.y, 2);
+
+ set(point1, HORIZONTAL, 3);
+ set(point1, VERTICAL, 4);
+ BOOST_TEST_EQ(get(point1, HORIZONTAL), 3);
+ BOOST_TEST_EQ(get(point1, VERTICAL), 4);
+
+ point_type point2;
+ assign(point2, point1);
+ BOOST_TEST(equivalence(point1, point2));
+
+ x(point2, 1);
+ y(point2, 2);
+ BOOST_TEST_EQ(x(point2), 1);
+ BOOST_TEST_EQ(y(point2), 2);
+}
+
+void point_concept_test2()
+{
+ typedef Point<int> point_type;
+
+ point_type point1 = construct<point_type>(1, 2);
+ point_type point2 = construct<point_type>(5, 5);
+ BOOST_TEST_EQ(euclidean_distance(point1, point2, HORIZONTAL), 4);
+ BOOST_TEST_EQ(euclidean_distance(point1, point2, VERTICAL), 3);
+ BOOST_TEST_EQ(manhattan_distance(point1, point2), 7);
+ BOOST_TEST_EQ(euclidean_distance(point1, point2), 5.0);
+}
+
+void point_concept_test3()
+{
+ typedef Point<int> point_type;
+
+ point_type point = construct<point_type>(1, 2);
+ point_type shift = construct<point_type>(4, 3);
+ convolve(point, shift);
+ BOOST_TEST_EQ(x(point), 5);
+ BOOST_TEST_EQ(y(point), 5);
+
+ deconvolve(point, shift);
+ BOOST_TEST_EQ(x(point), 1);
+ BOOST_TEST_EQ(y(point), 2);
+
+ scale_up(point, 5);
+ BOOST_TEST_EQ(x(point), 5);
+ BOOST_TEST_EQ(y(point), 10);
+
+ scale_down(point, 5);
+ BOOST_TEST_EQ(x(point), 1);
+ BOOST_TEST_EQ(y(point), 2);
+
+ move(point, HORIZONTAL, 2);
+ move(point, VERTICAL, 3);
+ BOOST_TEST_EQ(x(point), 3);
+ BOOST_TEST_EQ(y(point), 5);
+}
+
+template<typename T>
+struct Transformer {
+ void scale(T& x, T& y) const {
+ x *= 2;
+ y *= 2;
+ }
+
+ void transform(T& x, T& y) const {
+ T tmp = x;
+ x = y;
+ y = tmp;
+ }
+};
+
+void point_concept_test4()
+{
+ typedef Point<int> point_type;
+
+ point_type point = construct<point_type>(1, 2);
+ scale(point, Transformer<int>());
+ BOOST_TEST_EQ(x(point), 2);
+ BOOST_TEST_EQ(y(point), 4);
+
+ transform(point, Transformer<int>());
+ BOOST_TEST_EQ(x(point), 4);
+ BOOST_TEST_EQ(y(point), 2);
+}
+
+int main()
+{
+ point_data_test();
+ point_traits_test();
+ point_concept_test1();
+ point_concept_test2();
+ point_concept_test3();
+ point_concept_test4();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/polygon_rectangle_formation_test.cpp b/src/boost/libs/polygon/test/polygon_rectangle_formation_test.cpp
new file mode 100644
index 000000000..82640640b
--- /dev/null
+++ b/src/boost/libs/polygon/test/polygon_rectangle_formation_test.cpp
@@ -0,0 +1,44 @@
+// Boost.Polygon library polygon_rectangle_formation_test.cpp file
+
+// Copyright Andrii Sydorchuk 2015.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/polygon.hpp>
+
+using namespace boost::polygon;
+
+void rectangle_formation_test1()
+{
+ typedef polygon_90_with_holes_data<int> polygon_type;
+ typedef polygon_traits<polygon_type>::point_type point_type;
+
+ polygon_type poly;
+ point_type points[] = {
+ boost::polygon::construct<point_type>(0, 0),
+ boost::polygon::construct<point_type>(0, 10),
+ boost::polygon::construct<point_type>(10, 10),
+ boost::polygon::construct<point_type>(10, 0),
+ };
+ boost::polygon::set_points(poly, points, points + 4);
+
+ std::vector< rectangle_data<int> > rects;
+ boost::polygon::get_rectangles(rects, poly);
+
+ BOOST_TEST_EQ(1, rects.size());
+ const rectangle_data<int>& rect = rects[0];
+ BOOST_TEST_EQ(0, rect.get(WEST));
+ BOOST_TEST_EQ(10, rect.get(EAST));
+ BOOST_TEST_EQ(10, rect.get(NORTH));
+ BOOST_TEST_EQ(0, rect.get(SOUTH));
+}
+
+int main()
+{
+ rectangle_formation_test1();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/polygon_rectangle_test.cpp b/src/boost/libs/polygon/test/polygon_rectangle_test.cpp
new file mode 100644
index 000000000..66a586df0
--- /dev/null
+++ b/src/boost/libs/polygon/test/polygon_rectangle_test.cpp
@@ -0,0 +1,45 @@
+// Boost.Polygon library polygon_rectangle_test.cpp file
+
+// Copyright Andrii Sydorchuk 2014.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/rectangle_concept.hpp>
+#include <boost/polygon/rectangle_data.hpp>
+#include <boost/polygon/rectangle_traits.hpp>
+
+using namespace boost::polygon;
+
+template <typename interval_type>
+void CHECK_INTERVAL_EQUAL(const interval_type& i1, const interval_type& i2) {
+ BOOST_TEST_EQ(get(i1, LOW), get(i2, LOW));
+ BOOST_TEST_EQ(get(i1, HIGH), get(i2, HIGH));
+}
+
+template <typename rectangle_type>
+void CHECK_RECT_EQUAL(const rectangle_type& r1, const rectangle_type& r2) {
+ CHECK_INTERVAL_EQUAL(horizontal(r1), horizontal(r2));
+ CHECK_INTERVAL_EQUAL(vertical(r1), vertical(r2));
+}
+
+void rectangle_concept_test1()
+{
+ typedef rectangle_data<int> rectangle_type;
+
+ rectangle_type rectangle1 = construct<rectangle_type>(-1, -1, 1, 1);
+ scale_up(rectangle1, 2);
+ CHECK_RECT_EQUAL(construct<rectangle_type>(-2, -2, 2, 2), rectangle1);
+
+ scale_down(rectangle1, 2);
+ CHECK_RECT_EQUAL(construct<rectangle_type>(-1, -1, 1, 1), rectangle1);
+}
+
+int main()
+{
+ rectangle_concept_test1();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/polygon_segment_test.cpp b/src/boost/libs/polygon/test/polygon_segment_test.cpp
new file mode 100644
index 000000000..a9042f5e8
--- /dev/null
+++ b/src/boost/libs/polygon/test/polygon_segment_test.cpp
@@ -0,0 +1,485 @@
+// Boost.Polygon library polygon_segment_test.cpp file
+
+// Copyright Andrii Sydorchuk 2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/segment_concept.hpp>
+#include <boost/polygon/segment_data.hpp>
+#include <boost/polygon/segment_traits.hpp>
+
+using namespace boost::polygon;
+
+void segment_data_test()
+{
+ typedef point_data<int> point_type;
+ typedef segment_data<int> segment_type;
+ point_type point1(1, 2);
+ point_type point2(3, 4);
+ segment_type segment1(point1, point2);
+ segment_type segment2;
+ segment2 = segment1;
+
+ BOOST_TEST(segment1.low() == point1);
+ BOOST_TEST(segment1.high() == point2);
+ BOOST_TEST(segment1.get(LOW) == point1);
+ BOOST_TEST(segment1.get(HIGH) == point2);
+ BOOST_TEST(segment1 == segment2);
+ BOOST_TEST(!(segment1 != segment2));
+ BOOST_TEST(!(segment1 < segment2));
+ BOOST_TEST(!(segment1 > segment1));
+ BOOST_TEST(segment1 <= segment2);
+ BOOST_TEST(segment1 >= segment2);
+
+ segment1.low(point2);
+ segment1.high(point1);
+ BOOST_TEST(segment1.low() == point2);
+ BOOST_TEST(segment1.high() == point1);
+ BOOST_TEST(!(segment1 == segment2));
+ BOOST_TEST(segment1 != segment2);
+
+ segment2.set(LOW, point2);
+ segment2.set(HIGH, point1);
+ BOOST_TEST(segment1 == segment2);
+}
+
+void segment_traits_test()
+{
+ typedef point_data<int> point_type;
+ typedef segment_data<int> segment_type;
+
+ point_type point1(1, 2);
+ point_type point2(3, 4);
+ segment_type segment =
+ segment_mutable_traits<segment_type>::construct(point1, point2);
+
+ BOOST_TEST(segment_traits<segment_type>::get(segment, LOW) == point1);
+ BOOST_TEST(segment_traits<segment_type>::get(segment, HIGH) == point2);
+
+ segment_mutable_traits<segment_type>::set(segment, LOW, point2);
+ segment_mutable_traits<segment_type>::set(segment, HIGH, point1);
+ BOOST_TEST(segment_traits<segment_type>::get(segment, LOW) == point2);
+ BOOST_TEST(segment_traits<segment_type>::get(segment, HIGH) == point1);
+}
+
+template <typename T>
+struct Segment {
+ typedef T coordinate_type;
+ typedef point_data<int> point_type;
+ point_type p0;
+ point_type p1;
+};
+
+namespace boost {
+namespace polygon {
+ template <typename T>
+ struct geometry_concept< Segment<T> > {
+ typedef segment_concept type;
+ };
+
+ template <typename T>
+ struct segment_traits< Segment<T> > {
+ typedef T coordinate_type;
+ typedef point_data<int> point_type;
+
+ static point_type get(const Segment<T>& segment, direction_1d dir) {
+ return dir.to_int() ? segment.p1 : segment.p0;
+ }
+ };
+
+ template <typename T>
+ struct segment_mutable_traits< Segment<T> > {
+ typedef T coordinate_type;
+ typedef point_data<int> point_type;
+
+ static void set(
+ Segment<T>& segment, direction_1d dir, const point_type& point) {
+ dir.to_int() ? segment.p1 = point : segment.p0 = point;;
+ }
+
+ static Segment<T> construct(
+ const point_type& point1, const point_type& point2) {
+ Segment<T> segment;
+ segment.p0 = point1;
+ segment.p1 = point2;
+ return segment;
+ }
+ };
+}
+}
+
+void segment_concept_test1()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ point_type point1(1, 2);
+ point_type point2(3, 4);
+ point_type point3(2, 3);
+ segment_type segment1 = construct<segment_type>(point1, point2);
+ BOOST_TEST(segment1.p0 == point1);
+ BOOST_TEST(segment1.p1 == point2);
+ BOOST_TEST(get(segment1, LOW) == point1);
+ BOOST_TEST(low(segment1) == point1);
+ BOOST_TEST(get(segment1, HIGH) == point2);
+ BOOST_TEST(high(segment1) == point2);
+ BOOST_TEST(center(segment1) == point3);
+
+ set(segment1, LOW, point2);
+ set(segment1, HIGH, point1);
+ BOOST_TEST(segment1.p0 == point2);
+ BOOST_TEST(segment1.p1 == point1);
+ BOOST_TEST(get(segment1, LOW) == point2);
+ BOOST_TEST(get(segment1, HIGH) == point1);
+ low(segment1, point1);
+ high(segment1, point2);
+ BOOST_TEST(segment1.p0 == point1);
+ BOOST_TEST(segment1.p1 == point2);
+
+ segment_data<int> segment2 = copy_construct< segment_data<int> >(segment1);
+ BOOST_TEST(segment1.p0 == segment2.low());
+ BOOST_TEST(segment1.p1 == segment2.high());
+ BOOST_TEST(equivalence(segment1, segment2));
+
+ segment_data<int> segment3 = construct< segment_data<int> >(point2, point1);
+ assign(segment1, segment3);
+ BOOST_TEST(segment1.p0 == point2);
+ BOOST_TEST(segment1.p1 == point1);
+ BOOST_TEST(!equivalence(segment1, segment2));
+}
+
+void segment_concept_test2()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ point_type point1(1, 2);
+ point_type point2(2, 4);
+ point_type point3(0, 0);
+ point_type point4(5, 10);
+ point_type point5(1, 3);
+ point_type point6(2, 3);
+ point_type point7(100, 201);
+ point_type point8(100, 200);
+ point_type point9(100, 199);
+ segment_type segment1 = construct<segment_type>(point1, point2);
+ segment_type segment2 = construct<segment_type>(point2, point1);
+ segment_type segment3 = construct<segment_type>(point1, point5);
+
+ BOOST_TEST(orientation(segment1, point1) == 0);
+ BOOST_TEST(orientation(segment1, point2) == 0);
+ BOOST_TEST(orientation(segment1, point3) == 0);
+ BOOST_TEST(orientation(segment1, point4) == 0);
+ BOOST_TEST(orientation(segment1, point5) == 1);
+ BOOST_TEST(orientation(segment2, point5) == -1);
+ BOOST_TEST(orientation(segment1, point6) == -1);
+ BOOST_TEST(orientation(segment2, point6) == 1);
+ BOOST_TEST(orientation(segment1, point7) == 1);
+ BOOST_TEST(orientation(segment2, point7) == -1);
+ BOOST_TEST(orientation(segment1, point8) == 0);
+ BOOST_TEST(orientation(segment1, point9) == -1);
+ BOOST_TEST(orientation(segment2, point9) == 1);
+ BOOST_TEST(orientation(segment3, point6) == -1);
+ BOOST_TEST(orientation(segment3, point3) == 1);
+}
+
+void segment_concept_test3()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ segment_type segment1 = construct<segment_type>(
+ point_type(0, 0), point_type(1, 2));
+ segment_type segment2 = construct<segment_type>(
+ point_type(0, 0), point_type(2, 4));
+ segment_type segment3 = construct<segment_type>(
+ point_type(0, 0), point_type(2, 3));
+ segment_type segment4 = construct<segment_type>(
+ point_type(0, 0), point_type(2, 5));
+ segment_type segment5 = construct<segment_type>(
+ point_type(0, 2), point_type(2, 0));
+
+ BOOST_TEST(orientation(segment1, segment2) == 0);
+ BOOST_TEST(orientation(segment1, segment3) == -1);
+ BOOST_TEST(orientation(segment3, segment1) == 1);
+ BOOST_TEST(orientation(segment1, segment4) == 1);
+ BOOST_TEST(orientation(segment4, segment1) == -1);
+ BOOST_TEST(orientation(segment1, segment5) == -1);
+ BOOST_TEST(orientation(segment5, segment1) == 1);
+}
+
+void segment_concept_test4()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ point_type point1(1, 2);
+ point_type point2(3, 6);
+ point_type point3(2, 4);
+ point_type point4(4, 8);
+ point_type point5(0, 0);
+ segment_type segment = construct<segment_type>(point1, point2);
+
+ BOOST_TEST(contains(segment, point1, true));
+ BOOST_TEST(contains(segment, point2, true));
+ BOOST_TEST(!contains(segment, point1, false));
+ BOOST_TEST(!contains(segment, point2, false));
+ BOOST_TEST(contains(segment, point3, false));
+ BOOST_TEST(!contains(segment, point4, true));
+ BOOST_TEST(!contains(segment, point5, true));
+}
+
+void segment_concept_test5()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ point_type point1(0, 0);
+ point_type point2(10, 0);
+ point_type point3(5, 0);
+ point_type point4(-1, 0);
+ point_type point5(11, 0);
+ segment_type segment = construct<segment_type>(point1, point2);
+
+ BOOST_TEST(contains(segment, point1, true));
+ BOOST_TEST(contains(segment, point2, true));
+ BOOST_TEST(!contains(segment, point1, false));
+ BOOST_TEST(!contains(segment, point2, false));
+ BOOST_TEST(contains(segment, point3, false));
+ BOOST_TEST(!contains(segment, point4, true));
+ BOOST_TEST(!contains(segment, point5, true));
+}
+
+void segment_concept_test6()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ point_type point1(0, 0);
+ point_type point2(1, 2);
+ point_type point3(2, 4);
+ point_type point4(3, 6);
+ point_type point5(4, 8);
+ point_type point6(5, 10);
+ segment_type segment1 = construct<segment_type>(point2, point5);
+ segment_type segment2 = construct<segment_type>(point3, point4);
+ segment_type segment3 = construct<segment_type>(point1, point3);
+ segment_type segment4 = construct<segment_type>(point4, point6);
+
+ BOOST_TEST(contains(segment1, segment2, false));
+ BOOST_TEST(!contains(segment2, segment1, true));
+ BOOST_TEST(!contains(segment1, segment3, true));
+ BOOST_TEST(!contains(segment1, segment4, true));
+ BOOST_TEST(contains(segment1, segment1, true));
+ BOOST_TEST(!contains(segment1, segment1, false));
+}
+
+template<typename T>
+struct Transformer {
+ void scale(T& x, T& y) const {
+ x *= 2;
+ y *= 2;
+ }
+
+ void transform(T& x, T& y) const {
+ T tmp = x;
+ x = y;
+ y = tmp;
+ }
+};
+
+void segment_concept_test7()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ point_type point1(1, 2);
+ point_type point2(4, 6);
+ segment_type segment1 = construct<segment_type>(point1, point2);
+
+ scale_up(segment1, 3);
+ BOOST_TEST(low(segment1) == point_type(3, 6));
+ BOOST_TEST(high(segment1) == point_type(12, 18));
+
+ scale_down(segment1, 3);
+ BOOST_TEST(low(segment1) == point1);
+ BOOST_TEST(high(segment1) == point2);
+ BOOST_TEST(length(segment1) == 5);
+
+ move(segment1, HORIZONTAL, 1);
+ move(segment1, VERTICAL, 2);
+ BOOST_TEST(low(segment1) == point_type(2, 4));
+ BOOST_TEST(high(segment1) == point_type(5, 8));
+ BOOST_TEST(length(segment1) == 5);
+
+ convolve(segment1, point_type(1, 2));
+ BOOST_TEST(low(segment1) == point_type(3, 6));
+ BOOST_TEST(high(segment1) == point_type(6, 10));
+
+ deconvolve(segment1, point_type(2, 4));
+ BOOST_TEST(low(segment1) == point1);
+ BOOST_TEST(high(segment1) == point2);
+
+ scale(segment1, Transformer<int>());
+ BOOST_TEST(low(segment1) == point_type(2, 4));
+ BOOST_TEST(high(segment1) == point_type(8, 12));
+ transform(segment1, Transformer<int>());
+ BOOST_TEST(low(segment1) == point_type(4, 2));
+ BOOST_TEST(high(segment1) == point_type(12, 8));
+}
+
+void segment_concept_test8()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ segment_type segment1 = construct<segment_type>(
+ point_type(0, 0), point_type(1, 2));
+ segment_type segment2 = construct<segment_type>(
+ point_type(1, 2), point_type(2, 4));
+ segment_type segment3 = construct<segment_type>(
+ point_type(2, 4), point_type(0, 4));
+ segment_type segment4 = construct<segment_type>(
+ point_type(0, 4), point_type(0, 0));
+
+ BOOST_TEST(abuts(segment1, segment2, HIGH));
+ BOOST_TEST(abuts(segment2, segment3, HIGH));
+ BOOST_TEST(abuts(segment3, segment4, HIGH));
+ BOOST_TEST(abuts(segment4, segment1, HIGH));
+
+ BOOST_TEST(!abuts(segment1, segment2, LOW));
+ BOOST_TEST(!abuts(segment2, segment3, LOW));
+ BOOST_TEST(!abuts(segment3, segment4, LOW));
+ BOOST_TEST(!abuts(segment4, segment1, LOW));
+
+ BOOST_TEST(abuts(segment2, segment1));
+ BOOST_TEST(abuts(segment3, segment2));
+ BOOST_TEST(abuts(segment4, segment3));
+ BOOST_TEST(abuts(segment1, segment4));
+
+ BOOST_TEST(!abuts(segment1, segment3));
+ BOOST_TEST(!abuts(segment2, segment4));
+}
+
+void segment_concept_test9()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ segment_type segment1 = construct<segment_type>(
+ point_type(0, 0), point_type(2, 2));
+ segment_type segment2 = construct<segment_type>(
+ point_type(1, 1), point_type(3, 3));
+ segment_type segment3 = construct<segment_type>(
+ point_type(2, 2), point_type(-1, -1));
+ segment_type segment4 = construct<segment_type>(
+ point_type(1, 3), point_type(3, 1));
+ segment_type segment5 = construct<segment_type>(
+ point_type(2, 2), point_type(1, 3));
+
+ BOOST_TEST(intersects(segment1, segment2, false));
+ BOOST_TEST(intersects(segment1, segment2, true));
+ BOOST_TEST(intersects(segment1, segment3, false));
+ BOOST_TEST(intersects(segment1, segment3, true));
+ BOOST_TEST(intersects(segment2, segment3, false));
+ BOOST_TEST(intersects(segment2, segment3, true));
+ BOOST_TEST(intersects(segment4, segment3, false));
+ BOOST_TEST(intersects(segment4, segment3, true));
+ BOOST_TEST(intersects(segment4, segment2, false));
+ BOOST_TEST(intersects(segment4, segment2, true));
+ BOOST_TEST(!intersects(segment3, segment5, false));
+ BOOST_TEST(intersects(segment3, segment5, true));
+}
+
+void segment_concept_test10()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ segment_type segment1 = construct<segment_type>(
+ point_type(0, 0), point_type(0, 2));
+ segment_type segment2 = construct<segment_type>(
+ point_type(0, 1), point_type(0, 3));
+ segment_type segment3 = construct<segment_type>(
+ point_type(0, 1), point_type(0, 2));
+ segment_type segment4 = construct<segment_type>(
+ point_type(0, 2), point_type(0, 3));
+ segment_type segment5 = construct<segment_type>(
+ point_type(0, 2), point_type(2, 2));
+ segment_type segment6 = construct<segment_type>(
+ point_type(0, 1), point_type(1, 1));
+
+ BOOST_TEST(intersects(segment1, segment1, false));
+ BOOST_TEST(intersects(segment1, segment1, true));
+ BOOST_TEST(intersects(segment1, segment2, false));
+ BOOST_TEST(intersects(segment1, segment2, true));
+ BOOST_TEST(intersects(segment1, segment3, false));
+ BOOST_TEST(intersects(segment1, segment3, true));
+ BOOST_TEST(intersects(segment2, segment3, false));
+ BOOST_TEST(intersects(segment2, segment3, true));
+ BOOST_TEST(!intersects(segment1, segment4, false));
+ BOOST_TEST(intersects(segment1, segment4, true));
+ BOOST_TEST(!intersects(segment1, segment5, false));
+ BOOST_TEST(intersects(segment1, segment5, true));
+ BOOST_TEST(intersects(segment1, segment6, false));
+ BOOST_TEST(intersects(segment1, segment6, true));
+}
+
+void segment_concept_test11()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ point_type point1(1, 2);
+ point_type point2(7, 10);
+ segment_type segment1 = construct<segment_type>(point1, point2);
+
+ BOOST_TEST(euclidean_distance(segment1, point1) == 0.0);
+ BOOST_TEST(euclidean_distance(segment1, point2) == 0.0);
+ BOOST_TEST(euclidean_distance(segment1, point_type(10, 14)) == 5.0);
+ BOOST_TEST(euclidean_distance(segment1, point_type(-3, -1)) == 5.0);
+ BOOST_TEST(euclidean_distance(segment1, point_type(0, 9)) == 5.0);
+ BOOST_TEST(euclidean_distance(segment1, point_type(8, 3)) == 5.0);
+}
+
+void segment_concept_test12()
+{
+ typedef point_data<int> point_type;
+ typedef Segment<int> segment_type;
+
+ segment_type segment1 = construct<segment_type>(
+ point_type(0, 0), point_type(3, 4));
+ segment_type segment2 = construct<segment_type>(
+ point_type(2, 0), point_type(0, 2));
+ segment_type segment3 = construct<segment_type>(
+ point_type(1, -7), point_type(10, 5));
+ segment_type segment4 = construct<segment_type>(
+ point_type(7, 7), point_type(10, 11));
+
+ BOOST_TEST(euclidean_distance(segment1, segment2) == 0.0);
+ BOOST_TEST(euclidean_distance(segment1, segment3) == 5.0);
+ BOOST_TEST(euclidean_distance(segment1, segment4) == 5.0);
+}
+
+int main()
+{
+ segment_data_test();
+ segment_traits_test();
+ segment_concept_test1();
+ segment_concept_test2();
+ segment_concept_test3();
+ segment_concept_test4();
+ segment_concept_test5();
+ segment_concept_test6();
+ segment_concept_test7();
+ segment_concept_test8();
+ segment_concept_test9();
+ segment_concept_test10();
+ segment_concept_test11();
+ segment_concept_test12();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/polygon_set_data_test.cpp b/src/boost/libs/polygon/test/polygon_set_data_test.cpp
new file mode 100644
index 000000000..df4fa4ac4
--- /dev/null
+++ b/src/boost/libs/polygon/test/polygon_set_data_test.cpp
@@ -0,0 +1,114 @@
+// Boost.Polygon library polygon_set_data_test.cpp file
+
+// Copyright Andrii Sydorchuk 2015.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/polygon.hpp>
+#include <vector>
+
+using namespace boost::polygon;
+using namespace boost::polygon::operators;
+
+void polygon_set_data_test1()
+{
+ typedef point_data<int> point_type;
+ typedef polygon_with_holes_data<int> polygon_with_holes_type;
+ typedef polygon_set_data<int> polygon_set_type;
+
+ polygon_set_type pset;
+ std::vector<point_type> outbox;
+ outbox.push_back(point_type(0, 0));
+ outbox.push_back(point_type(100, 0));
+ outbox.push_back(point_type(100, 100));
+ outbox.push_back(point_type(0, 100));
+ pset.insert_vertex_sequence(outbox.begin(), outbox.end(), COUNTERCLOCKWISE, false);
+ std::vector<point_type> inbox;
+ inbox.push_back(point_type(20, 20));
+ inbox.push_back(point_type(80, 20));
+ inbox.push_back(point_type(80, 80));
+ inbox.push_back(point_type(20, 80));
+ pset.insert_vertex_sequence(inbox.begin(), inbox.end(), COUNTERCLOCKWISE, true);
+
+ BOOST_TEST(!pset.empty());
+ BOOST_TEST(!pset.sorted());
+ BOOST_TEST(pset.dirty());
+ BOOST_TEST_EQ(8, pset.size());
+
+ std::vector<polygon_with_holes_type> vpoly;
+ pset.get(vpoly);
+ BOOST_TEST_EQ(1, vpoly.size());
+
+ polygon_with_holes_type poly = vpoly[0];
+ BOOST_TEST_EQ(5, poly.size());
+ BOOST_TEST_EQ(1, poly.size_holes());
+}
+
+void polygon_set_data_test2()
+{
+ typedef point_data<int> point_type;
+ typedef polygon_data<int> polygon_type;
+ typedef polygon_set_data<int> polygon_set_type;
+
+ std::vector<point_type> data;
+ data.push_back(point_type(2,0));
+ data.push_back(point_type(4,0));
+ data.push_back(point_type(4,3));
+ data.push_back(point_type(0,3));
+ data.push_back(point_type(0,0));
+ data.push_back(point_type(2,0));
+ data.push_back(point_type(2,1));
+ data.push_back(point_type(1,1));
+ data.push_back(point_type(1,2));
+ data.push_back(point_type(3,2));
+ data.push_back(point_type(3,1));
+ data.push_back(point_type(2,1));
+ data.push_back(point_type(2,0));
+
+ polygon_type polygon;
+ set_points(polygon, data.begin(), data.end());
+
+ polygon_set_type pset;
+ pset.insert(polygon);
+
+ std::vector<polygon_type> traps;
+ get_trapezoids(traps, pset, HORIZONTAL);
+
+ BOOST_TEST_EQ(4, traps.size());
+}
+
+void polygon_set_data_test3()
+{
+ typedef point_data<int> point_type;
+ typedef polygon_data<int> polygon_type;
+ typedef polygon_set_data<int> polygon_set_type;
+
+ std::vector<point_type> data;
+ data.push_back(point_type(0,0));
+ data.push_back(point_type(6,0));
+ data.push_back(point_type(6,4));
+ data.push_back(point_type(4,6));
+ data.push_back(point_type(0,6));
+ data.push_back(point_type(0,0));
+ data.push_back(point_type(4,4));
+ data.push_back(point_type(5,4));
+
+ polygon_type polygon(data.begin(), data.end());
+ polygon_set_type pset;
+ pset += polygon;
+
+ BOOST_TEST_EQ(32.0, area(polygon));
+ BOOST_TEST_EQ(32.0, area(polygon));
+}
+
+int main()
+{
+ polygon_set_data_test1();
+ polygon_set_data_test2();
+ polygon_set_data_test3();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_builder_test.cpp b/src/boost/libs/polygon/test/voronoi_builder_test.cpp
new file mode 100644
index 000000000..192c21713
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_builder_test.cpp
@@ -0,0 +1,681 @@
+// Boost.Polygon library voronoi_builder_test.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include "voronoi_test_helper.hpp"
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/polygon.hpp>
+#include <boost/polygon/voronoi.hpp>
+#include <boost/random/mersenne_twister.hpp>
+#include <limits>
+#include <list>
+#include <vector>
+#include <ctime>
+
+using boost::polygon::voronoi_builder;
+using boost::polygon::voronoi_diagram;
+
+typedef voronoi_diagram<double> vd_type;
+typedef vd_type::coordinate_type coordinate_type;
+typedef vd_type::edge_type voronoi_edge_type;
+typedef vd_type::const_cell_iterator const_cell_iterator;
+typedef vd_type::const_vertex_iterator const_vertex_iterator;
+
+#define CHECK_OUTPUT_SIZE(output, cells, vertices, edges) \
+ BOOST_TEST_EQ(output.num_cells(), (std::size_t)cells); \
+ BOOST_TEST_EQ(output.num_vertices(), (std::size_t)vertices); \
+ BOOST_TEST_EQ(output.num_edges(), (std::size_t)edges)
+
+#define VERIFY_OUTPUT(output) \
+ BOOST_TEST(voronoi_test_helper::verify_output(output, \
+ voronoi_test_helper::CELL_CONVEXITY)); \
+ BOOST_TEST(voronoi_test_helper::verify_output(output, \
+ voronoi_test_helper::INCIDENT_EDGES_CCW_ORDER)); \
+ BOOST_TEST(voronoi_test_helper::verify_output(output, \
+ voronoi_test_helper::NO_HALF_EDGE_INTERSECTIONS))
+
+#define VERIFY_NO_HALF_EDGE_INTERSECTIONS(output) \
+ BOOST_TEST(voronoi_test_helper::verify_output(output, \
+ voronoi_test_helper::NO_HALF_EDGE_INTERSECTIONS))
+
+// Sites: (0, 0).
+void single_site_test()
+{
+ std::vector< point_data<int> > points;
+ points.push_back(point_data<int>(0, 0));
+ vd_type test_output;
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ VERIFY_OUTPUT(test_output);
+
+ BOOST_TEST(test_output.cells().size() == 1);
+ CHECK_OUTPUT_SIZE(test_output, 1, 0, 0);
+
+ const_cell_iterator it = test_output.cells().begin();
+ BOOST_TEST(it->incident_edge() == NULL);
+}
+
+// Sites: (0, 0), (0, 1).
+void collinear_sites_test1()
+{
+ std::vector< point_data<int> > points;
+ points.push_back(point_data<int>(0, 0));
+ points.push_back(point_data<int>(0, 1));
+ vd_type test_output;
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ VERIFY_OUTPUT(test_output);
+ CHECK_OUTPUT_SIZE(test_output, 2, 0, 2);
+
+ const_cell_iterator cell_it = test_output.cells().begin();
+ cell_it++;
+
+ const voronoi_edge_type* edge1_1 = cell_it->incident_edge();
+ const voronoi_edge_type* edge1_2 = edge1_1->twin();
+
+ BOOST_TEST(edge1_1->twin() == edge1_2);
+ BOOST_TEST(edge1_2->twin() == edge1_1);
+
+ BOOST_TEST(edge1_1->next() == edge1_1);
+ BOOST_TEST(edge1_1->prev() == edge1_1);
+ BOOST_TEST(edge1_1->rot_next() == edge1_2);
+ BOOST_TEST(edge1_1->rot_prev() == edge1_2);
+
+ BOOST_TEST(edge1_2->next() == edge1_2);
+ BOOST_TEST(edge1_2->prev() == edge1_2);
+ BOOST_TEST(edge1_2->rot_next() == edge1_1);
+ BOOST_TEST(edge1_2->rot_prev() == edge1_1);
+}
+
+// Sites: (0, 0), (1, 1), (2, 2).
+void collinear_sites_test2()
+{
+ std::vector< point_data<int> > points;
+ points.push_back(point_data<int>(0, 0));
+ points.push_back(point_data<int>(1, 1));
+ points.push_back(point_data<int>(2, 2));
+ vd_type test_output;
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ VERIFY_OUTPUT(test_output);
+ CHECK_OUTPUT_SIZE(test_output, 3, 0, 4);
+
+ const_cell_iterator cell_it = test_output.cells().begin();
+ const voronoi_edge_type* edge1_1 = cell_it->incident_edge();
+ const voronoi_edge_type* edge1_2 = edge1_1->twin();
+ cell_it++;
+ cell_it++;
+ const voronoi_edge_type* edge2_2 = cell_it->incident_edge();
+ const voronoi_edge_type* edge2_1 = edge2_2->twin();
+
+ BOOST_TEST(edge1_1->twin() == edge1_2 && edge1_2->twin() == edge1_1);
+ BOOST_TEST(edge2_1->twin() == edge2_2 && edge2_2->twin() == edge2_1);
+
+ BOOST_TEST(edge1_1->next() == edge1_1 && edge1_1->prev() == edge1_1);
+ BOOST_TEST(edge1_2->next() == edge2_1 && edge1_2->prev() == edge2_1);
+ BOOST_TEST(edge2_1->next() == edge1_2 && edge2_1->prev() == edge1_2);
+ BOOST_TEST(edge2_2->next() == edge2_2 && edge2_2->prev() == edge2_2);
+
+ BOOST_TEST(edge1_1->rot_next() == edge1_2 && edge1_1->rot_prev() == edge2_1);
+ BOOST_TEST(edge1_2->rot_next() == edge2_2 && edge1_2->rot_prev() == edge1_1);
+ BOOST_TEST(edge2_1->rot_next() == edge1_1 && edge2_1->rot_prev() == edge2_2);
+ BOOST_TEST(edge2_2->rot_next() == edge2_1 && edge2_2->rot_prev() == edge1_2);
+
+ BOOST_TEST(edge1_2->next() == edge2_1 && edge1_2->prev() == edge2_1);
+ BOOST_TEST(edge2_1->next() == edge1_2 && edge2_1->prev() == edge1_2);
+}
+
+// Sites: (0, 0), (0, 4), (2, 1).
+void triangle_test1()
+{
+ point_data<int> point1(0, 0);
+ point_data<int> point2(0, 4);
+ point_data<int> point3(2, 1);
+ std::vector< point_data<int> > points;
+ points.push_back(point1);
+ points.push_back(point2);
+ points.push_back(point3);
+ vd_type test_output;
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ VERIFY_OUTPUT(test_output);
+ CHECK_OUTPUT_SIZE(test_output, 3, 1, 6);
+
+ const_vertex_iterator it = test_output.vertices().begin();
+ BOOST_TEST_EQ(it->x(), 0.25);
+ BOOST_TEST_EQ(it->y(), 2.0);
+
+ const voronoi_edge_type* edge1_1 = it->incident_edge();
+ const voronoi_edge_type* edge1_2 = edge1_1->twin();
+ BOOST_TEST(edge1_1->cell()->source_index() == 1);
+ BOOST_TEST(edge1_2->cell()->source_index() == 2);
+
+ const voronoi_edge_type* edge2_1 = edge1_1->rot_prev();
+ const voronoi_edge_type* edge2_2 = edge2_1->twin();
+ BOOST_TEST(edge2_1->cell()->source_index() == 2);
+ BOOST_TEST(edge2_2->cell()->source_index() == 0);
+
+ const voronoi_edge_type* edge3_1 = edge2_1->rot_prev();
+ const voronoi_edge_type* edge3_2 = edge3_1->twin();
+ BOOST_TEST(edge3_1->cell()->source_index() == 0);
+ BOOST_TEST(edge3_2->cell()->source_index() == 1);
+
+ BOOST_TEST(edge1_2->twin() == edge1_1);
+ BOOST_TEST(edge2_2->twin() == edge2_1);
+ BOOST_TEST(edge3_2->twin() == edge3_1);
+
+ BOOST_TEST(edge1_1->prev() == edge3_2 && edge1_1->next() == edge3_2);
+ BOOST_TEST(edge2_1->prev() == edge1_2 && edge2_1->next() == edge1_2);
+ BOOST_TEST(edge3_1->prev() == edge2_2 && edge3_1->next() == edge2_2);
+
+ BOOST_TEST(edge1_2->next() == edge2_1 && edge1_2->prev() == edge2_1);
+ BOOST_TEST(edge2_2->next() == edge3_1 && edge2_2->prev() == edge3_1);
+ BOOST_TEST(edge3_2->next() == edge1_1 && edge3_2->prev() == edge1_1);
+
+ BOOST_TEST(edge1_1->rot_next() == edge3_1);
+ BOOST_TEST(edge3_1->rot_next() == edge2_1);
+ BOOST_TEST(edge2_1->rot_next() == edge1_1);
+
+ BOOST_TEST(edge1_2->rot_next() == edge2_2);
+ BOOST_TEST(edge2_2->rot_next() == edge3_2);
+ BOOST_TEST(edge3_2->rot_next() == edge1_2);
+}
+
+// Sites: (0, 1), (2, 0), (2, 4).
+void triangle_test2()
+{
+ point_data<int> point1(0, 1);
+ point_data<int> point2(2, 0);
+ point_data<int> point3(2, 4);
+ std::vector< point_data<int> > points;
+ points.push_back(point1);
+ points.push_back(point2);
+ points.push_back(point3);
+ vd_type test_output;
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ VERIFY_OUTPUT(test_output);
+ CHECK_OUTPUT_SIZE(test_output, 3, 1, 6);
+
+ const_vertex_iterator it = test_output.vertices().begin();
+ BOOST_TEST_EQ(it->x(), 1.75);
+ BOOST_TEST_EQ(it->y(), 2.0);
+
+ const voronoi_edge_type* edge1_1 = it->incident_edge();
+ const voronoi_edge_type* edge1_2 = edge1_1->twin();
+ BOOST_TEST(edge1_1->cell()->source_index() == 2);
+ BOOST_TEST(edge1_2->cell()->source_index() == 1);
+
+ const voronoi_edge_type* edge2_1 = edge1_1->rot_prev();
+ const voronoi_edge_type* edge2_2 = edge2_1->twin();
+ BOOST_TEST(edge2_1->cell()->source_index() == 1);
+ BOOST_TEST(edge2_2->cell()->source_index() == 0);
+
+ const voronoi_edge_type* edge3_1 = edge2_1->rot_prev();
+ const voronoi_edge_type* edge3_2 = edge3_1->twin();
+ BOOST_TEST(edge3_1->cell()->source_index() == 0);
+ BOOST_TEST(edge3_2->cell()->source_index() == 2);
+
+ BOOST_TEST(edge1_2->twin() == edge1_1);
+ BOOST_TEST(edge2_2->twin() == edge2_1);
+ BOOST_TEST(edge3_2->twin() == edge3_1);
+
+ BOOST_TEST(edge1_1->prev() == edge3_2 && edge1_1->next() == edge3_2);
+ BOOST_TEST(edge2_1->prev() == edge1_2 && edge2_1->next() == edge1_2);
+ BOOST_TEST(edge3_1->prev() == edge2_2 && edge3_1->next() == edge2_2);
+
+ BOOST_TEST(edge1_2->next() == edge2_1 && edge1_2->prev() == edge2_1);
+ BOOST_TEST(edge2_2->next() == edge3_1 && edge2_2->prev() == edge3_1);
+ BOOST_TEST(edge3_2->next() == edge1_1 && edge3_2->prev() == edge1_1);
+
+ BOOST_TEST(edge1_1->rot_next() == edge3_1);
+ BOOST_TEST(edge3_1->rot_next() == edge2_1);
+ BOOST_TEST(edge2_1->rot_next() == edge1_1);
+
+ BOOST_TEST(edge1_2->rot_next() == edge2_2);
+ BOOST_TEST(edge2_2->rot_next() == edge3_2);
+ BOOST_TEST(edge3_2->rot_next() == edge1_2);
+}
+
+// Sites: (0, 0), (0, 1), (1, 0), (1, 1).
+void square_test1()
+{
+ point_data<int> point1(0, 0);
+ point_data<int> point2(0, 1);
+ point_data<int> point3(1, 0);
+ point_data<int> point4(1, 1);
+ std::vector< point_data<int> > points;
+ points.push_back(point1);
+ points.push_back(point2);
+ points.push_back(point3);
+ points.push_back(point4);
+ vd_type test_output;
+ construct_voronoi(points.begin(), points.end(), &test_output);
+ VERIFY_OUTPUT(test_output);
+ CHECK_OUTPUT_SIZE(test_output, 4, 1, 8);
+
+ // Check voronoi vertex.
+ const_vertex_iterator it = test_output.vertices().begin();
+ BOOST_TEST_EQ(it->x(), 0.5);
+ BOOST_TEST_EQ(it->y(), 0.5);
+
+ // Check voronoi edges.
+ const voronoi_edge_type* edge1_1 = it->incident_edge();
+ const voronoi_edge_type* edge1_2 = edge1_1->twin();
+ BOOST_TEST(edge1_1->cell()->source_index() == 3);
+ BOOST_TEST(edge1_2->cell()->source_index() == 2);
+
+ const voronoi_edge_type* edge2_1 = edge1_1->rot_prev();
+ const voronoi_edge_type* edge2_2 = edge2_1->twin();
+ BOOST_TEST(edge2_1->cell()->source_index() == 2);
+ BOOST_TEST(edge2_2->cell()->source_index() == 0);
+
+ const voronoi_edge_type* edge3_1 = edge2_1->rot_prev();
+ const voronoi_edge_type* edge3_2 = edge3_1->twin();
+ BOOST_TEST(edge3_1->cell()->source_index() == 0);
+ BOOST_TEST(edge3_2->cell()->source_index() == 1);
+
+ const voronoi_edge_type* edge4_1 = edge3_1->rot_prev();
+ const voronoi_edge_type* edge4_2 = edge4_1->twin();
+ BOOST_TEST(edge4_1->cell()->source_index() == 1);
+ BOOST_TEST(edge4_2->cell()->source_index() == 3);
+
+ BOOST_TEST(edge1_2->twin() == edge1_1);
+ BOOST_TEST(edge2_2->twin() == edge2_1);
+ BOOST_TEST(edge3_2->twin() == edge3_1);
+ BOOST_TEST(edge4_2->twin() == edge4_1);
+
+ BOOST_TEST(edge1_1->prev() == edge4_2 && edge1_1->next() == edge4_2);
+ BOOST_TEST(edge2_1->prev() == edge1_2 && edge2_1->next() == edge1_2);
+ BOOST_TEST(edge3_1->prev() == edge2_2 && edge3_1->next() == edge2_2);
+ BOOST_TEST(edge4_1->prev() == edge3_2 && edge4_1->next() == edge3_2);
+
+ BOOST_TEST(edge1_2->next() == edge2_1 && edge1_2->prev() == edge2_1);
+ BOOST_TEST(edge2_2->next() == edge3_1 && edge2_2->prev() == edge3_1);
+ BOOST_TEST(edge3_2->next() == edge4_1 && edge3_2->prev() == edge4_1);
+ BOOST_TEST(edge4_2->next() == edge1_1 && edge4_2->prev() == edge1_1);
+
+ BOOST_TEST(edge1_1->rot_next() == edge4_1);
+ BOOST_TEST(edge4_1->rot_next() == edge3_1);
+ BOOST_TEST(edge3_1->rot_next() == edge2_1);
+ BOOST_TEST(edge2_1->rot_next() == edge1_1);
+
+ BOOST_TEST(edge1_2->rot_next() == edge2_2);
+ BOOST_TEST(edge2_2->rot_next() == edge3_2);
+ BOOST_TEST(edge3_2->rot_next() == edge4_2);
+ BOOST_TEST(edge4_2->rot_next() == edge1_2);
+}
+
+#ifdef NDEBUG
+void grid_test()
+{
+ vd_type test_output_small, test_output_large;
+ std::vector< point_data<int> > point_vec_small, point_vec_large;
+ int grid_size[] = {10, 33, 101};
+ int max_value[] = {10, 33, 101};
+ int array_length = sizeof(grid_size) / sizeof(int);
+ for (int k = 0; k < array_length; k++) {
+ test_output_small.clear();
+ test_output_large.clear();
+ point_vec_small.clear();
+ point_vec_large.clear();
+ int koef = (std::numeric_limits<int>::max)() / max_value[k];
+ for (int i = 0; i < grid_size[k]; i++) {
+ for (int j = 0; j < grid_size[k]; j++) {
+ point_vec_small.push_back(point_data<int>(i, j));
+ point_vec_large.push_back(point_data<int>(koef * i, koef * j));
+ }
+ }
+ construct_voronoi(point_vec_small.begin(), point_vec_small.end(), &test_output_small);
+ construct_voronoi(point_vec_large.begin(), point_vec_large.end(), &test_output_large);
+ VERIFY_OUTPUT(test_output_small);
+ VERIFY_OUTPUT(test_output_large);
+ unsigned int num_cells = grid_size[k] * grid_size[k];
+ unsigned int num_vertices = num_cells - 2 * grid_size[k] + 1;
+ unsigned int num_edges = 4 * num_cells - 4 * grid_size[k];
+ CHECK_OUTPUT_SIZE(test_output_small, num_cells, num_vertices, num_edges);
+ CHECK_OUTPUT_SIZE(test_output_large, num_cells, num_vertices, num_edges);
+ }
+}
+#endif
+
+#ifdef NDEBUG
+void random_test()
+{
+ boost::mt19937 gen(static_cast<unsigned int>(time(NULL)));
+ vd_type test_output_small, test_output_large;
+ std::vector< point_data<int> > point_vec_small, point_vec_large;
+ int num_points[] = {10, 100, 1000, 10000};
+ int num_runs[] = {1000, 100, 10, 1};
+ int mod_koef[] = {10, 100, 100, 1000};
+ int max_value[] = {5, 50, 50, 5000};
+ int array_length = sizeof(num_points) / sizeof(int);
+ for (int k = 0; k < array_length; k++) {
+ int koef = (std::numeric_limits<int>::max)() / max_value[k];
+ for (int i = 0; i < num_runs[k]; i++) {
+ test_output_small.clear();
+ test_output_large.clear();
+ point_vec_small.clear();
+ point_vec_large.clear();
+ for (int j = 0; j < num_points[k]; j++) {
+ int x = gen() % mod_koef[k] - mod_koef[k] / 2;
+ int y = gen() % mod_koef[k] - mod_koef[k] / 2;
+ point_vec_small.push_back(point_data<int>(x, y));
+ point_vec_large.push_back(point_data<int>(koef * x, koef * y));
+ }
+ construct_voronoi(point_vec_small.begin(), point_vec_small.end(), &test_output_small);
+ construct_voronoi(point_vec_large.begin(), point_vec_large.end(), &test_output_large);
+ VERIFY_OUTPUT(test_output_small);
+ VERIFY_OUTPUT(test_output_large);
+ BOOST_TEST_EQ(test_output_small.num_cells(), test_output_large.num_cells());
+ BOOST_TEST_EQ(test_output_small.num_vertices(), test_output_large.num_vertices());
+ BOOST_TEST_EQ(test_output_small.num_edges(), test_output_large.num_edges());
+ }
+ }
+}
+#endif
+
+void segment_sites_test1()
+{
+ vd_type test_output;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(0, 0);
+ point_data<int> point2(1, 1);
+ segments.push_back(segment_data<int>(point1, point2));
+ construct_voronoi(segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 3, 0, 4);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_sites_test2()
+{
+ vd_type test_output;
+ std::vector< point_data<int> > points;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(0, 0);
+ point_data<int> point2(4, 4);
+ point_data<int> point3(3, 1);
+ point_data<int> point4(1, 3);
+ segments.push_back(segment_data<int>(point1, point2));
+ points.push_back(point3);
+ points.push_back(point4);
+ construct_voronoi(points.begin(), points.end(), segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 5, 4, 16);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_sites_test3()
+{
+ vd_type test_output;
+ std::vector< point_data<int> > points;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(4, 0);
+ point_data<int> point2(0, 4);
+ point_data<int> point3(3, 3);
+ point_data<int> point4(1, 1);
+ segments.push_back(segment_data<int>(point1, point2));
+ points.push_back(point3);
+ points.push_back(point4);
+ construct_voronoi(points.begin(), points.end(), segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 5, 4, 16);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_sites_test4()
+{
+ vd_type test_output;
+ std::vector< point_data<int> > points;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(4, 0);
+ point_data<int> point2(0, 4);
+ point_data<int> point3(3, 2);
+ point_data<int> point4(2, 3);
+ segments.push_back(segment_data<int>(point1, point2));
+ points.push_back(point3);
+ points.push_back(point4);
+ construct_voronoi(points.begin(), points.end(), segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 5, 3, 14);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_site_test5()
+{
+ vd_type test_output;
+ std::vector< point_data<int> > points;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(0, 0);
+ point_data<int> point2(0, 8);
+ point_data<int> point3(-2, -2);
+ point_data<int> point4(-2, 4);
+ point_data<int> point5(-2, 10);
+ segments.push_back(segment_data<int>(point1, point2));
+ points.push_back(point3);
+ points.push_back(point4);
+ points.push_back(point5);
+ construct_voronoi(points.begin(), points.end(), segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 6, 4, 18);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_site_test6()
+{
+ vd_type test_output;
+ std::vector< point_data<int> > points;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(-1, 1);
+ point_data<int> point2(1, 0);
+ point_data<int> point3(1, 2);
+ segments.push_back(segment_data<int>(point2, point3));
+ points.push_back(point1);
+ construct_voronoi(points.begin(), points.end(), segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 4, 2, 10);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_site_test7()
+{
+ vd_type test_output;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(0, 0);
+ point_data<int> point2(4, 0);
+ point_data<int> point3(0, 4);
+ point_data<int> point4(4, 4);
+ segments.push_back(segment_data<int>(point1, point2));
+ segments.push_back(segment_data<int>(point2, point3));
+ segments.push_back(segment_data<int>(point3, point4));
+ construct_voronoi(segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 7, 6, 24);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_site_test8()
+{
+ vd_type test_output;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(0, 0);
+ point_data<int> point2(4, 0);
+ point_data<int> point3(4, 4);
+ point_data<int> point4(0, 4);
+ segments.push_back(segment_data<int>(point1, point2));
+ segments.push_back(segment_data<int>(point2, point3));
+ segments.push_back(segment_data<int>(point3, point4));
+ segments.push_back(segment_data<int>(point4, point1));
+ construct_voronoi(segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 8, 5, 24);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+void segment_site_test9()
+{
+ vd_type test_output;
+ std::vector< segment_data<int> > segments;
+ point_data<int> point1(0, 0);
+ point_data<int> point2(2, 0);
+ point_data<int> point3(4, 0);
+ segments.push_back(segment_data<int>(point1, point2));
+ segments.push_back(segment_data<int>(point2, point3));
+ construct_voronoi(segments.begin(), segments.end(), &test_output);
+ CHECK_OUTPUT_SIZE(test_output, 5, 0, 8);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+}
+
+#ifdef NDEBUG
+void segment_grid_test()
+{
+ vd_type test_output_small, test_output_large;
+ std::vector< segment_data<int> > segments_small, segments_large;
+ int grid_size[] = {10, 27, 53};
+ int max_value[] = {100, 330, 1000};
+ int array_length = sizeof(grid_size) / sizeof(int);
+ for (int k = 0; k < array_length; k++) {
+ test_output_small.clear();
+ test_output_large.clear();
+ segments_small.clear();
+ segments_large.clear();
+ int cur_sz = grid_size[k];
+ int koef = (std::numeric_limits<int>::max)() / max_value[k];
+ for (int i = 0; i < cur_sz + 1; i++)
+ for (int j = 0; j < cur_sz; j++) {
+ point_data<int> point1_1(10 * i, 10 * j);
+ point_data<int> point1_2(koef * 10 * i, koef * 10 * j);
+ point_data<int> point2_1(10 * i, 10 * j + 10);
+ point_data<int> point2_2(koef * 10 * i, koef * (10 * j + 10));
+ segments_small.push_back(segment_data<int>(point1_1, point2_1));
+ segments_large.push_back(segment_data<int>(point1_2, point2_2));
+ point_data<int> point3_1(10 * j, 10 * i);
+ point_data<int> point3_2(koef * 10 * j, koef * 10 * i);
+ point_data<int> point4_1(10 * j + 10, 10 * i);
+ point_data<int> point4_2(koef * (10 * j + 10), koef * 10 * i);
+ segments_small.push_back(segment_data<int>(point3_1, point4_1));
+ segments_large.push_back(segment_data<int>(point3_2, point4_2));
+ }
+ construct_voronoi(segments_small.begin(), segments_small.end(), &test_output_small);
+ construct_voronoi(segments_large.begin(), segments_large.end(), &test_output_large);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output_small);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output_large);
+ BOOST_TEST_EQ(test_output_small.num_cells(), test_output_large.num_cells());
+ BOOST_TEST_EQ(test_output_small.num_vertices(), test_output_large.num_vertices());
+ BOOST_TEST_EQ(test_output_small.num_edges(), test_output_large.num_edges());
+ }
+}
+#endif
+
+#ifdef NDEBUG
+void segment_random_test1()
+{
+ boost::mt19937 gen(static_cast<unsigned int>(time(NULL)));
+ vd_type test_output;
+ std::vector< point_data<int> > points;
+ std::vector< segment_data<int> > segments;
+ int num_runs = 1000;
+ int num_segments = 10;
+ points.push_back(point_data<int>(-100, -100));
+ points.push_back(point_data<int>(-100, 100));
+ points.push_back(point_data<int>(100, -100));
+ points.push_back(point_data<int>(100, 100));
+ for (int i = 0; i < num_runs; i++) {
+ test_output.clear();
+ segments.clear();
+ for (int j = 0; j < num_segments; j++) {
+ int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
+ while (x1 == x2 && y1 == y2) {
+ x1 = (gen() % 100) - 50;
+ y1 = (gen() % 100) - 50;
+ x2 = (gen() % 100) - 50;
+ y2 = (gen() % 100) - 50;
+ }
+ point_data<int> point1(x1, y1);
+ point_data<int> point2(x2, y2);
+ segments.push_back(segment_data<int>(point1, point2));
+ }
+ voronoi_test_helper::clean_segment_set(segments);
+ construct_voronoi(points.begin(), points.end(), segments.begin(), segments.end(), &test_output);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output);
+ }
+}
+#endif
+
+#ifdef NDEBUG
+void segment_random_test2()
+{
+ boost::mt19937 gen(static_cast<unsigned int>(time(NULL)));
+ vd_type test_output_small, test_output_large;
+ std::vector< segment_data<int> > segments_small, segments_large;
+ int num_segments[] = {5, 25, 125, 625};
+ int num_runs[] = {1000, 100, 10, 1};
+ int mod_koef1[] = {10, 100, 200, 300};
+ int mod_koef2[] = {10, 20, 50, 100};
+ int max_value[] = {10, 60, 125, 200};
+ int array_length = sizeof(num_segments) / sizeof(int);
+ for (int k = 0; k < array_length; k++) {
+ int koef = (std::numeric_limits<int>::max)() / max_value[k];
+ for (int i = 0; i < num_runs[k]; i++) {
+ test_output_small.clear();
+ test_output_large.clear();
+ segments_small.clear();
+ segments_large.clear();
+ for (int j = 0; j < num_segments[k]; j++) {
+ int x1 = (gen() % mod_koef1[k]) - mod_koef1[k] / 2;
+ int y1 = (gen() % mod_koef1[k]) - mod_koef1[k] / 2;
+ int dx = 0, dy = 0;
+ while (dx == 0 && dy == 0) {
+ dx = (gen() % mod_koef2[k]) - mod_koef2[k] / 2;
+ dy = (gen() % mod_koef2[k]) - mod_koef2[k] / 2;
+ }
+ int x2 = x1 + dx;
+ int y2 = y1 + dy;
+ point_data<int> point1_small(x1, y1);
+ point_data<int> point2_small(x2, y2);
+ segments_small.push_back(segment_data<int>(point1_small, point2_small));
+ }
+ voronoi_test_helper::clean_segment_set(segments_small);
+ for (std::vector< segment_data<int> >::iterator it = segments_small.begin();
+ it != segments_small.end(); ++it) {
+ int x1 = it->low().x() * koef;
+ int y1 = it->low().y() * koef;
+ int x2 = it->high().x() * koef;
+ int y2 = it->high().y() * koef;
+ point_data<int> point1_large(x1, y1);
+ point_data<int> point2_large(x2, y2);
+ segments_large.push_back(segment_data<int>(point1_large, point2_large));
+ }
+ construct_voronoi(segments_small.begin(), segments_small.end(), &test_output_small);
+ construct_voronoi(segments_large.begin(), segments_large.end(), &test_output_large);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output_small);
+ VERIFY_NO_HALF_EDGE_INTERSECTIONS(test_output_large);
+ BOOST_TEST_EQ(test_output_small.num_cells(), test_output_large.num_cells());
+ BOOST_TEST_EQ(test_output_small.num_vertices(), test_output_large.num_vertices());
+ BOOST_TEST_EQ(test_output_small.num_edges(), test_output_large.num_edges());
+ }
+ }
+}
+#endif
+
+int main()
+{
+ single_site_test();
+ collinear_sites_test1();
+ collinear_sites_test2();
+ triangle_test1();
+ triangle_test2();
+ square_test1();
+#ifdef NDEBUG
+ grid_test();
+ random_test();
+#endif
+ segment_sites_test1();
+ segment_sites_test2();
+ segment_sites_test3();
+ segment_sites_test4();
+ segment_site_test5();
+ segment_site_test6();
+ segment_site_test7();
+ segment_site_test8();
+ segment_site_test9();
+#ifdef NDEBUG
+ segment_grid_test();
+ segment_random_test1();
+ segment_random_test2();
+#endif
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_ctypes_test.cpp b/src/boost/libs/polygon/test/voronoi_ctypes_test.cpp
new file mode 100644
index 000000000..6087e7244
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_ctypes_test.cpp
@@ -0,0 +1,334 @@
+// Boost.Polygon library voronoi_ctypes_test.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/detail/voronoi_ctypes.hpp>
+#include <boost/random/mersenne_twister.hpp>
+#include <vector>
+#include <ctime>
+
+using namespace boost::polygon::detail;
+
+type_converter_fpt to_fpt;
+
+void ulp_comparison_test1()
+{
+ ulp_comparison<double> ulp_cmp;
+ uint64 a = 22;
+ uint64 b = 27;
+ fpt64 da, db;
+ std::memcpy(&da, &a, sizeof(uint64));
+ std::memcpy(&db, &b, sizeof(uint64));
+ BOOST_TEST_EQ(ulp_cmp(da, db, 1), ulp_cmp.LESS);
+ BOOST_TEST_EQ(ulp_cmp(db, da, 1), ulp_cmp.MORE);
+ BOOST_TEST_EQ(ulp_cmp(da, db, 4), ulp_cmp.LESS);
+ BOOST_TEST_EQ(ulp_cmp(da, db, 5), ulp_cmp.EQUAL);
+ BOOST_TEST_EQ(ulp_cmp(da, db, 6), ulp_cmp.EQUAL);
+}
+
+void ulp_comparison_test2()
+{
+ ulp_comparison<fpt64> ulp_cmp;
+ uint64 a = 0ULL;
+ uint64 b = 0x8000000000000002ULL;
+ fpt64 da, db;
+ std::memcpy(&da, &a, sizeof(uint64));
+ std::memcpy(&db, &b, sizeof(uint64));
+ BOOST_TEST_EQ(ulp_cmp(da, db, 1), ulp_cmp.MORE);
+ BOOST_TEST_EQ(ulp_cmp(db, da, 1), ulp_cmp.LESS);
+ BOOST_TEST_EQ(ulp_cmp(da, db, 2), ulp_cmp.EQUAL);
+ BOOST_TEST_EQ(ulp_cmp(da, db, 3), ulp_cmp.EQUAL);
+}
+
+void extended_exponent_fpt_test1()
+{
+ boost::mt19937_64 gen(static_cast<uint32>(time(NULL)));
+ fpt64 b = 0.0;
+ efpt64 eeb(b);
+ for (int i = 0; i < 1000; ++i) {
+ fpt64 a = to_fpt(static_cast<int64>(gen()));
+ efpt64 eea(a);
+ efpt64 neg = -eea;
+ efpt64 sum = eea + eeb;
+ efpt64 dif = eea - eeb;
+ efpt64 mul = eea * eeb;
+ BOOST_TEST_EQ(to_fpt(neg), -a);
+ BOOST_TEST_EQ(to_fpt(sum), a + b);
+ BOOST_TEST_EQ(to_fpt(dif), a - b);
+ BOOST_TEST_EQ(to_fpt(mul), a * b);
+ }
+}
+
+void extended_exponent_fpt_test2()
+{
+ boost::mt19937_64 gen(static_cast<uint32>(time(NULL)));
+ fpt64 a = 0.0;
+ efpt64 eea(a);
+ for (int i = 0; i < 1000; ++i) {
+ fpt64 b = to_fpt(static_cast<int64>(gen()));
+ if (b == 0.0)
+ continue;
+ efpt64 eeb(b);
+ efpt64 neg = -eea;
+ efpt64 sum = eea + eeb;
+ efpt64 dif = eea - eeb;
+ efpt64 mul = eea * eeb;
+ efpt64 div = eea / eeb;
+ BOOST_TEST_EQ(to_fpt(neg), -a);
+ BOOST_TEST_EQ(to_fpt(sum), a + b);
+ BOOST_TEST_EQ(to_fpt(dif), a - b);
+ BOOST_TEST_EQ(to_fpt(mul), a * b);
+ BOOST_TEST_EQ(to_fpt(div), a / b);
+ }
+}
+
+void extended_exponent_fpt_test3()
+{
+ boost::mt19937_64 gen(static_cast<uint32>(time(NULL)));
+ for (int i = 0; i < 1000; ++i) {
+ fpt64 a = to_fpt(static_cast<int64>(gen()));
+ fpt64 b = to_fpt(static_cast<int64>(gen()));
+ if (b == 0.0)
+ continue;
+ efpt64 eea(a);
+ efpt64 eeb(b);
+ efpt64 neg = -eea;
+ efpt64 sum = eea + eeb;
+ efpt64 dif = eea - eeb;
+ efpt64 mul = eea * eeb;
+ efpt64 div = eea / eeb;
+ BOOST_TEST_EQ(to_fpt(neg), -a);
+ BOOST_TEST_EQ(to_fpt(sum), a + b);
+ BOOST_TEST_EQ(to_fpt(dif), a - b);
+ BOOST_TEST_EQ(to_fpt(mul), a * b);
+ BOOST_TEST_EQ(to_fpt(div), a / b);
+ }
+}
+
+void extended_exponent_fpt_test4()
+{
+ for (int exp = 0; exp < 64; ++exp)
+ for (int i = 1; i < 100; ++i) {
+ fpt64 a = i;
+ fpt64 b = to_fpt(1LL << exp);
+ efpt64 eea(a);
+ efpt64 eeb(b);
+ efpt64 neg = -eea;
+ efpt64 sum = eea + eeb;
+ efpt64 dif = eea - eeb;
+ efpt64 mul = eea * eeb;
+ efpt64 div = eea / eeb;
+ BOOST_TEST_EQ(to_fpt(neg), -a);
+ BOOST_TEST_EQ(to_fpt(sum), a + b);
+ BOOST_TEST_EQ(to_fpt(dif), a - b);
+ BOOST_TEST_EQ(to_fpt(mul), a * b);
+ BOOST_TEST_EQ(to_fpt(div), a / b);
+ }
+}
+
+void extended_exponent_fpt_test5()
+{
+ for (int i = 0; i < 100; ++i) {
+ efpt64 a(to_fpt(i * i));
+ efpt64 b = a.sqrt();
+ BOOST_TEST_EQ(to_fpt(b), to_fpt(i));
+ }
+}
+
+void extended_exponent_fpt_test6()
+{
+ for (int i = -10; i <= 10; ++i) {
+ efpt64 a(to_fpt(i));
+ BOOST_TEST_EQ(is_pos(a), i > 0);
+ BOOST_TEST_EQ(is_neg(a), i < 0);
+ BOOST_TEST_EQ(is_zero(a), !i);
+ }
+}
+
+void extended_int_test1()
+{
+ typedef extended_int<1> eint32;
+ eint32 e1(0), e2(32), e3(-32);
+ BOOST_TEST_EQ(e1.count(), 0);
+ BOOST_TEST_EQ(e1.size(), 0U);
+ BOOST_TEST_EQ(e2.count(), 1);
+ BOOST_TEST_EQ(e2.chunks()[0], 32U);
+ BOOST_TEST_EQ(e2.size(), 1U);
+ BOOST_TEST_EQ(e3.count(), -1);
+ BOOST_TEST_EQ(e3.chunks()[0], 32U);
+ BOOST_TEST_EQ(e3.size(), 1U);
+}
+
+void extended_int_test2()
+{
+ typedef extended_int<2> eint64;
+ int64 val64 = 0x7fffffffffffffffLL;
+ eint64 e1(0), e2(32), e3(-32), e4(val64), e5(-val64);
+ BOOST_TEST_EQ(e1.count(), 0);
+ BOOST_TEST_EQ(e2.count(), 1);
+ BOOST_TEST_EQ(e2.chunks()[0], 32U);
+ BOOST_TEST_EQ(e3.count(), -1);
+ BOOST_TEST_EQ(e3.chunks()[0], 32U);
+ BOOST_TEST_EQ(e4.count(), 2);
+ BOOST_TEST_EQ(e4.chunks()[0], 0xffffffff);
+ BOOST_TEST_EQ(e4.chunks()[1], val64 >> 32);
+ BOOST_TEST_EQ(e5.count(), -2);
+ BOOST_TEST_EQ(e5.chunks()[0], 0xffffffff);
+ BOOST_TEST_EQ(e5.chunks()[1], val64 >> 32);
+}
+
+void extended_int_test3()
+{
+ typedef extended_int<2> eint64;
+ std::vector<uint32> chunks;
+ chunks.push_back(1);
+ chunks.push_back(2);
+ eint64 e1(chunks, true), e2(chunks, false);
+ BOOST_TEST_EQ(e1.count(), 2);
+ BOOST_TEST_EQ(e1.chunks()[0], 2U);
+ BOOST_TEST_EQ(e1.chunks()[1], 1U);
+ BOOST_TEST_EQ(e2.count(), -2);
+ BOOST_TEST_EQ(e2.chunks()[0], 2U);
+ BOOST_TEST_EQ(e2.chunks()[1], 1U);
+}
+
+void extended_int_test4()
+{
+ typedef extended_int<2> eint64;
+ std::vector<uint32> chunks;
+ chunks.push_back(1);
+ chunks.push_back(2);
+ eint64 e1(chunks, true), e2(chunks, false);
+ BOOST_TEST_EQ(e1 == e2, false);
+ BOOST_TEST_EQ(e1 == -e2, true);
+ BOOST_TEST_EQ(e1 != e2, true);
+ BOOST_TEST_EQ(e1 != -e2, false);
+ BOOST_TEST_EQ(e1 < e2, false);
+ BOOST_TEST_EQ(e1 < -e2, false);
+ BOOST_TEST_EQ(e1 <= e2, false);
+ BOOST_TEST_EQ(e1 <= -e2, true);
+ BOOST_TEST_EQ(e1 > e2, true);
+ BOOST_TEST_EQ(e1 > -e2, false);
+ BOOST_TEST_EQ(e1 >= e2, true);
+ BOOST_TEST_EQ(e1 >= -e2, true);
+}
+
+void extended_int_test5()
+{
+ typedef extended_int<2> eint64;
+ boost::mt19937_64 gen(static_cast<uint32>(time(NULL)));
+ for (int i = 0; i < 1000; ++i) {
+ int64 i1 = static_cast<int64>(gen());
+ int64 i2 = static_cast<int64>(gen());
+ eint64 e1(i1), e2(i2);
+ BOOST_TEST_EQ(e1 == e2, i1 == i2);
+ BOOST_TEST_EQ(e1 != e2, i1 != i2);
+ BOOST_TEST_EQ(e1 > e2, i1 > i2);
+ BOOST_TEST_EQ(e1 >= e2, i1 >= i2);
+ BOOST_TEST_EQ(e1 < e2, i1 < i2);
+ BOOST_TEST_EQ(e1 <= e2, i1 <= i2);
+ }
+}
+
+void extended_int_test6()
+{
+ typedef extended_int<1> eint32;
+ eint32 e1(32);
+ eint32 e2 = -e1;
+ BOOST_TEST_EQ(e2.count(), -1);
+ BOOST_TEST_EQ(e2.size(), 1U);
+ BOOST_TEST_EQ(e2.chunks()[0], 32U);
+}
+
+void extended_int_test7()
+{
+ typedef extended_int<2> eint64;
+ boost::mt19937_64 gen(static_cast<uint32>(time(NULL)));
+ for (int i = 0; i < 1000; ++i) {
+ int64 i1 = static_cast<int64>(gen()) >> 2;
+ int64 i2 = static_cast<int64>(gen()) >> 2;
+ eint64 e1(i1), e2(i2), e3(i1 + i2), e4(i1 - i2);
+ BOOST_TEST(e1 + e2 == e3);
+ BOOST_TEST(e1 - e2 == e4);
+ }
+}
+
+void extended_int_test8()
+{
+ typedef extended_int<2> eint64;
+ boost::mt19937 gen(static_cast<uint32>(time(NULL)));
+ for (int i = 0; i < 1000; ++i) {
+ int64 i1 = static_cast<int32>(gen());
+ int64 i2 = static_cast<int32>(gen());
+ eint64 e1(i1), e2(i2), e3(i1 * i2);
+ BOOST_TEST(e1 * e2 == e3);
+ }
+}
+
+void extended_int_test9()
+{
+ typedef extended_int<1> eint32;
+ for (int i = -10; i <= 10; ++i) {
+ for (int j = -10; j <= 10; ++j) {
+ eint32 e1(i), e2(j), e3(i+j), e4(i-j), e5(i*j);
+ BOOST_TEST(e1 + e2 == e3);
+ BOOST_TEST(e1 - e2 == e4);
+ BOOST_TEST(e1 * e2 == e5);
+ }
+ }
+}
+
+void extended_int_test10()
+{
+ typedef extended_int<2> eint64;
+ boost::mt19937_64 gen(static_cast<uint32>(time(NULL)));
+ for (int i = 0; i < 100; ++i) {
+ int64 i1 = static_cast<int64>(gen()) >> 20;
+ int64 i2 = i1 >> 32;
+ eint64 e1(i1), e2(i2);
+ BOOST_TEST(to_fpt(e1) == static_cast<fpt64>(i1));
+ BOOST_TEST(to_fpt(e2) == static_cast<fpt64>(i2));
+ }
+}
+
+void extened_int_test11()
+{
+ typedef extended_int<64> eint2048;
+ eint2048 two(2), value(1);
+ for (int i = 0; i < 1024; ++i)
+ value = value * two;
+ BOOST_TEST_EQ(value.count(), 33);
+ for (std::size_t i = 1; i < value.size(); ++i)
+ BOOST_TEST_EQ(value.chunks()[i-1], 0U);
+ BOOST_TEST_EQ(value.chunks()[32], 1U);
+}
+
+int main()
+{
+ ulp_comparison_test1();
+ ulp_comparison_test2();
+ extended_exponent_fpt_test1();
+ extended_exponent_fpt_test2();
+ extended_exponent_fpt_test3();
+ extended_exponent_fpt_test4();
+ extended_exponent_fpt_test5();
+ extended_exponent_fpt_test6();
+ extended_int_test1();
+ extended_int_test2();
+ extended_int_test3();
+ extended_int_test4();
+ extended_int_test5();
+ extended_int_test6();
+ extended_int_test7();
+ extended_int_test8();
+ extended_int_test9();
+ extended_int_test10();
+ extened_int_test11();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_diagram_test.cpp b/src/boost/libs/polygon/test/voronoi_diagram_test.cpp
new file mode 100644
index 000000000..6646a1755
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_diagram_test.cpp
@@ -0,0 +1,125 @@
+// Boost.Polygon library voronoi_diagram_test.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/voronoi_diagram.hpp>
+#include <boost/polygon/voronoi_geometry_type.hpp>
+
+using namespace boost::polygon;
+
+typedef voronoi_cell<double> voronoi_cell_type;
+typedef voronoi_vertex<double> voronoi_vertex_type;
+typedef voronoi_edge<double> voronoi_edge_type;
+typedef voronoi_diagram<double> voronoi_diagram_type;
+
+void voronoi_cell_test()
+{
+ voronoi_cell_type cell(1, SOURCE_CATEGORY_INITIAL_SEGMENT);
+ cell.color(27);
+ BOOST_TEST(!cell.contains_point());
+ BOOST_TEST(cell.contains_segment());
+ BOOST_TEST(cell.is_degenerate());
+ BOOST_TEST(cell.source_index() == 1);
+ BOOST_TEST(cell.source_category() == SOURCE_CATEGORY_INITIAL_SEGMENT);
+ BOOST_TEST(cell.incident_edge() == NULL);
+ BOOST_TEST(cell.color() == 27);
+
+ voronoi_edge_type edge(true, true);
+ cell.incident_edge(&edge);
+ BOOST_TEST(!cell.is_degenerate());
+ BOOST_TEST(cell.incident_edge() == &edge);
+}
+
+void voronoi_vertex_test()
+{
+ voronoi_vertex_type vertex(1, 2);
+ vertex.color(27);
+ BOOST_TEST(vertex.is_degenerate());
+ BOOST_TEST(vertex.x() == 1);
+ BOOST_TEST(vertex.y() == 2);
+ BOOST_TEST(vertex.incident_edge() == NULL);
+ BOOST_TEST(vertex.color() == 27);
+
+ voronoi_edge_type edge(true, true);
+ vertex.incident_edge(&edge);
+ BOOST_TEST(!vertex.is_degenerate());
+ BOOST_TEST(vertex.incident_edge() == &edge);
+}
+
+void voronoi_edge_test()
+{
+ voronoi_edge_type edge1(false, false);
+ edge1.color(13);
+ BOOST_TEST(!edge1.is_primary());
+ BOOST_TEST(edge1.is_secondary());
+ BOOST_TEST(!edge1.is_linear());
+ BOOST_TEST(edge1.is_curved());
+ BOOST_TEST(!edge1.is_finite());
+ BOOST_TEST(edge1.is_infinite());
+ BOOST_TEST(edge1.color() == 13);
+
+ voronoi_edge_type edge2(true, true);
+ edge2.color(14);
+ BOOST_TEST(edge2.is_primary());
+ BOOST_TEST(!edge2.is_secondary());
+ BOOST_TEST(edge2.is_linear());
+ BOOST_TEST(!edge2.is_curved());
+ BOOST_TEST(!edge2.is_finite());
+ BOOST_TEST(edge2.is_infinite());
+ BOOST_TEST(edge2.color() == 14);
+
+ edge1.twin(&edge2);
+ edge2.twin(&edge1);
+ BOOST_TEST(edge1.twin() == &edge2);
+ BOOST_TEST(edge2.twin() == &edge1);
+
+ edge1.next(&edge2);
+ edge1.prev(&edge2);
+ edge2.next(&edge1);
+ edge2.prev(&edge1);
+ BOOST_TEST(edge1.next() == &edge2);
+ BOOST_TEST(edge1.prev() == &edge2);
+ BOOST_TEST(edge1.rot_next() == &edge1);
+ BOOST_TEST(edge1.rot_prev() == &edge1);
+
+ voronoi_cell_type cell(1, SOURCE_CATEGORY_INITIAL_SEGMENT);
+ edge1.cell(&cell);
+ BOOST_TEST(edge1.cell() == &cell);
+
+ voronoi_vertex_type vertex0(1, 2);
+ edge1.vertex0(&vertex0);
+ BOOST_TEST(edge1.vertex0() == &vertex0);
+ BOOST_TEST(edge2.vertex1() == &vertex0);
+
+ voronoi_vertex_type vertex1(2, 1);
+ edge2.vertex0(&vertex1);
+ BOOST_TEST(edge1.vertex1() == &vertex1);
+ BOOST_TEST(edge2.vertex0() == &vertex1);
+
+ BOOST_TEST(edge1.is_finite());
+ BOOST_TEST(edge2.is_finite());
+}
+
+void voronoi_diagram_test()
+{
+ voronoi_diagram_type vd;
+ BOOST_TEST(vd.num_cells() == 0);
+ BOOST_TEST(vd.num_vertices() == 0);
+ BOOST_TEST(vd.num_edges() == 0);
+ vd.clear();
+}
+
+int main()
+{
+ voronoi_cell_test();
+ voronoi_vertex_test();
+ voronoi_edge_test();
+ voronoi_diagram_test();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_geometry_type_test.cpp b/src/boost/libs/polygon/test/voronoi_geometry_type_test.cpp
new file mode 100644
index 000000000..82dd9fe44
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_geometry_type_test.cpp
@@ -0,0 +1,34 @@
+// Boost.Polygon library voronoi_geometry_type_test.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/voronoi_geometry_type.hpp>
+
+using namespace boost::polygon;
+
+void source_category_test1()
+{
+ BOOST_TEST(belongs(SOURCE_CATEGORY_SINGLE_POINT, GEOMETRY_CATEGORY_POINT));
+ BOOST_TEST(belongs(SOURCE_CATEGORY_SEGMENT_START_POINT, GEOMETRY_CATEGORY_POINT));
+ BOOST_TEST(belongs(SOURCE_CATEGORY_SEGMENT_END_POINT, GEOMETRY_CATEGORY_POINT));
+ BOOST_TEST(!belongs(SOURCE_CATEGORY_INITIAL_SEGMENT, GEOMETRY_CATEGORY_POINT));
+ BOOST_TEST(!belongs(SOURCE_CATEGORY_REVERSE_SEGMENT, GEOMETRY_CATEGORY_POINT));
+
+ BOOST_TEST(!belongs(SOURCE_CATEGORY_SINGLE_POINT, GEOMETRY_CATEGORY_SEGMENT));
+ BOOST_TEST(!belongs(SOURCE_CATEGORY_SEGMENT_START_POINT, GEOMETRY_CATEGORY_SEGMENT));
+ BOOST_TEST(!belongs(SOURCE_CATEGORY_SEGMENT_END_POINT, GEOMETRY_CATEGORY_SEGMENT));
+ BOOST_TEST(belongs(SOURCE_CATEGORY_INITIAL_SEGMENT, GEOMETRY_CATEGORY_SEGMENT));
+ BOOST_TEST(belongs(SOURCE_CATEGORY_REVERSE_SEGMENT, GEOMETRY_CATEGORY_SEGMENT));
+}
+
+int main()
+{
+ source_category_test1();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_predicates_test.cpp b/src/boost/libs/polygon/test/voronoi_predicates_test.cpp
new file mode 100644
index 000000000..1f5b3fb34
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_predicates_test.cpp
@@ -0,0 +1,636 @@
+// Boost.Polygon library voronoi_predicates_test.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/detail/voronoi_ctypes.hpp>
+#include <boost/polygon/detail/voronoi_predicates.hpp>
+#include <boost/polygon/detail/voronoi_structures.hpp>
+#include <boost/polygon/voronoi_geometry_type.hpp>
+#include <limits>
+#include <map>
+
+using namespace boost::polygon::detail;
+using namespace boost::polygon;
+
+ulp_comparison<double> ulp_cmp;
+
+typedef voronoi_predicates< voronoi_ctype_traits<int> > VP;
+typedef point_2d<int> point_type;
+typedef site_event<int> site_type;
+typedef circle_event<double> circle_type;
+VP::event_comparison_predicate<site_type, circle_type> event_comparison;
+
+typedef beach_line_node_key<site_type> key_type;
+typedef VP::distance_predicate<site_type> distance_predicate_type;
+typedef VP::node_comparison_predicate<key_type> node_comparison_type;
+typedef std::map<key_type, int, node_comparison_type> beach_line_type;
+typedef beach_line_type::iterator bieach_line_iterator;
+distance_predicate_type distance_predicate;
+node_comparison_type node_comparison;
+
+typedef VP::circle_existence_predicate<site_type> CEP_type;
+typedef VP::mp_circle_formation_functor<site_type, circle_type> MP_CFF_type;
+typedef VP::lazy_circle_formation_functor<site_type, circle_type> lazy_CFF_type;
+VP::circle_formation_predicate<site_type, circle_type, CEP_type, MP_CFF_type> mp_predicate;
+VP::circle_formation_predicate<site_type, circle_type, CEP_type, lazy_CFF_type> lazy_predicate;
+
+#define CHECK_ORIENTATION(P1, P2, P3, R1, R2) \
+ BOOST_TEST_EQ(VP::ot::eval(P1, P2, P3) == R1, true); \
+ BOOST_TEST_EQ(VP::ot::eval(P1, P3, P2) == R2, true); \
+ BOOST_TEST_EQ(VP::ot::eval(P2, P1, P3) == R2, true); \
+ BOOST_TEST_EQ(VP::ot::eval(P2, P3, P1) == R1, true); \
+ BOOST_TEST_EQ(VP::ot::eval(P3, P1, P2) == R1, true); \
+ BOOST_TEST_EQ(VP::ot::eval(P3, P2, P1) == R2, true)
+
+#define CHECK_EVENT_COMPARISON(A, B, R1, R2) \
+ BOOST_TEST_EQ(event_comparison(A, B), R1); \
+ BOOST_TEST_EQ(event_comparison(B, A), R2)
+
+#define CHECK_DISTANCE_PREDICATE(S1, S2, P3, RES) \
+ BOOST_TEST_EQ(distance_predicate(S1, S2, P3), RES)
+
+#define CHECK_NODE_COMPARISON(node, nodes, res, sz) \
+ for (int i = 0; i < sz; ++i) { \
+ BOOST_TEST_EQ(node_comparison(node, nodes[i]), res[i]); \
+ BOOST_TEST_EQ(node_comparison(nodes[i], node), !res[i]); \
+ }
+
+#define CHECK_CIRCLE(circle, c_x, c_y, l_x) \
+ BOOST_TEST_EQ(ulp_cmp(c1.x(), c_x, 10), ulp_comparison<double>::EQUAL); \
+ BOOST_TEST_EQ(ulp_cmp(c1.y(), c_y, 10), ulp_comparison<double>::EQUAL); \
+ BOOST_TEST_EQ(ulp_cmp(c1.lower_x(), l_x, 10), ulp_comparison<double>::EQUAL)
+
+#define CHECK_CIRCLE_EXISTENCE(s1, s2, s3, RES) \
+ { circle_type c1; \
+ BOOST_TEST_EQ(lazy_predicate(s1, s2, s3, c1), RES); }
+
+#define CHECK_CIRCLE_FORMATION_PREDICATE(s1, s2, s3, c_x, c_y, l_x) \
+ { circle_type c1, c2; \
+ BOOST_TEST_EQ(mp_predicate(s1, s2, s3, c1), true); \
+ BOOST_TEST_EQ(lazy_predicate(s1, s2, s3, c2), true); \
+ CHECK_CIRCLE(c1, c_x, c_y, l_x); \
+ CHECK_CIRCLE(c2, c_x, c_y, l_x); }
+
+void orientation_test()
+{
+ int min_int = (std::numeric_limits<int>::min)();
+ int max_int = (std::numeric_limits<int>::max)();
+ point_type point1(min_int, min_int);
+ point_type point2(0, 0);
+ point_type point3(max_int, max_int);
+ point_type point4(min_int, max_int);
+ point_type point5(max_int-1, max_int);
+ CHECK_ORIENTATION(point1, point2, point3, VP::ot::COLLINEAR, VP::ot::COLLINEAR);
+ CHECK_ORIENTATION(point1, point4, point3, VP::ot::RIGHT, VP::ot::LEFT);
+ CHECK_ORIENTATION(point1, point5, point3, VP::ot::RIGHT, VP::ot::LEFT);
+}
+
+void event_comparison_test1()
+{
+ site_type site(1, 2);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 2), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(1, 3), true, false);
+ CHECK_EVENT_COMPARISON(site, site_type(1, 2), false, false);
+}
+
+void event_comparison_test2()
+{
+ site_type site(0, 0, 0, 2);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 2), true, false);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 0), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(0, -2, 0, -1), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(0, -2, 1, 1), true, false);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 0, 1, 1), true, false);
+}
+
+void event_comparison_test3()
+{
+ site_type site(0, 0, 10, 10);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 0), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(0, -1), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 1), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 1, 0, 10), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(0, -10, 0, -1), false, true);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 0, 10, 9), true, false);
+ CHECK_EVENT_COMPARISON(site, site_type(0, 0, 9, 10), false, true);
+}
+
+void event_comparison_test4()
+{
+ circle_type circle(1, 2, 3);
+ CHECK_EVENT_COMPARISON(circle, circle_type(1, 2, 3), false, false);
+ CHECK_EVENT_COMPARISON(circle, circle_type(1, 3, 3), true, false);
+ CHECK_EVENT_COMPARISON(circle, circle_type(1, 2, 4), true, false);
+ CHECK_EVENT_COMPARISON(circle, circle_type(0, 2, 2), false, true);
+ CHECK_EVENT_COMPARISON(circle, circle_type(-1, 2, 3), false, false);
+}
+
+void event_comparison_test5()
+{
+ circle_type circle(1, 2, 3);
+ CHECK_EVENT_COMPARISON(circle, site_type(0, 100), false, true);
+ CHECK_EVENT_COMPARISON(circle, site_type(3, 0), false, false);
+ CHECK_EVENT_COMPARISON(circle, site_type(3, 2), false, false);
+ CHECK_EVENT_COMPARISON(circle, site_type(3, 3), false, false);
+ CHECK_EVENT_COMPARISON(circle, site_type(4, 2), true, false);
+}
+
+void distance_predicate_test1()
+{
+ site_type site1(-5, 0);
+ site1.sorted_index(1);
+ site_type site2(-8, 9);
+ site2.sorted_index(0);
+ site_type site3(-2, 1);
+ site3.sorted_index(2);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 5), false);
+ CHECK_DISTANCE_PREDICATE(site3, site1, point_type(0, 5), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 4), false);
+ CHECK_DISTANCE_PREDICATE(site3, site1, point_type(0, 4), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 6), true);
+ CHECK_DISTANCE_PREDICATE(site3, site1, point_type(0, 6), true);
+}
+
+void distance_predicate_test2()
+{
+ site_type site1(-4, 0, -4, 20);
+ site1.sorted_index(0);
+ site_type site2(-2, 10);
+ site2.sorted_index(1);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, 11), false);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, 9), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 11), true);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 9), true);
+}
+
+void distance_predicate_test3()
+{
+ site_type site1(-5, 5, 2, -2);
+ site1.sorted_index(0);
+ site1.inverse();
+ site_type site2(-2, 4);
+ site2.sorted_index(1);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, -1), false);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, -1), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 1), false);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, 1), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 4), true);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, 4), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 5), true);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, 5), false);
+}
+
+void distance_predicate_test4()
+{
+ site_type site1(-5, 5, 2, -2);
+ site1.sorted_index(0);
+ site_type site2(-2, -4);
+ site2.sorted_index(2);
+ site_type site3(-4, 1);
+ site3.sorted_index(1);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, 1), true);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, 1), true);
+ CHECK_DISTANCE_PREDICATE(site1, site3, point_type(0, 1), true);
+ CHECK_DISTANCE_PREDICATE(site3, site1, point_type(0, 1), true);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, -2), true);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, -2), false);
+ CHECK_DISTANCE_PREDICATE(site1, site3, point_type(0, -2), true);
+ CHECK_DISTANCE_PREDICATE(site3, site1, point_type(0, -2), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, -8), true);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, -8), false);
+ CHECK_DISTANCE_PREDICATE(site1, site3, point_type(0, -8), true);
+ CHECK_DISTANCE_PREDICATE(site3, site1, point_type(0, -8), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(0, -9), true);
+ CHECK_DISTANCE_PREDICATE(site2, site1, point_type(0, -9), false);
+ CHECK_DISTANCE_PREDICATE(site1, site3, point_type(0, -9), true);
+ CHECK_DISTANCE_PREDICATE(site3, site1, point_type(0, -9), false);
+}
+
+void distance_predicate_test5()
+{
+ site_type site1(-5, 5, 2, -2);
+ site1.sorted_index(0);
+ site_type site2 = site1;
+ site2.inverse();
+ site_type site3(-2, 4);
+ site3.sorted_index(3);
+ site_type site4(-2, -4);
+ site4.sorted_index(2);
+ site_type site5(-4, 1);
+ site5.sorted_index(1);
+ CHECK_DISTANCE_PREDICATE(site3, site2, point_type(0, 1), false);
+ CHECK_DISTANCE_PREDICATE(site3, site2, point_type(0, 4), false);
+ CHECK_DISTANCE_PREDICATE(site3, site2, point_type(0, 5), false);
+ CHECK_DISTANCE_PREDICATE(site3, site2, point_type(0, 7), true);
+ CHECK_DISTANCE_PREDICATE(site4, site1, point_type(0, -2), false);
+ CHECK_DISTANCE_PREDICATE(site5, site1, point_type(0, -2), false);
+ CHECK_DISTANCE_PREDICATE(site4, site1, point_type(0, -8), false);
+ CHECK_DISTANCE_PREDICATE(site5, site1, point_type(0, -8), false);
+ CHECK_DISTANCE_PREDICATE(site4, site1, point_type(0, -9), false);
+ CHECK_DISTANCE_PREDICATE(site5, site1, point_type(0, -9), false);
+ CHECK_DISTANCE_PREDICATE(site4, site1, point_type(0, -18), false);
+ CHECK_DISTANCE_PREDICATE(site5, site1, point_type(0, -18), false);
+ CHECK_DISTANCE_PREDICATE(site4, site1, point_type(0, -1), true);
+ CHECK_DISTANCE_PREDICATE(site5, site1, point_type(0, -1), true);
+}
+
+void distance_predicate_test6()
+{
+ site_type site1(-5, 0, 2, 7);
+ site_type site2 = site1;
+ site2.inverse();
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(2, 7), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(1, 5), false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(-1, 5), true);
+}
+
+void distance_predicate_test7()
+{
+ site_type site1(-5, 5, 2, -2);
+ site1.sorted_index(1);
+ site1.inverse();
+ site_type site2(-5, 5, 0, 6);
+ site2.sorted_index(0);
+ site_type site3(-2, 4, 0, 4);
+ site3.sorted_index(2);
+ point_type site4(0, 2);
+ point_type site5(0, 5);
+ point_type site6(0, 6);
+ point_type site7(0, 8);
+ CHECK_DISTANCE_PREDICATE(site1, site2, site4, false);
+ CHECK_DISTANCE_PREDICATE(site1, site2, site5, true);
+ CHECK_DISTANCE_PREDICATE(site1, site2, site6, true);
+ CHECK_DISTANCE_PREDICATE(site1, site2, site7, true);
+ CHECK_DISTANCE_PREDICATE(site1, site3, site4, false);
+ CHECK_DISTANCE_PREDICATE(site1, site3, site5, true);
+ CHECK_DISTANCE_PREDICATE(site1, site3, site6, true);
+ CHECK_DISTANCE_PREDICATE(site1, site3, site7, true);
+ site3.inverse();
+ CHECK_DISTANCE_PREDICATE(site3, site1, site4, false);
+ CHECK_DISTANCE_PREDICATE(site3, site1, site5, false);
+ CHECK_DISTANCE_PREDICATE(site3, site1, site6, false);
+ CHECK_DISTANCE_PREDICATE(site3, site1, site7, true);
+}
+
+void distance_predicate_test8()
+{
+ site_type site1(-5, 3, -2, 2);
+ site1.sorted_index(0);
+ site1.inverse();
+ site_type site2(-5, 5, -2, 2);
+ site2.sorted_index(1);
+ CHECK_DISTANCE_PREDICATE(site1, site2, point_type(-4, 2), false);
+}
+
+void node_comparison_test1()
+{
+ beach_line_type beach_line;
+ site_type site1(0, 0);
+ site1.sorted_index(0);
+ site_type site2(0, 2);
+ site2.sorted_index(1);
+ site_type site3(1, 0);
+ site3.sorted_index(2);
+ beach_line[key_type(site1, site2)] = 2;
+ beach_line[key_type(site1, site3)] = 0;
+ beach_line[key_type(site3, site1)] = 1;
+ int cur_index = 0;
+ for (bieach_line_iterator it = beach_line.begin();
+ it != beach_line.end(); ++it, ++cur_index) {
+ BOOST_TEST_EQ(it->second, cur_index);
+ }
+}
+
+void node_comparison_test2()
+{
+ beach_line_type beach_line;
+ site_type site1(0, 1);
+ site1.sorted_index(0);
+ site_type site2(2, 0);
+ site2.sorted_index(1);
+ site_type site3(2, 4);
+ site3.sorted_index(2);
+ beach_line[key_type(site1, site2)] = 0;
+ beach_line[key_type(site2, site1)] = 1;
+ beach_line[key_type(site1, site3)] = 2;
+ beach_line[key_type(site3, site1)] = 3;
+ int cur_index = 0;
+ for (bieach_line_iterator it = beach_line.begin();
+ it != beach_line.end(); ++it, ++cur_index) {
+ BOOST_TEST_EQ(it->second, cur_index);
+ }
+}
+
+void node_comparison_test3()
+{
+ key_type node(site_type(1, 0).sorted_index(1), site_type(0, 2).sorted_index(0));
+ key_type nodes[] = {
+ key_type(site_type(2, -10).sorted_index(2)),
+ key_type(site_type(2, -1).sorted_index(2)),
+ key_type(site_type(2, 0).sorted_index(2)),
+ key_type(site_type(2, 1).sorted_index(2)),
+ key_type(site_type(2, 2).sorted_index(2)),
+ key_type(site_type(2, 3).sorted_index(2)),
+ };
+ bool res[] = {false, false, false, false, true, true};
+ CHECK_NODE_COMPARISON(node, nodes, res, 6);
+}
+
+void node_comparison_test4()
+{
+ key_type node(site_type(0, 1).sorted_index(0), site_type(1, 0).sorted_index(1));
+ key_type nodes[] = {
+ key_type(site_type(2, -3).sorted_index(2)),
+ key_type(site_type(2, -2).sorted_index(2)),
+ key_type(site_type(2, -1).sorted_index(2)),
+ key_type(site_type(2, 0).sorted_index(2)),
+ key_type(site_type(2, 1).sorted_index(2)),
+ key_type(site_type(2, 3).sorted_index(2)),
+ };
+ bool res[] = {false, true, true, true, true, true};
+ CHECK_NODE_COMPARISON(node, nodes, res, 6);
+}
+
+void node_comparison_test5()
+{
+ key_type node(site_type(0, 0).sorted_index(0), site_type(1, 2).sorted_index(1));
+ key_type nodes[] = {
+ key_type(site_type(2, -10).sorted_index(2)),
+ key_type(site_type(2, 0).sorted_index(2)),
+ key_type(site_type(2, 1).sorted_index(2)),
+ key_type(site_type(2, 2).sorted_index(2)),
+ key_type(site_type(2, 5).sorted_index(2)),
+ key_type(site_type(2, 20).sorted_index(2)),
+ };
+ bool res[] = {false, false, true, true, true, true};
+ CHECK_NODE_COMPARISON(node, nodes, res, 6);
+}
+
+void node_comparison_test6()
+{
+ key_type node(site_type(1, 1).sorted_index(1), site_type(0, 0).sorted_index(0));
+ key_type nodes[] = {
+ key_type(site_type(2, -3).sorted_index(2)),
+ key_type(site_type(2, -2).sorted_index(2)),
+ key_type(site_type(2, 0).sorted_index(2)),
+ key_type(site_type(2, 1).sorted_index(2)),
+ key_type(site_type(2, 2).sorted_index(2)),
+ key_type(site_type(2, 3).sorted_index(2)),
+ key_type(site_type(2, 5).sorted_index(2)),
+ };
+ bool res[] = {false, false, false, false, false, false, true};
+ CHECK_NODE_COMPARISON(node, nodes, res, 7);
+}
+
+void node_comparison_test7()
+{
+ key_type node(site_type(0, 0).sorted_index(0), site_type(0, 2).sorted_index(1));
+ key_type nodes[] = {
+ key_type(site_type(1, 0).sorted_index(2)),
+ key_type(site_type(1, 1).sorted_index(2)),
+ key_type(site_type(1, 2).sorted_index(2)),
+ };
+ bool res[] = {false, false, true};
+ CHECK_NODE_COMPARISON(node, nodes, res, 3);
+}
+
+void node_comparison_test8()
+{
+ key_type node(site_type(0, 0).sorted_index(0), site_type(1, 1).sorted_index(2));
+ key_type nodes[] = {
+ key_type(site_type(1, 0).sorted_index(1)),
+ key_type(site_type(1, 1).sorted_index(2)),
+ key_type(site_type(1, 2).sorted_index(3)),
+ key_type(site_type(1, 1).sorted_index(2), site_type(0, 0).sorted_index(0)),
+ };
+ bool res[] = {false, true, true, true};
+ CHECK_NODE_COMPARISON(node, nodes, res, 4);
+}
+
+void circle_formation_predicate_test1()
+{
+ site_type site1(0, 0);
+ site1.sorted_index(1);
+ site_type site2(-8, 0);
+ site2.sorted_index(0);
+ site_type site3(0, 6);
+ site3.sorted_index(2);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site1, site2, site3, -4.0, 3.0, 1.0);
+}
+
+void circle_formation_predicate_test2()
+{
+ int min_int = (std::numeric_limits<int>::min)();
+ int max_int = (std::numeric_limits<int>::max)();
+ site_type site1(min_int, min_int);
+ site1.sorted_index(0);
+ site_type site2(min_int, max_int);
+ site2.sorted_index(1);
+ site_type site3(max_int-1, max_int-1);
+ site3.sorted_index(2);
+ site_type site4(max_int, max_int);
+ site4.sorted_index(3);
+ CHECK_CIRCLE_EXISTENCE(site1, site2, site4, true);
+ CHECK_CIRCLE_EXISTENCE(site1, site3, site4, false);
+}
+
+void circle_formation_predicate_test3()
+{
+ site_type site1(-4, 0);
+ site1.sorted_index(0);
+ site_type site2(0, 4);
+ site2.sorted_index(4);
+ site_type site3(site1.point0(), site2.point0());
+ site3.sorted_index(1);
+ CHECK_CIRCLE_EXISTENCE(site1, site3, site2, false);
+ site_type site4(-2, 0);
+ site4.sorted_index(2);
+ site_type site5(0, 2);
+ site5.sorted_index(3);
+ CHECK_CIRCLE_EXISTENCE(site3, site4, site5, false);
+ CHECK_CIRCLE_EXISTENCE(site4, site5, site3, false);
+}
+
+void circle_formation_predicate_test4()
+{
+ site_type site1(-4, 0, -4, 20);
+ site1.sorted_index(0);
+ site_type site2(-2, 10);
+ site2.sorted_index(1);
+ site_type site3(4, 10);
+ site3.sorted_index(2);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site1, site2, site3, 1.0, 6.0, 6.0);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site3, site2, site1, 1.0, 14.0, 6.0);
+}
+
+void circle_formation_predicate_test5()
+{
+ site_type site1(1, 0, 7, 0);
+ site1.sorted_index(2);
+ site1.inverse();
+ site_type site2(-2, 4, 10, 4);
+ site2.sorted_index(0);
+ site_type site3(6, 2);
+ site3.sorted_index(3);
+ site_type site4(1, 0);
+ site4.sorted_index(1);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site3, site1, site2, 4.0, 2.0, 6.0);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site4, site2, site1, 1.0, 2.0, 3.0);
+}
+
+void circle_formation_predicate_test6()
+{
+ site_type site1(-1, 2, 8, -10);
+ site1.sorted_index(1);
+ site1.inverse();
+ site_type site2(-1, 0, 8, 12);
+ site2.sorted_index(0);
+ site_type site3(1, 1);
+ site3.sorted_index(2);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site3, site2, site1, 6.0, 1.0, 11.0);
+}
+
+void circle_formation_predicate_test7()
+{
+ site_type site1(1, 0, 6, 0);
+ site1.sorted_index(2);
+ site1.inverse();
+ site_type site2(-6, 4, 0, 12);
+ site2.sorted_index(0);
+ site_type site3(1, 0);
+ site3.sorted_index(1);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site3, site2, site1, 1.0, 5.0, 6.0);
+}
+
+void circle_formation_predicate_test8()
+{
+ site_type site1(1, 0, 5, 0);
+ site1.sorted_index(2);
+ site1.inverse();
+ site_type site2(0, 12, 8, 6);
+ site2.sorted_index(0);
+ site_type site3(1, 0);
+ site3.sorted_index(1);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site3, site2, site1, 1.0, 5.0, 6.0);
+}
+
+void circle_formation_predicate_test9()
+{
+ site_type site1(0, 0, 4, 0);
+ site1.sorted_index(1);
+ site_type site2(0, 0, 0, 4);
+ site2.sorted_index(0);
+ site_type site3(0, 4, 4, 4);
+ site3.sorted_index(2);
+ site1.inverse();
+ CHECK_CIRCLE_FORMATION_PREDICATE(site1, site2, site3, 2.0, 2.0, 4.0);
+}
+
+void circle_formation_predicate_test10()
+{
+ site_type site1(1, 0, 41, 30);
+ site1.sorted_index(1);
+ site_type site2(-39, 30, 1, 60);
+ site2.sorted_index(0);
+ site_type site3(1, 60, 41, 30);
+ site3.sorted_index(2);
+ site1.inverse();
+ CHECK_CIRCLE_FORMATION_PREDICATE(site1, site2, site3, 1.0, 30.0, 25.0);
+}
+
+void circle_formation_predicate_test11()
+{
+ site_type site1(0, 0, 0, 10);
+ site1.sorted_index(2);
+ site1.inverse();
+ site_type site2(-8, 10);
+ site2.sorted_index(0);
+ site_type site3(-7, 14, -1, 14);
+ site3.sorted_index(1);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site1, site2, site3, -4.0, 10.0, 0.0);
+}
+
+void circle_formation_predicate_test12()
+{
+ site_type site1(0, 0, 0, 10);
+ site1.sorted_index(2);
+ site1.inverse();
+ site_type site2(-8, 10);
+ site2.sorted_index(0);
+ site_type site3(-7, 15, -1, 15);
+ site3.sorted_index(1);
+ CHECK_CIRCLE_EXISTENCE(site1, site2, site3, false);
+}
+
+void circle_formation_predicate_test13()
+{
+ site_type site1(0, 0, 0, 10);
+ site1.sorted_index(2);
+ site1.inverse();
+ site_type site2(-7, -4, -1, -4);
+ site2.sorted_index(1);
+ site2.inverse();
+ site_type site3(-8, 0);
+ site3.sorted_index(0);
+ CHECK_CIRCLE_FORMATION_PREDICATE(site1, site2, site3, -4.0, 0.0, 0.0);
+}
+
+void circle_formation_predicate_test14()
+{
+ site_type site1(0, 0, 0, 10);
+ site1.sorted_index(2);
+ site1.inverse();
+ site_type site2(-7, -5, -1, -5);
+ site2.sorted_index(1);
+ site2.inverse();
+ site_type site3(-8, 0);
+ site3.sorted_index(0);
+ CHECK_CIRCLE_EXISTENCE(site1, site2, site3, false);
+}
+
+int main()
+{
+ orientation_test();
+ event_comparison_test1();
+ event_comparison_test2();
+ event_comparison_test3();
+ event_comparison_test4();
+ event_comparison_test5();
+ distance_predicate_test1();
+ distance_predicate_test2();
+ distance_predicate_test3();
+ distance_predicate_test4();
+ distance_predicate_test5();
+ distance_predicate_test6();
+ distance_predicate_test7();
+ distance_predicate_test8();
+ node_comparison_test1();
+ node_comparison_test2();
+ node_comparison_test3();
+ node_comparison_test4();
+ node_comparison_test5();
+ node_comparison_test6();
+ node_comparison_test7();
+ node_comparison_test8();
+ circle_formation_predicate_test1();
+ circle_formation_predicate_test2();
+ circle_formation_predicate_test3();
+ circle_formation_predicate_test4();
+ circle_formation_predicate_test5();
+ circle_formation_predicate_test6();
+ circle_formation_predicate_test7();
+ circle_formation_predicate_test8();
+ circle_formation_predicate_test9();
+ circle_formation_predicate_test10();
+ circle_formation_predicate_test11();
+ circle_formation_predicate_test12();
+ circle_formation_predicate_test13();
+ circle_formation_predicate_test14();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_robust_fpt_test.cpp b/src/boost/libs/polygon/test/voronoi_robust_fpt_test.cpp
new file mode 100644
index 000000000..918530691
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_robust_fpt_test.cpp
@@ -0,0 +1,405 @@
+// Boost.Polygon library voronoi_robust_fpt_test.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/detail/voronoi_ctypes.hpp>
+#include <boost/polygon/detail/voronoi_robust_fpt.hpp>
+#include <boost/random/mersenne_twister.hpp>
+#include <vector>
+#include <cmath>
+#include <ctime>
+
+using boost::polygon::detail::int32;
+using boost::polygon::detail::uint32;
+using boost::polygon::detail::int64;
+using boost::polygon::detail::fpt64;
+using boost::polygon::detail::efpt64;
+using boost::polygon::detail::extended_int;
+using boost::polygon::detail::extended_exponent_fpt;
+using boost::polygon::detail::robust_fpt;
+using boost::polygon::detail::robust_dif;
+using boost::polygon::detail::robust_sqrt_expr;
+using boost::polygon::detail::type_converter_fpt;
+using boost::polygon::detail::type_converter_efpt;
+using boost::polygon::detail::ulp_comparison;
+
+typedef robust_fpt<double> rfpt_type;
+typedef type_converter_fpt to_fpt_type;
+typedef type_converter_efpt to_efpt_type;
+type_converter_fpt to_fpt;
+
+void robust_fpt_constructors_test1()
+{
+ rfpt_type a = rfpt_type();
+ BOOST_TEST_EQ(a.fpv(), 0.0);
+ BOOST_TEST_EQ(a.re(), 0.0);
+ BOOST_TEST_EQ(a.ulp(), 0);
+}
+
+void robust_fpt_constructors_test2()
+{
+ rfpt_type a(10.0, 1.0);
+ BOOST_TEST_EQ(a.fpv(), 10.0);
+ BOOST_TEST_EQ(a.re(), 1.0);
+ BOOST_TEST_EQ(a.ulp(), 1.0);
+}
+
+void robust_fpt_constructors_test3()
+{
+ rfpt_type a(10.0);
+ BOOST_TEST_EQ(a.fpv(), 10.0);
+ BOOST_TEST_EQ(a.re(), 0.0);
+ BOOST_TEST_EQ(a.ulp(), 0.0);
+}
+
+void robust_fpt_constructors_test4()
+{
+ rfpt_type a(10.0, 3.0);
+ BOOST_TEST_EQ(a.fpv(), 10.0);
+ BOOST_TEST_EQ(a.re(), 3.0);
+ BOOST_TEST_EQ(a.ulp(), 3.0);
+
+ rfpt_type b(10.0, 2.75);
+ BOOST_TEST_EQ(b.fpv(), 10.0);
+ BOOST_TEST_EQ(b.re(), 2.75);
+ BOOST_TEST_EQ(b.ulp(), 2.75);
+}
+
+void robust_fpt_sum_test1()
+{
+ rfpt_type a(2.0, 5.0);
+ rfpt_type b(3.0, 4.0);
+ rfpt_type c = a + b;
+ BOOST_TEST_EQ(c.fpv(), 5.0);
+ BOOST_TEST_EQ(c.re(), 6.0);
+ BOOST_TEST_EQ(c.ulp(), 6.0);
+
+ c += b;
+ BOOST_TEST_EQ(c.fpv(), 8.0);
+ BOOST_TEST_EQ(c.re(), 7.0);
+ BOOST_TEST_EQ(c.ulp(), 7.0);
+}
+
+void robust_fpt_sum_test2()
+{
+ rfpt_type a(3.0, 2.0);
+ rfpt_type b(-2.0, 3.0);
+ rfpt_type c = a + b;
+ BOOST_TEST_EQ(c.fpv(), 1.0);
+ BOOST_TEST_EQ(c.re(), 13.0);
+ BOOST_TEST_EQ(c.ulp(), 13.0);
+
+ c += b;
+ BOOST_TEST_EQ(c.fpv(), -1.0);
+ BOOST_TEST_EQ(c.re(), 20.0);
+ BOOST_TEST_EQ(c.ulp(), 20.0);
+}
+
+void robust_fpt_dif_test1()
+{
+ rfpt_type a(2.0, 5.0);
+ rfpt_type b(-3.0, 4.0);
+ rfpt_type c = a - b;
+ BOOST_TEST_EQ(c.fpv(), 5.0);
+ BOOST_TEST_EQ(c.re(), 6.0);
+ BOOST_TEST_EQ(c.ulp(), 6.0);
+
+ c -= b;
+ BOOST_TEST_EQ(c.fpv(), 8.0);
+ BOOST_TEST_EQ(c.re(), 7.0);
+ BOOST_TEST_EQ(c.ulp(), 7.0);
+}
+
+void robust_fpt_dif_test2()
+{
+ rfpt_type a(3.0, 2.0);
+ rfpt_type b(2.0, 3.0);
+ rfpt_type c = a - b;
+ BOOST_TEST_EQ(c.fpv(), 1.0);
+ BOOST_TEST_EQ(c.re(), 13.0);
+ BOOST_TEST_EQ(c.ulp(), 13.0);
+
+ c -= b;
+ BOOST_TEST_EQ(c.fpv(), -1.0);
+ BOOST_TEST_EQ(c.re(), 20.0);
+ BOOST_TEST_EQ(c.ulp(), 20.0);
+}
+
+void robust_fpt_mult_test3()
+{
+ rfpt_type a(2.0, 3.0);
+ rfpt_type b(4.0, 1.0);
+ rfpt_type c = a * b;
+ BOOST_TEST_EQ(c.fpv(), 8.0);
+ BOOST_TEST_EQ(c.re(), 5.0);
+ BOOST_TEST_EQ(c.ulp(), 5.0);
+
+ c *= b;
+ BOOST_TEST_EQ(c.fpv(), 32.0);
+ BOOST_TEST_EQ(c.re(), 7.0);
+ BOOST_TEST_EQ(c.ulp(), 7.0);
+}
+
+void robust_fpt_div_test1()
+{
+ rfpt_type a(2.0, 3.0);
+ rfpt_type b(4.0, 1.0);
+ rfpt_type c = a / b;
+ BOOST_TEST_EQ(c.fpv(), 0.5);
+ BOOST_TEST_EQ(c.re(), 5.0);
+ BOOST_TEST_EQ(c.ulp(), 5.0);
+
+ c /= b;
+ BOOST_TEST_EQ(c.fpv(), 0.125);
+ BOOST_TEST_EQ(c.re(), 7.0);
+ BOOST_TEST_EQ(c.ulp(), 7.0);
+}
+
+void robust_dif_constructors_test()
+{
+ robust_dif<int> rd1;
+ BOOST_TEST_EQ(rd1.pos(), 0);
+ BOOST_TEST_EQ(rd1.neg(), 0);
+ BOOST_TEST_EQ(rd1.dif(), 0);
+
+ robust_dif<int> rd2(1);
+ BOOST_TEST_EQ(rd2.pos(), 1);
+ BOOST_TEST_EQ(rd2.neg(), 0);
+ BOOST_TEST_EQ(rd2.dif(), 1);
+
+ robust_dif<int> rd3(-1);
+ BOOST_TEST_EQ(rd3.pos(), 0);
+ BOOST_TEST_EQ(rd3.neg(), 1);
+ BOOST_TEST_EQ(rd3.dif(), -1);
+
+ robust_dif<int> rd4(1, 2);
+ BOOST_TEST_EQ(rd4.pos(), 1);
+ BOOST_TEST_EQ(rd4.neg(), 2);
+ BOOST_TEST_EQ(rd4.dif(), -1);
+}
+
+void robust_dif_operators_test1()
+{
+ robust_dif<int> a(5, 2), b(1, 10);
+ int dif_a = a.dif();
+ int dif_b = b.dif();
+ robust_dif<int> sum = a + b;
+ robust_dif<int> dif = a - b;
+ robust_dif<int> mult = a * b;
+ robust_dif<int> umin = -a;
+ BOOST_TEST_EQ(sum.dif(), dif_a + dif_b);
+ BOOST_TEST_EQ(dif.dif(), dif_a - dif_b);
+ BOOST_TEST_EQ(mult.dif(), dif_a * dif_b);
+ BOOST_TEST_EQ(umin.dif(), -dif_a);
+}
+
+void robust_dif_operators_test2()
+{
+ robust_dif<int> a(5, 2);
+ for (int b = -3; b <= 3; b += 6) {
+ int dif_a = a.dif();
+ int dif_b = b;
+ robust_dif<int> sum = a + b;
+ robust_dif<int> dif = a - b;
+ robust_dif<int> mult = a * b;
+ robust_dif<int> div = a / b;
+ BOOST_TEST_EQ(sum.dif(), dif_a + dif_b);
+ BOOST_TEST_EQ(dif.dif(), dif_a - dif_b);
+ BOOST_TEST_EQ(mult.dif(), dif_a * dif_b);
+ BOOST_TEST_EQ(div.dif(), dif_a / dif_b);
+ }
+}
+
+void robust_dif_operators_test3()
+{
+ robust_dif<int> b(5, 2);
+ for (int a = -3; a <= 3; a += 6) {
+ int dif_a = a;
+ int dif_b = b.dif();
+ robust_dif<int> sum = a + b;
+ robust_dif<int> dif = a - b;
+ robust_dif<int> mult = a * b;
+ BOOST_TEST_EQ(sum.dif(), dif_a + dif_b);
+ BOOST_TEST_EQ(dif.dif(), dif_a - dif_b);
+ BOOST_TEST_EQ(mult.dif(), dif_a * dif_b);
+ }
+}
+
+void robust_dif_operators_test4()
+{
+ std::vector< robust_dif<int> > a4(4, robust_dif<int>(5, 2));
+ std::vector< robust_dif<int> > b4(4, robust_dif<int>(1, 2));
+ std::vector< robust_dif<int> > c4 = a4;
+ c4[0] += b4[0];
+ c4[1] -= b4[1];
+ c4[2] *= b4[2];
+ BOOST_TEST_EQ(c4[0].dif(), a4[0].dif() + b4[0].dif());
+ BOOST_TEST_EQ(c4[1].dif(), a4[1].dif() - b4[1].dif());
+ BOOST_TEST_EQ(c4[2].dif(), a4[2].dif() * b4[2].dif());
+ a4[0] += b4[0].dif();
+ a4[1] -= b4[1].dif();
+ a4[2] *= b4[2].dif();
+ a4[3] /= b4[3].dif();
+ BOOST_TEST_EQ(c4[0].dif(), a4[0].dif());
+ BOOST_TEST_EQ(c4[1].dif(), a4[1].dif());
+ BOOST_TEST_EQ(c4[2].dif(), a4[2].dif());
+ BOOST_TEST_EQ(c4[3].dif() / b4[3].dif(), a4[3].dif());
+}
+
+void robust_sqrt_expr_test1()
+{
+ robust_sqrt_expr<int32, fpt64, to_fpt_type> sqrt_expr;
+ int32 A[1] = {10};
+ int32 B[1] = {100};
+ BOOST_TEST_EQ(sqrt_expr.eval1(A, B), 100.0);
+}
+
+void robust_sqrt_expr_test2()
+{
+ robust_sqrt_expr<int32, fpt64, to_fpt_type> sqrt_expr;
+ int32 A[2] = {10, 30};
+ int32 B[2] = {400, 100};
+ BOOST_TEST_EQ(sqrt_expr.eval2(A, B), 500.0);
+}
+
+void robust_sqrt_expr_test3()
+{
+ robust_sqrt_expr<int32, fpt64, to_fpt_type> sqrt_expr;
+ int32 A[2] = {10, -30};
+ int32 B[2] = {400, 100};
+ BOOST_TEST_EQ(sqrt_expr.eval2(A, B), -100.0);
+}
+
+void robust_sqrt_expr_test4()
+{
+ robust_sqrt_expr<int32, fpt64, to_fpt_type> sqrt_expr;
+ int32 A[3] = {10, 30, 20};
+ int32 B[3] = {4, 1, 9};
+ BOOST_TEST_EQ(sqrt_expr.eval3(A, B), 110.0);
+}
+
+void robust_sqrt_expr_test5()
+{
+ robust_sqrt_expr<int32, fpt64, to_fpt_type> sqrt_expr;
+ int32 A[3] = {10, 30, -20};
+ int32 B[3] = {4, 1, 9};
+ BOOST_TEST_EQ(sqrt_expr.eval3(A, B), -10.0);
+}
+
+void robust_sqrt_expr_test6()
+{
+ robust_sqrt_expr<int32, fpt64, to_fpt_type> sqrt_expr;
+ int32 A[4] = {10, 30, 20, 5};
+ int32 B[4] = {4, 1, 9, 16};
+ BOOST_TEST_EQ(sqrt_expr.eval4(A, B), 130.0);
+}
+
+void robust_sqrt_expr_test7()
+{
+ robust_sqrt_expr<int32, fpt64, to_fpt_type> sqrt_expr;
+ int32 A[4] = {10, 30, -20, -5};
+ int32 B[4] = {4, 1, 9, 16};
+ BOOST_TEST_EQ(sqrt_expr.eval4(A, B), -30.0);
+}
+
+void robust_sqrt_expr_test8()
+{
+ typedef extended_int<16> eint512;
+ robust_sqrt_expr<eint512, efpt64, to_efpt_type> sqrt_expr;
+ int32 A[4] = {1000, 3000, -2000, -500};
+ int32 B[4] = {400, 100, 900, 1600};
+ eint512 AA[4], BB[4];
+ for (std::size_t i = 0; i < 4; ++i) {
+ AA[i] = A[i];
+ BB[i] = B[i];
+ }
+ BOOST_TEST_EQ(to_fpt(sqrt_expr.eval4(AA, BB)), -30000.0);
+}
+
+template <typename _int, typename _fpt>
+class sqrt_expr_tester {
+ public:
+ static const std::size_t MX_SQRTS = 4;
+
+ bool run() {
+ static boost::mt19937 gen(static_cast<uint32>(time(NULL)));
+ bool ret_val = true;
+ for (std::size_t i = 0; i < MX_SQRTS; ++i) {
+ a[i] = gen() & 1048575;
+ int64 temp = gen() & 1048575;
+ b[i] = temp * temp;
+ }
+ uint32 mask = (1 << MX_SQRTS);
+ for (std::size_t i = 0; i < mask; i++) {
+ fpt64 expected_val = 0.0;
+ for (std::size_t j = 0; j < MX_SQRTS; j++) {
+ if (i & (1 << j)) {
+ A[j] = a[j];
+ B[j] = b[j];
+ expected_val += static_cast<fpt64>(a[j]) *
+ std::sqrt(static_cast<fpt64>(b[j]));
+ } else {
+ A[j] = -a[j];
+ B[j] = b[j];
+ expected_val -= static_cast<fpt64>(a[j]) *
+ std::sqrt(static_cast<fpt64>(b[j]));
+ }
+ }
+ fpt64 received_val = to_fpt(sqrt_expr_.eval4(A, B));
+ ret_val &= ulp_cmp(expected_val, received_val, 25) ==
+ ulp_comparison<fpt64>::EQUAL;
+ }
+ return ret_val;
+ }
+
+ private:
+ robust_sqrt_expr<_int, _fpt, to_efpt_type> sqrt_expr_;
+ ulp_comparison<fpt64> ulp_cmp;
+ _int A[MX_SQRTS];
+ _int B[MX_SQRTS];
+ int64 a[MX_SQRTS];
+ int64 b[MX_SQRTS];
+};
+
+void mpz_sqrt_evaluator_test()
+{
+ typedef extended_int<16> eint512;
+ sqrt_expr_tester<eint512, efpt64> tester;
+ for (int i = 0; i < 2000; ++i)
+ BOOST_TEST(tester.run());
+}
+
+int main()
+{
+ robust_fpt_constructors_test1();
+ robust_fpt_constructors_test2();
+ robust_fpt_constructors_test3();
+ robust_fpt_constructors_test4();
+ robust_fpt_sum_test1();
+ robust_fpt_sum_test2();
+ robust_fpt_dif_test1();
+ robust_fpt_dif_test2();
+ robust_fpt_mult_test3();
+ robust_fpt_div_test1();
+ robust_dif_constructors_test();
+ robust_dif_operators_test1();
+ robust_dif_operators_test2();
+ robust_dif_operators_test3();
+ robust_dif_operators_test4();
+ robust_sqrt_expr_test1();
+ robust_sqrt_expr_test2();
+ robust_sqrt_expr_test3();
+ robust_sqrt_expr_test4();
+ robust_sqrt_expr_test5();
+ robust_sqrt_expr_test6();
+ robust_sqrt_expr_test7();
+ robust_sqrt_expr_test8();
+ mpz_sqrt_evaluator_test();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_structures_test.cpp b/src/boost/libs/polygon/test/voronoi_structures_test.cpp
new file mode 100644
index 000000000..1693c317e
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_structures_test.cpp
@@ -0,0 +1,150 @@
+// Boost.Polygon library voronoi_structures_test.cpp file
+
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/polygon/detail/voronoi_structures.hpp>
+#include <boost/polygon/voronoi_geometry_type.hpp>
+#include <functional>
+#include <vector>
+
+using namespace boost::polygon::detail;
+using namespace boost::polygon;
+
+typedef point_2d<int> point_type;
+typedef site_event<int> site_type;
+typedef circle_event<int> circle_type;
+typedef ordered_queue<int, std::greater<int> > ordered_queue_type;
+typedef beach_line_node_key<int> node_key_type;
+typedef beach_line_node_data<int, int> node_data_type;
+
+void point_2d_test1()
+{
+ point_type p(1, 2);
+ BOOST_TEST_EQ(1, p.x());
+ BOOST_TEST_EQ(2, p.y());
+ p.x(3);
+ BOOST_TEST_EQ(3, p.x());
+ p.y(4);
+ BOOST_TEST_EQ(4, p.y());
+}
+
+void site_event_test1()
+{
+ site_type s(1, 2);
+ s.sorted_index(1);
+ s.initial_index(2);
+ s.source_category(SOURCE_CATEGORY_SEGMENT_START_POINT);
+ BOOST_TEST_EQ(1, s.x0());
+ BOOST_TEST_EQ(1, s.x1());
+ BOOST_TEST_EQ(2, s.y0());
+ BOOST_TEST_EQ(2, s.y1());
+ BOOST_TEST(s.is_point());
+ BOOST_TEST(!s.is_segment());
+ BOOST_TEST(!s.is_inverse());
+ BOOST_TEST_EQ(1, s.sorted_index());
+ BOOST_TEST_EQ(2, s.initial_index());
+ BOOST_TEST_EQ(SOURCE_CATEGORY_SEGMENT_START_POINT, s.source_category());
+}
+
+void site_event_test2()
+{
+ site_type s(1, 2, 3, 4);
+ s.sorted_index(1);
+ s.initial_index(2);
+ s.source_category(SOURCE_CATEGORY_INITIAL_SEGMENT);
+ BOOST_TEST_EQ(1, s.x0());
+ BOOST_TEST_EQ(2, s.y0());
+ BOOST_TEST_EQ(3, s.x1());
+ BOOST_TEST_EQ(4, s.y1());
+ BOOST_TEST(!s.is_point());
+ BOOST_TEST(s.is_segment());
+ BOOST_TEST(!s.is_inverse());
+ BOOST_TEST_EQ(SOURCE_CATEGORY_INITIAL_SEGMENT, s.source_category());
+
+ s.inverse();
+ BOOST_TEST_EQ(3, s.x0());
+ BOOST_TEST_EQ(4, s.y0());
+ BOOST_TEST_EQ(1, s.x1());
+ BOOST_TEST_EQ(2, s.y1());
+ BOOST_TEST(s.is_inverse());
+ BOOST_TEST_EQ(SOURCE_CATEGORY_INITIAL_SEGMENT, s.source_category());
+}
+
+void circle_event_test()
+{
+ circle_type c(0, 1, 2);
+ BOOST_TEST_EQ(0, c.x());
+ BOOST_TEST_EQ(1, c.y());
+ BOOST_TEST_EQ(2, c.lower_x());
+ BOOST_TEST_EQ(1, c.lower_y());
+ BOOST_TEST(c.is_active());
+ c.x(3);
+ c.y(4);
+ c.lower_x(5);
+ BOOST_TEST_EQ(3, c.x());
+ BOOST_TEST_EQ(4, c.y());
+ BOOST_TEST_EQ(5, c.lower_x());
+ BOOST_TEST_EQ(4, c.lower_y());
+ c.deactivate();
+ BOOST_TEST(!c.is_active());
+}
+
+void ordered_queue_test()
+{
+ ordered_queue_type q;
+ BOOST_TEST(q.empty());
+ std::vector<int*> vi;
+ for (int i = 0; i < 20; ++i)
+ vi.push_back(&q.push(i));
+ for (int i = 0; i < 20; ++i)
+ *vi[i] <<= 1;
+ BOOST_TEST(!q.empty());
+ for (int i = 0; i < 20; ++i, q.pop())
+ BOOST_TEST_EQ(i << 1, q.top());
+ BOOST_TEST(q.empty());
+}
+
+void beach_line_node_key_test()
+{
+ node_key_type key(1);
+ BOOST_TEST_EQ(1, key.left_site());
+ BOOST_TEST_EQ(1, key.right_site());
+ key.left_site(2);
+ BOOST_TEST_EQ(2, key.left_site());
+ BOOST_TEST_EQ(1, key.right_site());
+ key.right_site(3);
+ BOOST_TEST_EQ(2, key.left_site());
+ BOOST_TEST_EQ(3, key.right_site());
+}
+
+void beach_line_node_data_test()
+{
+ node_data_type node_data(NULL);
+ BOOST_TEST(node_data.edge() == NULL);
+ BOOST_TEST(node_data.circle_event() == NULL);
+ int data = 4;
+ node_data.circle_event(&data);
+ BOOST_TEST(node_data.edge() == NULL);
+ BOOST_TEST(node_data.circle_event() == &data);
+ node_data.edge(&data);
+ BOOST_TEST(node_data.edge() == &data);
+ BOOST_TEST(node_data.circle_event() == &data);
+}
+
+int main()
+{
+ point_2d_test1();
+ site_event_test1();
+ site_event_test2();
+ circle_event_test();
+ ordered_queue_test();
+ beach_line_node_key_test();
+ beach_line_node_data_test();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/polygon/test/voronoi_test_helper.hpp b/src/boost/libs/polygon/test/voronoi_test_helper.hpp
new file mode 100644
index 000000000..61c4630a9
--- /dev/null
+++ b/src/boost/libs/polygon/test/voronoi_test_helper.hpp
@@ -0,0 +1,260 @@
+// Boost.Polygon library voronoi_test_helper.hpp file
+
+// Copyright Andrii Sydorchuk 2010-2011.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef VORONOI_TEST_HELPER
+#define VORONOI_TEST_HELPER
+
+#include <boost/polygon/polygon.hpp>
+#include <algorithm>
+#include <iostream>
+#include <iterator>
+#include <fstream>
+#include <map>
+#include <vector>
+#include <utility>
+
+using namespace boost::polygon;
+
+namespace voronoi_test_helper {
+
+enum kOrientation {
+ RIGHT = -1,
+ COLLINEAR = 0,
+ LEFT = 1
+};
+
+template <typename VERTEX>
+kOrientation get_orientation(
+ const VERTEX& v1, const VERTEX& v2, const VERTEX& v3) {
+ typename VERTEX::coordinate_type lhs = (v2.x() - v1.x()) * (v3.y() - v2.y());
+ typename VERTEX::coordinate_type rhs = (v2.y() - v1.y()) * (v3.x() - v2.x());
+ if (lhs == rhs) {
+ return COLLINEAR;
+ }
+ return (lhs < rhs) ? RIGHT : LEFT;
+}
+
+template <typename OUTPUT>
+bool verify_cell_convexity(const OUTPUT& output) {
+ typename OUTPUT::const_cell_iterator cell_it;
+ for (cell_it = output.cells().begin();
+ cell_it != output.cells().end(); cell_it++) {
+ const typename OUTPUT::edge_type* edge = cell_it->incident_edge();
+ if (edge)
+ do {
+ if (edge->next()->prev() != edge) {
+ return false;
+ }
+ if (edge->cell() != &(*cell_it)) {
+ return false;
+ }
+ if (edge->vertex1() != edge->next()->vertex0()) {
+ return false;
+ }
+ if (edge->vertex0() != NULL &&
+ edge->vertex1() != NULL &&
+ edge->next()->vertex1() != NULL) {
+ if (get_orientation(*edge->vertex0(),
+ *edge->vertex1(),
+ *edge->next()->vertex1()) != LEFT) {
+ return false;
+ }
+ }
+ edge = edge->next();
+ } while (edge != cell_it->incident_edge());
+ }
+ return true;
+}
+
+template <typename OUTPUT>
+bool verify_incident_edges_ccw_order(const OUTPUT& output) {
+ typedef typename OUTPUT::edge_type voronoi_edge_type;
+ typename OUTPUT::const_vertex_iterator vertex_it;
+ for (vertex_it = output.vertices().begin();
+ vertex_it != output.vertices().end(); vertex_it++) {
+ if (vertex_it->is_degenerate())
+ continue;
+ const voronoi_edge_type* edge = vertex_it->incident_edge();
+ do {
+ const voronoi_edge_type* next_edge = edge->rot_next();
+ if (edge->vertex0() != next_edge->vertex0()) {
+ return false;
+ }
+ if (edge->vertex1() != NULL && next_edge->vertex1() != NULL &&
+ get_orientation(*edge->vertex1(),
+ *edge->vertex0(),
+ *next_edge->vertex1()) == LEFT) {
+ return false;
+ }
+ edge = edge->rot_next();
+ } while (edge != vertex_it->incident_edge());
+ }
+ return true;
+}
+
+template <typename VERTEX>
+struct cmp {
+ bool operator()(const VERTEX& v1, const VERTEX& v2) const {
+ if (v1.x() != v2.x())
+ return v1.x() < v2.x();
+ return v1.y() < v2.y();
+ }
+};
+
+template <typename Output>
+bool verfiy_no_line_edge_intersections(const Output &output) {
+ // Create map from edges with first point less than the second one.
+ // Key is the first point of the edge, value is a vector of second points
+ // with the same first point.
+ typedef typename Output::vertex_type vertex_type;
+ cmp<vertex_type> comparator;
+ std::map< vertex_type, std::vector<vertex_type>, cmp<vertex_type> > edge_map;
+ typename Output::const_edge_iterator edge_it;
+ for (edge_it = output.edges().begin();
+ edge_it != output.edges().end(); edge_it++) {
+ if (edge_it->is_finite()) {
+ if (comparator(*edge_it->vertex0(), *edge_it->vertex1())) {
+ edge_map[*edge_it->vertex0()].push_back(*edge_it->vertex1());
+ }
+ }
+ }
+ return !intersection_check(edge_map);
+}
+
+template <typename Point2D>
+bool intersection_check(
+ const std::map< Point2D, std::vector<Point2D>, cmp<Point2D> > &edge_map) {
+ // Iterate over map of edges and check if there are any intersections.
+ // All the edges are stored by the low x value. That's why we iterate
+ // left to right checking for intersections between all pairs of edges
+ // that overlap in the x dimension.
+ // Complexity. Approximately N*sqrt(N). Worst case N^2.
+ typedef Point2D point_type;
+ typedef typename point_type::coordinate_type coordinate_type;
+ typedef typename std::map<point_type, std::vector<point_type>, cmp<Point2D> >::const_iterator
+ edge_map_iterator;
+ typedef typename std::vector<point_type>::size_type size_type;
+ edge_map_iterator edge_map_it1, edge_map_it2, edge_map_it_bound;
+ for (edge_map_it1 = edge_map.begin();
+ edge_map_it1 != edge_map.end(); edge_map_it1++) {
+ const point_type &point1 = edge_map_it1->first;
+ for (size_type i = 0; i < edge_map_it1->second.size(); i++) {
+ const point_type &point2 = edge_map_it1->second[i];
+ coordinate_type min_y1 = (std::min)(point1.y(), point2.y());
+ coordinate_type max_y1 = (std::max)(point1.y(), point2.y());
+
+ // Find the first edge with greater or equal first point.
+ edge_map_it_bound = edge_map.lower_bound(point2);
+
+ edge_map_it2 = edge_map_it1;
+ edge_map_it2++;
+ for (; edge_map_it2 != edge_map_it_bound; edge_map_it2++) {
+ const point_type &point3 = edge_map_it2->first;
+ for (size_type j = 0; j < edge_map_it2->second.size(); j++) {
+ const point_type &point4 = edge_map_it2->second[j];
+ coordinate_type min_y2 = (std::min)(point3.y(), point4.y());
+ coordinate_type max_y2 = (std::max)(point3.y(), point4.y());
+
+ // In most cases it is enought to make
+ // simple intersection check in the y dimension.
+ if (!(max_y1 > min_y2 && max_y2 > min_y1))
+ continue;
+
+ // Intersection check.
+ if (get_orientation(point1, point2, point3) *
+ get_orientation(point1, point2, point4) == RIGHT &&
+ get_orientation(point3, point4, point1) *
+ get_orientation(point3, point4, point2) == RIGHT)
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
+enum kVerification {
+ CELL_CONVEXITY = 1,
+ INCIDENT_EDGES_CCW_ORDER = 2,
+ NO_HALF_EDGE_INTERSECTIONS = 4,
+ FAST_VERIFICATION = 3,
+ COMPLETE_VERIFICATION = 7
+};
+
+template <typename Output>
+bool verify_output(const Output &output, kVerification mask) {
+ bool result = true;
+ if (mask & CELL_CONVEXITY)
+ result &= verify_cell_convexity(output);
+ if (mask & INCIDENT_EDGES_CCW_ORDER)
+ result &= verify_incident_edges_ccw_order(output);
+ if (mask & NO_HALF_EDGE_INTERSECTIONS)
+ result &= verfiy_no_line_edge_intersections(output);
+ return result;
+}
+
+template <typename PointIterator>
+void save_points(
+ PointIterator first, PointIterator last, const char* file_name) {
+ std::ofstream ofs(file_name);
+ ofs << std::distance(first, last) << std::endl;
+ for (PointIterator it = first; it != last; ++it) {
+ ofs << it->x() << " " << it->y() << std::endl;
+ }
+ ofs.close();
+}
+
+template <typename SegmentIterator>
+void save_segments(
+ SegmentIterator first, SegmentIterator last, const char* file_name) {
+ std::ofstream ofs(file_name);
+ ofs << std::distance(first, last) << std::endl;
+ for (SegmentIterator it = first; it != last; ++it) {
+ ofs << it->low().x() << " " << it->low().y() << " ";
+ ofs << it->high().x() << " " << it->high().y() << std::endl;
+ }
+ ofs.close();
+}
+
+template <typename T>
+void clean_segment_set(std::vector< segment_data<T> >& data) {
+ typedef T Unit;
+ typedef typename scanline_base<Unit>::Point Point;
+ typedef typename scanline_base<Unit>::half_edge half_edge;
+ typedef int segment_id;
+ std::vector<std::pair<half_edge, segment_id> > half_edges;
+ std::vector<std::pair<half_edge, segment_id> > half_edges_out;
+ segment_id id = 0;
+ half_edges.reserve(data.size());
+ for (typename std::vector< segment_data<T> >::iterator it = data.begin();
+ it != data.end(); ++it) {
+ Point l = it->low();
+ Point h = it->high();
+ half_edges.push_back(std::make_pair(half_edge(l, h), id++));
+ }
+ half_edges_out.reserve(half_edges.size());
+ // Apparently no need to pre-sort data when calling validate_scan.
+ line_intersection<Unit>::validate_scan(
+ half_edges_out, half_edges.begin(), half_edges.end());
+ std::vector< segment_data<T> > result;
+ result.reserve(half_edges_out.size());
+ for (std::size_t i = 0; i < half_edges_out.size(); ++i) {
+ id = half_edges_out[i].second;
+ Point l = half_edges_out[i].first.first;
+ Point h = half_edges_out[i].first.second;
+ segment_data<T> orig_seg = data[id];
+ if (orig_seg.high() < orig_seg.low())
+ std::swap(l, h);
+ result.push_back(segment_data<T>(l, h));
+ }
+ std::swap(result, data);
+}
+} // voronoi_test_helper
+
+#endif