diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/polygon | |
parent | Initial commit. (diff) | |
download | ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
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 00000000..931f58a1 --- /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 00000000..cbae96c1 --- /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 00000000..53c19a3a --- /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 Binary files differnew file mode 100644 index 00000000..c3825054 --- /dev/null +++ b/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_points.png 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 Binary files differnew file mode 100644 index 00000000..0bbc0362 --- /dev/null +++ b/src/boost/libs/polygon/benchmark/benchmark_results/plots/benchmark_segments.png 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 00000000..a9fb87f4 --- /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 00000000..bb7e3028 --- /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 00000000..8b8328c6 --- /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 00000000..75564a97 --- /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 00000000..70780206 --- /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 00000000..a8dc212c --- /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 00000000..665c82ed --- /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 00000000..f42dea1d --- /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 00000000..4599031f --- /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 00000000..5bbb057e --- /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 00000000..486bd911 --- /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 00000000..42924605 --- /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 00000000..bb5a50bd --- /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 00000000..7825f926 --- /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 00000000..064dded3 --- /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 00000000..af811fe6 --- /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 00000000..65985418 --- /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 00000000..863e93fb --- /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 00000000..3dc6cf98 --- /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 00000000..34ec6a54 --- /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 00000000..c338d977 --- /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 00000000..5b553c0d --- /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 00000000..0b455147 --- /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 00000000..fdbbf7a7 --- /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 00000000..c64ab212 --- /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 00000000..bbadf557 --- /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 00000000..eb7aea42 --- /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 00000000..88ac7796 --- /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 00000000..9f4b6f05 --- /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 00000000..99f5f0c5 --- /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 00000000..4dbbd936 --- /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 00000000..2573f612 --- /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 00000000..a14a3f91 --- /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 00000000..494c527c --- /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 00000000..72b1accd --- /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 00000000..f228af2a --- /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 00000000..4deb8868 --- /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 00000000..57e3cccd --- /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 00000000..013611c3 --- /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 00000000..4068a329 --- /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 00000000..c1e81b4b --- /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 00000000..c4212531 --- /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 00000000..07849421 --- /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 00000000..75cb14a6 --- /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 00000000..66ac2d8b --- /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 00000000..a6eeea27 --- /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 00000000..834264e3 --- /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 00000000..710e8a8c --- /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 00000000..1ed194d6 --- /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 00000000..3ca79ed6 --- /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 00000000..fde6cac2 --- /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 00000000..d60d5cee --- /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 00000000..40617faa --- /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 00000000..65514eed --- /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 00000000..d4e0b97d --- /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 00000000..dce66e78 --- /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 00000000..c73b72cd --- /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 00000000..552fee8e --- /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 00000000..66a50f70 --- /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 00000000..ed187312 --- /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 00000000..bf55be4f --- /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 00000000..76ef90de --- /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 00000000..57d7726d --- /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 00000000..ccddfcb6 --- /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 00000000..b4cf7e03 --- /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 00000000..74c4d69f --- /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 00000000..5ff83ebc --- /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 00000000..bd8f67cf --- /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 00000000..d93dfb4c --- /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 00000000..a8b85366 --- /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 00000000..7de80dee --- /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 00000000..61eb7d56 --- /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 00000000..877def64 --- /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 00000000..8beb1d51 --- /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 00000000..4ef0f59a --- /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 00000000..9f01d2fb --- /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 00000000..886f56df --- /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 00000000..75aa2abc --- /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 00000000..6b4eda52 --- /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 00000000..df514ff5 --- /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 00000000..08389494 --- /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 00000000..eda3d149 --- /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 00000000..5e30486b --- /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 00000000..724c6d01 --- /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 00000000..29d933ab --- /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 00000000..1614082b --- /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 00000000..45f9dd36 --- /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 00000000..0278f75b --- /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 00000000..0684c815 --- /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 00000000..0fbf4bcb --- /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 00000000..df3e8f92 --- /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 00000000..a09a125c --- /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 00000000..a43fcf3a --- /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 00000000..04742bb0 --- /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 00000000..72905d18 --- /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 00000000..395e24d5 --- /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 00000000..b287e932 --- /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 00000000..427ee9cf --- /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 00000000..700f222b --- /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 00000000..f4270e3e --- /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 00000000..5263a53f --- /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 00000000..b49d69d8 --- /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 00000000..73e87f80 --- /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 00000000..178dfba3 --- /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 00000000..c1959b73 --- /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 00000000..e379eada --- /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 00000000..bb01d6d9 --- /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 00000000..0ae016b0 --- /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 00000000..7c04741f --- /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 00000000..267e5416 --- /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 00000000..980c7f61 --- /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 00000000..011dbaee --- /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 00000000..77b69472 --- /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 00000000..f959ec61 --- /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 00000000..e8fa87c1 --- /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 00000000..1d27d982 --- /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 00000000..401f1259 --- /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 00000000..4d3ca29d --- /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 00000000..c35bfd7c --- /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 00000000..ce38d7a8 --- /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 00000000..46952bd8 --- /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 Binary files differnew file mode 100644 index 00000000..abb16fac --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_001.png 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 Binary files differnew file mode 100644 index 00000000..3e707daf --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_002.png 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 Binary files differnew file mode 100644 index 00000000..de62fd7d --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_003.png 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 Binary files differnew file mode 100644 index 00000000..a89a4524 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_004.png 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 Binary files differnew file mode 100644 index 00000000..2b26dcc3 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_005.png 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 Binary files differnew file mode 100644 index 00000000..2fbdcb73 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_006.png 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 Binary files differnew file mode 100644 index 00000000..74fcec91 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_007.png 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 Binary files differnew file mode 100644 index 00000000..17105a1f --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_008.png 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 Binary files differnew file mode 100644 index 00000000..b5423620 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_009.png 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 Binary files differnew file mode 100644 index 00000000..a1d1984e --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_010.png 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 Binary files differnew file mode 100644 index 00000000..3b689b46 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_011.png 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 Binary files differnew file mode 100644 index 00000000..1e3f916d --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/polygon/polygon_012.png 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 Binary files differnew file mode 100644 index 00000000..e84069fc --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_001.png 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 Binary files differnew file mode 100644 index 00000000..384a35c3 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_002.png 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 Binary files differnew file mode 100644 index 00000000..66dc11ef --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_003.png 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 Binary files differnew file mode 100644 index 00000000..7d134e28 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_004.png 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 Binary files differnew file mode 100644 index 00000000..9715acbc --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_005.png 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 Binary files differnew file mode 100644 index 00000000..585f29cd --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_006.png 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 Binary files differnew file mode 100644 index 00000000..8d2b31b2 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_007.png 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 Binary files differnew file mode 100644 index 00000000..99c27aa8 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_008.png 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 Binary files differnew file mode 100644 index 00000000..4aff6d9d --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_009.png 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 Binary files differnew file mode 100644 index 00000000..305bade5 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_010.png 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 Binary files differnew file mode 100644 index 00000000..625ef724 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_011.png 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 Binary files differnew file mode 100644 index 00000000..8bd48644 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_012.png 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 Binary files differnew file mode 100644 index 00000000..f4586746 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_013.png 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 Binary files differnew file mode 100644 index 00000000..7c281b7c --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_014.png 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 Binary files differnew file mode 100644 index 00000000..e3bf7266 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_015.png 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 Binary files differnew file mode 100644 index 00000000..78b322e3 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_016.png 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 Binary files differnew file mode 100644 index 00000000..3c2618f8 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_017.png 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 Binary files differnew file mode 100644 index 00000000..bfdbf2c7 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_018.png 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 Binary files differnew file mode 100644 index 00000000..0a51631c --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_019.png 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 Binary files differnew file mode 100644 index 00000000..26c82e8c --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_020.png 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 Binary files differnew file mode 100644 index 00000000..abf18bba --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_021.png 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 Binary files differnew file mode 100644 index 00000000..6408bf13 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_022.png 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 Binary files differnew file mode 100644 index 00000000..a91f3a25 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_023.png 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 Binary files differnew file mode 100644 index 00000000..d1643de0 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_024.png 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 Binary files differnew file mode 100644 index 00000000..c45581a5 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_025.png 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 Binary files differnew file mode 100644 index 00000000..6eb9c19e --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_026.png 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 Binary files differnew file mode 100644 index 00000000..e113fd53 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_027.png 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 Binary files differnew file mode 100644 index 00000000..ecc88a28 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_028.png 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 Binary files differnew file mode 100644 index 00000000..46c9235a --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_029.png 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 Binary files differnew file mode 100644 index 00000000..3ec5f6b0 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_030.png 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 Binary files differnew file mode 100644 index 00000000..180e785b --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_031.png 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 Binary files differnew file mode 100644 index 00000000..47077c19 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_032.png 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 Binary files differnew file mode 100644 index 00000000..3fe9c2d1 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_033.png 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 Binary files differnew file mode 100644 index 00000000..88c20830 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_034.png 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 Binary files differnew file mode 100644 index 00000000..d747470a --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_035.png 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 Binary files differnew file mode 100644 index 00000000..16d0dbc3 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_036.png 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 Binary files differnew file mode 100644 index 00000000..36dc9ddd --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_037.png 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 Binary files differnew file mode 100644 index 00000000..22b2ada0 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_038.png 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 Binary files differnew file mode 100644 index 00000000..c7721181 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_039.png 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 Binary files differnew file mode 100644 index 00000000..6c22caa9 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_040.png 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 Binary files differnew file mode 100644 index 00000000..3a516466 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_041.png 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 Binary files differnew file mode 100644 index 00000000..3b6f63b0 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_042.png 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 Binary files differnew file mode 100644 index 00000000..e0704cbd --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_043.png 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 Binary files differnew file mode 100644 index 00000000..daec4264 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_044.png 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 Binary files differnew file mode 100644 index 00000000..fccf0b70 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_045.png 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 Binary files differnew file mode 100644 index 00000000..69ec8dce --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_046.png 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 Binary files differnew file mode 100644 index 00000000..d1aca8b4 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_047.png 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 Binary files differnew file mode 100644 index 00000000..49249c21 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_048.png 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 Binary files differnew file mode 100644 index 00000000..b2be7179 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_049.png 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 Binary files differnew file mode 100644 index 00000000..2668f055 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_050.png 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 Binary files differnew file mode 100644 index 00000000..123bb0c3 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_051.png 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 Binary files differnew file mode 100644 index 00000000..64a24930 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_052.png 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 Binary files differnew file mode 100644 index 00000000..10419980 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_053.png 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 Binary files differnew file mode 100644 index 00000000..20012376 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_054.png 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 Binary files differnew file mode 100644 index 00000000..eb26248d --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_055.png 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 Binary files differnew file mode 100644 index 00000000..42e0a57b --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_056.png 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 Binary files differnew file mode 100644 index 00000000..5bbadc81 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_057.png 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 Binary files differnew file mode 100644 index 00000000..9d24c0d4 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_058.png 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 Binary files differnew file mode 100644 index 00000000..d31ea60a --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_059.png 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 Binary files differnew file mode 100644 index 00000000..d31ea60a --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_060.png 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 Binary files differnew file mode 100644 index 00000000..1beab62e --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_061.png 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 Binary files differnew file mode 100644 index 00000000..96f5cfb6 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_062.png 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 Binary files differnew file mode 100644 index 00000000..b27ca1a0 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_063.png 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 Binary files differnew file mode 100644 index 00000000..c393c425 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_064.png 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 Binary files differnew file mode 100644 index 00000000..81b2b771 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_065.png 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 Binary files differnew file mode 100644 index 00000000..797192d9 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_066.png 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 Binary files differnew file mode 100644 index 00000000..ee770ea1 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_067.png 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 Binary files differnew file mode 100644 index 00000000..54abfde3 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_068.png 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 Binary files differnew file mode 100644 index 00000000..b7b327de --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_069.png 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 Binary files differnew file mode 100644 index 00000000..ecc86870 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_070.png 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 Binary files differnew file mode 100644 index 00000000..af1a4b07 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_071.png 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 Binary files differnew file mode 100644 index 00000000..89a06d31 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/primary/primary_072.png 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 Binary files differnew file mode 100644 index 00000000..70bfd60c --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_001.png 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 Binary files differnew file mode 100644 index 00000000..a0c39abf --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_002.png 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 Binary files differnew file mode 100644 index 00000000..180d6023 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_003.png 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 Binary files differnew file mode 100644 index 00000000..1701b36c --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_004.png 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 Binary files differnew file mode 100644 index 00000000..1701b36c --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_005.png 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 Binary files differnew file mode 100644 index 00000000..350b3307 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_006.png 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 Binary files differnew file mode 100644 index 00000000..f87c6305 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_007.png 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 Binary files differnew file mode 100644 index 00000000..e03a4ea6 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_008.png 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 Binary files differnew file mode 100644 index 00000000..9b165918 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_009.png 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 Binary files differnew file mode 100644 index 00000000..f1fbd7b5 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_010.png 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 Binary files differnew file mode 100644 index 00000000..3399269f --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_011.png 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 Binary files differnew file mode 100644 index 00000000..ae4e39f2 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_012.png 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 Binary files differnew file mode 100644 index 00000000..681af5e1 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_013.png 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 Binary files differnew file mode 100644 index 00000000..fa460579 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_014.png 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 Binary files differnew file mode 100644 index 00000000..c1053a4f --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_015.png 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 Binary files differnew file mode 100644 index 00000000..fae18c3b --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_016.png 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 Binary files differnew file mode 100644 index 00000000..5434bdd8 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_017.png 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 Binary files differnew file mode 100644 index 00000000..7e5efd05 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_018.png 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 Binary files differnew file mode 100644 index 00000000..63025d7a --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_019.png 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 Binary files differnew file mode 100644 index 00000000..e17f4fb6 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_020.png 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 Binary files differnew file mode 100644 index 00000000..82262699 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_021.png 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 Binary files differnew file mode 100644 index 00000000..500134a3 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_022.png 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 Binary files differnew file mode 100644 index 00000000..756e8d41 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_023.png 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 Binary files differnew file mode 100644 index 00000000..0c973fca --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_024.png 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 Binary files differnew file mode 100644 index 00000000..a7072581 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_025.png 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 Binary files differnew file mode 100644 index 00000000..3f109f2c --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_026.png 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 Binary files differnew file mode 100644 index 00000000..e4cd1001 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_027.png 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 Binary files differnew file mode 100644 index 00000000..4b4bb721 --- /dev/null +++ b/src/boost/libs/polygon/example/output_data/random/random_028.png 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 00000000..96ad9699 --- /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 00000000..84f0e468 --- /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 00000000..4ef2e9dc --- /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 00000000..3049c387 --- /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 00000000..3e6e42f3 --- /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 00000000..bfdf883a --- /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 00000000..16787e3d --- /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 00000000..c85d5d66 --- /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 00000000..2b61d41e --- /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 00000000..070d34f7 --- /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 00000000..ce57f5b1 --- /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 00000000..82640640 --- /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 00000000..66a586df --- /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 00000000..a9042f5e --- /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 00000000..df4fa4ac --- /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 00000000..192c2171 --- /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 00000000..6087e724 --- /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 00000000..6646a175 --- /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 00000000..82dd9fe4 --- /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 00000000..1f5b3fb3 --- /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 00000000..91853069 --- /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 00000000..1693c317 --- /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 00000000..61c4630a --- /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 |