diff --git a/PHF_benchmark/Input_data/0/key_0000_1_10000_8__000000.txt b/PHF_benchmark/Input_data/0/key_0000_1_10000_8__000000.txt new file mode 100755 index 0000000..c86699a --- /dev/null +++ b/PHF_benchmark/Input_data/0/key_0000_1_10000_8__000000.txt @@ -0,0 +1,10000 @@ +2861498860 +538874397 +2884970994 +955125036 +3481923597 +4023014517 +452306420 +2686122881 +2102814866 +1543734688 +3816350532 +3841160498 +3963119138 +922404466 +2036972307 +1705535499 +984531147 +632377809 +2535208120 +2736938665 +361421618 +888021451 +1992422465 +2590943442 +3555072675 +3403805089 +3970239682 +2514706003 +224507947 +656608320 +167189887 +1332681492 +1132203992 +1633750777 +1156037352 +3435200593 +4040368592 +432439924 +374071162 +4201577549 +1157933667 +2989295453 +864861915 +820979215 +3103456509 +1859991325 +1402959268 +4087957561 +4045321966 +2622802380 +1624384166 +884304166 +3238063403 +630146915 +2032758741 +670596532 +2875077786 +2349706594 +3400556235 +4059982738 +1011286726 +155877544 +1849547541 +474396246 +2055384093 +2398313517 +4018505308 +4089257323 +2958070855 +404930470 +1972861984 +1172226557 +341216918 +3263985995 +479107136 +1902793150 +3577003933 +819904387 +1595971764 +3580048896 +4207832057 +569718531 +3708966298 +792660783 +3247168844 +396295014 +1517022243 +2356109383 +2454992254 +1547386168 +2805995800 +2342241127 +20956159 +2393103766 +1093647782 +683210020 +3025282122 +1401462953 +1763662743 +3019007060 +705675524 +713720628 +2353438368 +2152453594 +1535995727 +3982350732 +340973073 +1862095641 +601954692 +707444174 +4077523347 +4012254943 +4124376599 +4007992567 +3149874012 +3429401733 +511715420 +782894591 +108121287 +2742238679 +2095210051 +3888465285 +3686478589 +3042501967 +2611795099 +3689178407 +214446974 +905348299 +2562221915 +3332690586 +1196610940 +479648610 +2025309192 +3702630017 +467907765 +2769589970 +839207402 +2436394142 +550864269 +2485299361 +1854583884 +2161957192 +1549868016 +2012976305 +1363645615 +3708731137 +3615061692 +3305887671 +104509329 +3672175031 +3785540985 +840933115 +431829541 +2108144283 +452360500 +3421577449 +224584716 +2882750898 +2013814498 +3557381781 +3893239960 +2606213487 +218005990 +2716231195 +1529741484 +3362938915 +869272588 +1477508479 +335012619 +3695552234 +3662142345 +593662724 +3133248868 +1757562604 +2730112788 +2665745855 +1935849331 +3065059485 +3132663529 +160637473 +2852191501 +2259281226 +3122093023 +1423065112 +840313174 +1084848738 +2372516405 +1631588950 +2390501859 +3113256470 +158274172 +2744258407 +1483060065 +1574572356 +2122734092 +1793480239 +2791206438 +1586440491 +1680252034 +3780364752 +877994635 +4141036588 +3636777157 +2992332000 +2291713027 +2265412831 +287374844 +2989502565 +751315072 +1344989490 +1731514616 +710785496 +561739873 +946186246 +724686233 +171321127 +187102182 +2308631300 +1467350298 +2359752157 +2210486800 +2724302556 +20608655 +95998435 +2990834751 +1328926655 +305281877 +421064177 +1368277020 +481579873 +160728629 +2435826868 +2708092073 +3477062183 +373457772 +1999601034 +2294076468 +3464110692 +4066208093 +2221238487 +764015442 +1501195435 +1523639444 +2405310581 +2504945905 +124817474 +858296069 +1816989168 +2901210771 +2883422049 +1562560938 +1900767585 +2764349343 +3796776080 +1486077666 +4152125121 +2372893627 +3440346478 +201631315 +769714985 +161959460 +730651707 +4135192686 +3415556217 +191638116 +2440885109 +3292424674 +2996188285 +969461419 +731886424 +3268808255 +4265376307 +1666607886 +1705071509 +3603987272 +1168629020 +1222925423 +4084313321 +173183736 +272153629 +1652261711 +1787623946 +3629862089 +3086104155 +3682551638 +3629243410 +1422324671 +734621069 +3893604589 +3151997439 +3550727618 +808157710 +1410293331 +172307435 +1939548034 +3960418650 +1153845820 +415729283 +2431245861 +380710555 +2049413387 +2458302114 +1354376849 +1181655714 +4053947567 +2747282301 +3467065714 +1255601394 +3726361233 +95950334 +359814828 +2009902034 +1089312384 +3329189038 +965855681 +2396348254 +2191111536 +3747209514 +1151065923 +2701916919 +3693411499 +2371415881 +1075774902 +557918012 +2604367212 +411456522 +780577214 +1177865763 +1230174069 +2975243800 +1567452695 +4030842679 +1541530725 +2201098619 +478053286 +3027309824 +443141984 +285979863 +1425679865 +3620258195 +1857049676 +2109001185 +4276513905 +287430312 +1644689549 +1444017668 +1413654243 +1365549954 +1204528307 +1199909242 +1073682674 +3442599234 +3695226321 +324941820 +2525085279 +2103644112 +1818240248 +3467261808 +2272206828 +2609070241 +1741068080 +1843757665 +3201344131 +2288125025 +449361001 +3463626260 +2023936645 +375044275 +241526182 +4045085635 +2169405428 +4162003939 +1566312522 +532290727 +156182543 +2568140688 +829983565 +1002230389 +100086339 +2421712838 +2677924688 +4097769372 +162088659 +2645881788 +2073244664 +4194671044 +2720296960 +623807259 +2000282237 +3208660157 +3224797472 +3755330383 +3543029857 +1956783556 +1337805988 +3026338831 +4062220970 +3621336037 +1686770520 +720871481 +1341205444 +2709739213 +4241803513 +2878799494 +589767416 +3757143934 +1542688963 +1847088957 +18602377 +1095751679 +1066054743 +1684750792 +4251888205 +1507592 +4003254509 +3055125331 +3561299300 +713608019 +783278470 +1576218540 +1071645329 +2879074438 +3265100048 +3370406227 +1637389888 +992144303 +1015868120 +3574851303 +681641608 +4209778292 +3809503110 +3469943037 +455235296 +3652734833 +4118802426 +434412774 +2277702160 +1818585174 +3539793219 +81815933 +65812981 +1475005068 +2966249063 +1702397384 +2646776713 +1453456432 +1936272827 +47259463 +1698241541 +2074825154 +3606285284 +1470080018 +1156201480 +2635845455 +2601542336 +822907609 +2421872341 +720516660 +2920008974 +2328182178 +740261486 +4052502604 +4054220037 +2588984523 +3538456977 +1873202006 +510750048 +1384779413 +338483377 +1030299107 +1060129625 +119215487 +3535834833 +1954717854 +4285568603 +3008959896 +4103491755 +3126697012 +3682993299 +159551159 +1730263752 +1132014013 +1902492611 +515049073 +1699348221 +2488422623 +2258085426 +212640284 +226267206 +20198293 +2459089031 +1455334843 +834786184 +3723766151 +24554342 +2425812458 +1026292653 +165671521 +2397570825 +1178045891 +1121742092 +3204386904 +3781660079 +2429842068 +3446279536 +2741408015 +4040922895 +1965615400 +1294740389 +1483293762 +1375161572 +3974440823 +1830313797 +4008444201 +1499045525 +2603807905 +3565264716 +761994886 +691266022 +625535694 +913044001 +1021300787 +3065879913 +4183693518 +368998050 +4292835837 +3791756531 +1698953315 +2420027445 +3169058410 +2048530574 +2890105462 +1708882467 +2920368244 +2707243378 +1239532990 +3461637877 +383394373 +1610126110 +2431548813 +2798971708 +4146813199 +506167898 +2260684029 +1936068371 +4186787567 +670819011 +2217690504 +2794762805 +3085832243 +1807187948 +178131849 +3162456588 +1251272278 +1097205339 +799618520 +461617504 +3005296296 +1532227729 +169216511 +2146981758 +421925961 +4183938516 +3063288075 +3556191182 +393699137 +2909126728 +3990772323 +4145958993 +1835498182 +4089504240 +3499228769 +3667462487 +1128102210 +1760370517 +47445916 +476670373 +1698728409 +1223807353 +2794183289 +3905126523 +1419133429 +2467591556 +167516273 +2563027451 +933517683 +3007914077 +2277117106 +1489371275 +3708629116 +3494108544 +732676894 +94860146 +2194640 +2795351552 +505125274 +3946122466 +595140008 +178525270 +2617506228 +103852046 +674783066 +2966407390 +24882349 +1128678928 +4051776488 +3123998572 +2563620900 +759803487 +3789209629 +1927424049 +1148426212 +2854730839 +4000433447 +1384660526 +3866263009 +3786490733 +2480707368 +2404597598 +4158864309 +2928380465 +2134991870 +382462546 +1291542263 +1997254427 +3012764792 +3200033485 +3737494583 +909262089 +2728845249 +313605155 +963097095 +3970051450 +3142749820 +1352082327 +950070275 +2553976760 +4240474530 +1725716201 +4099969902 +1413547639 +2781714950 +1879767878 +3875509486 +343830844 +1082990743 +3604144458 +4132571379 +3295994138 +2499071941 +374334964 +739142110 +4230360157 +590507141 +4021308219 +322384693 +366056191 +3854621120 +3509950666 +195827923 +3931422197 +3160387895 +133509852 +3346221674 +3412434252 +1945877923 +755859655 +485820951 +203137531 +995491834 +3919829925 +1821630900 +1860950952 +1982910560 +4178401497 +3729070758 +1968884312 +4197502196 +3715427488 +1301102013 +323746002 +3133976451 +321640909 +577158467 +3406494346 +606846639 +3023350803 +2605659196 +2385807982 +3859244255 +253377429 +2574832959 +1462884053 +1470698334 +4084771893 +198892844 +1327147316 +3886070951 +721844026 +3679315144 +1971159977 +640567693 +851594053 +2721038696 +844320707 +941337992 +2510448049 +2743587853 +1376743705 +842493052 +1902179211 +3865956859 +3734685596 +2837395533 +2371588830 +216123923 +208207821 +1576115450 +2548805262 +3437032737 +2950702366 +1433673262 +3947092549 +50326333 +1815375469 +2976508734 +3460023431 +2235730418 +3546781275 +2814632528 +3926418951 +39640996 +917504983 +1400934613 +3382875894 +285669319 +900406426 +2425732403 +301524987 +3582694915 +1698732222 +1725128860 +51258096 +1200007219 +3560035338 +1283418742 +426532475 +3244268167 +2204879475 +2341270412 +2153609873 +4208843254 +3412320486 +829138263 +769324122 +3341381531 +2437395886 +2158768896 +4200889659 +2903139180 +2764275666 +126788711 +706274184 +2767085187 +60933692 +1867549611 +703684304 +3852788253 +1188647502 +1773658994 +1941080404 +4253084053 +2200499531 +1297383254 +3948792224 +1090712509 +3305372803 +4182658625 +1617125583 +3814193531 +1964939248 +517695365 +2362318840 +768809213 +181997101 +1620357699 +4056310849 +1346069424 +3202653651 +1219889741 +3054381742 +600821458 +1466672512 +4194164544 +84204832 +2353390456 +3071590004 +3880043794 +1721263387 +2735908975 +1500442932 +1449841867 +1829944341 +3860038257 +3495357222 +1096018415 +2431441148 +3114269500 +1676664899 +2374616105 +3181797335 +2640306614 +2963775677 +366503644 +3409936666 +2664863080 +1177988998 +1134768193 +1547863621 +1307422622 +4082453210 +3543163655 +3372846797 +3971788066 +4169558809 +3525385553 +1466510156 +2321279534 +2455498786 +913242281 +1409250134 +1403042371 +766609600 +3030032708 +1451123455 +371048214 +635383608 +1385213594 +2327487022 +4211545735 +255902173 +317147838 +3347857948 +1337169273 +438881430 +4274504189 +132654761 +3190439411 +1025959578 +2729299317 +18981104 +1198909533 +1371457620 +968839770 +664865150 +2623640658 +4205817293 +2523219693 +454669570 +516794725 +3928713918 +3999218376 +3890388253 +1605807398 +998088737 +3953892002 +713771330 +1373703685 +3667967238 +986586241 +3815958476 +4213188482 +1954289115 +1531082745 +1394927910 +1365124742 +2450910401 +846828689 +468214246 +1911227146 +1961901558 +1726378030 +3436024451 +2628331093 +2564993314 +3232776468 +4197915899 +349757923 +1170487041 +3656089561 +2089004530 +3115119736 +1047800390 +120020062 +4259904985 +429995885 +1317608882 +2741244043 +2404118039 +3481234705 +1020205007 +674992205 +179955800 +930602634 +697919489 +913381397 +919598230 +899071834 +2787632127 +1833856809 +2308308088 +1471125037 +585776583 +1727692059 +938241378 +2522572467 +399169426 +1213249267 +1757509479 +2794899641 +1966838383 +3467087944 +1245048906 +2086544466 +570485730 +2583881079 +2955411923 +3624320052 +3536550790 +3034571909 +3685008568 +3558036096 +2366847662 +2640840212 +662241601 +2987303660 +1110383205 +1042951961 +690629232 +1447556278 +4238330406 +520095259 +1175939805 +60991930 +4189082158 +3453714089 +2778140263 +3274092631 +181323960 +2924447234 +3123056012 +494399332 +3408752284 +3939493656 +3133052820 +890088190 +3267787593 +2596430830 +1492614394 +1644119101 +3064662003 +2667716853 +2732597650 +1267301810 +2551759466 +2994980660 +32761679 +1179516931 +3576117882 +528902197 +857965533 +3277352275 +3111343937 +749689384 +1567788842 +2880983467 +3317458108 +311147234 +1739223663 +2577464059 +2307444537 +2246829807 +1153008849 +754662338 +359978739 +1726566387 +1572970619 +709599364 +1539326056 +2285420239 +3122962013 +826618192 +1484407833 +619368944 +3854573295 +3508705601 +1268241324 +2023120175 +1002062107 +3128931441 +2654268325 +964849996 +1407509481 +3607924245 +4137919629 +3218555250 +2580728655 +827235384 +2736345881 +195067403 +1859936801 +2623083933 +766073308 +4044587891 +1635182782 +2989680794 +1456928712 +1691114215 +1742091784 +2417028011 +2840279795 +3530067180 +1391323052 +4181973078 +1107064023 +1407163119 +3036438357 +1125521087 +3944593953 +742283908 +106751215 +3552867429 +1085828402 +1091952161 +2224708511 +2019602064 +3417312650 +285596977 +3852141209 +2406133795 +1941654876 +1921991824 +1079069887 +1936091093 +1978331654 +3376578127 +2716927464 +2297202893 +781575543 +86124136 +2133799428 +3019149993 +391642995 +506677615 +992150011 +770792788 +2281473517 +908429396 +946264677 +2014043735 +2252581600 +3393484034 +558240634 +3499172762 +4278492569 +3761718535 +1516498934 +1694450183 +1780858952 +1637612173 +3340971155 +676128637 +3049019539 +3719177842 +3375893884 +1344006628 +629467643 +2323466110 +2873855128 +1310528682 +3899261782 +2872283478 +1372112510 +478490311 +2409576406 +2838886571 +2917631090 +2377817114 +230750763 +4055085750 +795772065 +3938774845 +2770567223 +581366596 +3665156476 +1782969178 +2204738342 +1902020852 +2636202331 +2072522424 +1513801768 +3948094253 +2660748457 +131480027 +2854553468 +500195920 +430753576 +2164689174 +830164837 +800692482 +74755066 +1831890927 +4124678994 +2389358384 +3736008793 +2568094159 +3595700913 +1451771895 +286328361 +1885714491 +3498555305 +564826886 +529628755 +667684273 +427603534 +3245623276 +3753123410 +3476656029 +2007908698 +2463635613 +3395006246 +2725040314 +1669910233 +2837757871 +1922940863 +2149463697 +492974454 +273966321 +3497615342 +2378189070 +2693297660 +2475629644 +1555256081 +3640589876 +2078041146 +508638381 +2389102400 +3626568372 +207530138 +3282182254 +4080586339 +439707068 +250824388 +3669269858 +3199526009 +2764736243 +1497946930 +2969487502 +2865908328 +2950314389 +2177225005 +2775888036 +332850159 +2576043449 +2165711186 +1398768880 +1015483592 +3104434462 +2385764104 +1754114777 +3588147611 +318029526 +1762058977 +3939251101 +1463913979 +3078554727 +4105505375 +545271439 +1972636637 +504415633 +2219247860 +2421592154 +4042814101 +373866293 +3333992300 +2494238567 +1543842661 +3366799066 +1847073255 +704054708 +3831723947 +2580995307 +1322088783 +323617968 +3280729611 +3183600334 +1475283670 +3927637399 +3581014902 +3843550340 +431473572 +457456128 +700833777 +385574602 +1837474429 +2837326369 +386813757 +2556231971 +899170961 +3583572203 +2152979017 +4290222143 +2906211788 +3152116227 +1336963826 +3485291855 +1597535123 +4187109493 +1962044331 +751552360 +3374145652 +4283999955 +1762763270 +1542247015 +69711498 +3102054702 +1032474548 +234402238 +837968121 +294264482 +39072260 +958692058 +3644299624 +2743548185 +1221058749 +2348614716 +2706880553 +2929007856 +1789471049 +889426239 +3657412989 +300498413 +1901805108 +1082640753 +2863529902 +1457172110 +3496419279 +773872058 +3776338499 +426438745 +990771802 +2354184024 +1230276209 +3434567398 +3965743926 +196863151 +2438955136 +2660876744 +735352192 +3164129610 +3067162900 +957389183 +48125450 +1327719972 +2382199641 +4209969291 +3625563813 +3845091037 +1056624912 +2443636803 +2858297232 +1530072205 +4041286361 +2797880629 +3044024216 +1205207979 +1134572702 +3468368186 +3305989570 +2720209894 +2387998165 +3562946726 +1964220636 +632146396 +1311870670 +1455312136 +3734264411 +347135336 +289125322 +917862914 +677616621 +1656413759 +1867067139 +1021886214 +290418567 +3358654003 +974870066 +1771624151 +1936768264 +1681148574 +1392179728 +694991531 +412681374 +3208720170 +1674191986 +793920783 +442257291 +3077480027 +592595554 +1346236242 +91834143 +3135271846 +3806435522 +676599181 +1702770096 +1642976367 +852988370 +2389294001 +1736182646 +3927551563 +4220731208 +303276051 +4003686820 +2791922237 +797963496 +1328084514 +1984890742 +500220549 +1150298022 +1487970127 +3882533283 +3226473063 +1502267748 +2243075174 +2710047164 +245621038 +4119325840 +2138480342 +967152904 +1467806931 +646713636 +1295519588 +4031822546 +2585297459 +3171657989 +1367501167 +1345301513 +3236275046 +2120469173 +1196498853 +2149088673 +135867443 +2146788804 +3123552570 +3749319826 +4246595259 +723687105 +3700591966 +3498903595 +2013746061 +1927707522 +3956992316 +1742193426 +4230011402 +2574970474 +399842302 +1953587718 +3129212705 +2132249848 +4248203405 +4292826254 +3383986907 +3411805510 +1626869441 +389707368 +4249792723 +1397183038 +172558790 +3643128575 +2075135417 +3708364232 +2962712911 +284977016 +758874341 +3181384809 +3142003163 +2708095947 +1420312684 +85657057 +2249658184 +950790855 +2698934228 +4244928433 +658790249 +2488895246 +2744762164 +2026680957 +1082474897 +1779487995 +1746704705 +2588083660 +2416190302 +266796250 +1576748988 +3716238619 +3515963939 +2254605920 +3765644674 +3710334982 +1654420468 +626615537 +591346655 +1039580119 +2399572940 +4033509163 +845058679 +1671124111 +4284167396 +227386726 +509090428 +316019088 +151818752 +3692524126 +2828222055 +1546564842 +639578196 +2827457348 +481454850 +672088225 +694481270 +370414097 +2105682549 +3661625913 +3847342326 +225556398 +4015661436 +935483918 +2777096363 +953569038 +692952710 +1868589813 +2740809723 +3816524582 +2341227715 +777715318 +3472478637 +2968135896 +464858102 +1349335792 +1255324974 +3684690477 +1176588050 +2998655245 +4280219389 +3328508307 +996399760 +687464530 +2206749705 +2454770637 +1572323447 +1457327950 +3441491867 +2347927127 +4231592261 +2131467975 +4225684533 +3750425911 +2902476692 +1831989553 +3264276515 +1294776675 +4218106465 +2899825003 +3325369119 +1794400428 +233989359 +2978117040 +1951415543 +2441875427 +211210340 +4136831823 +1805790624 +2851648022 +989280982 +296493985 +2956082364 +3893147438 +2595362419 +2791263424 +1307725008 +1300372767 +3557416253 +1222356451 +2438285535 +472224698 +2572821188 +1426798475 +4075417465 +1378228133 +3509889661 +395729018 +892330184 +469084799 +2891417560 +2593180647 +365853403 +2545947719 +1514108006 +1950604176 +362853718 +2394463714 +2312610337 +2778411609 +3081160125 +3880710807 +520383980 +3320436030 +2864663272 +3507676232 +3192807676 +1502749323 +1617949061 +103629321 +4255229602 +2605369924 +3856036167 +1822986851 +4187137153 +293950781 +3089133197 +3016598883 +3915299365 +3689149859 +1819038543 +1561748507 +2263051377 +4020936656 +2400140578 +4200906346 +1918434123 +3876146511 +4058735980 +3372388589 +1578154856 +93567378 +3076705024 +2702606871 +1830945437 +1840949190 +2933619734 +2401407845 +2801406319 +2855473825 +1332715583 +112513828 +3736337040 +149364486 +4159448866 +1119563663 +2066933528 +1623335156 +2968960492 +312995342 +397838019 +3180784070 +3755908336 +1418036807 +2718348544 +1960623951 +37206374 +3505849515 +517436664 +1543041191 +3092858927 +3273994492 +3627442259 +674957816 +527158251 +2286335328 +440022964 +1457400408 +2825757371 +1040997493 +472232280 +1042472923 +2475715739 +957284000 +3197319206 +863184160 +1572715831 +1489584472 +4164292632 +880255163 +1000280265 +2462713279 +3166090283 +1314200974 +4093569083 +3175701794 +3603168638 +3110473263 +1116057255 +3768529292 +1054268074 +2217481039 +3913419671 +2815295562 +1190173418 +2283240796 +2431165419 +2759516183 +4289525146 +1147520490 +1252927486 +1221212322 +653406020 +3150605799 +3559007670 +3545461180 +193988687 +2489186425 +781577866 +1753778781 +3548309472 +2853405758 +3251997616 +1089894177 +1556188061 +879134831 +4051196187 +4210602705 +2014194193 +2412680478 +3643503449 +2095751302 +3495770748 +3912667613 +2530277176 +73028723 +2834215390 +442830313 +1733095978 +672539568 +109474882 +1598433378 +1979873009 +372399337 +171589825 +143800277 +1696436794 +1094496170 +4188604537 +1519210011 +3767473797 +3956477365 +1440398144 +1665243006 +215549129 +1965218622 +1183007178 +2922674683 +2903177039 +2339952603 +65514937 +134626212 +1386214374 +4043221547 +2000203276 +3795126282 +834918496 +2281350778 +2556505544 +1332038270 +2362881647 +1836952613 +2290105776 +4287515446 +599438727 +1441397185 +1368295523 +1444423988 +2291074752 +791867980 +2120155066 +1422130535 +473406216 +1142906131 +2447992104 +3270148211 +459557915 +3516412013 +2322248997 +969543363 +2381908085 +3030302770 +3247269804 +1938580995 +1557254971 +955011420 +137874667 +2879242971 +3155192962 +2045965861 +1986236169 +3842186454 +3221957191 +1119476692 +3978466435 +3618317189 +1298034713 +2972114369 +3036109772 +2629993938 +1808628768 +611150766 +852793727 +2973388804 +750870595 +170592819 +1338677384 +4076498574 +663416254 +2976358658 +484522280 +1891785544 +2656828027 +3533790871 +1533244560 +1783163356 +3742534905 +4189262749 +1967212448 +3010741159 +4029896101 +1835177698 +2688260591 +3565149296 +870744808 +3831050717 +1782224164 +1419545891 +1966153032 +901272900 +721885063 +1753659274 +3962317387 +2909643850 +3414199013 +3218321831 +3873769691 +3084098496 +674678927 +2835747354 +3233797857 +3437936776 +1363083500 +3497919331 +3614212849 +1389873388 +4199593681 +3087287671 +4147323706 +1781304322 +3839762825 +1060073424 +2987823522 +311345438 +3319343575 +642320371 +960695869 +1673987029 +527645582 +724708596 +1822437314 +2746757863 +310026428 +242731315 +1141439252 +3330757546 +3372863919 +2414206019 +2557179005 +3442105709 +3058234476 +3618671496 +2464028187 +3413136724 +3585040364 +981973671 +681605477 +909482606 +3408733431 +2536238280 +946024162 +2136551926 +4260624982 +917109869 +3603957270 +527904031 +936489591 +1518291755 +1329066370 +3926969620 +1741428999 +1045355176 +3994414527 +1160246722 +2875626228 +4073031517 +3185095282 +3190677115 +3529472864 +2003694679 +2338355234 +1139528633 +1404501098 +3360037317 +1582678696 +593848262 +2562746181 +1630959120 +2798381383 +21646775 +4226554196 +1197578155 +1487316137 +2318905339 +1211167226 +1391332108 +2066319695 +2681058266 +672836252 +3150808612 +749932675 +3411600203 +468312977 +1029413994 +50297315 +3824741022 +1954383056 +629729752 +3534946017 +2199815881 +2750182672 +2284184503 +1930459109 +4032445559 +62306583 +1474506266 +2143021115 +2924197286 +3598119663 +678658524 +2416982296 +3157220312 +2217186359 +3778309733 +2733017442 +2294346764 +3294577448 +1749902 +2835015015 +1032711102 +3059340754 +2351107559 +2571691232 +2691571899 +2142911727 +339635115 +3125835356 +750501513 +710028181 +1707534387 +188714354 +1789144130 +151549963 +1432413777 +3036825005 +3083686641 +3254881206 +1292204534 +2238554521 +463081792 +3832880761 +1512978810 +539203088 +67000859 +2756728639 +3025945921 +2856857617 +1704000347 +3158605028 +3166161740 +493765647 +3823735910 +417250757 +2535929697 +471989927 +3611884883 +3858423873 +1838334979 +3121664112 +1876583492 +3866033791 +2273311398 +3862077705 +2514273721 +2991207184 +3147832083 +1202308417 +2533475622 +4056574215 +2267792339 +2958005671 +534620703 +2859075349 +4115637097 +3766028083 +3389781149 +134671464 +2165593104 +2501244495 +1409691989 +3483220637 +3280642810 +743455759 +4036213859 +1190014430 +2334177013 +1825385672 +2125910393 +940799902 +4068938959 +1015552402 +2082740943 +2877549196 +3336842407 +296176379 +3988195039 +3417846039 +3052834914 +1295453728 +130962559 +986481474 +3940683164 +1447308834 +41298016 +3562271611 +1266305527 +3353035270 +3591754680 +1641406940 +1047038086 +2520268377 +689749084 +3628861105 +3553997432 +3736240179 +947370165 +2568129072 +3655197422 +2315592422 +4145460845 +1308252883 +1946063060 +3679995534 +1002523047 +3873329281 +874132336 +2596652805 +2912891849 +2743775053 +3056322843 +4237547172 +733839003 +2879320001 +1910566918 +4254892225 +3716355158 +3390505835 +2570735155 +581958850 +70843317 +3433910911 +1976752741 +2309093151 +405730926 +3396023857 +1312243988 +3106841972 +3449826990 +3920812330 +520234304 +3475921910 +2872598573 +3513083299 +701347916 +3530415958 +2266499195 +2424988579 +630312587 +3543774457 +3523991566 +3966442971 +98181553 +3820458601 +3293750073 +1723570939 +624057197 +208083378 +587045363 +2317773293 +2998661943 +3314631106 +4140459897 +1338188110 +3659666344 +590191272 +2482823424 +462057698 +3378043801 +731703431 +1244422765 +1417422202 +1180727527 +60982333 +1344965787 +2532432293 +2846610129 +1368877924 +3833730753 +1575476484 +1238901986 +2665827595 +2964746862 +1778051998 +2121576146 +560610002 +3308733466 +3240748834 +3640543834 +3297574182 +4147269405 +4049079496 +3610900537 +885334178 +2116992622 +4239385266 +3680045629 +3757459339 +3435804232 +2637694217 +3269931150 +2625274759 +2547325881 +4264441239 +1863999079 +1125691408 +1462102002 +1017035904 +3342599437 +1822144406 +3983489958 +1387968977 +116156107 +2154643413 +614316305 +2218579964 +2230677057 +3903821086 +3781261360 +1506660879 +3154810299 +1416033544 +2748518408 +3221458728 +4131244365 +3002630685 +58669729 +3587873643 +1329783221 +1139410155 +353223439 +1754849463 +1365792432 +2455185353 +1179433101 +4211052724 +4047133358 +1185658048 +4218770503 +2048812076 +2220390174 +2583669162 +1691897391 +1572609274 +1061448207 +3891539324 +3008145042 +894159911 +2370911973 +3085552134 +4154059534 +3025268030 +399465207 +2528530396 +1156663267 +348543156 +480938579 +85319784 +2717929197 +2101292343 +1747302919 +943168085 +4025109980 +2047424011 +4122575975 +4067681913 +2073651131 +372903841 +228618065 +1449000298 +2409836863 +3563368015 +399640792 +3409613457 +3110123821 +876906717 +589792423 +1721944058 +3951645688 +2488082312 +2562303605 +3534546027 +4010033997 +2728601367 +1789824732 +2104652553 +917941643 +1853223280 +1058168999 +2359284370 +2514026075 +4290878288 +1134511712 +181306342 +916936239 +239178315 +3690428304 +3968534808 +3046454831 +2092174714 +893257431 +283896129 +4123607500 +276066638 +2169767133 +1056220567 +1545026584 +1674110607 +1616405861 +1816921786 +503021040 +3099578887 +1284870685 +862785339 +2944972527 +3962654488 +4049857009 +3180348326 +4274976559 +619512032 +3202746495 +1461523451 +3729197796 +546012281 +485446630 +3638805136 +1204589309 +1944418240 +3490430106 +1193253182 +315145223 +1767741965 +2871722934 +887096100 +155479919 +70586248 +523526472 +2505004179 +712725294 +2481248710 +2591340669 +353951777 +2397326412 +2693953107 +1035610361 +3098465550 +3653002013 +1272266821 +286887131 +2078528281 +1837081866 +3172380193 +3286700812 +1265188842 +257603744 +1526159050 +3239317408 +3035256811 +342481498 +3145421763 +2861131343 +1724757242 +1855314551 +437914567 +3626459803 +1224209626 +1454782822 +555766490 +617159147 +2402684327 +3888046285 +3860441283 +591065601 +3281721592 +882355477 +597719932 +2270863151 +2185106230 +2857285451 +2806462230 +290020219 +3647920076 +1353356359 +3659570038 +147917256 +240425574 +431572342 +4249747916 +4182175439 +2971308653 +4233704012 +1237742703 +3582323699 +1142510030 +3207347195 +2237589035 +2455770742 +3509976415 +3703776449 +1093644254 +2379183675 +2893736875 +139613105 +1958921963 +1003413787 +3591408245 +2644061402 +455299037 +3112939720 +1837282986 +2930665490 +2924339213 +881375428 +330915968 +3978315965 +2447092665 +1472760469 +1194017681 +176915125 +3793737551 +2688281496 +2625675273 +2006932892 +733289600 +3445581525 +753263046 +2760172836 +2124834590 +2780584626 +1719948960 +694910809 +3957177732 +2043602237 +3605504003 +2749138612 +1269766255 +2488353364 +3458446197 +796267265 +1850526686 +605135684 +1153556960 +919553465 +815629686 +3926566318 +1337401028 +3682118596 +3277383508 +907118819 +3458106813 +1538560792 +2642464088 +2760964834 +683718079 +1778772333 +667794807 +3581160937 +4249563928 +1983088290 +4017045972 +1435186269 +3676304887 +3436211187 +1593631568 +2332683154 +3181479195 +101877162 +108574531 +752333880 +1840421373 +2417524584 +3452898912 +2913694947 +1111621037 +1216660927 +2804498390 +686831085 +2651205199 +69377012 +3521019317 +4103615865 +3391685284 +2707870966 +2628603360 +3467429278 +546630790 +3162702746 +3660071557 +1253046394 +900670818 +2492415580 +3814318748 +300486535 +2294195364 +2019925105 +3924752794 +2579615807 +2495641659 +3955957104 +704995150 +1596897620 +3353717579 +3550753921 +2545703981 +141583252 +3417245029 +887242873 +2926913025 +1604091200 +3277652355 +2053137324 +2495677662 +765575392 +3231942150 +98130388 +1850881689 +500888882 +1265283363 +3167142483 +4016936965 +927756403 +1506313135 +1612690862 +4274304303 +1320414428 +1128871478 +1042051717 +2317166085 +1926820513 +1153250044 +476930940 +2269332122 +566320372 +2899451163 +4061322630 +2968171984 +727839765 +3953390712 +1561971005 +1484471403 +4209216530 +3652583660 +1345599669 +1373112849 +4129406447 +3586858993 +2013915842 +2618215324 +3543970282 +291473699 +1900271913 +579065028 +1445577148 +1734764636 +428689645 +2047704357 +3457282875 +3435323372 +615880312 +2120425937 +1537757191 +1230771292 +4123226458 +4069481615 +1750721099 +1362221706 +2946242187 +2945936260 +2426719228 +495687496 +1897491422 +1109070653 +3584388869 +2965019429 +709537929 +1825757391 +1847313522 +861976944 +4260205452 +3551543015 +1473060386 +1459268762 +2353092224 +2983993522 +3071605594 +483150959 +915942819 +4244239349 +3352357314 +2899033333 +2231930403 +4271016942 +1611584324 +1944185439 +2982619739 +52883924 +1230596604 +1226552059 +1793713260 +4087295303 +1624521400 +960809925 +3788478381 +55992491 +2092267855 +140175292 +2042532758 +409416631 +3633378798 +673305381 +2009686307 +3823405292 +1915097991 +3043890866 +1274903863 +186882025 +3134033686 +1338185984 +4202062181 +4026622659 +3920172125 +2892731542 +77176520 +2432998869 +4231668537 +1780069028 +2479641534 +2027541024 +2617465503 +574060272 +646195834 +2336699811 +3816221104 +3293511181 +1766247593 +2620169039 +818947700 +583180522 +2724420558 +3707638773 +1522602916 +3269237804 +1167894482 +147571080 +3520407319 +2394067188 +2647602816 +534805898 +1116600136 +1236482483 +2278400234 +2230700652 +2487434801 +3159188011 +4018616908 +876514618 +4213702225 +3994615892 +481621182 +2043787763 +1599792205 +2164161393 +1940582824 +2301482726 +1339368143 +601361432 +1812864019 +1119697930 +3429907372 +2986327790 +1193507648 +381560819 +2886478439 +3537628498 +3917602596 +2063848581 +1828728030 +728634271 +3847531094 +741838794 +2221933571 +778290714 +1624348815 +203740908 +2978019285 +2484073926 +3326513800 +1150132983 +2092331967 +1679183902 +1567379478 +2909093570 +2785099744 +2546706175 +4088620546 +993524613 +128397165 +1635228560 +2798190147 +1659701114 +4115611305 +251189273 +3158386685 +405185990 +4180132512 +182226180 +3739875880 +647812254 +3160427458 +4178741895 +1592892883 +2239872965 +1670530732 +4001899731 +2287923750 +1664877726 +1148707621 +2720141652 +3312088019 +3363899802 +3508474832 +2149736958 +563260003 +3735639813 +1786272085 +2872036885 +3876053494 +1378560060 +1115324571 +3862670091 +4133303638 +3458851552 +4024851211 +1114397209 +3593850164 +3788670887 +1960058894 +1931299631 +1291252227 +686514016 +2327192136 +1439651304 +2909853790 +10643866 +2983181704 +1815610277 +440517640 +60545619 +4039382759 +1180101444 +3939079178 +2424946546 +1171115789 +3204290741 +1011199030 +2883806370 +3598810992 +646234185 +398960552 +1589792095 +4014627745 +3020984507 +3791407166 +2803210157 +39958882 +3556956866 +3359296726 +1663791225 +816810821 +1022249451 +3070916455 +4024051876 +162501551 +34734252 +474668577 +1293795135 +1427868940 +1415072246 +4175104133 +239560076 +2832167198 +1536139959 +2484814431 +3580896917 +1086090823 +3777354849 +976007859 +3138896329 +3804532703 +1359489854 +120426470 +138445615 +3493817474 +1369434188 +2054877620 +4074876750 +3847055164 +3449485536 +1522782794 +1966260098 +1336310434 +3465317035 +752574712 +2505357953 +2351397846 +1972120527 +3642583779 +1804834314 +3511267820 +2166021766 +23469741 +867164904 +3579820213 +1811029422 +327306994 +3755735784 +2753769954 +1001260352 +3240659724 +1460629871 +4143243837 +2160439503 +1527985956 +283298003 +3272311076 +1721675441 +3355305663 +1287924298 +3872961587 +2761006046 +880508729 +3508830817 +2933594947 +4176829079 +1948115109 +4274571295 +911892657 +446475305 +4250377164 +953094396 +3024636279 +1664227828 +3587647852 +1702630044 +3653623612 +3365688915 +673863904 +3196822240 +2736567713 +807192783 +2159912913 +3550734795 +4232840834 +540111583 +2213396166 +3614801799 +3785683983 +2828730473 +1387202617 +3262961006 +1287147506 +4013859825 +4196462471 +2327301849 +895031256 +3389174449 +967326046 +3684776205 +1707904932 +4091656982 +2113041463 +791071974 +20524455 +3181807148 +3706926936 +2448238497 +122186702 +3480872764 +2226682749 +2580338112 +1535900716 +2946194043 +2637374773 +3367677639 +4164123644 +222131265 +4255360488 +4092117181 +3353416993 +1337575243 +2047468006 +978213222 +3000395650 +3264852132 +1935145696 +554022652 +3318096365 +3099825827 +2745109632 +917672276 +618501112 +3423980576 +3880725741 +1796989509 +456887690 +1805188258 +2480264640 +4133908519 +1439785858 +2200640015 +1560482324 +1857115954 +2941486269 +943192565 +977611551 +4011944304 +2724621788 +3035596865 +4253054498 +1023949920 +3720702667 +2463738988 +259383664 +3067653320 +2272881370 +1596905751 +3232025444 +2222532567 +3829657832 +2643897108 +3881632560 +3588385846 +2492619040 +209837514 +2856407056 +806133587 +1006587327 +3982386845 +204688831 +2922318100 +801078712 +615322702 +1631824259 +3453541462 +507823991 +1050166476 +3372328060 +3870076460 +3584572481 +2845104979 +2899344591 +1741721887 +3754497246 +3337405838 +2063569175 +689655092 +181941086 +2692155345 +76255394 +2486816583 +1124601577 +2669461928 +1575299584 +2655705049 +899260232 +262298307 +1659864988 +270036991 +498106967 +1392132870 +3206717511 +4184055560 +2474939575 +3620827204 +2646378619 +2039360512 +3341404992 +3694504978 +850847949 +3195409169 +330889071 +2947982617 +1503309245 +748665943 +3383064787 +355221882 +2959832928 +2886120753 +4156801622 +3054803892 +1354565557 +1993848820 +2986554767 +3710908426 +115746314 +3775564806 +2493901704 +3539813706 +564984584 +3686781124 +309129893 +1289661366 +476425821 +3050265499 +3737588309 +2271118851 +852939262 +2573154506 +104851298 +4134935230 +825496155 +3820429688 +2725572788 +3151600700 +546564169 +1339449251 +3154361067 +2987904365 +2414915741 +3663693521 +1237357550 +1005288831 +3136839510 +1912180507 +1460182527 +569176166 +2559345397 +3796315753 +2467340857 +1947574644 +3248469502 +3830271309 +2421458660 +1777602127 +1751629361 +1205845716 +3216084322 +4123837302 +3213884383 +2237029993 +3841895658 +2875481876 +1545087813 +2880852697 +1883396234 +1755740685 +4075980697 +2481044100 +3094604137 +2776451248 +1366398251 +4127686011 +1762134921 +3494504955 +766383201 +2095767921 +944336079 +471409333 +3928571481 +1401961671 +1634101824 +4283945533 +4113069598 +3053629239 +851194195 +1677644218 +508380865 +2080736750 +1845703116 +1796270707 +2761946734 +2040576374 +1998841212 +4184541584 +3312661055 +2493376214 +1527143736 +857099307 +3907800761 +1326819739 +2404798326 +1478011703 +2502823970 +1659582601 +733828613 +307786773 +1221265805 +1209292062 +3562020162 +2970490746 +2717032959 +2936701153 +2239423836 +2138685300 +2909155490 +810553898 +4086317833 +1595962063 +3146957314 +3658216126 +1788240451 +3459399211 +1994524283 +1892216884 +1793996774 +3080239129 +3057614559 +3507006822 +3059170399 +3109744897 +1024827327 +2429573319 +3986040741 +3394715785 +54275091 +676759287 +1948146886 +493931097 +268824119 +151374007 +1225012483 +2981230773 +3226269145 +4089725375 +2820032268 +2815687307 +2726923920 +840901154 +2901991780 +688939822 +2166583274 +3274168472 +907016245 +4273464335 +3174636318 +432492654 +1742744754 +1825058606 +3430316200 +3483785833 +876746456 +2405543541 +245974786 +2045033743 +3795717527 +1156486141 +3090338701 +2083422369 +3227238470 +2488118060 +3438919689 +3562850078 +3603323183 +3617964421 +1017912961 +2922592775 +1930586098 +404112881 +3605383791 +2606872575 +1712634854 +1706234765 +3117924093 +2423669569 +2639244868 +4023347841 +3862858485 +611178223 +1867119258 +723344588 +241772547 +2531543004 +13779570 +825509432 +3577117569 +2850742857 +2314478573 +3746115131 +2663336349 +2624455658 +180975663 +1863903983 +947828028 +1161167544 +2606043726 +2274422895 +414158687 +2803114840 +3546675072 +1045232530 +3809506644 +3350642821 +235333787 +500583158 +986450680 +3878193718 +2503031807 +3631329736 +2800533588 +3009594418 +1194183188 +2648649090 +3801099205 +69571050 +399525567 +1951482348 +4161500229 +3147454558 +2599700000 +2582216162 +757231428 +3141847097 +1160327239 +2571702188 +1227547821 +91172335 +2928764302 +3736124980 +1592532630 +2546327698 +673545665 +914402769 +857004667 +3767968153 +2497460102 +3042184258 +1499090141 +2796580079 +3361327927 +1052420484 +2746426563 +4215973645 +3916872195 +4061352545 +1168149261 +460843489 +966055360 +1275767801 +4103864957 +2964988396 +3270751176 +1404654274 +3935888563 +1389309141 +241845471 +3449851435 +1100207414 +1822062020 +3477666497 +2724267027 +1793664763 +3416314365 +3978867774 +2033421221 +775018110 +4099289150 +164485773 +4100728058 +1537716550 +1965446674 +2061296604 +4087238632 +660666581 +3579761655 +3536732081 +4255195113 +378839992 +4088364244 +3362441934 +3447479250 +2926245298 +745560828 +959079975 +775528905 +1993512800 +1976295932 +2423657970 +1737233652 +3940261730 +3346886576 +3266532455 +233357644 +150328546 +1453994008 +3825039007 +3524238979 +734673223 +3930047413 +1248842398 +526223791 +377992972 +169968448 +1256850754 +2241443254 +3515872227 +1423311720 +3372047105 +3368362433 +1329697068 +138928688 +1112781690 +608785942 +725584520 +2869191968 +3333185150 +4090064587 +1320454714 +790748931 +1390640781 +3208079453 +1814115617 +388438839 +3757016480 +740776804 +1899537292 +3663085476 +2682332645 +2802275954 +110249562 +1430736919 +1976821729 +2656439037 +854276829 +2376506050 +2824247488 +825599913 +1423935721 +1951094149 +571387878 +1199136424 +2786239153 +2551018171 +4058373402 +158446665 +735910731 +1167793266 +3161657477 +344567477 +2178795020 +2028434463 +3856664779 +2542974484 +3868131896 +414093236 +4079987224 +2675966445 +1794531615 +2685351840 +183924548 +1005024555 +4129401211 +1853620535 +58369304 +1833246080 +1749817563 +1000221397 +1893192527 +1711092049 +1449163490 +4189188271 +2024567187 +631056517 +2132837126 +1470316964 +1559793236 +2991162021 +3954559447 +1874228933 +2126654760 +3170592105 +3958813222 +1712811620 +1360247687 +747200754 +1475617887 +855817054 +1369310520 +2190342726 +47255060 +3026655751 +4174866675 +4126758652 +3934942247 +3961440490 +378738545 +545470005 +4200547346 +1687114821 +4282010611 +2224040946 +930363125 +4083710342 +4241863289 +1755930622 +3002277751 +82365682 +2279416820 +1561741121 +1638153987 +3148280623 +3421134864 +2444094859 +3237388010 +318586465 +3736030294 +2314569358 +1876060335 +2598802871 +2523816067 +1777313571 +2279733244 +796209402 +141807726 +776255092 +3897028332 +1472026714 +108444758 +2974524080 +1133291302 +1021770847 +2416651383 +399225468 +2491394697 +3532354931 +601008975 +647914911 +195285001 +2214134828 +3742747319 +3926783495 +1114709281 +1898035966 +2993063823 +1353007797 +2010192759 +978896501 +2196801141 +641307943 +808339861 +3884282080 +3058210286 +2251333130 +3813775720 +568292298 +2039178848 +2840915714 +2497173099 +2290352788 +4114962203 +2758743752 +2073588710 +1393098267 +2048692371 +339165315 +398369292 +3354771573 +1975251779 +2076968628 +1944151925 +3511406495 +550201120 +1294637265 +2747350555 +1009326648 +958349398 +1084644566 +1496021763 +699234380 +1719379073 +2017453108 +1579421331 +2654207520 +2126524394 +1720566410 +2294344593 +1883100246 +3929849536 +2102876183 +292725670 +666468319 +165807653 +3652736435 +531528742 +30059607 +3826666361 +230404814 +1948351349 +1938374805 +710633500 +1868990973 +1223389883 +623666020 +1164136379 +625415764 +3603579367 +3532576994 +2841436474 +3808935020 +2903739886 +425207026 +4268032040 +2395997940 +1358269113 +1665031312 +349386507 +1435084746 +828004328 +1551563080 +3381312740 +1265160770 +3662912000 +3187912684 +1704262985 +953811173 +2024349449 +2826854644 +1957661484 +2398250250 +233340394 +4193630341 +228888093 +2485809323 +1132111929 +1436540839 +935707174 +2999016495 +1095441160 +3747700707 +1327572326 +260247083 +2213613742 +3829451103 +4118793695 +3758171442 +2982848550 +4111131176 +1450883515 +2387725606 +3430893526 +1862142251 +1886356996 +2841082120 +3181734290 +1331201922 +1643433306 +163444346 +2727469679 +4268435796 +3563589463 +1217726467 +3221146314 +2527007768 +1443967687 +1690847010 +3598975533 +1008962022 +4262656698 +3619657446 +3317179852 +231329621 +4106132776 +431003563 +2336074294 +3072177494 +3039556024 +112797682 +3459957342 +1955564451 +3852953079 +3410024728 +2682783175 +2800235398 +581284247 +2647103025 +891027066 +1914753657 +193489677 +3205262842 +1105386412 +965199743 +2136738804 +4163537425 +4007274364 +3752597043 +936756635 +3163358090 +1607065984 +845896619 +4052437086 +3668872358 +2910213851 +1805080432 +2569118948 +540759015 +2703498241 +1653433675 +561483256 +3886314959 +981231253 +1282496843 +1294066162 +199773304 +1124297107 +2187428461 +809593888 +4259263599 +1185589396 +1325175628 +1538053772 +605424139 +3063273106 +4213087889 +1154825015 +687687759 +4168202984 +3192604220 +6430357 +3728472387 +2294956558 +436092569 +285007750 +2643795719 +553758856 +2276580974 +1502263387 +383546497 +4229270222 +3728598714 +2823330951 +2209987064 +1778680921 +1660655934 +1107378493 +1517612389 +4116725794 +1976824406 +2556207788 +1589084310 +4028955480 +3906759871 +2332709105 +2905948472 +983596950 +3348528031 +4150827293 +1835115947 +4283612338 +3283407027 +4243150330 +1883715861 +1089601111 +1496855821 +2445070420 +47353556 +4058287806 +1954329467 +354588538 +611980456 +2798608028 +3632702485 +641662657 +618678627 +2274869334 +1650127829 +3402835754 +1880213078 +2693629845 +3297798283 +2586677005 +1063736432 +2186259403 +4277976630 +1458179095 +1543570948 +2813495974 +1661790444 +1787603551 +3468649583 +2365870573 +3835392787 +1569675155 +2789177241 +2871070002 +44289815 +3561687666 +4264427417 +1032749718 +1791526668 +3499990157 +4252330402 +116860105 +2831869905 +2276032185 +2640868263 +2498966451 +348359156 +153164435 +2377519818 +3516998559 +2355989140 +1209571079 +619236673 +1832722434 +253081680 +2522731725 +1287165150 +4183820251 +3619952776 +2024115372 +4010932045 +135599415 +2530274303 +1819958081 +3692065474 +2247002978 +415893043 +337793862 +3988535114 +516569459 +2311337332 +3004913337 +167847139 +1933499459 +737033885 +3368303092 +2353580343 +1569196132 +260775848 +631822041 +1453048275 +2165934373 +1996319991 +1532049646 +785110424 +2948573273 +3358204485 +787336645 +3089579635 +1159905025 +322484591 +2552412826 +1264810194 +528242115 +2258112709 +3187537362 +638493119 +885887206 +2470269660 +1750183174 +279759863 +2434016297 +1801855468 +2885290784 +678398086 +659907727 +1285277461 +211327911 +3293665008 +2474586708 +3434105651 +21878545 +2547657136 +3367581145 +2501245488 +1677639530 +3646283698 +4258894230 +1169160915 +3239448939 +3918209672 +2058839824 +1489075292 +206899403 +3476443022 +2417069751 +1530875696 +3415348595 +3431061021 +1417336537 +3463501934 +1150279297 +3921771632 +1006458386 +1299124164 +464647532 +3009900045 +1364338045 +130128719 +1773693508 +369171718 +3829249103 +3984057682 +3688308300 +1104426736 +3300271980 +3715154442 +3387370149 +3999252464 +1409946283 +3815207087 +2142132933 +1500426618 +352959056 +960557162 +4150737919 +1449564852 +2807662641 +258268257 +3804736807 +2119860667 +2976857917 +939735643 +1122811283 +1193849915 +3605232626 +1952352741 +2539755181 +1845734527 +1238864299 +279727482 +542364957 +891483541 +1043956716 +650590695 +2437428391 +1454788582 +3418086715 +353962164 +525857861 +2902720074 +1843876395 +1080492233 +2164626154 +1303422828 +3805887842 +3293933440 +2093715154 +643488723 +1745734862 +2437429415 +1246254526 +2540997954 +2701102173 +1802045384 +1056369877 +1037814521 +1994221912 +3284018838 +256910653 +1799066194 +2608590616 +3827475671 +1225455284 +2743292286 +2034201651 +1133360988 +395487668 +3032056438 +474289207 +1940679172 +3622337070 +4008852317 +57936294 +2932630872 +1465851257 +1619090210 +3863854609 +583770373 +3331245604 +4205589379 +1568890202 +2722198259 +143788720 +4162474096 +2720419441 +4102842412 +1594515990 +1798396977 +2053005769 +3522437437 +3492571346 +1086528356 +173021874 +322111527 +2188596390 +1311995950 +492569398 +1014630112 +208859493 +3529214436 +1424817705 +4090092731 +3677173665 +191298450 +3026473167 +484662683 +764600937 +3028130136 +2792373700 +2928958260 +3946701091 +3491356166 +4071037473 +1432007865 +1122004236 +320774582 +2726704527 +308301120 +734265277 +3747284415 +2960075603 +970523047 +2774524778 +3526120441 +318821356 +4208002082 +1470873970 +4108535807 +411233948 +4140481695 +2807023922 +1998219664 +2575502840 +3026369128 +1374855628 +2262935509 +2659028748 +1704434554 +3996124259 +3607405669 +489510327 +3668807315 +485310392 +1757500630 +1327888884 +3299300568 +2247092148 +2347951171 +2781076687 +2429151958 +1106651524 +984271124 +3877603713 +629411457 +1324531036 +489305053 +1274985618 +1522476438 +2263654118 +3231789403 +1650238950 +225601962 +588667610 +2089377664 +3273346657 +2175232552 +1637196643 +1385250623 +3494190495 +969942485 +3867963234 +2519077395 +3888707853 +3259534670 +3431353456 +2617742908 +4121329013 +2046600736 +3602761641 +2629530955 +3738421205 +3921107208 +1506043752 +89372295 +4284343701 +1932265561 +1274044780 +577677243 +4082120258 +1323349162 +4206996756 +491024287 +1479857632 +332179084 +3358009817 +1638643918 +708703569 +3804792479 +1842472668 +2127766971 +2444911728 +3703514844 +1464902833 +723742853 +2406048626 +1381492237 +3920702747 +62682268 +3570222637 +3200983362 +1997437933 +2748983060 +2125594095 +734188255 +1807639286 +806397388 +4172500799 +2382733404 +2047115764 +2376265705 +3579919889 +2834589797 +1287785292 +1058238843 +3026624265 +170599851 +2177415497 +2089591548 +89983709 +94959992 +934653119 +2279988645 +3475771308 +1449668259 +549225208 +2169832108 +796272129 +2816557008 +3017116962 +1162012558 +1500459218 +2399059329 +615907262 +3254350469 +2276910954 +3825709050 +382298444 +1457402998 +1573213699 +2501387930 +657054009 +340863437 +3384302129 +185683612 +4252668756 +2162961454 +994469714 +3244906567 +415613965 +3255163410 +1057902240 +3973177532 +3016282204 +2810503857 +1099336678 +643985328 +3645763883 +1629343907 +3519080453 +3462318590 +2080218528 +2252799113 +1069935407 +3353846162 +4269297285 +2492484616 +2310553402 +3499937373 +2595944778 +3502816614 +2980600437 +399946912 +2469392546 +2655396851 +3718014020 +4241150977 +3750967049 +4238107176 +348907482 +1196090257 +231865515 +2121340242 +3486184058 +175715048 +2893847225 +2946302023 +4186229563 +2847229537 +4000848006 +449369495 +2438921321 +2898227859 +3063968661 +884045055 +1766034348 +995273506 +1027275999 +3341320275 +1271532241 +3735719240 +511704102 +4111484074 +3071136090 +1062543750 +3250248392 +1243207588 +3485006011 +805526109 +2918868241 +1842018183 +1524804061 +3602284655 +2334306425 +374711291 +2715478168 +4025326669 +2847643425 +2950429535 +727658534 +3364183463 +3540131568 +3462081513 +1838077517 +1850456626 +3996818909 +2064516899 +1917728193 +656423362 +3776278708 +3562745832 +248933355 +4282297794 +3776619682 +1283899283 +2060341308 +4178281200 +581921113 +131924089 +1187219057 +2094132971 +2133595040 +1818915636 +2056819865 +676565401 +3861140731 +105390854 +1249517253 +1006261388 +3530260674 +2186592614 +2068302487 +1865041360 +4178504455 +2997131432 +494804323 +3494719463 +3512032245 +2413839129 +1161887867 +1257093559 +69001272 +866357344 +2807458538 +3390170707 +1245165883 +3238880139 +1120975621 +3254029404 +3939757183 +2287021915 +2031941952 +654417580 +919147117 +3769751490 +1189715979 +1496559065 +2676906708 +1254354486 +891517969 +3504583503 +3606210672 +3609419705 +1007728947 +2885698645 +3238062356 +113666966 +83338145 +494857792 +992109589 +1001352429 +1487990778 +2046366192 +2447895756 +3076698831 +2548519482 +496866210 +2511202819 +3981026561 +3376590372 +86857896 +33450278 +675917229 +351390892 +2976589726 +1164711943 +1957275035 +3399121335 +1134381562 +3079990171 +1910259019 +579771312 +1337285621 +3668755409 +2007977799 +4277283238 +2867400959 +3132865559 +1204776323 +4277991819 +3704216435 +3678218513 +703944130 +2549557572 +2844283276 +832835251 +3010151465 +2187803273 +439369188 +1615869008 +132336587 +2405915614 +159181347 +1147998845 +891742232 +2038132952 +138040549 +607560226 +3780508446 +1941356205 +1053123190 +3169960918 +789669399 +2680332642 +2240055460 +593337223 +2530103278 +1974598163 +39712662 +937672441 +1929072716 +4170795187 +4037242626 +2732669872 +4002484920 +1579312526 +3125087293 +3186314822 +3375041308 +629346386 +2299131681 +2416199112 +2766153432 +2177343516 +2516507248 +3933501957 +377734948 +367840483 +1355216707 +3515895781 +1266230047 +1837464284 +3701383125 +151644088 +3896506290 +549601583 +3359028518 +3602935319 +3838277810 +4064412263 +3923499488 +2739507691 +2058046327 +163913310 +2173633815 +2341971955 +130536043 +3171580982 +371496966 +117463743 +1757419973 +1436322334 +2945372806 +2219109750 +4282059032 +3769791130 +3322951499 +3670197848 +1955517872 +2419522330 +1097047760 +3643977740 +2878413065 +1617623470 +1518216417 +4097167721 +1907451961 +2174777465 +612715155 +2068411776 +1572392671 +1389374598 +591030711 +2575605467 +1777803882 +1151256558 +529924297 +2790865965 +1975197719 +1759012785 +3816878200 +1577052675 +628582078 +4083575037 +554886972 +1926667008 +3521741423 +3877053695 +2049854812 +2695844126 +2803850944 +2071406279 +2013048948 +3182226498 +3897703189 +2710218964 +3904637666 +1199785882 +3258768852 +881543754 +3895948206 +3072085059 +411630154 +2883920407 +1374655385 +701952761 +3460595236 +2942225736 +3184633492 +1527177315 +781707594 +1610168205 +2187579510 +1251827552 +1796024704 +3986827763 +2216386708 +4100552356 +2341129090 +788834784 +1537127777 +3601799648 +2239920191 +1067457066 +1580427509 +79756789 +1622982463 +1838153936 +3694873781 +589172680 +3741401636 +918210766 +1201676276 +2662495203 +4049295052 +3689802762 +3891218971 +2369285927 +2589219029 +2820005386 +2875656029 +2160673057 +24000054 +2842787445 +2880195501 +2720777235 +1626472388 +485267693 +917479883 +2639633721 +1182047994 +1767884771 +3943534960 +4257975117 +2588453156 +3591040588 +1267857743 +1594345744 +3882519453 +4097804565 +421404231 +2107683143 +425044549 +525598606 +845178443 +3637910330 +2443325255 +2531547007 +1150692316 +688313505 +854617605 +2510052319 +848445191 +4131764262 +3205647133 +602734751 +1868645929 +2633755500 +2071937890 +4230215643 +9253297 +891793665 +576427548 +2624930681 +535437423 +1936162123 +1786466657 +2797162395 +1425358347 +1496394902 +4043725280 +300066888 +325515779 +780605905 +3724384721 +1601892696 +2904297014 +450222328 +2336984333 +2034730636 +385350378 +2264797559 +3406700747 +2786679515 +1458446789 +2148730415 +3212601636 +2480721930 +3136253128 +2950803516 +1658446624 +1558433421 +3280014121 +1769170472 +3311328763 +1768028748 +3018422801 +3177751193 +3997949987 +2378365002 +4101896776 +849945248 +1989028684 +1947163785 +847913355 +100093336 +3263710662 +3314423117 +175752480 +3300293205 +887377084 +253741758 +3206721478 +2409834760 +2793259205 +1381326887 +3545401453 +1492773640 +3825968488 +245475195 +2218644609 +3579481662 +3341503369 +150361874 +1459228808 +2679241297 +690653449 +435737045 +3962747981 +65770814 +3438935318 +300453530 +2147089463 +4142077334 +735151461 +656696534 +3375754717 +3595369459 +2559965423 +2154731038 +1553133357 +2762750016 +730096809 +3258593047 +2622552722 +3455918165 +2316075167 +287581097 +478538845 +1871209794 +3858788548 +3433237539 +1936543284 +4105782609 +938134531 +2650209641 +856696922 +477046137 +595661894 +2396434295 +3678730933 +2297267849 +2336478323 +2297139598 +1274968075 +3222018761 +1136942158 +2356786872 +3287781262 +2580891897 +346644794 +2063941337 +2662700467 +683650578 +1962440125 +2229564348 +3349121418 +435091876 +840485573 +4258486331 +2770840495 +1523603141 +2960528534 +3248947786 +550092275 +3912921828 +1963986484 +3669867833 +856113567 +477087908 +3649861611 +2506329285 +1277406468 +3422406930 +523361192 +1697120518 +2738097488 +2606769864 +137695141 +3294890726 +631772438 +2686659989 +4266465133 +1336848912 +3189301592 +292595718 +1344951727 +911425886 +1057116958 +482267610 +2553667575 +1659839959 +3520359094 +3088215602 +3083109370 +1068275552 +2758266155 +641831156 +3947625857 +3334007259 +1646367971 +1931842943 +1249404838 +574870652 +1333019709 +3481869825 +4200775280 +4271250924 +1664262908 +2154389883 +3986443822 +3142878643 +1441610366 +624984239 +602536285 +3438179642 +880027056 +2042857709 +1140931327 +4088410249 +23850948 +2079935663 +3366955732 +4116579647 +3671404780 +1049505973 +3111444019 +3089407658 +1234169506 +3574629997 +1372202544 +3971770400 +966210302 +993785461 +1958007560 +3626072553 +3384203886 +3330867375 +2030165545 +464677954 +2717713164 +3180779233 +914822877 +1682078534 +3341242411 +2590584257 +1731856628 +2944051524 +2607749889 +1850316647 +1857125386 +3477266218 +2097724808 +1762595157 +2710102171 +1585851918 +2516823581 +1597266602 +3547858735 +1286097839 +3844218151 +2854549031 +1771863494 +577024113 +4291140492 +2815500651 +3351167357 +565171898 +4003273925 +1130080893 +882284686 +1612958798 +1608318602 +1306795426 +3242059792 +130179064 +2772450371 +3563875947 +1681560625 +3321046334 +1573797546 +1441040001 +2082800096 +1149876992 +220831947 +4235041068 +3263921475 +1010577479 +1775648636 +4121603500 +3556349310 +3935895010 +3598096810 +1730637909 +4203800019 +2711578025 +575967838 +2418363113 +892361647 +3286163672 +3239236140 +3112646023 +404969539 +1387416713 +1966503119 +3912430807 +1453163197 +2039125598 +2117050729 +1283593048 +562488191 +590149329 +1245479908 +439114535 +2962636392 +2062723840 +2531373901 +1054775254 +3875201408 +3590061661 +3576282406 +1074547880 +1844848602 +1006090885 +1946314825 +4053238432 +2845818885 +2991503243 +960899522 +3428204880 +947979437 +770937941 +2846121288 +2297524112 +929989230 +348548903 +647118738 +900865774 +1251336894 +833210651 +2038496543 +2012634034 +3329435286 +2216047127 +858942655 +4028216392 +2855068852 +893305655 +1836642562 +3540764531 +506471641 +952458287 +2555313950 +2952883688 +586435152 +2642193165 +1937405005 +3420649149 +787686053 +1408746656 +4040601856 +3925001117 +1882265971 +349323309 +4147068211 +525924427 +903620262 +2673607875 +2724854936 +1152992292 +333673729 +2656483720 +2371203499 +2824597303 +3431731188 +3945085282 +2584690544 +4024957330 +872981023 +2080699668 +315002015 +2056544398 +2958314126 +3255717234 +3414112410 +1566472534 +697474747 +3798681867 +4070338786 +4053357760 +1873195758 +2008244683 +3662067012 +3923716878 +2082746945 +2050337216 +691461751 +932305351 +2368433737 +2787389461 +2657985806 +4035378252 +1224383078 +2169923354 +2818168385 +767627428 +130321209 +2005437938 +4138921365 +2455059787 +4089200620 +4027046377 +1185220818 +2576689164 +1473319152 +907721926 +3183777599 +1296139421 +98671595 +830061231 +4146591766 +510560119 +1794616846 +1922007307 +1978965229 +415361570 +1878868899 +2812058514 +1473550389 +909702452 +713290203 +335833463 +2096889573 +135003365 +3453819578 +2416975095 +1830940831 +3966596130 +1708580472 +136061856 +3932718833 +718590921 +1100340751 +654062291 +2101220003 +1974790868 +905171299 +4084603576 +3697523584 +3130831902 +3982014629 +2208849930 +3672315369 +1966621392 +487935599 +2768892209 +2240431049 +1890583171 +810837392 +1756908018 +1218086116 +4122737848 +1662774768 +3496726900 +2598916520 +927808956 +1269001439 +1929954059 +1526413926 +3075200702 +2452717051 +3442328435 +791187447 +621850592 +3934948835 +880659235 +3295469625 +1491248533 +2343613062 +3930159059 +969653437 +405622430 +1161453090 +3195437117 +663798156 +4164266705 +1798393898 +3761491289 +1265619637 +189625510 +475269326 +3009234539 +2170098418 +1275980005 +520530253 +3507120963 +935456854 +3025031072 +185025029 +591809817 +3343491820 +3220719415 +4059158410 +1011334579 +1231003062 +2134445901 +3254642584 +1191962849 +2317417929 +3535407621 +398169996 +2271145348 +2305008591 +3399853640 +595858878 +3597620309 +3747963020 +991449772 +512330298 +2905615893 +541788562 +2316528591 +3712175997 +1668264912 +2729201056 +841513999 +1617128581 +2710639368 +532645081 +2899867308 +1675815720 +4114838097 +2463004200 +2148077196 +2949141814 +2293925651 +594154854 +3708485132 +3409294965 +3695511114 +2035488763 +1513634233 +4046615385 +3622342502 +2675043127 +689236315 +2703195176 +4283073535 +2713015807 +191250567 +1477666714 +127178869 +2440286674 +2808849115 +1115580105 +3810377386 +3386044672 +2294636114 +483255793 +3759169502 +1656008257 +309323435 +2674945640 +3360787696 +1784423692 +501422200 +3025736043 +731020356 +1772676243 +1175816334 +727245809 +770391884 +573876373 +857847454 +2982653472 +1429440140 +2201679787 +3730525643 +536700475 +4145334724 +48771505 +3340417167 +4099830573 +958857246 +2251289559 +1813060961 +4132200375 +1249199860 +1120669515 +2513010015 +3959007433 +337860382 +3619297004 +2078406934 +4293027460 +3071349580 +4010280375 +503898996 +2671542878 +2140297962 +3131696409 +2972866258 +1275237612 +2601347399 +2694005693 +1521187928 +3484568315 +2910684460 +3507702140 +2598847027 +2738975448 +2757960766 +3310974482 +1535484096 +705373410 +1049733700 +989184954 +61060348 +2797687264 +392547146 +3188002665 +1623364721 +2166775961 +4212126388 +2195837218 +1733799713 +934170246 +934950936 +4001208537 +989072333 +1324503152 +405941817 +3963822912 +1076167863 +3854373162 +4237067789 +859673005 +1344015591 +1089043174 +1112149325 +621931598 +2288163518 +1970828627 +2367836018 +2649297164 +2102180681 +1604769237 +2117528291 +203539547 +575615003 +2543745269 +1915751919 +3841308677 +1291935899 +3170163709 +3820883648 +3483408410 +3906010760 +4038374606 +4129767217 +469365683 +3059250631 +338999412 +1468711634 +3415658357 +2674019779 +929176153 +1834663573 +2504644124 +3693474114 +658438337 +2962624967 +4030715259 +1698273259 +179543369 +3988707443 +4139845559 +2144958133 +1275856505 +1124923250 +482856845 +2493737622 +3837591564 +93557415 +1044265321 +2611056804 +15064051 +2434951573 +3362935165 +2079431651 +4189872877 +3885101754 +1422631042 +2670735775 +4200705529 +3653141840 +3377810567 +2563335046 +3318998883 +864595373 +3632521141 +3789650941 +2793114170 +2956165912 +2487446629 +1416973871 +1150296071 +2524065988 +1237907238 +1886638652 +3866144674 +3888713740 +894386581 +1617683464 +2592411 +1513808223 +1736222609 +1121077821 +718469993 +304048163 +869231666 +3972317940 +4138287829 +1483019385 +925105553 +383912399 +3322463284 +3729197148 +3104650608 +2908782832 +2934605117 +3242514653 +1329004398 +2418294429 +3158688974 +1197303719 +2408675635 +738026694 +4082815940 +3011981434 +3420435341 +432064619 +672457503 +2628384122 +4233461196 +2423806022 +2369840347 +4104669828 +2636540820 +497346805 +2927469842 +1052366076 +318817583 +1177944495 +689237361 +2682042411 +2229276317 +1613578233 +1924614074 +4106739492 +2091084652 +2092331271 +2913224719 +168428324 +2357263342 +3422115895 +2607496061 +3147042577 +934095551 +145035794 +859772029 +2625694116 +1229834055 +2390255214 +3011597964 +104963460 +1003219059 +881927680 +2245209344 +2961527999 +4041086898 +2077431062 +3143403809 +3680044939 +2246517347 +2279704033 +2954631272 +2194732960 +3543379667 +1162643960 +3731418634 +2622241917 +296187331 +1809401482 +2809037910 +83490358 +1858217959 +282548897 +3636258734 +3571960751 +4203965387 +528274621 +3712165566 +651207474 +3714635581 +1577538685 +1400777546 +2048632056 +2683680224 +571464905 +3309179557 +79666099 +3142802840 +3331425290 +896619580 +2365851259 +673532624 +877511892 +720250859 +1724838938 +3997003299 +2746970930 +2211634420 +2361646279 +1797251097 +2278449903 +3720233432 +3530134728 +4093044754 +2728500213 +4048806213 +3709203622 +2040062920 +381930837 +2299529538 +2128865771 +1592492301 +3009749409 +1457750084 +571132770 +2693083246 +2013231260 +3714498560 +464953906 +1349459366 +858600816 +696096440 +2008807875 +2987583724 +2537297081 +2388969680 +3529187101 +1386785012 +357580294 +3674938714 +1578131871 +3665480461 +3524120014 +1024979456 +2524370630 +3120078624 +184502714 +3878224599 +3055908752 +2247435689 +537504824 +2750190610 +1251897105 +1942822668 +350565330 +1457163877 +3134889676 +1336407957 +3441142268 +152522557 +3088177633 +858467730 +459763377 +3085947924 +1252155455 +1723497561 +913103063 +1234626560 +2294331055 +535563528 +902876111 +4082172307 +4038845661 +1820004721 +4284953194 +1533312352 +982450520 +1854435329 +549487898 +2693130425 +3491907154 +2004400782 +3350296433 +3958160802 +3253117091 +349103893 +3542718798 +3502617015 +141041758 +141799095 +3002942017 +1150919132 +1977754013 +111654600 +2945685510 +3778891727 +3078563533 +2051660871 +396829123 +196430701 +1751932029 +3583645169 +2686031124 +385761245 +2849420050 +656568602 +3312472415 +2046971767 +2251413451 +2272506301 +1103647428 +116219050 +374294936 +3869683014 +4135994621 +124031717 +387288184 +1262873913 +2729468640 +4156681656 +1649565184 +762658891 +2663567873 +2478580687 +1464411726 +1160935820 +2045468762 +1374342776 +3376809110 +3593864109 +1955102909 +2327149720 +390662748 +1600598903 +2882400385 +3176040286 +858308729 +18672801 +1395574858 +1100634171 +3389489837 +3319320030 +1316189783 +676216971 +4072604478 +2054136755 +1136927436 +290842516 +4286639772 +1200309649 +3065978823 +1031467618 +824309092 +3147976540 +3797580393 +3639538467 +2114241601 +2659272069 +1296946066 +3460904902 +175919893 +3416789940 +2481370920 +3122983483 +1204621525 +3219769560 +2989265309 +4035389369 +3183265172 +2606458035 +3736102623 +479835703 +3556454436 +2992076989 +3431023618 +2854245652 +1179211647 +3201376865 +2550640750 +3264095991 +3733475872 +3204493175 +3405496446 +2464499422 +2779423147 +74060002 +3234204377 +100702390 +3009986903 +1497561451 +2821672018 +3206920567 +581042866 +3764833032 +2286743733 +941115816 +421248397 +1904000469 +2350684838 +47477030 +1396502537 +716435473 +1434109981 +1675521123 +3776221307 +3069224790 +781822954 +3635602475 +2705340553 +2755293099 +3479765995 +2945686834 +2914933146 +524651912 +2645919654 +3170572201 +2498221693 +3626824599 +2912708361 +2424554219 +4001963417 +1236919624 +523949585 +195898784 +296780871 +425792094 +660828101 +703807211 +147381160 +3075073263 +3955897607 +895338069 +4247325493 +391228013 +246416619 +3734402006 +1807163628 +2055366548 +2890053397 +1325925186 +491497440 +3401141480 +718743508 +3992033828 +3638171362 +2084777333 +1404725987 +2164596684 +128173915 +2179495898 +2734114249 +2302874173 +2601881294 +4266300959 +3240459746 +2133359060 +1892190220 +1329873257 +2923613920 +1566152290 +4072741564 +3183115975 +1474936216 +1349197057 +4198799347 +2467396884 +2590642268 +3791533802 +1595935286 +255184872 +403772478 +2546814948 +484181795 +1950244862 +4234789605 +1131157061 +2426901753 +1821521908 +721463250 +2907076902 +2839650622 +555262840 +279700534 +3885044850 +2335489663 +1301933164 +2913222502 +531554497 +636685354 +4035405012 +3972797376 +1011285494 +226388886 +2260756705 +3684747658 +1149327496 +2255188808 +806745978 +3417751566 +1029876525 +1905359153 +333548365 +3781144604 +1062851850 +799991703 +3668925388 +3706193134 +3732627677 +1416306132 +255452023 +2733696998 +2917540045 +4221795939 +1405259783 +1310761112 +4088589390 +2327832942 +3439418546 +168373216 +2676437115 +3515356815 +4286244001 +2964044278 +3239534839 +2512366498 +4028616461 +1444402675 +1659262127 +728312508 +1744056746 +3895499534 +4178674268 +3507784757 +2007925811 +3564085609 +2562405976 +2993912585 +868824647 +1489881978 +3789813094 +1608935769 +3685737463 +1439475295 +3613203929 +177644277 +3891819318 +1315586475 +2902682147 +1080100360 +1575641188 +2882709374 +1300016074 +121814969 +3303738950 +2109637858 +2289453523 +557549741 +3230395678 +2337573720 +1906679805 +2627109496 +2331603173 +3835827713 +3074701200 +2398997384 +946104350 +3717332233 +1840146004 +1500125935 +2459926681 +1605680944 +3812264274 +1594207619 +2108806447 +975340799 +252600584 +712967480 +1900612252 +3477871533 +2403724612 +3029093907 +3063669052 +3417401902 +3632964791 +2749472820 +3947203876 +1299587653 +3724872946 +1699653916 +2302370527 +2939592507 +1141633219 +2759177202 +1036599797 +2856925484 +148682033 +2931421735 +2969086108 +2722419252 +883744333 +963484265 +2861402087 +1997976234 +2921575197 +2004127043 +83306711 +869078965 +1441684959 +2909480351 +2914307132 +821713555 +2816571323 +2233178877 +2838249514 +3498271939 +95749581 +3994159664 +2919169989 +1299115737 +255713330 +3125730252 +864390226 +1137818541 +2511557946 +4103625997 +873624455 +4172651489 +1466094926 +3348254321 +532827909 +581668196 +429551152 +3670022772 +3550527352 +666920983 +2668862259 +3844026082 +2574152349 +2825178606 +650749480 +1398489453 +2728501801 +1348983443 +1944286902 +282971941 +1508544916 +221370481 +1570820839 +341554239 +4257845782 +1128280778 +363567321 +3723356570 +2272630765 +1443557240 +2771163105 +4243468085 +2605698549 +1279967098 +1659641145 +1745178144 +2710071267 +1861159942 +1894647285 +4186478662 +2102001670 +506842409 +3579200791 +719316900 +1086323391 +293216066 +747509797 +2538342550 +3785184606 +730516389 +3854788274 +1542499626 +2874947170 +382509271 +1640202176 +3391620234 +2861715973 +2085480314 +1749823641 +3256695095 +2742533682 +640087641 +111084889 +152961903 +4135700579 +1640937371 +2752700969 +655479307 +3436581929 +2004772165 +771124812 +1593410233 +1495299531 +165122413 +20298560 +522007774 +3370555087 +337578245 +2985977919 +180231306 +3679565792 +1184276752 +462696065 +1546640587 +489183138 +3374754299 +585133177 +729555041 +3463326567 +3397566478 +2439950996 +465988396 +286439368 +602152676 +392322034 +3986175605 +3444905240 +834863455 +238586625 +2944535029 +2107816550 +2053054796 +2009377405 +2254132870 +3611099551 +1536388679 +2230947490 +2070444982 +1996422208 +315543082 +3684513943 +2462999354 +41858162 +1107908514 +3929572687 +1693869588 +484967879 +1129747240 +2927303129 +3759920508 +1526007968 +3352516882 +2128381140 +3179082674 +3101177106 +1407655263 +1683886129 +631149128 +1066078783 +3495737156 +704327144 +1920392141 +3767847133 +3350433455 +531512539 +4205601449 +4234243800 +784505716 +588381900 +3278698588 +750416718 +4247086052 +1332040368 +2558356578 +2888023581 +2355328495 +3619820326 +2645545850 +3419028931 +2056022879 +3292367168 +30662872 +411448512 +1001717975 +2159513957 +3680913186 +2164988300 +2499034413 +3676804712 +2669447257 +3528362527 +2495636313 +3640214579 +2812867293 +2575481548 +1627493244 +4183079529 +517155430 +239509252 +1052368697 +1130875679 +3777888046 +3748371646 +2987082293 +2804697514 +114094292 +3138082668 +3977383203 +1129320653 +4220464076 +3853852083 +2241435394 +2365354109 +1163167511 +2367770426 +1122173048 +2967912775 +2112563482 +2045460909 +506501023 +1749536332 +2818517916 +4116453605 +4040285586 +1526142943 +379590964 +1489272606 +3151538279 +2373624697 +4263911452 +54891012 +3720855813 +2462929773 +2944141759 +1053989631 +3112720102 +115587857 +950018837 +4208116316 +3415051725 +2204598748 +2080506005 +2409958989 +2647437697 +2888324936 +2992400773 +3060221925 +1068576226 +3377172190 +2362902872 +2976883897 +3891519035 +1570884661 +2744438013 +3507384579 +2325984945 +983118447 +4133418653 +1080048420 +29486424 +1146113079 +2760999731 +1731008859 +363323578 +406246129 +2561429708 +1699224558 +385034092 +1112601917 +351101763 +1380200004 +131880954 +2220597461 +3170871714 +1768459158 +4207228358 +3853633283 +1442528840 +3348757387 +216399614 +1071160795 +2271713000 +3509220831 +664666994 +3181054847 +2623311149 +4146123211 +1298594172 +2862787255 +3965889668 +2024747788 +3499583245 +334700360 +930969908 +1501129089 +1376104624 +4036483047 +1188127895 +2645058266 +2159857434 +1891541399 +3435361256 +886974405 +2606774233 +821203751 +1337048843 +4228921359 +3828540593 +3666563079 +3147982290 +2747196915 +235969178 +1512654471 +2247253528 +3004910733 +537047904 +1284160052 +453839274 +125983218 +3069485239 +3516027764 +3775387554 +1807471530 +995878972 +2113038138 +2951645359 +4045063974 +838621307 +3073049951 +325384071 +3156938914 +1733791967 +3711068358 +499899994 +2193642345 +2878657186 +3497235927 +921388204 +1276842544 +1650669765 +2815698338 +2015568132 +2169363790 +2207494414 +626234535 +3390661097 +3627384365 +2856969574 +2086463376 +671700941 +1444332958 +3395716568 +3083310143 +3555173304 +2880418596 +666378732 +217490159 +1984252846 +3307090273 +3646816439 +3349652492 +1758256389 +218952160 +2547721987 +4264940937 +500505482 +1511381814 +2265844968 +1404695264 +662037438 +2830753425 +2183144013 +2416171731 +239089 +2408993301 +4164085145 +3023807980 +2617161161 +1396418354 +23903724 +2557465761 +2959948022 +1202139767 +2288354242 +3717275946 +1531237897 +3717050484 +1798919815 +10453811 +3166742689 +3840197167 +508173281 +2371816529 +3907819242 +2686561690 +2833227397 +340708720 +3098008890 +754354495 +1737791930 +590581035 +880732413 +1217283368 +2504525922 +2990244313 +3638281530 +1495454918 +4007908465 +1380361231 +137038918 +1275548140 +1327117624 +1859935168 +2015356366 +3385792273 +803794504 +1830236439 +1014507384 +606233517 +749832081 +3510820556 +21013678 +2052712434 +2264670336 +1116268591 +3194915770 +1990714280 +2157551963 +4145178618 +160406550 +2050948661 +3456183617 +1179717328 +1359566892 +3671913293 +385235395 +580914903 +3428444128 +487197493 +397184427 +224080487 +248643906 +73474141 +2801387908 +923837979 +1744477066 +40295137 +1006871735 +3590287266 +2611067302 +3890354545 +1097165365 +2919776849 +492938146 +1877842715 +532355130 +2497748398 +825174820 +3400484565 +2443454323 +335717192 +4174701395 +1667663418 +1297144242 +4034911091 +3114663925 +3875953020 +3406826494 +4170542378 +3259376106 +1495817045 +681986754 +2402082840 +313625689 +3859095505 +3520587148 +1898287522 +4185053173 +2687317946 +4221456660 +1466878574 +4056347827 +1538035519 +4212021115 +1976719359 +1388694684 +3982937127 +529071658 +1763198779 +3938092633 +329152793 +3215384138 +3581317521 +2876713275 +2720016332 +260552591 +2367732503 +2889343241 +2962649310 +2243878420 +2758051345 +2898042504 +3953760581 +4094359656 +1946722482 +309177396 +3151944758 +3344123925 +1007843940 +227565023 +1249162708 +2273481299 +403651676 +3128271769 +221436924 +967537651 +3729264471 +4113960392 +3792869111 +3755536648 +217297177 +693537418 +4159929091 +1947993409 +142841376 +3178564834 +3908369097 +419896682 +4170608191 +2287665559 +1743133626 +66641149 +3497520716 +1577913420 +1417785518 +953494455 +3009907683 +2452620312 +910777280 +458478297 +3948162523 +2588747450 +1640424815 +195573730 +1541506813 +4158116662 +499597045 +1216367600 +1235880268 +3702648292 +123211833 +472470565 +160825984 +1827018719 +2083491238 +1518034867 +1302715601 +2285825824 +504376673 +2203565979 +3989683272 +3883934327 +1325770737 +2338171981 +4062966416 +812583977 +579193275 +3025980484 +1355239681 +3631829658 +3010395689 +1277305016 +989396865 +4130296320 +2344194833 +1881535515 +2253729246 +1572984857 +1962731392 +1849247801 +3169095141 +1640073185 +1719949274 +3472596611 +3255498585 +2614948729 +891649237 +3533805142 +1668750833 +146997259 +361521300 +1143110198 +506668448 +3586280221 +2167764137 +747575613 +1088314588 +3845503413 +431875899 +3561266038 +887439992 +35738395 +3494614507 +3652877444 +1548337394 +3730513197 +3112346635 +2613504478 +482085716 +1344823843 +1713974446 +3593850166 +549993909 +3737024227 +25985045 +3022396722 +1907543786 +346460543 +3177644821 +1947353596 +2506665786 +2450526091 +579220959 +2135433432 +3401645336 +3688866333 +2068178873 +2332153107 +3846872092 +1539441969 +3512442631 +714507038 +3686685415 +2029278077 +3820284361 +3298625370 +2099083491 +2908485358 +2165238415 +1253169593 +2529779911 +893273087 +4286822781 +2247596142 +3353550176 +1889333322 +2684233939 +2980698423 +965946207 +2280741219 +291345692 +1828876337 +898348271 +1430113884 +1816861405 +1955501397 +2748793905 +1672451639 +3064406516 +527443227 +1592007060 +2986847903 +3173611934 +1628952837 +982936281 +3005865441 +1514081602 +3930404586 +1168633772 +1926694073 +1643106987 +2906330488 +3514592598 +930525285 +2250007080 +4156461518 +2981792954 +926638533 +2569593161 +2752866206 +2486055074 +3022971174 +4201761617 +808876182 +2744522977 +558819861 +3705281150 +2377841877 +380024119 +2221633290 +959824527 +3064164387 +262910254 +2860694961 +1216652347 +603515618 +1603155781 +2192759489 +1687788593 +1432370136 +3377618138 +4244327881 +2430045185 +1758012738 +1661983556 +717602905 +155757706 +1624613476 +2819969279 +2925498968 +2329215801 +2753150104 +18368422 +1225234004 +1531669815 +2695793657 +2208467220 +3384229855 +493383887 +2944931249 +610108837 +3449045070 +2415338722 +730378507 +58146413 +713151698 +171548561 +2384294991 +1784588158 +344952671 +1595156862 +3512943303 +1263142545 +1487234313 +208308988 +2611286967 +2263826321 +1461404405 +3355048848 +3855288307 +3039496339 +1907807048 +3986340226 +1597144457 +3439389035 +2557620623 +1000667149 +2203034589 +659560676 +1960937087 +489427974 +2938813875 +3235880223 +1235054562 +2798347680 +500036966 +1953547268 +1458970961 +3211718673 +186035483 +1381165908 +1484160093 +1201816283 +2871350537 +157355940 +2738456099 +1334746043 +1209839783 +3520882396 +3896444127 +2734873611 +2994494616 +3310644043 +3714979892 +96561537 +1479543853 +2537865518 +3454652374 +1236210394 +1821093041 +2769915180 +2774635081 +4102350142 +3181768644 +3677396387 +1540787810 +3280997560 +3990245557 +3341986999 +1823040315 +43747362 +2557029908 +4177893061 +1418321397 +2610921694 +3504515723 +4002229345 +35195014 +1576113018 +3616469320 +2076918295 +22618575 +1850499835 +991523898 +1936186308 +1305497145 +1074743611 +1457730283 +2828790831 +3173781719 +386976119 +2527024950 +1986484886 +1835348583 +1600855865 +3919620390 +2436371997 +1026481977 +343816799 +2549795084 +2046833845 +2390732922 +973803486 +113382490 +2003038972 +2895949424 +620431151 +2409506185 +3092770647 +1035127443 +2772670250 +2834130534 +2638025922 +3309966895 +3699735418 +495224770 +507001101 +1132676279 +1181565256 +190724225 +321457424 +2224414004 +3942849238 +3077219038 +1299288571 +2873654541 +632384157 +1170936730 +1817638124 +832895356 +4196103826 +2442838050 +1065647439 +1760529669 +617138305 +720027422 +321584115 +2684225844 +4044870854 +3452691844 +1648977980 +659269104 +3576456117 +3376451309 +1626575974 +598598718 +2309761113 +3920481444 +3025131466 +2239291367 +502905054 +781496848 +120419232 +2950413194 +3979070382 +3305947242 +3272478287 +1894552671 +440133326 +1539580888 +1668424719 +802195636 +414564658 +2877638458 +40064875 +3969873291 +1735994386 +3652533802 +3797062581 +2786611167 +771817238 +1817514435 +348079630 +1493822763 +2063802892 +3899154048 +504657309 +1345724284 +3630820328 +1979836110 +1730048573 +2351773573 +4048118357 +940665252 +705429113 +1095974328 +2318146563 +1642343847 +1963555453 +3305638511 +1603342723 +1863339511 +1306856932 +431114555 +871194123 +315861685 +1107998110 +3239944661 +228108625 +2537984756 +231941070 +579240412 +1276071694 +3754463056 +413855047 +1138063437 +1858707615 +2571710371 +2881431562 +2399010881 +2534746832 +3353158906 +3059971187 +3668932381 +1994784429 +1880395777 +642182973 +535892469 +473249233 +3667302988 +606823587 +4001953640 +2746246903 +791682079 +321244103 +990499594 +3302129330 +857175635 +3162269444 +3099085573 +3355417583 +4266856989 +4076380971 +976587134 +13875701 +3465422130 +3487365904 +1916668216 +1698106993 +3987658088 +3800886711 +3898270924 +1668152428 +759902756 +38500267 +1329352634 +3558344006 +2408528227 +2030019924 +2709356463 +2570060188 +3065632212 +3550991866 +1055133468 +794643714 +3189033613 +1850578141 +543232603 +2531536920 +1670800555 +1370833977 +638676539 +3079857437 +3018320100 +1285946567 +3947934608 +2353554768 +1982229237 +859209163 +2113494441 +3242892618 +4221819686 +1586667642 +2794174222 +513884152 +637277095 +3293821722 +1978410147 +838259627 +1512869048 +3773974563 +3352481125 +3291251994 +737890149 +176196758 +1068457053 +80991262 +2061424389 +1083796489 +89744099 +542074160 +838140952 +1153469645 +2141484804 +440571006 +2699004560 +2820453938 +3481716873 +2327426246 +3138905005 +2609579082 +242055820 +4020840466 +4213252442 +2850554962 +3600085570 +1518928758 +3207254709 +955362020 +673262224 +3856125218 +585864117 +3913901438 +2822887807 +1458447516 +3124538217 +3818085787 +75691821 +3064254412 +3920403997 +284497933 +4089163437 +3740817311 +3975924235 +3904521080 +1568642359 +1436428435 +450284343 +632718713 +4059827473 +1605963839 +1413873979 +3434305825 +1029604545 +1378973229 +2804130682 +3790086184 +187162723 +3699275437 +1174132993 +2496946271 +665243596 +2014906435 +1567607193 +742625051 +743582739 +1095928154 +1091419874 +3102256886 +2697812355 +1120296753 +1974148979 +458594771 +4178283424 +941868245 +1407577250 +1941321475 +2338590934 +656039399 +978341962 +2827396440 +2149998604 +2377384569 +3164784125 +264087350 +2223721228 +939642335 +3744516721 +35727078 +2471454139 +1739018553 +2830999054 +2235871694 +3274813394 +1026921713 +1796939476 +1255586826 +3552170981 +3910220444 +1320410735 +1031448754 +206404787 +1009030109 +3202086692 +205886940 +528608119 +3087578803 +2463014388 +3586661888 +1149327337 +746388374 +1827434927 +4126030034 +2423361820 +1783260481 +1997576377 +2361088250 +1053678058 +3920263600 +812660058 +673798856 +3977369103 +3118334417 +2113388210 +518382108 +696293087 +2743747427 +2231755225 +1165759097 +3576579812 +2404024062 +1443719985 +3771755811 +4172022504 +2720914838 +372340268 +57071857 +630763047 +263066305 +2661725600 +160510393 +2135448292 +2806920896 +2197476939 +2864801668 +1820485381 +3868261945 +1660883187 +2671077744 +76640626 +4114139631 +4090839991 +4132640287 +2094075027 +88954570 +1338850666 +1460724443 +2247248471 +3381564867 +3255792861 +67213855 +1423013997 +1643154088 +1419393906 +1998922245 +4088229638 +1652556796 +755106968 +726043871 +77223714 +482771764 +4239430633 +4088369133 +2709199325 +3143666423 +3905721157 +32176221 +1232877010 +1712278130 +1567224761 +3667973753 +1788249585 +4078855602 +3619417574 +2100065394 +4292027049 +3341835089 +3543381009 +718071118 +1133860786 +1261964024 +3500106325 +1631865991 +287494383 +1153384850 +3809546444 +1219472756 +403628951 +392584103 +1870002443 +1189131201 +2090260511 +4240508428 +1375970864 +114150700 +3652182152 +1807933623 +4051276277 +3918935575 +2699753353 +4255311595 +2148684689 +1073490883 +731815518 +3602335217 +1391461885 +95024448 +1386730845 +3729953259 +2198902703 +1222429746 +1614548884 +4059647857 +2827390599 +3941964856 +647775422 +3051443337 +2168149575 +3485180939 +1701508669 +2274864299 +1248023704 +3491075110 +66399684 +1542420577 +4146840313 +2655652529 +956468454 +3830587408 +1073273231 +2359469923 +2612790532 +3498518631 +3931858329 +2281546021 +1942462873 +3697441301 +119263991 +3056277062 +2597081962 +1216560876 +3059458710 +2875728150 +202588449 +1878179243 +144609223 +186363964 +986472083 +3112720015 +2091182147 +2744462395 +231166311 +1098189721 +1334416098 +995202488 +820184628 +1279751318 +1017032701 +3797592561 +2261001351 +3958816107 +1975879472 +2305436702 +430538321 +1824432583 +4285924527 +2078016407 +618986233 +3942601742 +4196949753 +1945317691 +1295718627 +1197287571 +3365186168 +4115090915 +298486585 +2204665687 +3902925707 +1068152916 +1285585396 +1343057571 +2535604156 +2778575334 +2001410696 +461947886 +1941369449 +497311100 +1437954055 +374506549 +387574293 +2860931374 +711180482 +2643111328 +3764995851 +4133291748 +1307820557 +4045241749 +2388138519 +4214890970 +2102707402 +4211923569 +3480494043 +545271501 +2131610456 +2408741211 +6685723 +1122693306 +3633057924 +1454970004 +1207087185 +2766988777 +1741698704 +2903602860 +748601843 +1253606279 +4002070084 +43500948 +4207002745 +2188166465 +3003347921 +2721696049 +678533320 +1012713788 +1221953238 +1716345360 +4236857414 +2536863746 +1288534412 +651179493 +2671036949 +3238794161 +3938263373 +261428601 +3679469516 +889977346 +1096313438 +572489062 +3597260124 +2044200486 +3431209092 +3667390888 +890713873 +3158573635 +2425085803 +2654782011 +1149547427 +3074719654 +2954091292 +1520558319 +2897700141 +4075107972 +3984712904 +3492998691 +3584945153 +157059909 +3105715516 +2423774549 +3354982108 +972055604 +1607290044 +689097511 +2161235519 +3716589231 +1856791025 +277241991 +3198292035 +3749976705 +3477355501 +3254059476 +2850721284 +3588883923 +1052802696 +3042389521 +2536332254 +1610194125 +572347458 +3649401588 +3022774135 +4274160765 +1233870224 +2460629663 +2356733375 +2826928701 +864298512 +2110529792 +26087410 +3189182994 +1485495356 +1738997443 +719375970 +2852493262 +145688773 +3392373290 +1874726300 +1989338225 +1449266640 +140459625 +1967964236 +2163496078 +2260922878 +3371887181 +201572796 +966683881 +4004240145 +548812281 +523786466 +3827014781 +1696020677 +4254086247 +2395606084 +1316342703 +2090465861 +1313066711 +3117386894 +2687485633 +88031661 +4063726086 +1549502250 +1119968828 +2226659139 +3070649030 +1054116806 +3021607016 +2384841054 +4203023022 +199145142 +3251797998 +384244118 +3079232538 +3685776252 +1177201119 +4010732782 +3381782161 +1930326567 +4218622504 +2439876892 +3760204526 +768752021 +302838223 +4149607289 +4026955591 +1324704856 +1501619189 +3733336615 +4230853973 +3425119375 +561678861 +3999201550 +1140135343 +840509395 +3990020652 +3068944636 +2721743222 +3735067546 +2122726720 +2928243760 +2883323044 +330081647 +2505235370 +2048745453 +1391648394 +1865562206 +3256165458 +2203104838 +2730011154 +603436132 +3007357817 +1204617648 +412608262 +3217821653 +3317917593 +2481882446 +536245606 +4284878055 +767736354 +123452334 +491702126 +1007395197 +1011069285 +720144863 +212784053 +3125021341 +3546377315 +1178868756 +2993748216 +1500036122 +503170430 +2081421147 +1555871489 +2191563541 +388863252 +1304395075 +1541193067 +2840508260 +792815884 +1588193044 +4055272331 +1322491999 +2611429860 +733915131 +3718470383 +3968769673 +924051523 +1371441456 +276785750 +2270006690 +4285741645 +4119487197 +1595815221 +2248201894 +3811649936 +386675256 +3457431902 +3505759188 +98053617 +2848960688 +361223118 +581796503 +2455526949 +1275671174 +2554246301 +1778039118 +3009875956 +546011388 +2426401521 +3404788417 +2542031964 +4086191489 +1993135567 +430143264 +1018952251 +4290481898 +313984199 +4208395857 +4119948456 +2695154929 +4147857887 +3039994113 +4134573109 +164702563 +2485202271 +551203756 +891655868 +1136271593 +4045998175 +3087388288 +1746176017 +235855641 +3668719330 +3703153824 +2727288475 +2782328201 +2906220608 +2719244702 +2313263904 +4071034138 +2278031502 +2517343902 +3749716208 +1132393289 +46512500 +3630555378 +3687497954 +3225784855 +1167165635 +1491638449 +1873415248 +1322465299 +2057483350 +995792768 +499002956 +2806798114 +3338644162 +1815073086 +1051001570 +3284951703 +3604527400 +1682996945 +1828268417 +1108274971 +1649581844 +2159872829 +1608704430 +272920022 +1823493011 +2339231821 +3932770733 +2607064663 +1005502182 +2953206407 +959257110 +697314104 +1027657085 +662176647 +3452461270 +885211232 +2343636617 +2521884733 +3350975903 +3245129675 +2304049068 +904617921 +2334338698 +815645090 +3010044679 +959239210 +386800128 +1795782428 +4259087301 +2834660243 +582635565 +279257586 +4087164756 +1111526645 +1174963640 +1997448503 +3451860510 +2435266061 +657198260 +1262812094 +1714005226 +3520345061 +1940575363 +723454963 +1586688728 +3527236454 +969122353 +2937676343 +3153547039 +2515491421 +1413470218 +4050782944 +1740902892 +3720648105 +3107287350 +2413952014 +1348084707 +554841786 +42017340 +3353776772 +1258499069 +25964327 +724224339 +3865246716 +2501648133 +603637611 +4259993309 +1719753114 +2977999173 +2039970841 +470136194 +406728064 +1675130202 +1907605957 +3163192753 +2685409749 +2318993452 +3782182086 +3522990799 +3900922325 +3668611672 +4088200491 +4140002401 +3467904978 +4106520801 +1105545219 +1341510853 +1376555431 +1125175467 +969230045 +2130255174 +1346140080 +3357957790 +303096358 +1932688356 +1306419243 +1523027946 +1771103553 +3514470461 +479236528 +1061071730 +1086566311 +934298154 +2090475332 +1555388121 +2652289869 +200114477 +2936611051 +1465082961 +1627315631 +408440779 +2447219610 +3321432911 +2262519071 +1817530191 +2987722351 +810234055 +2307022554 +1773740942 +726322100 +2559994876 +2047566407 +3810734025 +722405820 +3256805969 +2975804943 +3418664909 +2870187008 +1641292263 +1268751284 +416804544 +993294680 +1269879104 +2131537056 +2997957661 +1551127881 +158997699 +2919313286 +769851064 +2236604595 +1469834680 +3286898471 +832837303 +904283770 +1007266790 +2989682849 +1642413432 +2563335637 +3099505417 +1117930543 +4269621952 +3317512601 +1595607172 +3274362544 +3661696127 +303444582 +3271652665 +2209713100 +1651646276 +1863087740 +3189636080 +1719648054 +2303490738 +3979018844 +3470065908 +1664129538 +1296348308 +961515059 +3448517081 +3547789628 +3101969569 +890249750 +3141265253 +3580575502 +979260776 +1684249844 +3021902992 +3247292980 +367670687 +4286469710 +3203766256 +3233850820 +1016090612 +3796709534 +3008019124 +3347466231 +3000607769 +1885025608 +1642736676 +2457434153 +423559931 +2757980018 +3898963679 +2656161255 +2062234482 +264488990 +1222237842 +1116494059 +3859525863 +3571183164 +474712723 +1013519750 +2121055489 +1047596584 +2478669552 +1784465788 +1109959648 +1517512032 +3520343392 +2817021861 +797525109 +464321255 +3110074068 +3796704633 +2910914879 +2643163744 +2732897840 +1570809933 +2642813812 +326011216 +3118676015 +85603845 +190554251 +3527182501 +2269322664 +2814046902 +3896548332 +2871444946 +665223191 +1138081332 +638307386 +3891779567 +2712644368 +4219189534 +2228666807 +1822602606 +1561837711 +2745405361 +2058761244 +747638751 +2295964179 +1704707267 +1695959529 +3469840680 +3273200600 +2930532520 +1430138581 +3531777910 +3647853276 +568536218 +3219163007 +3575109584 +2601547666 +2649477903 +1753728020 +2245866882 +389620450 +3991126150 +748400701 +3745621805 +2376010063 +63168280 +741214787 +2290875388 +1142300521 +2554347721 +3212719536 +1911930527 +1086443233 +486354983 +447712436 +3555701869 +915220479 +2062159572 +954004320 +2110934952 +2133425378 +86013173 +104529263 +3629989067 +1647240814 +536394018 +1100221418 +2196524826 +1222047729 +3376405225 +1585692487 +831925213 +2829053522 +3261206808 +256711986 +1554703650 +1264382986 +1563351278 +2231358679 +2544787192 +1302519723 +922405852 +4282050713 +716008080 +1672765103 +3246898635 +3201435528 +2541100882 +4160116323 +1777620878 +2894041440 +4518657 +1402285851 +2151107070 +2761647310 +1694402346 +2929112031 +1080931708 +2551808960 +2506397826 +2302909093 +2574776940 +2909706703 +2340693617 +3177914124 +2633961455 +4251735176 +3831770441 +2664871191 +2019456794 +3865961477 +512341036 +1414406874 +2836659989 +2344230887 +3234444826 +1839754738 +3666586150 +3894922229 +3357993695 +3791693383 +3266341883 +3928108616 +3700764 +3693673014 +3980973227 +300093387 +3970606027 +646535704 +3012267583 +4270877338 +551154779 +3907690012 +2411428804 +1114928378 +145577341 +3898255853 +1417185800 +3389946788 +357145387 +1132161886 +2062981208 +3361318147 +684601572 +907128630 +1711769941 +455901926 +3432194994 +4044992782 +21412635 +142617545 +4194590139 +3205299017 +1851038347 +998285231 +2599421785 +3133289994 +922658994 +3990669040 +4282068978 +1593007793 +4222391985 +3778200911 +1949731948 +2084073038 +548342824 +1167039618 +925496933 +3808730263 +4097819490 +859582689 +91662937 +3299429702 +2719867697 +3246069991 +2602921029 +1482204624 +354753144 +2114356418 +2764357171 +2277834570 +2571892748 +3581178337 +3190772566 +3920995077 +3819607045 +2544538508 +924010400 +3226254478 +1935936408 +4170425973 +3140283321 +86089535 +1687371054 +3056675746 +15749197 +2014549893 +681909291 +2807125111 +4215087032 +1169469377 +3359218063 +3995570901 +3897994399 +3464073405 +3859530597 +611901582 +2235613054 +3110476438 +3476151626 +728973716 +3577587482 +3300079175 +1315300938 +3305289524 +2310600617 +2635168465 +413514935 +1985958980 +4242194753 +2332292220 +2509751826 +107663188 +2075238323 +2296342812 +1715299226 +4120141298 +3701854833 +1273421034 +2498522228 +1585996375 +688925138 +2403652969 +1169307327 +1513181013 +593091938 +1113159458 +2854588702 +3951009993 +709654296 +488217526 +2342091114 +4060933144 +1595462419 +432914696 +244063615 +3498043078 +3890133189 +1639352175 +3161983716 +254913281 +243537107 +1450617465 +2475089377 +1503305090 +2420770754 +3088213837 +706014818 +2378486672 +1163749934 +3457788758 +403563352 +1206664553 +3732826076 +495768048 +3407503233 +4099483874 +3003213645 +1180211643 +3305967813 +4016799797 +2977120247 +3439172445 +2916821613 +3676907444 +3137967215 +2333812713 +1167237448 +2554022150 +3272116956 +728695877 +2537048518 +604975855 +1122207590 +1959835585 +2688522408 +319020534 +1869016376 +2520364565 +1769508128 +1931617916 +283270538 +1318650814 +323305912 +2624088869 +1127673825 +3174125874 +348421557 +989616646 +983447954 +3820933087 +3366480613 +3719414801 +1351441064 +3494735545 +3394343385 +1381923814 +2731181651 +1597604914 +4127390819 +1011808644 +4225460828 +2568040766 +1103592338 +2348409222 +493877571 +3652641400 +2340227043 +31589455 +4088912185 +1994253417 +366963886 +1410667377 +1912841378 +1644259964 +2904358882 +1423364125 +3546746591 +3205652103 +3086281816 +4119070113 +389993289 +1994059320 +1565748270 +2587238064 +3890216247 +2174262617 +700526129 +950247615 +3257207135 +187715505 +2883860989 +654318417 +1916626307 +3243155560 +2898449745 +1359582709 +2379901840 +4138898665 +3258932095 +2962458514 +2333989340 +1550701911 +2515363552 +3431732258 +570975880 +659726807 +1540621235 +4085120661 +1215570553 +614250768 +2274129721 +3762297794 +300408936 +935760425 +2387420303 +1879061790 +789135785 +2620801692 +1897744224 +1233560420 +4293937827 +3863422825 +889556538 +984762230 +1660774021 +246961605 +148898692 +75353862 +2775846389 +1614467902 +4213471216 +3787966156 +1143076552 +3105741455 +492635229 +78279706 +1723054671 +848088575 +2699204194 +4253599485 +3531677433 +3202071124 +3775183363 +101829091 +1430210969 +1134097213 +2738657562 +3373788991 +4235298509 +1739441099 +570829850 +4004242795 +199838422 +3633247063 +2534034021 +327457288 +2360648012 +1497582539 +2908707531 +2870036176 +2533538087 +1926696766 +3556435611 +2114985740 +1813280634 +693182873 +4120063613 +3993201887 +2381140586 +2815208387 +1678577401 +3895343737 +3185263781 +1312724037 +332942652 +2902364420 +3832715097 +626858484 +1817609147 +2777494239 +1903337418 +1267423945 +433250846 +3460267435 +1955823685 +3282902411 +2626465831 +1012921598 +1982593511 +1354115159 +2511041366 +3459615824 +3840479084 +2045485035 +2989404475 +3018066568 +1029401771 +46869989 +593984290 +2406366651 +1649272217 +752103925 +2542804474 +2596709735 +2148401611 +1427733637 +1468817772 +297613365 +2885509003 +4040904959 +1214360889 +555730374 +3343483310 +913747674 +3990909507 +3324530962 +1433596024 +3764718372 +1712034860 +3722061696 +2637893601 +2013431086 +4004494837 +3860121610 +3558245116 +4144785402 +3452614293 +3267073121 +590449518 +3048956163 +2919891890 +1872121021 +2518880008 +3611830248 +3698156881 +3398366646 +1280650543 +3381299957 +2966448616 +1526232011 +2707575701 +2862424146 +2907808426 +1278168644 +1260948974 +2180313519 +1545574722 +3818720766 +3126864476 +4026004049 +996185053 +391695759 +4046473609 +2381283128 +576116512 +2485755640 +1166044480 +1215600698 +98861443 +1930185283 +4273156780 +1271547370 +100946444 +2086757724 +3530579631 +1380405743 +127068075 +2060776468 +2591956639 +587940579 +560653262 +3160882714 +550483061 +4102928092 +1556846375 +1358658217 +2036041551 +3971100883 +2586632962 +3260478323 +3306008699 +4105877295 +678671427 +950224419 +3337746296 +1583209339 +3389796102 +2310119293 +943158217 +3131236744 +4162744324 +3076088216 +1039317016 +316948167 +3909308352 +2065325187 +846561747 +348457288 +1123284842 +2976484843 +680123906 +2859458447 +3769530701 +1437941488 +1853370124 +3577295503 +3852460794 +2291145207 +4226327685 +854136262 +2142371490 +1929225034 +332980441 +290923663 +3655429442 +609100276 +1258593835 +2422948925 +4118541687 +3450499965 +3873167760 +1427705654 +3418113155 +2509275638 +1778117924 +2918033938 +1117112809 +1314567503 +308009613 +170536045 +235641132 +2137049359 +2910150131 +4232940091 +3259396399 +1555680191 +3768199637 +73683976 +184560404 +2359263659 +4005992297 +1776654680 +3058581805 +2452402546 +3306643395 +145818801 +3853041741 +3119501846 +4183221914 +1748563038 +1081839534 +1564747391 +2235659606 +1924049210 +2734344895 +3387681961 +666045978 +106922768 +3207463249 +3254103179 +285409590 +199243554 +3313628298 +2421103579 +3190833396 +1085791489 +81005956 +773827889 +862017238 +64986087 +1865775623 +3846451262 +785309661 +1568250176 +1108267908 +2040999636 +1951736775 +2869997108 +2765644687 +3564226535 +2943254350 +2452251238 +1182395690 +3332544078 +3797415315 +2260775512 +2639078793 +1413777825 +3457595233 +753889790 +1413716907 +4032964755 +1048006416 +1565271178 +1619905889 +2241168849 +1198315922 +2857611169 +3755916042 +1724949528 +3272286083 +3928322836 +3109571125 +1636075120 +220234164 +688860373 +1024754059 +1622086307 +2682589429 +4015981128 +2568722610 +1052016364 +2271201587 +2006949452 +825825116 +3645863497 +3885014151 +3383638413 +1686683208 +3602643385 +3070882317 +3523516553 +822475119 +2577977576 +572555322 +206451510 +1459678024 +2114829743 +2621897991 +1099796082 +2231027344 +4080996668 +3655292261 +2226120052 +1572905438 +3021595037 +3541753830 +3010747041 +1663963608 +37757510 +4165548567 +1560001869 +803949350 +1378694442 +882090931 +1265223675 +652784888 +438586555 +1244477522 +3978005172 +1831567861 +3051274390 +502267113 +1816466285 +3187021320 +1343335589 +3947618478 +625012630 +517583311 +3106085262 +688566026 +2350352268 +3390657116 +2409373147 +629961949 +8886558 +1864175451 +615464218 +3483795322 +3527085664 +1101018600 +587458808 +116874854 +4213678657 +1546179650 +3012049036 +1815559072 +153209534 +3253917904 +1729871793 +3449859029 +3283332432 +177390239 +3532860442 +2951314177 +3235876711 +3847593100 +2789649297 +2082911325 +820884183 +396302470 +744559517 +2422178488 +2551216385 +3449431310 +4131325867 +2574489521 +553481123 +1772461904 +2823202728 +4167554889 +1156807069 +1170341136 +2421438308 +3964952720 +1687575624 +2008295267 +426677890 +1120026207 +908813129 +1846362616 +54046780 +1496542346 +1676873614 +438572891 +32610173 +2173634522 +2554999083 +2086572204 +2028683752 +468044055 +3889480198 +940217064 +2633994360 +2681313147 +3333375464 +2671600567 +156620654 +1479022794 +1378710085 +353641987 +2891251523 +1681188715 +1587307283 +2958722749 +4224579283 +1575669296 +514988098 +3036082750 +483922025 +1699248949 +3526102593 +2319732014 +405771195 +2958520902 +4148130739 +1392961631 +2245645632 +3313896062 +2442997175 +1956378475 +2527447648 +2499832737 +2316880467 +748147483 +541437170 +1866613861 +3827606678 +605053352 +3298429222 +1114036903 +2292674074 +3496833384 +2462574571 +627653782 +2654972727 +1364110099 +3965046257 +4250918339 +4256837596 +935418396 +3958545796 +2068153039 +2963953871 +3439717889 +1892281026 +1635632595 +3893030508 +3041473048 +1933515266 +1062482484 +3564626916 +3352976015 +1040117730 +2956317060 +1814412183 +2585522301 +2255561323 +1162882485 +2993329249 +2793419263 +3452966919 +328919105 +1954885212 +1694105838 +3701164224 +1687992118 +3336122236 +4078687910 +4176409195 +3065954556 +828186723 +501919780 +421973824 +1268860327 +4220996283 +675541680 +2804022984 +208772670 +1691605127 +3850767053 +869928997 +4293630758 +3710750316 +3882968574 +3642314298 +26068493 +893617 +2906616610 +3670065283 +2883425811 +3000571255 +38773332 +2859042416 +537658632 +2121869306 +3097563390 +756755712 +3900568271 +3064779954 +3503963953 +3358281327 +3519130633 +1075677913 +1184013843 +2571517359 +1681568829 +2058911862 +3076957747 +3474069852 +4148568659 +1559965065 +1240166184 +779809320 +1065863614 +1970846316 +1098115873 +1413471094 +3896081771 +2151500705 +3073459242 +3467751947 +2914231044 +3841534256 +2825693292 +49233561 +2519977699 +506383578 +55825026 +1555806263 +4119637578 +828725181 +635436646 +2112556265 +3175837002 +2754754982 +1869438428 +2932744018 +1346756735 +1827639253 +507001757 +1769794090 +3939858447 +4054219182 +3657001080 +3328782693 +2544054886 +3445347546 +1641621781 +2065158940 +1715630719 +1452894287 +617900520 +3796238798 +715822626 +2047507838 +3945292150 +418379627 +2439927918 +2018222494 +1280154243 +621693280 +3914923819 +1497386188 +4056545177 +2455464504 +1420964556 +2206323700 +3944257808 +3177315735 +994517881 +2174069467 +2720870928 +2452155011 +4153079789 +3057008460 +1874437087 +119655371 +2749131273 +2989760342 +1875116545 +2203466065 +3963653812 +2000408074 +3846075801 +1251367398 +4236836710 +2942664404 +124171670 +4244213651 +2180707473 +478970770 +328894772 +1406696466 +1608319893 +3087141632 +3718533764 +3986579081 +3313413643 +1513803973 +2076734743 +2574589148 +3432203270 +636014348 +4112804385 +1787481058 +3386438495 +1056530663 +1142103510 +2678038683 +3129841795 +3313495897 +1737703875 +3679602268 +3289197418 +507059657 +4155331789 +3635502122 +1984992541 +3490155484 +3365126823 +65441661 +426284004 +3733580638 +1361765873 +421444083 +3220312512 +3784350457 +1057067792 +559063689 +4008486557 +2405781304 +678990900 +2986431613 +420864881 +2409223444 +1788399344 +3723942554 +4245681938 +2927557257 +1958120000 +3402195570 +4293053636 +62694539 +243005694 +3447142467 +1809913658 +4276675102 +2209856137 +410364493 +3453718543 +3683518859 +2158200544 +3557336824 +693909692 +4036711593 +3636463778 +2220033316 +1537596761 +2400010537 +170832633 +660123427 +1574194523 +3047269085 +498901171 +1787697892 +1577423548 +4217807669 +805914932 +1998313203 +2444847242 +182949353 +824769156 +2954614439 +2079277564 +3111380286 +1019326346 +2733836448 +2337891929 +2631052965 +1865968084 +1471495900 +1323143394 +4148638366 +3943966090 +120843286 +607873130 +4114181129 +280714105 +3447748995 +1766272800 +3562964027 +1891181102 +3338663433 +2121899031 +1016779947 +992464055 +1410069349 +419756287 +993953785 +3858708060 +656815936 +3380303416 +34482750 +2239772603 +3555159540 +1848688107 +2997178695 +889178495 +3092136693 +2766742239 +2849975745 +41376166 +3418214835 +240341045 +3879918340 +2324624837 +3797339934 +901815099 +4213036359 +480642412 +256000688 +88631464 +3219031076 +1997004392 +3744437412 +2418612464 +1070292164 +3892150067 +3232320887 +3685993244 +1664570747 +4100894641 +1399429588 +2819490061 +3250836832 +3876378415 +447208723 +1123805522 +3340314468 +3669754326 +2891964484 +86726792 +917042954 +2802424031 +263484366 +1090661056 +3353143779 +3793114504 +3062310162 +2371480706 +387157664 +1884453537 +3596204867 +783842611 +1572524019 +2712497247 +3086814070 +1329519266 +2728267527 +2588723306 +2633970606 +2771854336 +3893622916 +1861386951 +1857548845 +1735370601 +3774694229 +4105490382 +2983318246 +3846440367 +3906378346 +3790258500 +3058294979 +2743232407 +3796460459 +1329670968 +558036066 +2995904535 +552095575 +421105496 +1300801564 +3553777525 +535440885 +131675115 +2351729596 +164499297 +821269494 +1126658472 +2156851181 +4041337734 +3008454788 +2202425537 +1478253109 +2264420978 +2826518118 +4281800759 +3708656885 +168680347 +3666135065 +1384479668 +3045541073 +293827752 +18755160 +3678209655 +8309771 +1051148036 +1615972515 +336547522 +2806526384 +1827493271 +416319814 +1007195160 +2907002940 +2815472371 +2925370590 +1521501532 +2123347620 +1209347056 +2770227228 +675167439 +2889175664 +3761258556 +1835612690 +1750006146 +2852024045 +2126767964 +1644064134 +414621226 +795552231 +123467492 +2480787260 +4154724416 +2558156595 +298360706 +871252985 +2087316233 +3169957086 +3145619917 +3391144555 +687896070 +3201917690 +2626256489 +2195558808 +3798158420 +1476012165 +2032566723 +1685654889 +3276928186 +1663578120 +2856758055 +450876383 +3220782130 +1233751029 +3899142102 +1215466183 +4129351493 +3503500157 +3263374164 +2591743025 +1292467631 +2775542496 +1870164820 +2885669738 +1567895397 +101379293 +3206883432 +3976036813 +3580871903 +1801323385 +4084674170 +1679612235 +110818972 +3916914234 +4212586027 +3547809697 +518587537 +921748809 +1049164984 +734779916 +2528453700 +2958872953 +1866443159 +2428060379 +2870989769 +546049989 +202279501 +797117606 +3861784438 +1574003147 +4249171507 +3112857088 +1684423569 +514702011 +2506487 +2739432870 +1939639428 +855838814 +1682247456 +425407380 +1180811761 +1080415432 +615719060 +517857226 +780217891 +2808562224 +3103042699 +412800308 +500796276 +4276413542 +4180392422 +4187580856 +3356279381 +1983179837 +1281098873 +3043489471 +3665838883 +32306238 +371138280 +3870122287 +4066614927 +3013408381 +1306851986 +1670654669 +2530967770 +4199756930 +2829773944 +793860439 +3399523266 +1996201228 +84356378 +1549066948 +2127747971 +4287712956 +1706203580 +81422143 +510765217 +456078660 +1172884950 +3381704832 +1831482468 +3047547522 +1473063401 +3280356908 +3171699393 +3330213002 +1957317535 +3236670852 +3468471137 +1577197874 +3929414539 +34011551 +2584656913 +1945700734 +4165159799 +3661162412 +3985990894 +653159003 +525771990 +2257018628 +3451713689 +1299868865 +1463402181 +2599921354 +4224671589 +2757188129 +2997706235 +473019452 +4075197625 +2563938751 +2639426885 +717332315 +3370478779 +3714218865 +500565206 +3711159256 +664258271 +2659029349 +1454351334 +2076437311 +2497279872 +3730819681 +3993664661 +3060820203 +2326382327 +176453594 +4043576358 +2383314407 +1168302285 +3083307711 +3607198708 +2417219852 +2245090728 +3116402723 +656635797 +770654614 +2276669898 +2802712775 +4137383058 +220001583 +3949406174 +1111848996 +3137641960 +2075937483 +1378518811 +1152421154 +1755385854 +4249606422 +3424345637 +1430377541 +4095233558 +1416530531 +3526084027 +162031461 +1874683636 +2857595291 +75289490 +1643707900 +3060286631 +3456547209 +1651891731 +958792170 +423102359 +2630526644 +4052805086 +146782352 +2725329996 +3948440685 +231440866 +882693352 +1498999482 +3487821068 +1051203497 +1858388839 +534682610 +1217117129 +1069119803 +258829614 +2092649195 +589365781 +284146840 +2250651385 +2189020020 +1121627329 +1243492144 +2879479936 +1768251559 +215473831 +343604735 +3547060882 +2697256223 +1727825672 +4089570552 +2283771350 +3626147775 +3662368200 +3455346667 +3663876995 +3164667483 +47232703 +1011395074 +188067148 +1969624808 +4224399205 +2500645876 +4168686710 +1950867452 +3832275590 +2827201890 +3889026072 +933734906 +2550421838 +2588852789 +1660367448 +1656859271 +3814992389 +2217020991 +1698911829 +893701738 +702061805 +1976915030 +1173880487 +2037617372 +3490237518 +645229793 +471362879 +391180536 +45792520 +3316811287 +656218986 +2634579842 +2480763258 +1843229857 +2836416081 +55680835 +2376267458 +4031665684 +1035974830 +503421778 +3670674522 +2128584897 +2472607085 +617470049 +2954380216 +3791929953 +3863441347 +2029161048 +34912193 +3532930034 +4255933260 +1524474519 +1456846584 +290374611 +2361938417 +2325430527 +2745805690 +1286474344 +2645905688 +3605928561 +3341337954 +2266332555 +2494236833 +2886697143 +1148219251 +1882203850 +1310306441 +3865991802 +1244898557 +2652717041 +183938628 +1026191639 +3904213070 +587201362 +3739011724 +1877245079 +1937536376 +2853719407 +2852696310 +795033414 +3933274673 +3304461737 +3836605412 +2769944515 +1645991135 +3902719851 +3154746500 +50868407 +2864645906 +2720685458 +2379574863 +1285273913 +1625023461 +2062479328 +2012574854 +774022303 +2529886796 +894650366 +3320354804 +32168014 +1674947082 +3872303801 +1619461880 +2154187290 +1465585512 +666604655 +1834580780 +1717899553 +3421789599 +217017104 +3689662524 +3054850227 +3603119695 +1211868770 +2694008590 +3571833659 +265083876 +1720200024 +3677511197 +3021978365 +3701756657 +3239651473 +294260635 +2381771655 +3787537850 +2261515650 +3742967017 +1059165413 +2462367003 +2372304608 +1026688560 +1280983184 +3953377589 +2268184215 +727581986 +1228998064 +3223606296 +1741603698 +2522876532 +2644723330 +3115490289 +1587067604 +604567524 +1102455212 +1900717306 +739996971 +484344570 +2637119921 +603099145 +3220337429 +869925004 +1540236502 +2866461632 +836924076 +3250666188 +1674099374 +98258413 +940838178 +1000967596 +1249907692 +2901627194 +322114319 +2058274886 +341959458 +4064946171 +3829050426 +2064898765 +1041395861 +3040787583 +592111588 +779786817 +1372794386 +2508780575 +1073896215 +2136657615 +122080316 +2255009774 +542108537 +1766458714 +3206096321 +3760867405 +1927467239 +2024503556 +3585047915 +32523224 +817728304 +2865366057 +2256901047 +625551656 +3707838231 +3689199951 +974759093 +3692651196 +3987028986 +2050846306 +774983967 +1404403536 +468803222 +2623304241 +86827951 +2442812196 +1425769192 +2020650723 +1609851916 +3420628632 +2609503301 +2695742516 +1641336730 +3037955365 +216740153 +3569264553 +4106175801 +2187652554 +3518672046 +624819386 +3995356556 +2938407341 +2525553033 +4226780745 +1707693478 +228284394 +588555993 +2020861182 +3513527466 +110198645 +4106398315 +3194503949 +2132595662 +3291667199 +1836218137 +3213682800 +3181458143 +1656193439 +2992479764 +3785627349 +1670095967 +3613450789 +3624709072 +3672993746 +3906581763 +733449440 +723727400 +4137089377 +2819845198 +3408112981 +517736066 +2351988689 +2150029035 +525401623 +3005401556 +4232003899 +3646561526 +2685852710 +3351100607 +1813592525 +813337108 +3244938501 +1927095688 +4058339668 +953304972 +17068881 +2790795306 +372799090 +1098681292 +1285067491 +3125192702 +2167533171 +1903690867 +365346454 +1970316206 +1060937690 +809320934 +93732366 +2685363011 +2566454073 +1412322312 +3581394359 +1378610753 +1087241222 +3527071001 +2064377062 +4230016194 +2492606524 +1263759721 +260745997 +3033730374 +3910324280 +495968906 +1577110475 +2724013849 +4027755276 +1962061579 +2244037683 +1711553483 +3716316005 +3373160971 +3572014839 +3964823674 +690205633 +86386128 +1761003034 +2303191404 +2294550480 +911598721 +1872619645 +652519622 +410363304 +4192988373 +1278109672 +3778472461 +2997170389 +1460749199 +3049333147 +1074046646 +1834197 +4081822672 +3204913148 +2393314101 +3041981888 +258868050 +225930035 +2372393459 +3052715 +525367785 +542482471 +2437965097 +3970345214 +2958663722 +2436762510 +1995035605 +578952871 +2804550389 +4226216718 +649975543 +24537894 +4114579607 +1626908866 +4051116824 +3207222945 +384599419 +452828943 +2284560732 +3667613826 +2878899769 +3405841836 +3955195262 +1440538163 +1989087786 +2063832255 +2460396254 +2927514288 +16393764 +936398144 +423333643 +79152013 +401752307 +4229977588 +4280006737 +4134316593 +638012716 +1312245617 +2716784038 +1043382896 +1694973730 +2265845953 +855153160 +955499406 +2100201308 +1717925440 +1975003084 +2150753951 +1353523075 +3082042153 +1633279453 +195178627 +555743674 +1644879090 +726940015 +3222933413 +2377698329 +317752903 +3682853792 +4152278751 +2722787625 +3192128027 +3985282311 +2335593078 +94854686 +2599524617 +1400254647 +952318966 +2809472656 +1160750384 +2732187268 +1778657700 +4238360042 +2949723658 +4125400839 +37063521 +664807451 +3844480644 +561932581 +844958396 +1146386194 +4031372154 +1290711298 +2571168702 +1840655054 +3927760729 +1186009917 +4196686190 +81271580 +2161061426 +2391918038 +37917762 +1482669440 +1381280970 +2992926049 +3962758965 +3653535759 +2648243031 +326373918 +3936217602 +1119722463 +2729572690 +3629375996 +3007010419 +3712553175 +111883003 +2905310633 +1722925636 +2097689812 +1987814624 +2177666103 +1791930626 +2106913079 +1699848236 +3358926613 +1525440903 +2430426939 +841021652 +1674035698 +1449898481 +1142885914 +3519154251 +1547866820 +2700363160 +3129430618 +207589714 +2730156735 +1441420905 +2979218555 +1105541536 +666087697 +1729978133 +2045666751 +2580384774 +4253801860 +2837736922 +268327616 +1227507604 +3317224580 +546503909 +987518999 +2839280669 +2377223433 +3607116722 +772305783 +2501850747 +4251281816 +2911388138 +2647036657 +1986127638 +155983432 +3699771428 +924425435 +1187601274 +576044981 +1702770185 +2201702105 +2963647522 +4100122789 +802434560 +2870193323 +3420978964 +1093556301 +1106216297 +4085591986 +2718690645 +3839272521 +275257894 +1254402028 +4043045274 +1428760728 +2002504859 +1865282348 +3433004354 +1328336383 +2530792398 +800818908 +3980669797 +3838166675 +2164687931 +286457881 +73538778 +1854667295 +4034274716 +3428446097 +2384568205 +2016490737 +3293551587 +1461801523 +905386605 +1064162352 +3509854969 +45218853 +3646378796 +3449712563 +3813929454 +2584212306 +2580229288 +1715189468 +3757295317 +1174341066 +3482150468 +3326896816 +214817257 +1243173389 +85637275 +4031677226 +464279235 +261520021 +588916057 +2809675203 +2636199919 +562987856 +1259962955 +2941330039 +352583081 +87932080 +2637892584 +2235900762 +791509149 +3545886983 +2435282081 +2540277476 +2350533209 +3059748429 +326377422 +2064233640 +1183200901 +4059295914 +2317616406 +1940274640 +3460749403 +1878674569 +982954037 +2000309220 +968966005 +2973567671 +2627979352 +2784452792 +527654190 +3745740953 +820728947 +3335608193 +733989556 +119054399 +1815492686 +2302849814 +3716176338 +488151596 +2045170354 +2756809784 +649452408 +2909953595 +2402993912 +2872668465 +1454770155 +601269344 +1207576455 +1785965567 +1549702859 +3060791232 +1055645718 +4075880119 +1056955441 +750161179 +670275466 +3060020730 +145744292 +3228229761 +1781815560 +3325286054 +280861153 +819143563 +2978636144 +1131173915 +2012131374 +4177638586 +3048441847 +316789848 +162651937 +1725214066 +3731992520 +2926418155 +4004167967 +2951604035 +1493351926 +285403702 +280866785 +622776690 +2816941914 +281143193 +3925905273 +242068980 +1827602810 +2064119673 +656897814 +1744063361 +3049614781 +2228133080 +3317682170 +147522037 +4286865575 +1029177678 +3842179430 +2086780490 +2057515767 +107036323 +1850864007 +3499519519 +2910420444 +2079052509 +872752585 +2805527551 +1093302558 +3480710628 +2662225695 +1583073368 +1921386545 +2702922186 +3154711048 +4191950843 +1765333009 +1766949543 +2859897529 +2258730055 +279635104 +1143272010 +1116555883 +1810420665 +598207074 +4203847135 +988956558 +994090688 +2367600310 +2204384394 +3076795666 +99043818 +3753071599 +449077234 +3241176583 +2375408000 +3516640787 +1003450559 +3624826054 +1244771795 +1134517922 +1110568293 +2760366126 +3090654099 +3732964854 +4128740095 +3280161234 +1477473101 +3105004358 +1781504743 +788953215 +3144425921 +1864998750 +977346976 +3729200064 +1279548784 +123044720 +1433638639 +2288300471 +1608053724 +1643595346 +302538304 +861789927 +2137369553 +2396673979 +4221526419 +379555766 +869365264 +432837339 +3472050915 +154674025 +3736316029 +342444950 +2450291925 +1902543511 +2383219436 +2416804812 +2917900838 +2714382024 +3659113199 +1343405740 +3187244027 +4046811924 +2721082265 +1144770207 +1288663311 +192232710 +2304888796 +4084244476 +2837755379 +1893374208 +1333071200 +2380660788 +3778809788 +3537582497 +1255091012 +4275429175 +3500918094 +2054063359 +1552459504 +1971712635 +3205890703 +2180844833 +3633899284 +3958483067 +3715614844 +2627272961 +2257518108 +4050762587 +222038706 +2329197015 +1871159873 +2269576253 +2993924957 +1940487426 +929673490 +3755977767 +3832854283 +3964888921 +3635993017 +1830203206 +3995372197 +1115937869 +1343193127 +2930409282 +1308286751 +2598761849 +453652296 +2858570393 +656089164 +1408514251 +1135660103 +736805891 +4058616821 +1863222848 +2915982888 +2248972607 +2270958981 +2235421711 +2228230089 +2642196119 +536631574 +4165905783 +1887377025 +909830203 +4278625781 +3459810952 +93837558 +3943188413 +1731154030 +3329098574 +1097630575 +1235067997 +3322764381 +4050340592 +430781656 +2726890051 +4190936143 +3219458924 +1069819656 +3278601380 +1838718903 +1054442605 +3423235093 +4191758551 +1006995462 +1100237261 +2999994965 +2353994596 +3799792828 +2502805841 +1376349759 +2635945477 +3107024587 +611185048 +3414157184 +1616574323 +1502123553 +2988396031 +771463002 +2455142441 +1004361206 +1032615199 +2467712489 +3790171037 +1671882599 +2460542425 +377353591 +187950191 +3367194083 +4203127898 +2447293922 +2310055325 +1412135662 +1634801938 +452489433 +2883213635 +1513339993 +1720081424 +4136086783 +3585417991 +328317943 +2273007396 +3418723856 +2655125327 +2046316022 +332688795 +317515761 +3784116120 +2995011669 +1092785611 +4116755553 +52518225 +504600204 +2997557872 +48990032 +3245304417 +713495558 +3347756791 +1222153199 +3594124429 +3296839291 +3202470045 +950236893 +3095371843 +2356970324 +2101833962 +3844946020 +1798154573 +1096769788 +2821769685 +3245425876 +1175970595 +207671419 +964903438 +3609311060 +4267091104 +1333630893 +2333180405 +2438938185 +3612165206 +2263012188 +768178690 +2498993157 +1450286941 +2200264798 +4264641287 +502085093 +3024493827 +697196334 +1370562038 +3712052136 +3346214691 +2419457038 +1615101073 +1661051938 +1736526149 +1213709633 +4144646183 +2993293397 +2550071824 +4085620723 +3320167501 +1728423775 +950226007 +2237530382 +50134116 +2239604805 +3810334975 +3045984272 +1079020632 +1306200598 +3533335549 +1502665288 +3235965884 +1136651567 +3399380997 +4105552205 +158604928 +1971722827 +1571052166 +3153820260 +3157221919 +18379379 +1266918239 +1151089391 +1977143951 +359622084 +4021084821 +918061950 +4076104308 +2892851811 +3924414309 +533797605 +2113555911 +1671942707 +449964910 +2532073357 +4179073025 +648127981 +1487171161 +248542441 +730859485 +941003934 +3092391910 +3184414568 +275441145 +2051113017 +2744368780 +1907071140 +2109876179 +234511306 +1736264083 +3548140219 +1273899527 +4268217196 +2021378163 +2632330822 +787395630 +2620691752 +2817198825 +2434452645 +1067028860 +3360442717 +3297840056 +439305996 +4147211852 +2903235443 +1701374147 +2667466375 +859473894 +2316626841 +736453485 +1644585020 +1982976740 +558633308 +2298588424 +510141549 +3568252836 +1511201303 +2850307307 +2638949452 +3341893561 +3638796834 +1790715083 +3131118784 +3195661187 +2601941456 +2469126131 +442587067 +2223254268 +3780123891 +1906425421 +323411870 +2783739155 +1294416119 +2487954086 +2158473206 +1753180387 +3062733042 +3393624395 +3633760422 +2202284861 +514136950 +600507479 +552503063 +3201116915 +1687446503 +1166709360 +1427392789 +1249308021 +3735156557 +1109861844 +2427095059 +2138232626 +3309059649 +4216175672 +1072860659 +325302908 +3809690463 +2354530248 +4034645712 +2427644950 +3008594209 +2522568941 +2566158289 +2395090236 +4222894352 +1757146280 +2135127268 +3007549953 +4064194070 +756549389 +1730433250 +129199388 +4050328696 +3144942283 +797747296 +3936123808 +2310451478 +2013035892 +4221983546 +1938897696 +1767966426 +748129255 +2409422531 +2179923799 +2389893340 +2723763559 +2299330078 +1394028942 +1350536413 +1815170592 +2814086583 +3936854976 +1344098076 +1361028778 +2402497023 +367425949 +1395963243 +2203850229 +645987606 +867117062 +980652979 +299945665 +737221108 +1029483530 +3273043719 +3207348536 +1381668376 +878067666 +2434590097 +3062321211 +2993906210 +2829992177 +2744346612 +2155474596 +342552282 +2193060660 +2234198432 +3951108425 +526740835 +876345668 +3813179243 +470157867 +840974941 +581228776 +3145990871 +75673665 +3056828225 +1227670822 +3563934850 +4076768190 +370607915 +3345246600 +3612615697 +4103151527 +1122340424 +2580941900 +3597888950 +2688101827 +4204367988 +1328479955 +936653208 +4044330368 +1582799062 +847800392 +2901732221 +1494866940 +121790524 +1198211324 +3340662352 +82971621 +2326048025 +1910343825 +1101465652 +2623589887 +1598028989 +3108596263 +4061538657 +4148262192 +2089571320 +1878267777 +968449070 +1579011945 +2594880826 +1227429319 +1003400311 +567049260 +2340850418 +2772387579 +1244011204 +2580877435 +303969607 +746700661 +623918672 +1894515645 +2435667998 +4276379783 +943873709 +2306366821 +1111409740 +2689747756 +3637181669 +2301558307 +915058040 +2836817706 +3089466052 +2784015183 +148210839 +533542693 +1327770750 +844341923 +1847673909 +2993629076 +3575010593 +1646871484 +1393406630 +4201559672 +4281494443 +3440095830 +4075257615 +2846285570 +329397681 +3169116718 +1285563445 +3263469974 +2364035402 +3969706508 +174197931 +2352453073 +1212305052 +2786914155 +148856790 +1542273851 +4256851842 +2368517997 +4150387975 +1854556131 +1889717457 +641025297 +720525978 +879426841 +3496702501 +1474842209 +314799157 +555366782 +1473148962 +1588745970 +3638307538 +526743794 +3182690827 +2844303348 +606677160 +2747421735 +4077165140 +2397509764 +2317991948 +3884830254 +360514055 +254287459 +1176338918 +3468215394 +2988555824 +2845403510 +425993695 +1502221577 +341728381 +543810389 +2541259236 +258359233 +3934215849 +911354382 +3556473929 +3874431060 +2106386799 +2444976788 +2524049321 +1056610707 +3472401263 +4210263971 +3460738597 +2482123570 +2608149438 +3175031456 +1721782685 +2716985038 +2995828555 +2725839450 +2223594524 +3845078897 +2376855950 +1053795996 +1540781832 +3149940619 +2596616071 +1153370150 +3573985153 +1215360342 +3910545234 +2046891610 +668354220 +226991937 +3379807772 +3945977183 +3000284149 +2199830372 +3000453618 +2262863696 +3120778859 +2261540245 +3370067416 +2247424712 +1261487012 +3153664849 +729402233 +1973322576 +1146744915 +3662403529 +575923875 +3642953901 +238029916 +2973805704 +3984350269 +484499534 +4068215609 +1656561307 +3896496210 +265403194 +1432274269 +634086724 +2007303682 +3189944393 +2307626287 +1968357421 +556020988 +3688242484 +1323979567 +2166867774 +2874206063 +1066722466 +456738888 +3119227910 +884375220 +204482646 +2274864235 +2829858318 +4032855716 +4150346382 +1402273300 +1465642068 +1617270708 +2374205215 +4219360741 +745286611 +3430930443 +4122441979 +1282444598 +3212767537 +3220589904 +1735812846 +712168114 +4024275027 +1175545639 +2333907516 +2344923673 +22063183 +1378781112 +3662504125 +586152780 +3020884033 +1078368754 +1853096601 +930354344 +4263823286 +2051403186 +590686265 +3090505471 +2968663180 +3161550345 +1700058587 +3003811300 +4055894108 +547583729 +474971655 \ No newline at end of file diff --git a/PHF_benchmark/Input_data/1/key_0000_1_10000_8__000000.txt b/PHF_benchmark/Input_data/1/key_0000_1_10000_8__000000.txt new file mode 100755 index 0000000..82bdc35 --- /dev/null +++ b/PHF_benchmark/Input_data/1/key_0000_1_10000_8__000000.txt @@ -0,0 +1,10000 @@ +3497783977 +2245276479 +2858356983 +1569858483 +3501920696 +1293580976 +3702426412 +678082793 +3978302055 +2049019653 +556463848 +1706124222 +3519375763 +1935563093 +1166918888 +2287654985 +1649711948 +310285565 +3636991949 +2923492407 +1136248829 +2182241214 +2862622820 +1174998652 +570747506 +1135883965 +850953833 +3822968041 +1227321387 +560665649 +1280224377 +1211491442 +802672131 +460488184 +1035608724 +4199664115 +460257733 +3612570941 +2428814515 +3258576283 +2328640620 +2462724911 +1763080218 +3332627453 +694884487 +556918745 +546142590 +396515333 +2238725320 +3534551007 +81422167 +4003706336 +3737362556 +2153489361 +3244389304 +155584763 +227909543 +2692580338 +1728539874 +3853521684 +4120598460 +1791577495 +3707243732 +2513608425 +1671619159 +2226008493 +2130259736 +1450422574 +3921134995 +2622632639 +2931793110 +92234631 +368541437 +1774537658 +2641161301 +2962611896 +1028085105 +3360592497 +592733601 +91151821 +1053475459 +3903611534 +3346991864 +478559918 +3242986549 +1932811796 +161035819 +1927592235 +1630767392 +2050765348 +4052437677 +2534209185 +894144039 +351509870 +3382117942 +2820173015 +1020293061 +3316701518 +3792535987 +3666841737 +1986086205 +239159201 +2194379328 +4044897487 +436148741 +548246960 +612917271 +1957361184 +2680052621 +2018369101 +3463116865 +2750090398 +1285745725 +4271334060 +995920180 +3980967332 +902385464 +2662665770 +3413664400 +1908993051 +451608245 +2079253584 +251175747 +1256723110 +2029469687 +990821099 +1381236140 +4149367517 +3464914743 +2941747976 +4057006562 +1916679182 +327660835 +426570690 +3109307539 +691128717 +2835651057 +3253410324 +476586213 +1200058463 +4154152675 +3700312367 +1423258621 +2850729385 +318152831 +897678412 +2215474349 +1294016137 +517140653 +2961992298 +73242668 +2639577494 +9784204 +619320426 +876317523 +2095944658 +1419704445 +3579816053 +365885416 +1710650357 +496953832 +1738836024 +933706291 +372173948 +213294188 +1809113399 +170469770 +1808971689 +618221615 +4275318586 +402528597 +2657657992 +441946655 +1381785927 +866494076 +2648790690 +3590137092 +2885788369 +2319898398 +703338995 +2183496944 +1226265898 +2909576205 +2448398374 +2787669333 +392159309 +4001620769 +3345951943 +242812681 +3670617494 +3119357628 +813154898 +1563982121 +1055702830 +141281611 +1743311244 +1366415529 +2698302686 +207320531 +2855553701 +143801645 +604128391 +2017335082 +3194331777 +2610704564 +839554092 +3937253144 +548771027 +1632126872 +392175932 +2181774286 +1332420897 +1374474170 +3963972349 +593950491 +1816434728 +2989138922 +3760579951 +3404868304 +1413640816 +3212077153 +4204152287 +214025675 +2201515257 +1780592025 +636729419 +2211382838 +3713398702 +567359625 +225688533 +4210826779 +4009387206 +1867461593 +1895721826 +3868232944 +1795233605 +42483369 +144668230 +1850752981 +935931650 +443808757 +3132174613 +508457434 +273721217 +255774925 +3849721085 +2711044807 +463419476 +1327156268 +2428373333 +1351638330 +1174259844 +3544289988 +2875814164 +3932263917 +80890467 +1300190917 +3970722725 +2020653887 +169744721 +2569677230 +839346871 +909855988 +1320352191 +3376217087 +13143844 +1839505069 +3654918327 +2014758175 +1357508998 +3560168570 +1484213000 +2442549051 +2210106534 +567931279 +660765690 +1241345110 +2594943831 +2232776951 +3539534693 +1817387189 +1581996142 +3264714106 +1933190737 +3234235124 +1738712530 +4197430291 +1998348752 +207068543 +4210928192 +3576694021 +3672477485 +2371559216 +3498828405 +2860131445 +1643985180 +3287862334 +2822708181 +933921796 +2807527163 +377012613 +2964553312 +1805633053 +3045099753 +4164691155 +4152063357 +196695655 +3703516691 +1478509033 +3402303087 +2366784268 +2854141209 +1688784582 +3854751852 +259447605 +1065798013 +2368137977 +1433917672 +3954611473 +3288173653 +841158386 +1001063291 +3875877949 +928961030 +3106540378 +1599207921 +1403011474 +4045703893 +2058670648 +3331109104 +1434159609 +422334488 +216713137 +979160358 +1805284500 +3368618754 +3097499907 +1763207220 +2168686818 +156567251 +4013425047 +2415275236 +3057529757 +939235192 +3807314362 +2121519625 +731301989 +414245745 +698198168 +2934746360 +213721334 +2116041411 +2422071838 +2327373424 +2946201356 +2489372003 +3725453463 +2875296480 +4034222847 +2297693738 +2453217205 +2650875851 +405829598 +1022053845 +2842993805 +4037203667 +503696712 +4272180652 +3138039336 +3256726974 +3732394792 +198103639 +143885922 +1856763899 +2141490591 +2350329853 +2572032122 +2831894337 +3321459613 +1859108547 +2582820715 +2576812130 +425604501 +3855850209 +3197684804 +4005204581 +2095907221 +156244283 +1655966023 +2944372703 +1992078582 +2184073705 +3896950344 +212321039 +1617278517 +2807145249 +3602080570 +3428992662 +3218994664 +3201614239 +4041616520 +3993870122 +1218334001 +1374178348 +3283778014 +2762604738 +3796496497 +4044241944 +576079377 +1425016199 +166039222 +3539616021 +2505427405 +3169863389 +2377347883 +1752046046 +3364329127 +3763399184 +1812723842 +453897583 +2017980731 +3785238332 +2014089260 +1022607877 +4173246949 +160158819 +2545155539 +1622677823 +1831716026 +2552567953 +4256211570 +4100175497 +1335787836 +155745203 +1260249790 +2746401465 +3941241630 +448980860 +1945296420 +4090723015 +2103324783 +2665639091 +374181266 +4046351147 +1133483979 +3091726667 +2658521852 +2915560551 +3361640019 +4270419577 +1914225578 +4251504809 +1114115377 +927566727 +3977567165 +3601921137 +2126815339 +740869445 +3040594165 +46166279 +2395035197 +2896731458 +1357699981 +1642520891 +2783278995 +3159795376 +2589339812 +1635181392 +2780980427 +1195261981 +3728500112 +1542661979 +3911382192 +1575951406 +1936238462 +877146927 +3358469365 +4198058279 +4121242690 +114709430 +2545940364 +1787648188 +2275851665 +1484791835 +4087339758 +2547194026 +858376042 +4032504931 +4053200405 +1651269012 +3599012750 +62471564 +2548204890 +3488407933 +4243416244 +346052860 +497661609 +3791468207 +4159938477 +239031222 +1438890042 +1673489549 +15169708 +3215183184 +3016292716 +3226625914 +2821852246 +3741954199 +71512255 +856688127 +3014944110 +2731042804 +2964336725 +1356133723 +1830737087 +594515945 +3792934489 +2301454946 +195115820 +1511661271 +320680345 +2253752278 +3413975882 +389745545 +3398169139 +573971829 +2706914386 +1389060116 +2919238135 +2724447283 +3806335582 +232734689 +764250587 +3466093153 +368783950 +4270230725 +4082690598 +546602115 +78163275 +1092361890 +628189774 +1336874777 +1687004261 +1317782132 +1457286088 +2214021723 +2546659634 +3118633401 +882645880 +3950278332 +3268476029 +1819473094 +769351354 +1793071464 +1735730535 +2131683169 +3862634317 +3215918344 +3389206379 +1860885930 +3030632601 +1857530290 +3827269111 +871953062 +2821749837 +2733881645 +1587022996 +1228917005 +3478965441 +3069539585 +3964601493 +3727115698 +1041086567 +3891022895 +2078552641 +1436517749 +2831113605 +1438779494 +28573467 +3375277216 +864724909 +2764176761 +1755458354 +3056666976 +3958139424 +1938277341 +3756663218 +3344862650 +3586054119 +885819894 +3462858373 +1656720975 +2143522426 +3290876943 +4291852473 +3119055688 +1177979732 +1601568528 +4244022840 +3112647555 +1008592377 +4174177661 +13684118 +1881173204 +2898915106 +3937219349 +844983797 +772716259 +622370946 +2177230836 +3165208477 +2907451153 +346916940 +2752768423 +2542407141 +3028994395 +924104626 +2829802590 +422973026 +2038985548 +1610217122 +1941804015 +2420336145 +2361096437 +2333556399 +538371552 +2705484857 +1513869832 +1187234674 +1084674044 +1685314940 +3401777731 +3383343013 +3584003758 +3044503905 +3218245886 +1343456747 +745204079 +2291858039 +1371045595 +3877427698 +3907360849 +52931883 +1591358205 +3787503754 +1247438537 +2390112862 +2515410083 +394049169 +1149623323 +306581220 +1424411726 +519098384 +2918009309 +2715873966 +4279264368 +3916928286 +3736867854 +3983573549 +1692598481 +3288369202 +588120154 +185714491 +2670030999 +2514108290 +4082123470 +2624810733 +3470545122 +3692968421 +852399497 +4158069499 +4281636205 +3569908326 +1264250305 +3558348578 +2752639098 +4129640006 +3264769012 +4291321738 +1631543579 +1143748614 +2486978394 +4251989428 +1504222090 +1276720990 +3390685936 +1702541481 +1494811457 +916990762 +1337023357 +1219838348 +2242312988 +504017370 +1719316443 +1662058178 +3537383346 +3419494768 +1899325972 +2381616457 +2539237435 +1766074561 +3220321583 +3416063549 +2595333095 +2598413740 +2105971823 +2167486084 +1475989074 +1296142482 +2443516104 +1814108828 +2982323700 +3167946707 +142327404 +1031800855 +2270605842 +907703026 +1428843314 +1637376425 +3554757814 +1701791061 +1660510248 +2216276111 +3413857121 +3950312973 +3440597099 +1918490281 +4155176501 +1654251677 +2847914203 +485595529 +3086560643 +3192314491 +120465994 +3133097360 +3392434721 +431609531 +801549582 +3428964886 +3926218530 +2982045050 +594719400 +1553062406 +3317879496 +3455573223 +2741766650 +3866965399 +3085710756 +3122230679 +2477983425 +2215684130 +3810632305 +1372259227 +139245312 +4266906535 +887086637 +3910707287 +383567665 +2132927766 +537722195 +2782083473 +1736939173 +48917951 +3822440592 +3502834489 +2348768166 +1682581039 +3905277161 +1697854069 +2149654243 +2384984341 +3295669038 +750524667 +2666527479 +1289191149 +406435032 +1809948664 +2738711324 +4125069132 +330856879 +2444755839 +1527502041 +4227201728 +1938098673 +3289223704 +3482727991 +2795365944 +1216914619 +483765507 +2496589422 +3510733118 +3130402528 +3080302642 +1908158432 +1973945336 +2619206330 +1288882675 +3395929250 +2354401137 +2126812930 +1488862259 +49203236 +3335797382 +3669481923 +4083630665 +4201449055 +1864688640 +3171894389 +3887895063 +2963040668 +3091603659 +4064036054 +3529249807 +880338128 +4177630905 +4254740901 +3288330377 +2485162011 +2824117725 +1268206022 +2257478216 +1627992486 +1894900893 +940358733 +1101457484 +3808051837 +585759453 +785024919 +1099134749 +431259241 +994243012 +1090441056 +1320550297 +2360767679 +1214299709 +2130041225 +1272195113 +1147671010 +2953596453 +1638077207 +2910252610 +3955432268 +503811632 +1302841451 +2004907856 +4192091720 +880936065 +2988380833 +1613073156 +3407959012 +2003493788 +3159550906 +1160580630 +1576878582 +791298087 +1217980512 +2820457510 +1174096719 +3161504153 +24285990 +3719737666 +2238711058 +575389955 +3167829711 +1483266057 +1522194351 +2431885251 +2341666384 +1534472420 +2348608214 +505716703 +545113595 +1725718987 +2433292205 +3513208970 +4216122279 +753090521 +1390928042 +1484828669 +1450415006 +3780905503 +2994838907 +2919497071 +1327512536 +3773884941 +2565814336 +2395229895 +2727154450 +609162273 +2854847713 +979592452 +2953002659 +1661908403 +3214276646 +280718334 +708343138 +1867449207 +2024381986 +365288318 +2675274434 +2256286661 +738318112 +1700243555 +3164439488 +1237160087 +2745745066 +2442150818 +2974787527 +2350741702 +4065784164 +1634501327 +1534295885 +3196138847 +4244358939 +1253401608 +3278459801 +3359606739 +3703147594 +2754621166 +2087595817 +3345260381 +1010171277 +616868068 +4255869450 +966132034 +1701783313 +2725622362 +3744201846 +391359935 +3634337191 +109756290 +3015673294 +1585452828 +3653533499 +2820134035 +2285014915 +3525379081 +2925727795 +334210115 +2510540473 +1968826231 +444705425 +1726540475 +395023409 +2621415016 +61528862 +3085478380 +2608966412 +759982710 +14965935 +2595316559 +2146748834 +1646313652 +1289791053 +878212303 +4171140389 +335169126 +1597530446 +2292374289 +2686358606 +305194634 +3440318544 +937258910 +3063535826 +3528478606 +729336470 +2786100207 +3114338715 +1970555611 +3593847866 +461564899 +3170478061 +1272812993 +1524076526 +3703539104 +4005354060 +3023729932 +3291246194 +2851956806 +2631784543 +2607978502 +748727628 +526247361 +2555707452 +3851158616 +1944078130 +1141585977 +2988979662 +1093074687 +594216394 +3291615594 +3145099376 +214779067 +307672411 +922081311 +3754106521 +482093276 +433047617 +1632481080 +2401555598 +2156727811 +2813568156 +1306414283 +975994728 +3767966540 +1344434707 +3303524041 +2213476226 +2019694161 +3513302898 +4030142870 +2129571801 +857572407 +1201255487 +3749798506 +1784325445 +3870509213 +4255514107 +4186684966 +272146865 +3632763195 +3819838201 +2561899734 +3010948469 +3890564687 +1008508606 +1735221077 +3218304690 +666037836 +336337869 +2876136323 +2725011603 +3462100355 +2157152505 +2031344595 +1527905091 +1583343163 +1188940937 +1416450664 +3203096318 +1480251968 +1373661237 +3230281751 +2252441878 +2818455797 +1845462110 +3246465778 +2390731736 +3172995223 +1801336055 +3538763100 +2086566725 +1789286771 +2116523661 +445005716 +3857518570 +2673795175 +3077817623 +233645424 +2572785675 +68148667 +3707776703 +207496857 +2851924365 +496219547 +552285438 +609385689 +175024897 +1674122008 +2083058619 +2462818812 +940266653 +2643381033 +472240821 +1775637334 +1763630339 +1763059937 +4145402135 +3842824846 +2999402051 +3951220131 +759125697 +1975714486 +898655621 +3896124363 +1972897650 +921377448 +3827157047 +1757467210 +1218590420 +3933727509 +371851068 +991369957 +28563575 +394313185 +4250289428 +3387445133 +3685292986 +21009353 +3454178204 +555987562 +1136052643 +718838041 +2383514820 +1770356170 +55940238 +3860232966 +1984188709 +183837624 +3698564415 +327721938 +278988565 +4055390151 +541588832 +3429528987 +1295498286 +1692371916 +3644067205 +1478579984 +1749474082 +120760064 +979325876 +3086052236 +3395672103 +369451075 +3204620999 +2317060291 +3059291816 +1979700171 +957048739 +2528463865 +2788971823 +3058719942 +1031596822 +747893856 +3125637133 +3650504207 +702974061 +3502083603 +2722541683 +4190859172 +2985163737 +3701005103 +2422587060 +2853378893 +1076777798 +2818375005 +115264468 +1333146468 +2351029986 +2185096837 +4131601732 +4066800479 +1523767272 +30758184 +2095246755 +1731863493 +2921667621 +2789400529 +711616016 +95257294 +1293359565 +2300931656 +514080413 +3934682492 +1280338246 +4042952136 +2048158505 +3581973353 +2887939362 +3111555152 +3529324466 +1612809987 +4188980516 +1402190131 +1139697076 +2247696843 +3098126781 +1465297437 +1089065500 +3859859505 +1145125201 +2610596903 +3034943868 +2229324387 +266769019 +3806839975 +567059145 +1980209601 +2524302848 +4066277019 +3349929890 +663870761 +3809181002 +2796889165 +1788944783 +4276495622 +236606940 +367167758 +335109522 +3044299398 +431424957 +2372620868 +2109832457 +3141560148 +2437353536 +725416994 +2213604610 +2299029344 +825982212 +2506790427 +1785011521 +1023982235 +4279490309 +3874607539 +2092505043 +1573168264 +799990640 +146502363 +571953965 +3082976417 +2646285065 +1557666696 +1082400129 +1514974139 +3707761198 +3063031558 +608534054 +540266085 +4097566227 +1474439034 +3523026721 +1464491005 +4120516274 +1179598717 +3255805490 +3820556022 +2757806974 +3606178741 +468455032 +3805450020 +1168539342 +3638134448 +719301749 +3377099065 +1761354695 +4133154454 +2586392763 +3692150520 +3316516173 +1916862247 +250950171 +2373891211 +2100712737 +3679203836 +759484439 +2003344892 +1246489134 +1952124475 +2056584752 +3032534396 +3209158063 +1223290107 +2912601248 +3314742535 +229415963 +3891022767 +2675150495 +2976012062 +3078875018 +1242007689 +480722256 +3297403417 +4044151502 +2829210438 +2415975076 +3056962165 +3181552244 +2548638474 +1113304869 +2158837566 +73934534 +885149047 +2471840470 +4150571745 +4132113420 +2657843561 +2074951197 +2680256385 +1318909759 +3146467254 +1122306555 +3684818455 +887901550 +4031731543 +1592081102 +1614607808 +3742829635 +3560099062 +569312512 +1899469572 +256575246 +1928476564 +1893292116 +1669013837 +2964031045 +1956503029 +87927975 +3582162051 +3951507377 +482878322 +141623733 +712888232 +1229623674 +3391924576 +2715441951 +751161609 +2229711012 +1136563255 +3686574173 +958780307 +1445490947 +1312153245 +1111781198 +2464289248 +916213827 +2045808012 +1376311447 +1295437072 +2189358487 +423280618 +1091382311 +3511069151 +3127726643 +594769147 +1002468172 +880210481 +2731293850 +869854182 +631345717 +716818144 +1100777783 +1949760272 +1374999100 +3605700591 +1852986210 +1329959338 +2820824709 +963470807 +254102201 +353546745 +2091198829 +512571032 +2668048071 +2414460743 +2359377936 +2302431796 +859862695 +3688279905 +3811840760 +63543448 +2582815344 +3984301570 +3960259425 +531131436 +1852963047 +3870480078 +3600159362 +3502258543 +1301043550 +1972421686 +2683379156 +1774499288 +3026329024 +421698085 +2729855638 +443893922 +3322809085 +3441483093 +3068170759 +476999048 +1575561220 +2860153257 +680884788 +666633897 +1487155734 +287672220 +1987938658 +1416141363 +66058631 +427237822 +1518560843 +3892623106 +3361021253 +3664265565 +3130446348 +2303945125 +1053918500 +608482602 +1120196034 +2265756465 +2814240435 +1097232785 +3651329818 +2005796956 +1759298085 +2430733757 +3663863561 +2998494403 +901695794 +1993357030 +8081775 +3955603753 +656790422 +3889116319 +3081232410 +2039194966 +3144247695 +3380547546 +403038556 +1431951636 +2158121810 +2164731340 +1412308434 +1277917649 +3864055394 +899797066 +2466290798 +1043846891 +2150053851 +3971997106 +1991533498 +555266499 +2096862958 +2005010440 +2524802831 +471138323 +699967206 +1923573626 +2905092057 +2139985812 +971988793 +2548538247 +2353777573 +2120549916 +392638984 +501330887 +2906716117 +3727474204 +1292618263 +2188025562 +2474898486 +3804458418 +462553078 +3730015975 +299246410 +3221666686 +2300519453 +1860488000 +3252986902 +399149833 +3784333939 +378230996 +1626199729 +3245045211 +2312430566 +212757092 +3754215681 +2931224914 +470539235 +2887792094 +4244543443 +1710403495 +3673851147 +155216675 +761607744 +4237367239 +1954664894 +860524147 +3513108657 +2875935376 +2563043771 +294179176 +492194334 +3427430616 +490001095 +2150168798 +1795851868 +3677017610 +2773563272 +3687860143 +3620816867 +2812388405 +3123305360 +2472157040 +1369072739 +878043613 +607493625 +752432271 +2320403352 +2991304681 +320092204 +2697156042 +4088232338 +3423644826 +1937535509 +520713506 +3791980833 +1650738721 +4211104144 +3321420678 +1425723774 +822367317 +3471170116 +1118948721 +560348757 +2430581809 +3525917540 +1561556025 +3675879893 +3906855245 +4175789730 +3021078369 +2425007335 +570985489 +3951682883 +1372321125 +2423926587 +3724480413 +398590743 +1348558299 +2580377171 +3096087262 +4044675074 +1888476593 +2960801683 +3559544387 +135969173 +1001946558 +3316939288 +3092989874 +391818645 +3980497775 +4248517038 +3936454882 +91251760 +2625390737 +558418268 +3646485756 +4228194058 +1134711610 +1943090682 +47456701 +1735026953 +2541242788 +2139974823 +97798789 +485014719 +1583778695 +2631696011 +2979298392 +467060430 +1510402858 +3903574315 +2197861316 +2457085562 +54023874 +2460959567 +2207040943 +1962548924 +1473098516 +214032733 +2699621726 +2313340913 +221336835 +1920545617 +184349548 +915848878 +2419799025 +1405617512 +1188743827 +2153892202 +2508789241 +1893344295 +4248751231 +2620497103 +1496840892 +941345699 +1239458213 +456457250 +1756664865 +2583586540 +1130592688 +1300422926 +2270199533 +2018270382 +4277885856 +3487078789 +2011135742 +1618959876 +2211420603 +2560493999 +3740136537 +3488012927 +2548970178 +2877580916 +1609371826 +3005654053 +1831993381 +2425657741 +1319092832 +2477792177 +2681208 +3813711296 +1731026416 +1660371029 +276535798 +2729599391 +1539476756 +3495030904 +3673763277 +3402876468 +3798365968 +2836091036 +2010509673 +748702915 +718068074 +3630781641 +3519269338 +1134551101 +4139592879 +1239474704 +1915287231 +2612908759 +1038181678 +2518106448 +3649412241 +2966884 +1244630555 +1132460091 +149376231 +4001230233 +2199969310 +2862374950 +4040524043 +492978805 +1855731479 +187086476 +3667621384 +753347628 +2994842071 +3115806543 +1719686462 +2167325652 +255982827 +260056267 +655157074 +3567774536 +768121560 +2506925804 +2869531813 +3371940007 +3399816792 +1020097127 +1288787580 +2755188627 +1009186384 +3827228046 +2124723191 +1088177475 +12900925 +2497525654 +3945359995 +2184339879 +3862578769 +3434826923 +2562109910 +2110910224 +1942039938 +1537059296 +1690085299 +2239384288 +1198533838 +2639982759 +4252984199 +2823849757 +1023643366 +1255971726 +510352241 +2307772173 +2151698530 +2454200655 +4231283532 +1235261584 +1931402351 +2918137212 +2149677145 +2809974278 +1151092171 +904692313 +2779844986 +570342260 +316964349 +3110741688 +2669116401 +2732386205 +3266997179 +1588124583 +2730906576 +2844555762 +717692725 +2312798173 +567622006 +1779800700 +1705321581 +2814607712 +2100807268 +4235034833 +590408621 +264320292 +2920670388 +1813291491 +1653629462 +3129488402 +1169306379 +2237960826 +2501267798 +546421428 +2265665941 +1737613568 +3578220855 +840256448 +3534253091 +188774236 +2211372084 +3187090740 +3163643141 +1017364957 +1825977183 +4022785309 +1480274608 +3691348632 +690593417 +64215203 +2385563321 +2339731897 +3858340509 +2521936409 +3301638818 +2424936779 +1554252865 +3462617213 +3609597464 +1335499992 +1119776081 +3595388739 +1916675913 +3038480282 +3792062503 +3167706730 +2032793351 +2453694709 +4227312962 +2564920276 +173221522 +419008818 +1493700600 +2295803376 +1523659452 +4017780792 +4245837565 +46670556 +2338357976 +2628508073 +3389137104 +2467940545 +1687991132 +22262555 +3969920297 +86646586 +4187051229 +2852402862 +616717123 +1297314749 +4063853246 +4186795414 +880724722 +3107690890 +4048800535 +2926085447 +421252272 +819898066 +2020937776 +264982413 +3295167784 +3295172632 +1252713048 +1852813930 +2246446526 +703828370 +3655447594 +3243789287 +1860661577 +1874973084 +3553690952 +1332483698 +2648827061 +90419213 +3966854389 +2246489652 +664999580 +3157860744 +2052370550 +269064073 +3369834458 +2384115204 +2650054608 +2401635233 +1986135984 +2838439794 +3310329192 +2887517657 +1114637678 +2493035823 +4111819762 +3402971493 +1520823885 +2559836977 +2431837637 +2976731730 +1802873736 +709798530 +4120698788 +1860304123 +861681506 +3210154951 +1509109533 +3423162173 +873137123 +3802180246 +1353732989 +1741237344 +1257734785 +532636559 +4038423306 +3537497264 +911867402 +3590794361 +1522781291 +2739842292 +3798221190 +3859619646 +1945915179 +4174669843 +1225437008 +586386620 +1983892688 +862576093 +2675397872 +2831409304 +3914498923 +2194566 +2107254587 +3815320886 +4086939993 +1221948843 +1576720734 +3183162379 +1770951716 +4251637771 +2208208937 +2536466191 +3735346933 +4113810754 +2974814048 +676801306 +401470792 +3493719911 +3141523356 +3495178544 +2511349501 +2610087940 +869156721 +3694169525 +2531521195 +3104662337 +1200757563 +939201815 +4191621045 +1691889012 +868251746 +677138820 +1104972644 +431911036 +3135440609 +3899509464 +981871039 +1375080021 +509276567 +427521462 +289630455 +4001073862 +3555907977 +626302062 +212339859 +1720575144 +1422703886 +2219342210 +1565124512 +2325966689 +674693439 +753460939 +3890685893 +3600515627 +2861883286 +2717185881 +3683206908 +3259761664 +2259943741 +3271023306 +277082605 +195640102 +1496277046 +4196171095 +2476973935 +2532537867 +3257680860 +868578797 +2028817877 +2538828839 +3997843648 +3914595459 +210442767 +2428643218 +2030663307 +2150759125 +279266297 +2706983262 +4154661954 +2958604619 +2985981890 +3086563014 +255173035 +3553915071 +3906741464 +1778236427 +1253313777 +3817889513 +1962159659 +2827094640 +1127427829 +3155462210 +1105383966 +132439234 +1320270919 +3111031612 +1898693286 +1647304727 +4194470279 +1448835899 +4198629898 +1937884714 +3412866262 +1104135295 +3715740547 +4200968994 +1317502805 +1302374186 +3943737998 +104142282 +43799297 +3164476263 +399264515 +1906037886 +837904632 +742878139 +3914937452 +2659344515 +3801526151 +2458140045 +3008305583 +2589129068 +2640021558 +2043372537 +4181175921 +3190060264 +3283829309 +4000239392 +2705040506 +2398925995 +714859933 +1179270312 +3792672722 +673357363 +1418222127 +3670832378 +773683782 +680702239 +1974645660 +1941766333 +2819642265 +498913525 +2866099081 +1992938812 +1793029471 +1382929128 +2825767448 +1482619744 +2820635649 +431543026 +3390462746 +3551263513 +1876276942 +1874743975 +1265793902 +3296579070 +4206202668 +1551259440 +4240825556 +1233806427 +3952938878 +2919250693 +1371764897 +1083609717 +3043080924 +2248030346 +3136051279 +438158868 +2544477069 +1412262465 +2887976274 +4205105942 +4117713395 +3087749587 +1499449928 +2336355587 +4105499139 +1015061023 +1371905660 +1396143458 +2763147155 +2101591508 +2946350223 +939678131 +4150070672 +2399441539 +1831099499 +1410287088 +3867433623 +3479625971 +3984139452 +1032661200 +761811287 +1816095545 +3604228956 +3164686787 +385416371 +3792870845 +1380450644 +2136264027 +1946672382 +2247814327 +3507867864 +3211202931 +3302492161 +2393744664 +2765435992 +165932202 +3096832104 +3647567624 +4290770994 +1756041772 +2881771990 +747575948 +3905954879 +1838358053 +1266707082 +2336462289 +4111090126 +2428606972 +3434056307 +851072402 +2597446688 +2896081464 +2716143474 +3203721031 +3694799434 +1965131754 +3221065895 +3108714717 +891663240 +1545466358 +3636753229 +3878086276 +2745811990 +1886864560 +729252713 +3524531242 +2931560986 +1195826957 +3974272002 +1986520657 +2345455204 +411929902 +3129427551 +1250233975 +2927333790 +1936882441 +2930004939 +1224909840 +335712413 +347839722 +2778905384 +3652415507 +2239996506 +1050464703 +1740740492 +1024840578 +2536801479 +4241590042 +668569684 +905417746 +3506039646 +4065717800 +354187384 +1107603793 +3509428824 +2122109658 +2822536485 +3092828848 +2723233084 +4294610138 +3733280325 +3313740394 +2892606993 +3015919758 +3663558496 +300730823 +3225546213 +3591847638 +3152410914 +1306434174 +2255359875 +706281122 +1867459983 +4096067329 +252992904 +660372070 +235189372 +2249464333 +1806634976 +3576432818 +2685904433 +2027527286 +333100066 +2436880580 +3387765938 +1197034484 +1251999209 +285525065 +355023019 +985353502 +2524561726 +2899707893 +2347746686 +3227475348 +2877923498 +3945706049 +2493841216 +4139822186 +2448623801 +1760396527 +3243308075 +3901043202 +1515038300 +259711861 +300365345 +2926312431 +561411834 +3900571862 +3810596422 +2461491905 +1074947365 +1940413474 +2745618396 +455450771 +658782138 +3078365705 +1786254001 +3044726564 +3759742765 +4206681757 +2218963409 +3566179278 +2057172449 +2266433948 +4222718768 +2270257864 +2715075466 +4223391496 +477683282 +2005587733 +2226029260 +2607482740 +2535725077 +3931275017 +3164674173 +4183165090 +1577945652 +1510785363 +4013789078 +34720270 +3488442971 +1794996936 +2876411010 +2777618254 +1010435871 +3833681089 +637141790 +656143300 +877993226 +3390961389 +2751362905 +1540013005 +491412321 +3736464797 +3410868722 +3540921860 +790936745 +4036616867 +971419119 +187146640 +965298786 +3744329730 +4176062564 +2790039917 +1627609050 +1649131788 +2566640451 +1579154690 +3257897492 +1739120387 +3056241303 +4292970881 +2667045853 +4107740376 +3816251267 +635976551 +2745047763 +1052338080 +1292684103 +2393464342 +1918897100 +1835917224 +3372815561 +3448514729 +1606935226 +1083377353 +711712197 +4067914115 +3892269191 +1066864926 +2267017935 +1132209349 +4109733069 +3186829006 +3085186234 +3429041999 +1253918867 +2636071931 +1968460353 +1699905096 +3010527995 +2881943463 +477509819 +3883861429 +897917479 +3883499328 +1266761222 +4233647141 +1123579196 +197867629 +3304566072 +3297416952 +427038013 +3454678551 +719431319 +2246629227 +572590676 +3420297546 +961705850 +1197654571 +3033247320 +227266699 +1302003571 +939039335 +4210239122 +1212347160 +2989013378 +848762770 +3344112062 +713010877 +3393714401 +2039277219 +4099648073 +3335805192 +2736982001 +3170434901 +1809165423 +3597037707 +4132020003 +2124569242 +1350556529 +2771863358 +2749083507 +4292008741 +1732267863 +1591672415 +3612753669 +2435268719 +2751129404 +871975972 +2989519100 +929653368 +809779979 +1089739240 +2213064818 +3730928411 +1481606793 +2899402790 +1362193394 +2742344513 +1388494357 +1007605051 +2015706916 +4148078930 +1592932842 +2093781957 +3943119416 +1002339286 +3037455025 +2815430289 +1179596875 +3855540712 +3015017879 +1875059996 +1446619473 +1459566192 +2241895808 +3858074913 +1549003940 +4161732621 +835787668 +684287851 +4203153370 +496339573 +737245369 +4208944109 +949575549 +3537538428 +700349991 +2706323961 +1866785497 +1398353593 +2451846807 +599149708 +3614000561 +631054503 +3827284474 +3982510713 +29345069 +967449923 +1309906787 +1394842343 +1931932898 +2465282938 +2908391553 +514349544 +3168273483 +1178462916 +1091726614 +3126607084 +497649421 +3282454857 +3542249475 +3629028692 +4135058683 +1960257804 +3560652401 +1697614932 +1468981038 +1291859000 +1647386244 +2897637181 +2829888013 +2026537250 +3523221676 +3941057807 +2428517854 +1376504523 +2625362391 +2607075728 +1286952453 +3224427519 +411945355 +4271479836 +642853804 +492589185 +2288116943 +3897703403 +2263699295 +2928502754 +2065333127 +1736257049 +1778279900 +1593720098 +2892055281 +3236503509 +1834535371 +204985405 +2528525957 +4037030666 +26525514 +1311778672 +1492897222 +3169770814 +1046051876 +3701790446 +769376074 +3317395241 +1923115298 +302906993 +310856277 +2364092714 +2647434429 +506912926 +3836544541 +1956797590 +1490046295 +2883707266 +2579311475 +2660740734 +4203457743 +2339346642 +1265467403 +810664654 +4075393774 +999400935 +1326153833 +201626093 +2153691283 +671294460 +2637999667 +3360255132 +3396116500 +383689113 +3043143551 +100146689 +849226243 +2731125194 +1307966786 +106505016 +228365819 +2331943494 +614827961 +378419314 +502589722 +2952274350 +3861568021 +922697629 +3603396699 +1292214186 +1866110551 +1484385272 +3473300877 +1660792850 +1011614226 +3224948422 +1922084133 +2708236871 +3715768952 +453741613 +3426681444 +853901427 +83126747 +2374871146 +3756592518 +971814160 +1020673723 +431930 +2784919230 +1635438995 +3514439441 +3469612141 +3617180799 +2017681005 +709825864 +404119931 +4101554624 +1314818767 +1135821822 +1987967960 +1982551935 +408447248 +2625852985 +293311618 +1860086647 +2327445599 +1969040305 +280176568 +3053612648 +2067904261 +3257317606 +8183631 +343843112 +995697262 +1703154757 +2861700694 +1273044090 +638104438 +2910520973 +3367447148 +2856643241 +3975735481 +1787896123 +3313090954 +3538427119 +887708455 +4051910006 +1521372130 +1883872548 +4187381610 +3499786607 +2858097042 +422168556 +2519275011 +1903368686 +3590211363 +922667092 +1903412502 +2378882203 +2458189203 +2267466250 +1391435289 +1554637623 +668849757 +4093271912 +1642370211 +2581755641 +3871289695 +3025899003 +3176262706 +3302542005 +2105182185 +3489704070 +2781857823 +3325206265 +4133149402 +2748120501 +3256355083 +63262643 +578793383 +2643639538 +178151238 +214293436 +3885451545 +2411338505 +193709736 +3933268928 +424320765 +3346544066 +3180830447 +3155325093 +1052975581 +3996978931 +3680244479 +4255654673 +1692814701 +376817634 +207791011 +55951308 +1020330303 +76566692 +3809227366 +836108192 +1863411641 +1175769952 +1889394153 +2434768902 +14327262 +959703565 +1847562479 +1926580023 +935493841 +1129202124 +1089396437 +1447308757 +2876029455 +2013067134 +3965854468 +4254537665 +1333912870 +2200275617 +1801860911 +1692606670 +1026853785 +930997239 +327399348 +1179137044 +998811945 +935097897 +1185267151 +3139979780 +1766408552 +1227927935 +1682714465 +3019239968 +1288163481 +3620489538 +1977783295 +1512496591 +1054101567 +1678788345 +497808103 +283868229 +4265597264 +4160246722 +3978689534 +1102368066 +3707305758 +1498233722 +4095704731 +3831401229 +4019967222 +3633220092 +2441516072 +2589257095 +1201120077 +2492223249 +1372886447 +2208312759 +3187221446 +1180814991 +3887734862 +1093647786 +2178344028 +2875550670 +2217141278 +3496140420 +2464322628 +3959979116 +752179681 +2766960298 +3739850067 +3558932146 +2181168861 +139380274 +4236436849 +3408116821 +2505160482 +3712769538 +2892580618 +827602011 +4051990958 +1541093823 +2241743931 +3031811200 +3738017253 +2950704202 +3648407479 +282854480 +2533528281 +2098359529 +3607547856 +513062202 +731858925 +3202602353 +1863168836 +365752535 +1104410879 +1506657352 +2342732754 +2677572999 +509870320 +33239348 +233494701 +1269062623 +2855252752 +2309664404 +3089724490 +582271338 +1580656641 +1699564759 +1372581432 +1064333978 +397886512 +2176884289 +2622460438 +1041090062 +3399411028 +447627215 +1413214060 +628080989 +1895324129 +2625957573 +433534959 +1102402998 +3093977556 +3305445386 +1024018334 +1292947741 +1083218141 +1694095537 +2588567176 +1937257740 +3406013053 +596822008 +3621960965 +596526773 +3215199506 +544821009 +1202160424 +736311528 +2602847162 +3539388785 +1554755233 +346554053 +810276584 +4110518938 +3412058086 +1066960693 +3325989024 +76693329 +1182766928 +4196050613 +990358073 +846968562 +314941536 +4159516889 +182801143 +4294753928 +4042067644 +1173239450 +1611009511 +4049455312 +3463945926 +1257030050 +2382947946 +78728676 +2476448952 +510860600 +2320787669 +55418012 +446131434 +4149038832 +1325606157 +444528190 +3697510128 +865855169 +1521089765 +1271846959 +3387946886 +1580154342 +795697435 +2003265251 +95223609 +3386020758 +1736535860 +444350274 +3451157236 +477581759 +3327242532 +523586658 +3753191816 +768424780 +1111349969 +1179459578 +1890448174 +1045570747 +3485423493 +737910243 +1146514348 +1556955527 +1979692462 +819412095 +4198672970 +1259507739 +818966434 +13029798 +452410758 +2071245536 +3633803150 +2306389390 +1471851077 +1593519793 +4066797771 +1958925221 +800048847 +3286595037 +3561855359 +3633772341 +1480462981 +3984776713 +2397766895 +2526700391 +3260693096 +825663792 +4291768338 +1346909554 +1939426482 +3826889476 +1094684926 +2883869159 +2322108219 +3910716354 +74570272 +2954289440 +873634484 +3453324177 +1216795143 +4198848920 +3159663667 +1593040075 +1641815939 +278971836 +1391843679 +974305554 +1648098584 +61853478 +3554509224 +2168831257 +640417056 +1857753218 +939335795 +1901682632 +637434969 +4015689143 +889785495 +1841521105 +3055518099 +209178599 +4217062403 +2413402578 +4237317179 +151854078 +3210208713 +3583737623 +1451804938 +2200494817 +2564785071 +1634996258 +41173980 +1642683571 +1177981670 +2018374830 +3842999087 +2317224756 +4100874036 +1463015266 +992009774 +562966269 +1710059492 +2813953017 +2655984984 +2357164795 +2459658441 +763037862 +3379265346 +2511088217 +1671038956 +4001612783 +3780019236 +203423162 +697616141 +477832432 +2612392413 +2305931506 +2055932555 +43341372 +1326840481 +2158393567 +3481666149 +3508134238 +4053053795 +3370999841 +3492906991 +50354766 +1609992132 +1716102835 +4104408940 +333469279 +934625410 +2054243770 +3697377003 +1343032406 +219746745 +4027613808 +1383886429 +3198944464 +1070696601 +1257635745 +1006720813 +2003276482 +378573965 +652178997 +2106033401 +632938061 +2867164284 +401380805 +2446066368 +1983037034 +3877037864 +3581098732 +612208880 +3186769747 +2811087498 +4224813105 +3852742511 +894619963 +4214642454 +3573346587 +3040650185 +2178598497 +3634053432 +1371313125 +3416200608 +4100957244 +3451432106 +3791824569 +1015631223 +1948119457 +1629415567 +3797197134 +2666329789 +2315546119 +3579545767 +1595403234 +1434868697 +1263503289 +2366588712 +995058570 +3120463800 +3296848916 +2638750371 +3219034462 +1164715130 +2683636689 +678367810 +2813391773 +1624944797 +1443053979 +2035780305 +1539479493 +3065414265 +328523864 +2331780873 +729452827 +182795055 +1373541633 +948252517 +42438057 +2715935279 +1881189553 +656040548 +3650817989 +3189395322 +1642687366 +3545352287 +3156741744 +3795513483 +438150894 +1046407911 +3280179798 +786399270 +2987898238 +2848293017 +3468562350 +503872510 +1600036721 +1490023887 +3864289604 +3982553292 +2416233479 +659425837 +4216271516 +691339192 +2207798036 +2158213821 +1927565205 +2448872249 +384353876 +1359947960 +2705637469 +2938440622 +4234908542 +481967606 +2322603803 +2402689294 +4274353504 +1269077861 +497055126 +2469740590 +3958907894 +2792134089 +938584544 +2801222023 +2811376173 +3745941135 +410294396 +3525810204 +1993802 +3410277573 +978841584 +2695348691 +860732729 +1957304227 +2187263968 +1370951959 +2336547636 +849938451 +3059533256 +2274199773 +3582686227 +3969175653 +3914298791 +1490060600 +1623549984 +980729821 +2654726467 +2605075721 +3651128750 +3636805950 +656488773 +2890430583 +4008758156 +786098374 +3499171951 +2284174770 +4238710727 +2301068122 +118131613 +2868417444 +1624459413 +3776481612 +3101819704 +3055436166 +1993481627 +26216604 +2528824598 +1266319477 +867121379 +2747898883 +131040883 +1095938523 +549842910 +1637083760 +1165661248 +156646069 +3435155148 +1698945531 +3231485972 +33475664 +685813774 +3322676283 +1887287744 +240046515 +1699243928 +3064160347 +4275833128 +3107350756 +3197931807 +51867589 +3644574089 +1551099838 +1502916504 +3744220033 +2613634848 +1842950417 +3937041334 +2497917186 +406445771 +3066331017 +1209958141 +2362817640 +2709162300 +2960033532 +2842609893 +3868367117 +2146092464 +3497411204 +3167082262 +3682061011 +1271167295 +1031251394 +30525768 +1939941741 +1320426853 +1048527966 +1569460150 +1184648661 +1024490499 +2577965694 +1471606897 +3993577539 +2889279515 +2264482600 +1246917059 +3735208713 +2349930119 +3180798803 +49824651 +3710693195 +736923470 +675425917 +2685742888 +1116388164 +1913470461 +1686646830 +3534379383 +2630564706 +3421884412 +1810082744 +280550897 +3416735308 +2220538174 +2783661273 +863722116 +24889143 +3740741776 +3923587926 +1118329256 +255824133 +1752040445 +2327202667 +605304330 +1904428194 +2096150047 +3222630189 +2453890737 +85161911 +1055700471 +777220605 +200401019 +3351782593 +2989814128 +2837743386 +1844403856 +2801622233 +2316468791 +2555746363 +3476027358 +396210912 +3694366784 +1225955933 +3469266903 +2160354591 +2699548911 +2434744719 +2217457763 +329209745 +3012707809 +3494684209 +3328701778 +4192116073 +1336940124 +2983592962 +1035528474 +1517541171 +1713760713 +4035708805 +359703969 +1974711245 +1104779593 +3559178113 +3830893398 +3858435508 +3308017098 +1337228040 +3335668159 +565662481 +594956875 +1212390239 +2473425886 +335922759 +3918710051 +37341205 +3336403674 +3691793034 +871329150 +3424900233 +4267390086 +4063334341 +3431351371 +2060153153 +3229521438 +267500038 +2631729137 +2055087774 +1846106572 +1987151981 +822483740 +3248312971 +3605454740 +3367873661 +4175254489 +1022861164 +1142495531 +3648350564 +2286918856 +1799911586 +2755051176 +1976601717 +2244400945 +1280572307 +2307164663 +1987954489 +1973641636 +2869504460 +1247403579 +1642151999 +4284361862 +677931557 +3072582862 +3727207696 +3576583479 +2607200310 +1568447099 +3822578555 +2472004206 +2109197568 +424326084 +3542216154 +3025867323 +1754006221 +2303474801 +3115123525 +1098652695 +3595711828 +3878805978 +93108837 +575796507 +2969245933 +293581903 +147448464 +232562615 +931931158 +1318981227 +3369064320 +964506342 +3375266208 +3025485676 +4032340082 +3912848884 +368518494 +3901750448 +2426384853 +65472000 +1099243784 +1942524010 +3077458843 +868951945 +916558741 +3302325885 +3286607195 +1387399432 +2051573308 +1929500323 +280555889 +922686855 +691816162 +2437792451 +3578927148 +3674493516 +4117869664 +3298998282 +1639543021 +2934768292 +2679777715 +2685369399 +2925587507 +4180232522 +3597560466 +3276417422 +676446297 +409167674 +2171882538 +3758570229 +2503767722 +2119254226 +743129614 +3246131562 +1226038814 +2155827612 +801831924 +1252461243 +3333797514 +2303631707 +1474901558 +2530794504 +546622140 +3736781656 +263012367 +2659146801 +3923589964 +173958716 +3592302865 +474427805 +859686792 +1671436127 +3126752263 +1059510420 +2437218221 +15536169 +2587953121 +1453023875 +1241804109 +358467524 +3074501982 +3452370764 +3621758682 +258184274 +3212009253 +1770435084 +3083466551 +20690931 +2607264854 +422267392 +2532229396 +3449945758 +3363833833 +2276615026 +2118602942 +3649865852 +4186044402 +1334976166 +951590070 +98788137 +553444921 +464557676 +3742544583 +389750800 +2326689 +1905646739 +3288885900 +2411288852 +3312484988 +61095770 +1167254177 +2338840021 +2139971794 +2936363240 +507458340 +1552962312 +1772903444 +3455838491 +1530726164 +924313625 +662934240 +243449214 +3160580593 +1341213805 +2907657013 +1916285618 +3410196203 +3334114699 +2211425544 +2848949403 +1393215390 +4031667176 +2002865280 +2248925447 +3191970610 +2228309097 +3280160485 +2597681267 +3359264810 +3910154816 +3250390471 +3509313082 +4259172180 +2115243065 +2929818811 +931788165 +3272088148 +3622442764 +4201175981 +1692014377 +1974489782 +1526808632 +2565443976 +1142832502 +2751702693 +3400095927 +962353158 +3868076849 +1184549388 +45709378 +1048157457 +4018262527 +1467394709 +628915314 +541500617 +523518625 +2112720788 +3607585209 +2992793002 +271439393 +979269508 +3307435986 +1210659706 +3373959137 +1754266743 +2326333783 +2664234727 +2878123626 +3780497515 +747465558 +509480518 +260588716 +2968561772 +3867018896 +3490990176 +4223138900 +1763408815 +1777875745 +2582676188 +125025769 +1329658690 +2514404494 +2675375824 +3327828614 +73753288 +2159085306 +378072928 +2012292075 +3175640214 +4102457296 +680706124 +3353981968 +3130952721 +3456546609 +3442383262 +658928868 +360918752 +1549903794 +2356441894 +3923570259 +2091883918 +622935251 +1228269681 +2078023959 +12361138 +255472671 +1337949342 +2667050952 +3165209837 +1577609652 +3098794532 +244818737 +4204386451 +4094150410 +1244328012 +865207505 +2229507090 +3306281334 +3914728020 +3207417715 +4117140011 +447169326 +3608910996 +1118434828 +800716944 +861594102 +1028363385 +1648747192 +1462155520 +179389586 +3506194770 +1510732084 +2105766463 +2126382331 +3090875740 +1911713182 +244760391 +679302236 +2150169693 +3651223256 +3468000699 +2646168388 +2190306432 +4247627792 +3377536615 +16308679 +4122794921 +105147868 +1997387763 +3945421112 +2787774944 +3895697262 +1735131770 +1702387541 +1864056361 +4125702799 +703307737 +2228982567 +1237310503 +167533714 +3321829702 +879448533 +4248359205 +2662860274 +2891187865 +2991922301 +2144261053 +1285362005 +464393716 +3087069707 +2146016602 +1763029131 +1586159549 +4101702718 +2759230461 +363343951 +3528814943 +502613547 +3676367848 +4122126447 +3595662105 +551954453 +699625131 +3633052392 +1447747593 +3015677038 +2989815259 +2271098178 +791085917 +602182145 +2055255729 +1675422815 +102110350 +2370185623 +1243280732 +2223408489 +1177430207 +3753055421 +476316249 +3375067018 +2669143044 +2125854608 +758760189 +2201678616 +3359122916 +3267229058 +3835175084 +1916205707 +4176204196 +675563885 +993084435 +97511076 +2720380298 +2204758163 +3521335554 +3488987022 +570359318 +3595383440 +3976988002 +1230537284 +3970367778 +856356728 +4132643453 +2787020025 +2820490114 +3892005243 +3353784520 +3342777778 +2941081906 +3622084573 +2932845414 +2721721254 +4056577974 +1663929558 +1999204972 +2464747853 +367327752 +4246285634 +690129728 +2435752949 +58738785 +2795754968 +4264008431 +1409518392 +54949887 +1896978696 +345245669 +1776713569 +910259511 +527425220 +2426138005 +2109136447 +1922547721 +517983386 +1618791870 +3000980049 +2985759652 +2899564053 +2806794769 +3596516267 +1560559655 +328615105 +1730685999 +2368452419 +2495699048 +1982711125 +722294538 +2310848799 +28293352 +3342352030 +2205895524 +3140429537 +1208621015 +182549131 +1749941303 +3144801410 +2288571107 +2768220825 +2271161155 +1960487524 +3635959832 +1019797898 +3928710223 +1959216973 +2226947785 +3350781336 +36856808 +2415029375 +1654702028 +3812623029 +1347622575 +1264316137 +571124348 +3542571519 +1727914589 +3449641653 +2754262899 +1308401383 +2468953205 +1396104730 +425009155 +3369405732 +323929521 +1823571778 +3394533710 +2365199847 +2572507246 +2493979627 +258224965 +2830700198 +2807250124 +719217482 +4177014292 +614608548 +259412727 +4263646063 +538266009 +2255756673 +1849535095 +4098670471 +4036828656 +1165923062 +1500227229 +2197544956 +219805773 +3515126231 +1948374464 +2649873981 +622484745 +3482639854 +1199736374 +4081879565 +3000184578 +1319835895 +2557456059 +1788196734 +207313964 +2241637799 +786975972 +853278631 +3979215238 +2461702845 +596714368 +1722886648 +3089765051 +3032644674 +905327190 +1903658630 +1967432028 +2263875784 +3693942337 +1380067378 +844782011 +1062939267 +629365301 +2023394683 +813879782 +3446479002 +1964533786 +604592610 +3107592649 +3731218240 +3764971870 +2554684546 +1576912086 +3815805067 +1954390880 +481976705 +1741102553 +4294150405 +663514212 +2825903193 +2107449623 +2980675248 +3336999893 +3442516536 +1068100062 +821357238 +2776522332 +2343409228 +3779447093 +2017430788 +1865226992 +3039647463 +1079944625 +2229240701 +2106245623 +2213906628 +2084600257 +2012991262 +1259141992 +3376762593 +3177229326 +791164607 +1236578741 +1992752598 +3976029548 +1151682114 +24692840 +1639873500 +3770636839 +978369572 +2259474567 +3694307225 +3796356318 +190634939 +2925647754 +2368159702 +2589440049 +3815664579 +752761272 +140478458 +4012703783 +3066193833 +1124109435 +3084518704 +1492725866 +1934669942 +3756265446 +2981715409 +4127234180 +3720284715 +2948611402 +2839441107 +3468926652 +2859902947 +2124507608 +1883118221 +3868409068 +2219257921 +3399051028 +2728142381 +2078849318 +410971278 +1677609419 +1627667970 +3372334209 +499655604 +1846041020 +1616386840 +2364359867 +1580862910 +2098876006 +425162279 +1617355397 +4134940703 +365916409 +1357714249 +648863536 +1808051705 +1338394763 +3226749042 +1625967992 +3418520579 +3482867499 +3130435248 +4056389040 +3020620132 +2395089028 +1693173990 +3805613088 +2219065460 +862259875 +3966298488 +1414172714 +1799285446 +533953587 +161378757 +2592355089 +1453457339 +274552138 +2115006186 +2720521313 +3985932437 +3402335021 +352663643 +3362614254 +1088435469 +4267796100 +2192344785 +4026105841 +2594413628 +397145575 +3506582737 +3741060847 +618794189 +410888875 +2388372789 +64070510 +1704218322 +3432842298 +2595044018 +2145009865 +3141691061 +3147395185 +1250317814 +4271889921 +730553826 +2303083933 +3398314089 +3354375492 +299822659 +689277311 +3737690301 +846686180 +1042500515 +2910398189 +3571987151 +168178130 +1626194336 +2252084390 +2569692614 +861456378 +2072528009 +1645137510 +4127895988 +1109280629 +2259304856 +201412886 +684802507 +85165124 +2312140057 +3666918421 +2739846206 +3631454765 +3898927803 +3991217890 +3076128729 +3013129770 +3040386996 +524195698 +1587883543 +3061952136 +3928396516 +351152999 +1149354234 +3902718707 +1730994909 +3592754674 +982388113 +109097421 +3536430926 +70397006 +1505328447 +309867603 +2877689487 +186335467 +9882520 +3324654210 +182079095 +1722912904 +1978530054 +4087775247 +3696304918 +3765856188 +502139990 +1798295239 +2497810054 +3092420442 +3130074885 +2089375388 +1764095091 +1712945241 +3002478435 +1515127275 +796870919 +4047491558 +2057877191 +2758046003 +3707095871 +3967230331 +1121786960 +1861876089 +1180649649 +3266999701 +2457806802 +3582538351 +20721960 +802896242 +2835943684 +33971792 +2035861919 +3599485830 +2832292276 +3566527997 +4216350809 +3368241671 +3801922569 +356526023 +1968929195 +1814924587 +2528708504 +1018966405 +2282756406 +152161477 +2941991250 +2999923696 +3727006625 +732059148 +1343413440 +4032463553 +2635742774 +3554632872 +421827828 +2959442680 +630555064 +1768178898 +117645990 +3254704082 +2721727473 +3718590980 +1476560829 +2744743973 +3074501795 +2307676525 +2471732534 +2601595065 +2237367816 +3806542004 +3202975731 +1911071467 +3383867939 +112971114 +3698183374 +1642803793 +614323227 +3671334573 +596504609 +559692745 +1925712909 +1354391525 +1263399808 +3117659973 +504168104 +1573884540 +3641058799 +1446565267 +1746703644 +2899173047 +3668106608 +2418358546 +3087391051 +732951948 +2709990864 +3687062560 +975395786 +2339185588 +3898385572 +1979922717 +1370720051 +3698130387 +3313587569 +50598408 +2235512284 +2532417754 +2928578971 +3518736555 +252444670 +1280165899 +2250299893 +3794359232 +4025110928 +1359929357 +2019814742 +329940865 +3133585737 +4184707289 +3597330287 +4124639235 +36371527 +3424947540 +975104264 +3869971083 +4260058016 +2679663624 +1506589015 +4199908779 +2720520558 +2818723147 +1264934286 +2138486287 +3940613661 +1912677058 +3560735664 +4131804456 +3825179058 +2920814868 +656944109 +3287926627 +2764581604 +179098605 +2201193505 +1663457634 +2528842750 +1243254146 +1493320558 +885827200 +4198664492 +1623978028 +2985618295 +1452996432 +2716596049 +970572653 +989584780 +697798348 +4251528632 +609947449 +3839622983 +598706134 +3201662949 +1735489879 +3146100305 +2244549960 +1676415092 +1795136237 +2492409447 +2952283650 +477882754 +1484939696 +987945919 +3569337275 +4061758034 +4277480247 +3057619622 +1165194163 +833278917 +3400377938 +3887537635 +4273833763 +3308324242 +3652584520 +1693569613 +449479918 +239201928 +2691917269 +739816672 +2561767726 +2007729390 +4177576909 +451572921 +2248007266 +2991097330 +4213941206 +1129649275 +1875874277 +4101586573 +2906751042 +2610757399 +3676236515 +3909511956 +487433239 +3719774243 +2600836976 +2048111838 +4178208987 +1623771316 +2912290386 +4212038705 +2507029590 +89626456 +203851646 +2425836091 +1635482493 +990464997 +3464188621 +3032121636 +4294104905 +50360543 +3775847527 +2014477558 +3568476921 +3067712083 +1540018854 +361180250 +3782648637 +1693339801 +3642027848 +695496449 +108616371 +1556674384 +2899973375 +2598210323 +3441036233 +731694532 +3616091596 +2475807356 +3443207133 +4171113528 +3618498912 +1265585322 +418853932 +966642946 +2187365044 +218497722 +2579096760 +3965255583 +2362972035 +3560282502 +4259279631 +3414673714 +4149965394 +1303496435 +1642268153 +2845007084 +1137673109 +2206142418 +1277973869 +235021587 +1478461556 +3052475695 +3696690995 +943581629 +3685386475 +1965378223 +78843494 +3801616502 +3545068331 +1826108900 +1187207237 +3994675876 +3382000308 +2352613924 +2227918016 +49227934 +480048553 +2011901259 +3406443614 +2272224830 +2061653911 +1808544024 +675601230 +4103509310 +2778778360 +442928169 +3691653834 +3800270427 +659174298 +600334914 +1289781639 +1384003980 +1807067148 +955966693 +8285195 +315905951 +288510063 +686329684 +2407467462 +3285966333 +1067188777 +2433656897 +1756988255 +2100585760 +131332943 +1661451762 +2514459710 +1947239117 +3473651393 +2458232195 +1681981362 +4289144171 +366070693 +1509311632 +3415596943 +3879158130 +3748858596 +4092435753 +221246418 +3031964419 +1935790643 +687972063 +3534901323 +471196862 +2549370492 +2504069081 +3335413725 +448228694 +3160816430 +1349599244 +254442183 +164855287 +760248188 +2301745021 +3748363533 +2355467210 +1318277233 +433897323 +3041690675 +864069041 +2890117088 +3526506496 +2060030859 +3975327382 +3307372113 +3770998941 +2947244282 +3642939922 +3835187100 +2760167858 +1114515455 +1280171789 +3855111874 +1291852778 +2709119482 +3094948756 +4032512027 +1449133701 +1154181714 +3498994780 +3608339197 +2318836416 +2149979698 +1118006696 +3727484624 +1999276883 +1580392418 +520378005 +42476730 +1740509448 +1255708869 +2761519625 +3664830876 +1557819660 +2262284662 +1664425490 +2307637884 +3604434688 +6920690 +3349986265 +4054748458 +1993955271 +1136382704 +908094136 +552863228 +3104986719 +1697445614 +2053845026 +2308008382 +2902246201 +975976270 +4206959493 +2144141827 +1599188852 +3472029872 +761569692 +3897655328 +3226456685 +2287176707 +2828169582 +3457658456 +3214470417 +3882061417 +274125525 +146721586 +1644272734 +4266447889 +633493843 +3725028286 +4293651551 +20166525 +2182419140 +1239259337 +1597050464 +3948047873 +2408193159 +3407012272 +1917465460 +2228553311 +3118091115 +3090967602 +1438422293 +3633718832 +1746741454 +876566359 +2132655137 +709534218 +1731496084 +3612431349 +31022517 +2176462240 +1791194421 +2015201290 +1274164212 +1221494037 +5089378 +2673715842 +2192302422 +106567431 +900623316 +1255738777 +586675880 +3435191939 +162460797 +526718727 +791637040 +3255656106 +3776240947 +4140019224 +2574496820 +3744032322 +1324014125 +1938759327 +2672179277 +4223835317 +2507645472 +3438305162 +2002622338 +924437405 +362734898 +2496038458 +521369287 +36665925 +2818872497 +412763970 +1205478192 +2562831352 +1842639843 +3829100491 +2774713859 +3603988881 +2030960764 +618463254 +4120796264 +2115600380 +3099454077 +321384835 +3522035065 +1648696710 +4092091028 +3307059358 +1686492543 +2234151731 +255694577 +3292164295 +4197609271 +1576906821 +542265619 +2202817995 +849745295 +2153927107 +2969472369 +731221565 +765994291 +416823307 +3238174829 +1112505339 +796805746 +1897832933 +1962103206 +1754005420 +2527831455 +3543789681 +3870343588 +2417612327 +1229916482 +2414283512 +3764248102 +3295917764 +2030357140 +4206457580 +1521034440 +1293215741 +239154413 +2521143167 +2857174884 +2065489738 +3617344915 +1870065909 +3407800508 +2169194424 +2487116439 +3720077815 +2455939526 +1394693243 +3899265628 +951417513 +3269543755 +2860182645 +2630561480 +890494682 +2409712142 +1689941481 +391517020 +2638784403 +2692210932 +4025395848 +855809080 +3282481699 +854028919 +3203778611 +1042358232 +943600560 +2734873680 +3585741407 +3990896975 +3543541269 +3622371839 +283702280 +3838684336 +908221649 +20669110 +1678273874 +4200839995 +3194818435 +3675695706 +244613286 +2230614525 +1532353168 +1910715064 +1829298232 +3396514313 +3899309372 +2190351453 +3147416821 +1365114935 +656463619 +1135626939 +1632055702 +83808276 +3071644576 +131491014 +264026032 +1074145055 +2127544339 +245918558 +2347160672 +1315541823 +3816089344 +785458944 +2791940201 +285551756 +1394988456 +2975177493 +4209355115 +3294420180 +2925125241 +966280885 +146116109 +1142446688 +1105555938 +2973087321 +888308299 +2170365922 +3001422685 +3952934272 +2586967155 +2430119463 +2475866878 +2107614301 +2292291341 +1608023020 +1091808944 +1083237185 +734886754 +2314706270 +2277530815 +594566609 +3761540888 +2715031142 +1406191626 +3033557055 +3705711044 +3806784127 +2857549930 +2160815190 +299631717 +2556389115 +2326790280 +652196648 +2702151205 +723460505 +1499312265 +3526008237 +3058176320 +4023957453 +889262607 +1877614975 +977274731 +3888278062 +1273805109 +1937771629 +898350258 +1905832678 +1876255175 +3133183950 +1581034619 +2041292587 +2808148779 +1158171716 +3239133264 +1037431486 +2151421037 +4091372734 +39464838 +644311865 +2684693502 +255834881 +3650465418 +3509060503 +1601800447 +574136711 +1368555013 +352363975 +2420604711 +4085135206 +2887763421 +2944798493 +150925259 +2197391817 +1301609464 +4143559759 +924132768 +2818560172 +3987918772 +26248837 +1987034032 +4010577824 +3330291334 +747297841 +2897496038 +684162303 +3234662059 +192152210 +3251963527 +4019222405 +2811092413 +3223957626 +1431071080 +2835929327 +1281806691 +3479248830 +3347519493 +2302271560 +1235805724 +3996137791 +1607818432 +1665947742 +2683926815 +1660697073 +3874419858 +1457199744 +1398496395 +1384740646 +2440707855 +1086667062 +4167892790 +3517710684 +2375668526 +76378985 +3052829646 +2278854647 +2204227428 +2549181944 +2481589654 +3234157187 +2955465313 +1001621142 +4009936223 +2450602976 +3325961614 +3431433421 +2943180949 +1244505897 +2154913574 +3243442592 +1148235601 +2301777165 +2913969438 +3882083603 +2568703500 +1109827028 +1292879254 +3113108896 +1008943325 +1949796773 +1705636180 +400800759 +2774076052 +3792401652 +3425925732 +2973891857 +3817996996 +3550428347 +323199946 +4103397641 +343532531 +4226308881 +2264157975 +3545824963 +2391776323 +1263593157 +1386743354 +321702824 +3277839531 +2279441665 +1930709825 +138370754 +934017060 +2109279749 +520702757 +3480569001 +751535384 +1680082630 +2383626189 +4027535461 +168618079 +4284731204 +427389340 +3712842287 +2108119775 +2324995893 +2218721798 +1792920418 +3415487241 +2216648178 +370258394 +1970562176 +1891172440 +729343554 +2893826111 +2701216690 +2631782577 +2595139466 +530617668 +3371093539 +1216506818 +2494413706 +133258173 +1516313251 +1229637148 +3509434845 +2988163549 +3604802423 +1545074281 +13322565 +3346968605 +1740583947 +1576183158 +812960272 +815752564 +1486026031 +4263299861 +757103850 +3347141446 +351512782 +4001895839 +422901239 +3094777012 +3925120469 +2329732556 +1085618838 +2303678174 +542384987 +2652420315 +1616069420 +2749777249 +2173945567 +1225507892 +4183480358 +957343664 +3597742975 +1513921788 +2467785130 +3872212968 +1587181464 +1745659594 +2218136576 +959032099 +2234740464 +2798321909 +4044659107 +3415630685 +4085350986 +3810146368 +132259056 +3055985372 +2911131495 +815179978 +2649492169 +3277489328 +3572527577 +1419911020 +2053788823 +2303081554 +338819190 +3983700547 +2746202690 +263288506 +2641232260 +1615836567 +190763324 +2479319754 +2507728917 +3684824862 +1176178553 +851939397 +4045263074 +3092622083 +2783510841 +864220175 +1933427416 +2078416901 +3458877549 +2855129198 +4202897891 +3599463193 +32222522 +726254716 +3530670152 +3947964677 +2622790930 +648378897 +628651555 +913203934 +4011406930 +579759544 +563000955 +2434319462 +3395572619 +2385615390 +2266953734 +4129685858 +4200677124 +1096515436 +1653182002 +2702663659 +2939453797 +3178397179 +856587592 +1266260852 +3928387593 +3244815706 +3984780666 +260301538 +3762094033 +2993805818 +2840683833 +3564284704 +2257931788 +1799014517 +4294492219 +1157329413 +3798826225 +3194749194 +2918720592 +779307526 +1830782668 +3018869267 +3560659991 +4034605355 +1337527785 +2532876298 +1793912319 +3760299114 +669965824 +2540273657 +3080987628 +3274802686 +3287563971 +2566355793 +1247208955 +3690643896 +1084470802 +3760212217 +607307553 +4021921329 +999174851 +814540886 +2675384011 +2119127270 +1128737325 +1713979845 +1448213129 +755361768 +3730371841 +2551345371 +3392251228 +337921921 +1788299483 +3461052968 +3041782166 +3258466281 +4045098797 +1247306040 +2131786139 +532094795 +548010028 +3354060452 +1969311328 +2053538543 +3264998811 +1987243253 +2863858112 +2538343211 +271782107 +1362026498 +1701155373 +4071191713 +1135261717 +2216686956 +4251703306 +1934231878 +1657088714 +1754420454 +2537830991 +1146053435 +1458682750 +717505011 +1317994570 +3236084754 +589615059 +589772529 +2330769530 +261952863 +3131892671 +3213265269 +1575399078 +3783158425 +1719835137 +745762717 +1060440161 +1554660793 +479541718 +1617223391 +1397368283 +2930744934 +3076783898 +910880962 +2139046479 +2451837547 +358478129 +3047175525 +3279234354 +3638037209 +3405007939 +3906524464 +4247051519 +3019522083 +674171289 +383374686 +4274671436 +1150077573 +3265733592 +4105889160 +3042057169 +128821617 +1116569481 +417199458 +708480244 +3386522 +1265802133 +1514446569 +3899188257 +3833037631 +3102492150 +3206068649 +547485321 +2546371008 +1424019667 +4227819673 +1279603424 +2070507537 +1741609025 +4235893097 +3689408198 +2897320626 +3043956618 +431983762 +3190194573 +1100492761 +1809027751 +3960101574 +132012259 +1947460375 +521412127 +3586430363 +3588487184 +2902189955 +3671996501 +1249674896 +1771166561 +428637824 +3467335808 +2514688576 +1926186147 +3400061416 +698841528 +1266425406 +2014809161 +463345483 +650014118 +4234696686 +986591030 +3333831256 +647275642 +3776294657 +2721302923 +4102238143 +1401669628 +3104664628 +1442650316 +1523201063 +2464723882 +1755566313 +3379864727 +1358494160 +3910935855 +4087249195 +1708662379 +2886473059 +948077791 +2154873651 +1875664733 +1162784652 +2224366316 +3775726222 +1672872842 +2133147271 +2274758483 +1278077571 +4246726390 +1671291785 +2005992446 +3664891972 +2801559565 +241511967 +821917746 +1424369795 +529533316 +2932449758 +254641704 +3687307761 +474845067 +2162048975 +3363973837 +705236424 +2848866557 +174920247 +3882626060 +331920356 +2949846388 +2654217787 +3912532946 +3473317809 +3713208535 +147691055 +3122097270 +3732985774 +4021180370 +2880327842 +1500546417 +924201706 +2081939321 +622172969 +1373977128 +703942711 +3951325828 +861740533 +1594524750 +2891772376 +1862950006 +3482337564 +815085904 +4187592900 +2058331646 +1381526888 +2650716018 +2342386481 +1571465821 +3342893662 +134029819 +2907314661 +1595541344 +2551380517 +3514965595 +3032846624 +3997939293 +2517913515 +915981651 +3988349022 +146639095 +1507557750 +972533654 +3592797132 +2275836538 +428016058 +1195409179 +3504727821 +1184242405 +3022766130 +1786116493 +3373256134 +3456934225 +2569460420 +1416931580 +1385764464 +3733370352 +3213714989 +1018471806 +2182056804 +3522251297 +3032290795 +3997980466 +3653358853 +2618037529 +3935677308 +1476088807 +4236655984 +1081954288 +2072424613 +2697965901 +2476844544 +2068654853 +363899096 +3970751108 +4288898930 +2972224117 +81099902 +4223078420 +3962419291 +3323338964 +3221162734 +583800811 +2182850464 +250423808 +524933212 +3808036844 +339032384 +2761691301 +958031365 +2793029087 +1247264232 +3796657715 +2694912506 +1790403233 +2149177330 +3332284205 +219456528 +2976656120 +954448968 +2603674234 +1041542684 +4085524026 +279663982 +3891847513 +1597101584 +2754564610 +2605483280 +293001123 +1514723605 +1540461878 +3966594420 +3633202046 +2985216256 +3178960875 +2740813412 +1450964033 +851635399 +121483633 +3378142793 +635767117 +2514083505 +769617228 +2635303674 +4211834778 +3737772947 +869488517 +3366806204 +3982161216 +635080292 +3855694253 +3760691805 +2611592415 +3523816889 +77916745 +3958328504 +1653164144 +2868805075 +2093567618 +735805609 +299422173 +2662663045 +756475601 +1994607870 +3933614478 +2279964963 +1693005810 +68827253 +1698759435 +1265569896 +458905068 +553065478 +2809301340 +3607455545 +1379501450 +836352549 +2729501853 +1299793247 +2935526409 +1313606520 +1774657591 +1985289421 +1137886634 +3445695030 +1349309363 +3304034907 +2481529048 +3954460854 +78766099 +1198499389 +2153853020 +4146346936 +2309437862 +4000757135 +3622679225 +3473728911 +476375990 +3953045210 +2474311890 +3149687202 +3928157894 +1750129536 +4188672677 +3577769046 +1943320464 +2686006439 +2740698007 +1805506586 +948655947 +1144923922 +4224980738 +1829900790 +1551586975 +4215370369 +2046494610 +2987182592 +1980126268 +3664702493 +1974553497 +442584535 +2753061111 +2267916115 +1699252413 +876304902 +1757687017 +2883365474 +2029238906 +1286305611 +3844708443 +656725328 +1286673977 +1494971291 +830111715 +3403459192 +3333536609 +3674005893 +1618028320 +3908466663 +2227369523 +2884237448 +3285744259 +2878320880 +1061454623 +4744050 +3292304013 +735752726 +403455192 +2304379607 +1812776284 +2306903143 +3182144810 +3685583105 +3627652524 +422427226 +1735227617 +1477400745 +779324415 +3221961658 +466930479 +4008226880 +1721871215 +1413003845 +552005314 +1253309895 +551215198 +404018799 +3776554995 +2086535994 +3611522311 +2368273837 +95862031 +2641372426 +2046119972 +3907524244 +726253726 +4098941387 +3982142033 +2838394784 +487517689 +3175307215 +3117401145 +578795727 +1979713824 +1241541533 +2430163166 +163484663 +1293050479 +458385360 +1483586378 +2158218468 +1018982965 +3342028608 +3682473472 +2794383467 +2760556368 +4222494403 +1203263999 +1503944511 +3681001012 +953047744 +1329625291 +1250301625 +1559646459 +1972552094 +943234543 +1711671251 +3341553322 +2519638047 +161499559 +42660040 +2794727496 +1451412869 +1557826694 +3863546673 +2026576916 +3183725701 +261698464 +2531996349 +3840748601 +2361370601 +399720521 +1404860719 +466960717 +3242989479 +2137990502 +1631408178 +4132258050 +1137582006 +1357438138 +2305728136 +1566671441 +1540546374 +3220734227 +2613573384 +2652556496 +1283637605 +442381851 +2578673101 +3279033565 +1315541156 +879070950 +2745195484 +705666017 +3725711481 +3512518434 +3146943900 +1925031536 +698439377 +1152453799 +3256862815 +72165279 +2778465924 +3077109913 +3315702998 +1450921489 +256603234 +229166898 +267260028 +3175960586 +4283107392 +1300275356 +987953501 +462040688 +2692682429 +2669920984 +3539300355 +1820782822 +2176518916 +660276197 +3550348482 +2947479786 +4196948389 +653974693 +1726992458 +2468359795 +92678838 +4266559297 +2162655829 +1599642973 +2251928080 +916443168 +3181534577 +3459285586 +522566125 +1598831354 +723875346 +3601919357 +1826886258 +2923410370 +733123784 +3051917591 +1392915965 +841440282 +2927860490 +1277372077 +3494925066 +4094931237 +746436507 +465017732 +3828570052 +2032109726 +3710639324 +3759076094 +224222122 +1793417790 +845002614 +1442970978 +2649745416 +88127766 +644974661 +3682007527 +3654786692 +757601636 +957702785 +4224486144 +2512485058 +3477505941 +1679272861 +1033194589 +3138262838 +2478626348 +2055874416 +1280595747 +2316618145 +2669713772 +1459756837 +2497990797 +2194137260 +2707788459 +3965184562 +1558261249 +3615040822 +4079345045 +2614293834 +216030882 +2095006341 +3912855115 +3245436012 +3079336331 +4086652441 +3750352071 +3697691656 +2839258096 +3870084487 +3317152388 +2494872060 +2060060093 +591960722 +1509041883 +3585439975 +4000053190 +993742891 +4227659188 +1940755111 +2120970883 +3575313025 +151061170 +379193208 +2809160000 +3040597311 +1111886049 +1580239193 +1679607526 +1622874411 +2706733969 +1176669175 +3316518264 +42164053 +2949070514 +737527728 +313390842 +3297030769 +4115465092 +4244266841 +399105591 +904946579 +4209145373 +3094002388 +44507475 +1903933735 +2288507240 +2661987130 +1792205883 +2375915428 +2683667585 +505408107 +718895736 +1340486668 +3907573984 +511294549 +2089538763 +2285590668 +1304944553 +257720977 +4019117796 +2120529291 +3566036763 +4187232051 +1243103611 +21547920 +3704820163 +2982660815 +2510463530 +3439735671 +4013917810 +2761113366 +95017338 +3854372446 +2230152772 +556262933 +1698989624 +1562014170 +2781119758 +465557539 +693550734 +149042425 +1410222652 +3998661193 +855236770 +2525694309 +2127728693 +987482403 +1531605176 +1200215328 +178081480 +1866570049 +3431783474 +1554118749 +88999967 +4136905888 +3198363118 +2566714990 +901079042 +3259038295 +494396235 +2245300909 +3340312123 +2639024214 +2340142756 +3304134300 +2346675718 +1715835476 +423245667 +3128771690 +628222286 +3418133402 +3660386194 +1903995655 +4192262958 +3290860941 +820566888 +1048470823 +2852456609 +1392610077 +2218036747 +90476663 +516343955 +1579496345 +863775406 +2973525011 +1696401798 +2344257344 +811733199 +283773440 +1140103381 +1684804544 +3748162319 +434662736 +454118811 +3776569787 +1614475161 +1721779980 +566498567 +1630174705 +792142546 +1863772605 +3484760751 +2917588128 +1942908463 +3822270553 +736908378 +695739716 +1863006344 +2563267925 +2126784633 +1279218687 +1454024528 +200812025 +2031261999 +4242348137 +4027478771 +3123970077 +3889631154 +2558091442 +1677357566 +1562096762 +1261616515 +3357101704 +1350479523 +241855668 +1812759884 +1772422052 +2417717326 +1845572611 +2062838600 +1408046380 +3371884874 +3425208708 +2265163815 +3470595174 +2764781411 +4291358420 +664705992 +919533894 +2354537386 +1519457226 +2340391906 +1842868050 +4076692285 +2129889350 +578740279 +3809890736 +3079977087 +2885717736 +488722458 +2769671341 +3011744535 +3493943503 +4203662621 +4223913756 +4048519894 +2793772950 +2103475607 +2070722387 +3506548917 +120982334 +2731869915 +534193588 +3652306030 +483732005 +1872964660 +3566146554 +2924332681 +2099417677 +776005170 +590498578 +2860206360 +3645012862 +753456645 +2168405049 +2581262848 +117688286 +655727325 +1757280531 +3803438453 +562897436 +778973823 +3705760012 +693944185 +3247397636 +3488660393 +1955669001 +1986736802 +2693262667 +1604960662 +746324362 +2680001909 +1898815368 +3854905054 +3812327250 +1089099201 +4136107645 +2173918621 +3580175406 +2793492357 +686689856 +655750218 +1520632631 +3868657273 +4077685580 +3616181435 +1152415551 +1629463555 +1618052281 +1383864013 +2788910925 +3405890131 +3756572041 +3022931748 +2361804616 +3686125327 +1948310894 +1152376868 +1716786944 +2583246853 +2340510390 +2933763134 +2129415714 +2967542791 +781772390 +3234121782 +4289830068 +2363546545 +671829479 +2019743270 +2770508963 +2893838180 +845066155 +804510864 +279728060 +792866053 +2475261641 +2421073414 +2123585047 +2491849021 +2727406589 +3638068581 +680040542 +26260721 +4015932675 +1952902542 +499150305 +135824770 +1512290910 +738895457 +1037314546 +2801050524 +2261692292 +209355552 +3600941968 +3474585036 +1762107889 +1793677955 +3855531974 +3698984987 +63313475 +452574587 +1939908588 +1612585174 +1850811281 +1543578122 +3167166726 +1477819498 +310062335 +389825062 +3265567631 +2053497783 +3182841300 +1555920303 +880949341 +1167119392 +2015209051 +3090415807 +1297968029 +628581798 +1421457282 +709773873 +3945516510 +3410296685 +3762816605 +2115806156 +1157805248 +4023650717 +1102376037 +3093243578 +3328303848 +4046876384 +224559793 +3725809682 +2255358667 +933273531 +4077838555 +3278063946 +84682237 +301881806 +3589213329 +2221788052 +1123872292 +25404817 +3119647615 +3978465138 +191212088 +3682938618 +1012462692 +4190555278 +3540590759 +1029153720 +2397138616 +3951345613 +4039787053 +1765472574 +1337376014 +2513971636 +443250934 +1898551711 +2171864056 +3239929923 +1344323073 +1728293379 +4193652225 +1583133948 +3455225310 +250137128 +851403384 +1508958935 +1598354462 +1687020485 +1289354855 +3927477160 +1251288461 +3763715265 +2251906485 +2619791047 +2842314144 +292032210 +3318672683 +2434415185 +2745716378 +2703769589 +2685368805 +3525669081 +1003457121 +468645283 +1460952984 +2590112242 +1024629731 +2839276271 +1245303882 +2873756908 +3757964363 +1148272054 +1136329135 +3158146665 +1448787574 +985040442 +3561026109 +4243519034 +4127338535 +4033562314 +1530130287 +302522170 +4064407029 +4210128102 +1068363632 +3813974786 +3091733273 +13017859 +1103874804 +839731092 +2971903968 +1105946241 +2436644413 +604548980 +955003976 +3180045780 +2256949850 +1691157065 +3084649181 +3822810036 +3749146045 +668732348 +257227430 +334423601 +294746935 +1761477364 +2722349357 +1750108779 +1808561150 +3670476571 +1986331539 +2149632278 +1250575334 +3821831491 +2852315433 +1195724778 +1317856936 +3778180573 +4034473131 +81610205 +596203269 +3843097398 +939999254 +3740455197 +3823583198 +2879028090 +2980148766 +3883642259 +3084452427 +2276314604 +3150969849 +3358089150 +1585410878 +3436302339 +1923672815 +459000085 +2902285360 +1696937906 +918958773 +3518330941 +562682126 +1838384565 +3195030469 +856121900 +722209847 +361168774 +1760438727 +964708506 +3795992075 +1602546677 +3229259260 +2147789627 +2583522673 +3003571028 +1352890146 +1128027615 +4236589871 +4262728028 +2045072085 +3013831923 +3128968062 +2958418018 +655556702 +1430727131 +3963451770 +833934290 +1423647487 +2052460740 +1798268914 +1919632038 +2150998914 +3615111497 +4214863096 +2779602613 +2639921503 +1626086585 +310556205 +3850721628 +2565944309 +3376425978 +607042126 +3574230552 +512169941 +2130755100 +3814519283 +3936241017 +3676612490 +3767256230 +3642699196 +138483371 +3110364692 +1523565647 +4150811324 +593424779 +2546617806 +570794035 +3756148541 +2203841454 +105776335 +1482065024 +3072014265 +1458229875 +1993570507 +1960412223 +283694498 +4235947841 +2696326401 +1573668122 +305356948 +4251663368 +4064139482 +4239287801 +4266709313 +838926869 +2000305824 +700480038 +3986913164 +1804044855 +1184901503 +4099662877 +1515131411 +665381840 +3916747950 +2654952454 +2311724465 +1519181489 +3203458203 +2913223282 +3079332700 +2009987886 +3902066536 +2009796882 +3580185054 +3248925762 +3132491499 +3996192725 +3554074115 +22811875 +3222968369 +522527398 +159459280 +949167125 +2220756465 +1949265183 +792233906 +4250415120 +2697881410 +4231142453 +789228909 +2784681878 +2782558120 +3460000644 +3872720222 +1296474096 +2211250726 +587888337 +386548262 +4259490071 +3138488342 +153977231 +1353923473 +2212663088 +3064617197 +1176853054 +74990129 +1316096104 +698874524 +687116199 +4172862114 +1487902870 +1590101804 +2326087138 +2632000428 +1695501645 +2315181247 +2993134046 +1004870055 +2191760232 +1452080464 +2264714373 +2228548743 +3992520198 +3087318011 +2379744465 +627924400 +3917111388 +18037578 +3364044508 +3350704191 +952297668 +3638718596 +829602458 +3049063801 +3837991864 +2587324121 +3607498718 +469219035 +1906622939 +2816308124 +2351297434 +3570012888 +3083565242 +4105399585 +1378997501 +629971937 +2489528087 +2386686115 +2366406032 +4004334288 +149440372 +1237914801 +1423688490 +3984082331 +117016612 +3136124587 +2310351184 +3129324031 +160973223 +2353187070 +767960006 +1588169462 +1766362089 +3218043400 +1418340644 +2551476876 +66128220 +2317257890 +993704534 +1492737715 +2784853450 +2459859420 +2328461603 +2102706036 +3649245597 +2402348211 +3682155295 +2295458700 +3025881588 +1909949927 +1319033590 +3420755773 +1415695366 +2718485205 +3608702871 +1028335371 +2291057127 +919506780 +2921093475 +1348921294 +2343034381 +2172476611 +2277919038 +2781273701 +2336544349 +4287705144 +2917781409 +1731213878 +962175077 +894307974 +3116622267 +2427847568 +3301415473 +30228861 +3845698603 +2195013741 +661776576 +1073852026 +1146231248 +4115744993 +1900621451 +3056481671 +2613352492 +3499424861 +3902804933 +1207943013 +3430461847 +1668414954 +2876424888 +1734230265 +1065090708 +3787132009 +578133471 +3081113668 +1423922338 +1389798898 +3432106143 +3844841134 +1134551841 +4107794675 +2159136635 +3222195617 +2358246918 +2701387771 +2685688361 +739111082 +3407863623 +3771265 +2239321506 +3634200663 +3965736710 +198275040 +3648851740 +3302587705 +1328791998 +552081444 +2281328209 +1495272519 +3785967163 +1978020983 +998160666 +1343029029 +3827292709 +3379530088 +3251247096 +1654001643 +1111874979 +2000099960 +742160217 +3568130274 +2151981710 +2815119463 +949022467 +3169587757 +2849093529 +2432364366 +3636057185 +2761649618 +2638590343 +1971245378 +3582241645 +1051718617 +534577303 +3217260853 +2107023268 +4184973165 +2812127557 +3447615407 +1638300162 +3456871426 +1648018069 +1676649724 +3548414667 +15887571 +506496900 +540433054 +1771094249 +2432360732 +1745197884 +2411518896 +178141754 +2992800807 +4287206713 +940062243 +3092947589 +1267703490 +3629523077 +3085937502 +3774595691 +296591818 +2758034688 +3308591662 +2821089249 +3109987237 +190051116 +1619589764 +1098527829 +2120765436 +2654819726 +246978 +3923514121 +1249819720 +970327330 +1098734007 +1131111506 +2471143154 +3744124918 +2770764673 +2264747774 +4186881074 +1046516999 +4105910868 +3000596776 +1481685737 +1592406011 +1941058131 +1686126272 +978738698 +3387587089 +1859089533 +3105358603 +1635374165 +1163485074 +2394100244 +438351633 +1480577904 +26771003 +3176680198 +3106917794 +2214881362 +4293179633 +3639405287 +4221277000 +2846404092 +2436598101 +1882333155 +704354405 +2468495727 +3458546424 +1419421271 +4100990182 +546554495 +787348821 +2038638454 +1978735792 +3231981081 +695592772 +3340218184 +939069214 +395777071 +213179184 +4232575230 +1332481364 +3772152172 +1345245171 +3028286691 +608697557 +3002085135 +2567097407 +3135258979 +3006181280 +1970768982 +98749399 +3751239476 +338059257 +3386285465 +332508811 +1047586683 +1188139074 +659530887 +1312776199 +3176524140 +2460625123 +2074016202 +1298224147 +510822713 +2579280259 +2674074399 +1966630954 +643015160 +2878417716 +3743667779 +154330799 +1067164598 +1543066702 +1025020012 +1810413824 +3130040286 +1497830032 +4156187334 +2444795704 +2796858702 +3725152094 +3090254489 +3516803210 +2061150301 +1343468124 +2152639901 +313599618 +1003486819 +949647123 +1352177694 +3965600393 +3782501224 +3985815098 +3434694885 +1143861943 +3672931512 +2400113980 +1675592691 +121141738 +2675301663 +2627195996 +583227430 +1784561650 +4051561390 +2589824406 +55870382 +3124876183 +2331548665 +643857019 +313397738 +1294282516 +3597523000 +2324428464 +3565490424 +710217650 +2100513511 +2261988670 +3031485981 +1018665383 +485334866 +3385821227 +3487499080 +2703822529 +341520435 +1297606026 +1129501315 +3595268799 +3049191888 +1297848958 +474298971 +977922172 +3209387704 +3399839572 +1382702502 +3022332551 +1256461611 +1893727473 +781572926 +1754652933 +2748873665 +2749529694 +3374267890 +1995334931 +3416921165 +3112496664 +1295119054 +1861552838 +27724376 +1155884049 +292249762 +168155835 +2909827227 +3941456166 +1554502704 +2602804717 +227466952 +693266926 +2003019426 +2386521816 +3313133337 +635510812 +1528250408 +4103873448 +523775680 +2581799586 +1452637469 +3053978650 +3230621763 +2382884403 +2933951078 +2938189953 +167967477 +1151996203 +1736104787 +3456810115 +1657400770 +1473153978 +232533758 +2425161869 +581006521 +4051338430 +3531488666 +1979747072 +1486645581 +2763799692 +1596540297 +541773525 +2427993893 +2927143747 +1386123519 +406463525 +669610230 +682468698 +3586934286 +302905942 +749299920 +1959726268 +3880907778 +1788146945 +1655978815 +3593594266 +2856225862 +1036595650 +4282742686 +1001741471 +1525317271 +3630773031 +4181751948 +3423743381 +3688174540 +343112038 +3830028699 +408629390 +1701124478 +1934091636 +3514287841 +3986419872 +4111033424 +1265587149 +375994169 +1961863266 +2750113868 +138113690 +2442554626 +3942511007 +3554477854 +2451739893 +1699936255 +769283946 +1399563902 +2091249800 +2889342248 +1299744116 +494870369 +3675727721 +465421094 +3879493067 +690725680 +313310136 +3355798516 +3840814248 +348998216 +3506824936 +1066494077 +993135971 +2356151227 +3465335425 +1634012473 +2446857220 +2337716621 +320867994 +1663193266 +4284665802 +981427659 +4012463895 +85297189 +3804853252 +182589443 +3066796121 +2110813320 +2244930896 +58474142 +957980400 +918256301 +2218160676 +352826040 +2732987309 +987271265 +3884169208 +3943454267 +2970706502 +331281276 +2431207622 +720869719 +289083053 +2653960705 +1836869433 +4017907525 +1085483132 +3745055787 +3151331161 +19909961 +3872102763 +1222175090 +2991627024 +1336217670 +2085124409 +3399324374 +238280418 +3800807909 +3919218989 +1753953547 +3903433077 +3874424104 +2037245369 +4236589232 +3376257221 +754080023 +2643018932 +3392400267 +4241654255 +2522558805 +4206004188 +4202747245 +2310013537 +1789545492 +2941075199 +3116760426 +923144783 +3880955302 +4261346750 +1121759550 +3895446973 +1295618178 +2021040752 +2442880603 +592372259 +3573276622 +4026480085 +460678731 +3551691598 +1524513766 +2914767991 +3089210910 +1967817541 +2515250636 +715970624 +1578606023 +1169056287 +3646385597 +119075124 +3511752119 +3816267760 +3978750692 +89334428 +2007588516 +1684945037 +1296196542 +1215462517 +568161910 +2910729304 +46253778 +2162150908 +1844352048 +939136772 +1586310048 +3020382337 +3770047454 +3351828997 +2811504554 +2846009050 +1826169100 +4271796937 +2112809048 +2311345619 +3776481993 +4172904776 +4062146156 +1978666591 +3658535538 +3065710756 +4177970466 +1836392058 +115784868 +3480559137 +3089187394 +4164442784 +165746659 +1796108130 +662112655 +209726260 +702245772 +2083849627 +890319024 +521028830 +595201309 +966495428 +946920459 +1231532397 +4239753756 +2914168466 +1820681229 +2455584744 +271461817 +2664496810 +762711891 +405413028 +3975090005 +698774706 +1995584427 +2800149677 +1562900044 +2060335351 +3855067091 +2162429019 +900411383 +1993636915 +805447644 +2748328152 +3225102712 +3054238153 +1499672579 +712214110 +1629422390 +3351581611 +1995430557 +2307330052 +1928174666 +260472614 +2793430390 +2204623377 +1773415358 +2151668385 +3396154273 +1000689769 +321289413 +4223178086 +2000668884 +3951042857 +1512992423 +2103446028 +3036972083 +508789328 +3445710792 +2074346141 +262894921 +2352478832 +150529303 +3583477469 +56396146 +3578845510 +3585862569 +3920788851 +1003267279 +3799788302 +3621577355 +3539024761 +1645938833 +3010859474 +3369632456 +1378069676 +2779257745 +145773966 +842212428 +4097369434 +2397093145 +3925713511 +1308853442 +4132760629 +2280998187 +2495010835 +1916249306 +911288190 +2417986362 +1300238487 +187647497 +186613779 +2476601804 +2486597274 +3940200741 +3940573353 +1260812946 +135405267 +1470731301 +1681303318 +999575002 +2684705873 +3758126308 +1905452908 +2747047206 +3490686693 +721017585 +1782262957 +1087075378 +3017749671 +2124013166 +4221459306 +582986908 +4028193322 +4131279007 +796805597 +3645650760 +3927515859 +3847951111 +2059115117 +2777276827 +963835892 +3950388007 +521398727 +3092310957 +2024973392 +3254941112 +35321468 +506317772 +3141559281 +1568621657 +2878422966 +4189135019 +590427102 +1970830069 +2136827348 +1587084769 +2887963591 +4285440855 +3096834637 +1134692098 +3328492596 +3513496371 +1356202914 +1273607120 +2793749221 +1788953335 +937153168 +4276919502 +2219910449 +1082903404 +1696691048 +533976402 +92300739 +1972134614 +3067576824 +2354157567 +546157056 +646343210 +3381594062 +3329318319 +1937704037 +4167357641 +1385167645 +2486492281 +1840735628 +2219898787 +3724837172 +1641840777 +1776069814 +865558533 +3164937757 +2366482438 +3384452804 +2395955676 +954209668 +2468305243 +2437982358 +1725417835 +1622614185 +3989661441 +288326191 +2688664815 +3224999009 +1242673526 +1468887215 +2600379629 +209685390 +56331555 +2890356350 +3103144205 +1944177844 +1750438812 +3753807765 +2986851019 +931340579 +908688652 +4186791398 +1286615779 +2860743882 +4007323792 +3313626942 +1633502468 +1638566129 +2051978457 +3747274608 +477948541 +1451538666 +120273857 +4082590865 +3642616366 +932823348 +1928976657 +2126269730 +1390237990 +1788846941 +753580911 +778554961 +1166567616 +967881390 +3491965593 +2773659173 +2065428142 +1111789577 +941746690 +1854713994 +2153104252 +2303998412 +1586920199 +3831789184 +1997956014 +3455676424 +2397748762 +2909425976 +2360056512 +318850438 +3200664032 +4288540767 +2939241483 +1062845223 +1591839010 +2978313010 +1805690333 +1342490403 +2939269526 +1383764191 +202563267 +686371367 +1514791305 +3664961400 +3590274643 +1359228107 +2701293109 +3039430766 +2174842435 +848516529 +3614816729 +1568548133 +1049490337 +3013960489 +1376799884 +2705980012 +2430764881 +280677256 +2594561616 +295124377 +1299242197 +2421816075 +1372230388 +2732351895 +2359477065 +1784094728 +1532447075 +805830529 +2860146063 +462383124 +1727902500 +367754814 +1812479153 +2605717927 +1154080398 +2649680479 +715761450 +1005101536 +3545548035 +316462373 +3176424140 +3413784541 +2873932425 +2378861382 +3879267386 +416613051 +3000767292 +1586923274 +1971025192 +336187889 +2184541455 +2671319377 +180651452 +1549476632 +4188045380 +3072652450 +221511738 +1223775904 +3457251129 +773338514 +2913655035 +153867724 +3043271494 +4040262838 +1545082716 +1266044487 +1903368089 +2294797650 +2295775307 +252389711 +581858701 +1485783437 +1405673320 +2423199886 +3317755591 +2838837550 +1455417616 +368733366 +2741340428 +616205695 +1811888441 +3363081153 +1181610125 +1466293175 +943650712 +1725333062 +1045239279 +3758737107 +1753129216 +3265420362 +2967668603 +2210219433 +3916312348 +1662222486 +221190021 +2641300455 +241557423 +657614080 +1512901876 +3440778801 +2670541217 +2603402716 +2521567404 +3044897441 +3319211635 +705087435 +1893390955 +3185083418 +1847323496 +2457683785 +4205848849 +1465952838 +581401821 +3386845975 +2550870208 +3288835262 +2371652602 +2434526443 +2081885780 +1763483354 +4195658694 +1189698491 +953300820 +492554715 +3051699790 +734943384 +1329055868 +1000424627 +4186910474 +2366620154 +580527392 +1176151238 +2666524408 +3834363303 +3081617238 +173464291 +3676512528 +3223235756 +2384853048 +2525776296 +1447165293 +3260664691 +1224122382 +2889236562 +3479658823 +4133362040 +1018828330 +272441009 +865627714 +1124380850 +310878174 +1221392188 +3895428115 +3667311794 +299156779 +1775038064 +822956154 +2747109514 +2984782386 +1487324561 +3023024499 +3558717572 +3161569614 +3947726543 +2466302280 +2886904454 +1145178297 +2417104086 +201580665 +2721800789 +3611676028 +1349984430 +1366480804 +788889405 +3301028265 +1866971560 +2625390952 +2577244987 +4292748189 +2786483428 +66536178 +3238228104 +3387621031 +3084248413 +267506487 +1127981523 +1676957958 +987469142 +1148611598 +1420777876 +2532808136 +3039013797 +21866755 +123543465 +934254436 +237137712 +4135244770 +3570714476 +2075412018 +917478715 +449840110 +1391121173 +590854100 +1661935305 +3645574076 +4249083012 +3814074390 +3201618299 +1078243530 +2090291211 +4026121094 +2234057990 +2959243967 +2011152115 +2561411241 +2050165562 +1524975256 +4003788583 +1889048661 +978784313 +1325472826 +2091933326 +4160697079 +3641833389 +913585275 +1248691660 +3563541078 +3987620558 +79629944 +2585012954 +2410992674 +3107077719 +3542430390 +471500910 +541629633 +65047102 +1965436349 +2975872608 +2321026301 +978478607 +397347610 +3800839386 +3930477833 +2407964548 +83800338 +1792863551 +985659640 +2203367032 +915571783 +414371020 +3314429378 +2653408364 +3225065677 +3386461545 +1648957211 +267523499 +3256744278 +3498328878 +619816412 +2214736623 +60825966 +727637693 +2514765272 +1424655341 +219426170 +2114099980 +3225245596 +539986567 +963469222 +715528404 +1233610363 +3483025708 +1432613904 +805447408 +1201523148 +537540788 +1199387548 +2917114774 +1291419315 +212617410 +4164187189 +2917126258 +2397685948 +4160052742 +1255510988 +2458599286 +1724849843 +3226979625 +83449416 +1970264261 +1881785573 +341940152 +116688973 +299045903 +1058822810 +592526609 +544190533 +1443968521 +4119147991 +1562638248 +2761416469 +2763794911 +3492863307 +2422047870 +2092792603 +2472304863 +3620395128 +634447923 +780442802 +3256013583 +428399119 +3307536704 +1061829157 +1309419662 +2020284855 +535663139 +2177711778 +494874158 +231506897 +4026060145 +2794758460 +2375390177 +1623995652 +720546573 +2863462683 +3631397093 +3482745872 +3649690445 +3403720004 +3941643629 +2274402157 +2842104085 +739402688 +4167048542 +3404761552 +2184319848 +3194418145 +1967807030 +3340365111 +3417668611 +780910163 +1628228542 +315783305 +185965992 +3119222615 +3977175074 +2839796857 +2006983265 +651304224 +868543729 +1290981125 +1267917795 +2016024481 +3839524166 +3455980445 +3002080714 +2049447989 +3439833242 +1373048950 +3721170991 +1876047209 +1519637142 +2239384146 +1434273792 +3723802809 +195417165 +1606009848 +4033832319 +1155005480 +3676256516 +3755063945 +1762896795 +1432837057 +1350479526 +2045734009 +2370951696 +3333756578 +394258907 +3953965677 +493506457 +3270789547 +394147501 +1225754200 +1377725116 +1140943930 +3161684965 +893253933 +3525540336 +486297664 +4003895037 +4125275277 +3026140700 +4133983127 +1707519464 +666790568 +810822060 +1794462388 +3310667548 +1434535757 +3030144053 +887779679 +4181207650 +2181106247 +963757647 +3298751974 +3463450578 +2170716888 +4053535507 +1870188981 +1357542944 +3374235514 +1654366829 +428440503 +1447600490 +3044822789 +4266750834 +1374671757 +993820876 +3057004336 +1304401544 +1735111536 +1795641151 +1604143677 +712742075 +976519346 +544124115 +1642619518 +3585627724 +2131908511 +1479820032 +1144236279 +3537333734 +3637400155 +3486576293 +1562389568 +971817709 +156856042 +2198749377 +2485500312 +1355654915 +2178553021 +946848959 +1829741128 +786898183 +1299937908 +418121595 +3868848225 +672716276 +3113760323 +1072758188 +4013867393 +2964095418 +2595057796 +3386997009 +696554831 +2283805842 +305153744 +4230461993 +2944551685 +1647253651 +737793411 +3516002678 +695335097 +2092110324 +165450304 +2580817274 +3353542488 +201549240 +2675986620 +2662289993 +2914010845 +1148984103 +905704589 +2192478219 +1748752784 +2710018445 +2433031728 +3611275336 +3846434225 +321118702 +3383896992 +1869512417 +1547885975 +2451317753 +1442889465 +3255283700 +316981493 +1851138873 +406933394 +4229310576 +2567961007 +2653992802 +4262652605 +4121769783 +4116051412 +3475649020 +2942982675 +2323053863 +344167984 +3254137746 +216768897 +3235992240 +2535572823 +3169861362 +1609727968 +3722333058 +842224434 +2822202475 +1546312434 +2905972198 +3535401840 +682168652 +891063913 +1401389885 +393354906 +111152095 +948159722 +3230168239 +1568191632 +3028922663 +3173849307 +2379424301 +3948180148 +3676742006 +1750133712 +691020739 +1564769729 +3782796065 +4001034673 +1552617787 +4121630660 +1954126193 +493346844 +2888293401 +116630511 +3900714155 +3665381637 +2395107655 +3379116277 +2317994435 +111145174 +3263769304 +3287362884 +1604446112 +1500997568 +1060386785 +3378639309 +2588588375 +46957830 +2686799220 +497953800 +356830530 +1212776626 +1183457136 +1908737580 +954915418 +3095718497 +47004102 +1576891016 +419586251 +2925844112 +3327921312 +4085349316 +2630208833 +465728136 +3206880174 +3851615533 +3062837093 +169181706 +2276311991 +13504686 +2303250199 +2137453019 +4235676741 +2655556179 +2745391868 +3712220891 +1793805156 +4107044298 +291055041 +4290296955 +3476016253 +1724276288 +718724953 +1757692860 +61524128 +927202241 +4164255000 +2808175533 +1537602776 +3085893649 +3844880514 +1229788421 +1890631308 +2014833974 +668222161 +2333047386 +4178811435 +913942927 +1225721808 +2138374621 +18545003 +2086472511 +56677720 +3173604780 +3478262310 +927094537 +3710308804 +39838975 +51185361 +1226733347 +4203830257 +3455279495 +724624355 +1705423635 +2072641065 +3776924128 +43773655 +1032421302 +3794668452 +2596582691 +528319192 +752168124 +3959425776 +2554838474 +2366309554 +2644011563 +2874564494 +645610420 +34481100 +715131488 +3049716217 +2128083926 +24365911 +2820432777 +3715138962 +3556852622 +2729839752 +1216990495 +360405522 +1838397653 +2300904607 +483970118 +2431485045 +4139879639 +2984834143 +3382478768 +3836319973 +3875355645 +207273908 +2554571400 +2761542604 +1479132355 +3638000646 +3304296886 +4198053964 +789582980 +3927716548 +3345758960 +1920899884 +3420816591 +2494641576 +1987380725 +3077768935 +3143077030 +1841624765 +521021769 +3144746145 +1457279683 +1820951065 +311407702 +2643930139 +788244055 +407730218 +3539106409 +758241907 +3758065113 +2369764536 +600218184 +4069568678 +2871708934 +714724118 +1725110798 +1325148720 +744191074 +4027475853 +2297386833 +2844870761 +2358265791 +1968024720 +2424974271 +2848994148 +1409202941 +1397741907 +2964863705 +2936900629 +2883319931 +2077355469 +2862954848 +596061372 +1378767202 +4199048187 +214087216 +2440915626 +3744031694 +4276915538 +1636390189 +777054487 +3862367987 +4187524018 +1342961344 +1909084600 +531132411 +3337876299 +1068563354 +342091616 +3046916747 +1957092962 +1387932720 +4216214634 +3967770018 +3034820007 +2026152254 +3293921174 +1704704769 +430033785 +3824344596 +1221300146 +1769792407 +1839542314 +271671157 +3333970931 +3074765006 +493685176 +43489837 +1154353226 +3093779346 +1832167255 +4126248650 +1080786638 +2111053026 +3129483347 +3970071115 +1988546193 +3932935511 +165035513 +4094915850 +3127700934 +754643289 +91218104 +2028755178 +391637668 +1045346757 +1828377967 +4292792591 +2720441849 +900673736 +2663468742 +1650713634 +2955756940 +414072213 +1874681023 +3350756846 +1934999778 +4028735966 +3888749662 +2397830471 +133164764 +2681954168 +2560448153 +956182287 +1170432921 +285793306 +3411652221 +854532235 +930133847 +974776356 +1614509366 +2534313020 +1245360935 +3045670465 +1590104116 +2040458468 +3461515372 +2305618976 +3721517683 +3453537417 +3202508660 +1103879484 +966430378 +2896105585 +1573802487 +875128728 +2462334517 +1671143492 +1690354256 +4233417697 +2719931661 +2908578150 +2761286857 +3412323647 +799042317 +1077983139 +3535172883 +1381792530 +3035300665 +375812699 +137829560 +1520653314 +2617206536 +500687577 +233253400 +2115312455 +2178091830 +2258468506 +3091619081 +473182363 +973342305 +1922349047 +1189791070 +3687378520 +704681338 +615190339 +3485404923 +1543893682 +905321551 +3328303704 +1146287017 +57585268 +4032867524 +2296583913 +1521369130 +2485948936 +788309949 +1524556528 +1756065591 +3400444286 +2458835472 +4115490031 +2453694880 +1044524572 +3136870452 +1831054085 +1761243583 +1100018503 +1242744123 +3060041826 +2442059542 +3879490982 +3127736409 +4087817983 +1969885630 +2202585051 +2443360325 +4012143484 +3686624021 +3191665117 +2777969487 +3006124564 +3817247749 +1343037576 +1589909018 +3317052210 +4216026570 +2279604011 +2395198335 +1473513983 +4013033683 +3612463563 +3101860992 +1896652554 +3542058047 +3187065654 +2337057831 +3762553790 +3600362827 +255256701 +1880698014 +1109858134 +4059986936 +2120900768 +2249809240 +477446034 +4062231818 +2619760367 +2190299420 +1214534690 +4264101966 +1010598741 +3926904266 +2632325640 +1297258878 +396533433 +502475482 +1955087709 +608038903 +302250769 +4241951555 +453970485 +3383275166 +3916704827 +154173478 +2186490170 +1305088061 +2454466329 +846259246 +2710582609 +1392409147 +1934272670 +298228669 +1771378027 +3257010410 +242756793 +887963631 +2684352241 +2040678510 +3328048641 +1675661218 +2897032583 +398894277 +2433845950 +2084910848 +2090068278 +3554665601 +2344775458 +1159449926 +480394718 +3914335982 +350681752 +1097701943 +3233846212 +4153176188 +3624006782 +2648220060 +2834277833 +448237702 +944677453 +2996184962 +628786376 +2789103809 +2449217128 +2237110157 +426189653 +2322770714 +3139110538 +1646695018 +1176553610 +1637228954 +2052241178 +1298990615 +2889739220 +3662835397 +2888718036 +2400065603 +2778346208 +3993568339 +805634816 +3589985611 +1651829149 +576414382 +1909418659 +1209864963 +3795143797 +1544294726 +1948491924 +2671193399 +1944915747 +3041766102 +1465439116 +2805932780 +99233534 +1994158424 +477757599 +2447790807 +2798343713 +2808357242 +3373152170 +3433095222 +3158991835 +1292697541 +1607906905 +125365224 +2134860655 +3341726242 +2847396062 +3086373197 +1881470706 +3666941986 +2859263939 +2988651499 +3657671653 +3209569262 +1764582924 +2581864776 +3335018538 +2821576448 +430483654 +3791633348 +2269310105 +2648686373 +2958989427 +602392143 +3604923975 +2560831308 +1409904413 +4119279179 +1323420662 +3893528095 +455051679 +913777866 +491405315 +1474639373 +1903926357 +3010971237 +2292668572 +3913789931 +2510375851 +3637339149 +295367435 +2119722801 +3689670178 +3318786605 +2225554087 +3008624146 +3372338145 +3565019714 +1185785474 +2009296216 +386680562 +241289367 +2939506559 +4231770674 +350646325 +2938834844 +3322450092 +745707613 +2442986897 +1497593893 +3347633915 +4130232680 +915714959 +3091965248 +3562526686 +1508921500 +1964652476 +3481452432 +2822723721 +2994361722 +2259745296 +725970338 +1963638225 +2408644417 +2076341922 +266594737 +3383333703 +1093080454 +3868806645 +3418147659 +862563732 +2460618834 +867190598 +2676652419 +3559902341 +3561234344 +1322657079 +1442613017 +1653600648 +3773396641 +1155237490 +3302883240 +3369912023 +2709614593 +3049756757 +2887471390 +4132816779 +824753075 +2627391054 +3959235328 +1589882119 +199393051 +2569424323 +2458634040 +2650325828 +2920618636 +3827881610 +2671629418 +2855235215 +2867044603 +3521406345 +1644250885 +2081089099 +3391614983 +240384790 +2150338416 +194027314 +4230012007 +2311749180 +3185227654 +1226275737 +771742938 +1004159614 +3072585858 +780537482 +3253498415 +1049483199 +532977781 +1361906193 +3430629322 +2446308796 +2706685532 +209419229 +1273758195 +4221886421 +1448086639 +3409828426 +1606482356 +367353667 +2381716215 +2618610813 +2581716653 +4181580490 +1462192270 +78377319 +1410356039 +4144114606 +1703190636 +4080416635 +1381081349 +557796618 +4014325449 +3731924165 +194251592 +2022290273 +1772865488 +3607987651 +1389606068 +879167099 +3128636377 +1916126337 +322942756 +1780572895 +1715311199 +566951612 +304957134 +3290929777 +2971101298 +1161842535 +2045821505 +3126575489 +3324009518 +4006790922 +23547608 +3480028477 +3585189296 +828946981 +4130192583 +2469717505 +264090637 +3888212389 +41149684 +426454726 +2194134620 +1548289612 +2720971803 +2221099261 +3883061692 +1067416616 +3074498624 +3803079642 +3120362101 +3871354644 +3655525406 +1866212839 +163698501 +2990454757 +883039372 +716879447 +2900485030 +2258802158 +3553066543 +2588736222 +2977405173 +2140287996 +2760382652 +415910147 +1235395251 +672020600 +2221372150 +1937967914 +2508452354 +2070588884 +2658905342 +3368194637 +935349134 +2638287405 +3606829448 +1040176563 +3094638665 +2724263380 +2258703737 +193300983 +4183280702 +2820671951 +2629148039 +3448452845 +520864427 +3619196547 +4242232984 +1253391297 +2776638197 +1851164046 +1006981597 +2091588223 +4253060050 +341600402 +3235989341 +3357333793 +1876987818 +2989378793 +922232684 +575223811 +649093919 +1146545778 +3337106843 +1773630208 +2570808000 +3339152516 +3015628619 +2512325581 +1648879982 +2803613867 +3332727938 +4268006876 +2769801564 +2105589239 +4156544485 +3172792127 +145332953 +2445597071 +3043392684 +1910096019 +521573541 +1761142851 +3274712491 +797912196 +2832595414 +1870638679 +556178061 +608783966 +1274083599 +4199141325 +4033172971 +1587569319 +2765309825 +426791948 +3712680890 +3416125664 +861110155 +3315811599 +2918055638 +3064158868 +2900312977 +662532234 +3622635966 +2858660181 +2225422611 +2469967837 +3198578190 +550061039 +1322492289 +4136283255 +3600318110 +2130764451 +3331260327 +3978946600 +1795783490 +1302804799 +2279762165 +2836566162 +1362707233 +520227625 +4245401344 +2396891383 +420436942 +166148034 +2902243069 +1064649755 +3167441064 +1523613421 +1747826260 +994033610 +2566920976 +101073219 +2351216053 +1206890810 +2720260328 +227846525 +3001068185 +2755709360 +3124255652 +743238558 +167661624 +4053305708 +1716280487 +1096551334 +79572336 +937042513 +2703120993 +944122331 +2179664715 +2915533149 +449038812 +1975917603 +2918104066 +2748650013 +3449687955 +1564071101 +305293752 +28218968 +4227854973 +213852825 +2919225261 +1966768600 +864008127 +4164176070 +3478809410 +2729722268 +4005245098 +415458751 +1796998050 +2466081272 +1617104916 +943690219 +749953056 +919881098 +3991848495 +1492814730 +948451668 +2240076707 +3113040976 +3986458142 +1553654987 +3504603464 +204348441 +3955739748 +960603506 +380475252 +1862255103 +2270494463 +2160756490 +2023471275 +2542736425 +3964631463 +3057965149 +2177574929 +3041246136 +1402567227 +2688115230 +414114020 +1860908060 +2367704200 +3815802103 +3796799746 +2851902748 +3578580002 +3089176901 +1776117779 +3285559066 +2564799642 +1459386960 +4070746604 +1060915829 +2731157699 +254342277 +2984253072 +2549566244 +2913681443 +2251963062 +348922051 +3505527216 +3971268082 +610427939 +3085821605 +3814924039 +3637529039 +3505281366 +2219932487 +61583391 +1127949064 +811157462 +2360758297 +3236856994 +1395353413 +3431935677 +528466359 +4274428815 +1920979816 +4139489090 +1811248004 +1412382108 +4248114889 +1674581851 +2449603742 +3820092481 +3001866523 +1083691015 +2314004779 +2477460767 +4028398652 +939093398 +3858182369 +361186303 +965570718 +156566230 +16072372 +514642212 +4175348589 +3969831593 +3509974576 +2730160027 +1966078775 +273003133 +3324564133 +3920792770 +3434694087 +1842210188 +2739171582 +1450728280 +3642044294 +3129821231 +1947138898 +256121653 +3391152606 +1972331771 +4227861832 +4273823852 +3583188915 +1321677333 +488264458 +1278666267 +4158571287 +322713384 +2867007107 +821445212 +3201214497 +3854820688 +2044579688 +1448571803 +3422213918 +3631201114 +1788377668 +2157054963 +3022055618 +4093499815 +237507667 +1753888255 +2552004063 +342277576 +3316410977 +3991999900 +2323630699 +2186241499 +3718369223 +4174342285 +4206070716 +4063501409 +1424504873 +2994314989 +935227960 +3348359562 +3123367727 +613567378 +3327868069 +2157378021 +283085153 +2434673086 +659607061 +3962465085 +2252616531 +2999396217 +1498078492 +1950837407 +1289217490 +3317342927 +2739781215 +3942373526 +1736007819 +3356087161 +2556280858 +2691354153 +2230514055 +3661623910 +1399677155 +2478885417 +100149849 +4057722094 +2643375975 +1557284217 +3089871803 +2477987978 +2927757645 +2099083336 +2467654312 +4107590645 +2639255217 +942087365 +610445752 +3518381214 +1658802703 +2306698560 +4189427907 +1425006681 +3521226094 +130806281 +875823408 +4062612161 +2399223550 +2116884277 +3309502083 +113356921 +1595668569 +408108957 +2258836436 +2392684384 +34461116 +1496716071 +1389054451 +2634387004 +2721109675 +2842149315 +3046560709 +2349353242 +4216121183 +300578630 +68415638 +1153374424 +4278644901 +2373413311 +2790738491 +3283006269 +995971856 +195218401 +2204291536 +1780221544 +3900498955 +3612423403 +1035342221 +3756282911 +4100234825 +3025525030 +3230607768 +1348538637 +687698350 +2162168659 +3634061318 +2657981704 +1724504725 +2917631382 +3101405768 +1089583990 +3456568978 +3787444802 +2592218597 +300332676 +1485029442 +1842685764 +3847862838 +2313047471 +3009994666 +3218343258 +3639154555 +3162708799 +3137268647 +4188093721 +498863429 +4057052673 +3138678125 +2503941131 +1900657851 +2009577736 +912616890 +2922076398 +209660405 +1219263107 +2686793420 +416976080 +3682791591 +3582572244 +1221775467 +1580641764 +2321071982 +382744247 +482251436 +2417903977 +931857668 +3827258404 +3271951627 +1322588837 +3394989648 +3022665407 +565126345 +4274436927 +39419348 +3723892486 +2617294792 +2810774238 +2714182928 +1915009593 +3282720321 +604476521 +2013875689 +1226832400 +1777044723 +130748788 +3457355696 +3637351051 +725965626 +2190511677 +1938652464 +822169708 +3896001412 +27324288 +2006470285 +2934965965 +3738542364 +169960099 +3887811704 +3718133288 +97281354 +2556611161 +1437657056 +3784740318 +2723142206 +523845433 +1352023218 +126510500 +4023021701 +4107629440 +903527351 +2567322932 +3028012241 +3019454507 +2019186947 +3932903042 +1804816292 +2477222302 +1183540642 +3479100705 +2898288118 +2456718180 +3067592778 +3590217186 +1305203721 +2453291305 +2212761360 +1437586978 +528699712 +2231445489 +3797908862 +2262765318 +1560311861 +1475842071 +1861664394 +1502546540 +3065171442 +3575517519 +530267050 +3100967658 +2984770336 +3210136867 +1491009703 +4185926722 +1968217793 +2472245823 +2708445819 +1955022785 +4132486077 +1701261557 +3021423197 +1364397552 +600711574 +3073394865 +3876460024 +3215984532 +3118027849 +4120544621 +1759103464 +2739068322 +3607600064 +1818466747 +1663926496 +3548105966 +3858192843 +374205964 +2751864792 +169698063 +2112552760 +513032893 +2263936991 +2587322037 +1270608916 +3738966050 +3590118352 +1648582122 +155095900 +4029656442 +1014689453 +1968665714 +3030530566 +91946418 +1483794371 +50015814 +1371004028 +1750411830 +702663485 +4188823359 +3640532779 +447081097 +4246426238 +638489610 +2170575561 +1745977362 +2254227327 +1866071936 +3989099727 +1837832348 +3720286711 +3702575413 +2835436175 +2103053844 +1586961328 +2395978944 +773026682 +1317077626 +3012420101 +590433596 +101882072 +3360055889 +2650621261 +3418200980 +2318412689 +1425820903 +3317478440 +3881524913 +1081629055 +2116381999 +146705901 +4215372998 +27111503 +1753721428 +976330324 +3344974937 +1923266989 +4096344428 +2841065153 +3025936046 +4023596610 +89843564 +3519381492 +885491753 +939271935 +3724960500 +518316068 +914013708 +2140362179 +2571154513 +1600623147 +2228387089 +4139972954 +1752952055 +4093440751 +1191610587 +4228829454 +2312623439 +1853016775 +4210126769 +4265303143 +1934083671 +3211197888 +4243480578 +2872736678 +1008916319 +4253980182 +3106638942 +3516071896 +3316486108 +3039153114 +1505213437 +1450685864 +3158022360 +660175938 +529114811 +4257414030 +2466013456 +2722204791 +59988526 +2056583443 +21606849 +1318832433 +1558880432 +2214836288 +3088192525 +2968295946 +1270812357 +4116358624 +301316172 +3043183533 +1126248082 +1118463532 +1707378403 +280718061 +4109139168 +3439044607 +1156640123 +1065054440 +2947151120 +1505627652 +2469375434 +380478326 +2855851602 +1924285235 +2959428084 +3117473806 +3937950931 +55647056 +3230485281 +1693644847 +3343015890 +3500190997 +3605437129 +827544210 +1883545513 +3869927407 +135826857 +1439077582 +1626184669 +4237935464 +3633909634 +2228655328 +3808509477 +735561311 +3487213692 +3200228336 +69002036 +1698154473 +531376609 +985381331 +3233052590 +2076269171 +928900665 +2496112276 +1883015873 +1790898736 +2871952620 +4245368169 +1881120666 +3498052522 +43000972 +2077333920 +3055882107 +614506437 +861066026 +921374520 +2464580987 +2245811135 +1170696678 +2104731192 +1406747173 +3176338306 +2940104283 +1543051559 +561911286 +1518859608 +329729098 +812511035 +4021427499 +1951782331 +1790819991 +1140659635 +882303911 +3951179167 +2478730977 +1453397537 +1718412686 +2104243556 +2479726666 +697840698 +802945771 +3508291857 +726073282 +2363877770 +3785955491 +3112568224 +1994449710 +2541892657 +385685095 +822992998 +1757856538 +3192266199 +1938124076 +2736188736 +4174124082 +2102245221 +1695781724 +3444953109 +1551714162 +1806461156 +2305646252 +1509389670 +931748261 +3899474203 +2997675719 +2666045623 +64989500 +313051185 +1302891095 +877913297 +950871004 +3044282921 +3420197625 +581716642 +2225743291 +1550352658 +4292095390 +1914621388 +3966418747 +1870377310 +1962958294 +3996096387 +3768924279 +3851150918 +529222609 +1871494280 +3664734209 +3932270987 +2098733306 +1550902454 +1877266196 +3819832126 +1601192770 +3472206901 +1050145547 +2064359309 +2649601346 +649060861 +2709549407 +3833311722 +706694217 +2949627909 +78378394 +4081087711 +1919585090 +1629448444 +2015677911 +2303494324 +3310830238 +2000119127 +1461502271 +4126398859 +1127843031 +227290516 +1571112597 +31367969 +3785792353 +1279034706 +3649649243 +2939965141 +1769223880 +2700155419 +1072802118 +3995388640 +4088202186 +1504768385 +2281662478 +3597795823 +3999250164 +161498941 +3277074606 +3487661258 +1239019291 +4212693787 +3417971895 +3854315647 +1240933840 +172110979 +1789457317 +2110850800 +3918205336 +1297925651 +746872822 +624296503 +283749409 +153245321 +950375397 +1988873532 +3009648037 +1850772247 +1012632253 +1627183416 +3335677112 +364504619 +8715768 +1083014691 +3728255950 +3728637535 +2241756458 +3828466436 +42154020 +1310584352 +2578476624 +146743580 +2953257033 +4030562837 +1193472450 +3349865770 +3115632601 +2318646783 +433922672 +2492503904 +3390097094 +1037855873 +125009263 +669817874 +1646018268 +1557668664 +3744457107 +2740192843 +175698794 +4229201011 +1544910068 +436690935 +79635956 +2141369327 +2195013802 +2447420407 +995265448 +1816491653 +486688420 +3909307623 +4254275972 +1069329876 +2872685795 +1204501975 +3673180247 +1723733399 +1229354770 +73730624 +1103078124 +3701429178 +2716619878 +3964540039 +1893020563 +1418793680 +632666747 +1335210828 +3578765307 +1343389869 +3585767610 +1528711282 +3084990411 +2909052475 +4256468544 +4154368684 +1594522461 +682801902 +1148983878 +913500231 +1310522308 +590027262 +1372930199 +1880133970 +3571223656 +694860425 +2705388667 +4215177814 +3952271515 +3370727417 +1546226971 +3115452334 +2011967887 +1132781055 +4199822169 +4076702207 +1932831405 +1472301578 +1426222791 +1558808388 +2829737347 +3211234554 +1052300817 +376767355 +1707569422 +635735597 +3747651585 +49932683 +597150630 +763507384 +1905957366 +4180054883 +3620811755 +2155331298 +2932562732 +1260337022 +1153446563 +2737575033 +3067853187 +73093936 +1981277586 +665583407 +2999374832 +137282340 +4077390913 +1662813058 +1451726432 +3902629111 +800220882 +4164818775 +1985125694 +3871007014 +2685687143 +4096461821 +3219312632 +802123956 +607880721 +3961578368 +3229486047 +1532785864 +1819982092 +766128302 +377627297 +919642724 +1054012885 +2894373806 +699403551 +365007550 +759567801 +857223238 +799217712 +2762796365 +431193182 +2586458550 +3480468131 +1402415164 +3708039194 +1760870780 +3590241895 +2605379320 +818636494 +2168179521 +109496798 +1116135619 +1397320771 +1866534754 +442220633 +4290513023 +619868605 +2221769982 +3295151450 +3219402669 +300017886 +1721671859 +4098721640 +2722040504 +4172060837 +1099173982 +344528135 +2126884912 +889972789 +474306649 +2055081114 +3010859119 +1591003764 +931682371 +3022561497 +2621548786 +1560532391 +65961054 +2928370749 +3063923468 +91833393 +4108038645 +67718876 +2230977232 +1173339795 +2228370337 +478712560 +1686611119 +3799648255 +738549582 +726606313 +1028981539 +1049688723 +648064610 +1066410607 +522597701 +3395855754 +3369865264 +1399523898 +1252203122 +3581837400 +3571415986 +668654125 +2394260646 +31795819 +4055449139 +3840830148 +2246693556 +212701634 +98611144 +1792795473 +662400024 +1600979078 +2986285024 +2053561677 +809314546 +4140713869 +4062240291 +3350696174 +2868079121 +1514666231 +3541095266 +2063631236 +408779634 +256921381 +2343922686 +3250594092 +1823387729 +3559194080 +3926249317 +2230382284 +495654478 +2587191022 +2831031924 +3308708270 +438575360 +2999211784 +2655463968 +3290307457 +1388499270 +3794149195 +2832146248 +2189312019 +577355879 +1795570141 +691306903 +2489193166 +1536594618 +538026663 +1747901415 +1017075004 +3063089220 +2953964296 +3377082993 +746721434 +17515623 +1544833468 +1387241868 +2850010942 +310922873 +2624178988 +481576286 +2073255135 +111957851 +2203666183 +4119031475 +1159731006 +630010466 +4265190011 +2415519341 +1804403320 +813738522 +1094529297 +1700414254 +108267470 +2265654391 +2921778776 +3621934838 +3454601624 +1129963961 +2509127125 +4243003972 +1976183734 +3241100736 +2265415372 +895839260 +3686507516 +599665980 +2708435183 +1262329018 +3168922635 +2181020868 +906092087 +3417426977 +530936512 +2431623164 +1032443868 +4209968993 +3912578131 +4042850907 +3349119717 +2946556199 +484310501 +4090099759 +4056668333 +3380009083 +605552971 +720742699 +3835597314 +3544777556 +56335484 +1125741192 +105627699 +977894632 +79669827 +1863917593 +3234662581 +2970073256 +2727652374 +4022938432 +3016152061 +1290212139 +4016656854 +359607268 +3781257440 +274366652 +2648009196 +2871455956 +509559521 +987951461 +2579442859 +2288440880 +832107914 +3384959202 +967266121 +1840784329 +1836773481 +4101044422 +1260357761 +90332144 +99745780 +1960256227 +28298272 +1309813158 +3473998243 +1499238660 +3596286303 +263939901 +3980301503 +1199554372 +2312766486 +3880315489 +3749383075 +3439635827 +580197864 +3144886761 +2684621224 +30866397 +1085747523 +762529140 +2718651176 +2655542724 +1648415129 +2057388062 +1594981730 +2034303905 +405084826 +2924031800 +3408350496 +2186637715 +1602604763 +2298177153 +2478159356 +101653541 +2162414439 +2695825839 +1535500082 +2202199487 +2345798104 +2865741749 +4005179782 +1663105159 +3401311805 +1739102011 +688663574 +164109764 +3908800307 +880441387 +2927035140 +1506056766 +4264679446 +2645116658 +1939962107 +2522874423 +3936924948 +91307813 +963264671 +3569286604 +2987168553 +1580588558 +1247696664 +3225907058 +1744691860 +2803059460 +754723718 +1719156628 +2112960832 +2492507286 +3250863360 +2639061991 +4071939018 +647477682 +2795697710 +3089008972 +695085103 +1774578828 +1385059028 +931334476 +3084134709 +1156288708 +657037922 +170271112 +2984647805 +3590179598 +529627738 +4260527585 +4067555330 +3305168038 +2566730491 +3183514807 +3889563487 +2416429877 +2161611873 +306404069 +1640241466 +3323561640 +2118854951 +2709314651 +1642338857 +3523758946 +2105880756 +33034646 +613513269 +1493671157 +454264050 +681390805 +33507328 +1520039318 +1234084791 +1511315045 +1803328690 +1776867057 +2857218524 +895327643 +2074419093 +3735106634 +1565060392 +391643964 +3936194069 +2005938118 +2354741680 +976182560 +825330073 +3959975809 +2314819144 +4137565164 +1910436158 +969370743 +2014967376 +1645000112 +3888805179 +294005191 +1184298924 +3888290935 +168027184 +50964012 +1732893250 +4027097650 +1212562695 +542795767 +3638104881 +2549366201 +1111311585 +1264154145 +2664062554 +3353996758 +2114870288 +3435733128 +349485568 +1537149672 +3842368871 +313114088 +1572577063 +5291130 +3698338794 +2405830549 +3131710145 +4130902865 +2761793544 +663558390 +3338229926 +3319282614 +2423876126 +767598090 +2104656873 +3452044240 +544583050 +3431834550 +4158354405 +1514334309 +1353527505 +3312751951 +1702431131 +2784600610 +1838863025 +2473699025 +3209012037 +1166675824 +2372724630 +395365971 +2919687903 +1293710668 +3388865141 +884416630 +3996490217 +920811433 +3111194558 +846333995 +3469011291 +3327070489 +2043497250 +1659128644 +1790037228 +1280700568 +2334236224 +1323230183 +3371713427 +3315330504 +3031137717 +1545103462 +785629299 +222476771 +1875868635 +4133536890 +2327935079 +3221529403 +84496317 +1558000683 +3677787012 +834603785 +1959315637 +1381440132 +980924100 +1754788273 +1563324505 +127922162 +4053930520 +1843555783 +2777021907 +3002949498 +2030881202 +2861847373 +130187547 +2525038609 +3149047741 +3418998882 +4167593564 +2716902685 +1546992594 +3371219561 +2496292025 +496136622 +3058273008 +3000232945 +3998960266 +3185249011 +2548411116 +1531111034 +403063694 +3705390508 +3951700179 +166566760 +2722891409 +3941974885 +4273082685 +1140665353 +2513389486 +3140459375 +4101471583 +1125207649 +269428983 +460684516 +58689215 +18327746 +3000088909 +1130347724 +2673287699 +534260058 +1564089278 +4230039761 +186897632 +2106092948 +240703227 +190769760 +3282095931 +510608494 +1484206910 +2283809632 +2777426410 +1459591246 +2673668510 +4116460820 +1898625408 +69723741 +2946810325 +857226740 +101816466 +2987454394 +4093775635 +1477700456 +946927562 +3259961643 +3341973084 +422720432 +3699623126 +2996407533 +4175478978 +2326966189 +3727652773 +3293307896 +3132447366 +4256181592 +889279170 +276830523 +4116460515 +2837619843 +1371866027 +3264717218 +2679829775 +39149866 +2670228144 +1661198783 +949608241 +2654725055 +968379172 +1234951711 +2495902639 +1349920870 +1351068454 +1247013721 +1094230145 +669250671 +3497318784 +326040556 +3738896309 +4112629563 +176808017 +2318822132 +3962254685 +1726025093 +3856354565 +1794799794 +1038266738 +290804436 +3255362226 +1667360001 +213830467 +2334724247 +1601808546 +618850781 +3137050714 +72099894 +2152657012 +2278194235 +1552748426 +4001307135 +2889045117 +3542493628 +2511722980 +1827835277 +2723084569 +3989397647 +2706972133 +3677789969 +4208474485 +1982449440 +802995353 +2024095931 +3478010858 +3634273697 +662873953 +1798711011 +1658952983 +3110935847 +3164510455 +34906619 +1234514111 +4231521317 +1043163746 +205989267 +3277338246 +823673448 +477209871 +74642437 +2364023438 +3338729132 +2132349826 +613084982 +16685894 +667428568 +2526655179 +1298332541 +1475065328 +374986079 +3169946302 +1123893727 +1798317554 +838768188 +1338188065 +2643373384 +4232934805 +756237094 +2741526263 +4140192072 +672893621 +948959701 +2683856224 +3098573368 +1086665255 +1179542264 +2525838049 +2138391639 +3817833918 +2513088884 +3959652908 +251339718 +3661124642 +3324227759 +1145055203 +1784074191 +3982487866 +1884365202 +314871343 +3347854701 +2001141 +2195575581 +3434738773 +901881160 +4071384298 +3489763794 +4104506251 +190988991 +2076351234 +2729811412 +312785167 +109012862 +2936372670 +2864916555 +3032109419 +2512729398 +308725777 +3157560398 +1061311092 +4072548369 +368292279 +2973829542 +2301624869 +3746634822 +3364002846 +1112443436 +3551061464 +824722324 +3917174302 +2537258971 +1540741327 +1788667697 +207899502 +1057819330 +376207010 +2701233495 +3425323594 +2138765517 +4178509078 +1444099457 +3523116825 +3439324510 +1039040779 +3285945179 +3151629319 +691655215 +3290111419 +2346082904 +2738545168 +1820459811 +2342307452 +3653876035 +1235418340 +2257292731 +1726698752 +1971365068 +2547811751 +2548434668 +1533306375 +11818775 +378097692 +1767962661 +482409022 +59576993 +1613083420 +3923386378 +1842743130 +2886895032 +2797895602 +657191938 +3528690452 +320118502 +1919663488 +802572273 +2939476341 +1753380419 +709475147 +1431309916 +4024824921 +1232053438 +936916907 +1091969572 +525640330 +2761122047 +1127514216 +1108505100 +2285058662 +1885639569 +554701910 +3435123600 +2464329766 +1295660369 +811751084 +141898716 +1577373594 +4177429067 +2430506943 +2471572759 +1846457494 +1976200560 +399726384 +2643858229 +564084560 +3414930788 +1199921418 +590174678 +3741473676 +3261633152 +741235236 +1716507834 +3367750113 +3759469459 +2646555719 +3410352390 +2128537882 +1046308193 +3969231143 +3013172908 +3678452083 +3675481309 +1344204347 +2048157811 +3233973992 +2811554926 +1288484445 +3812850465 +408764783 +2391545878 +1192803581 +1648667440 +840768503 +458009923 +1740556548 +3027884801 +297850281 +349515860 +1309923231 +504107774 +2188085990 +254855839 +4223922275 +3322138887 +1676732584 +586141144 +3932345994 +3646038736 +3560561128 +2031478953 +605166667 +2115715976 +3393633865 +3783979864 +1930652723 +415101519 +164850938 +2689272780 +4023465614 +1695117556 +2711448085 +1210490613 +3035690871 +3818353950 +870699438 +849258946 +735749616 +1329940483 +710036067 +1313271897 +379823124 +731400442 +971867856 +1233054921 +1506170889 +2050221861 +1583402622 +2738720274 +104023665 +3941701953 +2800948596 +158887440 +299606093 +4199978889 +212077871 +497491197 +1826354578 +733366422 +3921535562 +3950750307 +263568694 +3628983313 +4151592917 +1520273619 +1179223718 +2801138324 +3001590275 +2890434894 +3619842186 +1089122389 +2136194534 +1756206513 +2144107517 +4134122075 +3154404531 +1633754932 +1017841692 +2879301003 +1623550725 +1698155384 +1188111410 +1105752757 +354016140 +704428558 +1049235323 +3255729309 +2464686466 +1586189920 +1484084130 +684108093 +1202877021 +1049059631 +1716689866 +3604237128 +3115682582 +3140284572 +2438374246 +956709457 +2053459114 +2952705655 +3702172904 +929871897 +3975192532 +3812581869 +2928912028 +1123821928 +3368495253 +2719220020 +3610600402 +2908359015 +4071649885 +1049457610 +2208098924 +3293934563 +3859761018 +3712764479 +409786694 +3249031684 +2269433677 +4093517904 +2816334544 +353678854 +856842551 +3624340153 +2169102411 +176178210 +3041426433 +1407399696 +2272125549 +1755965730 +316056553 +545465328 +2104490447 +2043283771 +820926750 +3314418581 +3293121688 +3569474086 +1736575176 +3543232960 +2273254128 +2028823392 +4270949576 +1401587212 +2805032154 +1972664363 +1045612433 +2040320640 +676304864 +3729485357 +1100081413 +3739378768 +80855025 +1577344611 +2222033618 +3498565713 +1869412411 +2645533134 +2700557149 +2120180180 +3133079598 +1297338257 +2659994433 +3911265343 +1921852117 +3499407367 +1646703881 +3168255633 +2030901222 +720075345 +3748538830 +2065477738 +325650182 +3304365939 +3369727874 +3703182853 +3245515569 +2142810631 +783041604 +2665420998 +913686509 +351742902 +955918546 +3497131927 +2309136859 +1293339182 +2315439590 +4247801883 +2166332560 +3502626744 +2985324510 +3568942499 +2920631291 +808312927 +4101647011 +824365686 +2772658730 +2789359258 +4251932255 +3978127803 +1850738567 +2403905812 +1581946299 +2749344778 +480706760 +2548465481 +4222328964 +4055296586 +3277360002 +2293237525 +1437265482 +1482423140 +1232971880 +3479932744 +3219075643 +416287456 +1678931314 +670811565 +1576396215 +1954045062 +3140067116 +1847176473 +941117370 +4287817662 +1967900927 +2171030599 +361293413 +2234718867 +1938497351 +2559448100 +3545444837 +41196709 +3966444884 +1551150029 +1869779006 +2323790397 +2060832586 +4280886809 +2564038011 +2979599963 +1517482498 +1696104600 +1993914679 +854304756 +1716526422 +818013501 +3091683571 +1908487974 +3427628141 +1715850479 +3301005159 +230818893 +2700284187 +3724500999 +1816923320 +2616926390 +1126226709 +2354840724 +3753027506 +1436621369 +4223565964 +3098352834 +1110214484 +4124591509 +1532598571 +4165249265 +90678827 +658899685 +1241529577 +2214187697 +2641078605 +2750524276 +660588747 +1278016900 +3019722267 +2635769194 +2045867225 +3988329836 +1400986460 +2546642359 +4086137047 +3613281086 +726887578 +2161020959 +1365440466 +648219834 +3716800922 +182531455 +1938151251 +3973172651 +188041755 +2878968614 +3931715701 +1899562533 +3948573170 +144688627 +2421834774 +777429276 +3092607774 +2111771644 +827261245 +714725043 +2295056632 +1023843236 +1098454162 +3994805314 +1727407698 +1897294624 +2281703783 +816007859 +291873956 +2147568838 \ No newline at end of file diff --git a/PHF_benchmark/Input_data/2/key_0000_1_10000_8__000000.txt b/PHF_benchmark/Input_data/2/key_0000_1_10000_8__000000.txt new file mode 100755 index 0000000..99b9714 --- /dev/null +++ b/PHF_benchmark/Input_data/2/key_0000_1_10000_8__000000.txt @@ -0,0 +1,10000 @@ +2084900010 +1530066129 +2425378897 +708197548 +911077156 +176234804 +3176725597 +2716060749 +1518575039 +3436998355 +3594980078 +1663218081 +2906878964 +1132541066 +3227231090 +283983021 +2061198052 +1425466329 +1863317525 +3644781301 +3660754730 +1029320840 +151728829 +1177527873 +3596668077 +723728794 +499247089 +1403835126 +2072342827 +3241981234 +1747193165 +1579079150 +596889778 +197462301 +2454652561 +469580341 +3444968019 +3195556831 +1082711154 +1343345799 +1845203356 +3580756240 +3970237771 +343047750 +427693623 +3223392528 +66594682 +2008554878 +1612721003 +2060261376 +2629982893 +132175246 +3078427683 +1844728468 +2764037246 +3488456280 +3761869945 +2850089567 +2062393282 +1238480865 +3487303931 +65236367 +3536282240 +3856022023 +868450161 +123255791 +193290705 +213076135 +4834947 +3996113529 +1282470690 +1070964457 +3991644212 +4027271621 +630646198 +165834209 +2526623220 +2974598212 +2284627445 +627504743 +1932025136 +3098160721 +141086562 +190967672 +2423197009 +2296154746 +1356666842 +2411136408 +3542426320 +857485712 +3834733772 +3636882424 +2951414557 +1713265053 +3708480188 +2726959340 +3067568553 +3508831511 +3818200189 +1622832260 +2231591207 +701821898 +1082001536 +3877662677 +2548760745 +2088250168 +2542778820 +2817899410 +4098776940 +4146847075 +3309775856 +3441058662 +589676408 +782707103 +3179041217 +591059733 +1071749286 +2104864997 +3880607380 +3652281131 +3419321375 +1888848883 +1916499986 +2291264394 +2324392023 +1343146617 +503102076 +2658963572 +4142755154 +1376405184 +3757051920 +737677274 +2895180040 +2553166869 +1599702482 +843376213 +508457692 +488260392 +2989693089 +3063540558 +1450853485 +1520512067 +2822184459 +3669068376 +3833529305 +2264660505 +1188254880 +302705655 +3897249717 +479306877 +3280504602 +296171720 +1375673779 +2567647447 +2670764217 +1960383570 +584742239 +10157897 +2565107473 +3693879249 +403360687 +238458439 +1230762558 +2383262774 +1957080776 +1338461772 +396025376 +4283493160 +54737772 +2667098491 +3934658447 +3198964326 +3522626495 +1434065392 +3292815208 +3143626253 +3729827201 +1512868041 +1016310663 +1396179081 +2451660275 +219592634 +949652112 +2521168579 +295508867 +1743694211 +3886744850 +3995250175 +1267664015 +3541875132 +1821880971 +1331070325 +3970869672 +3683168595 +2534428213 +2367645028 +814185969 +3069089410 +1411768787 +980877489 +1276531313 +3069480164 +1681776660 +4003999055 +3852613481 +1057669177 +4215387559 +3653616910 +827462431 +1350852697 +3523166573 +3522271682 +1744856559 +896092232 +2288722538 +40329058 +2676918078 +1132238897 +2276168283 +3825648955 +3472845679 +2758529280 +3406781870 +2159374467 +2947588793 +3596104352 +612215205 +1889466113 +786633870 +4008646026 +2697224481 +3531651442 +887761532 +3626540308 +3144966983 +2595335187 +2758229144 +378485768 +733042265 +1499073735 +950683962 +1909882215 +387643211 +3030024954 +2645885613 +3532959273 +2713010854 +1512797917 +3544971429 +2533779625 +3829627073 +890825750 +2407793443 +4112621411 +2631771492 +1263825894 +27062416 +3405349969 +2889584881 +991386097 +2868107617 +1832596987 +3740706668 +3158665747 +1773160209 +4112235739 +1615083394 +1922752667 +3117853748 +1888368572 +308796438 +961723132 +366525058 +2620721539 +2422309612 +2912734696 +956431945 +837674320 +940822188 +3108768656 +4049231924 +2421206162 +2351026319 +3688540208 +2615659146 +1475422763 +629605127 +3579871480 +2774781158 +891174361 +3620538650 +128363248 +651802083 +350930059 +231251628 +3940461742 +398150237 +1187630322 +649410355 +2140709658 +1233958170 +1960032183 +2662665670 +164556707 +1047323560 +2358100199 +2944927346 +4146752365 +3308022372 +1866272911 +1511081720 +440112093 +284230417 +240640862 +120878802 +2367531537 +3161683122 +975625171 +1779851803 +1220743931 +1760914952 +959792641 +506998828 +3203688876 +1018380778 +1652747323 +3920305418 +1992765141 +187431135 +3508569413 +711492594 +4073495336 +2673940631 +3143159559 +663875773 +3462745149 +734813008 +893169733 +2465059651 +3811031545 +2114974728 +4125499980 +1794806567 +958092968 +3438547111 +2520398864 +3259985959 +3587194853 +1652935955 +1111688796 +1101681655 +4032716288 +470904915 +1864108356 +641137485 +808693374 +1429987638 +82372639 +3831276788 +3468826502 +2156552256 +3673319239 +2447722833 +1084282534 +96534100 +3825330600 +2464457649 +718024637 +2217566645 +3300557172 +1126058189 +2176184118 +825075862 +1585463349 +3955699225 +2669435781 +3222266158 +386808460 +2932684943 +10348405 +3615436220 +1053343453 +3266115588 +4294719929 +29068686 +4054291594 +3133805698 +822837159 +3412375924 +1331175950 +2643155213 +2336572850 +3715278072 +4278078321 +2967822430 +3066916723 +2901595732 +3954290120 +3215877634 +3533730134 +4150943128 +4256951101 +3164125085 +4095168121 +3328694581 +3233058101 +1706221003 +2877584209 +2846041567 +1200217918 +2497042766 +3993956658 +130335033 +2607610059 +3626223221 +2607982451 +2177065556 +939984285 +4218036398 +3527526454 +2791318051 +2253455886 +796933918 +1072801198 +3653358000 +3909281841 +1628470112 +4039950386 +1810173145 +1988454136 +671987777 +1641064841 +2803881184 +850707193 +2073535965 +3179894412 +3885939369 +1789993667 +285085008 +581083531 +2694506057 +2051964634 +858656132 +2018690456 +462573483 +309169831 +1966852040 +3667253346 +3452169295 +758782810 +1375205337 +527047035 +646122144 +3325191701 +1312982756 +2482511491 +133957009 +1465093264 +3552155229 +3997257900 +960858664 +312481650 +1756045335 +1773858192 +2635898217 +2710170483 +72737321 +428154456 +121812046 +1330707605 +591612188 +167635277 +212298312 +1675378764 +4140045748 +3708085727 +1038243661 +2847496891 +1033222106 +916690798 +2845521767 +1721112648 +2354840292 +323553596 +1567387373 +3123289336 +75615420 +749815219 +878403049 +2263268708 +132899483 +3403028814 +3664267690 +1821069150 +4083334789 +42650398 +3349215369 +4195829618 +358802639 +3172198005 +2302367760 +909353177 +1726222739 +2359078509 +3978569948 +671201159 +1773329682 +1611967668 +408650912 +3880653656 +1328410796 +2914560885 +2357441729 +3950740759 +4054909600 +3968351627 +669780760 +4086498965 +908602441 +1958577484 +2505589675 +343757411 +3945548296 +2592345199 +2143420066 +3254536210 +2913964196 +3108245502 +2960787134 +4084497972 +1154662354 +313461313 +2731124423 +3477765411 +1533236141 +3489060548 +3246960779 +2085611300 +3171817980 +12014288 +1901601253 +98622798 +2436999542 +3693409694 +1434372594 +315859211 +2320253748 +2181843516 +3405086461 +522141870 +238925497 +2759834891 +4097772795 +2761603483 +3863700960 +901910902 +2951981348 +3124455416 +3788707207 +3710938852 +3379861866 +4127690626 +3346668275 +3655503627 +1606536196 +3865573963 +538727441 +894622651 +1354155140 +3106586492 +3799568601 +2053494205 +3737237080 +4253885244 +3929786618 +224234105 +310936453 +1887341282 +4264456993 +2572123134 +3188262629 +3931324673 +3176396369 +3563041550 +2711024172 +1464790338 +2434578112 +1314268224 +3640458470 +3901217294 +1213591080 +1394189359 +3644587653 +3765637146 +3247187649 +1283292205 +362373218 +4289983933 +2314688376 +3218576942 +3410347428 +2765898791 +889259072 +2965997556 +804256214 +3901970085 +709124335 +3945399350 +717575966 +3894046629 +267155250 +3606664644 +1090700138 +2249348475 +3962523200 +3337763177 +3254280167 +748873778 +145599570 +817191899 +624710889 +3329225838 +4183471117 +237226883 +2392990084 +1007469682 +2563549834 +2552604269 +2831494 +284909326 +3119952564 +245189581 +205542645 +3933734419 +3019787157 +1354179461 +3971721255 +3595726135 +2839566803 +1488900050 +1849994748 +2822756719 +3992271125 +1153572045 +3302101482 +4050655001 +938837398 +428173152 +1797301846 +4106988594 +2914560836 +2780239982 +3818128148 +1073094408 +3791787853 +2813705169 +2938480211 +472879270 +309457563 +2468053745 +3532153864 +1881796495 +2481690114 +4268956238 +2512712031 +1905487309 +822601396 +3515739879 +435209290 +135567973 +516615681 +3341460879 +1401337879 +3130024021 +3576039868 +3641634097 +1802938468 +1934861918 +1822642366 +662561134 +1476116825 +2538224144 +853397819 +2234404457 +3961264748 +1580949717 +294860298 +4215681901 +1103087106 +240147600 +2766550031 +2774903768 +2508251080 +2164500230 +3903829457 +2920906514 +2919770668 +1932821074 +116509179 +3958513253 +2656596288 +3121628702 +311332912 +2737074742 +3000915636 +1141923637 +3267050231 +1781792533 +802391077 +2350552718 +2808172400 +64055158 +363516777 +2179164053 +1423876902 +2412220898 +1381383446 +1110196348 +378112891 +976255412 +3028904614 +530360967 +2459917941 +500942555 +36014181 +2802074919 +411673155 +2048988385 +3801233775 +2595219375 +3750878423 +382661792 +2871685105 +3452059320 +2154582342 +1581452979 +2603707394 +1840229010 +1009996184 +2671252473 +3686624923 +954474473 +4148186703 +3402810680 +533683701 +1897694644 +844688641 +841198010 +3354852954 +4093113845 +503000653 +111740637 +68975466 +4161468745 +279408350 +3459493075 +3145646761 +1696653345 +1176607803 +1962148403 +3917385068 +2914040958 +3682940049 +3213449150 +3178400736 +110409243 +2424979013 +876980308 +3980406805 +1058553424 +310407682 +356649793 +2413127859 +2505692710 +1988201711 +714189830 +284862384 +4206527621 +2522716097 +3645022787 +2582758543 +3032373787 +3900921834 +3924277521 +319824861 +1571457577 +3078261637 +1901340817 +1151321759 +3437692750 +2053773947 +3642162592 +2203398832 +2386010355 +682836112 +1956335157 +4205954643 +3364237259 +1309358369 +2061529360 +2760576025 +2828725742 +793176972 +2064312093 +3601115221 +1609870160 +719400320 +2266348659 +2407972539 +3170133162 +3685188586 +3808979190 +456003203 +2924506976 +3004370787 +2283416357 +890830427 +2972215586 +623043104 +427256335 +2590980281 +3052488327 +4061112160 +4018435552 +3175686859 +1001060274 +1153057173 +2363793676 +4203555389 +1138869624 +1056764971 +3362217272 +136971849 +3378235644 +1737595256 +3909445118 +1934569270 +1356278760 +4076099625 +3341792566 +3181921 +679395003 +3218621393 +3002954394 +1967272112 +1931738305 +2717096863 +3863450143 +2417761580 +1094618261 +4216757556 +628479872 +3932748486 +1119433568 +2586470284 +777636162 +1013598173 +3707609874 +3029382739 +2613416990 +375408458 +2048426442 +1024803525 +708435640 +952082277 +1247108490 +3436585011 +4224461023 +2753386507 +3010621125 +3605463015 +158154923 +2636243025 +2213794800 +385765086 +3278252784 +3260079617 +1327834371 +3353425122 +3741705547 +1350383927 +142037689 +2491888540 +2191222311 +4085158618 +1212355782 +2106376336 +89069802 +2451024057 +344280646 +3212866025 +4089635944 +260479891 +1692155233 +3516606702 +2058783951 +383208189 +3302656589 +2907121213 +3056215766 +974711585 +226899368 +3667147163 +799357952 +4254896142 +3449362622 +2894626553 +2092292937 +2914919928 +2914131850 +2608431190 +3142477015 +1673600792 +1184282212 +1419111261 +720006622 +759424757 +2820157406 +1639468620 +2625323653 +2346084044 +90961790 +2388583217 +21868076 +2513696662 +1136099205 +2265363377 +587750668 +1204176627 +2451774306 +1598603262 +3890521961 +3421703180 +2706789040 +1304165429 +2993318482 +3091655248 +87172478 +4071786887 +3051702553 +525353288 +3671137311 +2546042622 +654235213 +2530864092 +2676601554 +1799718770 +3377361659 +1299654641 +965693796 +205770994 +1919133011 +3674348284 +1385888829 +1253135129 +917576687 +407903567 +1895632095 +1913296960 +3498353505 +4094650293 +2199114975 +2423119842 +3230907094 +186828090 +1091827053 +2246961771 +3513344861 +47805460 +639040954 +2634101298 +1158205672 +3926960688 +355319155 +3498043031 +734667405 +824927067 +447485274 +2492707824 +683787565 +1960240730 +1320976275 +766414173 +873344533 +2853426693 +172418590 +2424304739 +3469302196 +3149910486 +3572109914 +3895730642 +1527451452 +3188502369 +177466467 +396096822 +1412340298 +364214874 +3331128290 +3165286237 +3224801806 +3602370874 +3955108815 +246340327 +3587371441 +356670440 +4212177957 +3923524239 +2689867513 +3822381514 +2861179242 +2010551492 +825685864 +1676000670 +2079302442 +1610158945 +471980033 +3415437307 +3047798573 +917375934 +482350647 +3993826630 +3719668800 +2447995433 +929600691 +2128919334 +2301010810 +682298937 +161772931 +496945889 +205142827 +960517236 +1744969437 +897472100 +2752260855 +3349289799 +589902395 +3744921069 +876402441 +2948807423 +3896863127 +3674336540 +1147699806 +2588566120 +2371502796 +1113054346 +4028317212 +4011427404 +3803376768 +488331951 +1757245990 +2761699699 +306110418 +3369475242 +3890308487 +1279284129 +573623337 +1553725255 +1184683889 +76068918 +2071423685 +509963417 +2985682530 +2724079826 +942988455 +2070579114 +3276413676 +2873646095 +527285625 +4107154396 +903906429 +2643869720 +4079433137 +786888945 +454893841 +886169793 +2532171758 +2008146609 +2332317515 +702590115 +1542418942 +1131644520 +858307979 +860782634 +3894464484 +73551105 +1985312682 +4211367940 +3618199672 +686662479 +1038290674 +1477806219 +2004313292 +3924263936 +3497663543 +2042982098 +2216522835 +4137512216 +1354543635 +503929958 +3450251974 +2232415513 +3474562218 +2034970679 +1666103330 +2563889971 +2385031800 +3851827419 +1211148137 +2838531984 +239730587 +1821520921 +3965557908 +3539957562 +2274714865 +457171530 +618044416 +3011023746 +3786757841 +1339222044 +3812556849 +3151026682 +4543474 +3819374970 +34277667 +143293446 +1872496513 +3063462889 +3544851962 +800453758 +3980694109 +1579229450 +4291076403 +1402644686 +4291505833 +290068557 +3530328233 +2974086880 +4247668227 +548614218 +1550843296 +812631291 +2614407282 +3472061743 +2219021824 +2187068558 +703559422 +1424096690 +3811188390 +1772115979 +571919031 +3796140736 +1833606803 +1465664922 +1591114598 +2700675524 +1285364850 +1816926223 +414069823 +1124573477 +890940168 +1040180422 +2563013209 +2406742424 +4212619416 +2221375996 +459910834 +1056215060 +3140320756 +1530995885 +728378966 +4248241740 +2107794200 +529849250 +933671623 +3686314603 +4185960101 +3964666118 +2979635859 +4209222855 +2044003784 +2463237604 +3274796397 +2742749259 +869388116 +2730926949 +4193992866 +705610162 +871609506 +1708202642 +1157673612 +3523401127 +945939666 +2800655586 +55249837 +1301395069 +3660119028 +4233839069 +394853105 +1634894519 +3863222743 +1301146095 +4269014390 +3562385414 +81592708 +1637276411 +3026859594 +1949184426 +3264523203 +430712839 +2207334740 +885761655 +699467722 +536813782 +654669908 +414915618 +258876505 +1607708690 +1636714707 +1559934000 +403767950 +3724861078 +2675382875 +2635209562 +3117370971 +123884810 +2837392047 +3509060637 +209976961 +662967788 +3806277273 +2999166103 +4072821293 +1469655176 +2059861322 +1141551708 +1970438508 +3509851843 +2577132733 +3544636598 +3088237513 +4017538997 +1065018217 +756893890 +1709364825 +4063437039 +42055013 +1654142312 +543676351 +3851964424 +3579156909 +3258065098 +896347973 +2063082341 +98974825 +4170852721 +4034305502 +3952090930 +3081023521 +3041362440 +1366825847 +2285580628 +1652880964 +1672642566 +4048059245 +2546711394 +1957399359 +1271343749 +329538555 +1015418459 +3169421596 +1487076040 +862886363 +1113860743 +3993712832 +2472720246 +2067381050 +384878324 +1829052562 +795881626 +939251222 +500520994 +2814867364 +3598306584 +1968505439 +3232030625 +1757116374 +1649198826 +996364497 +2348352554 +2037477822 +3911978037 +370243673 +915195568 +3405823594 +804573087 +3742157514 +3555901472 +4206892936 +2630126645 +3326432519 +1665152663 +735623213 +2181125555 +2766349170 +2913617350 +443985577 +2999557321 +3325032282 +1810653989 +1010942273 +3462233735 +1356597588 +1493656477 +2800691229 +2087848250 +1952522570 +1235627052 +1976552800 +729928618 +1119323090 +1239727586 +3570313094 +2150076090 +3677071156 +2299089142 +1695906750 +4270281454 +895500855 +1101288122 +751197769 +3382712846 +3513287170 +1012033277 +1974161973 +1425970216 +2628894778 +4201450142 +4214691285 +3927584851 +1527116842 +1104688377 +634252407 +3334009891 +2832270413 +4181863126 +3268902077 +2732115773 +593259037 +1660710857 +3571805786 +1203622378 +60225065 +315501188 +2875523324 +3960037928 +3704122804 +30831409 +3238856996 +1513153527 +583032911 +848285553 +3325893758 +3947274453 +1373631531 +1992326640 +2596537415 +201913326 +1235544657 +450322328 +889722217 +890899965 +2981898748 +4181086328 +3392481062 +622232168 +139996931 +3126662147 +3509376374 +3376844777 +4055045574 +1391647186 +457508653 +3257368111 +2741035190 +2893014536 +2886724404 +1652139633 +2711138275 +2294495682 +1168617383 +3713386361 +1200135482 +4002318788 +3493468463 +904034294 +97952945 +3021364408 +1190456076 +4292310235 +4160660469 +3645765922 +1028120144 +1792802838 +2020917038 +1122256198 +963140180 +4035862319 +984787278 +2044244696 +932374434 +4282190838 +936124784 +1555250554 +3327896253 +2201012836 +531017592 +2276580840 +3530927101 +874945569 +73349825 +3569058522 +3365703467 +2121697625 +3235179307 +3597603641 +2815913718 +2469023596 +1469396013 +1412928573 +2032450323 +1496050579 +2555520519 +1038992948 +771776501 +3244861873 +2025693906 +1072048001 +675215858 +1329685736 +1041233764 +3167517719 +2346779952 +2966185987 +3073731706 +2688867287 +2182372869 +1487255884 +2026761006 +579254906 +4068867358 +113989858 +775213209 +2781052995 +1463655751 +3977487377 +3136758306 +142836217 +3210979972 +4029861485 +1492528906 +2650722927 +543463689 +482493370 +3164711913 +1791377192 +2052823824 +3351005892 +2504686346 +842182852 +3208355681 +1381540397 +1179261321 +1233379421 +3661333534 +7598746 +1898425122 +3635688447 +1957614110 +3219833485 +1859339595 +2157625528 +2238342799 +4111762696 +1017385863 +387971982 +3072197489 +2747622218 +4069759784 +2842970462 +70123603 +4246104710 +3871175559 +1859764714 +3087706440 +3885077338 +3568033605 +3452942379 +1049611480 +3611159652 +2118355661 +1470263355 +3429497962 +3277396242 +3540113488 +948891300 +158762178 +3040180771 +3893783862 +645156339 +726232923 +2396031703 +646834798 +1880453582 +4200372577 +2061254965 +499882476 +3857761475 +3900636974 +2819539177 +222024022 +3247617758 +2199681747 +4170438593 +824327814 +3189558859 +1479549168 +2368405035 +772854077 +2622057164 +2855638827 +1079939083 +236173818 +828353673 +3905663589 +3456819198 +2243579384 +1619698578 +3083820045 +2185087085 +1739629852 +2404673369 +802063874 +1115071231 +1854180663 +1840213072 +948779170 +4041588726 +3992095142 +3931575015 +2127626298 +2477507471 +1900281802 +3164535562 +3811078710 +3519506080 +2623478166 +2263784870 +2478295705 +2312487794 +1957556696 +3076448264 +4120632400 +2142757214 +343307694 +3042565309 +2204381763 +2514733860 +2878905613 +3073821372 +1815917121 +4099455255 +623042876 +761719415 +2588660183 +653445556 +4180105373 +990925580 +4122943904 +3458444733 +394074025 +4050380478 +402105741 +2635534262 +81967688 +3499262743 +899060963 +2643104748 +3516366410 +2612127611 +3522816304 +4270749438 +4201859812 +3019384501 +1472898866 +985132379 +876116282 +3503406844 +3516560084 +2926860343 +2713193593 +160441661 +3897259105 +1497065655 +1368370890 +1640697611 +4208136741 +998094492 +1648761049 +458002138 +606636994 +3060826019 +52709649 +667066567 +1652406406 +1615436274 +69744066 +1209749964 +3833191417 +493262620 +330440172 +3569371500 +2261099203 +1234374089 +243875595 +2568262396 +3346317876 +1690198767 +11977193 +3951801979 +1952062146 +677479456 +3407960987 +795826680 +1932094466 +1793322039 +3998611770 +3080464740 +840012348 +16450397 +1014053127 +2385888857 +3669014297 +1868793840 +2709807032 +1646903074 +3065958773 +2710928064 +3212042011 +2478224239 +3731384000 +1071515677 +2179686515 +3669358903 +3898303639 +3883665975 +1150545082 +2455931517 +21852136 +296258069 +1162577456 +2527355474 +3823295386 +233789840 +2580053931 +1479595974 +136874328 +1576335775 +1689438876 +3480122868 +3126121710 +2429256179 +727207035 +3860336059 +2472592805 +1601040693 +3984939355 +1802361975 +1605539016 +339247199 +171331440 +2110343066 +292448230 +1493579309 +1914792933 +2889193417 +3461498394 +4210010518 +1258764291 +3277554167 +2272005762 +4251865497 +1626180470 +3222741873 +1888078434 +3299709453 +3206241293 +3702375374 +3629723863 +469244922 +1358717591 +805848608 +2199287123 +2624834309 +2013313027 +3552820773 +3582226672 +3999332756 +1294714099 +962804856 +2008960906 +78668747 +1516671216 +3495534301 +807200928 +433405917 +2049193944 +3810990666 +2825337846 +600950407 +4100176792 +491754036 +2024298861 +2376577063 +4129022240 +1238950163 +2220882149 +4291287646 +2549739371 +1322700596 +862896053 +1990315576 +3513252739 +2264856193 +1924675602 +855035869 +522556751 +3564906685 +3783755530 +320444112 +3281824662 +1433978316 +1373821818 +3440986811 +1241655575 +1824828728 +3217780251 +917263382 +329273876 +1639299086 +3606040912 +1969458516 +1609205685 +1156200649 +1376731128 +1219034538 +388057468 +1774704815 +3571625226 +2740247840 +2357578010 +2496443053 +421516955 +3515139506 +3790789755 +2118792657 +2353452907 +3490309972 +1739248774 +3843622518 +3757500562 +713679794 +2140012891 +2250881166 +3171349463 +2366373259 +447602790 +1943974768 +2090087999 +1700831488 +2438180231 +4012130154 +1263838670 +3167998406 +3867836257 +2465450515 +3262631927 +3834851364 +1536343056 +3708855249 +3292180120 +557009967 +2972448081 +3027379338 +1894049260 +1883307512 +3234518992 +1463928494 +3759766927 +2963179970 +1533578149 +235514215 +1104014905 +1102734598 +1561233569 +786697281 +2325545560 +2302067175 +1484345601 +2587824941 +3929292577 +1870648691 +2798843529 +2438290478 +1468756460 +1959687744 +1889315252 +4265652391 +4263395889 +1179969953 +1999396808 +3828776279 +2010649152 +3220690378 +3131774333 +3240028584 +2805880118 +2580212718 +4127179886 +4273223594 +1366384032 +4168003320 +70688618 +2490672078 +2844695866 +141489010 +452871339 +3662148793 +653759488 +2450644805 +3867506326 +3241030918 +1736310076 +924588398 +1516749524 +258186206 +3267890919 +1134590505 +3678421122 +2260924883 +826182821 +2133850635 +538962470 +3236656822 +3105296896 +2230477671 +1299225084 +2453078422 +402834759 +1278113155 +3367250508 +1833454369 +1573024422 +535196073 +335024019 +3680341055 +2878786018 +507739130 +207582941 +3515329500 +2607711654 +253204274 +3270781793 +2606977255 +3083860119 +768986400 +1180653661 +3782172047 +3088888983 +3939624241 +211826073 +4094869790 +2455238565 +2920078467 +3996157889 +589790983 +229960344 +1486478999 +3888955433 +3832500394 +1827107777 +2975553645 +585493880 +1049193509 +1179275325 +214881817 +434341432 +78031691 +1063492473 +2020111517 +3240204622 +1346912402 +1274908981 +2483555825 +1381163871 +62129688 +72824802 +442952293 +3878376783 +863924925 +1549842836 +4217190604 +700586306 +3170298613 +1073959985 +3554592163 +1627079318 +4210192073 +112551044 +2774362349 +3314549299 +560272413 +1839016922 +743830183 +1915892803 +4079013148 +3812862052 +1159841415 +1013207617 +4194940578 +353977484 +3022918195 +3493412351 +3319240763 +1360767342 +572447321 +569976565 +1184252661 +1717547859 +2558965389 +2788070539 +4131536490 +4180493702 +1741677668 +417733135 +992154578 +321365132 +502595479 +525208848 +782019178 +14506174 +2426500556 +3172481541 +2042848599 +2887324442 +2754638557 +1178454352 +330828325 +32169275 +2964564845 +2347800911 +663697365 +3168969969 +181057990 +2856400351 +1800301094 +3139596696 +494705233 +3620142020 +2434245485 +525876097 +3215220182 +3409401606 +2991052266 +4151808609 +1854431733 +1428611944 +1821290209 +701410311 +3914658320 +3557658760 +3262737282 +786732952 +2261872064 +1542718930 +395336946 +4222506525 +2742991428 +2114965752 +2062404614 +2721291740 +3236103808 +1393610616 +1604522297 +2593325830 +2704957953 +4170368948 +1850107864 +3689068941 +2949039689 +4233834588 +3074695269 +3412566482 +2364538722 +1402015682 +4125178226 +1761627812 +2420194575 +2740319364 +3653909680 +1834043721 +1919347749 +1878145387 +2652585602 +3502646654 +1876519531 +1851848185 +4132750625 +3974277851 +4058880777 +785696567 +153801675 +470427980 +3869138461 +3350524656 +248684364 +2799224830 +344518869 +1372078550 +401008572 +2056461120 +3883254090 +2101007775 +1565928791 +2022821569 +191856227 +1665429810 +548983352 +1537734806 +1329212832 +2445759884 +2803815854 +53776618 +2885840297 +2371396885 +1961208599 +500678894 +797640680 +1030867598 +2201080688 +3610386187 +2346160238 +832012894 +2221224190 +1095511398 +3408817065 +1672352859 +1249254299 +3251099693 +1185661664 +3182114121 +2627953588 +3045425226 +677652050 +2958072983 +3487236730 +3251478302 +2956538541 +741114149 +3081303101 +3391846412 +1020694039 +1030610174 +2971292091 +3800253443 +840206388 +1760858005 +2345954933 +1978866264 +3381173115 +676875909 +2194708799 +594536724 +3072020123 +3420488019 +3950737190 +56134569 +3993942289 +3978004659 +4251221276 +1685447682 +2458778293 +3352936455 +3951122080 +523616568 +3017110686 +1494939508 +402455746 +763750743 +1069709342 +1845353069 +2215826170 +1444795626 +3645392395 +2670575654 +2946760806 +2964105143 +489921433 +3917552041 +960061840 +2608571009 +777472541 +2412392574 +3396344414 +2105837187 +528071623 +478008197 +1947819930 +3042937771 +1177371743 +1319805228 +2510552434 +4146568285 +2661646002 +922955258 +2527824013 +4294150873 +18742727 +1960786873 +460040027 +1858124146 +3848209688 +754321292 +2919163727 +3924971362 +422817102 +3674090435 +2559421500 +3515979007 +3663382525 +2593470311 +2433006356 +2863861452 +4262896127 +2657927699 +2116460452 +2253039723 +3694791356 +3763368565 +2092982529 +2207002223 +3973447892 +4133714471 +642124457 +3533796243 +4005500967 +1229571081 +3045278208 +1210556172 +2038147112 +2213221566 +403944720 +2213138964 +29252263 +2517457606 +4067085407 +577945631 +1119286811 +253129535 +871149969 +785146845 +3879779714 +1278931095 +2400688654 +650966989 +2525538363 +2440129046 +1958338924 +657120208 +842361118 +1914417613 +2969806858 +3184505340 +1495829822 +679711418 +2006983036 +1755213349 +505098648 +2134183653 +3565734177 +1744280370 +1351078467 +3875685256 +2655924109 +3635568186 +2465068904 +1011848195 +1818955506 +4197981124 +3850389339 +2292372483 +3180167988 +1723956741 +1134130418 +3819570030 +3166059630 +4010402265 +1456723447 +1117466446 +327733614 +2121861988 +1675805228 +2802071667 +1734351188 +3762124305 +1175202516 +2305733384 +517096355 +4268584439 +2394579303 +3607815029 +2149864150 +3578000725 +3234913928 +3697327035 +1427861470 +2664749290 +2994650517 +3099451400 +605866346 +3284774702 +20277510 +727718241 +1897129666 +2921216268 +369265940 +2664029264 +34145969 +2370401089 +2846764791 +814193800 +2443013548 +3170633632 +763905550 +2558835805 +3183707085 +2238973210 +1158511095 +1919135878 +12157518 +502977310 +3352477470 +3173211365 +2821967219 +3396216834 +3060273358 +149533951 +4160422624 +853917893 +838732489 +3036092253 +317868393 +1652489833 +2377784256 +539694772 +3693874793 +4140663469 +2793101763 +1096980081 +507728851 +563994123 +1548490347 +1078100753 +2603705361 +637342788 +3924796680 +2531022258 +2942870370 +3690195165 +3272391479 +841249946 +2739228147 +3235359838 +826377934 +2081055916 +4153369187 +4136887216 +3471452919 +3146667041 +1217593952 +3317717133 +378303888 +3223232037 +1333937441 +1128734610 +1950114319 +1458127428 +1050821883 +1905846639 +850270918 +523818862 +3507388331 +2234585911 +273046115 +818651112 +3233932692 +2423044268 +2194521582 +1967942564 +2182369716 +2108910899 +1996805534 +3507696264 +1561663083 +3608439897 +279643718 +3482529396 +933242407 +3411525836 +321942057 +3221767835 +4030881043 +1439645798 +3910815186 +415368746 +2659317734 +2342339248 +1018522288 +3588495051 +3686732413 +3252923859 +3358313776 +1887667900 +3596675680 +3456119073 +3281780276 +3216242330 +1839401911 +4251763045 +1811589447 +2562975035 +992521422 +2331403397 +3534616714 +2590973775 +4025246357 +3305132382 +1563097433 +372822768 +1216888947 +3087489184 +1763031059 +36697152 +722761886 +623901246 +1968364262 +1787796007 +3029199362 +3593061857 +1628402847 +3353876556 +3220861222 +273325472 +4245201066 +2279355318 +1567618353 +2410190109 +715134402 +613948937 +2875985870 +3166798108 +1191092567 +1417252684 +2393536421 +1761738266 +377973766 +3863703772 +4007686053 +2245509893 +3061781671 +2289972708 +2184963158 +2557709510 +2619138950 +2561265303 +3766645172 +2098090822 +3853920663 +3018284012 +615677125 +226696644 +1244803541 +3107123966 +2616255047 +4276947597 +706517924 +527011032 +2965350659 +3501298174 +1668963818 +736255698 +4172913336 +607730302 +572526206 +925761517 +2215196247 +955125355 +3874420725 +390080026 +2481804759 +3523924396 +1131162876 +1407996545 +105853149 +2726838868 +2655736603 +2989835102 +1132476559 +146675501 +3065376023 +3683450759 +3685408222 +3361918492 +3980659440 +2323583570 +1226227681 +383247030 +4236211628 +2361623286 +1472813170 +1563728753 +1098618492 +1591224621 +2608151373 +1519296705 +2271505191 +2477097648 +3347904118 +6347302 +1412686060 +672321086 +1340498605 +462750269 +4056195307 +1348088942 +3934523020 +1760669833 +1179732932 +2432320801 +2027265223 +3546905216 +2832643386 +4038065372 +3090929390 +3270314635 +822931071 +2734290768 +375059949 +2417902936 +1165339477 +2693890650 +3583419453 +1875293752 +582462347 +592450449 +3278727998 +951831465 +2648341026 +446416895 +1271626792 +3161172446 +715535192 +1621631951 +1546284828 +3734722571 +2181108340 +1519172003 +2412228357 +1653434368 +640930549 +530999511 +3570353385 +3200350687 +3812393075 +1683143107 +3753243066 +63678999 +3193047602 +379283836 +2535900611 +938013558 +3491238701 +753266634 +692418697 +78851146 +3348476511 +316744185 +1400524950 +3867901862 +3670135726 +3658530675 +3255817289 +1122812393 +1955815093 +854348409 +1447221189 +454500756 +403808958 +2375492819 +3283431966 +734034919 +2295551726 +2954117496 +4106827985 +629662627 +138560633 +1778297049 +2560816354 +1986158976 +3212996045 +1668947548 +1998146056 +3225593890 +2674989897 +1117076907 +4158605868 +2119017255 +1325987851 +4046822437 +2192780289 +1300194199 +2589055122 +3323544085 +1899935168 +672438697 +1758723289 +1549217762 +57713733 +3154055886 +1538338059 +2971449729 +1049151399 +1454403562 +2511540549 +44047901 +680203817 +2816465628 +1153963883 +1853677275 +2563139355 +1847588039 +2614469607 +502275131 +3872561187 +1271917049 +3964880965 +212160254 +92818491 +260395638 +1884552889 +1594125739 +375091497 +1735390595 +2698685237 +184475297 +55919720 +3569016586 +570162424 +3645483984 +2680073165 +26631347 +2759227894 +2261525039 +3123000929 +2123345105 +2807120237 +88211791 +534323439 +3356952024 +3578535948 +3514710021 +1147281874 +1642794256 +4156493320 +3492015986 +3083971883 +445791659 +3435156676 +3872671760 +3503298202 +2229409443 +2622798869 +485384169 +1276613261 +2238200749 +1714962630 +1753384838 +858827485 +4112767014 +2492609692 +1813569385 +2908455180 +2136424609 +1291670341 +2293450496 +2907430491 +3584980059 +1105309021 +3777164469 +1644960531 +13372906 +606908191 +826220892 +3734070530 +1563623865 +2168170718 +4292397160 +548975681 +688781593 +2169466311 +2687658513 +471057685 +3267657784 +210969235 +2448006942 +1087586374 +4156865024 +854604747 +2843673815 +2924399201 +171150910 +3711202542 +1467355201 +2921026454 +3384644000 +1981882671 +1387706695 +3242127160 +1865012898 +2861491283 +673721810 +1630584716 +1480114879 +2594344944 +1896561202 +3312823199 +860120749 +4163709458 +2852052760 +2832270355 +3365978342 +1372437279 +1991173218 +296309541 +1945987504 +656832546 +1956945557 +3570127745 +1977454605 +4006550273 +1637640055 +4064770418 +3869745564 +1446712973 +3324864732 +979256624 +1046783993 +1073597361 +891047134 +1211593436 +1004538997 +792134396 +3384110092 +2865649378 +3955146712 +2418699197 +3613047463 +2541607997 +2787742604 +3915939808 +2754488584 +1376624458 +3647255534 +1968350162 +1429933251 +1481557747 +2600769839 +3716914945 +817503873 +2473505009 +3561129331 +2070430726 +1105068884 +2706471618 +3028439162 +3541002739 +3647528873 +1211524245 +1029016153 +1581519948 +1507159205 +1824007778 +3684215473 +3023464197 +1612253742 +1885393340 +1359014101 +293030952 +3281837407 +1859388569 +3097374268 +334947080 +2172844096 +772755286 +867728324 +3913942162 +1881275080 +854148699 +3139186483 +1619329886 +2780802535 +2061436278 +3892532328 +1611440841 +1093575097 +3692694748 +3110433148 +2104314293 +3013455517 +4154566542 +1821152149 +952193953 +433023209 +307818702 +4281411673 +1175322501 +2578773031 +3155887467 +3426052663 +1216275008 +2336289502 +2758710660 +3257578733 +2496437555 +545810576 +2046668900 +4153725031 +1118981735 +3824018270 +2630876496 +267425903 +2605643578 +1492974404 +1998078074 +774914184 +3936426492 +3852838812 +1542303369 +1546945876 +3099601047 +982076956 +2362852822 +2020344151 +462595707 +443666130 +3245669390 +2496864697 +1652891940 +2570684834 +4152182880 +2414537600 +2679197843 +764181002 +854383948 +2465807220 +4051369582 +682958706 +3445087073 +2549787626 +2270009958 +173487432 +1894473054 +4057383802 +2049392008 +3591079640 +486700570 +3751998399 +2626498060 +371568248 +2767175220 +4024087992 +3750877715 +1660451488 +3212238869 +4159277209 +277156865 +1251451699 +3151958293 +2911540869 +4234830293 +2573337225 +1978774056 +1304633247 +601402561 +3287174273 +1230079659 +979978480 +4065306111 +3014721203 +564300671 +3935617897 +4095679201 +4046814497 +137340658 +754654403 +3546243226 +2054036646 +2709769994 +727703295 +3615704907 +2427237638 +1291389485 +274297020 +4196577090 +1835171807 +3386751385 +3684450420 +2299829551 +3939033785 +3090429232 +2803576794 +2790183482 +2494871232 +4066902980 +141784698 +1770982115 +1845283559 +2087894303 +2796853726 +3048831037 +708922001 +186151374 +4274024897 +910465514 +2634469803 +1168244168 +550215306 +1306407080 +1217915311 +1127253281 +2508451526 +3923243937 +2468208228 +3003418764 +3338978489 +870572147 +2056460370 +1445288754 +122956501 +1421090339 +764041657 +241612048 +4039726301 +2728266064 +2507023476 +31532347 +1789848148 +578560753 +1126019922 +2462870144 +3224523764 +2700122753 +1139427567 +4044768082 +2401570319 +1328001874 +1324833342 +3633631487 +359768347 +2720274853 +2278381053 +842147917 +2517835816 +3753855156 +2262786880 +2849162256 +1966345505 +263553095 +2468266773 +3673282049 +3597270103 +1205387150 +2127746826 +470554493 +670180672 +2989633787 +2568551288 +2378425819 +4271959089 +266230698 +4217247872 +240558665 +3367694750 +992262729 +4071897893 +2442331104 +2209522972 +1434947128 +4124743844 +470405951 +396870030 +3466758548 +2674152455 +3938052415 +3704102799 +3939792738 +1353965071 +2934295315 +4090882572 +3188596489 +3685911908 +1269799974 +2874958152 +2349608275 +1355362976 +311274397 +666962354 +2505069688 +1593491337 +3280571543 +1527744265 +2778666960 +2152484092 +2323528341 +3473397617 +3020087826 +3391579712 +4146571034 +1505817167 +2607906133 +3346125001 +3037590231 +1559626210 +3468360694 +3741473766 +2137851034 +2942879013 +23248109 +1073623205 +3358420041 +2854022334 +965950312 +1185256596 +1445109163 +4092423226 +1007103807 +3267138622 +602573686 +3020446573 +1720399420 +1692366178 +3584869942 +2602813965 +131663499 +541698304 +3751706214 +3872075058 +3113805229 +1213874472 +2881570447 +4151636745 +1008943167 +783640374 +1404418778 +1682671080 +1902780420 +3629510145 +3379984268 +3100261913 +1138941498 +1602809344 +3381866881 +402384981 +3605404264 +1367266233 +3181463215 +3620756141 +1437913724 +3843498498 +2564203702 +360643466 +1142194091 +3942213891 +1148035384 +2228994589 +2093225751 +1634211900 +1655432197 +1923958101 +4097601075 +3898393220 +308993854 +721961525 +3124186213 +2362031575 +375731460 +3966721761 +3718293763 +1171897429 +3710507261 +3114615733 +1946985595 +177275178 +861861903 +3371261688 +4041751788 +3039393273 +4121260996 +2289531001 +174700958 +4087639394 +2735262987 +3215877803 +3613388628 +1966572291 +3792918480 +244878396 +3218645380 +754894783 +1261140711 +4264682706 +1100353681 +1441065159 +1453458262 +2511177090 +3702863984 +2387047911 +2611044319 +1993748348 +3927307949 +1590107022 +658426047 +2570619129 +2227980851 +3623868971 +105279934 +189468704 +1612890601 +2818035717 +3916580384 +671470069 +3052497283 +1315291374 +1360981417 +2699364084 +1733865390 +1755341687 +1304767992 +3777229927 +1375498966 +2974447258 +2397283197 +2999446348 +144906261 +470070028 +4136113455 +2409571331 +338421568 +2201326980 +4228081527 +929560365 +2775657038 +80014420 +2043495683 +3235610453 +1649900027 +3050133454 +2926348587 +4069165132 +2536325093 +19831289 +1850469454 +2921680041 +1275915715 +1273229424 +3392647837 +2857917714 +24842250 +3736749153 +3567846459 +3257828436 +427993865 +558147424 +3861973139 +1831710008 +150813685 +3296247873 +1461405654 +2699522022 +3821943944 +839864221 +485187878 +3319152816 +223593807 +4264988866 +3692619460 +691758496 +1935167383 +730993324 +2519602125 +2920809803 +3045343169 +2227808975 +386624615 +3915623995 +2102413578 +3762769953 +1792231769 +3206925544 +3672312040 +2023248949 +1963953910 +3719055610 +1628719495 +1418877837 +197812952 +248907369 +3501811946 +2281612661 +794882810 +2829943435 +3068529545 +3080685645 +2512464480 +1940407336 +3959054392 +491514841 +768044838 +416300930 +222176011 +2829504511 +901680384 +292663517 +2742014071 +2327313310 +3095310539 +1398750829 +2320734034 +1762981010 +453565081 +1462042789 +2632068315 +1047829942 +1786192057 +4069364041 +1521488837 +3844231954 +3477463895 +4205853317 +2404834356 +1801658122 +886370584 +699952471 +4201335961 +691104572 +3755519970 +50630607 +2236400995 +2786195822 +1772597419 +3341382857 +58509635 +3955523087 +2013129092 +2239260567 +984028677 +3812191362 +398183532 +3654722091 +1399895329 +686153960 +2278797514 +772603218 +2152795469 +501287009 +3575033813 +3719047607 +2580019475 +53507173 +505958146 +1008525748 +2878838748 +3375679614 +3507862399 +1669546474 +3285269386 +3011596460 +432615160 +2070612030 +2070164418 +595937647 +2928722424 +341992372 +817523656 +641676438 +4028850059 +856884316 +3830595959 +424693890 +1130400632 +2917765710 +1629172119 +2805615652 +1700229531 +904128598 +1270543135 +494036677 +830378175 +866931866 +4038894236 +345402821 +903538750 +1001434345 +391535399 +2332669182 +907731168 +1207184226 +4266473092 +3140335694 +575597168 +277119917 +3996016202 +1669610346 +3598670612 +2460872460 +3691778351 +4128495224 +246733852 +1328598150 +3624405902 +1217829566 +2584178790 +2288998810 +1213225404 +2887685375 +3570841539 +1553439421 +2695006807 +3321519701 +4036252964 +4062443821 +164965095 +1422323226 +2064285214 +2797157136 +234014468 +169752699 +3439369177 +3307684558 +2052323357 +1429343711 +2135832763 +499467634 +1594035225 +2317881813 +67550070 +4159813944 +146875418 +4285351036 +2297348022 +2243007728 +900978778 +1065473476 +4155123644 +3719687262 +225581423 +1393899558 +1761346562 +2926870573 +1435078274 +2553618067 +2794070620 +1335454193 +2163709097 +1573576767 +2249951109 +2308756741 +792371558 +1819874705 +548256079 +2761106588 +3762866164 +1139820483 +175280071 +3119086339 +2981572164 +1406695601 +4153267403 +2376966968 +847214332 +2139346177 +274350833 +3384158216 +1863847624 +1792186229 +2969513746 +3296789565 +3177920517 +2739945238 +2411870077 +747879868 +704921443 +1400362607 +4026700035 +3134323001 +1423789674 +3365256413 +1762597826 +771888853 +3819937540 +409079612 +1929360270 +1387015226 +166094003 +2759229823 +633839437 +2999436168 +169357604 +2427842389 +3135340002 +848167754 +3131286639 +3744355051 +3987312719 +1627871183 +909167846 +3931666542 +1684997505 +2806440574 +1583915131 +1993885576 +109056930 +3950884874 +480201748 +1740318256 +1554441141 +1660257049 +1961834546 +1532463286 +3907306685 +2841330771 +1971560966 +1167751848 +3069785364 +885518343 +1301179316 +3348388977 +4009193510 +1249309945 +3962921038 +1810525691 +2966503831 +2506661804 +525218231 +2405698419 +2251773924 +1948252809 +3093464939 +407791362 +4085708687 +3168921635 +1994539588 +528891546 +1084825364 +3150906790 +2560974722 +1880220567 +3999291482 +2378918158 +905577971 +2217598803 +136646834 +3150974588 +3210313521 +3389345744 +3383895908 +1916336043 +653777550 +3976806878 +1766127812 +3999815648 +1365264550 +4014135018 +4068217396 +2604206744 +3916394140 +437480505 +3384009398 +2248035263 +1769311349 +3429385129 +306412587 +2998615580 +2286458847 +3223266971 +2476010328 +2766876892 +2531202687 +1729238936 +3321746198 +944757140 +639336916 +459301833 +2446704179 +2952041737 +2907980999 +3523375679 +506154016 +2492335521 +2607341030 +2849708633 +2303185621 +750569464 +2731275754 +3626550114 +1886981344 +1099134477 +4115412252 +644733239 +3474088094 +2193657805 +3201269035 +2960349066 +1698045205 +2233767806 +2647210622 +3911988913 +2793669745 +4283781817 +2480036741 +615547028 +1334727725 +4037338298 +2513472386 +2504123283 +1903407654 +1256927168 +3471488955 +4201845606 +3117047000 +922805618 +1653444965 +3549357281 +4209619995 +4071647920 +3205892514 +324662494 +1884848951 +1621603554 +138007769 +1502278509 +260735980 +3998350220 +1059177244 +677409991 +2969000694 +2479165426 +2960941622 +2975074932 +744762654 +3009666286 +3744577312 +1330183089 +1567765974 +224300623 +2639017300 +2113952010 +2672658182 +3744690261 +2986925709 +1536960483 +55773142 +3860419250 +457108461 +1155627921 +1568734095 +1143774252 +3611876121 +1107759814 +1610743983 +1049240805 +298755234 +4007319098 +2575686673 +3039172936 +3688985575 +2339575673 +3366541049 +1426291423 +2690230255 +3590783580 +1055827381 +2913403844 +2844316753 +4008559450 +834802635 +3666236285 +2403960684 +546637404 +3040416358 +253154946 +1540986965 +3316539574 +3108915919 +4104801347 +1651074354 +2660725154 +1884935144 +2520824217 +1686675117 +2860521650 +3295902022 +1822388903 +1632810905 +649542703 +3738541691 +3807785900 +499298267 +2638716814 +1807461395 +2452557680 +2682854025 +3280822836 +2554885316 +51269602 +2561639275 +344950865 +2176985195 +1202825494 +2545256386 +521887502 +2563672092 +43963600 +3250059572 +624736253 +3109674812 +2410906299 +778625326 +3447814888 +1878468384 +3102129735 +3707423690 +1932202808 +3065273716 +1596731905 +2922239027 +2918102787 +798627060 +1685713865 +819012978 +2143213810 +2596745513 +2753302410 +4009465126 +80186494 +773588966 +715908176 +2965239453 +720399814 +923810075 +1145589296 +2722322392 +1699906890 +123608378 +3166122737 +615883205 +148739267 +1926714324 +3155249599 +1680798293 +1279818842 +1570771312 +3725763179 +3303685952 +1030212883 +568556639 +1214881978 +914556781 +360608830 +3628345500 +1313489844 +2364033821 +4222858058 +1879769799 +1020680605 +874109449 +3410982362 +2127516828 +339614314 +1727820608 +3512564065 +1192069705 +3189103098 +798894535 +2177391865 +1341676468 +1079835605 +1464466316 +975608160 +3758322670 +1399947725 +1291771137 +1633877958 +3159266076 +2432999129 +1022965105 +2687406690 +2102786389 +3558810274 +1319095569 +772911475 +3277222941 +682608448 +1715213010 +3000201276 +2715767322 +4290706770 +1985327316 +506782410 +2243223045 +1577502743 +1853640161 +3993901720 +3837622018 +3033737621 +1302233988 +2051958329 +1096635506 +3713038310 +438503288 +2877527110 +1260543426 +3982059883 +2185877044 +3887263019 +1679716317 +1488576184 +1732936344 +3075387788 +1597370706 +2749213315 +807435276 +1173746287 +1827009208 +2164557818 +2767886436 +4068953437 +2856616356 +2397965379 +4211426433 +1649454307 +527061198 +3146918651 +2085419143 +236515453 +1992933999 +1805575440 +897249901 +2813457278 +671407004 +1920923845 +2843560549 +2547137115 +1983466037 +2263151953 +3289867087 +340248636 +3497826996 +726776468 +3599476648 +2590133157 +268983445 +1730244864 +2163880915 +2092372199 +3904408839 +1590211460 +2719324194 +2730839358 +3212405792 +1852881611 +3101418078 +196673813 +1543914652 +3279073009 +833398976 +3733211770 +4012427994 +3925508180 +1373622942 +644264694 +251518656 +541568489 +3018156949 +3200938006 +3694631648 +3327070306 +2593787462 +3686646538 +170088582 +288561353 +4126847469 +3209632834 +950570746 +2241890606 +3831779621 +1653642427 +3181897580 +926945998 +3199363031 +1578174352 +2444756860 +2048088656 +3652991092 +67131407 +1702660007 +3088165813 +237284044 +2719011128 +3637439776 +1419100627 +3374590094 +197594648 +63662492 +1443467840 +2956321556 +157739889 +2466282256 +4283967507 +4076666508 +35700692 +3694567122 +2382370500 +1138317121 +44009393 +352656982 +658946362 +2800932490 +2301865253 +1030631984 +1759622493 +1571375197 +3054844917 +3449221336 +3951467635 +338252185 +2648491392 +3299243305 +3753486439 +962717790 +685547295 +1632251121 +3881457132 +2887236202 +3430547458 +2175288374 +1572072075 +3306321350 +3861574167 +3766336878 +4142258373 +3442448098 +3143484218 +3082927955 +3023393627 +1549198969 +4103250483 +3256860978 +3800818809 +1661007772 +656563095 +868700600 +3288490853 +478213134 +3209269293 +788120283 +3077053865 +3825265284 +2182973811 +1662983925 +1801752201 +26791657 +3365397388 +241851250 +2620805852 +694539708 +1653153635 +2812434800 +2359141945 +125674616 +855711883 +1336519713 +3348106744 +1595462037 +3284510793 +1674760799 +2439708578 +1809421451 +3222052690 +3306867196 +977949100 +841429810 +1590267617 +2783955612 +77945539 +1003591641 +1825990991 +442959771 +1916728696 +1248697425 +389230793 +4144910834 +2341165654 +2142041955 +478919238 +3013180380 +2859179975 +481260431 +1105421996 +656838657 +2158982492 +551035602 +1234420985 +503048104 +1937155211 +2086632092 +1519131157 +3603747405 +159140106 +1948628308 +1151478111 +162106146 +181043594 +2483041917 +1621243024 +3134002432 +2143165421 +2622353117 +2474299847 +1218813711 +998452492 +2235283968 +1034124218 +3508541662 +4178285723 +2680115275 +2701526443 +92382306 +966354387 +2609080410 +3024655873 +84342502 +2798260510 +283824737 +2374459061 +624471827 +4048367539 +4195546646 +3932364905 +1261389886 +1002459781 +833215715 +1686557422 +1216683998 +1879095887 +3824987789 +318962036 +2375923253 +3033288614 +2266241350 +887898622 +4287368804 +1442751712 +1675281163 +2930114567 +537614937 +913849197 +1266763323 +1536289090 +1643369079 +1447799037 +827796415 +3447100440 +719361828 +1109557603 +1258432224 +3707056309 +1477202879 +1776874786 +2747617662 +1753505578 +1750808227 +2840696399 +235463450 +719498098 +2439620622 +2837090534 +2651022742 +2934372871 +4158337802 +4117478627 +1555406532 +3399988761 +466166456 +2050462991 +3072045581 +203430715 +791190365 +2863244957 +1054412800 +1032263742 +2074840111 +1763090541 +2324785723 +779652445 +411984835 +1615153603 +1871775799 +3984824999 +915884739 +2591143499 +1834502354 +3201194017 +2992947464 +2592623222 +48856045 +1748643565 +1718439557 +3278648135 +2969747011 +2909078391 +821548267 +1959158241 +3496145820 +256392731 +514015502 +3723266940 +2249808416 +543973730 +2834964828 +2809896384 +3505688796 +3523788767 +2758218594 +2984451798 +1150582896 +3338748462 +821555019 +1815534247 +728659016 +3360622499 +2412060412 +3849257226 +351182684 +1113385464 +2903745976 +2945310049 +1243770958 +1433993934 +782068978 +3319766386 +3647305542 +3389009242 +837062341 +3683115815 +1133868342 +3135500262 +1876816664 +4257651952 +4177719142 +1287871961 +245256347 +1917493601 +3027394507 +298699293 +1854440193 +1867404973 +1069425219 +2584166452 +334065044 +4158780072 +1830501978 +1988370201 +775177181 +378380969 +3133904529 +3758462552 +3345153864 +643668626 +364179828 +1650115971 +3824072386 +3386737093 +2269429880 +3197323550 +3942698478 +4001485704 +3224950766 +3878972804 +1600902226 +3087135079 +1505665629 +123538287 +1476741964 +1775406760 +2103939870 +3852963723 +1965526392 +1411652869 +2446818701 +1566733696 +2042018240 +3743234746 +1229991696 +1742927829 +546984314 +4106496186 +1648490415 +1743651945 +652687729 +1900225291 +1970243867 +1500645413 +2431100059 +493019650 +2721423144 +2319748424 +4170840639 +3805433757 +55444559 +3450181876 +22867805 +517928550 +1942236824 +2663855982 +1403907171 +3859265103 +872434497 +1788633419 +454964070 +1553797047 +2553561625 +170976683 +2260097774 +2858208150 +1282815564 +3146992297 +273244713 +2424260077 +463055377 +2219405550 +2459790983 +2017006520 +1054677047 +2470156200 +2992439679 +670854247 +407674571 +3922802001 +3748932126 +1645378292 +72468643 +2700981147 +120450702 +1788012633 +613241357 +1322174989 +79606609 +2632538737 +978448324 +2097769499 +52071510 +2492306486 +2817299439 +4036001759 +1834620402 +254560633 +3149461489 +2253940807 +2054319722 +3866384156 +2515177812 +3741843940 +379443000 +3670014891 +473140852 +3686184327 +3237528277 +1292251127 +4061489990 +600720888 +3766591403 +3141023061 +2788673250 +831095843 +262665603 +284157663 +2400273477 +3516479898 +2045058004 +1518276144 +1727166930 +903233542 +354796925 +1567017596 +197748733 +568258323 +1885844144 +3935034263 +1245216402 +2808587953 +1472848169 +3446022915 +3191790231 +1598106825 +3807560949 +1551121914 +49645341 +1194518025 +2077852323 +1786231580 +472100519 +231752931 +124872923 +2635865334 +1641041562 +2273484735 +689587565 +1500900944 +2204056037 +1835273725 +1245560216 +1478542236 +3757959992 +3102822701 +1112552933 +3746457492 +3123967336 +1406069431 +745021872 +388279378 +3709682039 +981366839 +1255760261 +4224408163 +3389630259 +1327720324 +1194491293 +2398036653 +2150477684 +1201029175 +1599573036 +605744481 +3439197995 +393396348 +851807658 +95838154 +3865952399 +1096804435 +1018190819 +96197668 +3053804192 +3935957725 +4211590952 +2926310595 +575244987 +909915498 +3092977774 +3407279319 +3662904054 +4240896216 +220927942 +1495944958 +2981616018 +1116740881 +2582861967 +1383228993 +3662498370 +65475721 +2928952365 +1905814885 +1349437877 +144983799 +2855118836 +915833273 +369622259 +4204799570 +2998276546 +3033687783 +811359680 +3841683363 +2381066688 +4028236456 +3770620416 +256182528 +2795575515 +2903480278 +1529911630 +993577164 +435662642 +2517996151 +1543922788 +1147285920 +1076234116 +2051730554 +1215438082 +3444935249 +4121078650 +829069624 +868385071 +2945394298 +1797129065 +4034954356 +1570917290 +1854979035 +4001922332 +4168293362 +209459969 +2617548115 +3967049676 +2620178198 +989592173 +2225398807 +1671630531 +4155538682 +2458684192 +2761616383 +4075545909 +1322596069 +2292887746 +2945156173 +4047491733 +2546495538 +1237851358 +3123792008 +3525017394 +2110390220 +2691649843 +2021819407 +2041880536 +3707761061 +2519938575 +78121254 +304356871 +4085792938 +2317940338 +865274083 +4160263599 +3009138239 +4065448362 +2031965270 +599435867 +603581293 +2704471330 +1379505095 +1821196348 +1910167935 +2262696355 +3521440641 +2199919742 +98184272 +1604263120 +4261375099 +2510234969 +1515751574 +13745221 +3499394596 +652562410 +585486630 +446520428 +3836151236 +4294281896 +1725135018 +361307122 +3629101533 +298345779 +819634850 +395490251 +1684594468 +2991198322 +1299860423 +2400749917 +2788842001 +3879079256 +2990398966 +3599775032 +3404878074 +1596353028 +1445690733 +2078858781 +4122290870 +3707874714 +3715685186 +4116805136 +1486620275 +2834102387 +2735255585 +4169571999 +3752058429 +4223253776 +2848400580 +1218396637 +231932827 +94789194 +343786271 +4015143673 +1740268134 +3349843637 +2639872303 +488110907 +4043839126 +339387411 +3364986452 +3010864257 +3693804751 +2262003237 +2910559408 +4181445140 +3788644553 +4000248835 +2118764066 +854545045 +3563084692 +3821251001 +161951279 +1773744402 +1569727571 +2543756833 +1451800784 +65477263 +3087896657 +780874765 +1298812615 +2992186756 +2485679167 +766572277 +2758183080 +488966224 +3049608379 +3534708829 +2743219557 +1343004394 +909182177 +753985870 +3345294009 +26767515 +1147052559 +1388086011 +3729540728 +3449232046 +1380468318 +4173118545 +3435625626 +3407378264 +4105380779 +3011488106 +3089689845 +2885498281 +2381146059 +270413281 +134707524 +1329881647 +238593445 +1458614190 +2513620733 +1736448414 +3945089880 +2780196324 +985230533 +2285646250 +3234179035 +559033063 +946182983 +3562668557 +3744637568 +3461407930 +3434878695 +3819539065 +2611038102 +2648075273 +852758117 +1847062821 +3083045952 +1478553139 +879160689 +837700915 +1618236078 +3456019277 +728577417 +1310818427 +3514927012 +2319092737 +658511438 +2584758139 +3962456937 +4270158328 +3056934870 +1612425829 +590671575 +3010874718 +543889921 +1970197971 +4220835205 +769801237 +3832197662 +2257056552 +2274749301 +1414799881 +1146243882 +2708339466 +3619510588 +3420727097 +1375798261 +804087596 +2276015669 +3528651836 +3487987312 +1018165038 +1123724044 +4069702222 +3444871581 +2686058854 +2457858194 +1006184172 +2641509428 +2875405650 +2630953735 +3868159738 +1956916930 +2464815637 +951369856 +2068022387 +1537969066 +2800080238 +1192960213 +2132520725 +2695698491 +1734878167 +3899445778 +1962751300 +3454586336 +2567885207 +3656593032 +1957368630 +3877652359 +3785908156 +1772052328 +4190980222 +4215084395 +1024698247 +496929702 +1736944082 +3073900412 +1240447257 +3573646834 +3400230580 +3704308460 +1883459499 +1760849666 +1395016747 +2251461136 +150437268 +1937103230 +1208610672 +4162258932 +4257734319 +10963557 +351111772 +3284152198 +819951611 +3615881205 +4192719529 +2506270783 +4258359001 +1109086558 +3052153284 +141089483 +2454261304 +1144733638 +1356345384 +2483662214 +2572096606 +229540442 +3325230785 +2479906031 +2268380018 +1609074359 +1631863769 +1285391271 +1367817582 +3245241686 +823442139 +396466534 +2372001762 +109175575 +1517683879 +3595241810 +2239144168 +2264215569 +3272209110 +3536821219 +1714410971 +3660098274 +3774903498 +1248500949 +4003655591 +3687466326 +1820409395 +30078210 +2329829262 +1171881379 +4186322216 +3621550501 +3335043469 +531139276 +514335741 +290044163 +2586507793 +3195500948 +3934077537 +226489797 +222603079 +351469267 +3789849818 +3625755057 +1155147875 +1247813820 +809189184 +1810447784 +3628962582 +686924196 +893097539 +1540012496 +3655602477 +2550243731 +665130797 +197748171 +3202562671 +3918943268 +240032016 +3428124387 +3898274809 +2523258545 +2895140276 +2499734529 +1781420860 +2600227311 +3137219352 +2688063189 +2943292043 +1258994715 +47769127 +2875766116 +2734820528 +3324466539 +1912017340 +885296714 +1127070691 +1783336528 +2391670457 +4132808382 +3498854516 +2332679572 +3220547811 +168302288 +1885905225 +3599476462 +4131117349 +2090102700 +737482793 +3180102374 +3092150171 +1737947685 +1782468883 +1345221267 +2665629737 +1258576809 +2119724266 +4029756360 +1917224070 +518426643 +3070885569 +358092731 +1682026286 +1804592555 +3267108219 +711302603 +804689741 +3345112401 +1962418203 +3521422497 +3278805835 +2164102715 +1101674741 +2703137242 +2079090006 +4025673859 +638355283 +2529125809 +2810124306 +859996550 +1321175724 +712193062 +4264949075 +3142462298 +3247172194 +3738862591 +998482784 +2624576663 +3067484061 +4126916646 +966712866 +3479746791 +3269930108 +4180691394 +2925555620 +1301109553 +3649741613 +1752017404 +2363830160 +2637856174 +1954170683 +3805214709 +3156207834 +832001090 +3937149541 +4291398941 +2940176733 +3697455916 +2295814519 +3379094204 +1881728215 +3016069802 +1952612599 +2640078783 +3996954217 +3866472729 +3931562966 +4124387380 +3336910198 +1359663637 +4012837621 +316904301 +1694359157 +3330648340 +1969669827 +1082545891 +1212392844 +1619691183 +605136612 +2741503819 +283847506 +3860124891 +3856164890 +732036996 +1680867265 +3419613702 +3691727594 +2751385249 +728924498 +2361297747 +2780810914 +3695239340 +1643637576 +2559906896 +2338380260 +798271641 +1121966375 +3989778421 +3896778151 +4096333130 +563325772 +754459823 +3889987854 +1059942512 +3284847080 +1661781578 +3246802908 +4166173821 +1230736653 +958511377 +1194380382 +3346425446 +3804356409 +2588615040 +4038512484 +1856399429 +2253928947 +1549206198 +486809425 +1649741602 +1569525118 +966500545 +1542776371 +2349046083 +3552548020 +3837766470 +2413770820 +1429318595 +11557086 +3018583776 +2895113022 +1643519305 +733652305 +2021009997 +704873546 +3092080909 +3405821076 +1501082764 +1375874692 +36542029 +2416449107 +1859335237 +2964962422 +1568354776 +4224144972 +2888837905 +686229325 +3031313884 +3667658206 +3548914840 +3541465116 +2182335952 +1341136669 +449066197 +3966047380 +856158005 +2698593431 +3461552542 +3541366720 +1878827193 +3915985183 +3559290789 +1658765801 +589817872 +243908067 +3298048613 +4123950457 +660481432 +2362196520 +3410621348 +3098974877 +367504366 +292594958 +4207621783 +744655267 +2715120155 +2065263479 +2739378508 +388107582 +3769819776 +3759937532 +3406474790 +3402045473 +257033428 +2342279297 +1873188564 +1929951469 +1811516798 +1319276272 +808057792 +4074359570 +2982713435 +92864282 +1508098719 +1824631498 +2899427013 +404479788 +926989383 +285761596 +2991293270 +334694310 +763894363 +4278789320 +4122301749 +2242705093 +4250398635 +3833832696 +122944747 +4118471754 +3308944293 +1181604213 +1294343949 +1762465339 +2616080490 +1239203686 +1506244464 +3019208454 +10807747 +2166991794 +885465649 +3752190212 +3019865647 +459484536 +932635066 +3883006359 +2118144226 +2137298794 +3095494112 +2113183664 +1045980344 +91993740 +3506595077 +3716819624 +2577068693 +3301956001 +1822931595 +2819869514 +2451984347 +1952737782 +1410310780 +3041952952 +916988991 +2945472366 +938134697 +2740070797 +2974503883 +2341895596 +1024357687 +3676730018 +1885333762 +2472922901 +4244445722 +3472388292 +3784341789 +1456822940 +2764745696 +2550588471 +3398960968 +3547753869 +2700214033 +683697050 +1801427466 +3570813845 +4111784544 +1806521032 +3632365618 +3489950367 +340272937 +3091305932 +2863679261 +2705608024 +15126401 +1209457024 +3046402224 +3804646583 +1528203242 +347084410 +1347975381 +2849372561 +3287754712 +3072457598 +2206631972 +2993291715 +3591881306 +2794376307 +18381699 +282970258 +3367457305 +1232237061 +945206474 +3548343382 +836901379 +182461986 +2760751071 +1830300599 +3587632922 +1164216699 +3380755306 +2063778524 +175607258 +584217878 +2249625759 +2480514040 +3152034025 +907123748 +955707581 +2458030365 +1097449742 +1558991868 +1393476587 +1943854714 +395790290 +2430554979 +3943424950 +888133156 +1176872678 +345948497 +1619291922 +520036162 +3446213714 +1952074363 +4209895640 +905965310 +1623957641 +2845333348 +3402650296 +3680915622 +1206160145 +664048774 +2912375336 +1958994175 +3677030249 +1022433847 +204057499 +2396937264 +1434610921 +2500625723 +3541403715 +3590607382 +243197298 +2932205847 +870256854 +342047030 +3094508791 +1338428459 +3375752043 +4014664545 +2565850544 +3254238906 +824173767 +2701308354 +1454864343 +3038794083 +3330296772 +3863878012 +4225225763 +640457659 +4172376004 +2323474544 +683650805 +3145762123 +815319452 +661099019 +1814707822 +3795187312 +2169288533 +2922970273 +492054313 +2014158462 +1855636047 +853763311 +1762586289 +521745688 +4071450826 +3972224015 +4079468579 +1304689255 +1103753456 +2606399787 +2360559637 +1529384362 +931524020 +1994594017 +837781387 +1051330149 +265166895 +3984925625 +472394965 +2134965839 +454389019 +2724228621 +973272074 +451977342 +1051420720 +196213113 +4062637957 +3851742332 +123954643 +200599028 +556301097 +276143995 +1395443327 +2656185602 +4040628262 +2625845303 +1723582005 +641889014 +2669355989 +3687735370 +2507194322 +3735328333 +650171469 +2398608830 +1539812652 +653319928 +3306748882 +3113751748 +1587271036 +4125215791 +4250287901 +3209493733 +3776036636 +4263694660 +4281145802 +636475168 +179950091 +137196948 +2527509687 +3729006287 +2544375904 +3776754948 +2465099821 +3558099060 +1775633647 +3981058696 +1897576332 +4142497294 +562791740 +1985327740 +4029575459 +1004767756 +451327156 +2814971139 +1112089123 +2066948259 +2079601963 +3325137130 +2838092618 +3110306354 +536832631 +2904571030 +3077175340 +2695514371 +571323012 +3735340601 +31257966 +154731662 +2675860899 +4262773151 +2974044673 +1380515111 +652599593 +1341004774 +2085600278 +3817149930 +1068599132 +4221595421 +2478344767 +3694230362 +4091487184 +3052317655 +4116356942 +579032335 +2616744164 +2271350138 +64662487 +1051803401 +2698529185 +603941505 +1319747342 +2776398063 +2662144907 +2424138111 +1171671643 +123631578 +1543221619 +56123453 +4196021482 +2919788179 +2743599734 +2944673578 +3206746068 +2342336751 +1364483132 +4073276907 +3691443268 +725797652 +808486002 +3042937744 +677564878 +4282486070 +1663573915 +3787451410 +3931125943 +2648260619 +3480704228 +2810313729 +1213248821 +290692835 +3604592401 +3803814113 +985783682 +2914840643 +1389255693 +661663029 +2240118687 +2641560974 +2672153109 +1853204289 +985673810 +1608058939 +777199183 +3131177704 +1125126416 +1252581112 +4293010637 +2538336145 +2226345307 +1662185626 +24288085 +3060486396 +1150486001 +1351868691 +934574484 +3089038925 +2064484067 +3286333880 +1685229018 +1525352720 +2362647638 +1395515680 +3353794513 +1748986356 +606889365 +1256084510 +3741850750 +4260154407 +3061775897 +2061539041 +1970226575 +17847713 +2499131540 +4241341319 +4141002911 +1456421978 +2631977731 +3052439140 +2881493668 +558969860 +3584160909 +3605361629 +3705166886 +3905673725 +279955426 +1497743921 +1570900921 +3439580832 +3190017776 +1243127829 +1695733477 +1267920050 +2919004174 +3199302962 +1835325384 +2894434775 +3144605505 +2996835818 +2971848961 +2556711219 +3706032952 +3941126636 +4277644751 +2826419800 +473236094 +3614314867 +400217228 +2907213852 +3752324681 +1598626513 +2813483000 +1263084707 +1604477357 +3864757196 +1561602374 +3405550869 +2397630736 +384606122 +3597952753 +2708326482 +3573717011 +1102100535 +852495735 +1931815938 +1133671877 +2395677867 +3427177999 +2096102782 +1246561199 +395847051 +3707216025 +2925426964 +1348635023 +4160652201 +863657273 +2117243691 +2331982192 +3557643009 +301795167 +3996837091 +1247781318 +3052193983 +1787709485 +3703154395 +1726443623 +239308713 +1117798220 +3855938570 +2571778338 +3075999321 +1417608366 +3711479138 +4041229114 +2549113603 +588226816 +2491841675 +4044210618 +3370683629 +3348846321 +3125377211 +3478192639 +2383575137 +4182442467 +3595661847 +2923241925 +3865287934 +1771371453 +1318900529 +84778919 +2428683187 +585039342 +1762637600 +1518263356 +367640895 +2590765974 +3223422014 +2898866683 +1439541012 +3680180316 +2439411957 +943664117 +2742781779 +2552673255 +1387464723 +395325780 +2102101122 +258625467 +3530902028 +2534413277 +1729507511 +377648719 +3021734570 +3594480540 +1054626878 +3591821362 +1463438109 +580173800 +3303745157 +1108473885 +110580844 +3616967033 +1377019477 +2668958063 +2163047709 +843264730 +1550363594 +2494173526 +2653089816 +778197618 +1641015717 +3222101437 +3419287589 +787513237 +174118414 +1146460830 +939442382 +717634921 +4177157528 +3333764941 +3446677759 +2709969464 +3270347484 +1983335714 +2474534644 +261471183 +1049904285 +2280324469 +2509265852 +2259113922 +1411686953 +986469257 +2276128147 +1435642735 +3237098031 +3427633298 +2015222338 +1284041683 +1930231579 +1865259246 +1371566491 +4188695207 +1232019619 +1447005562 +3709162638 +1044212245 +629974142 +2935212768 +2177971999 +3501508497 +3816632707 +167026756 +960663486 +788172673 +2643123243 +3280052074 +3975803689 +2677153423 +3658539685 +3155254855 +1146821255 +3210173904 +3888739856 +802434673 +2105598946 +3769278854 +2012413271 +1914786832 +3328088454 +2306953593 +241069268 +1046184027 +2311073699 +1033846270 +934163071 +3236822919 +1668033056 +837532373 +3698865697 +622957689 +2684191834 +3734367050 +2212567311 +1872212979 +1852025337 +2900404942 +245345478 +1049677959 +1260916011 +672969623 +1698823136 +3820128110 +2497638545 +1864813284 +2831233329 +2198449531 +102006735 +1671655474 +4226889978 +2414999375 +2681107610 +1608621138 +1244301521 +3536509669 +2883920606 +3057077086 +3741938790 +1953875356 +4265368531 +1196715276 +1639474117 +1248651783 +1621849488 +3411594762 +2598553856 +947888090 +3604054490 +430531376 +1922663402 +2296532110 +683994223 +4233894801 +2141319764 +1044040895 +886699947 +435430390 +1972498813 +3065264738 +1917709274 +1235741883 +1354383589 +3602552861 +2298973781 +2522781998 +1765681847 +1070898197 +937862861 +688761550 +1958122556 +2125508224 +1804813926 +246283886 +2564258832 +3641545230 +1328065804 +2470008303 +2596302825 +3695793515 +319884096 +2223599215 +3086566654 +3308301577 +4092691549 +3146380496 +3352503334 +3030149854 +479441423 +441866974 +1776986894 +3991429960 +3077625916 +1971805609 +3323456369 +2252704033 +1246779463 +510001472 +2162169152 +3639350778 +1197107504 +1592006963 +1644404320 +1315798065 +722154892 +3419475956 +1291696188 +2968179802 +3146957152 +1889587806 +2434969494 +2952770036 +381657704 +3411630652 +3274854465 +4279151049 +1150408166 +2166829414 +183274469 +2416256160 +2866568016 +1079771140 +3501695404 +4148118187 +1361347161 +96993274 +2957854565 +1538803025 +677526703 +641166308 +503194777 +2982510670 +3727578209 +981417697 +1148027896 +864617257 +3069005735 +930737385 +261254987 +3738051080 +2858081239 +768655991 +2972084498 +3847154814 +3559567471 +633828742 +2021418025 +1754566518 +1060153835 +2072339500 +584360254 +790487912 +3321311320 +1391684712 +2970163239 +3396225686 +515933229 +3037722105 +2730060093 +120026292 +2391458649 +1805540147 +2687587983 +1021004792 +3450078410 +1874014775 +1889367237 +3950150301 +3152952675 +3121985580 +3233889066 +1038164847 +2544609187 +996134944 +405141290 +422869125 +1838231589 +1116993526 +3790910103 +4264028456 +2624542069 +2773812519 +2627315723 +257178808 +1259668283 +551199491 +183253768 +2942743611 +2358225055 +238300150 +1062803075 +1866693683 +1183105517 +4211597526 +1856362420 +1877807078 +1434482543 +2727270450 +3537781191 +3022932388 +819498436 +1031330522 +1163388970 +2092733338 +2970713307 +3932531684 +1788035745 +573740139 +2945867574 +277357466 +4178813937 +410089761 +1196330741 +2116555845 +4117153848 +2919958557 +2786695687 +3521209021 +3049779546 +236174421 +1263504654 +287844746 +2927179363 +3279038988 +1747613069 +1593608984 +3914829922 +724602372 +3441793984 +3744880936 +2547566650 +3318447028 +210561073 +1096086036 +627168971 +3906215910 +2470509663 +2321523502 +1933246637 +4058104404 +3784248276 +3713938177 +3114180626 +229907393 +2900501548 +3285672443 +2492688541 +3443590815 +843088850 +3944856501 +2330787730 +2866381346 +787574199 +2203097517 +1557626465 +1894664759 +1354174403 +1479760301 +568685491 +3592509456 +2935941196 +2605212130 +557858468 +1498246600 +302601281 +2375413273 +3348300277 +793819632 +2519713248 +2981095362 +1508182841 +2042544879 +2224430900 +3013944476 +1883884147 +1987440897 +2390439343 +3827138188 +4189487396 +58899219 +3948080519 +3109708693 +455261541 +3747991267 +1405519381 +812604194 +2196980894 +572488488 +1985251889 +1265654529 +2257696906 +1404495058 +2651831778 +203904465 +3028043784 +54780690 +2626144822 +2241713960 +1018010761 +2480397584 +490914452 +2726298052 +834384063 +1523120987 +1787260736 +2803421584 +1906154209 +480733501 +2862108922 +4079464268 +3104170119 +789449112 +2024386141 +156222844 +3232951640 +860409425 +3215150239 +4024962969 +3957656888 +728697706 +3271022800 +599258806 +265708937 +3478476363 +2085932934 +1832401980 +3303125768 +1796451446 +1329686473 +1171695663 +2327378552 +1560765158 +2109657 +3032935335 +3212603364 +1214688002 +746651450 +4052814726 +1750975520 +3490193379 +3544462217 +779277796 +1757208369 +135549751 +492097478 +4208536118 +4254592940 +2508516026 +2245814495 +3004620107 +1627686418 +761887047 +3837672811 +159641903 +1501882730 +28085387 +3113110341 +4154314739 +38098554 +3276654015 +3935087332 +2107389136 +979169501 +1002232323 +386216798 +1673253096 +1928110293 +1356531572 +40277280 +1109285422 +4216847698 +3264700257 +2721391559 +3829326132 +1471903166 +3992716128 +4103354648 +2576780435 +1490595478 +832555057 +537908224 +808949601 +2785567080 +3992006068 +2093107365 +319002818 +821349809 +3553112523 +965760284 +2514247556 +588215323 +1246584559 +2625493017 +87383086 +2213512084 +1605298536 +438938258 +3663592459 +3405073525 +3552797694 +709611584 +2079435111 +4129660334 +3269953523 +109448074 +2861078707 +1404650684 +2731591342 +1984594192 +1268482942 +1977517734 +3435054765 +657904320 +1716625862 +981462712 +1087726130 +2279055666 +740294506 +3994871458 +3151904524 +1234839544 +1172507204 +48608198 +3349830773 +443320424 +1381099501 +3787280298 +1752815286 +18080386 +1941949254 +3563994607 +3354815920 +3819848831 +3877545826 +2622068192 +2857977722 +2827785081 +143948207 +1164659340 +1999634270 +317403055 +3803991892 +1241711916 +3290216993 +1581937586 +1239443442 +806568480 +2428134513 +1174952059 +1894753463 +1757525160 +2210696722 +1569075173 +1646926336 +3133372174 +1696682014 +3192215169 +994449169 +2638769272 +624138335 +2992681395 +2190225424 +394533544 +1965038211 +2634830552 +2943871063 +1216980406 +120229536 +1155585405 +4004061032 +2516377499 +2387241312 +3499128103 +655251073 +1244553497 +724376097 +198940972 +2584584553 +3661879933 +3545284837 +1804132852 +1689039387 +844810114 +2521714892 +3412733377 +3328550127 +22123431 +2280106435 +2580481826 +148823788 +3158545433 +3775827394 +1885723967 +1752178892 +1167983203 +1347199262 +3730036505 +680506349 +2130259659 +1568221822 +2807498012 +1006143004 +2552076211 +224591087 +3358582625 +4159892709 +2537520301 +1825827158 +4242164397 +3544814276 +2412510314 +3810533613 +2305343405 +2106438609 +801766770 +1246265456 +1727523379 +638198548 +3473996070 +2062644122 +3539226408 +288892734 +3879065752 +1767370598 +4024029810 +4185294611 +17110759 +3253732193 +650235194 +3714151976 +773003556 +1304371760 +3594255459 +3990432243 +264660625 +2142978997 +1130854220 +3783207229 +2464318858 +3508545532 +1027627935 +3266691343 +2974033885 +2042242332 +2369426613 +32454869 +1603661176 +985668057 +3222652150 +1373663585 +2213520081 +884182303 +608299612 +838659217 +1966448369 +3109541380 +2369739611 +1869250844 +1183222452 +3129240255 +2858795178 +2527984491 +2506810802 +2073940606 +2933349144 +1692637432 +1603548312 +2583974355 +3275053266 +4027612739 +3032945726 +801885109 +585359922 +2142238964 +3688448191 +1194594052 +4079928511 +817251025 +2188774782 +3684031557 +1133549805 +2693426754 +2782583040 +1365688585 +3280054949 +1720345412 +1707198773 +771854967 +3569679356 +3193273307 +2838931276 +3646053623 +2860951007 +308258355 +3184571833 +1038738668 +544962953 +978496130 +3939405972 +256776343 +854920340 +274212249 +1998971458 +1862927630 +2545131936 +3403321293 +3073885379 +130804186 +2730212587 +2205978758 +2734685765 +2175714594 +4113691069 +2965214982 +3804135218 +3742971131 +2515393310 +938027878 +1674105310 +1353713745 +20358537 +1047703834 +3957978988 +3879193769 +930629170 +244664029 +3969346285 +4090568640 +795841120 +981449845 +942324795 +481762297 +1136052011 +207725314 +1761744774 +2699127580 +2648800467 +3892533086 +648577172 +2396378610 +3307361622 +3323591344 +920814069 +433835850 +1919613165 +2004021050 +3639063987 +2988112334 +2819882287 +2429032599 +2938092029 +4185050092 +4081938674 +3125780471 +676553057 +940244329 +63156189 +1834539568 +4079269267 +3198656030 +1543496852 +2429446277 +2453658840 +1274083164 +143700670 +1777143502 +1751505293 +447023954 +1885214135 +2612973166 +1205798224 +2566752244 +2204609235 +2402146891 +1687999035 +716371872 +1064488359 +2653759948 +533656506 +332378672 +3684726765 +473180372 +4209247179 +3026037991 +3705847298 +3647838634 +3189999591 +3859671558 +2651348355 +2769385578 +4260993547 +1073930716 +1359028218 +24656814 +3814544068 +2393348760 +3572742769 +3092497346 +3257344569 +1632052535 +2272452305 +3116089065 +4053255286 +3578008193 +105515216 +2933053037 +3875646896 +2283965067 +533908279 +4218064836 +3850361709 +752185950 +1397820859 +1325158795 +584913917 +66292997 +590400720 +3633165571 +2537784755 +3088319635 +3884265917 +3310881193 +1775382951 +1072702267 +2132805838 +2821847620 +1491005194 +520811012 +1397314907 +1831503309 +2110510458 +3679011932 +1557367885 +565215985 +235883127 +766270515 +1381681192 +2302175521 +1744473224 +4050237429 +97991241 +800082122 +4203829320 +1569290520 +3893432839 +4112283995 +3093246697 +2261462085 +17355224 +3638186079 +3077432744 +2971238121 +1186842992 +2517095957 +1172530744 +2963402616 +2096125551 +2526399522 +2453095133 +3909370203 +1823817097 +3162602611 +2256187072 +1060590238 +1090244621 +1431792089 +2344785166 +3742247916 +3826669622 +1245354189 +1763791345 +2444249339 +4219181379 +3699727581 +1403824690 +4103022493 +2709845819 +3784038130 +3574593111 +1204352327 +1308058640 +4027256130 +460684847 +2491240446 +4188646198 +549560743 +3441983333 +1739436074 +3143499693 +140314048 +18208766 +1834627358 +1789620945 +201157151 +75989256 +1973854388 +1284759361 +2704230274 +4238548242 +688581667 +3012476351 +1254074199 +1646486023 +569927228 +4045003813 +2921005235 +1365154771 +2528701308 +3120725399 +3203012080 +1823330506 +1099671069 +2229755890 +1847456472 +1004470306 +3324610258 +3608520154 +3300263685 +4244331719 +2141217731 +3129582956 +3821753466 +3149074389 +2420738044 +4157918882 +150137254 +3689456075 +2423614999 +2059684399 +1360972119 +3430175746 +240837780 +195338815 +2599576931 +3379880174 +3192314695 +3334534228 +2268985381 +3955754670 +198944202 +1452150133 +3464136959 +1877053764 +2027377888 +557974014 +896478593 +3341396064 +1399133702 +3952627955 +4223012947 +2917114583 +3517376956 +3168559204 +1675658870 +41473995 +2245024996 +4207972516 +3552480177 +2272313406 +1878865810 +4255176109 +3731884905 +2272731587 +1722960799 +2215759970 +3526221736 +3158655596 +4131210127 +878466374 +2691246929 +2126910826 +2992213857 +2819704250 +1147378223 +2331983408 +1614583128 +1742623806 +2685843399 +3203464929 +822755061 +1801037831 +271144846 +3281998780 +264631366 +3567537754 +871574605 +1430690306 +734031389 +3707015636 +1650081198 +217879102 +3753748679 +315413467 +2208928419 +2867140027 +3071593571 +612581957 +1098510382 +4233546079 +3194031644 +1165138892 +843890900 +1918606477 +2907783612 +3614959005 +1925056835 +3153942342 +2753114894 +1803939920 +916551373 +3247128846 +2132171660 +1038210412 +998329898 +4081566301 +2633357539 +3805044889 +3940524230 +351263346 +1161840915 +3143914851 +382193134 +193108997 +4148082670 +2479894960 +734555786 +2082115501 +3599633879 +662482103 +2746177370 +3441764569 +2373484435 +2058048651 +1588491438 +130036122 +1006431632 +2745733777 +3633684792 +3384647916 +3871484436 +2505721725 +1867671741 +2356228783 +1012584476 +97495244 +3924070655 +1682539882 +1337985980 +2006888549 +3700720662 +881725817 +1565786211 +225063875 +598205760 +4000032837 +3550918931 +2928780222 +315261252 +2823257482 +3213892990 +33003233 +1319080288 +3326145141 +1925182734 +262716176 +2370369123 +345342479 +3113135675 +242125910 +19365332 +3037344524 +601281924 +1716624331 +2557978773 +705545726 +1234166640 +1535530864 +3665997607 +3731586909 +4129856177 +456746565 +4003674093 +3588836904 +422757008 +4173843761 +3283155413 +2960162903 +2819323635 +2655569592 +3399485921 +1741936174 +1724360025 +3665039346 +3054725090 +3541266639 +3048458861 +1930105242 +108084325 +2006027710 +646154660 +3215197654 +950710692 +1367483666 +1913331470 +2505542275 +2070352059 +2714365677 +1423790852 +818075637 +2750622313 +2562600121 +3348738076 +194697813 +2824273914 +2763710099 +1285382981 +1178717260 +3872767266 +4067245425 +1164910979 +840157510 +480096785 +2763709364 +2373253101 +3786496411 +1073507865 +35110531 +428429392 +4130937795 +2367398931 +1990218154 +689830293 +1104043832 +1473233733 +3481788315 +3414454440 +208417484 +3395031485 +2294454630 +2724762755 +2716032075 +2944944910 +2212046720 +503311491 +3991153547 +2008235999 +2906837833 +3505904115 +1790472299 +1404493058 +335412416 +2575914342 +4143875814 +1238305606 +2737146869 +1884162207 +454901426 +749366200 +2370886720 +2789772456 +1850780635 +1015085947 +2787256479 +133799348 +1624275357 +764267125 +2566298783 +3483517306 +2369960052 +349238617 +3666073483 +1379921402 +3487077352 +1396324910 +2020871445 +528853528 +2197739303 +3621561903 +3364491584 +1640335150 +4119257614 +3379212287 +368078379 +768559217 +756780535 +1352306550 +3201853038 +3352805637 +774566025 +2399560002 +1529577210 +2364566046 +2393545380 +2584769422 +3702925376 +2785122810 +3849748560 +3200635194 +2376167550 +2989061321 +2477484163 +2843452633 +785573734 +1397733114 +831567256 +2477810662 +4127798084 +2570554848 +2898240524 +2448625547 +3528686296 +2048115853 +2551595061 +1484183690 +2790760635 +564820420 +2648568896 +4279352648 +2198008379 +1867074924 +1844299659 +3374014502 +1827962022 +1743419694 +3400904886 +2579908293 +2623216862 +3914515385 +1266641061 +4010084949 +1135764428 +2729387842 +2989140443 +1814885883 +1700431834 +2402651020 +2877013136 +1262151470 +752314481 +3311492546 +2656885721 +1848737686 +855298372 +2281941494 +4294356178 +3117187097 +3926603862 +2260900637 +1917538436 +1393338806 +1842510566 +259131106 +137998686 +1555562999 +28175945 +3429539990 +483712504 +1847938703 +893230501 +4190079879 +3517028159 +2360409541 +1688249610 +2484524991 +345403327 +3348954699 +20682238 +1714335601 +2959801101 +3275411036 +3842203184 +4113329956 +2096745747 +617650433 +3870276238 +1948110247 +3500869728 +1919436471 +3800147870 +1539899939 +3966785620 +1332497863 +2262057137 +2126350772 +223742848 +562979430 +4041456621 +259073835 +2144619889 +2992423049 +25777376 +1436064388 +3052927667 +2939989167 +1904044214 +1620296654 +613838303 +679999980 +395875993 +3365097673 +1218130880 +448015842 +2014482354 +3412082755 +4101647362 +2246101960 +2236484149 +397567489 +100712036 +1063365748 +2347324153 +2119819510 +2505388124 +2246118510 +1967484383 +1188237856 +1741109144 +748765068 +1619281661 +3457377578 +653100774 +3440181293 +2806663559 +3022303019 +859205883 +2725611785 +530237247 +1290659862 +3686129375 +3246667818 +1029588516 +2558450729 +2449849646 +277443891 +3437381762 +1358622144 +3658814741 +1905671579 +2300677290 +1202772255 +3186390711 +3196215416 +2861589221 +1388865185 +1890189427 +1566996207 +3820353638 +3744433210 +527833808 +3838714167 +2527918950 +803497818 +1260807943 +2518972920 +1363407900 +2964953923 +691844234 +2776657190 +499895986 +3648894066 +898866281 +1346486665 +1057937159 +543767139 +4226219785 +1941178368 +890134975 +3998749065 +1672127319 +3560356226 +1453930765 +1768080062 +2239410213 +320224927 +3775209637 +2455506614 +1809751161 +548808752 +1544885552 +1272547286 +8942266 +498792331 +1529415870 +745481278 +3842317514 +383875965 +3503095603 +2566661249 +277714387 +3492590854 +4196099020 +4110186472 +2511442862 +1077834918 +1281945018 +4185566182 +1101654046 +1234691121 +2115332113 +4267525713 +2582650001 +2359743711 +3377292086 +577750989 +2053212600 +1397878365 +1071622970 +1136331110 +3478459403 +2517692350 +2294086121 +2509388105 +2069860893 +2715435760 +1952127601 +841830679 +386129597 +2210062381 +1248505138 +2354935780 +2152804264 +1257358819 +2648149207 +127421920 +3531876990 +3290101185 +4158232913 +246488954 +752825260 +2488137393 +1093767303 +693173408 +3357206694 +654036883 +29889301 +3311313981 +235992430 +2712996088 +3597007307 +1489170725 +485041549 +2658884899 +3503777753 +815101075 +1899925552 +2505238304 +3990321484 +347544545 +2769228475 +4229778256 +3791038647 +1676993773 +1866935084 +1816472499 +3725128194 +2510752632 +1308596068 +191993785 +2234465639 +3560678293 +977678429 +798805463 +3074646344 +2807520911 +4196823616 +3387256498 +1894655591 +450938448 +705880914 +4118722101 +1763750170 +1093919789 +1310931280 +100059399 +4038929115 +1354982617 +4004747887 +4057544847 +2276892544 +3999852076 +3518878969 +1878848419 +1101714503 +692058796 +1143663245 +2801872779 +1408947959 +3115718421 +1731739736 +1277368787 +3103970075 +3173806844 +3643910218 +245222360 +2483492882 +3076963565 +147707192 +974436110 +328257735 +3056645245 +1622176581 +4114581706 +1074501677 +2153349770 +549923652 +890157676 +2374655363 +1219828454 +1990952797 +1087651397 +1870557748 +3340386160 +1182958089 +3537914941 +4053464119 +2683416871 +2860849703 +2654883336 +1255203325 +1125837016 +3658138191 +1654425538 +2865977280 +3759889902 +4231737729 +938220296 +3685583907 +2504283230 +670288113 +2851391782 +3132127508 +672500671 +3031831910 +1285697030 +1967529943 +3013166712 +3112840937 +1955181611 +502196225 +1340380151 +1324349266 +2971209341 +2340922937 +154738433 +2108199566 +1435750368 +3752831618 +3925620613 +637128275 +2986503665 +3457999124 +272416422 +1144206196 +2446303193 +897860532 +4096219691 +3472790664 +1469712726 +1236445935 +1383391378 +322703682 +3152922735 +2161761816 +1340969605 +3743150076 +2196498013 +4287730669 +1613574999 +2711073439 +2360494685 +3651863985 +3356771797 +3214882698 +2423355374 +2074831528 +1925678497 +1079750861 +2885697896 +12501347 +366678296 +1456120374 +3983860313 +2718327535 +2160176183 +2893356297 +3795648964 +1376314843 +227147729 +803231510 +1310401257 +1823274585 +3969421068 +2014164808 +459226438 +4184878164 +3760412897 +360786465 +1527991360 +651496383 +656147187 +918740571 +1494763357 +3271886216 +2545418923 +1361404254 +3859500672 +253956409 +796866360 +1855012414 +491542220 +3150451396 +4180393950 +2803462352 +256885523 +3037027929 +666795427 +1016948094 +2669061008 +746132921 +2493938926 +3676889472 +1441397187 +3460602764 +3430546374 +2637514388 +2332378126 +424184176 +138151820 +3304945385 +1132263510 +3599520890 +1805463081 +1700274514 +2998556064 +3128424738 +1329302305 +1509094374 +198188531 +1521119135 +3059232443 +1621043403 +134484737 +389038967 +2617825389 +2493148505 +367908561 +484696355 +2785517095 +3387870799 +1446686006 +3256320341 +4092924389 +85279518 +3985655047 +922289300 +732561546 +1096530398 +196267877 +3881865477 +1247673878 +869165673 +4200607997 +937453649 +2854369535 +3614005692 +1415400049 +1341122774 +4220477168 +308772830 +1687677553 +747769438 +4231312555 +4161841641 +665523354 +3384691392 +307560128 +402908543 +3851637335 +1507126786 +951535117 +1256724840 +4072358722 +1447546729 +4016597984 +2498376977 +526358983 +1844830174 +1955440951 +2787960742 +742259188 +1304118727 +1335049918 +592279926 +3299939495 +4189864366 +2411707270 +3068169916 +1178122345 +424673635 +713929389 +2139691398 +1827072088 +2408154202 +251031343 +322538312 +1552731858 +2416167371 +1880561154 +2839893930 +3630592406 +1294616185 +3805540409 +982532878 +4138135405 +827900424 +2639669100 +1197228855 +1900317350 +1225134007 +4151197276 +1310353299 +1108130148 +950561282 +1140267794 +3063023511 +1908906495 +696057348 +520793963 +3616195033 +3882575269 +2990519531 +3513963158 +2916093111 +2391700004 +766992945 +184673888 +3877400615 +1802459231 +2042840497 +1127977813 +613532129 +2080548343 +2748440399 +3614720239 +2419999 +3479493711 +444075923 +4029692716 +1016541549 +2767654534 +630658586 +1538372114 +2427885758 +1599972263 +3644113121 +881785479 +2216218280 +2681660504 +3391223619 +3428078913 +3644076342 +3769657259 +3772213650 +2720659648 +641629198 +1955459988 +2738499574 +1428830382 +781099602 +3608908950 +3539525622 +2003881685 +240969919 +2587432349 +120644663 +1478909413 +2734340347 +3667144199 +1371117210 +1228778011 +4156232818 +1186957193 +2714466086 +3644118472 +583884876 +191171919 +3873988498 +2400388319 +2043451901 +2787394665 +423234350 +1651026368 +1396813049 +568192846 +3720967001 +1930475858 +3985006039 +1489995692 +792243727 +363450536 +3800323235 +3814277518 +2299980683 +2233336611 +518374891 +2059605745 +2318025714 +574777780 +842333573 +3000810705 +2864138412 +2558285510 +3660934220 +2632046829 +1961093426 +4120207015 +81793510 +79898103 +1650395498 +3149881477 +4038144396 +1772775919 +2989699819 +2034819737 +2751688859 +1188896905 +3364033102 +178872432 +3596028915 +3882744787 +2952696056 +4108629130 +3069668148 +3060825782 +3144807947 +913739290 +2383240092 +1403963303 +633817269 +851760929 +1796597749 +3848098980 +3258091427 +1672051434 +1045657253 +1570924583 +7853633 +3648483424 +214341186 +833999948 +2442987652 +2092468897 +3926700409 +1286504727 +3948861355 +3637538937 +2216616953 +2371536303 +1016433395 +2346278744 +1607311679 +2496543675 +1746236297 +1588705306 +1669506252 +1646354047 +766172227 +3152918031 +4085418142 +2353565002 +1335026600 +1987589892 +3438899444 +3152577270 +3301084141 +298750219 +3479581827 +3672827091 +3436886111 +394168972 +2043642521 +3627784252 +1497292096 +4254287196 +2229367919 +887242788 +337898225 +3524133221 +2341623766 +869876320 +3436557230 +2885925442 +2972950259 +1601063415 +2650024627 +3331733571 +1100449298 +537441465 +3315988344 +1540639994 +1877844548 +254387324 +877824886 +3901603715 +382224054 +3914629420 +1961101163 +556132674 +4253572659 +2961094562 +1435681034 +837922976 +1632494667 +1764196230 +3352788154 +2932429973 +279066674 +1245440033 +3853736835 +98722508 +1420639324 +1688413547 +2417400571 +1239770499 +4049456695 +1034429689 +142800020 +583695616 +4036214839 +1494842892 +419178788 +3409709082 +3197456633 +20203395 +1899104450 +344683214 +327292678 +223261374 +3815573204 +3660460409 +1861564065 +2973290893 +4157915106 +14957275 +251628163 +1776008330 +4140628612 +3416772561 +99261156 +4180248258 +3988673899 +131836583 +125874803 +1008539395 +2687422801 +3305191412 +1365960867 +4014546210 +3594998304 +2311454772 +3448193719 +2361480092 +1464474780 +271064097 +521422683 +2702658198 +3786267460 +2474461265 +1634411352 +4138005067 +4266290329 +1889157525 +3568795350 +3266441609 +4041162241 +581405235 +273968321 +3399711518 +1035541933 +2984248167 +2905978138 +1966876707 +3979179720 +2514091932 +633548381 +606003928 +2395482131 +3583629457 +348106209 +2627279867 +2803001269 +2647763932 +16474193 +2943394896 +24891478 +872602889 +553834547 +3462847887 +3037440421 +1610661932 +3303069293 +1759602200 +1692424568 +1975450609 +3142311286 +4196474436 +1454329300 +2112300578 +2643072481 +1291786174 +1591445373 +3545304414 +1296025189 +672492204 +3618391139 +1661573843 +1819508646 +2625351520 +3597013331 +2337141808 +1636116172 +980875514 +3646841948 +1131815354 +4066641106 +461144638 +2382757639 +3679974667 +1957557255 +2879786222 +537389035 +2300578348 +1225946741 +1446516290 +314233833 +385425858 +610941026 +3711906514 +2715465379 +3801036594 +2763783285 +4172447934 +2422370903 +1897932532 +3042503645 +1454292568 +3768729405 +285070775 +993552361 +3823742981 +1027822677 +2019695931 +1952053838 +20141667 +933995760 +3009174020 +481814058 +3143575325 +3384550124 +1276474390 +990858439 +935735956 +2616008800 +997166350 +1003893514 +126942463 +1997722853 +4056738472 +61359924 +2694949513 +3476027062 +2132929281 +2745279858 +2986330692 +861895908 +1834063638 +2166589696 +2393292286 +1254108112 +3941778970 +2586486494 +1451657285 +3119779266 +2034309961 +2386279029 +2474302404 +2914454778 +1544952121 +1630061825 +2428808501 +1005568859 +2902475383 +3344617426 +430453917 +1290274181 +1338290849 +2708040953 +317350325 +796250647 +3936806213 +2157566454 +2062220085 +3684903885 +945099964 +1884366018 +3979563733 +4006110404 +11939501 +1100881569 +2280102823 +11539037 +3691891588 +1732994259 +3126830643 +1273917329 +1287037938 +953410721 +1813870978 +3617935231 +1571714400 +661095767 +1939948067 +1096705176 +846962971 +2678684740 +3648456052 +2055562770 +3166101521 +3652150558 +3356661627 +3272690381 +3899187372 +2528056180 +3246512945 +2274027954 +1899124124 +1499668527 +3656079871 +1107835364 +3845978209 +563183956 +1876836910 +58014696 +4055922288 +949301351 +396460457 +1733223286 +3367706544 +3727348777 +410137781 +3402638768 +3013726677 +512211894 +939181711 +4151653212 +3463951371 +46916493 +2141601896 +948885937 +831436311 +3342703695 +4132777381 +827183277 +1228484666 +1121320806 +2941467389 +828730297 +2474263104 +2165846278 +3866910410 +1427457632 +2764602940 +2442239897 +2609837613 +3145819181 +3319333578 +2218116394 +1656188130 +1264304759 +145896426 +2297989010 +1097967102 +2426377690 +474208756 +944829513 +1113655417 +2248251831 +3400989064 +2511065110 +1946272018 +878678991 +1018621331 +2048247423 +7141675 +3103116051 +3325020842 +4222127373 +2065010982 +686804828 +684464890 +2242181877 +773050305 +101989620 +1112103491 +2821332877 +3841418680 +2148856059 +1287493512 +1453941492 +1931933129 +451635935 +1857785255 +963374895 +1470402620 +2576260805 +2270882927 +914177904 +51256009 +3641856465 +3490091010 +1820024217 +2322497844 +3714067343 +2902232 +411646068 +872223757 +3409765073 +1969506249 +2018263798 +282510819 +3389067386 +3083186485 +2170473387 +3139675824 +4010772525 +2257761733 +3598297315 +2243190553 +1088396242 +1418999516 +2935773988 +3826924386 +3023523024 +1074046856 +3186591218 +3897074230 +191534696 +2876416773 +3011631951 +2559998740 +3549024533 +2359615481 +4265494189 +3226186542 +2155375790 +2430192952 +3531150003 +3281876035 +2405644843 +2378165293 +416541214 +4278385033 +2183419990 +1701980520 +3941489447 +3874813256 +830546682 +2062480901 +3307939394 +1905923841 +4090707288 +3579075048 +1151490257 +2185090315 +4137695232 +876577458 +2298261250 +1769610339 +1955888520 +561433603 +3645125130 +862227366 +1030298785 +3260363461 +350986155 +2674477987 +1419401917 +3571477100 +3300671753 +1859493273 +2248700499 +664224572 +335616965 +2948237543 +1187633577 +3092624220 +3261392604 +822901463 +683894421 +1506209555 +4111241832 +1236018720 +1457759777 +1955662705 +4246271315 +1179130767 +3694831554 +3561948196 +937069288 +1841677784 +354966756 +1731312665 +1319738591 +1171792380 +793410279 +2900382652 +3422404293 +3202315500 +1089707069 +3095632476 +753987351 +2661995284 +2569703422 +1497453624 +1558789066 +721144324 +1936878305 +801203459 +1929261075 +3409227149 +3417291505 +2926238316 +273666112 +1115394567 +2487791720 +8320813 +2831463573 +1230297899 +2059826686 +3329033176 +1162252138 +763812728 +3562711298 +852808222 +2036806355 +2559452894 +3704749183 +4248373146 +362766755 +2203119566 +575009750 +2875481628 +891420953 +2920775779 +2909254071 +2838455816 +616945532 +3494555706 +2741180116 +1267216701 +2126700727 +1481707855 +1948556214 +2401774941 +1849664196 +2241477438 +719006010 +1510205509 +2085004893 +3353120388 +1185363762 +2043272024 +3922826543 +1340036945 +3024659389 +2678228555 +3067010930 +1355987611 +4019623789 +2073805493 +3731900079 +3650262629 +2727662574 +4044428313 +3669765620 +3260344164 +2379289370 +1793774651 +3641049996 +1777423685 +2780225855 +1990061997 +3627117768 +2481888558 +1136680761 +3052287551 +884806494 +3147041189 +3438758109 +801958312 +868926308 +2212946665 +3567347342 +2819139917 +1208268365 +542800508 +2075201738 +1707022179 +2099317891 +1387289140 +3631986292 +2296848034 +415639604 +3690007632 +1418122500 +2945858426 +2405569080 +3504003294 +4046201848 +3501454833 +1354707333 +797756406 +2263884128 +41057739 +2131939884 +4168019391 +3534706489 +4096334175 +2477713534 +4273920225 +3175361364 +1174742018 +1308008283 +4287560259 +1724695225 +3462859602 +1597484503 +2837767334 +2275185660 +3043069100 +524076873 +4284918976 +3958587115 +2315508086 +508908915 +2201146157 +3846444308 +2286042829 +4123712010 +2495764869 +621257683 +3923105578 +3541531577 +800784068 +294741261 +2570082609 +328198133 +1155315271 +1273675509 +4289597364 +1620466484 +796471417 +2645824225 +1951363735 +1206154734 +3919361621 +424737889 +1114224971 +946688266 +1770242691 +2915363812 +3107984275 +2593449597 +251528854 +594399505 +2626697797 +1185495578 +1922847394 +2774018226 +2917022005 +1117340783 +587674045 +2610800333 +2108411653 +2373248113 +3863211524 +3929555900 +1287259282 +1070017282 +3915440767 +4173355920 +2089621662 +3421264220 +1653327924 +511620072 +3760107948 +3817180771 +1509740368 +1086392002 +557562829 +2271080625 +1307498230 +4175392461 +2157321401 +582794643 +3043680970 +2623748008 +1980553425 +4201455879 +225250015 +4190980023 +4109851747 +1052198851 +2048467026 +943088715 +3162200319 +3405168578 +3899550571 +1002830815 +2831128740 +1861087278 +3143928614 +3068817583 +4291123925 +1334576801 +448784188 +2664280549 +485410410 +3067324978 +362361591 +1204483670 +960972620 +2838389592 +4130166554 +534539609 +858537718 +2694941708 +1620309059 +4289594489 +2739267327 +2757265761 +3005245555 +1144691911 +285479822 +507302416 +1268896264 +4087979004 +3411887659 +320977447 +707912295 +1990966195 +1844555339 +1234299162 +1985311520 +2760782553 +1951482067 +3704028797 +3488979042 +97086590 +2559907422 +259406478 +1474372906 +3645250006 +2666492996 +2771865701 +2549646272 +2733631234 +1583526893 +3742942551 +1783918812 +3166421990 +3068044311 +927747528 +3840796122 +711223833 +599817654 +1095443322 +3192291521 +933324875 +725429759 +4152430323 +1730200142 +3811300571 +2002721295 +2406338797 +2994454458 +2484588866 +9356220 +2482692226 +2636033626 +319770135 +695132771 +244415050 +384786282 +2673328316 +2082694128 +2585608797 +665679461 +4250524283 +124664487 +1096786922 +3411553926 +3249654891 +4062786461 +3762146737 +2450182843 +602285858 +1112320119 +1602882850 +2849416573 +3949477146 +4221367321 +721767173 +2323337631 +2547057118 +1096105749 +4182869125 +1473265222 +2294416361 +1609604250 +1601048446 +3439892995 +3117734365 +600033465 +2470339918 +1007719545 +1408634018 +1616579295 +3303385459 +2000855868 +960076415 +424959736 +692814010 +1155119930 +2694055088 +3243199015 +3312950387 +3256171653 +383309884 +2044046817 +4055484721 +524788067 +1446169557 +1551330296 +1544815752 +2032491464 +769891409 +340519077 +352914609 +2505534361 +2254577040 +2257162067 +3924581009 +3714550469 +1703148131 +3498900837 +4018561886 +1254510767 +211082098 +4066411256 +4045795470 +2703053794 +1574819776 +3112042230 +472110861 +1210235393 +1803421984 +1767390348 +1929045339 +3710330620 +3385023842 +612817688 +2393331845 +297957521 +131829100 +4120193116 +2628759585 +2396450335 +2142053626 +2971174613 +1025401571 +2805978837 +4087412625 +477861399 +2069524657 +675619465 +3916647306 +1246927605 +1788195882 +3519792227 +105962022 +2222625805 +4255942388 +3822151381 +1576406106 +3865103073 +2845746353 +1943271520 +1016050736 +2121757823 +1177184528 +2714053332 +2473165903 +659976057 +3075644888 +1113841975 +401780513 +1667859087 +3574482649 +3075233467 +1643822417 +3584454592 +3547558763 +2957857132 +3381623545 +1929612382 +4222213410 +608169450 +2683617230 +3134240193 +2316612667 +3757120748 +3520958351 +108386653 +2222031011 +3225902510 +2133844854 +3292701462 +139999909 +2243667284 +2143478983 +2837515360 +1706864984 +2292395703 +17672682 +3802582453 +3447774865 +1190242063 +2522996357 +292948279 +1608392660 +723218137 +3276267726 +2560186105 +3542189351 +2416440555 +636852795 +2006381167 +3269285273 +1766718183 +1550463212 +1334878608 +3943293013 +1031930380 +1190734471 +3607158439 +2592296955 +2745309630 +3598919564 +2078897578 +1374202625 +52173953 +1986361804 +1089230345 +1459987773 +3373201087 +337854727 +49930395 +3339034763 +3112891337 +724038220 +74715515 +4186610203 +3609391857 +2947794427 +1498756753 +1517275608 +2027956424 +4031468825 +77982568 +3158573140 +89702421 +3307578054 +3809605831 +1416107388 +3236313841 +1835290937 +2193202524 +3792717445 +2779169610 +566007571 +2861251225 +360218418 +522518905 +3743852546 +3030510974 +1333898808 +2358992045 +3384671974 +3416289720 +1865314523 +1485392633 +2190858801 +4151650083 +3009153112 +1724538701 +1699382841 +673562935 +1325531391 +1486597115 +4147949918 +2893010129 +3140080560 +1009936751 +1311493623 +2784517463 +2148768294 +792796609 +1583331194 +2849577647 +1207166431 +3618066282 +411757021 +2975684910 +3970583057 +4179020390 +2375987328 +3801823483 +1180522810 +1903582710 +2824088961 +3487575220 +1610258552 +3812451651 +581324541 +1519364129 +1141241755 +2407410860 +3603670794 +104162963 +741825914 +656211638 +92307123 +2897029519 +3088237910 +2381075892 +796567607 +3736905976 +2362437402 +1454164612 +633556570 +3100937462 +4153985231 +3066733835 +3895145967 +545940712 +3941141564 +3668416384 +3502792855 +191566895 +505489035 +3904509575 +3856512087 +2393018431 +4008287758 +3694689507 +653876615 +870140744 +1436596778 +2129976211 +1967427568 +2418316858 +797373852 +4089842128 +3608087750 +3069038341 +3477282361 +3811902103 +1542841567 +1124796345 +2966680700 +1643245938 +477546623 +2407519332 +2551228201 +3540865731 +2827672156 +3046703165 +1716795478 +4166821976 +4117924736 +2048067056 +653835539 +2288057106 +3835607472 +889286347 +206390169 +905663939 +3809438907 +1274295620 +296380463 +2608633995 +3994428795 +3225245179 +2105354601 +2323086895 +3593333083 +67431609 +555542360 +3600688881 +4188951016 +3757130866 +4025597772 +3343456903 +3278570441 +3939598030 +3346006369 +155449708 +351981427 +2389732803 +1036368383 +3373351045 +3826558173 +3931699519 +4027278253 +4252376713 +256179475 +1983352601 +3859392853 +3345357921 +2173730690 +1946323408 +771237495 +3984963256 +2746314771 +846242762 +4040529158 +76514123 +3716072528 +1888927967 +1919773344 +760066875 +3347438901 +3955092297 +3879417239 +2718326068 +4123034958 +2498738198 +2730164307 +3298918320 +3371452168 +1105187536 +2003300095 +1805337601 +223435102 +1899286273 +4074286791 +3705854769 +1819379324 +3755333166 +222388285 +1232818191 +2071250628 +2897198661 +463399463 +1573349284 +2457018577 +538258634 +616358193 +3583245115 +1104496016 +2800063697 +607462273 +2211590469 +2471813966 +300516771 +335820287 +1478650878 +696768255 +4018906996 +1828605546 +2552307572 +3620266889 +3805149832 +1807188432 +1513003845 +952957599 +2473337934 +3548302306 +2613000609 +3167105283 +3093270499 +337798748 +3622390627 +7282368 +710195641 +2078863672 +1783238598 +1899352836 +1144149717 +1608375457 +1211826058 +1201076861 +2268450765 +1727077021 +1415539589 +3346388518 +2297240597 +1527950344 +1559604150 +3953208532 +4202006723 +3023616354 +785135412 +2057218297 +469791370 +232194303 +134215339 +2815862137 +324308781 +2675436363 +266721275 +1197467213 +1075672074 +3299301533 +3152189480 +2504800188 +3958219583 +3744391102 +2220564000 +1919970496 +234792485 +3404544412 +171666859 +2071189954 +2852738649 +1376308668 +807137738 +3525564187 +2181662446 +3176769915 +2692372802 +3572989800 +1509650601 +773395783 +3560706370 +1557782959 +3472567649 +2979711199 +284302365 +4241967763 +3659188571 +463278359 +1569278732 +3168966602 +1218391867 +1426592406 +4158108647 +2668089445 +1004637284 +3812847843 +849111844 +305814036 +861190728 +2842322340 +4043642315 +3689216800 +3221294733 +302300551 +490828822 +3206806289 +1851300136 +1881756102 +1797803070 +3545969732 +1274708835 +3883067705 +2750453180 +1706570640 +2375826935 +523479681 +3717736342 +1821308561 +3014202436 +3783589571 +975867803 +3276697098 +3495743381 +2858864797 +238003013 +3672522994 +4124650503 +580255884 +4202153850 +3303856792 +1769883060 +1114008665 +2960781770 +2074247120 +4059786715 +4164528293 +4065555960 +3558481146 +457588994 +2494364953 +1105796088 +1073620679 +3875972008 +1284757275 +1164493286 +3291499726 +1007828343 +2434927370 +866473140 +2379434563 +2931058421 +548280792 +3013051758 +4144870509 +3974599672 +1526513876 +1163816865 +2207173895 +3281367062 +76193702 +2264274900 +627080051 +661366050 +2133787971 +2855010865 +445895209 +3402765411 +1080587900 +2311338055 +1307220742 +1382340920 +559158062 +1365596353 +3676187919 +2033175659 +3148504926 +2554931936 +1531413802 +1840242784 +1327076454 +4079024132 +2596062859 +382492131 +2967446472 +1175221151 +337454979 +1694136255 +651892064 +3135413906 +4213672682 +2368286667 +3335311698 +2030977878 +779735917 +2949659147 +165023198 +3892677836 +4006443505 +952592619 +1176837018 +4139309960 +768092294 +1794931142 +2801504739 +2326565831 +4100637049 +3252895485 +3049463527 +2669355723 +1443862969 +3309182346 +2425060517 +1232735492 +3011225393 +1947230434 +113334743 +1478729408 +3874121759 +218211618 +2966871240 +2159996590 +1354542379 +2749938241 +3975933060 +373141688 +3753443249 +1262987335 +343839041 +3690507827 +1560802318 +753516414 +2431054726 +1132237047 +3538550462 +1120557194 +874012260 +3391267479 +44243440 +1736496137 +4280286195 +1763912499 +3577024313 +1321891691 +889480194 +2959474860 +2502844507 +879598155 +1641621689 +2761899812 +4288423886 +2819326312 +2448965178 +4196592803 +44633585 +778378389 +3881088171 +2015557245 +3210380787 +3310596154 +3462512994 +3756541751 +2620182757 +3680466605 +3643454066 +1811989165 +1903600472 +922041152 +2705502550 +3422415141 +2549080444 +3172130988 +3218109163 +4034935167 +1699324176 +760546353 +307161183 +514083208 +119621354 +281188143 +2712717210 +85849654 +564948932 +4121584966 +1498306152 +1488200762 +180833192 +2080562799 +1604904759 +670795062 +2563931658 +610974024 +969571438 +1639349852 +4157445988 +1349766497 +1971682304 +3067218929 +1161409670 +3795614092 +2112784810 +4202952666 +2787915888 +894966591 +2099474411 +2877881958 +3036730189 +3296465857 +563367872 +2132310816 +400800761 +2406188886 +35003986 +2428207837 +2350544558 +3397301064 +1681896478 +3590373663 +2555310236 +2367169681 +1842676167 +1692054754 +3349375355 +2093233742 +198904078 +1647267128 +3233524702 +740730902 +1204468272 +4153638757 +2948711537 +2105381938 +3697195815 +1886011639 +496781974 +1425985618 +2429438528 +2943126652 +3944154919 +3511952202 +421766900 +747508656 +2331909066 +3602029300 +3703584080 +1295312254 +2439941065 +2428603619 +3878459005 +3417119569 +1571312722 +2295745272 +1428793655 +3227376758 +2507366158 +2700003439 +2570509216 +2689743805 +4011628038 +1205981710 +3564001269 +771813016 +885067654 +1878806462 +2799775663 +2107413288 +2342167308 +3489853437 +3314572353 +3914444866 +2845516981 +1701112427 +1765889068 +1823085215 +1586935542 +665752901 +1348422863 +2433451371 +1126443830 +3492578435 +2741901374 +1178636716 +3959246271 +2563050941 +1753186341 +4260436334 +613266316 +3591292805 +2477305070 +3114405521 +27924869 +4190595697 +818606178 +1292170602 +404742764 +3091157231 +3378739186 +307618669 +1174038624 +2149873948 +2527876127 +10975327 +1793422949 +2046943750 +2635461762 +1099782535 +2616961920 +3488563934 +2968183252 +1997799500 +2295729693 +4198578333 +2004659072 +1841218631 +29753240 +2395408562 +1778053685 +3387783142 +1399322816 +1771840705 +1871403351 +836099488 +92501187 +3774114864 +3756492117 +472628399 +1719358911 +2488447485 +738441554 +4213729284 +785402478 +2554739477 +430713274 +2227732134 +3624228684 +3980838945 +1349575267 +2072220236 +1423160279 +489113778 +1469163782 +4009159829 +2650767935 +2616198266 +81368053 +1577467819 +888860426 +2874405487 +3384586871 +627648152 +289748363 +517817676 +796753393 +632513591 +3095927511 +3233627225 +3885118578 +618207924 +3105080556 +1382442539 +1362057592 +1322320735 +189385033 +2872930783 +501626964 +3999268448 +1424204332 +339789458 +1976923229 +512777883 +2946416023 +1274863191 +1723771 +114583738 +2391484608 +3998980851 +4075070794 +2926319279 +1524105601 +1213183474 +4121485545 +1384740196 +752088628 +3932741252 +3669818412 +484913534 +416488489 +2597109821 +1319392762 +381603246 +4250913860 +3014155674 +2186504189 +2877602561 +2642955798 +457808982 +2006256439 +2513946553 +628459361 +2446135148 +403362076 +2161877618 +2007627867 +1758558234 +1086185483 +3504370232 +2252649175 +2706716571 +4229228577 +2286624974 +3726052840 +818589506 +3892014352 +4053375248 +2118229233 +2869382169 +2235110384 +1756739697 +2363909455 +3086412557 +1783457696 +3499630250 +1128045529 +1244017463 +3293614506 +1450990400 +2383113458 +770988158 +1141780501 +1467559938 +2943106683 +4164093281 +1799299828 +454463726 +3836771407 +627259534 +2064442977 +1142502397 +2895851860 +3800057576 +2325059824 +3500597505 +1446188702 +1719419097 +2876164746 +1567602039 +3248349748 +3668220869 +4055833657 +1137569886 +1710696772 +1251134110 +1952917609 +1661084645 +835501262 +3324628593 +538387831 +3059181816 +202970894 +1267189979 +150445857 +1655461021 +1989943435 +2954581077 +2037947934 +3898310523 +148660227 +610143442 +3073537622 +15941287 +2410662256 +1370841241 +2005162001 +870537427 +1998810372 +3493971936 +2640633078 +3708826045 +2922781174 +2608854787 +42604210 +1502851458 +1561354542 +329146133 +607820817 +651013437 +3517802987 +1536730892 +1746368660 +1558466565 +3234432549 +2487420638 +3033267950 +4216120056 +3946835821 +1228923062 +2502095229 +2903549418 +2811423748 +3569506050 +2778498690 +1498838366 +551575727 +418374031 +2244907634 +1995431727 +370717187 +1907285478 +1193378463 +885473019 +3380508501 +487928180 +218072023 +1506225567 +2799959574 +2545972958 +82719577 +443121826 +863816981 +2523160894 +884152441 +3688628 +3926230676 +1022186768 +2168575912 +460998631 +1195060279 +3227101714 +430266198 +3236377031 +2530106798 +3872463851 +813776508 +351558051 +1148619490 +3667872507 +390157495 +3972218187 +4018994148 +2994828952 +66942218 +3473259094 +2743609735 +25825901 +609121123 +1769300164 +2465061549 +2039275894 +24319419 +3125017636 +281370789 +3527387959 +2263091106 +417559048 +4243015351 +3776321525 +2038906697 +1298497717 +2887561723 +231533920 +3687215001 +69059079 +345705471 +404789443 +2132672127 +3751313429 +3916894692 +554485723 +4269398202 +1328672321 +2802946821 +3773415995 +3155865957 +1565219083 +186887558 +4097336761 +1181066852 +2657342008 +3523327196 +4031179417 +2498097152 +1391206633 +766321823 +2379479009 +1921969749 +4130530770 +3969427889 +2412428902 +535576859 +3733021740 +1964536077 +3302535123 +3664887924 +1326475626 +3578099536 +3792546407 +270694665 +207565496 +662055124 +4062041323 +2079440282 +2717672510 +249225725 +1492198335 +2068997594 +1252675234 +3084636838 +1483270709 +2969949680 +3613416183 +3689839126 +1998232484 +982161572 +181284872 +1721743467 +842437272 +2953218276 +1861481427 +3351624488 +1916599660 +850972101 +2592446669 +2183017183 +2472311418 +990775157 +4114540420 +1902406918 +3564831723 +2346106542 +604724922 +4076915095 +3963225917 +1326079375 +1370621346 +2651650381 +2279754289 +2582314978 +2821876987 +3198881643 +2952227814 +2117347559 +10428129 +2199334289 +1397187834 +2648259023 +4255720171 +2925298755 +1408454527 +2363327473 +341639132 +1679428483 +3850555493 +3537233702 +398237717 +1601883431 +2811500326 +3157281798 +3218192002 +3961374954 +357855497 +717020491 +829151797 +1903451973 +364655140 +1898557102 +1391701336 +1377329317 +2191509096 +3136406095 +174604312 +3219041998 +512528658 +1088978867 +3338033647 +3365579558 +2267669569 +2806222059 +456777909 +4162848675 +4267461735 +2413505349 +785119434 +1843722869 +130568704 +2018696857 +1813187106 +2322411145 +4122727712 +3429966649 +2887963678 +1130723658 +3296103889 +2522969276 +1638923039 +2952353784 +3083390772 +2113310566 +529335706 +347258803 +913510011 +2315785852 +4260772407 +2776853637 +2553598364 +1205488256 +3668084237 +3965393705 +1487956470 +2633203616 +1745062472 +2227121076 +2815360530 +1917931894 +1371283029 +1298091810 +1907531983 +1673568732 +2319551742 +2943974173 +1108638692 +1699242738 +1874670954 +3955816716 +1286262944 +2281417502 +3479396442 +2594854486 +3730333740 +2930777258 +2848255693 +1324155020 +665313149 +395261380 +2894833181 +3729161815 +3589883286 +3854742663 +1730238484 +132095092 +1066253594 +3413351251 +4067420614 +410489857 +1245008508 +3944455300 +2997756192 +2656416162 +3405865885 +3977718561 +1299029111 +2599276700 +3210477274 +696748132 +3030381570 +3025722380 +415794184 +2082532096 +2598667025 +2674186515 +2791986491 +2820205564 +92048285 +2301226962 +3634553072 +3271337966 +2595083204 +3464355521 +4240079985 +191707728 +1411862447 +3091448527 +2942817938 +2117086267 +2207050955 +216808876 +1558929538 +1830807272 +2100648488 +827839508 +457775320 +2955710088 +2959044119 +3992976838 +92456189 +2730991089 +3967789314 +352235221 +2378682441 +3904282358 +2631751241 +3211530680 +2589662999 +2922857770 +3365618214 +2548767870 +3168864222 +3255174451 +2479250083 +547107987 +1250245934 +215941687 +2347431876 +1591420965 +323318762 +4075980276 +615708536 +3037487170 +2727638036 +3897888415 +3397028982 +783671346 +2830419365 +2673141690 +1252380233 +3988434572 +3617981791 +3046173829 +1805270828 +2772809783 +1087871213 +3775444859 +1749767233 +879703346 +3213009272 +2267596049 +1159881209 +4282863389 +874798656 +3000821285 +1446651311 +1130614347 +3957639113 +2344294557 +2071113869 +3223017181 +3754866007 +1025176881 +152742929 +910067034 +1616754386 +3046748754 +1913536554 +2490590464 +3394914757 +1762895767 +2895140748 +4099365314 +1173592306 +1219991173 +989058 +2225311531 +966136847 +2926027193 +3309055266 +2918602404 +2247139347 +2445987108 +2629702807 +1197292728 +459006554 +4228692501 +2024522016 +260182901 +91303117 +3631208960 +2206876313 +2418186897 +1747775026 +3741954210 +3605888352 +1991114299 +3466778969 +3772076209 +1656514750 +3702842509 +3937063159 +2565767248 +1978868269 +2722691251 +2662840905 +1869275872 +1790069005 +198980920 +3621428763 +1967747996 +365349978 +624754006 +2275877916 +3219086002 +1578594648 +3330692780 +2365850603 +2285560764 +4276274268 +746209822 +1296135700 +394503633 +1062250441 +2248209526 +2450568116 +996320924 +577059975 +1828506522 +3047578545 +3106730417 +3502653270 +2760964759 +3832863158 +8482829 +732334338 +1583785609 +2386851373 +1251842980 +1511752627 +1117582846 +1069381906 +3423351671 +2545979846 +19832774 +1119147531 +1448733252 +2828449441 +3586032958 +3775462023 +918928053 +778862454 +810961172 +2100958653 +3222363849 +1813630492 +1123165224 +2723007353 +938423623 +486722613 +321822901 +3449282001 +1431912863 +1768045131 +368203825 +3754021801 +1487328830 +2293109671 +279497855 +3351530198 +2475263546 +2093577586 +260947555 +3321300702 +4064252682 +412892811 +1488225125 +4064774664 +855782252 +375932885 +2953874828 +4267927422 +405021819 +1553576463 +1315908045 +3472113585 +2588792601 +71693397 +1935235799 +2096441171 +4087005848 +3337244284 +711436452 +4099112081 +4021318953 +2554372993 +2318885736 +2370148979 +58611154 +964460769 +2600635624 +2591325976 +3191217736 +3923078564 +1029244112 +54613700 +480664022 +262524512 +3376139343 +325979851 +71760985 +1208856883 +3045357646 +3730355042 +4198068935 +922864188 +4124212837 +820428652 +2044945134 +2574053485 +3658951523 +28072109 +3931943305 +2226964715 +2099759894 +1552141697 +127208093 +306398822 +3544209337 +2399789695 +1349096747 +1991490966 +2906133196 +866076521 +2061256334 +2281605148 +1695876389 +2648261051 +171695472 +1473222275 +4160891717 +2320626540 +326170808 +3889640470 +3560817491 +3886275659 +2121279978 +2632023410 +2540209555 +1161109993 +257644600 +1220539728 +2943149272 +1670590298 +1018861357 +2543205368 +863842843 +2209801909 +1639104216 +1008661705 +3077274776 +2534049365 +606370470 +3211104867 +2500546720 +2319780851 +534924941 +2185565814 +1947825922 +207049724 +1927895700 +2384227175 +3049232540 +3683880110 +4053222244 +1725647224 +3041589166 +2928709416 +3453067328 +2203986385 +848852074 +1902882473 +1462591001 +1464823307 +687377317 +223173894 +413964168 +1769005160 +2217816760 +2337525803 +2351563272 +3748671986 +2203041548 +290642136 +567673293 +1788422935 +71122630 +4023575382 +3909704648 +4021046569 +1858884831 +2127965610 +175709348 +2306183299 +2209332309 +341373442 +2639553834 +3458392131 +878097001 +1642879487 +519982608 +1910049504 +4040764323 +2230169907 +2567166560 +3982257867 +2662208048 +4230375680 +816119033 +2563262239 +1656150588 +256942434 +906945460 +2241363949 +2392070745 +1384312408 +2942969754 +2869181906 +3105073692 +3597072408 +1242046535 +888553907 +2893310941 +507831237 +2051081997 +4000527993 +2269196327 +4020109618 +3773247017 +4041510436 +1287090453 +611235783 +4050293672 +1483223287 +2682616799 +1012904491 +2001149295 +3109632981 +3784104491 +3851497790 +1792782999 +3697310145 +856348778 +1686899128 +1770131356 +3557001161 +84984458 +3373537818 +3658521884 +141339002 +2832032628 +2051651724 +3497766452 +3511360465 +830788091 +2131662583 +2695342535 +2028974303 +2585986409 +1202796069 +4239230042 +2983633704 +3550361727 +1822924858 +3080269619 +2726798836 +1292390171 +1473978890 +2300867433 +3559452785 +1216041886 +3426988555 +3323760430 +2928665047 +3996799634 +3683375421 +1067358865 +2197003130 +2771237692 +1805773280 +3966409150 +3410603168 +183603221 +1498928226 +3752874433 +23296878 +2098617011 +4219357637 +1107740054 +3707186630 +1714553100 +517139157 +2349628590 +2383739797 +2261154401 +1300772501 +2796137310 +2082045364 +2133555132 +2159933907 +1495859492 +160274550 +4005885655 +1891707282 +3980902989 +1762329452 +562564877 +3988525740 +1339745762 +927409554 +4020028773 +1251299911 +2485035820 +87614666 +2855591051 +1621338317 +1683173614 +914218482 +3858638651 +3210918422 +2411836172 +32326564 +2045166678 +4222619065 +4074070910 +331333876 +4028815264 +2949275715 +2215325896 +151091122 +3794387045 +3024799483 +1124192709 +3885214217 +99669674 +1613116989 +2023775210 +99726306 +3667089278 +3534698558 +342272183 +2575713736 +1912816666 +2668846780 +1966549431 +3077620123 +1971552314 +1545065936 +3159700893 +3245898384 +109538376 +2539529482 +3573289038 +4156032389 +3700950519 +1367955770 +672589394 +3662043125 +4042332483 +149187081 +1477767351 +1135837459 +3336272907 +1235937693 +1733433742 +3596351061 +2531141585 +1114837297 +1031224273 +3627905535 +341346709 +465374156 +2213880743 +2746064167 +181610749 +2864384953 +1939038687 +1159725082 +3718058990 +3888296646 +2554876694 +3452851051 +3811508508 +2221651094 +2684099963 +342161143 +1464337649 +1907672985 +3527933413 +4011949409 +559773942 +3097699965 +1961131111 +2684811410 +1893243718 +2686133719 +2568218955 +693999305 +2554478295 +490869786 +495749111 +1233783369 +666356642 +1224177279 +2961758586 +3338828597 +1004836878 +3578720500 +2306788442 +327148765 +4138457568 +2106277172 +2014413964 +4172238927 +1248507574 +554758499 +671331106 +3927964299 +583839997 +2249403078 +972192677 +3218717292 +4146051797 +3774225164 +2031111647 +2468010978 +3542069988 +302544754 +414997898 +2510272099 +2909406334 +3026845556 +2489923857 +4007508032 +685501136 +640811158 +1740840153 +1686909149 +2620373975 +3729698107 +486880222 +4093155131 +3112019978 +71307271 +1594241134 +4265020819 +1982303007 +3068710929 +2892693272 +1038189728 +1776727889 +3584781597 +372550050 +231885239 +2407302605 +1342917558 +1216056834 +629759607 +2905869016 +2892728870 +381273517 +3029775143 +2489925401 +1771909132 +2903678700 +2080505427 +4084868936 +4167013245 +954920425 +4180486036 +1338041878 +1669471035 +954963371 +3176683424 +1216651410 +2521874788 +3028232568 +2198978859 +2719016181 +3665377599 +89303721 +2506037124 +1235440185 +157531795 +2285016959 +2421225162 +2340607998 +1687764542 +3511911153 +3632210760 +3867290150 +1880946840 +3458022209 +4027058355 +2814493047 +671905627 +789481782 +204751859 +500195437 +984095432 +1069191429 +2998651494 +28277271 +1746272469 +3057184835 +119310603 +3075084194 +1446804126 +1828927955 +313350640 +2032374270 +2503269923 +3463113586 +1315360494 +698488949 +2463927095 +174616861 +3390126233 +1171630747 +1454229797 +3301898467 +4209771161 +942983050 +2323858998 +3823898081 +1155800405 +3446675862 +2933864906 +1220360254 +3464001754 +1615524439 +2999175851 +2751109489 +2767538978 +2449007995 +2610011157 +4085715438 +171763922 +515907990 +1673991305 +1078098441 +979005083 +3822527958 +95426417 +3233797140 +3803125700 +1957761682 +489955493 +4201675606 +2411270585 +1215006771 +3690329472 +218936583 +2627105652 +4291244407 +2962435291 +416439161 +2014222915 +3442600213 +1131210053 +59916468 +1250609107 +3765930485 +3308600664 +2764774513 +3979474377 +4914502 +4210357141 +2662168797 +634393582 +2529112144 +1058709003 +189637286 +4094821186 +3657921575 +348730167 +4131899799 +1483531774 +3176927756 +2128422809 +3827670248 +2788432613 +2936257126 +3952637418 +2551644619 +2671281367 +2419750798 +2382994706 +3252145151 +3037304805 +3470271490 +728903282 +3935203679 +1621400661 +1530245459 +537203955 +3188900111 +3312774538 +2330574702 +2427131216 +2262267608 +382058176 +1475344564 +2685184630 +3135271626 +1350475968 +1257957489 +1329043132 +1591474127 +2408602470 +432289893 +3029842012 +3463196135 +1012635489 +2096611147 +541364267 +3769008514 +2090690507 +510142130 +3479483226 +749295037 +4064925104 +1970642729 +572223890 +4093820592 +3866866414 +1670814517 +1040927349 +3645670854 +2209631448 +4190939426 +485074372 +274000537 +1352573608 +2579455831 +1048631094 +3594600159 +3156043295 +35746387 +2970743863 +849424577 +784584589 +4049792413 +330980267 +2704161090 +2359100246 +3847710678 +2614760791 +210729610 +1044352109 +3870640892 +4153614898 +2714756082 +2837177369 +1264445439 +3649939922 +638845192 +2226432240 +1215692818 +1618388125 +2315378380 +484512242 +3199201211 +3637793168 +3424326341 +1114805244 +1994979234 +750229781 +4117886749 +573355743 +2739804055 +2855894654 +1712409345 +1135393011 +3169687399 +2927084820 +1730208841 +2483790353 +1272277197 +15128328 +825776744 +1944712485 +3787029674 +2630348762 +1109343778 +4277036550 +130099580 +1985875634 +4237736776 +4042787194 +1212174485 +2509323765 +1047990657 +4023981228 +492790382 +4269199925 +877042142 +3795394397 +3103220410 +2143088987 +1190870531 +1645485545 +1513150300 +390636851 +1548921456 +3766755933 +4198258756 +3465217751 +2475580102 +2304318001 +1422968499 +4087381826 +4047402388 +2926321137 +2543919787 +1547705951 +3370477974 +2481592007 +113388293 +41185845 +924301831 +2564386344 +2709034792 +3543656348 +1760383406 +3971681731 +3760159099 +2090724272 +3029631513 +4098318492 +362966508 +3822624768 +4073282937 +3926513088 +1598274635 +2228964597 +597978133 +3198314858 +905585213 +3076799720 +652059650 +3182870708 +3713498837 +3417021165 +3442544482 +665553902 +3333624628 +3437085145 +2511985349 +966818010 +3713575950 +886037375 +35941793 +3621550710 +1788294590 +1654188418 +288315395 +2582819460 +1650029573 +953412985 +4166173116 +3355795490 +1273235308 +1493555292 +507591730 +2232293448 +2356468434 +2516850982 +3251296433 +1612644679 +3762161095 +2674371267 +1824890326 +3782185612 +3299313569 +2059961679 +2324312839 +3256719869 +2398233215 +2929251836 +30577467 +1525729739 +3067967359 +361060856 +45738127 +1272480870 +319360943 +456458499 +3624070044 +2920632964 +965926093 +835168055 +2551786182 +1055084855 +1760336814 +294830642 +2982964529 +1531989737 +3454198599 +358808267 +1305621603 +20455960 +318613687 +3193325198 +3947900941 +1202484889 +637956137 +1043301453 +160542283 +2213954281 +1293360705 +1377127634 +100007027 +902325868 +907644174 +1334709695 +3236204175 +848555434 +1499810963 +2119156646 +3021664237 +3961120297 +2260810407 +1412185098 +3994951566 +3394899547 \ No newline at end of file diff --git a/PHF_benchmark/Input_data/generate_test_data.py b/PHF_benchmark/Input_data/generate_test_data.py new file mode 100755 index 0000000..fed7eea --- /dev/null +++ b/PHF_benchmark/Input_data/generate_test_data.py @@ -0,0 +1,71 @@ +import sys +import math +import os +import random +import numpy as np + +# You need to generate different dimension-1 logic in test_0000_x.py +# In this file, the dimension-1 is set to IPV6 address as a string +# eg: "x.x.x.x.x.x.x.x", each "x" is a number from str(0) to str(16) +# "." does not appear in the string +# Total number of possible IP addesses is: d1 = 16*16*16*16*16*16*16*16 +# The function rand_ip(8) casts this IPv6 string with 8 chars into an integer +# maximum integer of rand_ip(8) would be: (2^32 - 1) +max_ip_num = 16 +# Set n value first +n = 10000 # each set has n input keys +z = 8 ## the name of the file would be 0000_1_54_4.txt + +# set the total number of key set +max_key_set = 1000 +# set the total number of test files +max_itr = 1 + +# generate a random IP address with length = l +# the random number for each 4bits follows uniform distribution +# In hardware, the input IPs do not need to be cast between data types, +# since they are always binary data +def rand_ip(l): + tmp_ip = int(random.uniform(0,max_ip_num)) + for s in range(l-1): + tmp_ip = tmp_ip*16 + int(random.uniform(0,max_ip_num)) + return tmp_ip +# # numpy random +# def np_rand_ip(l): +# tmp_ip = numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# for s in range(l-1): +# tmp_ip = tmp_ip*16 + numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# return tmp_ip + +if __name__=='__main__': + print('begin') + ################################ + ## curent folder + for folder_name in range(max_key_set): + cur_dir = "./Data_%d/%d"%(n,folder_name) + if not os.path.exists(cur_dir): + os.makedirs(cur_dir) + ip_list = [] + i = 0 + while(i < n): + ##for i in range(n): + ## generate 1 random IP + # 4 xxx IP strings + tmp_ip = str(rand_ip(z)) + if (tmp_ip not in ip_list): + # tmp_ip = np_rand_ip(4) # numpy version + ip_list.append(tmp_ip) + i += 1 + print('size of ip set is: ', len(ip_list)) + print('writing to txt file for folder %d...'%(folder_name)) + # divide the ip list into z group + # shuffle -> divide -> output + for itr in range(max_itr): + random.shuffle(ip_list) + fin = open("%s/key_0000_1_%d_%d__%s.txt"%(cur_dir,n,z,str(itr).zfill(6)),'w') + s = '\n' + fin.write(s.join(ip_list)) + fin.close() + print('finish all folders.') + + diff --git a/PHF_benchmark/README.md b/PHF_benchmark/README.md new file mode 100755 index 0000000..1111023 --- /dev/null +++ b/PHF_benchmark/README.md @@ -0,0 +1,65 @@ +# PHF benchmark +This is the benchmark code for (minimum) perfect hash function (PHF/MPHF) algorithms. BBHash, CHD, BDZ and SPHF are compared in terms of constructing time and theoretical storage cost. + +All algorithms need compile first in each folder. Please refer to different README.md in each subfolder. +## bbhash +BBHash algorithm is MPHF generator mainly designed for massive key sets. + +## cmph +cmph is a PHF/MPHF library with multiple different algorithms. We use the the CHD and BDZ in the experiment. + +## Satellite Perfect Hash Function (SPHF) +SPHF is PHF designed for satellite applications. The construction of hash function is based on searching suitable parameters in the helper array. +For more details, please refer to the paper. + +## SPHF-RL +SPHF-RL is PHF optimized according to hardware features, mainly for input key sets with size smaller than/equal to 10000. + +# Dependancy +Ubuntu 18.04, g++, python3, cmake + +# Input data generation +Input_data folder contains inputs used for generating PHF/MPHF functions and test the correctness of those functions. + +`python3 generate_test_data.py` + +The python3 program generates 1000 input files (mark as 1000 different folders). Example includes 0,1,2 folders. +By default, the size of input key set is 10000, please change n in line 16 for other input size. + +# PHF Result +Construction phase: + +1, For construction time, 1000 experiments are conducted. The max time and average time are calculated. + +2, For storage cost, source code of algorithms is analyzed and storage is estimated with the consideration of data structures used in construction steps. +Optimizations for existing algorithms (BBHash, CHD, BDZ) on hardware pletform remains as a future research direction. + +3, For function size, assume input are 10000 32-bit keys: + +BBHash: Estimation based on 2 levels of hash. For input, we allocate a buffer with size 32*10000=320000 bit. The conflict mark array for each level needs 10000 bit. Total is 340000 bit. + +CHD_PH, BDZ_PH: The storage is directly calculated by checking the size of function_file. + +SPHF: The storage is estimated with consideration of D[]. + +# RL Result (10000 32-bit input IPs) +The analysis is similar to PHF results. + +RL for these algorithms needs an output array with size m*2 bit (I[]). + +For construction time, an Epsilon time is added. + +For storage cost, m*2bit is added. + +For function space, m*2bit is added. + +Method |AVG time(ms) |MAX time(ms) |Storage(Kb) |Function Space(Kb) +-------------|------------------|:-------------:|:-------------:|:---------: +BDZ-PH-RL |3.73+e |6.85+e |3457 |39.6 +CHD-PH-RL |2.69+e |4.79+e |957 |30 +BBHash-RL |7.64+e |28.62+e |352 |39.2 +SPHF-RL |3.65+e |5.96+e |538 |50 + +# Citation +The current work is for IEEE TRANSACTIONS ON AEROSPACE AND ELECTRONIC SYSTEMS. +Any questions, please contact keran_zhang@outlook.com diff --git a/PHF_benchmark/SPHF-RTLP/.vscode/settings.json b/PHF_benchmark/SPHF-RTLP/.vscode/settings.json new file mode 100755 index 0000000..8f4afb2 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "iosfwd": "cpp" + } +} \ No newline at end of file diff --git a/PHF_benchmark/SPHF-RTLP/Allocator.h b/PHF_benchmark/SPHF-RTLP/Allocator.h new file mode 100755 index 0000000..26a51e7 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/Allocator.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- +#ifndef AllocatorH +#define AllocatorH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +enum TAllocConsts +{ +#ifdef __BORLANDC__ + acDefAlign = sizeof(int), +#else + acDefAlign = 32, +#endif +}; +//--------------------------------------------------------------------------- +class TAllocator +{ +public: + char *Malloc(size_t size,int align=acDefAlign); + char *Realloc(void *mem,size_t size,int align=acDefAlign,size_t oldSize=0); + void Free(void *mem); +}; +//--------------------------------------------------------------------------- +extern TAllocator defAllocator; +//--------------------------------------------------------------------------- +//#if !defined(WIN32) && !defined(_WIN32) +//#include +//#else +void *vmalloc(size_t sz); +void vfree(void *mem); +//#endif//WIN32 +//--------------------------------------------------------------------------- +void *vmallocReserve(size_t sz); +bool vmallocCommit(void* ptr,size_t sz); +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF-RTLP/AllocatorBase.cpp b/PHF_benchmark/SPHF-RTLP/AllocatorBase.cpp new file mode 100755 index 0000000..12bf882 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/AllocatorBase.cpp @@ -0,0 +1,5 @@ +//---- -------------------------------------------------------------------------------------------------------- +#include "Allocator.h" +//---- -------------------------------------------------------------------------------------------------------- +TAllocator defAllocator; +//---- -------------------------------------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF-RTLP/AllocatorC.cpp b/PHF_benchmark/SPHF-RTLP/AllocatorC.cpp new file mode 100755 index 0000000..a9743ef --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/AllocatorC.cpp @@ -0,0 +1,44 @@ +//--------------------------------------------------------------------------- +#include "Allocator.h" +#include +#include +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +// If there is no suitable allocator, use the default C allocator. +//--------------------------------------------------------------------------- +char *TAllocator::Malloc(size_t size,int align) +{ + logEmbdMsg("Prepare alloc %d-byte memory of align %d.\r\n",(int)size,align); +// #ifndef __LSeRTOS__ +// assert(align<=(int)sizeof(int)); +// #endif // __LSeRTOS__ + return (char*)malloc(size); +} +//--------------------------------------------------------------------------- +char *TAllocator::Realloc(void *mem,size_t size,int align,size_t oldSize) +{ + logEmbdMsg("Realloc %d-byte memory of align %d.\r\n",(int)size,align); +#ifndef __LSeRTOS__ + if(align>(int)sizeof(void *)) + { + char *p = Malloc(size,align); + if(p==NULL) + return NULL; + //This is WRONG. We should query the actual size of mem. But we havn't that interface yet. + if(oldSize==0) + oldSize = size; + memcpy(p,mem,oldSize); + Free(mem); + return p; + } +#endif // __LSeRTOS__ + + return (char*)realloc(mem,size); +} +//--------------------------------------------------------------------------- +void TAllocator::Free(void *mem) +{ + free(mem); +} +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF-RTLP/Array.h b/PHF_benchmark/SPHF-RTLP/Array.h new file mode 100755 index 0000000..8e0847a --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/Array.h @@ -0,0 +1,319 @@ +#pragma once +#ifndef ArrayH +#define ArrayH +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +// #include "Mem/FastMem.h" +#include +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +#define __is_trivial(x) false +#endif// __BORLANDC__ +//#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#define DefCommArrMath(func,retType) \ + retType func(int64_t num=0) const \ + { \ + if(num<=0) \ + num = Number; \ + \ + return Arr##func(&ObjConst(0),num); \ + } +//--------------------------------------------------------------------------- +// Causion: only one-time allocated array's alignment is preserved! +// Any increasement with New() will break the alignment set by Alloc. +//--------------------------------------------------------------------------- +template +class TArraySafe:public TArrayPubBase +{ +protected: + virtual void CallConstructor(void *obj) const + { + new (obj) T; + } + + virtual void CallDestructor(void *obj) const + { + ((T *)obj)->~T(); + } + + virtual bool IsTrivialElem() const + { + return __is_trivial(T); + } + + virtual int GetTypeSize() const + { + return sizeof(T); + } + +public: + TArraySafe() + { + } + + TArraySafe(int64_t num) + { + Alloc(num); + } + + virtual ~TArraySafe() + { + Close(); + } + + void Transfer(TArraySafe &o) + { + Close(); + img = o.img; + len = o.len; + Number = o.Number; + + o.ClearDataNoFree(); + } + + T &New(int64_t expandUnit=64) + { + return *(T*)TArrayPubBase::New(expandUnit); + } + + T &Obj(int64_t i) + { + assert(img); + assert(i>=0); + assert(i=0); + assert(i &operator=(TArraySafe &o) + { + Alloc(o.Number); + + for(int64_t i=0;i=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=pos;i--) + Obj(i+newNum) = Obj(i); + } + + return &Obj(pos); + } + + T *SlowDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(delNum>=1); + + int tail = Number-delNum; + + if(keepOrder==false) + { + for(int64_t i=0;i +class TArray:public TArraySafe +{ +public: + TArray() + { + } + + TArray(int64_t num) + :TArraySafe(num) + { + } + + void InitZero() + { + memset(this->img,0,sizeof(T)*this->len); + } + + void FastInit(T val) + { + MemSetType(this->img,val,sizeof(T)*this->len); + } + + void FastCopy(TArray &o,int64_t l=-1) + { + if( (l<0) || (l>o.Number) ) + l = o.Number; + + FastCopy(o(),l); + } + + void FastCopy(T *o,int64_t l) + { + this->Alloc(l); + memcpy(this->img,o,sizeof(T)*l); + TArraySafe::Number = l; + } + + T *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastInsert(pos,newNum,keepOrder); + } + + T *FastDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastDel(pos,delNum,keepOrder); + } + + void FastBInsert(T &obj,TSortCmp cmp,bool canRepeat=false) + { + TArrayPubBase::FastBInsert(&obj,cmp,canRepeat); + } +}; +//--------------------------------------------------------------------------- +typedef TArray TGrayArray; +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH + diff --git a/PHF_benchmark/SPHF-RTLP/ArrayPre.cpp b/PHF_benchmark/SPHF-RTLP/ArrayPre.cpp new file mode 100755 index 0000000..197aff3 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/ArrayPre.cpp @@ -0,0 +1,173 @@ +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +TArrayPubBase::~TArrayPubBase() +{ +} +//--------------------------------------------------------------------------- +void TArrayPubBase::Alloc(int64_t maxNum,int align, bool noConstructor) +{ + + logEmbdMsg("Prepare to alloc mem for array num=%d align=%d.\r\n",(int)maxNum,align); + Close(); + + logEmbdMsg("Array close ok.\r\n"); + + int typeSize = GetTypeSize(); + + logEmbdMsg("Get type size=%d ok.\r\n",typeSize); + + int64_t memSize = maxNum*typeSize; +#ifndef XrossCPP_In_64 + assert((memSize>>31)==0);//on 32-bit platforms, no memory alloc can larger than 2GB-1 +#endif // XrossCPP_In_64 + + logEmbdMsg("Ready to alloc %d-byte mem, defAllocator=%p.\r\n",(int)memSize,defAllocator); + // fprintf(stderr,"memSize is: %lu\n", memSize); + // fprintf(stderr,"align is: %d\n", align); + + img = defAllocator.Malloc((size_t)memSize,align); + logEmbdMsg("Alloc returned img=%p.\r\n",img); + + assert(img); + + len = maxNum; + + logEmbdMsg("Ready to call constructor.\r\n"); + + if( (noConstructor==false) && !IsTrivialElem() ) + { + logEmbdMsg("Now call constructor.\r\n"); + + for(int64_t i=0;i=0); + + if(newNum==len) + return; + + if(newNum==0) + { + Close(); + return; + } + + int typeSize = GetTypeSize(); + + if(newNumlen) + { + for(int64_t i=len;i=0) + { + if( (ret!=0) || canRepeat ) + memcpy(New(),key,typeSize); + + return; + } + + int64_t low = 0; + int64_t high = Number; + + while(low>1); + + ret = cmp(&key,img+mid*typeSize); + + if(ret==0) + { + if(canRepeat) + memcpy(FastInsert(mid,1,true),key,typeSize); + + return; + } + + if(ret<0) + high = mid; + else + low = mid+1; + } + + if(cmp(&key,img+low*typeSize)>0) + low ++; + + memcpy(FastInsert(low,1,true),key,typeSize); +} +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF-RTLP/ArrayPre.h b/PHF_benchmark/SPHF-RTLP/ArrayPre.h new file mode 100755 index 0000000..280f812 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/ArrayPre.h @@ -0,0 +1,289 @@ +#pragma once +#ifndef ArrayPreH +#define ArrayPreH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "SortBase.h" +#include "Allocator.h" +// #include "Mem/FastMem.h" +#include "Type64.h" +//--------------------------------------------------------------------------- +#ifndef NULL +#define NULL 0 +#endif //NULL +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TArrayPubBase +{ +protected: + char *img; + +public: + int64_t len; + int64_t Number; + +protected: + virtual void CallConstructor(void *obj) const = 0; + virtual void CallDestructor(void *obj) const = 0; + virtual bool IsTrivialElem() const = 0; + virtual int GetTypeSize() const = 0; + + void *New(int64_t expandUnit=64) + { + if(Number==len) + ChCapacity(len+expandUnit); + + void *p = img+(size_t)Number*GetTypeSize(); + + Number ++; + + return p; + } + + void *Search(const void *key,TSortCmp cmp,int64_t n=-1) const; + + void *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=0); + assert(pos<=Number); + assert(delNum>=1); + + int typeSize = GetTypeSize(); + int64_t tail = Number-delNum; + char *mPos = img+(size_t)pos*typeSize; + + if(keepOrder==false) + memcpy(mPos,img+(size_t)tail*typeSize,(size_t)delNum*typeSize); + else + memcpy(mPos,mPos+(size_t)delNum*typeSize,(size_t)(tail-pos)*typeSize); + + Number = tail; + + return mPos; + } + + void FastBInsert(void *key,TSortCmp cmp,bool canRepeat=true); + +public: + TArrayPubBase() + { + img = NULL; + len = 0; + Number = 0; + } + + virtual ~TArrayPubBase(); + + void Close(bool noConstructor=false); + + void ClearDataNoFree() + { + img = NULL; + len = 0; + Number = 0; + } + + void Alloc(int64_t maxNum,int align=32, bool noConstructor=false); + void AllocFill(int64_t maxNum,int align=32, bool noConstructor=false) + { + Alloc(maxNum,align,noConstructor); + Number = len; + } + void ChCapacity(int64_t newNum,int align=32); + + int64_t Size() const + { + return Number*GetTypeSize(); + } + + int64_t StorageSize() const + { + return len*GetTypeSize(); + } + + int64_t SpaceSize() const + { + return (len-Number)*GetTypeSize(); + } + + void *ObjAt(int64_t inx) const + { + assert(inx>=0); + assert(inx o.Move(TArray src) + void Move(TArrayPubBase &src) + { + Close(); + + img = src.img; + len = src.len; + Number = src.Number; + + src.img = NULL; + src.len = 0; + src.Number = 0; + } + + void Grow(int64_t nGrow) + { + if((Number+nGrow)>len) + ChCapacity(Number+nGrow); + + Number += nGrow; + } +}; +//--------------------------------------------------------------------------- +template +int64_t ArrLargest(T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i*tmp) + { + tmp = array+i; + index = i; + } + } + + return index; +} +//--------------------------------------------------------------------------- +template +int64_t ArrSmallest(const T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i +void ArrMinMax(const T *array,int64_t num,int64_t &minIndex,int64_t &maxIndex) +{ + T *tMin = array; + T *tMax = array; + + int64_t iMin=0, iMax=0; + + for(int64_t i=1;i*tMax) + { + *tMax = array+i; + iMax = i; + } + } + + minIndex = iMin; + maxIndex = iMax; +} +//--------------------------------------------------------------------------- +template +void ArrTotal(const T *array,int64_t num,T &ret) +{ + ret = array[0]; + + for(int64_t i=1;i +inline void ArrMean(const T *array,int64_t num,T &ret) +{ + T tmp; + + ArrTotal(array,num,tmp); + + ret = tmp/num; +} +//--------------------------------------------------------------------------- +//base e entropy +//--------------------------------------------------------------------------- +template +double ArrEntropyE(const T *array,int64_t num) +{ + T sum; + + ArrTotal(array,num,sum); + + double e = 0; + double m = 1.0/sum; + + for(int64_t i=0;i1e-30) + e -= t*log(t); + } + + return e; +} +//--------------------------------------------------------------------------- +template +inline double ArrEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)*1.4426950408889634073599246810019; //log2(e) +} +//--------------------------------------------------------------------------- +template +inline double ArrNormEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)/log(num); +} +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH diff --git a/PHF_benchmark/SPHF-RTLP/CMakeLists.txt b/PHF_benchmark/SPHF-RTLP/CMakeLists.txt new file mode 100755 index 0000000..37c670f --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/CMakeLists.txt @@ -0,0 +1,12 @@ +# CMake 最低版本号要求 +cmake_minimum_required (VERSION 2.8) + +# 项目信息 +project (CheckHash) + +set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD_REQUIRED True) + +# 指定生成目标 +add_executable(CheckHash main.cpp IntUtils.cpp PerfectHashBuilder.cpp ArrayPre.cpp AllocatorBase.cpp AllocatorC.cpp City64.cpp) + diff --git a/PHF_benchmark/SPHF-RTLP/CheckHash b/PHF_benchmark/SPHF-RTLP/CheckHash new file mode 100755 index 0000000..0fe771d Binary files /dev/null and b/PHF_benchmark/SPHF-RTLP/CheckHash differ diff --git a/PHF_benchmark/SPHF-RTLP/City64.cpp b/PHF_benchmark/SPHF-RTLP/City64.cpp new file mode 100755 index 0000000..3ec6352 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/City64.cpp @@ -0,0 +1,259 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides CityHash64() and related functions. +// +// It's probably possible to create even faster hash functions by +// writing a program that systematically explores some of the space of +// possible hash functions, by using SIMD instructions, or by +// compromising on hash quality. +// +// Comment by LHZ 2017.5.19: +// This hash function has been tested by the following dataset: +// 1. 2G (items) Chinese word groups from 40G Chinese news text +// 2. 4M Chinese words from 40G Chinese news text +// 3. 1M Chinese words dictionary +// No conflict found yet. + +#include "City64.h" +#include "Type64.h" +#include + +#define Fetch64(x) (*(uint64_t*)(x)) +#define Fetch32(x) (*(uint32_t*)(x)) + +enum +{ +// Some primes between 2^63 and 2^64 for various uses. + k0 = 0xc3a5c85c97cb3127ULL, + k1 = 0xb492b66fbe98f273ULL, + k2 = 0x9ae16a3b2f90404fULL, + k3 = 0xc949d7c7509e6557ULL, +// for Hash128to64 + kMul = 0x9ddfea08eb382d69ULL, +}; +// Hash 128 input bits down to 64 bits of output. +// This is intended to be a reasonably good hash function. +inline uint64_t Hash128to64(uint64_t vL, uint64_t vH) { + // Murmur-inspired hashing. + uint64_t a = (vL ^ vH) * kMul; + a ^= (a >> 47); + uint64_t b = (vH ^ a) * kMul; + b ^= (b >> 47); + b *= kMul; + return b; +} + +// Bitwise right rotate. Normally this will compile to a single +// instruction, especially if the shift is a manifest constant. +inline uint64_t Rotate(uint64_t val, int shift) { + // Avoid shifting by 64: doing so yields an undefined result. + return shift == 0 ? val : ((val >> shift) | (val << (64 - shift))); +} + +// Equivalent to Rotate(), but requires the second arg to be non-zero. +// On x86-64, and probably others, it's possible for this to compile +// to a single instruction if both args are already in registers. +inline uint64_t RotateByAtLeast1(uint64_t val, int shift) { + return (val >> shift) | (val << (64 - shift)); +} + +inline uint64_t ShiftMix(uint64_t val) { + return val ^ (val >> 47); +} + +#define HashLen16 Hash128to64 + +inline uint64_t HashLen0to16(const char *s, size_t len) { + if (len > 8) { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + if (len >= 4) { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + if (len > 0) { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + return k2; +} +/* +inline uint64_t HashLen0to16(const char *s, size_t len) { + static uint8_t off[]={ + 3, + 2,2,2, + 1,1,1,1,1, + 0,0,0,0,0,0,0,0}; + + switch(off[len]) + { + case 0: + { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + case 1: + { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + case 2: + { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + case 3: + return k2; + } +} +*/ + +// This probably works well for 16-byte strings as well, but it may be overkill +// in that case. +inline uint64_t HashLen17to32(const char *s, size_t len) { + uint64_t a = Fetch64(s) * k1; + uint64_t b = Fetch64(s + 8); + uint64_t c = Fetch64(s + len - 8) * k2; + uint64_t d = Fetch64(s + len - 16) * k0; + return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d, + a + Rotate(b ^ k3, 20) - c + len); +} + +// Return a 16-byte hash for 48 bytes. Quick and dirty. +// Callers do best to use "random-looking" values for a and b. +inline void WeakHashLen32WithSeeds(TX128Data &out, + uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) { + a += w; + b = Rotate(b + a + z, 21); + uint64_t c = a; + a += x; + a += y; + b += Rotate(a, 44); + out.u64[0] = a+z; + out.u64[1] = b+c; +} + +// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. +inline void WeakHashLen32WithSeeds(TX128Data &out, + const char* s, uint64_t a, uint64_t b) { + WeakHashLen32WithSeeds(out,Fetch64(s), + Fetch64(s + 8), + Fetch64(s + 16), + Fetch64(s + 24), + a, + b); +} + +// Return an 8-byte hash for 33 to 64 bytes. +inline uint64_t HashLen33to64(const char *s, size_t len) { + uint64_t z = Fetch64(s + 24); + uint64_t a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0; + uint64_t b = Rotate(a + z, 52); + uint64_t c = Rotate(a, 37); + a += Fetch64(s + 8); + c += Rotate(a, 7); + a += Fetch64(s + 16); + uint64_t vf = a + z; + uint64_t vs = b + Rotate(a, 31) + c; + a = Fetch64(s + 16) + Fetch64(s + len - 32); + z = Fetch64(s + len - 8); + b = Rotate(a + z, 52); + c = Rotate(a, 37); + a += Fetch64(s + len - 24); + c += Rotate(a, 7); + a += Fetch64(s + len - 16); + uint64_t wf = a + z; + uint64_t ws = b + Rotate(a, 31) + c; + uint64_t r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0); + return ShiftMix(r * k0 + vs) * k2; +} + +uint64_t CityHash64(const char *s, size_t len) { + if (len <= 32) { + if (len <= 16) { + return HashLen0to16(s, len); + } else { + return HashLen17to32(s, len); + } + } else if (len <= 64) { + return HashLen33to64(s, len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + uint64_t x = Fetch64(s + len - 40); + uint64_t y = Fetch64(s + len - 16) + Fetch64(s + len - 56); + uint64_t z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); + TX128Data v,w; + + WeakHashLen32WithSeeds(v, s + len - 64, len, z); + WeakHashLen32WithSeeds(w, s + len - 32, y + k1, x); + x = x * k1 + Fetch64(s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + len = (len - 1) & ~static_cast(63); + do { + x = Rotate(x + y + v.u64[0] + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.u64[1] + Fetch64(s + 48), 42) * k1; + x ^= w.u64[1]; + y += v.u64[0] + Fetch64(s + 40); + z = Rotate(z + w.u64[0], 33) * k1; + WeakHashLen32WithSeeds(v, s, v.u64[1] * k1, x + w.u64[0]); + WeakHashLen32WithSeeds(w, s + 32, z + w.u64[1], y + Fetch64(s + 16)); + uint64_t tmp=z;z=x;x=tmp; + s += 64; + len -= 64; + } while (len != 0); + return HashLen16(HashLen16(v.u64[0], w.u64[0]) + ShiftMix(y) * k1 + z, + HashLen16(v.u64[1], w.u64[1]) + x); +} + + +uint64_t CityHash64WithSeeds(const char *s, size_t len, + uint64_t seed0, uint64_t seed1) { + return HashLen16(CityHash64(s, len) - seed0, seed1); +} + +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed) { + return CityHash64WithSeeds(s, len, k2, seed); +} + +uint64_t FastStrHash(const char *str,int len) +{ + if(len<0) + len = strlen(str); + + return CityHash64(str,len); +} + +uint64_t FastIntHash(uint64_t hash,uint64_t seed) +{ + return HashLen16(hash - k2, seed); +} diff --git a/PHF_benchmark/SPHF-RTLP/City64.h b/PHF_benchmark/SPHF-RTLP/City64.h new file mode 100755 index 0000000..a386595 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/City64.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides a few functions for hashing strings. On x86-64 +// hardware in 2011, CityHash64() is faster than other high-quality +// hash functions, such as Murmur. This is largely due to higher +// instruction-level parallelism. CityHash64() and CityHash128() also perform +// well on hash-quality tests. +// +// CityHash128() is optimized for relatively long strings and returns +// a 128-bit hash. For strings more than about 2000 bytes it can be +// faster than CityHash64(). +// +// Functions in the CityHash family are not suitable for cryptography. +// +// WARNING: This code has not been tested on big-endian platforms! +// It is known to work well on little-endian platforms that have a small penalty +// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs. +// +// By the way, for some hash functions, given strings a and b, the hash +// of a+b is easily derived from the hashes of a and b. This property +// doesn't hold for any hash functions in this file. + +#ifndef CITY_HASH_64_H_ +#define CITY_HASH_64_H_ + +#include +#include + +// Hash function for a byte array. +uint64_t CityHash64(const char *buf, size_t len); +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed); +uint64_t CityHash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t seed1); + +#endif // CITY_HASH_H_ diff --git a/PHF_benchmark/SPHF-RTLP/FastStrHash.h b/PHF_benchmark/SPHF-RTLP/FastStrHash.h new file mode 100755 index 0000000..8e59f44 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/FastStrHash.h @@ -0,0 +1,17 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef FastStrHashH +#define FastStrHashH +//---- -------------------------------------------------------------------------------------------------------- +#include +//#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +/*--------------------------------------------------------------------------- +A wrapper on Google's City64 hash function. +---------------------------------------------------------------------------*/ +uint64_t FastStrHash(const char *str,int len=-1); +uint64_t FastIntHash(uint64_t hash,uint64_t seed); +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF-RTLP/IntUtils.cpp b/PHF_benchmark/SPHF-RTLP/IntUtils.cpp new file mode 100755 index 0000000..9ba1eec --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/IntUtils.cpp @@ -0,0 +1,184 @@ +//--------------------------------------------------------------------------- +#include "IntUtils.h" +#include +// #include "Sys/CpuUtils.h" +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2) +{ +#if defined(XrossCPP_In_64) + return ((__int128_t)val1 * val2) >> 64; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + return (m2>>32) + (uint64_t)v1H*v2H + (c>>31); +#endif +} +//--------------------------------------------------------------------------- +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low) +{ +#if defined(XrossCPP_In_64) + __int128_t tmp = (__int128_t)val1 * val2; + high = (uint64_t)(tmp>>64); + low = (uint64_t) tmp; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + high = (m2>>32) + (uint64_t)v1H*v2H + (c>>31); + low = mLL+(m1<<32); +#endif +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val) +{ + val--; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + val |= val >> 32; + return val+1; +} +//--------------------------------------------------------------------------- +// We havn't implement them yet +//--------------------------------------------------------------------------- +/* +#ifndef XrossCPP_In_64 +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +#endif // XrossCPP_In_64 +*/ +// //--------------------------------------------------------------------------- +// static bool RM_witness(uint64_t n, uint64_t a, uint64_t s, unsigned tMinus1) +// { +// uint64_t v = 1; + +// while (s > 0) +// { +// if ( (s&1) == 1 ) +// v = Mul64Mod(n,v,a); + +// a = Mul64Mod(n,a,a); +// s >>= 1; +// } + +// if (1 == v) +// return true; + +// uint64_t nM1 = n-1; + +// for (unsigned i = 0; v != nM1; i++) +// { +// if (i == tMinus1) +// return false; + +// v = Mul64Mod(n,v,v); +// } + +// return true; +// } +//--------------------------------------------------------------------------- +bool RM_PrimeTest(uint64_t p) +{ + uint64_t x = (uint64_t)sqrt(p); + uint64_t i = 3; + if(p==2)return true; + if(p%2 == 0)return false; + while(i>= t; + +// t--; // we use t-1 all the time + +// /* +// * Witness 2 is deterministic for all n < 2047. Witnesses 2, 7, 61 +// * are deterministic for all n < 4,759,123,141. +// */ + +// if (RM_witness(n, 2, s, t)==false) +// return false; + +// if (n < 2027) +// return true; + +// if (RM_witness(n, 7, s, t)==false) +// return false; + +// if(n<4759123141ull) +// return RM_witness(n, 61, s, t); + +// static const uint8_t witness64[] = { 3, 5, 11, 13, 17, 19, 23, 29, 31, 37 }; // 2 & 7 are tested already + +// for (unsigned i = 0; i < (sizeof(witness64)/sizeof(witness64[0])); i++) +// { +// if (!RM_witness(n, witness64[i], s, t)) +// return false; +// } + +// return true; +// } +//--------------------------------------------------------------------------- +uint64_t RoundUpPrime(uint64_t val) +{ + val |= 1; + + while( (RM_PrimeTest(val)==false) && (val>1) ) + val += 2; + + return (val<=1?0:val); +} +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF-RTLP/IntUtils.h b/PHF_benchmark/SPHF-RTLP/IntUtils.h new file mode 100755 index 0000000..68ad792 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/IntUtils.h @@ -0,0 +1,62 @@ +//--------------------------------------------------------------------------- +#ifndef IntUtilsH +#define IntUtilsH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "Type64.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2); +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low); +//--------------------------------------------------------------------------- +// Following functions can be optimized by asm +// mul1*mul2 -> 64-bit result%d +inline uint32_t /*__fastcall*/ MulMod(uint32_t m1,uint32_t m2,uint32_t d) +{ + return (uint32_t)(((uint64_t)m1*m2)%d); +} +// p1*p2 -> 64-bit result+c +inline uint64_t /*__fastcall*/ MulAdd(uint32_t m1,uint32_t m2,uint32_t c) +{ + return ((uint64_t)m1*m2)+c; +} +// m1*m2 -> 64-bit result +inline uint64_t /*__fastcall*/ Mul(uint32_t m1,uint32_t m2) +{ + return ((uint64_t)m1*m2); +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val); +uint64_t RoundUpPrime(uint64_t val); +/*--------------------------------------------------------------------------- +Rabin-Miller primality test for up to max uint64_t. +Causion: we think 0, 1, 2 are not prime. +Causion: only work on x64 platform. +---------------------------------------------------------------------------*/ +bool RM_PrimeTest(uint64_t n); +//--------------------------------------------------------------------------- +//High efficient mul and div funcs for x64 platform only +//#ifdef XrossCPP_In_X64 +#ifdef __cplusplus +extern "C" +{ +#endif//__cplusplus +//--------------------------------------------------------------------------- +/* (m1*m2) % modV */ +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2); +/* (m1*m2) / divV */ +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2); +/* (m1*m2) /% divV, return both */ +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2); +//--------------------------------------------------------------------------- +#ifdef __cplusplus +} +#endif//__cplusplus +//#endif //XrossCPP_In_X64 +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF-RTLP/Makefile b/PHF_benchmark/SPHF-RTLP/Makefile new file mode 100755 index 0000000..2f829a8 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/Makefile @@ -0,0 +1,358 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/keran2/Work/timeComparePHF/SPHF + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/keran2/Work/timeComparePHF/SPHF + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/timeComparePHF/SPHF/CMakeFiles /home/keran2/Work/timeComparePHF/SPHF/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/timeComparePHF/SPHF/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named CheckHash + +# Build rule for target. +CheckHash: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 CheckHash +.PHONY : CheckHash + +# fast build rule for target. +CheckHash/fast: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/build +.PHONY : CheckHash/fast + +AllocatorBase.o: AllocatorBase.cpp.o + +.PHONY : AllocatorBase.o + +# target to build an object file +AllocatorBase.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorBase.cpp.o +.PHONY : AllocatorBase.cpp.o + +AllocatorBase.i: AllocatorBase.cpp.i + +.PHONY : AllocatorBase.i + +# target to preprocess a source file +AllocatorBase.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorBase.cpp.i +.PHONY : AllocatorBase.cpp.i + +AllocatorBase.s: AllocatorBase.cpp.s + +.PHONY : AllocatorBase.s + +# target to generate assembly for a file +AllocatorBase.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorBase.cpp.s +.PHONY : AllocatorBase.cpp.s + +AllocatorC.o: AllocatorC.cpp.o + +.PHONY : AllocatorC.o + +# target to build an object file +AllocatorC.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorC.cpp.o +.PHONY : AllocatorC.cpp.o + +AllocatorC.i: AllocatorC.cpp.i + +.PHONY : AllocatorC.i + +# target to preprocess a source file +AllocatorC.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorC.cpp.i +.PHONY : AllocatorC.cpp.i + +AllocatorC.s: AllocatorC.cpp.s + +.PHONY : AllocatorC.s + +# target to generate assembly for a file +AllocatorC.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorC.cpp.s +.PHONY : AllocatorC.cpp.s + +ArrayPre.o: ArrayPre.cpp.o + +.PHONY : ArrayPre.o + +# target to build an object file +ArrayPre.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/ArrayPre.cpp.o +.PHONY : ArrayPre.cpp.o + +ArrayPre.i: ArrayPre.cpp.i + +.PHONY : ArrayPre.i + +# target to preprocess a source file +ArrayPre.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/ArrayPre.cpp.i +.PHONY : ArrayPre.cpp.i + +ArrayPre.s: ArrayPre.cpp.s + +.PHONY : ArrayPre.s + +# target to generate assembly for a file +ArrayPre.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/ArrayPre.cpp.s +.PHONY : ArrayPre.cpp.s + +City64.o: City64.cpp.o + +.PHONY : City64.o + +# target to build an object file +City64.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/City64.cpp.o +.PHONY : City64.cpp.o + +City64.i: City64.cpp.i + +.PHONY : City64.i + +# target to preprocess a source file +City64.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/City64.cpp.i +.PHONY : City64.cpp.i + +City64.s: City64.cpp.s + +.PHONY : City64.s + +# target to generate assembly for a file +City64.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/City64.cpp.s +.PHONY : City64.cpp.s + +IntUtils.o: IntUtils.cpp.o + +.PHONY : IntUtils.o + +# target to build an object file +IntUtils.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/IntUtils.cpp.o +.PHONY : IntUtils.cpp.o + +IntUtils.i: IntUtils.cpp.i + +.PHONY : IntUtils.i + +# target to preprocess a source file +IntUtils.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/IntUtils.cpp.i +.PHONY : IntUtils.cpp.i + +IntUtils.s: IntUtils.cpp.s + +.PHONY : IntUtils.s + +# target to generate assembly for a file +IntUtils.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/IntUtils.cpp.s +.PHONY : IntUtils.cpp.s + +PerfectHashBuilder.o: PerfectHashBuilder.cpp.o + +.PHONY : PerfectHashBuilder.o + +# target to build an object file +PerfectHashBuilder.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/PerfectHashBuilder.cpp.o +.PHONY : PerfectHashBuilder.cpp.o + +PerfectHashBuilder.i: PerfectHashBuilder.cpp.i + +.PHONY : PerfectHashBuilder.i + +# target to preprocess a source file +PerfectHashBuilder.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/PerfectHashBuilder.cpp.i +.PHONY : PerfectHashBuilder.cpp.i + +PerfectHashBuilder.s: PerfectHashBuilder.cpp.s + +.PHONY : PerfectHashBuilder.s + +# target to generate assembly for a file +PerfectHashBuilder.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/PerfectHashBuilder.cpp.s +.PHONY : PerfectHashBuilder.cpp.s + +main.o: main.cpp.o + +.PHONY : main.o + +# target to build an object file +main.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i + +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s + +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... CheckHash" + @echo "... edit_cache" + @echo "... AllocatorBase.o" + @echo "... AllocatorBase.i" + @echo "... AllocatorBase.s" + @echo "... AllocatorC.o" + @echo "... AllocatorC.i" + @echo "... AllocatorC.s" + @echo "... ArrayPre.o" + @echo "... ArrayPre.i" + @echo "... ArrayPre.s" + @echo "... City64.o" + @echo "... City64.i" + @echo "... City64.s" + @echo "... IntUtils.o" + @echo "... IntUtils.i" + @echo "... IntUtils.s" + @echo "... PerfectHashBuilder.o" + @echo "... PerfectHashBuilder.i" + @echo "... PerfectHashBuilder.s" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/PHF_benchmark/SPHF-RTLP/PerfectHash.h b/PHF_benchmark/SPHF-RTLP/PerfectHash.h new file mode 100755 index 0000000..e70ff5e --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/PerfectHash.h @@ -0,0 +1,37 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectHashH +#define PerfectHashH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "Type64.h" +#include "FastStrHash.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#define PHDataHdr "PerfectHash0.10" +//--------------------------------------------------------------------------- +struct TPerfectHashData +{ + uint64_t r; + uint64_t m; + //In general d uses uint8_t is enough. For very difficult cases may change to uint16_t. + uint8_t d[sizeof(int64_t)/sizeof(uint8_t)]; //Causion: the number is dummy for syntax only, should be computed by builder! + + //The core hash function. For int data with length less than 64-bit, f(x)=x can be used for the first hash + uint64_t Hash(uint64_t val) + { + return FastIntHash(val,d[val%r])%m; + } + + //For variable length strings, it is hashed to 64-bit fixed length int first + uint64_t HashStr(const char *str,int len=-1) + { + return Hash(FastStrHash(str,len)); + } +}; +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF-RTLP/PerfectHashBuilder.cpp b/PHF_benchmark/SPHF-RTLP/PerfectHashBuilder.cpp new file mode 100755 index 0000000..7382975 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/PerfectHashBuilder.cpp @@ -0,0 +1,169 @@ +//--------------------------------------------------------------------------- +#include +#include "PerfectHashBuilder.h" +#include "PerfectHash.h" +#include "IntUtils.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint64_t startPos; + int64_t nItem; +}; +//--------------------------------------------------------------------------- +int CmpSlot(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectHashBuilder::Build(uint64_t *hash,uint64_t nHash,int nBucket,int nSlot,int nSpace) +{ + // if( (nHash==0) || (nPerSlot<=0) || ((uint64_t)nPerSlot>nHash) ) + // return false; + // int64_t nSlot = RoundUpPrime(nHash*100/nPerSlot); + + // if(nSlot==0) + // return false; + + // if(nBucket==0) + // nBucket = RoundUpPrime(nHash); + + // if(nBucket==0){ + // fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + // return false; + // } + + if(nSpace==0) + nSpace = nBucket; + + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + + for(uint64_t i=0;i sortedHash; + sortedHash.AllocFill(nHash); + + for(uint64_t i=0;ir = nSlot; + // p->m = nBucket; + + TBitArray maskBits; + maskBits.Alloc(nBucket); + + TArray bitStack; + bitStack.AllocFill(slots[0].nItem); + + for(int64_t i=0;id[0])*8))-1; + // fprintf(stderr,"maxD = %ld. \r\n", maxD); + int64_t maxD = 512; + for(int64_t d=0;d> 7); + b ^= (a >> 8); + c ^= (b >> 9); + d1 ^= (c >> 10); + // b ^= (b >> 47); + // b *= kMul; + uint64_t e = a ^ b ^ c ^ d1; + + + // uint64_t b = ((vL>>1) ^ vH) * kMul; + // b ^= (b >> 6); + // int f = (a ^ b)%nSpace; + + int f = (e)%nSpace; + + // for Routing Table Lookup task + // uint32_t x_key = sortedHash[startPos+j]; + // sol 2: without city hash + // int f = (((x_key >> 7) + (uint32_t)d) ^ ((x_key >> 8) ^ x_key)) %nSpace; + // sol x not used: + // int64_t x_key1 = (x_key * d); + // int f = (((x_key1 >> 7) + (uint32_t)d) ^ ((x_key1 >> 8) ^ x_key1)) %nSpace; + + if( (f>=nBucket) || (maskBits[f]) ) + { + while(j>0) + { + j--; + maskBits.ClearBit(bitStack[j]); + } + fail = true; + break; + } + + maskBits.SetBit(f); + bitStack[j] = f; + } + + if(fail==false) + { + // p->d[sortedHash[startPos]%nSlot] = (uint16_t)d; + data[sortedHash[startPos]%nSlot] = (uint16_t)d; + break; + } + } + + if(fail) + return false; // we can't find suitable d in [0,65535] + } + + return true; +} + +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF-RTLP/PerfectHashBuilder.h b/PHF_benchmark/SPHF-RTLP/PerfectHashBuilder.h new file mode 100755 index 0000000..5049c98 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/PerfectHashBuilder.h @@ -0,0 +1,108 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectHashBuilderH +#define PerfectHashBuilderH +//--------------------------------------------------------------------------- +#include +#include +#include +// #include "Hash/PerfectHash.h" +#include "Array.h" +// #include "SyncUtils.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TBitArray +{ +public: + uint64_t *arr; + int64_t nBit; + + TBitArray() + { + arr = NULL; + nBit = 0; + } + + ~TBitArray() + { + Close(); + } + + void Close() + { + if(arr) + { + delete arr; + nBit = 0; + } + } + + void Alloc(int64_t _nBit) + { + Close(); + + nBit = (_nBit+63)&~63ull; + arr = new uint64_t[nBit>>6]; + ClearAll(); + } + + bool operator[](int64_t inx) + { + assert(inx>=0); + assert(inx>6]&(1ull<<(inx&63)))!=0; + } + + void SetBit(int64_t inx) + { + assert(inx>=0); + assert(inx>6); + int64_t mask = (1ull<<(inx&63)); + + arr[ip] |= mask; + } + + void ClearBit(int64_t inx) + { + assert(inx>=0); + assert(inx>6); + int64_t mask = (1ull<<(inx&63)); + + arr[ip] &= ~mask; + } + + void ClearAll() + { + assert(arr); + memset(arr,0,(nBit>>3)); + } +};//--------------------------------------------------------------------------- +class TPerfectHashBuilder +{ +public: + TArray data; + + ~TPerfectHashBuilder() + { + Close(); + } + + void Close() + { + data.Close(); + } + + //if nBucket==0, nBucket = nHash round up to prime. + //To find MPH, set nBucket=nHash + //nPerSlot= realNumItemPerSlot*100 (can less than 100, meaning avg less than 1 per slot) + //nSpace is used to setup more bucket spaces to reduce the search difficulty on very difficult dataset. + bool Build(uint64_t *hash,uint64_t nHash,int nBucket=65536,int nSlot=8192,int nSpace=0); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectHashBuilder &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF-RTLP/README.md b/PHF_benchmark/SPHF-RTLP/README.md new file mode 100755 index 0000000..b3ead96 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/README.md @@ -0,0 +1,26 @@ +# SPHF-RTLP +SPHF-RTLP is the optimized version of SPHF, which targets at 10000 keys mapping with less hardware resource for query step. + +Different from SPHF in two aspects. + +1, The option for r and m is power of 2. + +2, f() is eliminated and g() is modified with lightweight hash based on prime coefficients. + +Refer to the original paper for more information. + +# Compile and Run +Use cmake with g++ to compile the program. + +``` +cmake .. +make +``` + +To test all files in the folder. Results will be shown in terminal. +For example, FOLDER_PATH="../Input_data" + +`./CheckHash FOLDER_PATH/` + +# Citation +Any questions, please contact keran_zhang@outlook.com diff --git a/PHF_benchmark/SPHF-RTLP/SortBase.h b/PHF_benchmark/SPHF-RTLP/SortBase.h new file mode 100755 index 0000000..7f2c4bf --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/SortBase.h @@ -0,0 +1,20 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef sortBaseH +#define sortBaseH +//---- -------------------------------------------------------------------------------------------------------- +#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +//---- -------------------------------------------------------------------------------------------------------- +typedef int (*TSortCmp)(const void *r1,const void *r2); +//---- -------------------------------------------------------------------------------------------------------- +inline void XchgStorage(void *d1,void *d2,void *buff,int w) +{ + memcpy(buff,d1,w); + memcpy(d1,d2,w); + memcpy(d2,buff,w); +} +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF-RTLP/Type64.h b/PHF_benchmark/SPHF-RTLP/Type64.h new file mode 100755 index 0000000..a77e44c --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/Type64.h @@ -0,0 +1,110 @@ +#pragma once +#ifndef Type64H +#define Type64H +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#undef XrossCPP_In_64 +#undef XrossCPP_In_32 +#undef XrossCPP_In_IA64 +#undef XrossCPP_In_PC +#undef XrossCPP_In_X64 +#undef XrossCPP_In_X86 +#undef XrossCPP_In_ARM +#undef XrossCPP_In_ARM_thumb +//--------------------------------------------------------------------------- +#ifdef __GNUC__ +# if defined (__amd64__) || defined (__amd64) || defined (__x86_64__) || defined (__x86_64) +# define XrossCPP_In_X64 +# define XrossCPP_In_64 +# define XrossCPP_In_PC +# elif defined (_IA64) || defined (__ia64__) || defined (__IA64__) +# define XrossCPP_In_IA64 +# define XrossCPP_In_64 +# elif defined (__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +# elif defined (__arm__) +# if defined (__thumb__) +# define XrossCPP_In_ARM_thumb +# endif +# define XrossCPP_In_ARM +# define XrossCPP_In_32 +# endif +#elif defined (__BORLANDC__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +#endif +//--------------------------------------------------------------------------- +#if !defined(WIN32) && !defined(_WIN32) +#define __fastcall +#endif +//--------------------------------------------------------------------------- +#ifdef XrossCPP_In_64 + typedef int64_t sint_t; + typedef uint64_t uint_t; +#elif !defined(__LSeRTOS__) + typedef int32_t sint_t; + typedef uint32_t uint_t; +#endif +//--------------------------------------------------------------------------- +union TX64Data +{ + int64_t i64; + uint64_t u64; + + int32_t i32[2]; + int16_t i16[4]; + int8_t i8[8]; + + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8[8]; + + double df; + float f[2]; +}; +//--------------------------------------------------------------------------- +#define x64Low32(x) ((TX64Data*)&x)->u32[0] +#define x64High32(x) ((TX64Data*)&x)->u32[1] +//--------------------------------------------------------------------------- +union TX128Data +{ + TX64Data x64[2]; + int64_t i64[2]; + uint64_t u64[2]; + + int32_t i32[4]; + int16_t i16[8]; + int8_t i8[16]; + + uint32_t u32[4]; + uint16_t u16[8]; + uint8_t u8[16]; + + double df[2]; + float f[4]; + + TX128Data() + { + } + + TX128Data(uint64_t vL,uint64_t vH) + { + u64[0] = vL; + u64[1] = vH; + } +}; +//--------------------------------------------------------------------------- +typedef TX128Data int128_t; +//--------------------------------------------------------------------------- +#define x128Low64(x) ((TX128Data*)&x)->u64[0] +#define x128High64(x) ((TX128Data*)&x)->u64[1] +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif // Type64H diff --git a/PHF_benchmark/SPHF-RTLP/embdDbg.h b/PHF_benchmark/SPHF-RTLP/embdDbg.h new file mode 100755 index 0000000..f56dc17 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/embdDbg.h @@ -0,0 +1,21 @@ +#ifndef embdDbgH +#define embdDbgH +//---- -------------------------------------------------------------------------------------------------------- +#ifdef __HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#include +#define logEmbdMsg(...) printf(__VA_ARGS__) +//---- -------------------------------------------------------------------------------------------------------- +#else//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +inline void logEmbdMsg(const char *msg,...) +{ +} +#else +#define logEmbdMsg(...) +#endif // __BORLANDC__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//embdDbgH diff --git a/PHF_benchmark/SPHF-RTLP/function.txt b/PHF_benchmark/SPHF-RTLP/function.txt new file mode 100755 index 0000000..b59efb3 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/function.txt @@ -0,0 +1,5021 @@ +10427 +200 +4 +1 +0 +2 +4 +0 +2 +1 +1 +0 +0 +7 +3 +0 +16 +1 +0 +0 +0 +5 +13 +1 +0 +6 +1 +9 +2 +0 +0 +1 +20 +4 +1 +12 +1 +0 +1 +0 +0 +11 +1 +0 +3 +22 +3 +3 +3 +6 +0 +0 +4 +2 +0 +1 +9 +10 +0 +4 +0 +4 +9 +6 +4 +0 +0 +2 +0 +9 +4 +2 +4 +12 +0 +4 +1 +0 +9 +0 +0 +1 +0 +1 +0 +0 +1 +0 +1 +10 +3 +9 +0 +6 +0 +0 +0 +0 +1 +2 +0 +0 +0 +0 +1 +1 +0 +3 +1 +4 +0 +2 +0 +0 +0 +0 +1 +6 +0 +0 +0 +0 +0 +0 +0 +28 +3 +6 +0 +0 +0 +1 +0 +3 +0 +2 +0 +0 +0 +8 +0 +0 +0 +9 +0 +0 +1 +3 +5 +0 +0 +15 +0 +0 +0 +7 +1 +1 +1 +1 +0 +2 +2 +2 +6 +7 +0 +6 +0 +0 +5 +0 +0 +11 +0 +2 +0 +2 +3 +0 +2 +0 +6 +3 +0 +0 +6 +0 +8 +10 +2 +0 +6 +12 +10 +1 +0 +9 +14 +0 +0 +1 +2 +0 +0 +1 +0 +2 +2 +0 +1 +33 +2 +2 +2 +3 +1 +2 +5 +0 +8 +0 +6 +0 +0 +0 +7 +3 +1 +1 +0 +1 +3 +0 +1 +4 +0 +1 +10 +2 +0 +1 +0 +0 +22 +4 +2 +0 +3 +2 +10 +5 +16 +1 +0 +0 +0 +8 +0 +0 +0 +0 +3 +1 +5 +2 +1 +1 +11 +2 +0 +0 +5 +0 +10 +6 +5 +1 +0 +8 +1 +2 +2 +0 +0 +0 +3 +3 +1 +0 +1 +7 +4 +0 +3 +1 +1 +1 +6 +0 +0 +7 +0 +0 +1 +12 +0 +7 +15 +0 +0 +1 +7 +0 +1 +2 +0 +3 +0 +0 +5 +3 +0 +1 +0 +2 +0 +1 +0 +0 +2 +1 +0 +0 +9 +11 +0 +10 +0 +1 +10 +4 +0 +1 +0 +2 +2 +9 +0 +0 +1 +0 +2 +0 +4 +1 +16 +1 +2 +6 +2 +2 +3 +4 +0 +1 +18 +5 +0 +23 +2 +12 +5 +1 +2 +13 +23 +0 +0 +0 +9 +0 +0 +7 +0 +0 +6 +0 +8 +0 +4 +0 +9 +0 +12 +0 +3 +0 +5 +2 +5 +2 +0 +14 +6 +1 +7 +3 +4 +2 +11 +2 +0 +5 +3 +0 +0 +4 +2 +3 +0 +12 +31 +0 +0 +0 +5 +2 +2 +3 +4 +1 +0 +0 +1 +1 +1 +3 +13 +5 +0 +5 +12 +0 +0 +3 +3 +1 +7 +14 +1 +0 +0 +10 +1 +6 +4 +1 +0 +0 +0 +3 +22 +0 +17 +1 +3 +0 +0 +3 +9 +0 +4 +4 +2 +1 +5 +2 +7 +4 +3 +1 +1 +1 +10 +2 +2 +3 +0 +6 +0 +2 +4 +2 +4 +0 +3 +3 +11 +0 +36 +1 +0 +0 +0 +4 +10 +0 +5 +9 +5 +0 +3 +17 +5 +0 +16 +1 +2 +0 +20 +0 +2 +7 +0 +2 +1 +5 +20 +7 +7 +0 +3 +11 +1 +1 +4 +1 +0 +4 +0 +1 +0 +0 +4 +12 +1 +0 +1 +5 +16 +0 +1 +0 +1 +0 +1 +0 +2 +5 +10 +0 +1 +24 +3 +0 +2 +1 +0 +3 +0 +0 +0 +2 +1 +0 +4 +2 +0 +20 +0 +0 +0 +1 +1 +0 +0 +0 +8 +2 +10 +0 +6 +0 +10 +0 +0 +15 +0 +7 +1 +4 +0 +2 +1 +3 +9 +1 +0 +1 +9 +1 +0 +2 +3 +3 +5 +0 +1 +3 +7 +0 +0 +1 +0 +0 +0 +0 +0 +3 +0 +2 +7 +10 +3 +8 +0 +3 +1 +6 +1 +5 +0 +0 +0 +4 +3 +0 +1 +13 +4 +2 +0 +3 +1 +2 +12 +3 +3 +6 +4 +1 +3 +0 +1 +11 +5 +0 +11 +0 +2 +2 +0 +23 +4 +0 +9 +1 +1 +3 +0 +1 +8 +2 +7 +0 +0 +5 +0 +0 +4 +0 +2 +5 +0 +8 +2 +0 +1 +2 +2 +6 +3 +1 +21 +1 +1 +1 +0 +0 +11 +11 +12 +3 +0 +13 +2 +10 +1 +19 +4 +1 +0 +5 +13 +11 +0 +4 +2 +0 +16 +6 +7 +11 +1 +3 +1 +9 +2 +2 +0 +6 +2 +6 +0 +6 +3 +6 +20 +0 +1 +0 +1 +0 +12 +0 +1 +11 +1 +0 +13 +6 +1 +1 +1 +0 +4 +5 +12 +9 +1 +4 +0 +1 +2 +0 +10 +0 +12 +3 +1 +8 +11 +1 +16 +3 +0 +0 +29 +7 +0 +1 +1 +6 +0 +0 +0 +2 +1 +0 +4 +7 +1 +2 +0 +1 +5 +7 +0 +1 +9 +9 +3 +3 +0 +2 +0 +4 +3 +5 +0 +0 +5 +12 +2 +9 +0 +1 +0 +0 +1 +3 +2 +0 +24 +0 +7 +3 +2 +5 +0 +3 +15 +0 +10 +1 +0 +5 +0 +4 +8 +9 +6 +0 +1 +1 +6 +0 +4 +0 +1 +0 +0 +2 +0 +7 +0 +9 +6 +4 +11 +6 +1 +1 +4 +0 +2 +0 +1 +0 +0 +1 +0 +11 +0 +9 +1 +1 +7 +1 +0 +0 +0 +0 +0 +1 +0 +8 +18 +1 +3 +0 +4 +3 +0 +5 +1 +0 +0 +1 +1 +12 +8 +0 +3 +1 +1 +0 +0 +6 +2 +0 +4 +14 +3 +1 +5 +4 +4 +5 +0 +2 +0 +1 +1 +0 +4 +6 +0 +2 +1 +0 +0 +1 +0 +0 +1 +2 +1 +2 +26 +1 +12 +18 +0 +1 +0 +2 +4 +16 +0 +5 +1 +8 +1 +0 +3 +6 +3 +9 +4 +0 +4 +5 +6 +3 +13 +1 +2 +15 +1 +4 +4 +0 +0 +11 +1 +1 +3 +0 +6 +2 +0 +0 +4 +4 +2 +0 +3 +1 +0 +14 +1 +1 +10 +1 +8 +5 +14 +0 +1 +0 +1 +0 +0 +2 +12 +0 +0 +0 +0 +5 +0 +4 +29 +4 +0 +7 +0 +3 +7 +1 +1 +5 +2 +0 +2 +1 +26 +20 +0 +6 +2 +11 +11 +11 +1 +0 +2 +0 +2 +5 +1 +3 +0 +4 +1 +1 +1 +0 +1 +3 +4 +0 +0 +3 +2 +0 +3 +3 +14 +8 +0 +20 +0 +8 +4 +6 +2 +0 +6 +7 +5 +1 +20 +3 +7 +9 +0 +11 +5 +0 +6 +2 +6 +6 +6 +0 +2 +5 +0 +0 +0 +1 +2 +3 +1 +1 +1 +18 +10 +0 +4 +16 +0 +0 +3 +3 +7 +0 +3 +0 +1 +0 +16 +30 +4 +4 +9 +0 +1 +9 +7 +7 +0 +0 +11 +1 +1 +0 +2 +0 +3 +1 +0 +1 +0 +0 +1 +15 +1 +3 +1 +1 +0 +15 +8 +2 +3 +5 +2 +0 +8 +0 +5 +6 +0 +3 +3 +1 +2 +4 +0 +8 +0 +1 +3 +3 +2 +0 +4 +4 +7 +0 +2 +18 +15 +0 +1 +3 +17 +6 +2 +0 +2 +0 +4 +0 +8 +7 +3 +0 +9 +0 +14 +2 +7 +1 +5 +0 +0 +0 +0 +0 +2 +1 +5 +2 +1 +9 +0 +5 +27 +1 +1 +22 +0 +0 +16 +3 +0 +1 +0 +14 +0 +3 +5 +5 +5 +0 +2 +28 +1 +1 +4 +1 +0 +12 +29 +1 +19 +1 +2 +3 +4 +1 +7 +5 +1 +5 +6 +5 +0 +1 +1 +2 +0 +5 +1 +0 +6 +31 +1 +5 +5 +4 +0 +0 +0 +0 +8 +7 +3 +9 +7 +1 +0 +4 +1 +0 +4 +2 +3 +10 +0 +0 +15 +17 +1 +15 +29 +5 +2 +3 +2 +1 +7 +6 +4 +3 +1 +0 +8 +16 +1 +2 +3 +0 +6 +2 +5 +16 +0 +0 +1 +2 +6 +27 +3 +6 +4 +7 +0 +11 +15 +0 +2 +0 +0 +3 +3 +11 +1 +2 +0 +0 +5 +1 +6 +4 +20 +6 +5 +1 +2 +2 +5 +2 +0 +0 +18 +2 +0 +25 +16 +8 +2 +0 +20 +0 +18 +3 +0 +0 +10 +8 +13 +30 +13 +4 +17 +11 +0 +4 +23 +2 +1 +4 +3 +9 +16 +7 +8 +0 +0 +11 +0 +6 +0 +20 +6 +10 +0 +2 +0 +1 +0 +1 +16 +1 +28 +0 +0 +1 +6 +12 +15 +1 +5 +3 +1 +0 +27 +4 +1 +1 +0 +0 +3 +2 +22 +12 +6 +1 +0 +0 +13 +1 +0 +16 +0 +8 +2 +0 +3 +6 +0 +4 +1 +2 +18 +1 +4 +0 +1 +2 +7 +0 +0 +2 +16 +0 +2 +4 +3 +16 +8 +0 +12 +2 +0 +1 +3 +1 +2 +8 +21 +1 +3 +0 +10 +1 +3 +0 +0 +10 +0 +5 +0 +1 +0 +0 +2 +2 +0 +4 +3 +1 +5 +4 +2 +8 +14 +5 +0 +2 +6 +14 +6 +3 +2 +2 +15 +14 +0 +32 +2 +7 +0 +8 +0 +0 +3 +1 +2 +21 +0 +4 +0 +3 +11 +4 +10 +1 +0 +0 +7 +1 +5 +10 +4 +5 +3 +8 +0 +5 +0 +2 +3 +0 +0 +0 +2 +0 +2 +0 +2 +3 +13 +2 +0 +5 +6 +1 +0 +0 +1 +0 +0 +3 +0 +2 +13 +6 +0 +0 +0 +5 +7 +0 +2 +1 +6 +0 +0 +0 +12 +3 +0 +6 +0 +3 +10 +7 +0 +0 +1 +9 +0 +1 +9 +3 +5 +5 +0 +4 +3 +0 +0 +21 +0 +4 +0 +35 +0 +0 +4 +0 +12 +1 +0 +1 +7 +6 +7 +0 +3 +7 +10 +13 +8 +5 +5 +1 +0 +3 +2 +1 +1 +5 +18 +11 +9 +0 +0 +5 +8 +0 +4 +5 +0 +12 +9 +0 +0 +0 +17 +1 +2 +0 +7 +7 +11 +3 +1 +0 +13 +0 +18 +2 +0 +7 +11 +0 +0 +13 +2 +0 +3 +0 +1 +3 +0 +6 +1 +27 +0 +9 +6 +1 +20 +0 +0 +3 +1 +2 +9 +0 +6 +1 +5 +0 +1 +6 +1 +6 +3 +0 +12 +1 +2 +5 +1 +10 +0 +2 +1 +3 +0 +0 +1 +0 +0 +9 +0 +8 +6 +8 +13 +2 +0 +5 +0 +2 +14 +2 +14 +20 +10 +7 +4 +0 +9 +0 +0 +0 +0 +2 +19 +2 +26 +1 +0 +10 +6 +13 +0 +0 +5 +5 +0 +4 +0 +8 +0 +0 +22 +1 +3 +5 +2 +2 +1 +10 +0 +0 +9 +15 +9 +9 +1 +6 +0 +0 +3 +0 +4 +5 +3 +8 +0 +0 +17 +4 +5 +0 +9 +15 +12 +7 +8 +13 +6 +0 +9 +4 +0 +2 +5 +5 +7 +0 +0 +4 +12 +0 +0 +0 +0 +2 +16 +0 +2 +1 +14 +0 +1 +2 +2 +1 +0 +27 +0 +0 +16 +24 +2 +7 +2 +27 +0 +13 +0 +0 +1 +0 +0 +11 +10 +1 +6 +8 +0 +0 +0 +0 +12 +5 +10 +2 +0 +2 +10 +6 +0 +0 +16 +1 +12 +6 +1 +0 +2 +6 +5 +0 +2 +0 +1 +1 +0 +15 +4 +2 +0 +0 +6 +14 +1 +4 +0 +0 +0 +7 +5 +6 +6 +3 +1 +22 +6 +24 +17 +9 +5 +0 +2 +1 +8 +2 +5 +0 +3 +0 +2 +11 +5 +10 +0 +2 +22 +11 +0 +0 +8 +2 +12 +1 +12 +11 +0 +7 +1 +1 +0 +0 +3 +5 +7 +2 +2 +0 +3 +4 +7 +0 +4 +3 +0 +3 +8 +5 +3 +11 +5 +0 +2 +7 +0 +2 +0 +3 +6 +1 +0 +2 +1 +2 +1 +0 +1 +0 +0 +0 +6 +4 +1 +1 +25 +0 +3 +28 +0 +0 +13 +0 +26 +3 +0 +2 +5 +0 +4 +13 +4 +0 +2 +26 +0 +0 +23 +0 +12 +32 +0 +6 +0 +0 +12 +2 +9 +0 +7 +15 +8 +0 +4 +8 +4 +38 +0 +0 +0 +0 +1 +6 +2 +12 +9 +3 +1 +5 +0 +5 +4 +0 +4 +5 +1 +5 +22 +3 +10 +6 +0 +9 +10 +0 +7 +2 +23 +9 +0 +7 +7 +6 +0 +6 +2 +7 +1 +8 +0 +3 +4 +0 +8 +5 +3 +8 +0 +5 +4 +0 +16 +2 +7 +0 +7 +13 +18 +0 +0 +3 +3 +0 +0 +2 +1 +9 +6 +9 +0 +15 +2 +0 +4 +19 +1 +3 +10 +9 +0 +1 +10 +3 +0 +0 +0 +0 +0 +0 +7 +0 +4 +16 +1 +0 +8 +2 +0 +1 +0 +2 +0 +0 +2 +1 +7 +0 +2 +1 +2 +3 +0 +0 +0 +2 +8 +0 +4 +1 +0 +3 +0 +8 +1 +5 +9 +14 +0 +25 +1 +0 +9 +0 +3 +1 +8 +1 +1 +1 +0 +0 +15 +4 +0 +0 +0 +6 +30 +12 +4 +0 +1 +0 +13 +1 +13 +1 +0 +0 +20 +1 +3 +0 +3 +7 +0 +13 +1 +3 +6 +0 +0 +24 +4 +0 +1 +12 +5 +1 +0 +0 +1 +33 +3 +4 +10 +2 +10 +0 +0 +2 +20 +0 +0 +6 +21 +17 +6 +0 +6 +0 +1 +2 +2 +0 +0 +26 +2 +0 +10 +24 +39 +0 +3 +24 +7 +15 +6 +2 +0 +1 +4 +10 +2 +19 +6 +10 +7 +0 +1 +24 +7 +4 +51 +0 +26 +12 +6 +1 +5 +0 +9 +2 +4 +4 +0 +0 +0 +0 +1 +1 +1 +2 +2 +4 +53 +0 +6 +0 +0 +18 +0 +9 +0 +6 +6 +0 +0 +12 +7 +3 +4 +11 +0 +2 +18 +1 +0 +26 +11 +0 +3 +0 +18 +2 +0 +0 +4 +26 +0 +2 +10 +0 +21 +3 +0 +28 +9 +0 +1 +3 +8 +2 +0 +0 +0 +0 +0 +10 +0 +2 +1 +8 +1 +18 +3 +0 +0 +0 +0 +6 +4 +1 +8 +8 +2 +0 +1 +36 +0 +2 +7 +0 +0 +2 +4 +0 +3 +1 +15 +0 +8 +2 +1 +12 +2 +4 +0 +2 +1 +3 +0 +4 +0 +12 +3 +21 +49 +0 +17 +0 +0 +0 +14 +3 +0 +0 +7 +9 +2 +9 +16 +3 +3 +3 +0 +0 +2 +6 +7 +0 +15 +0 +0 +0 +2 +0 +0 +4 +3 +1 +2 +7 +0 +0 +3 +16 +0 +2 +1 +3 +4 +5 +0 +1 +0 +0 +0 +0 +13 +5 +8 +5 +24 +4 +13 +0 +18 +6 +11 +3 +0 +4 +9 +1 +0 +4 +3 +0 +0 +12 +14 +1 +1 +0 +3 +3 +13 +0 +0 +13 +15 +2 +26 +4 +0 +1 +13 +1 +9 +8 +1 +7 +3 +16 +3 +11 +8 +2 +0 +1 +12 +0 +4 +0 +5 +14 +6 +4 +1 +3 +7 +0 +7 +8 +1 +25 +8 +6 +0 +0 +0 +5 +1 +13 +1 +0 +0 +22 +0 +3 +17 +2 +3 +0 +1 +1 +2 +6 +6 +3 +7 +4 +0 +0 +2 +25 +0 +6 +0 +6 +10 +0 +1 +6 +0 +0 +4 +25 +7 +6 +3 +11 +0 +28 +46 +7 +0 +0 +2 +11 +18 +0 +2 +0 +1 +0 +5 +4 +3 +6 +41 +3 +3 +3 +1 +0 +10 +29 +2 +25 +5 +0 +0 +1 +9 +2 +1 +1 +4 +7 +14 +2 +9 +0 +0 +1 +15 +9 +16 +0 +5 +9 +0 +0 +3 +18 +0 +2 +0 +7 +3 +0 +28 +21 +32 +1 +6 +6 +5 +1 +9 +1 +2 +5 +0 +6 +19 +0 +6 +10 +1 +9 +6 +0 +4 +39 +0 +0 +2 +0 +10 +0 +3 +11 +0 +3 +7 +1 +2 +3 +3 +1 +0 +0 +20 +20 +2 +10 +12 +0 +14 +0 +0 +4 +4 +0 +3 +0 +10 +28 +20 +0 +8 +9 +19 +5 +8 +14 +17 +0 +4 +39 +0 +10 +0 +2 +1 +39 +3 +11 +5 +4 +5 +0 +3 +14 +4 +3 +28 +0 +0 +17 +11 +11 +0 +0 +0 +0 +0 +26 +0 +3 +5 +0 +9 +2 +28 +0 +6 +1 +1 +12 +23 +3 +4 +1 +26 +4 +23 +0 +19 +22 +27 +2 +1 +0 +3 +0 +0 +0 +14 +0 +10 +1 +9 +53 +3 +1 +0 +0 +35 +33 +6 +0 +7 +12 +38 +6 +6 +0 +5 +26 +5 +16 +8 +29 +1 +1 +12 +9 +0 +5 +5 +0 +0 +4 +9 +13 +1 +4 +1 +0 +6 +13 +1 +0 +5 +21 +26 +1 +42 +0 +32 +2 +3 +38 +3 +9 +0 +0 +2 +1 +0 +0 +1 +5 +0 +9 +1 +12 +14 +9 +16 +6 +8 +9 +2 +0 +9 +3 +0 +2 +10 +11 +0 +16 +0 +3 +1 +0 +2 +8 +2 +3 +0 +0 +8 +0 +6 +5 +7 +0 +4 +8 +4 +0 +0 +18 +0 +1 +23 +15 +7 +1 +0 +2 +6 +58 +6 +14 +4 +1 +0 +10 +3 +13 +5 +2 +18 +7 +4 +29 +1 +1 +4 +1 +5 +0 +5 +0 +1 +18 +1 +1 +0 +2 +0 +0 +7 +1 +10 +0 +32 +0 +22 +59 +0 +5 +33 +25 +32 +15 +2 +6 +4 +0 +5 +13 +1 +21 +0 +3 +1 +4 +15 +0 +8 +82 +34 +0 +18 +3 +0 +8 +2 +2 +0 +10 +9 +3 +6 +0 +24 +3 +7 +0 +9 +0 +0 +19 +4 +4 +32 +3 +0 +2 +5 +1 +6 +17 +0 +0 +7 +3 +0 +0 +1 +5 +1 +2 +6 +4 +0 +1 +0 +4 +0 +10 +0 +4 +6 +0 +0 +0 +0 +2 +3 +18 +0 +3 +8 +19 +15 +3 +18 +3 +3 +6 +1 +13 +5 +13 +26 +1 +2 +2 +0 +0 +0 +1 +27 +5 +19 +0 +12 +0 +4 +18 +14 +22 +3 +3 +1 +16 +5 +6 +3 +8 +31 +3 +16 +0 +4 +0 +0 +0 +3 +25 +23 +14 +0 +0 +0 +8 +3 +0 +8 +3 +5 +32 +13 +0 +9 +12 +12 +5 +4 +5 +2 +0 +3 +2 +2 +2 +5 +0 +3 +0 +6 +2 +1 +3 +25 +35 +0 +19 +3 +1 +1 +3 +3 +6 +0 +25 +11 +8 +2 +2 +10 +4 +0 +1 +47 +0 +0 +15 +2 +0 +0 +0 +43 +5 +0 +2 +0 +4 +22 +4 +42 +0 +1 +27 +8 +0 +0 +8 +0 +57 +0 +1 +0 +0 +8 +5 +0 +0 +0 +4 +0 +12 +0 +20 +1 +14 +7 +2 +10 +0 +3 +19 +2 +9 +32 +0 +0 +1 +40 +8 +3 +10 +0 +8 +4 +6 +0 +1 +6 +3 +2 +4 +0 +6 +0 +0 +1 +5 +9 +7 +0 +0 +0 +0 +0 +0 +23 +5 +6 +3 +5 +0 +20 +9 +5 +0 +0 +0 +0 +12 +24 +21 +32 +0 +3 +6 +25 +4 +1 +0 +10 +2 +0 +13 +3 +0 +5 +17 +0 +0 +8 +0 +0 +0 +4 +21 +12 +1 +1 +10 +7 +12 +4 +0 +6 +12 +0 +4 +4 +2 +4 +3 +0 +0 +10 +0 +4 +4 +0 +10 +22 +5 +4 +7 +50 +2 +3 +13 +0 +0 +0 +19 +0 +7 +8 +3 +20 +0 +14 +12 +6 +0 +19 +0 +16 +59 +0 +1 +30 +5 +3 +1 +18 +0 +5 +8 +1 +7 +15 +1 +1 +55 +35 +23 +15 +0 +2 +4 +26 +2 +41 +1 +8 +0 +8 +46 +6 +18 +2 +4 +0 +12 +12 +85 +0 +16 +9 +0 +0 +1 +3 +2 +0 +10 +2 +3 +0 +12 +0 +0 +0 +15 +7 +24 +12 +14 +2 +5 +0 +1 +15 +17 +13 +0 +1 +2 +0 +17 +1 +0 +6 +5 +3 +10 +0 +13 +15 +0 +1 +5 +8 +32 +30 +9 +8 +17 +0 +22 +1 +15 +5 +5 +0 +16 +0 +12 +3 +11 +4 +0 +5 +4 +11 +12 +7 +3 +0 +0 +5 +0 +3 +7 +0 +0 +8 +0 +5 +0 +43 +21 +9 +25 +0 +11 +3 +0 +0 +0 +13 +2 +9 +36 +0 +2 +13 +21 +105 +3 +12 +8 +19 +0 +0 +0 +0 +2 +0 +2 +6 +11 +5 +10 +0 +0 +0 +14 +0 +12 +15 +8 +3 +0 +20 +0 +1 +1 +25 +9 +0 +0 +18 +0 +14 +10 +11 +0 +0 +1 +0 +0 +11 +0 +4 +0 +0 +9 +10 +3 +0 +1 +13 +0 +14 +45 +3 +7 +0 +2 +6 +1 +0 +4 +1 +5 +2 +37 +12 +13 +0 +0 +28 +3 +4 +0 +3 +2 +0 +0 +3 +43 +3 +4 +14 +8 +33 +0 +0 +0 +30 +0 +0 +2 +2 +10 +6 +0 +0 +13 +8 +5 +2 +0 +11 +1 +88 +21 +0 +0 +9 +24 +15 +5 +19 +1 +11 +6 +0 +8 +0 +0 +21 +8 +34 +0 +64 +2 +18 +3 +33 +10 +0 +2 +42 +0 +3 +25 +4 +12 +1 +14 +38 +0 +0 +1 +77 +10 +48 +11 +2 +0 +7 +0 +14 +32 +48 +0 +9 +1 +13 +0 +13 +1 +31 +1 +0 +3 +0 +24 +1 +0 +1 +11 +5 +3 +29 +1 +12 +1 +1 +11 +1 +26 +25 +5 +0 +3 +7 +11 +26 +0 +0 +0 +4 +2 +44 +0 +0 +52 +18 +24 +13 +2 +7 +0 +3 +20 +10 +0 +0 +10 +0 +3 +12 +0 +0 +33 +20 +2 +8 +16 +9 +13 +0 +15 +28 +2 +25 +0 +4 +0 +0 +1 +3 +0 +25 +43 +10 +0 +2 +2 +11 +11 +4 +1 +0 +24 +3 +0 +2 +1 +1 +11 +2 +21 +0 +3 +0 +0 +0 +0 +0 +0 +5 +0 +13 +8 +4 +0 +5 +2 +1 +5 +1 +1 +0 +4 +13 +5 +65 +13 +0 +6 +0 +3 +0 +0 +0 +1 +15 +3 +5 +0 +11 +20 +20 +11 +0 +2 +0 +7 +43 +3 +16 +5 +0 +26 +0 +20 +19 +24 +35 +14 +7 +3 +12 +0 +14 +7 +31 +0 +1 +2 +8 +4 +0 +2 +0 +5 +20 +26 +0 +34 +5 +1 +0 +13 +13 +3 +24 +22 +3 +2 +7 +4 +52 +15 +3 +8 +7 +1 +24 +48 +1 +0 +0 +2 +3 +0 +4 +8 +12 +5 +0 +34 +23 +5 +5 +0 +5 +1 +11 +2 +10 +8 +21 +25 +16 +0 +12 +1 +2 +4 +0 +5 +8 +17 +13 +1 +28 +51 +2 +1 +10 +4 +17 +0 +13 +9 +12 +2 +27 +0 +0 +21 +3 +39 +16 +8 +10 +5 +0 +18 +0 +29 +0 +0 +0 +14 +0 +15 +6 +0 +0 +42 +10 +0 +0 +6 +16 +71 +18 +5 +11 +6 +40 +11 +12 +4 +0 +4 +3 +57 +6 +0 +0 +0 +13 +0 +7 +0 +0 +10 +0 +6 +0 +0 +0 +6 +0 +17 +47 +6 +0 +0 +43 +47 +0 +30 +26 +81 +32 +0 +40 +9 +8 +6 +0 +16 +0 +99 +40 +2 +6 +0 +7 +21 +0 +55 +0 +4 +0 +4 +0 +2 +24 +0 +4 +0 +3 +3 +46 +20 +3 +14 +6 +60 +0 +9 +1 +0 +9 +0 +33 +43 +8 +21 +27 +9 +15 +8 +3 +5 +3 +1 +61 +39 +19 +1 +28 +0 +2 +6 +35 +22 +0 +20 +30 +0 +45 +39 +28 +8 +54 +1 +1 +0 +45 +15 +7 +39 +0 +7 +4 +1 +0 +0 +1 +24 +45 +0 +10 +3 +5 +15 +0 +0 +0 +22 +3 +0 +2 +0 +6 +7 +7 +9 +0 +23 +1 +0 +3 +61 +24 +6 +0 +8 +9 +2 +1 +0 +4 +56 +2 +10 +17 +0 +0 +19 +0 +0 +8 +3 +10 +0 +21 +0 +2 +0 +5 +32 +18 +1 +12 +14 +0 +2 +6 +5 +1 +0 +0 +2 +10 +9 +7 +1 +0 +4 +0 +19 +13 +3 +13 +0 +1 +3 +16 +6 +0 +3 +1 +10 +7 +7 +9 +8 +45 +6 +0 +5 +8 +0 +25 +6 +0 +1 +7 +7 +0 +3 +1 +13 +0 +10 +2 +7 +0 +3 +19 +0 +10 +4 +0 +3 +21 +26 +19 +1 +2 +40 +7 +10 +0 +3 +0 +7 +10 +11 +19 +29 +8 +21 +19 +7 +4 +0 +0 +1 +11 +34 +0 +0 +28 +5 +1 +42 +0 +0 +34 +54 +65 +0 +14 +19 +20 +4 +20 +34 +5 +4 +14 +2 +23 +12 +4 +0 +61 +20 +1 +14 +32 +17 +12 +6 +13 +1 +0 +5 +2 +0 +1 +22 +37 +0 +42 +3 +5 +10 +0 +1 +15 +0 +3 +7 +0 +34 +4 +11 +7 +10 +32 +9 +15 +83 +5 +33 +0 +0 +2 +4 +5 +3 +23 +2 +32 +51 +5 +0 +0 +2 +1 +0 +14 +3 +16 +0 +1 +10 +28 +49 +3 +0 +43 +9 +0 +0 +4 +5 +6 +0 +5 +50 +0 +6 +5 +3 +34 +0 +0 +2 +57 +3 +9 +8 +36 +0 +32 +21 +31 +16 +0 +0 +24 +0 +3 +1 +56 +0 +31 +0 +3 +29 +34 +43 +1 +0 +1 +19 +29 +3 +6 +13 +0 +13 +5 +1 +25 +0 +11 +8 +26 +43 +4 +4 +20 +16 +4 +5 +7 +6 +53 +0 +15 +8 +16 +0 +10 +0 +46 +0 +28 +22 +9 +12 +0 +5 +0 +0 +1 +18 +21 +1 +2 +0 +0 +9 +2 +11 +2 +22 +13 +0 +21 +0 +3 +23 +0 +7 +0 +0 +9 +0 +2 +0 +12 +6 +33 +0 +0 +29 +7 +63 +4 +0 +0 +0 +15 +0 +1 +26 +17 +29 +3 +12 +3 +2 +0 +15 +16 +11 +0 +1 +5 +12 +10 +11 +14 +10 +8 +3 +12 +0 +10 +18 +1 +0 +25 +17 +0 +21 +0 +0 +12 +14 +22 +40 +22 +15 +20 +7 +44 +6 +2 +29 +0 +0 +0 +0 +5 +8 +13 +14 +72 +1 +55 +4 +0 +0 +24 +3 +0 +17 +24 +4 +3 +19 +15 +6 +19 +0 +35 +8 +13 +4 +20 +11 +11 +4 +0 +11 +0 +22 +2 +6 +4 +11 +41 +2 +0 +7 +13 +7 +5 +7 +0 +18 +22 +29 +6 +3 +0 +12 +0 +22 +40 +0 +3 +19 +2 +6 +0 +85 +1 +0 +14 +29 +119 +16 +0 +0 +26 +1 +16 +7 +28 +14 +1 +9 +15 +55 +16 +9 +5 +23 +3 +9 +13 +16 +8 +16 +30 +35 +2 +6 +7 +84 +6 +3 +19 +2 +33 +4 +0 +13 +1 +28 +9 +43 +18 +23 +27 +3 +0 +0 +46 +30 +8 +2 +0 +1 +36 +6 +4 +1 +0 +0 +18 +18 +1 +6 +11 +7 +7 +0 +55 +15 +2 +29 +7 +31 +1 +0 +14 +0 +7 +3 +1 +40 +6 +0 +0 +0 +18 +8 +0 +9 +0 +9 +1 +28 +0 +33 +0 +37 +0 +8 +24 +16 +21 +0 +36 +25 +12 +1 +28 +4 +20 +0 +12 +5 +7 +26 +0 +8 +29 +31 +13 +0 +14 +0 +2 +1 +1 +17 +1 +0 +2 +3 +0 +0 +10 +0 +24 +24 +0 +7 +9 +7 +1 +24 +10 +4 +36 +3 +1 +7 +0 +27 +0 +0 +43 +5 +0 +0 +0 +0 +33 +7 +0 +39 +3 +2 +66 +19 +38 +11 +14 +4 +0 +3 +34 +0 +11 +3 +7 +6 +0 +0 +6 +51 +29 +0 +14 +14 +3 +0 +59 +28 +59 +1 +35 +0 +0 +34 +37 +52 +0 +0 +4 +25 +4 +7 +9 +16 +0 +0 +4 +2 +4 +16 +1 +34 +0 +4 +2 +4 +6 +9 +1 +5 +16 +0 +31 +8 +44 +10 +27 +4 +55 +15 +75 +46 +1 +31 +0 +5 +3 +0 +56 +6 +0 +0 +0 +125 +25 +7 +0 +49 +4 +1 +0 +0 +24 +0 +23 +11 +8 +28 +0 +57 +27 +4 +2 +60 +0 +21 +0 +9 +42 +17 +40 +0 +3 +1 +10 +41 +14 +42 +28 +8 +0 +22 +14 +10 +0 +1 +22 +0 +38 +13 +4 +2 +0 +42 +19 +0 +26 +14 +11 +0 +29 +15 +10 +0 +20 +61 +0 +1 +1 +2 +0 +3 +26 +1 +1 +3 +24 +0 +0 +2 +3 +3 +11 +4 +0 +3 +14 +0 +16 +3 +45 +10 +5 +63 +1 +3 +8 +0 +5 +4 +9 +4 +16 +30 +9 +3 +0 +6 +0 +0 +1 +15 +22 +0 +9 +4 +16 +6 +45 +2 +0 +0 +0 +2 +8 +26 +0 +14 +27 +1 +0 +0 +2 +0 +31 +6 +11 +3 +27 +29 +0 +1 +23 +23 +6 +12 +3 +1 +0 +0 +26 +6 +21 +22 +10 +103 +29 +24 +11 +20 +5 +0 +51 +0 +0 +3 +3 +8 +1 +20 +26 +23 +67 +7 +0 +7 +25 +1 +11 +26 +4 +0 +3 +0 +1 +0 +0 +0 +5 +16 +0 +66 +3 +0 +2 +13 +0 +0 +11 +5 +0 +1 +61 +0 +0 +1 +25 +43 +12 +4 +2 +1 +13 +28 +0 +79 +13 +2 +4 +18 +17 +7 +48 +1 +28 +53 +14 +23 +34 +18 +0 +0 +2 +0 +0 +9 +0 +24 +10 +10 +6 +0 +23 +0 +0 +0 +0 +51 +2 +13 +5 +21 +12 +1 +4 +45 +0 +13 +71 +1 +21 +0 +9 +47 +30 +0 +61 +3 +21 +81 +33 +4 +5 +8 +14 +1 +17 +26 +0 +46 +3 +2 +84 +0 +17 +0 +55 +31 +7 +0 +0 +46 +19 +100 +72 +4 +3 +0 +7 +0 +30 +16 +0 +0 +2 +0 +0 +1 +29 +52 +17 +5 +27 +16 +3 +0 +32 +0 +0 +0 +37 +0 +2 +4 +7 +28 +23 +0 +34 +35 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/PHF_benchmark/SPHF-RTLP/input.txt b/PHF_benchmark/SPHF-RTLP/input.txt new file mode 100755 index 0000000..e7d7889 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/input.txt @@ -0,0 +1,10000 @@ +2432620340 +2127031707 +2358798315 +3127220536 +344458652 +1799197182 +2234767759 +486667153 +2583337370 +3332453180 +4021428184 +113503513 +359305085 +2885677567 +1986960997 +3791358433 +784096144 +2588041436 +659441353 +3787339936 +4154846838 +948692350 +2298946245 +2069876928 +1985185298 +894818177 +2827922050 +306835441 +2976570575 +2354620076 +3372556695 +2075415935 +3148484349 +3356625982 +3941426032 +3124343427 +179735569 +46944133 +660340847 +2975678414 +4276473109 +2588196033 +974722435 +1314122697 +3557830843 +726928438 +1802353683 +3326349724 +503856171 +2584876825 +3799801871 +4121956691 +743677118 +2106910407 +4106710030 +1929981742 +3300250558 +438012465 +765111242 +3836236586 +2460449918 +773502258 +2563621183 +2657957066 +1447979258 +4008358226 +354559029 +1668736925 +3401855352 +1837382121 +2504310773 +1558270405 +1756147442 +1586394126 +2784533026 +2700679135 +2280618136 +1417282186 +646207977 +1095299007 +1124211606 +5159183 +762301698 +1273896551 +1846601083 +3716126718 +3755951403 +1510839983 +265331297 +2400683173 +3727278404 +1516893154 +1400397321 +4114297185 +4199850762 +774639952 +2263035992 +444594530 +2954024452 +2921824587 +1887648911 +881741651 +794429697 +3305564011 +117021257 +4029052011 +943521532 +4136581304 +4153264099 +2008206049 +1040938135 +3537944303 +1070656338 +2657947785 +2338214026 +2246711614 +394988060 +4073952703 +287357165 +3675451057 +2929278260 +1774926040 +1458650736 +273990593 +3500664523 +2631487466 +38960827 +506947279 +1860179626 +4129318846 +299438033 +890219621 +3304089141 +4236670539 +4199320055 +2482468076 +160072759 +3367756989 +21617710 +3935366703 +1638788079 +2721015026 +553219400 +4047847747 +1510280015 +3633381974 +1896460519 +1925702092 +3233597664 +993342716 +3086792142 +3552838960 +4136274270 +1179079247 +1040646309 +77755059 +4086300794 +3752586449 +3364120597 +4157807516 +867736610 +2965195654 +284659825 +1833177082 +530821525 +3626647270 +1916968617 +2175572580 +1017403781 +3607276225 +3622993694 +629204867 +1807520733 +2985985476 +1810744787 +3152742900 +3346797335 +3790713207 +2956009703 +1669436898 +2467784865 +75028770 +1068315795 +3064862340 +2173690574 +101027779 +2558754523 +3159883251 +1074880556 +3541345105 +3874186720 +252037971 +1810061627 +3773947204 +3032074313 +1200281605 +3605946163 +3916871838 +1287233070 +536258104 +500605453 +1341904978 +1956520933 +3951097768 +3027079444 +1006891187 +1048398449 +1394101313 +2035261709 +2551254371 +215012808 +526690373 +2115186149 +2156646778 +2543285477 +4128562273 +1041994048 +4204075948 +3163894069 +2764692747 +518848729 +646815685 +1850521886 +3028466453 +2632183280 +2401248841 +669739981 +3283567817 +2438699095 +2595786996 +2564218861 +1553426308 +214370235 +2688928756 +1358369045 +2202934024 +3510420984 +2987480572 +1045581713 +1194077924 +3413425539 +878079092 +3819906227 +180553861 +2076269481 +3636258390 +52450109 +642195700 +3421825602 +3763487196 +2082009843 +2542105110 +1252681807 +3142800741 +806875414 +314531855 +2217560722 +3831913987 +3103249412 +3535593765 +2324637075 +1831261756 +2199902244 +1180536370 +608722685 +2749053388 +2641134146 +101972162 +606684310 +1686748048 +1147046988 +3928994104 +3919375902 +338523815 +3740099816 +4273025071 +4058617294 +1539461917 +1587723140 +3781347210 +3660479805 +3642490679 +2179360591 +599316598 +815513241 +60795650 +3099091842 +2794435533 +2839961102 +4286250765 +3260208052 +698137985 +3540122502 +1316152807 +1174728176 +4154294259 +312974681 +4127894533 +102471443 +1892546523 +1918690936 +2214064843 +1703004358 +3137949533 +2630663346 +2388591772 +289394055 +3108844009 +339895166 +3756615578 +795336977 +2751975675 +423365355 +1599014071 +1035478333 +3232412785 +1928649557 +2003362912 +1235630740 +3872701174 +835402839 +2153379505 +1801539282 +1877373303 +188975962 +953456983 +2782049653 +980026389 +1085546647 +1803445949 +353619948 +869075414 +2259013505 +2289701279 +3645713860 +3504113838 +1775565840 +1457500329 +444919834 +3314531081 +2744712725 +109992957 +1488780578 +1266193730 +3105028285 +368925492 +2207605743 +2329235182 +513149248 +370906205 +4038445847 +2436225138 +2542080996 +2137127651 +1903685290 +3452889134 +2480281254 +3696022372 +3770177982 +1529393945 +161457995 +579540637 +1975385299 +2225974398 +650462198 +3065420301 +2508520345 +1022562401 +1192913781 +370280918 +2337814539 +3570799412 +2388884937 +2411430348 +3702185471 +2675010611 +3443410202 +4092984792 +1912318075 +306159750 +1560426980 +3017545209 +2045445253 +909307446 +4124201259 +3209389418 +4115794556 +1143668673 +703086143 +3326953546 +2787899575 +2233536496 +4164535915 +3060191934 +3357230125 +1383034068 +699274182 +1243499850 +2527351055 +1810391912 +1123754047 +3858589354 +288910708 +4218136311 +2506631200 +1191566089 +2677120356 +2982577117 +837936595 +2067576523 +3084508573 +3830553278 +1454265582 +3146020116 +1879327694 +1848940707 +3719837808 +1925480724 +2591406035 +595830398 +1100688613 +2612457909 +3123988154 +2370189564 +725985530 +3915184232 +4085719406 +1748044528 +4068953122 +1088262602 +1621631186 +1175633973 +2595965702 +941749685 +1626445443 +1295841152 +2772011832 +2988003222 +4072777183 +619257117 +1582662572 +4163639296 +3192802986 +2403729589 +617757833 +2734710363 +3531965896 +3931958571 +3873560442 +25776170 +3927244388 +3743502401 +2448411338 +1468810217 +4033597831 +1599678023 +1986045884 +1641646849 +2767625968 +2292262249 +847514676 +3743830178 +766235157 +2717309966 +2578661263 +1733721215 +1469860720 +1116360423 +2545704803 +2484876665 +3105781635 +1773590253 +1942283253 +4241421277 +1010441405 +4135110651 +2861187389 +3272850547 +1150952066 +63132150 +3818038125 +2699797975 +2483757649 +3520370893 +733574921 +2138501597 +548270386 +220850327 +2707192187 +598735702 +3328233454 +3181475106 +2759123966 +3450935935 +3314587417 +471499200 +4037891537 +2263152685 +2621354658 +1923480876 +1876937213 +3985360808 +2671791012 +1272843702 +1884396002 +2017211334 +223742100 +2503914400 +1681536889 +3086031445 +3480312399 +1193719002 +2844317936 +1841131427 +2182171424 +3103133539 +3353799772 +27350821 +2564879785 +2401217327 +4000766954 +1277093933 +3346029081 +498361253 +1586435621 +3868545159 +2787350270 +1667378690 +801685309 +1646006628 +3152807841 +3873248678 +514675104 +2667225619 +3338810050 +4056715814 +3693978988 +3090591119 +3965790670 +178499544 +1087711420 +3799556360 +591991384 +3876981777 +4153195468 +3798073603 +2892384363 +1538778111 +1870654301 +3706944191 +707699131 +631003502 +4232930443 +2692246615 +3641895771 +1800407718 +3004878093 +791935412 +2365565521 +697240813 +2947586179 +3187784162 +2731369863 +1220090452 +2269954543 +533643997 +1181610174 +4264319078 +2339249627 +1719299712 +1870006744 +64695642 +411633823 +4069861027 +2442555230 +2732604610 +3521692718 +3892226652 +4132272114 +3597456351 +2536314993 +3968086549 +3043705910 +2588089224 +3791980220 +2351373781 +1493008336 +3357528087 +2878937436 +3154279394 +3888353836 +3792508245 +3331969030 +1513532100 +220127812 +223046160 +2021803145 +2832244564 +2617942795 +1809750673 +816638662 +524252587 +3142085509 +323456048 +1596313956 +4681012 +155287962 +1141127284 +3566346332 +2239030213 +1293695926 +1232642258 +474848186 +2582173773 +3427806876 +2129608798 +1638496000 +3114860381 +2970097487 +2519570161 +409027545 +3519040010 +2886219458 +1904026375 +1567823539 +1643648318 +2740431828 +2948718025 +463912954 +3469951872 +191153467 +1163895832 +4160209408 +2922430977 +3845026205 +2860508602 +2507237833 +3270692220 +2571254721 +3615986333 +1634748796 +2075611798 +13371468 +2063532785 +1651785787 +1351152224 +3641292042 +1969005358 +3605944283 +2017101408 +1067488666 +3683725204 +1374209841 +2714264561 +2532585922 +1022602338 +488114476 +536924597 +1965866131 +1089857052 +2177283156 +4076352720 +2428212620 +1278895854 +2514391903 +2768124759 +657152619 +2260692879 +2008984755 +2052706035 +3616918749 +1844270677 +2676529092 +3409233509 +3875690691 +2138040253 +2357895525 +4138024251 +2715258349 +2259189892 +2529946737 +2817081095 +1869562343 +2573399872 +2506359718 +2891139213 +135889931 +2780261233 +104597580 +2097530130 +718113565 +1641409036 +2747393390 +2352613739 +2381742410 +3733063198 +519147418 +4294036712 +2000911666 +3252269088 +1254121098 +4015254546 +1613346749 +1189273657 +1161796724 +3993689371 +1459620785 +1693941699 +195878441 +3131981375 +3048558028 +265604004 +1650342325 +1089547417 +2642207843 +1096004633 +3828295073 +915263168 +4250524159 +2536610796 +3864384867 +4217437574 +2659882068 +956292534 +3226028014 +2259702535 +2557722565 +482926764 +3961762551 +590973792 +474680383 +2276827441 +2423386461 +1397142420 +3246597207 +3317054703 +682631813 +2550082351 +2334685324 +3789077992 +3408527859 +4132099150 +796901575 +3527520392 +1442133062 +3345418470 +449605946 +1687613224 +960618062 +1524219745 +3764328723 +355466774 +1407868609 +3973981774 +2170493875 +2248617486 +1867189840 +2663171600 +3026412861 +2929821565 +4208672997 +2054247670 +1230117424 +779820572 +268213054 +3043138611 +2890960055 +1290211884 +900499770 +2686989684 +1985905168 +2756438949 +1358529125 +2104146799 +2158630026 +2164220337 +2717750047 +2452895105 +829605721 +3979884094 +3744139997 +3957498079 +2822682311 +1113345439 +777658842 +3028696590 +921983072 +3780076214 +3456541127 +721813328 +3563244670 +3286227696 +1247821228 +3738686085 +1978644807 +1565756977 +1056951421 +2999515919 +2250548083 +463492671 +2262467575 +4219217166 +840933813 +2676614673 +3982485078 +2432702502 +2712376496 +2508889930 +2443870053 +1860353775 +2287354389 +3278678756 +2324108309 +3571148896 +1002207465 +3464109257 +903013002 +2559167206 +3388667019 +1872656369 +1536079866 +2215376473 +3734321566 +2414189016 +76577175 +123431548 +960193322 +2559229853 +1821917306 +2912781563 +1937771124 +3872168990 +2213978399 +3670721494 +3967235350 +1701998932 +2577677993 +950895663 +1797761130 +3338687067 +2677902274 +2742335656 +541118043 +1363594569 +2309891637 +2084337836 +283254380 +3773960165 +3260547887 +1586424084 +1344554563 +2906367623 +506693611 +1549860640 +2174640963 +1717685266 +3075168221 +2411700940 +2405709318 +3163565864 +1783278017 +3852425591 +2431925771 +3539578052 +2022248991 +2802125683 +2091193331 +4006974830 +1256927465 +972122177 +3903504559 +236974839 +3922146894 +3530157742 +3617265338 +94044409 +1265040980 +3878855055 +23580353 +2858341320 +1913808191 +1413435793 +193307277 +561945828 +679313792 +257748728 +3758014786 +3652051994 +2821763094 +3836606344 +2820047911 +3545188656 +122386519 +1433560450 +222235860 +1639218682 +130510404 +765751054 +3479075650 +3335953561 +2451006369 +1948377246 +2617448333 +3300737217 +202086042 +3670942484 +2183515372 +3952576440 +2904308714 +3591379651 +3295931928 +39785698 +1571461088 +2889728934 +3819167360 +3398778347 +1564528965 +1318175101 +3864275491 +1036977207 +4272443200 +2421178766 +2851786790 +2965162970 +1124193927 +594982015 +157037638 +2382438444 +362301182 +812773258 +1622006019 +630856245 +3135664986 +2093846832 +2026084368 +2558805735 +3646428040 +2131954033 +2605445894 +2788780366 +4147323393 +2662343521 +2566253611 +1299334185 +2717348804 +2752973223 +3063499859 +2705643665 +2881417409 +2255493904 +2828670937 +3562449876 +1292359701 +2257718953 +2511328014 +2573937458 +3234889482 +3426418430 +107169931 +2755519714 +376008909 +1551558806 +3845227941 +2401007406 +803870285 +2360136043 +564527533 +1318854830 +230086924 +3602190128 +1935562740 +1968446405 +1514513858 +3515577633 +1712721079 +260538185 +3896989813 +4248255402 +2293152697 +1416958822 +62989027 +3200069245 +1246417338 +3991543728 +763808499 +2657687523 +2938941929 +4146160081 +1822525210 +2843892211 +3156024255 +1099634584 +982191897 +2932631235 +112066835 +2216371340 +112213852 +569730111 +3228375302 +2899827934 +46506970 +3540001502 +2225649207 +170122717 +2489626528 +1237394788 +2753312763 +2224925173 +3367724082 +3389169157 +3175709756 +3720154106 +3478575197 +329283638 +1709486665 +3323607752 +1483550765 +3508751869 +1717275167 +3889157416 +4207112896 +112577768 +2183745357 +1553324203 +2511653167 +116331724 +1977819601 +3567667660 +69475336 +1608055256 +812844658 +4138094194 +997919630 +4042289640 +3851678663 +1446820160 +1543068033 +1765972265 +119808263 +1622265598 +350227320 +34571518 +2146308006 +3035332777 +4083395092 +3054894665 +2433400287 +3171523066 +3241927040 +4231567339 +601947846 +427061298 +2392108476 +1620569222 +2897838655 +3753316106 +83284846 +3251472860 +3713383258 +3438405547 +3312922595 +601187058 +2144468123 +1424738935 +1241117332 +2995937118 +1369736534 +868538956 +2569727356 +2604396824 +179805396 +762974905 +4162518623 +1972771216 +2968681167 +1578088554 +4154993716 +2539095894 +1000820237 +1656240897 +980935920 +3496476658 +2335439386 +1512247632 +1086787884 +1331831842 +720185461 +3385614058 +3410746920 +3246850318 +960399840 +3950281496 +3357698099 +582249257 +4119331196 +3805271339 +1050185815 +3466592404 +1258676964 +738503986 +2818712103 +1355949013 +2737511934 +3480886819 +217947545 +183057980 +3793630122 +2905762666 +2058754958 +3159969735 +1401166393 +3952542226 +22711572 +1778539451 +1440574975 +4060821439 +2269744617 +1638990922 +3400911776 +593100527 +667559440 +2676867213 +18427740 +2899403868 +3815175136 +616605467 +1463755002 +621434728 +162352459 +3698655784 +2717228799 +2019708042 +3655891012 +330159177 +3630781779 +1563802338 +2329048147 +1925286617 +388473328 +2967567959 +1310012573 +3936760035 +1363171302 +3638225813 +254633000 +3113635535 +4260920609 +3748537767 +3304064121 +1714888228 +1342417663 +413279806 +3139136183 +2718307208 +3731529712 +392450247 +3188026597 +3701831632 +2504057606 +2235670595 +3856615603 +4263466107 +2709772020 +4253304856 +796194420 +2955885529 +3194964025 +2638872141 +3619263538 +522731074 +1583093246 +3477248348 +4007228677 +2229510693 +2269945881 +1226678102 +554294429 +3724773298 +3556855494 +3489634254 +1036947813 +2037624393 +64160794 +792042646 +4037455367 +4196847189 +3659452954 +1987881906 +2036920414 +3530808604 +426034108 +3594012038 +676430890 +3952424756 +3826603760 +290709063 +3326024882 +3485316669 +3642290070 +1934573961 +404316711 +2597239617 +3654956667 +2099092186 +3203144283 +3945845884 +842670081 +4235588729 +4219080773 +3165044958 +1999541421 +422123576 +2061096083 +67733309 +1748674298 +3465738553 +1930119014 +761634827 +2834039247 +176588109 +84941904 +3076578436 +3913574184 +3385452519 +619470508 +1683597277 +3601980101 +1073229646 +2365974553 +1605213464 +457123038 +3724479121 +1186711351 +1265836655 +1571507699 +3175253054 +1971891953 +2616065889 +1540264933 +2348751632 +2709965882 +998812970 +2394416874 +614943406 +4211153693 +71652869 +3397168049 +3148265875 +1234693237 +4113162009 +3972402177 +1562649830 +2238591757 +381061429 +841612718 +2102292476 +3633509046 +3673741366 +3566978945 +3169781305 +770270944 +3557130047 +247833752 +1640467961 +164610492 +2035609423 +1684113941 +2713824473 +2744444950 +3542778046 +400897575 +1312819440 +486875315 +2630448170 +4284006138 +415864144 +540557539 +42111231 +3235891407 +140013021 +4109572786 +231524798 +1355117792 +552537397 +1079256124 +3624302504 +266661133 +40348386 +419952449 +592928753 +3550809048 +13844854 +2201038652 +3313265271 +2094010270 +638741508 +1977703367 +892086865 +352590124 +2246888824 +2863129856 +3566178256 +3659861243 +517176552 +3442684649 +1570585546 +2657170356 +624541017 +2752570810 +2350340466 +3949180693 +1805912330 +823527835 +1126334745 +1240368362 +566300029 +4271475693 +3104194441 +11540645 +1412286255 +1593084522 +1455285067 +15224525 +2605344160 +37021037 +834714831 +3506261144 +3121267976 +1786523998 +2203815461 +1883279072 +3483350219 +1677623309 +2720316885 +153664616 +524491070 +203591129 +1536800252 +1004199715 +1755986193 +1675252925 +289164353 +2301986233 +2973445227 +634630949 +3224717859 +3058142375 +2493226197 +2877862662 +2426627663 +367468925 +1996175390 +2627938404 +4274436329 +1070095061 +299072638 +1759343979 +1450466394 +619265404 +1737072501 +3941902509 +1025715272 +860307722 +630141793 +6683040 +1050065273 +1028129133 +3982711428 +37937278 +1613531775 +1900809159 +2971983598 +1274500575 +3700608775 +663763998 +2223258662 +3701903792 +1075554979 +3268968167 +3673551638 +4257158824 +754643648 +100891208 +2865649757 +1873353074 +4100692391 +2210198893 +1485122072 +525321696 +893519081 +2750866897 +2888802512 +3236710314 +921547828 +3456926878 +111103566 +2682031641 +631326916 +1185142231 +394918604 +3042767492 +2357250118 +3851148455 +2709205066 +1308278686 +3654284902 +3556404563 +2432349733 +3998523981 +2609339255 +4035419769 +935528154 +1059820895 +1808581018 +1461238415 +2424151880 +309976980 +2128086034 +2288025054 +2378589794 +56143637 +1681700108 +2152591638 +2412935448 +2106421509 +3258405735 +584923377 +3726211298 +3914369535 +1129073090 +227719057 +251213182 +1029906968 +4215454757 +2627272624 +171841543 +4115053734 +126044339 +4174783910 +2668519056 +3935625759 +2073546487 +568073511 +1159834430 +2182669171 +2532513849 +3447877876 +3945495570 +3422881377 +3256243213 +3774579381 +1260184864 +4188686644 +1174490442 +3052472707 +3726135624 +518434878 +2588692343 +3895626503 +3453280448 +4032090428 +176835955 +1043346968 +178778573 +3502506874 +3842659710 +76240090 +2865812122 +3475898958 +2093625333 +3961337137 +3814532060 +1198923583 +1639716149 +3677624463 +1669160132 +3726304077 +2951151137 +596538953 +607331223 +4286992625 +1814085717 +924485488 +3422738740 +2899215027 +1890523510 +1140671064 +342539843 +1498188627 +582705360 +3672352267 +2894560189 +1605337701 +2718901929 +819513482 +4013058727 +3244096250 +123095160 +706026970 +3616555199 +3727180223 +483725362 +2293948487 +446699630 +2676090329 +4178212513 +1182996039 +1405754653 +2594381519 +2095746165 +319557029 +2420767802 +327603039 +3431331494 +305925746 +1738042683 +236984540 +3553334629 +3394278813 +2454891222 +3492689389 +646556152 +1854999408 +142165210 +2043593545 +286004192 +3871534313 +3833025200 +1617893675 +2959206985 +3373300199 +427453104 +1344302864 +2018088836 +404808776 +1048131281 +3825365751 +3302983815 +1579672174 +548865158 +2480862233 +992248607 +3832857413 +541113075 +3877740991 +3307272377 +2308941053 +2194742357 +1314942142 +2239106862 +166137395 +1319062381 +947454245 +255125856 +3980388928 +512676008 +1809985437 +2981053639 +313388872 +1577717542 +3048250247 +768485798 +3933938075 +185221805 +1441233953 +3053614944 +2455205147 +614864318 +1428022215 +2356363033 +1451362064 +1949724515 +1748638911 +2869821598 +4170277003 +145608650 +3981580990 +32494899 +3991667746 +3895346725 +3874590011 +3809324673 +1603452974 +172719776 +2746440736 +3455360245 +2453290621 +3803918114 +1645170850 +2809663756 +3110264141 +182877079 +448040857 +1702499752 +3221283256 +2639489185 +22791283 +2524442638 +187949422 +3957579457 +469016604 +729878522 +2794604555 +2730195657 +2520867208 +4192657284 +3893152309 +335552687 +3039712256 +2484495391 +2368139516 +2066570624 +1121470390 +3568228427 +3271478003 +2477052528 +2769551516 +3781208711 +1511376231 +3482500661 +1937058196 +1212845961 +4267090951 +2010317353 +319670345 +761498762 +338862861 +278592924 +2285307017 +3258152845 +3173270582 +628434617 +1233035826 +2005560118 +1326407697 +4104562080 +1821039065 +3402119251 +685542157 +1796449869 +3266909840 +878107485 +4123559706 +785558753 +3525900538 +3872507797 +2775532993 +2952867859 +88360683 +3269847937 +2478939217 +1321216694 +3730349281 +2800950273 +2833148928 +2090284632 +2505128482 +2615172491 +814040100 +1329226656 +4077281217 +157161132 +3434253788 +293224132 +3292700684 +2913131212 +2915753328 +1612680903 +2023969435 +2826840949 +201119470 +3122493285 +159159070 +2247537328 +3176474390 +3054356980 +3584841072 +1356541046 +2959426068 +1274893807 +1765687668 +1021646537 +1156191573 +3133782231 +778037259 +611692964 +1212904036 +528905009 +2650869668 +3562839801 +2440403110 +2561950432 +579870754 +2417554482 +2855490853 +1903681674 +506238254 +2006109177 +252696307 +4005001826 +3379695687 +2128633968 +179059723 +639024783 +78244936 +2863661234 +2532547089 +2277631617 +1699004175 +3705221033 +1899836146 +1961568934 +1779744192 +55309017 +3017422878 +2812874888 +4015417881 +3875594117 +557634679 +960285174 +1220925696 +678330840 +3384442923 +858012028 +772208339 +2020158908 +2404596468 +2125375196 +2079618509 +2746245147 +314909956 +1564800446 +618740049 +3364049326 +1751600707 +633385430 +3394199965 +1159789406 +862361601 +713071799 +2927859211 +3956048909 +1642158488 +3106308623 +1208944721 +244385245 +3477857008 +833542367 +3908973421 +2613945605 +2730375757 +1222589962 +1129491419 +2238189449 +1217622451 +1729084364 +3143389686 +3355771170 +1470978890 +4112702674 +1892787043 +3431977723 +1227273152 +740927971 +3032487709 +2639378972 +3968098045 +2018385342 +93469957 +2545788405 +1232963247 +2824189874 +1950209862 +4079334718 +3930325807 +2573355546 +708721224 +3454425197 +916547862 +3421972427 +185049442 +561746642 +1025256618 +1259013068 +1889091687 +2040238523 +300404309 +2159807608 +1239264942 +2017658986 +146972956 +3842324966 +356538540 +1014130078 +1364992679 +907187550 +3101694881 +307564896 +4153304542 +2235870202 +236525014 +1303478412 +557322625 +2388293328 +2306930822 +1498713808 +3099473899 +2053283572 +2247147991 +2663394698 +2258852580 +2715512380 +3192751114 +462154683 +1473204743 +3421669421 +3458132442 +626095890 +2739708671 +3739229555 +2637433584 +2027133032 +457057552 +990114918 +1878378915 +214257907 +3319924106 +3650040990 +3892614082 +1811213429 +3537073085 +1641064239 +1408751169 +3532652421 +3521618006 +1269720639 +2925422386 +358605377 +2155237915 +1497876383 +3689526582 +1729792964 +22307564 +1516208938 +3421625378 +937311632 +2732081735 +3946427111 +4136208369 +3851621608 +3277422787 +349500039 +648399759 +990381034 +1577715367 +691365790 +1784824257 +1253592435 +4084770408 +170818138 +1252243100 +3760611897 +2051592358 +235308270 +2437184225 +2620847907 +2092310629 +2717773172 +133679598 +796325422 +826383012 +846161896 +1131174914 +538054201 +239074701 +3070716350 +3740971212 +1739347626 +916310132 +1101231773 +1756516850 +1236843889 +4071821065 +4091993028 +2580158247 +2739923205 +1103955750 +3177732285 +2956536945 +2655821066 +243386306 +4174838649 +1258314758 +3388146401 +2806088249 +2588763302 +180497651 +2460321930 +1996140093 +1630511663 +3535678061 +537257490 +3286559096 +384278767 +3793434824 +3169304353 +1632308140 +2681251146 +4231237465 +3978109459 +417192129 +1913060365 +681387263 +2497000609 +2465506869 +3371274653 +578618701 +2239791959 +3941592435 +2324633941 +2368275655 +794915219 +3750928951 +2278038915 +1153101466 +4028226184 +2619964244 +3897426995 +1849307775 +3549280860 +512408081 +4250879235 +3839088085 +3247140764 +956784552 +1914728119 +1452656786 +3300202984 +1652674767 +1331930148 +1630873719 +398478674 +3701645942 +623600313 +357897434 +1721586388 +1446280256 +1126289475 +910865649 +1622264605 +2710535805 +3975901108 +3312853288 +856431129 +570963671 +1512869720 +3777543850 +3302549372 +215579663 +387874571 +403384694 +793501601 +3272436241 +1656058242 +3756335267 +2282440800 +4271975338 +1053615694 +401273674 +2770385780 +4191113746 +2092840014 +2995591277 +728785901 +665892902 +575276274 +3051550744 +2409601267 +3800605224 +2042641258 +77766132 +2637188550 +866150203 +1341780020 +814875486 +3216890206 +132663820 +61412614 +1951748261 +1621292896 +2745888891 +2706657717 +3250575829 +2058964328 +3243810446 +325214425 +3656358242 +2742442770 +1392135247 +3771601946 +3657341184 +33149189 +1087062822 +2334001068 +2023635261 +667134625 +2443056757 +567971537 +2868651342 +949598430 +3264233362 +3666273042 +1104587134 +528185632 +3591898359 +2910576341 +175948691 +984877766 +3599042772 +3291492166 +437323073 +1387646304 +4252700685 +3428333302 +2618453706 +3728075615 +418781236 +119319392 +779916745 +442845484 +1286844377 +3400161273 +3210285203 +435805441 +2066434570 +2142073024 +94135635 +4036847756 +2015726319 +4192542091 +2922000143 +2191348955 +1340543441 +2188889805 +1202888120 +3943808033 +2908060098 +339724444 +3358184108 +2954422815 +917687462 +3952693660 +129672324 +603468380 +4165417209 +3825015025 +1792285778 +73001125 +1868133302 +2431117974 +1392114579 +2072388605 +3947114731 +1898897389 +4281971279 +880652115 +3903785904 +3057379567 +626153034 +1403122712 +114812974 +1376517038 +3309663714 +3151072302 +1804322318 +917636598 +3248611127 +2454407180 +1605953803 +3916497229 +3937343853 +3498851299 +2750047293 +2783534254 +2742400062 +4148744271 +2436249813 +1414533276 +1475219262 +2919071799 +1719904033 +3859084425 +1234122122 +370999499 +960539823 +2057842390 +3364062194 +3950124350 +531039455 +2844509278 +3973552471 +3098605112 +3551530793 +2636045004 +4155000720 +2252641070 +226282968 +2197084095 +1151778064 +1603905122 +2946574028 +3637295911 +4221221592 +3027378739 +1721006104 +3127385015 +3167761214 +2765576726 +2391056924 +3058243139 +3402983108 +2608315786 +3785194364 +3863981278 +222565798 +1263459166 +3482202700 +2506483893 +2698058331 +1226444999 +3439549624 +1333222647 +1807238265 +951451390 +2633925796 +604080405 +4241687969 +2560787312 +3304334803 +2776281370 +3224017989 +2986680958 +881394435 +1739409719 +2915015081 +2363612066 +1876707842 +2771033718 +3651711889 +3534686374 +1977926989 +1847054337 +1437325158 +3898780253 +4006043459 +2329226652 +752288600 +2023812150 +4091747577 +115968134 +6265501 +2701062647 +495046923 +746620834 +2684023094 +2033821841 +380952289 +3043188751 +1649104251 +3003972020 +3931278147 +1092579061 +1438285915 +428027343 +3129256619 +3075561994 +2154416758 +4061370980 +1353661681 +3744500560 +54894311 +777325136 +2235779587 +4294901563 +2375721291 +1403038990 +3630095421 +408399649 +967553044 +1831078830 +3447255237 +2729001732 +1362207639 +3983903108 +2464618322 +2594372135 +1658522495 +1972325625 +857669952 +1714820351 +3639153519 +1877819688 +103249924 +1433161778 +732450487 +3933142471 +3494710812 +1209791763 +1306651494 +1276996154 +3970910131 +223792768 +1448588254 +299023472 +602707666 +3898112762 +16913201 +787381219 +890232540 +3626751280 +839843850 +2995712874 +258448828 +503018465 +2771539419 +1576042558 +638941541 +930617723 +1339711239 +489810848 +2133326164 +2668161661 +3621307409 +1401153495 +1628157519 +671811844 +2663168044 +2685744284 +2366617786 +2719371301 +3690735452 +1553638622 +2568959650 +3471616875 +3456854841 +1652377184 +250631385 +3619052601 +1926295091 +2761481876 +1116863430 +3914238680 +798417266 +1825148045 +931968509 +698909994 +243506923 +482559069 +3089526363 +3952535550 +3143317768 +3905833857 +3536687256 +2212318697 +1613332135 +1755030535 +596791621 +3530671477 +4169695416 +2762903721 +2114838291 +963166244 +2121815044 +2290531204 +1695939074 +4025367611 +3762189496 +2455001713 +1751604778 +3924223594 +2745977247 +3165414580 +412167368 +2088468266 +1659865868 +2974706309 +1873189660 +1629577787 +935837221 +3284136975 +876004607 +858564656 +2498486962 +2490529797 +1020260619 +2933131365 +2517809917 +1765600700 +2082937488 +1779209704 +714438097 +3323084156 +1404001911 +2072983239 +3946019608 +4005781238 +1153291020 +989562520 +4099301651 +1353133566 +2457100257 +2539468239 +4048937418 +882241155 +3992449970 +225916024 +2286319901 +1169689920 +1206524539 +3735905169 +1207131744 +2872277008 +1493642016 +417398803 +690708357 +178888404 +3836218897 +3311788801 +2571765436 +684167208 +1136213085 +900454610 +1308391170 +763618653 +2823505681 +2402046303 +3608616396 +4261725752 +653307004 +2371196937 +2770914835 +3478208015 +3661875255 +1604001011 +1769731838 +44742197 +4056262483 +886712664 +3523208270 +2004671487 +603552262 +341701675 +3332167977 +2381727671 +929347605 +836464067 +1988131877 +68041483 +1563199327 +932455228 +3212057919 +1744156976 +4174451636 +1572057334 +2863852703 +2980354966 +2321372535 +1686726795 +2844720427 +840096521 +3724773514 +2343339546 +3735823775 +3981644065 +3556191984 +1989344221 +4180397558 +1073932991 +1017564528 +1915759755 +3951386030 +1278320667 +2901643040 +74777999 +1551662983 +56801411 +961753080 +1082803098 +1429035726 +2361695013 +3928452638 +1473201959 +2812028887 +4234075307 +1118147967 +2879942694 +1572411610 +554690339 +806495541 +2335930464 +4069575682 +1344691849 +3964593004 +3721865029 +3171156289 +1761261587 +4025756521 +571137916 +3980165039 +1082457038 +40800310 +508947279 +365687949 +165712864 +3617695388 +3095869056 +4050056703 +2548776557 +4170728684 +3496416852 +252956041 +482251575 +3802027900 +2367113512 +680612387 +3236559965 +2334043760 +2410136615 +817277405 +947934915 +1017009177 +2911946924 +3888967478 +4036063321 +3067803251 +1313850085 +1582534724 +840089934 +936228955 +4090310809 +3816987702 +255398919 +3892256940 +1745570110 +3196661004 +1854283120 +1255951030 +3234684432 +1119065689 +4235735678 +2922254464 +88725575 +738937632 +3722754091 +2964821813 +2533865341 +1175663591 +2494241554 +1205567575 +565427928 +1008426767 +2968099020 +1330546642 +505995910 +3266271000 +3339671143 +503859283 +3235244395 +3779725971 +37947543 +2128663330 +4030312151 +103595306 +3791176610 +104504883 +218063150 +461996390 +996938257 +1779405754 +4179870026 +4111290340 +3985264743 +4195182149 +1264629851 +3122030764 +2347817495 +1685996052 +3599711326 +4033104946 +2920911844 +2035828800 +3930090006 +810137551 +2963926600 +216734586 +2248961100 +2326805046 +2003881575 +2344639823 +2801542317 +3393147722 +3915133660 +2804220835 +972389778 +1608700202 +1378209271 +2355789863 +4199952261 +1920884694 +3328608501 +647291628 +3690731849 +2978243444 +1079434555 +69040561 +1885917647 +1064406586 +3804338930 +4242311641 +947308094 +1968969130 +3031700694 +3419232639 +3269295488 +1267559121 +4121221500 +977206583 +3002615670 +2934857643 +3716154217 +990211072 +223173338 +3365129552 +3218068175 +343833011 +2460897807 +2111114219 +1118544028 +3380233396 +4181653493 +3950965046 +2744878600 +3792153283 +3872078873 +2708345208 +3209389086 +4202338519 +1495316875 +1415767084 +3254127234 +2184345157 +1294274766 +516908375 +2263818240 +486696018 +1302975055 +1050654776 +2836979504 +1305375456 +2089729504 +2887614464 +4055605864 +4023309015 +2351119292 +1563036158 +3545620988 +1999150859 +3582297645 +4197628210 +945701236 +3790642124 +3088835493 +535718759 +1122314928 +510968223 +4285078729 +3300305427 +3168559591 +2378635458 +3895355229 +1652930401 +1778082363 +1031053732 +3755169289 +3987603234 +4254350961 +3068344859 +911651709 +2607645019 +2290148178 +3575542805 +236579921 +1362330618 +3415400631 +1336391860 +674893410 +2831012691 +1078405701 +3620574361 +1147269352 +2200373543 +2581695421 +4104020618 +3583500133 +311752031 +1770148625 +333405043 +4046062444 +3432808186 +471714860 +3260634009 +3918931231 +1248642401 +4198939866 +1913938785 +2930950062 +747064115 +4242715373 +3690306550 +1519758355 +2882112439 +521863875 +1386946598 +1918619932 +2346817277 +1173383693 +2466928243 +1681460812 +4236792309 +1303231875 +3468614244 +2938574063 +209159751 +145491810 +3221582355 +449745792 +2184137317 +1802716533 +1817295499 +1926313136 +12135251 +1478146698 +3645383516 +1874524688 +1128347951 +3112400767 +1694336432 +824899246 +1742764224 +286945839 +2739569678 +4047631347 +918055585 +2668363091 +3353886120 +348138486 +1225230028 +3395994367 +2567789516 +1180622050 +1017538581 +2146827743 +3866453447 +3026324959 +930297041 +4108450645 +3109309173 +4263414098 +360902739 +1996649827 +915560481 +1948738830 +1386633457 +3131609733 +1993273621 +2934098044 +3300579237 +3627840243 +1244542037 +1772202674 +2268470253 +3821248890 +3290074064 +2610033006 +1128448474 +657233608 +2592856084 +939655606 +325459836 +1204556722 +1479198606 +2080836260 +2787888919 +1995193712 +2691056214 +3850436381 +1530140248 +1576078255 +2672927278 +2913592112 +2995822944 +4248011468 +1565589844 +1250859971 +2247828082 +2087817913 +2372758693 +3937522657 +309298636 +1839412147 +1192792474 +583344496 +2653972257 +2062798221 +3823789234 +1489086513 +1050798738 +2742056137 +1433312227 +633063303 +4015635715 +3008202037 +596225945 +2664988982 +587544270 +2681780162 +3451682611 +2208459537 +1627745 +2911881409 +714138739 +3262308744 +1101499425 +1966359247 +1450751326 +636350292 +3604316592 +3427257200 +2581199398 +3241496227 +3674927709 +3152303726 +2038785747 +586644409 +194303910 +3653366981 +462717171 +1195117264 +1653146828 +403327256 +3439041498 +1260530719 +1329966904 +990365249 +2425682641 +479674031 +2198785525 +1185291807 +22654523 +1209246946 +3708488625 +939389070 +3729156003 +2466190492 +2626288495 +2727553250 +169036262 +1856622608 +530727332 +4107789913 +252912730 +73107743 +2325640306 +3869192153 +1297395231 +2497680859 +3718990931 +394789676 +3700630200 +1396237210 +2975345009 +2511281548 +3814995979 +477651413 +3508451142 +3948886971 +2231246984 +1881392652 +2801451116 +2547651706 +634185274 +1655894420 +1369641012 +1511125791 +3708571878 +1068101556 +1042123081 +1998415090 +265044099 +3808299921 +62407428 +3272651855 +2480687755 +1843307138 +221119531 +865302847 +2790514616 +2212063783 +1365939001 +912347761 +2021507854 +3089014851 +3948789107 +1406453776 +678758510 +2477763005 +4047587621 +3995211898 +4009249518 +3527646518 +1671209653 +3311947582 +2627888155 +2142030316 +1779614874 +911622784 +3406593231 +2588542590 +2645751286 +41800075 +3276913566 +1556832997 +3772897255 +4055747600 +2301672488 +2918562164 +2782107232 +1431430627 +4134921679 +2678074446 +3852674008 +3501965771 +492552821 +686939864 +1475431947 +2799680717 +9176967 +2699935888 +1630047423 +2120978928 +1180751955 +99102830 +2393585682 +1398852891 +2416212263 +3028829936 +3035426872 +3074442312 +1114212928 +4091711032 +1579122060 +2168672810 +1673460361 +3951723212 +4251690806 +3102767691 +4016889843 +995679086 +993388382 +180212579 +2511682504 +2778639017 +1122550333 +771806046 +4197704634 +1323033047 +3405162003 +553907685 +2238190813 +2117885606 +301576278 +2025695857 +2042462585 +152664735 +1061086330 +3302784200 +2197066594 +1350004628 +3074934010 +2674708076 +2058661002 +1431203639 +4256959338 +1064828766 +780770878 +1740645757 +13052809 +2144226940 +3608021395 +2344120054 +1430687654 +2526181645 +3404526334 +2335473938 +2771481799 +4060071198 +1981637855 +2217240126 +1065491328 +4101624659 +3680106225 +3685310256 +1477525669 +1237638642 +3826718666 +1775646839 +3911247815 +3267596590 +2576384377 +2764306721 +3194058612 +856123202 +3156096368 +2630715241 +479806465 +1924736864 +682574243 +3618141848 +1472551733 +3427313107 +690669867 +104014059 +148271813 +1488472328 +3641627696 +2343285071 +1504653093 +2305651854 +1571761186 +4245556979 +85803379 +3454845596 +3084887808 +223128415 +3491006515 +3415454961 +2005776017 +411726737 +2728808987 +2701127517 +510578317 +1486024321 +1717486491 +22897941 +4271875590 +2686417795 +1285108897 +1501335890 +1047269014 +279352576 +83291469 +2779276298 +3325277281 +1982276095 +2591879374 +4224799692 +78749925 +2657374796 +2486591362 +3557554528 +3960826739 +1095375508 +3581363890 +1787811968 +1825092715 +871926210 +3891617307 +3672866923 +3633865046 +2199915759 +3412514934 +2244812560 +2991698085 +3242293965 +1102918157 +516510674 +253903322 +4210411845 +3752504576 +483850493 +1704451156 +3389400418 +3843325686 +2882643741 +49790387 +2002093053 +1963582255 +1155867012 +4159165417 +2806389562 +1409170710 +832490754 +3947428969 +3535172374 +25585603 +754411277 +3685825554 +3034424958 +1740697036 +2992377993 +1267082009 +3497973560 +2101264691 +2064367195 +3264959801 +3319420659 +634967219 +3604404240 +1382282036 +1924501150 +2864465602 +3119323204 +33828236 +159362536 +229706909 +2010379446 +627662428 +3843072378 +791477929 +1451818768 +3948205695 +1420537794 +1252518712 +2244028830 +477759505 +3252365421 +2226873031 +351983629 +1475945565 +3732560692 +2444105173 +3848620758 +3107000248 +3982530913 +1175579108 +1892287304 +1810716242 +667727286 +3860796115 +2203724177 +3967045931 +1805167314 +729361387 +3524612305 +2687171646 +21352410 +2172292223 +1204267585 +431172472 +4084314043 +472231800 +655420309 +1333815739 +3384637997 +2667737888 +3950366284 +1274836430 +3133589550 +60398814 +1605191929 +4162134853 +64871930 +3789610429 +1616147336 +3358500261 +763304054 +1791183187 +1032914965 +2896918362 +1464162695 +1990799441 +1969242586 +1171379935 +2416401298 +3846959601 +3685110229 +2190698 +50968702 +570041646 +2455853605 +2574293235 +824412542 +476795443 +3356802614 +2259349842 +3570720071 +2700544903 +922040838 +3488244320 +2028182450 +3593734511 +3359279220 +2793959457 +1372714774 +3346346467 +3891231451 +348502678 +3113026413 +3019888593 +1972708974 +3095164343 +1999785218 +2847938459 +3466777075 +506778818 +1941401893 +3754057236 +470442332 +153813918 +3851869707 +2291787364 +1854632490 +3593736886 +2090949679 +1006670387 +2967896769 +948096166 +3703232415 +3195256632 +3455188226 +3037857885 +3923477858 +1003514760 +2753812149 +4191880515 +2234639545 +2938159468 +3311175886 +4274336710 +1843254555 +3973778257 +1511524898 +2221855846 +723019591 +92771762 +2825973074 +3730142081 +3915038289 +1035278254 +2726822064 +3919309387 +2121099670 +3646048945 +2488285066 +1147430042 +3009583529 +3578598933 +4085511290 +3928960949 +2544723643 +466412306 +1377564253 +1756542013 +105919577 +929650913 +3129079340 +2861494849 +3264320549 +927979271 +1702473050 +407611380 +3020970461 +825362738 +1696887602 +3866976261 +2303280185 +1774879007 +3825741391 +994811018 +1729380070 +1561513836 +4110042492 +4224222254 +3454439042 +3496313031 +2485279771 +3652567156 +4234962975 +3409354566 +1552989136 +1998914663 +3124065609 +1901973486 +2240736541 +2041342927 +2798183706 +3956093238 +3369089195 +2043795028 +2381465067 +4038757637 +1541629869 +943880739 +2444244289 +2174387498 +1368149385 +3812594299 +1911684395 +1443462471 +2258863950 +1750623322 +2676016783 +3692919129 +1876381328 +1261849132 +3822519468 +2336494641 +1359514296 +913611038 +452978262 +3508136149 +4147456948 +100261959 +3911454813 +2008138442 +2371883405 +3790646025 +3763809499 +4046102049 +3429447427 +2255267613 +443293966 +1887862573 +2361561121 +1462476483 +4275547794 +1138690706 +190269204 +1319838177 +3757976135 +2803524219 +3934689880 +3811260163 +4018413133 +3531436442 +1460519239 +3375662166 +332798254 +3648656648 +3323728831 +1105870098 +251463272 +1623112719 +958280399 +1575947967 +1669186700 +607617149 +4074162628 +672344199 +3928681324 +3397328897 +1934709576 +3838001196 +1548575787 +1167074724 +1769080901 +326274446 +428012971 +983367054 +3747807303 +3125974160 +3643990466 +3297612941 +263666501 +3057722581 +2239848050 +2060962109 +2168350371 +1120617065 +3969145695 +3675329363 +379220090 +1406404213 +3341074296 +2216331404 +2979254535 +1745751430 +2586183487 +2837754342 +3804534381 +3055380902 +2181234017 +2698221761 +2354807930 +3907330762 +1671459715 +2516698250 +1647288893 +2466919264 +1046492038 +233420086 +1615066478 +3546537389 +2743224507 +3192501045 +2972795777 +3704807459 +1333547657 +3866955075 +1509092682 +2896613608 +1628463449 +3045664452 +443031715 +3607937985 +3302956313 +4220120484 +444184404 +2148129793 +74143767 +3826787950 +3969623643 +480091760 +1170117180 +1620698509 +3899206656 +18483313 +1661274354 +974255980 +373623690 +1774372594 +170851685 +124784889 +1199066945 +1518056380 +1833449351 +342667121 +2507980860 +767390567 +2037278598 +3642767874 +455750378 +24341882 +4242772694 +1671491918 +1361241062 +3527031865 +4110785864 +3401725268 +3088082666 +3171705537 +315072449 +2021831162 +2202161254 +2749000530 +3144456293 +50473590 +3275561756 +2843245285 +2261501275 +1341405282 +775954173 +2132392757 +698536674 +3805124805 +704826365 +3261250738 +3703346640 +3176459179 +4026754498 +1084439194 +2307065339 +3748056781 +3314750287 +4260602080 +3164095311 +2648948382 +4141964944 +1750668066 +2194820712 +4234520687 +697979228 +4174142572 +494782065 +2647576748 +3454945985 +3015238900 +4212897966 +4261200239 +4235271279 +449808251 +892032411 +2645051389 +748391918 +3662183043 +1191713895 +1752853222 +3485121568 +2735406119 +1064175130 +1901134421 +592889699 +1443459292 +3626903617 +2993348022 +3363405127 +1697893951 +958415954 +3934632380 +1165054846 +1286257949 +4254659254 +2020263941 +3339482430 +3405268222 +3388335966 +1193332041 +512461122 +2799953121 +2547262992 +2267748407 +742727028 +687281498 +3678199428 +3467968363 +3726557175 +3202557214 +1943732528 +1034487636 +1206023697 +2499704597 +4270780843 +3373569273 +665310034 +1483837753 +3450677462 +3863247860 +2385107919 +3768555628 +1795150509 +726542185 +409684454 +3211944714 +931424902 +3181619983 +2533342500 +15948119 +2259944081 +3617872006 +321514752 +1326528536 +3368854051 +2079173885 +4020225116 +2874985113 +1086456412 +3032078996 +2434671755 +2367415913 +1869910503 +1006868639 +2001773588 +3654528382 +4194824628 +4241363498 +3050214240 +2703856682 +3844534556 +2444358683 +1115605904 +3781882121 +991705225 +660621102 +2531354668 +114029217 +3777728977 +1181913072 +962704687 +2503720653 +3361007134 +125192272 +2851767060 +2424348490 +622547543 +3244155189 +2766977431 +1886689803 +2715501397 +2241328659 +3449509546 +3201471807 +802258379 +449313788 +1796327975 +3233935500 +1226320330 +1181883118 +2574157491 +1958994943 +76735125 +501321417 +3866528761 +2147789123 +469420644 +3727654891 +1473040578 +1869484495 +1275060634 +3025483428 +2325113096 +1216820460 +574590332 +1122185619 +38109619 +759681887 +3875197724 +3790033102 +1340678892 +3573845168 +3772291411 +1157802013 +426082654 +438636417 +563587993 +3940876359 +2122000588 +212002594 +3174005963 +603409636 +3022742702 +2260744561 +3198404938 +1485067924 +4021994500 +264751628 +125633192 +934244586 +484844933 +1617718024 +3262523871 +1686352572 +2628601534 +275973420 +2185623719 +282111929 +1350618117 +3242594725 +3937441961 +463601220 +3656195955 +2513365553 +2784728800 +1396112563 +2040180879 +4031834421 +2806369621 +152052140 +1647162021 +2653717408 +2667502212 +346495439 +422006676 +4179204593 +1927007304 +3909029914 +2069353530 +383935359 +488286797 +4276411083 +609525431 +1836891976 +2513242996 +2879349400 +3566907459 +2200427867 +2082974161 +2767712407 +841564174 +946079397 +2684516872 +3174077842 +1980657892 +2821240387 +1581216472 +2819461298 +2890238773 +569610423 +2913010224 +37907788 +3491174385 +2647944014 +987423552 +3855821064 +2984592710 +4044657230 +4174437350 +3019070698 +4031197456 +1884282589 +3677783625 +2698643142 +2593164345 +3592773772 +3817081958 +19341617 +4129900740 +728948501 +257108131 +2212662189 +3201019581 +3908390786 +283633134 +4095944503 +1785232977 +1113619566 +285999804 +3029060464 +1394988220 +2968029156 +2752005174 +2092187791 +526156713 +4105844991 +3971376549 +1238216551 +2626671202 +2597282993 +3968511479 +3381553430 +2296343017 +3777486354 +3532622101 +1135064884 +2042649509 +2675082693 +1932269144 +2736434583 +464018704 +3595146432 +3532446565 +523705493 +1791740111 +1489360407 +119885383 +2632149773 +621984430 +72480451 +1420639991 +1171803867 +2039274792 +2573710352 +2801477351 +2729803108 +1320327602 +2745043551 +1767633482 +1843301442 +1078833209 +2805764032 +747064168 +3252153521 +822606486 +901010396 +2007096897 +1306419038 +2807515681 +592732454 +3497861786 +3454904311 +829959472 +3190152684 +3071232292 +3669861670 +2162175845 +2995583027 +2613781689 +1268188422 +333150953 +1878883667 +2956198438 +2866233240 +3251684678 +1720649752 +2818066104 +4014212726 +1684662683 +1976840435 +2956251414 +967742611 +3947494317 +1225327231 +2604895346 +4261805074 +1007155152 +2292593052 +2023979253 +4236869979 +3036622534 +4166686525 +2417427056 +2369931179 +139649403 +111875860 +3159341152 +1864883864 +1150133560 +1252971410 +1094301354 +2082419787 +1851161058 +1803485153 +1839975130 +2707084136 +1163094871 +4013260689 +175822092 +3291841124 +4228359193 +4015448043 +2644781496 +91120747 +243336410 +4195462845 +1181082236 +3770736833 +1808117916 +1210684273 +763811445 +3135491795 +4001480095 +2624819923 +4275800221 +2935709572 +4214951226 +3494362654 +1766184857 +2126403382 +3760982713 +2374126416 +3675919081 +1984915853 +3155085828 +38273631 +3194198089 +2385757447 +2180323448 +1541208839 +3610618370 +2209946316 +2822763075 +2763019553 +817703402 +1247698912 +441695884 +3574359386 +2927950630 +3686851476 +1512418626 +1211694269 +1923886323 +1712955029 +414432797 +2256377575 +4077134141 +1879436849 +3888354648 +3945152236 +390185053 +3407077786 +2934600631 +307486187 +2927745951 +391219631 +3506880421 +2732504709 +2649101041 +1659371333 +648052631 +3048141064 +2519303174 +1009231088 +1812151789 +3318438870 +4186065874 +3563620334 +4110766916 +2052329564 +789330115 +207364161 +2086288736 +1273791535 +1491110521 +3015924037 +61724544 +3066058264 +579492163 +31978896 +1135305720 +2904273198 +2293655987 +2959479503 +3571987324 +1275265646 +1115252568 +2631130112 +1341640540 +2941768272 +3271866703 +3889439811 +4036196116 +1178694666 +1684574775 +3333876322 +2370122249 +717590979 +2746353009 +3301346132 +1239165084 +1968129364 +3587306123 +1131107301 +968007966 +658918480 +2402053743 +1776233384 +3739603080 +669815138 +2393920352 +1302112427 +1894201147 +1186935409 +4283330471 +1669581817 +4198286233 +73154696 +3594686154 +2247529074 +2881059039 +2414598029 +2379280559 +1246676349 +4287293395 +151523475 +3443270533 +809868503 +3015333115 +711397924 +1556614441 +2763879263 +1370870364 +3500247196 +929583452 +1053497655 +1799594308 +3391690888 +2212097006 +1758776633 +3052691762 +4167290896 +655003154 +83569970 +979432035 +1092702483 +890555300 +3509701676 +883420920 +4190984141 +2585145352 +4006900956 +4093585483 +33076878 +3544887925 +2562172018 +1068809759 +39654038 +3158457351 +4009579617 +891076488 +3309810234 +3220671388 +2014565335 +3822280584 +424283210 +2257647294 +1153918457 +3223019848 +2449888628 +909861581 +1371159030 +2429011428 +802556084 +2496543431 +3314559528 +3469152924 +43507631 +3893953056 +2989931811 +410096281 +4122744179 +2340825571 +1402775658 +3141879347 +956658105 +2841942190 +692156465 +2979099670 +173783595 +1272287311 +816132630 +1658209589 +4140158657 +1855880302 +4289257527 +284313632 +3507802751 +645819405 +2101489915 +1748874487 +97539905 +1400948897 +1202151993 +685589063 +3882255010 +4077677906 +1900088260 +3094715866 +445404866 +2334777959 +982119618 +2436535942 +3633493072 +3962610595 +2868930844 +3544313065 +4246963186 +206726377 +503236600 +2414859870 +3821559543 +941186709 +3967179814 +1955641283 +2388592069 +1089973239 +2947888936 +146393450 +1718746863 +823442891 +3154219161 +2422775291 +1388579177 +1644657317 +490086861 +2717357177 +3907853337 +2735317889 +4080046850 +3415505733 +1416260401 +294362133 +1282667788 +693496554 +2447883119 +1236350921 +889356860 +980766279 +2615943456 +1487637331 +3576286751 +2099862803 +945774381 +143951862 +2573487519 +1418953575 +1857097172 +2121327360 +3810475034 +3171293100 +542007736 +2422479354 +3585247936 +1761059106 +2764704724 +3980592195 +1506722872 +4238103025 +1994541319 +4259351641 +2627277483 +2623092405 +2178576545 +2291396526 +2874364294 +3032263420 +4270776161 +705128041 +1126111114 +98150626 +1768826728 +3713125306 +2916482567 +184011025 +915139558 +2049738428 +2364873142 +97536190 +1764735075 +3061885906 +1331483139 +189740362 +214278478 +1378878330 +1246168430 +343821843 +3548063216 +167348584 +373321763 +3181440191 +4124864126 +1609667601 +1034994717 +3093483371 +2319875231 +194038581 +91759212 +3549374484 +3939751924 +602857214 +3503420380 +1605096250 +144233765 +1093920562 +369931785 +4238992727 +3244111644 +2707519855 +1552559108 +413654407 +4091702839 +2884049691 +1869753929 +727634584 +1470728677 +3654243155 +1231247408 +245364604 +3326969080 +836846992 +1248176370 +2924963463 +2991949593 +1841434053 +3812446272 +2858442759 +1524950936 +3607454596 +2117164549 +848097372 +4078121680 +2694356125 +2439243328 +274571557 +3891791926 +1142472921 +1372215528 +1532192842 +3076894903 +3539450338 +1302832650 +688381230 +1083014494 +2110917625 +3274103428 +1223556612 +1957146070 +2981751458 +1347216177 +2020739845 +3787556059 +1538926983 +4169673020 +3018177702 +3072533357 +3805479923 +1212854311 +3851036429 +3855370779 +4269252911 +1210543623 +3793038350 +428177928 +2285471388 +2706298809 +128550065 +2499072459 +3358368294 +2040336586 +407057084 +397622794 +1809042018 +2832769142 +973838873 +1833378733 +4262101098 +3427088032 +1307295910 +3237619961 +1692666190 +2647967619 +884034315 +2977020599 +3990929875 +2916543536 +2445012008 +4096382955 +2326681905 +3793793278 +207816212 +3461878470 +3998290316 +721076500 +249119346 +1165178675 +1127330751 +1108375760 +2114014625 +1898289510 +3005460259 +256585502 +513546495 +670696595 +3087633961 +2081703246 +1803064523 +1146716299 +269606047 +1832186194 +2943743004 +4165338727 +3707183251 +1762608415 +3558718010 +2306475895 +1279695514 +2957676729 +179087730 +2354128484 +3747319268 +2796718566 +947026097 +1646614984 +1878378508 +3203250343 +2446246732 +4157914015 +3453823704 +3184894798 +4174544756 +2230499800 +1975225516 +2812719593 +252796069 +2065099078 +3252487688 +3092165499 +3983121304 +4009615555 +2558839164 +3380791411 +1995639424 +4113637018 +365684189 +943819335 +1935375627 +1825827625 +2615688389 +1674664862 +1980717076 +3716385460 +3090039409 +1961103 +3205187785 +1511394430 +805990440 +1307346441 +3080284495 +4225963320 +4280470826 +2750502072 +3812267443 +2735665958 +457931269 +151213070 +3274839343 +2497652345 +551020217 +510685389 +1075425759 +1146571825 +164645799 +4011941143 +273523254 +555085413 +320106951 +1743874742 +452274572 +881517041 +2548262402 +111586726 +3608098876 +1482629575 +653425988 +3688927335 +3406661295 +2187765223 +3994668336 +1067864856 +394760442 +2685083259 +3075109656 +4011060682 +989455211 +139969692 +3411760824 +2723839175 +3501356773 +31798812 +1879441894 +2943984270 +97213258 +4069884063 +2141115028 +2974456645 +1572682885 +4076621184 +400058606 +3191210846 +3073947956 +2995284141 +3118017026 +1817071497 +1254053177 +579204987 +2833931032 +571636911 +2762489745 +3010932606 +306337909 +2081811577 +3366527353 +2731819433 +2297828267 +565952206 +3487787197 +3466492247 +3228896741 +1478282475 +1121233885 +1573327729 +3172536023 +4243888433 +2893149341 +2513514717 +1277168152 +4248649827 +444405806 +734925254 +1413826340 +3570029652 +3110525837 +945909782 +2998023544 +1692935782 +725946751 +3170451695 +556120150 +1916685564 +1118167550 +2353091167 +94494446 +1343228719 +3994920305 +3090250617 +2457088903 +1129790203 +1092428215 +2334277177 +3786924066 +156204085 +3217440667 +4211862096 +2219682635 +1484660868 +2002086318 +2454839937 +919984957 +566789003 +3021581092 +3618605540 +2191025716 +4265419514 +42969073 +3012461489 +1635325925 +3269246512 +2605248904 +2998861528 +3907239469 +83453916 +1343434781 +2087201049 +582216862 +1434237010 +1949336463 +1343469659 +4096584933 +4139209394 +2937691692 +4140437197 +2575148724 +3883516334 +1667283921 +3063966782 +2249344065 +963371992 +1765985379 +1595459979 +972103310 +3804332592 +3272223762 +2817386243 +1005293590 +2751802885 +1927740232 +1581636502 +2493018044 +1897902562 +823313041 +1470194342 +1230234864 +3506723428 +769466238 +890310655 +2196521338 +2476599476 +4077625846 +3530223108 +1042605327 +323057172 +1692920946 +153216694 +1319868068 +400135361 +273616284 +2715515305 +2569546515 +1853596257 +1658826815 +3632146570 +4234317441 +2026816864 +699423084 +2036214625 +3158521865 +2950422047 +2609847466 +379745081 +1206903346 +1246505891 +3853287307 +4135717646 +228949334 +4044267195 +3928088189 +2190292569 +1559145138 +1168748663 +3721900094 +3258780770 +3386429857 +1366392104 +1736471046 +66245129 +1624947620 +2063258306 +1154410491 +1083226266 +623973403 +3513647909 +85670128 +2698560166 +1117114086 +3161271214 +1937101853 +3719671383 +398488831 +3045168151 +709974948 +2542912106 +2822150944 +3180556892 +547761295 +1903218498 +1416143774 +205962520 +1090377227 +426738816 +1005672353 +2604036003 +2645261376 +178581900 +2353216564 +2919029300 +220179378 +452305103 +1200244020 +229462673 +3772461430 +91221610 +3519976144 +1984446559 +3434660732 +3632316798 +2299829630 +2231806758 +942238991 +356082541 +1354218940 +3466352977 +3620742056 +896707051 +4140612642 +82613453 +2203038722 +4252744649 +1615654611 +4173883463 +848662284 +3156383310 +799780076 +2258783500 +1283627320 +359958482 +1353524349 +1365961962 +218307789 +3945594087 +2794673253 +965740910 +3503173776 +4160856251 +3676682345 +1312196765 +3142648709 +3201570894 +1022225218 +3055524674 +698349117 +2878489221 +1649037792 +2076153525 +1810418798 +1330060852 +1499323185 +1637838389 +806678191 +1988705254 +972952227 +1085813824 +944550432 +3208198571 +2148915695 +913813593 +1250180674 +1041077825 +2642787760 +2833003978 +1171166376 +1277492098 +1765642859 +2286629702 +2651917282 +3965603162 +2682440012 +3302605924 +3121548387 +724950528 +505538503 +3308480282 +2273536347 +1155822374 +510930801 +1557065506 +271677833 +1128270457 +1179150894 +2862804126 +652085796 +2095702003 +1070325426 +3177450701 +1675163216 +3961064576 +867323300 +964846962 +3640555714 +2435866226 +2224166973 +3157046437 +1860715482 +1084673262 +513928188 +1628946194 +1639418906 +1361515015 +1707595699 +4111414837 +3245171145 +398697984 +3552448193 +3805212457 +3766098910 +3562995718 +2052586555 +2736045931 +1899279703 +256781064 +2571498409 +3788935821 +291104604 +3501535729 +1282204239 +2786648543 +1591363902 +2054851109 +1225208270 +64322622 +3385496348 +2713204383 +3973125151 +3265065103 +2927563386 +2151249113 +3551843327 +2602369751 +1501901458 +4242118371 +3074953127 +2260826051 +1181846513 +379241666 +4166797758 +335652366 +968913393 +1682244203 +1519114563 +1987756924 +2519314281 +2905047615 +2087731956 +280188162 +976200974 +285462068 +3646902719 +1285901047 +4137532814 +259820314 +3814563570 +2323805903 +918724936 +3669218778 +2541753327 +3135267967 +3700417953 +4165405866 +2776042875 +4266473289 +1775686499 +1916292204 +648082802 +2749757176 +1384247571 +2408718312 +120762291 +1135401223 +679240626 +769282458 +1317687283 +2534739800 +4109263400 +1836942853 +1837345315 +2859737649 +3194492564 +1045607375 +4284447056 +2044678207 +3470350651 +3417526780 +573146228 +1710406261 +140267710 +2336234501 +336735832 +594164495 +3193357901 +2178529627 +1758992365 +1970960405 +1941065214 +2045803675 +1083241138 +748611472 +2203087457 +4191290377 +3026418349 +2130987606 +3922580875 +2603952471 +1780362360 +1472679344 +3916536894 +3608641354 +1881791958 +2782449254 +273962152 +1495743607 +266608341 +2584265200 +1874261641 +1068057507 +3569755980 +62313745 +3263196741 +4075675648 +2066592699 +2977966880 +3998351919 +2593895501 +3262194748 +3002214416 +1289464888 +2218004334 +459117904 +1017611603 +1005058549 +4013159341 +4225373720 +3082828959 +1624959749 +3585236652 +3397363797 +381488177 +3232045919 +1526446029 +4079237691 +3516192482 +3547354839 +2817444603 +4115884495 +2107056134 +3841355001 +3701162414 +1000945062 +2196287883 +2250301160 +4215229388 +129488673 +3629796477 +3147459015 +2004878390 +1331120222 +1201152502 +3202889035 +3229620373 +1652751528 +2181496080 +2637242160 +1603908015 +2207081805 +3459146937 +4011489465 +419159345 +822220767 +3182279108 +4006388778 +2046509800 +2341493666 +3137765322 +457527970 +1172394240 +347049519 +2613940392 +3416254082 +1366580684 +3341929703 +1182862905 +2322773627 +4254231430 +2203670751 +3168261932 +286661558 +644018723 +2437072891 +1304942880 +396583662 +928340756 +2366462099 +869518651 +74331576 +897036260 +3966158426 +1831611353 +1440311688 +967278109 +540317911 +1910688032 +629162735 +1211560736 +436505636 +2204853886 +688806406 +1322527623 +4278353913 +3326234105 +2295277955 +366453660 +1806345517 +2620773772 +2096787997 +731912519 +3896396173 +2918900026 +316650653 +2240679163 +2637493370 +582920146 +1366290332 +260466506 +3209573792 +3793256905 +760953596 +4126730898 +2082686180 +1786673210 +3343771989 +1277923184 +2482293656 +1175949015 +2504689513 +1623070797 +972095724 +2769789299 +2897387443 +3086085699 +2448341546 +1865983804 +4130774026 +4251724231 +3452121580 +541075067 +2856005274 +325955731 +1692180733 +2248740341 +4289247372 +1889959598 +373580340 +83480710 +3990944965 +169316846 +131721704 +2874429029 +234858936 +3351100968 +2484066310 +2916501390 +4250796864 +3329013023 +3757372052 +1440902898 +3547483127 +3895471120 +458147223 +3670169833 +3737568089 +3203036166 +850232151 +2765292335 +3498327330 +2626729463 +4040941121 +620052852 +1687919236 +2284264771 +3050244572 +869472472 +1422873700 +254291530 +3241543269 +913745668 +1562445102 +2053294431 +3747619459 +4189682883 +427827324 +1076699537 +569499515 +2382053072 +1228962995 +3951745825 +160373154 +3455048142 +1123306623 +2716774632 +3720948038 +136748593 +837114854 +4214906756 +2358831789 +1274774430 +1072394140 +1260465204 +3342812494 +1145238786 +823506448 +637387210 +3067387441 +1732546697 +2499887792 +3297156320 +2184388361 +2213014534 +4125284552 +597999708 +2137912594 +1046091527 +1667374357 +216796427 +1984345147 +3022281075 +1964388040 +4041595006 +1130782404 +2227789478 +228019405 +3126470816 +1777949109 +4146709274 +397716758 +2895191372 +2214231390 +3206302597 +2776266686 +3789997439 +1698186039 +843697756 +2118345838 +1347038692 +965438044 +408857113 +846963723 +772446502 +1246349240 +2544737151 +2729543545 +4025803824 +1675747680 +3942484224 +4232118771 +4016160750 +1639317357 +394149763 +2359732336 +577511350 +3515811266 +266496029 +1985655967 +2152546948 +84045952 +1271044441 +1776653181 +1062303570 +140647935 +3668765751 +740597904 +4162437287 +1811629412 +949813939 +393460510 +3461819538 +4275529613 +3241351706 +141269760 +3238294823 +2188697557 +2748775126 +1160611814 +1082457555 +1983749663 +2266992083 +1083638046 +1654229212 +1391881692 +2310067459 +1196799226 +1420072290 +4233482406 +1310123329 +3832564744 +2806139907 +190727507 +2539533779 +346806482 +1879946309 +1971620548 +1648732682 +3540016164 +483181326 +1562916858 +1077933099 +1669295564 +739389016 +1178526973 +725132844 +1265903931 +1228668286 +2434896623 +261297278 +1577117439 +121352157 +1270041270 +3476984470 +1845965884 +873938926 +1710511468 +4062490117 +3350680836 +1481925908 +680663189 +3074979075 +940102827 +2938284034 +3648188757 +1907774369 +2065994979 +3939720992 +2096485749 +2297632025 +1720165379 +505870863 +881056282 +334291212 +33575756 +2956735691 +4179947884 +2533474551 +3623795156 +302056322 +1507977437 +3802525595 +2011117542 +4260257033 +452495919 +1117008353 +2282619172 +2786629591 +181653520 +2746405134 +1229804230 +1026273695 +3771817659 +3501926537 +3955159719 +1862694057 +2543109553 +2667215730 +895002010 +3185560490 +3647844390 +1052289949 +3364303518 +4144002999 +597890251 +929892173 +177859178 +777117654 +1837622391 +3140400676 +2633606223 +3570540420 +2760574715 +4162391045 +3827687577 +838336989 +1928821676 +3096758844 +4248382611 +3326307448 +353538429 +1960167450 +3758944103 +4048381009 +238476414 +3243005293 +2822005022 +2187260281 +2522392534 +2135177136 +2600130462 +36096571 +3586388761 +3972530794 +3745372152 +4223559752 +1481387095 +3785755012 +1859588133 +2659729574 +2614489129 +1971362799 +1126025703 +4083042994 +954360390 +588428559 +372546839 +668525135 +2082786649 +2463896458 +638039720 +3392829748 +1660162547 +3565872651 +2576988874 +2076886516 +3345712149 +3785609298 +593238396 +1648224241 +2476816772 +3822466386 +1129053756 +1544357178 +392372577 +1234113788 +1603550777 +461510728 +480299405 +1072741836 +3670839652 +3249894946 +1745637149 +988295883 +2678153064 +1323196058 +1577703598 +2244096478 +2804394777 +1068742595 +2851184752 +1666606757 +2852217254 +4092517152 +3320098911 +307834532 +2137976190 +620391778 +3727645946 +4065152538 +2650980805 +178268634 +2134037110 +4149225382 +3909459582 +3438560515 +1373079255 +2390366917 +267213357 +984880322 +3493175703 +2345438858 +2676241793 +1548978828 +363284352 +1965538726 +2227333318 +425961889 +512919631 +2840310866 +352001328 +171974576 +828542465 +517582141 +2152859063 +1847242844 +1424358372 +2733599367 +4174970819 +2758906536 +3127480646 +2809913043 +1186756248 +1959586977 +2795353298 +1850263433 +732725897 +3212918238 +2602794980 +1896706156 +1921276549 +1983844103 +3039293755 +161841747 +3440962848 +3122765127 +734623228 +1206564994 +634548003 +1500982331 +31447827 +464451422 +3449304600 +4048254802 +47441173 +2830141053 +3959510923 +2840691066 +22187923 +1879115670 +2670133193 +1871353593 +3223523039 +4088180178 +2392802190 +3988705879 +155072511 +4120241765 +3288065755 +839896905 +2329809154 +3519319605 +2538640902 +1241701722 +387093825 +336875369 +2739479346 +2102708534 +659060533 +1389841946 +1525483892 +1991786777 +1053530306 +1332820776 +3764588937 +3555203242 +3848835073 +428662474 +2159575279 +2006926094 +1046771655 +1895228841 +2408812765 +3299443420 +3266862197 +761726271 +336729162 +953955632 +3828936034 +2846744739 +801406604 +1384696354 +4203892306 +1921063915 +776711828 +2253923976 +1220115894 +1309325954 +4152916517 +1785934671 +1713299066 +115649379 +382030817 +3021618481 +284508009 +1398560684 +3676950394 +1854822496 +2948727251 +1506028143 +1256732211 +3651836235 +2516686832 +3486865899 +1094777160 +2411978369 +3496965354 +2974385745 +3250159917 +71957190 +3444444202 +1651433557 +2283664573 +2752903034 +2929182674 +3335795166 +403061083 +3458576257 +3623386907 +2546240750 +1920877983 +4279466824 +1623498258 +3710575723 +4239197272 +1275448236 +1815379606 +242182130 +1203776531 +3787878131 +2473691665 +3219097415 +2852962191 +1460511946 +2418940007 +654357916 +1137386072 +2187812777 +2574355319 +831308390 +2432479605 +2709416752 +215813794 +4281053214 +2778828128 +3428889064 +4031572665 +4131605855 +3352899672 +215475806 +3307888853 +1632767652 +1719184508 +3144872456 +694044327 +4273065162 +2736396538 +342721701 +2736474633 +4236945716 +2151121170 +2659330004 +1156625086 +1424040970 +609194264 +2119171468 +3804914689 +1477699614 +1660897535 +3649881135 +3156282377 +4109064263 +3049551543 +2635098243 +2841505727 +1294388972 +3979989837 +1292481983 +229936355 +1595101375 +3113606313 +844162486 +2988975505 +3194593701 +333947602 +3574633752 +3579255136 +131439844 +235819864 +4219309216 +3663990643 +615773639 +2516732478 +72373041 +264970086 +1473247344 +1645365034 +988941563 +3645652849 +2991964569 +3407067908 +576372189 +464182519 +3373489749 +3853946108 +646382222 +1379194845 +459837598 +2122532892 +2880265964 +3934183475 +3260507771 +2471327827 +3316464216 +2489023636 +909266836 +1369714096 +3490747383 +3959947570 +1964436764 +2378136006 +2002553918 +4056982845 +2661828461 +764496014 +2453317017 +3466891649 +2019449629 +1015717252 +1597295610 +2618163647 +1601276335 +1889042771 +3275283035 +694319320 +3040898449 +3235310315 +2650624643 +3119880349 +1733779501 +1171391941 +821287985 +2674285814 +1670403780 +3970057397 +3024254450 +2631005942 +3600336315 +3544377093 +1592310789 +4294420676 +1996031148 +18631946 +3294139213 +410419358 +2614738325 +591149548 +2546041917 +3893795553 +751479267 +757794581 +123451017 +1223166133 +1370050777 +3947450985 +621239504 +1540926470 +2381201541 +1693006159 +3891953593 +1328356723 +575235293 +2013452436 +3242859744 +1574367500 +399027438 +3618485351 +1309698935 +800021350 +960348813 +3356649756 +633676420 +2667409381 +1497404830 +1004433875 +4129199653 +2622583822 +2294416208 +1005697488 +3899656602 +2144981070 +948209359 +343697051 +513550848 +3904477761 +4012954809 +3173834195 +465325109 +2978403056 +583217760 +4231822986 +2701562555 +2667420251 +1184712981 +572296933 +182942132 +2786538867 +1223212691 +2760794889 +851563555 +2240465202 +3035583033 +1272032188 +2845871536 +1026397824 +189877904 +2419145822 +2798413687 +2877219122 +1110728141 +196684 +1933423403 +166891889 +3725419151 +2853019578 +2332232477 +2637328939 +1082900817 +1610757710 +2893754548 +2512092819 +2769767007 +871600562 +1091920758 +2362661338 +2218490481 +3584545157 +1413766617 +3446524738 +1997645679 +1535169553 +102069353 +1089046965 +1628115006 +3707071215 +3829947542 +2702702609 +1458932145 +2750848480 +459561242 +3087201231 +1611471496 +2912621232 +433863986 +675027795 +3111398575 +491728924 +1312097572 +3427788181 +3655423692 +785422050 +963671867 +3095884880 +2308440376 +2869773262 +378356791 +2770424043 +4069773111 +1517622728 +2904856699 +427513147 +2809218764 +1167056205 +2766426283 +380088539 +4099324829 +2767069903 +3673766394 +3816456147 +3695971352 +218963847 +2449523776 +1923231729 +1251060863 +2200741550 +643051296 +2519220454 +319236759 +1580833523 +1737196235 +3910988663 +1249504881 +2863402006 +819033608 +1058157775 +2157971464 +1518564103 +904066243 +2762656081 +3398975294 +2711887438 +4002814696 +1699285239 +128848931 +1305723024 +1796423995 +392170091 +2360824075 +36449157 +2177695896 +1974637024 +1998059266 +476178147 +1660182241 +1220489455 +2475036296 +1710767826 +1865315507 +1859952682 +2936233862 +1470863535 +477332653 +2656840168 +3015628205 +1616848824 +3812476717 +1143901272 +1347650641 +1285911130 +2257125038 +4017992630 +2733318126 +2250124352 +1012073225 +3556248563 +3799333398 +1081474291 +2554332569 +2055375111 +2974680267 +2682795258 +744453425 +231481925 +2442095540 +1099034061 +781806065 +49047325 +711905096 +3054527858 +557800484 +2562022676 +3251662125 +3336320032 +2221161626 +1298910980 +3668992322 +321675912 +748032424 +2891258992 +391992789 +1389168357 +1739214362 +459419496 +3639200661 +1732953069 +876914495 +2440782364 +756114409 +557799621 +1411671445 +447790123 +1966479863 +3667588260 +3716594684 +4141731860 +2193299740 +1602463619 +3028363621 +285179643 +1240872569 +461997090 +3360353040 +1349178752 +440561904 +3902688686 +1299545870 +832666804 +154698162 +1561921247 +1160079095 +2749514803 +2983889046 +2845744836 +1655407258 +1005696963 +1899808477 +1715837006 +1865562401 +3724916714 +1317895556 +4139456886 +975293848 +2705313024 +3959698516 +1269173818 +2602663088 +1863868295 +3389454144 +2981226436 +4199660507 +3741336863 +4046467935 +998837050 +1730225229 +3069654762 +3165149539 +2112978785 +2503119184 +2428140284 +182208202 +1016903190 +3576217787 +2007125911 +2961557793 +852271552 +452968493 +515423071 +1687592390 +1483595520 +2925998341 +1493716323 +286265442 +2470381769 +2609176750 +3078623045 +657507255 +4097715870 +4210770984 +2320800203 +1900930525 +1426307357 +743532714 +2977787630 +2724023766 +3485031765 +1806623997 +277708228 +179569704 +3497489813 +4099061302 +1476733276 +3372498051 +2391992002 +2497636584 +2829031262 +4283912347 +1137116873 +874841505 +612223941 +915225645 +1927027595 +3668750297 +3277429777 +41572078 +1149896172 +3925988791 +992097300 +3403238346 +1423836509 +4049774243 +1318291246 +1518241992 +4104894369 +1140628975 +1767443316 +179949066 +2261683644 +2935442127 +830641857 +4212805569 +4026005383 +1456276230 +1843667449 +2000917977 +4153003812 +2528684661 +69435810 +1349278108 +367274102 +2192128459 +1336996793 +463505102 +2893411780 +3493633733 +1474366411 +3161822587 +41871998 +1138153582 +2793614770 +1421885113 +566848038 +1158952809 +467420036 +1391213535 +2599532496 +447810156 +3597338706 +3514822890 +2309984660 +517694367 +4072776802 +3674497208 +1807105732 +350340541 +1573291291 +598696226 +1403096253 +1677383233 +1147814376 +1369051262 +1260174990 +3493441354 +3106046432 +3356007350 +2497268544 +3702514981 +2330071268 +2221908886 +3632056976 +2103563218 +70753255 +3490195431 +1740395120 +3730814942 +3614693040 +3954934761 +1823585623 +534530284 +644912344 +947211113 +1243002307 +2050847942 +1789482219 +2470705164 +2028118896 +3502617682 +936059029 +2198823232 +3611405669 +706417818 +1273531781 +648234696 +136620577 +2177176128 +2783862586 +1012908017 +1910502064 +3164983519 +532822229 +709423775 +4176677440 +2999834008 +3287109330 +1014168351 +2799220746 +2840152596 +1652910449 +3957030899 +1064671281 +87216439 +3917811800 +3061101842 +752500283 +326580866 +2042940817 +2697949797 +2712525593 +3435599011 +3101490412 +642698214 +1871527221 +1266929039 +3368859798 +2957873600 +1610376024 +173640245 +898114815 +2929430121 +1064829412 +3350014791 +711495375 +858808433 +724591266 +3930159138 +1916715452 +3302246195 +517316653 +2791031237 +1553794982 +2134593724 +3345362912 +2987216235 +3110983445 +4124862528 +2108942811 +2113997396 +365303813 +3179988367 +2068786288 +419020755 +4232016494 +4272683098 +2972469603 +984689449 +1800023969 +3195886103 +1883817176 +1177997342 +89497099 +3338180098 +399978387 +1786916042 +1817143281 +3272528294 +2279203897 +414884993 +1751993706 +742043644 +255417484 +3826234878 +626368200 +1563437813 +428611840 +4275101212 +142593445 +1475342431 +3775408867 +1965394321 +44488477 +2274206925 +3440410714 +498747230 +4163555716 +2504221865 +576483589 +3947380149 +939245955 +1640970819 +1443121292 +2617916636 +1562263261 +2717528450 +2500730660 +189829817 +984352464 +1961071255 +838900979 +2663694459 +2679010290 +546318426 +502482898 +3057545998 +2551255311 +117738809 +1766099164 +1708343083 +2991661740 +4215304885 +1096512556 +1014747394 +2236440061 +2004368666 +351266173 +1186443552 +1206816974 +2594021620 +2792699120 +3282129274 +1491045585 +3448472593 +3904977558 +2548200827 +2769530210 +3176289174 +1200614814 +2896306108 +1935090937 +1181956876 +2832100896 +2529835215 +1666275138 +3916994466 +998056788 +1569005715 +4093154519 +4262866682 +2685844224 +2039744777 +317656239 +23635496 +521989195 +3868830140 +1216283851 +3761578600 +3127872598 +2547468528 +108481240 +3195324298 +1187106754 +3273844045 +2062952919 +2922203657 +2512368247 +1935840022 +1577058646 +3159346255 +817223604 +2948232082 +3752252437 +169510430 +2146352242 +4173290217 +3547978877 +3346640747 +3335419486 +2540929601 +3107779519 +3831888665 +3096066858 +1243676725 +1885440018 +3157514562 +2412223362 +2797738078 +1444192266 +1548742665 +1475447138 +2552697058 +3806379223 +2480465595 +2624631352 +2824579072 +417368802 +630231552 +2250005182 +2822271013 +2374758608 +2740813009 +4049411132 +2191623148 +3082940863 +1016233841 +2014568449 +1429333224 +3976777294 +4160953191 +3261188618 +2739295960 +77304324 +1592418296 +648474623 +2845350688 +3694160969 +2406253797 +2940120264 +3684539407 +815869273 +1590291475 +372869309 +2461078823 +453748093 +3950025395 +405526666 +1573550292 +3250683511 +2687227069 +2631449907 +2239561126 +3699058829 +2206797640 +514529622 +718096438 +4270521216 +1938748397 +1394305689 +624332850 +3996992685 +4168809140 +3998557738 +976668486 +3264171239 +277871735 +1599981264 +3497768521 +3602533923 +456988544 +363265418 +768876728 +1927245978 +63016585 +2104925071 +63231954 +966408198 +1363328320 +2855282938 +4213553057 +1399371818 +858982906 +3308168545 +1181479873 +1790979912 +9952288 +2977695574 +2117908928 +82697936 +3073918473 +2979787818 +3584289545 +2968671219 +3595989940 +1112262853 +638773180 +3988637905 +2791885072 +4099018993 +292509580 +1864319611 +3343800725 +2272557518 +687983558 +2281459281 +2965619136 +4171864154 +3000485968 +461805910 +537495899 +472784663 +646378825 +4088165977 +3479535959 +917963863 +2428941973 +1958764201 +3045156291 +2233801881 +3855505675 +2826487791 +3740735680 +785924809 +1987484896 +2078936472 +2256374739 +1327038955 +1013253884 +969218582 +3595002268 +902572152 +1657629493 +1038919879 +2727983764 +3379377804 +1779141384 +3492544402 +3770803297 +3757079277 +2746144673 +1664064122 +948462453 +2647013363 +2740659282 +1970761406 +3140288333 +1790430496 +3491031507 +503700894 +2476958682 +204353858 +4277473096 +908698352 +2691244418 +3472550748 +1609448545 +1459428139 +3750081373 +3740807105 +791104748 +4087912515 +294158392 +4152884451 +3107900614 +3745086503 +3082933352 +1063247437 +173838778 +4080046799 +1732731011 +80120608 +1150165458 +3645295592 +503763697 +1227478041 +1465959674 +1889837976 +4172762198 +3412575905 +3453616454 +2405774360 +1502718655 +3044803045 +2336859252 +2321974182 +3128636769 +1924094794 +1924026053 +1372681863 +947389367 +2553232638 +642912823 +3384054934 +3471225387 +2633428360 +2310564238 +3709554363 +2512143751 +884836654 +3730914839 +1440641846 +495859363 +2028572570 +3543939625 +1966842237 +1037726542 +3828427270 +242522406 +2726715302 +3652108153 +1946921427 +1808379592 +2638282033 +1561867132 +2786591960 +1666015051 +3927553647 +1857525078 +1328976671 +3815688857 +3248013878 +1413607248 +3435594563 +1046540133 +1284529831 +977450130 +568639648 +1848594947 +2708751716 +4292304578 +3829497817 +111954890 +200919717 +562191629 +1835515764 +827363727 +563305021 +2214315880 +2196109666 +1611428212 +1226243346 +2857797393 +3536022920 +3988969785 +475887735 +2059967747 +2653441948 +3211147223 +2800929125 +3701455618 +3002163553 +4077280187 +4105787564 +3522671601 +1031478185 +2915919222 +3868971010 +459102514 +1359298065 +2985704683 +3049077248 +2236210877 +4164333285 +254912302 +2251393583 +367410615 +436512978 +3143653190 +438650594 +2759779852 +1853842494 +2599142548 +1739781219 +1462941622 +1428729429 +2359643381 +2062717380 +506201045 +3316400801 +2491060184 +1125963013 +4008147411 +454740262 +2899483734 +3063768707 +2317091592 +3538284137 +1527277385 +1468489988 +2171710946 +3711497278 +1227636501 +1341007697 +3436511688 +1271420555 +110413289 +3833803143 +3152018392 +1058165820 +172298632 +4290541278 +3280871914 +1567754769 +2884916629 +1640981303 +4154831071 +3453909683 +1643209626 +2512128536 +2395365654 +2711505716 +350318653 +1995827271 +253288679 +1950547122 +121329069 +1628990537 +1827650016 +1895850563 +3295015445 +1918830443 +1285751343 +3593460238 +1042546282 +1626130572 +1030312476 +3524656758 +1436578987 +2710706244 +3191785377 +2123967731 +498336047 +3543733358 +1580193987 +1719407233 +702067871 +127572679 +1697819348 +3011688781 +1827666794 +1877124517 +3521429057 +1921413709 +3438106487 +157774410 +3908868482 +2827581239 +3479869402 +4038860167 +1653059929 +2625192523 +2805835987 +3836367982 +1703314052 +1241640539 +3676280870 +477026631 +3512635055 +3783920068 +186316848 +1474893043 +9639138 +1493897874 +4029918129 +2854967539 +4255883790 +629610776 +160890661 +31136773 +4209539381 +2860051483 +2443932599 +758166120 +2151014095 +2187861249 +877033329 +2774398491 +3527603126 +647515886 +2335146023 +670254665 +3533031183 +118518981 +211455576 +2684236937 +3623288443 +3242189560 +657737362 +2760081509 +795711016 +4045787378 +22721158 +2805231281 +2077344448 +143141771 +2458239256 +188338053 +1051143594 +3792484298 +3077236233 +2889031726 +3539855952 +2367869319 +539804457 +3067341490 +2162163001 +1429158556 +4146889901 +2072033278 +2722141736 +1219331270 +3864977547 +1988663955 +216513897 +537372552 +2888178290 +3892854692 +2394707918 +73168456 +1037053390 +2113113511 +2736926780 +1854732860 +3288951000 +781205584 +148625777 +2167091171 +1336336096 +1823179593 +1354511947 +874605856 +296825270 +2127689678 +845636297 +3709487042 +2158762349 +1141892436 +4058043871 +714829652 +1750878781 +2330299972 +4252582863 +653238139 +2422700351 +3526909478 +3784560226 +1004701238 +3999407749 +2633895509 +309581630 +465441891 +927240865 +1385823038 +3116537748 +1529493097 +3872116303 +3232046307 +1013512544 +3060295739 +1753366682 +796466994 +1664860768 +1357765923 +96045458 +1531537106 +2322365341 +1933493896 +414835406 +1210205649 +537172242 +931851747 +616782222 +516331241 +1012569285 +1823281471 +2396307933 +1020198167 +1682962882 +3508260251 +2288190394 +1082248452 +594761392 +4088822248 +2881568149 +153163435 +433996639 +1003734899 +2678366529 +276964931 +3239301896 +3602688878 +210763555 +4114156521 +2935774080 +1027772626 +2398524558 +1818242005 +2792852401 +1284541068 +2564119158 +4123077280 +1484365920 +2555222260 +2913105614 +1079169046 +1774880534 +788254756 +2915733793 +1993038751 +544697832 +1278235039 +37722610 +4023567429 +2601229565 +1172192962 +1537505814 +2589996301 +531444421 +3185544243 +401315277 +4072359596 +2726366626 +1727795309 +3634777561 +3290517248 +3935512009 +4031482011 +3347754557 +3641999466 +3972692612 +857119232 +4026888343 +714844359 +367596127 +3588026486 +3233780460 +1662645188 +1740453829 +2343805122 +364093557 +491409659 +528942590 +4026239253 +3852334845 +1842475611 +1961921173 +1167521621 +1544219386 +2019190850 +2981672044 +565134750 +4221738741 +4043455778 +2088922406 +3943353476 +4130024801 +648731938 +3881254648 +3333239143 +877624333 +3145106145 +1308249775 +1895091086 +1495523004 +337315113 +2701414575 +2429263200 +1004803070 +3518103173 +2831376240 +3786975516 +2667949906 +873932682 +3253335612 +3876092498 +375318028 +1719291519 +2143169154 +572261464 +2499449231 +3031169166 +1327603506 +2917510217 +1120945145 +1354494072 +363154694 +2608351526 +926254564 +3296212136 +2970008792 +416691410 +4246919207 +397185453 +2391412465 +2205304967 +921342779 +3125862620 +466290190 +3288251362 +943201100 +2579083796 +3225735447 +1701657929 +335646159 +1240952538 +3410008866 +3933554981 +1378164567 +2055860402 +2104968062 +625583034 +2912534199 +395713245 +1440958670 +2929263626 +2772408339 +1062297001 +3947469679 +1827688339 +2998098960 +3474717338 +3309872438 +1416882752 +60813770 +3970036385 +3416061703 +766763108 +3180067705 +4250634038 +3111952367 +3247927454 +582952232 +2472878601 +936991574 +2716007723 +2623608477 +2634419457 +1129139338 +1985974403 +717999322 +1106319946 +1390679928 +3672329570 +2148383262 +3445866674 +4106667313 +998108521 +1336193095 +1525142215 +2829742950 +4190138105 +1452647123 +902980588 +3816656609 +219754962 +2653823226 +487716202 +472449694 +491525436 +3049657386 +4190257471 +3750810315 +1075537240 +1499586492 +566137172 +274777397 +1689713812 +435950630 +3798729452 +672195204 +1805486011 +2218827045 +1164773797 +1568660257 +743372613 +3515468557 +598629169 +1475461845 +494158549 +4010408211 +469990939 +671464457 +357335066 +1364865200 +1852739113 +1109685761 +880513638 +3986845734 +2990783194 +1242583354 +641189669 +2248899470 +1033537315 +3203216872 +1875330246 +2256949331 +2223212544 +3681030640 +1227359113 +1404250798 +3960620711 +525796886 +3378340351 +2956954346 +2760390975 +1833811200 +1654800032 +2708754625 +349637141 +2032793963 +315130649 +3715430284 +2248866129 +2862271043 +2471737830 +1894870145 +1977450241 +991966158 +1148355472 +110638331 +3644699312 +332962483 +2767514500 +2106805816 +1083927125 +203594798 +197318997 +963380277 +4185342550 +1669482731 +1105054259 +3257931357 +1479111044 +948370569 +228443986 +3119010726 +4257799681 +920358075 +3752279581 +1917127281 +3270954036 +2848068905 +3450867837 +1303313239 +2089900612 +2646508228 +2864787132 +2594548916 +3095266805 +2458667673 +3463983645 +3375179053 +3907119090 +2356927627 +1907399088 +3738895611 +907258841 +1641978057 +3064130077 +2648606676 +407704009 +2695709754 +3709634761 +2007749723 +1114620365 +741906399 +2469723339 +1742705472 +1788990747 +3306288643 +2619786045 +4203275255 +601920798 +2637934088 +4042713259 +3585224826 +2621384525 +1822687661 +2159407388 +889302426 +1441510000 +1298489969 +664329857 +1871349791 +1888608042 +793412444 +1835482947 +4055631953 +3903243498 +193645406 +2950551920 +701193453 +3877359379 +3197120259 +209991703 +3890932735 +3438000905 +1308191459 +3619540468 +2356525390 +1208039345 +2664130256 +2330139327 +3833976179 +3130421938 +3273246370 +2256091566 +3403386429 +532044154 +1294459018 +893678480 +3051981405 +3421017350 +2487987673 +1667123925 +218579325 +2426589446 +1982245784 +3110474687 +269009137 +2039107284 +1280596473 +549933724 +2899806667 +1623973434 +1640469902 +559566689 +2952529770 +976555304 +4104229491 +2581877519 +2875247302 +2426651909 +3275201537 +1529999588 +2423175954 +1230373900 +276778343 +1148354738 +857508284 +3473389755 +1993284544 +907058553 +2909322811 +208691703 +599749737 +552396891 +1604783062 +3017579122 +2392489408 +31461904 +27807980 +3486398897 +2667394267 +1544411615 +3658084606 +3529989844 +4272285751 +189191113 +2936791350 +3165340405 +2187860616 +625454873 +3075582495 +2314998587 +878003900 +3819782524 +4053692520 +1200968311 +1979941917 +84422463 +809238780 +2065014332 +2360978266 +4213675286 +2368274780 +3148307188 +2816020448 +2768980224 +2994021283 +1702497457 +2602585952 +502503261 +2738769041 +729590068 +4103290326 +3129727179 +1118739011 +175028913 +3467428204 +102608557 +3926592357 +233484133 +2029260452 +2064220980 +1972901374 +3407131391 +488540820 +1174609418 +3171458451 +639162559 +832449777 +3865874325 +3946037072 +957272122 +675900480 +885535937 +446098052 +4227349623 +2409664402 +2057699317 +582531129 +2094790402 +3606721896 +2563398574 +2970130063 +786995530 +2158175123 +22863483 +2127187441 +3914280713 +187461810 +338506327 +637187434 +2596057900 +192242906 +2841427152 +1614561807 +4092067892 +2299511636 +346936576 +2633527478 +1629318303 +2730816333 +42706952 +53648146 +3679499887 +1838874463 +2896816885 +2444829595 +2613437537 +3165885625 +3580542990 +1282193503 +3407510707 +379517752 +2179549787 +3536929992 +4108420485 +3961590162 +461057755 +1810686263 +4105677893 +2592850351 +3523623411 +2858489195 +1669568496 +2521829275 +1050865853 +168691876 +1308900931 +1144865842 +2870838646 +1052922347 +1107887608 +4123012752 +3815578526 +244155629 +375952683 +1529612913 +145903942 +2238024302 +1958119076 +3094072276 +1649568554 +3942347306 +1086095447 +4024767408 +2873526558 +3799752805 +823655220 +354697641 +3786715808 +530351069 +1837362049 +3240979167 +1436497197 +2337638153 +2691551732 +2339741436 +2506795383 +1049004829 +2960816824 +4044870380 +181425907 +1638829027 +1704608490 +3994236297 +777972676 +1800681243 +1807882043 +513924527 +3408526397 +1187980819 +4171657867 +3200723026 +2284178388 +1826143665 +3972239607 +3186789004 +901391703 +637790900 +1291468291 +1581301446 +2113478568 +626975043 +792719510 +1635499387 +273174554 +260177908 +2898005622 +1118083369 +2129170451 +3242986418 +1878225331 +3017401705 +1656649526 +312930095 +2344928157 +3991798791 +989209589 +4250363562 +816236765 +1627977865 +745841916 +4243751559 +3763530133 +936182221 +2164950744 +2650299166 +1729188915 +861756600 +452013555 +1713107881 +2637795695 +440355462 +2049023424 +2589475688 +2867382271 +3462570495 +1603388558 +1173862468 +156545566 +2083285178 +3917992869 +1693826137 +100101070 +991836432 +1905891767 +2605409657 +1285564325 +1540145504 +2359394433 +2252548570 +4088468394 +2048683694 +3142100771 +1079599872 +293421446 +1436042900 +2908892678 +511819856 +3733265427 +3171772465 +2253765025 +1553729422 +108378565 +2838831876 +2696844242 +3505098048 +1766790909 +1087599426 +3561338020 +3345581575 +4088750777 +2712050579 +1707007351 +1189273847 +2377510162 +2054030092 +883465205 +4172000957 +4046581337 +1078599719 +1162268096 +857129488 +3146204386 +235801304 +3846475176 +2059482904 +1257504634 +1978132624 +536370050 +2929083322 +4294729301 +3623431583 +2426489071 +4132380496 +2473966199 +1631287112 +2229145532 +1088496656 +1767193136 +2800884805 +2805047542 +3743501042 +2336822125 +1615475722 +1507812708 +2861643668 +2039476413 +2156828960 +2558414104 +3150507886 +1837506429 +472686661 +2078762469 +242416161 +2857824819 +3533849195 +3436582554 +1516936783 +3115291583 +994250636 +1044576464 +2465610668 +1401081592 +1160955351 +3111537387 +2704285958 +709012 +1991577452 +195250786 +3678154969 +3155120448 +2843603140 +589309650 +109981009 +2791024746 +3960759929 +3737163702 +3031704516 +2354608168 +1407711956 +3269219134 +645540877 +2745259926 +4109086411 +1541842087 +3259418488 +3403516671 +2997902936 +2643088655 +111474575 +1293554210 +2409636471 +3213889320 +1379405981 +4049751152 +1020849274 +3600235462 +407522209 +2375585100 +796087124 +2327207781 +1199404926 +3057490830 +3044891121 +2765779480 +2739871118 +2716960935 +3193825217 +1664479999 +1639878783 +3421758574 +1863424409 +2428594981 +1421730926 +1902303941 +631410217 +3971147937 +1564407291 +1605172270 +1330392264 +2499449885 +502628327 +2234525742 +3783379254 +1609804389 +2896148341 +3147364257 +368108959 +26722575 +1774985495 +831275676 +2552700897 +3528533257 +460397815 +4150112387 +2570503116 +1753205331 +546211059 +485299014 +3608726072 +1037569642 +1370913265 +830614895 +762958599 +1247056948 +527271953 +1918537676 +974345927 +2087723958 +1948213887 +1966565699 +1083174517 +543570688 +3631912443 +1549841820 +3841971589 +457014935 +287816739 +580325671 +3434889461 +2881964626 +329262166 +1450084997 +1802163898 +1558366248 +1289644725 +1114603319 +2076095423 +522024405 +4188088059 +1274419424 +3423592474 +2465975972 +3772009281 +2742418257 +3702476689 +1734414447 +3802175852 +3567871759 +430630147 +2407142191 +3467715557 +1360704679 +955208170 +1365427829 +3602269064 +3055695962 +665080048 +3981051497 +4056478989 +1400780321 +2120221840 +1112625724 +3725781805 +4049611520 +3697475952 +1912588356 +140045535 +2034878505 +3356601198 +3006943304 +2614749229 +4184320029 +2695508921 +1234892190 +2136955088 +3288979242 +812930464 +3192068314 +490200017 +3848439145 +3855376629 +344898982 +3425665444 +3587105883 +3170832711 +3980454264 +2595053813 +635106999 +430716352 +453606438 +3056416645 +2508039012 +2116748265 +725538189 +119312423 +786947679 +1107174960 +2498610304 +3811605200 +2848683065 +859584423 +2286742697 +920842739 +2927695023 +3240860682 +3988327699 +616703336 +3737658339 +3543217135 +1269430695 +906741922 +1268326088 +2382446159 +2304265302 +24250506 +1070133516 +2646910000 +4042862389 +178188290 +2305378272 +3845299736 +2633894203 +3251062752 +119968394 +254299016 +10100816 +4265208826 +3175682452 +376626895 +245036439 +1092872025 +2310790917 +1910465102 +2540531343 +489134299 +2315550139 +200316420 +3007265965 +811700220 +932908240 +3583901710 +4248102817 +3453332964 +3981704423 +683058298 +117601873 +613453132 +1535755108 +4148295106 +895537581 +3247152126 +2779846209 +2637518466 +935113161 +3472879976 +3676354683 +1290334829 +3805107066 +2204975850 +993977782 +908056721 +2212991352 +3748179331 +572118808 +2173385405 +3322370722 +3530821679 +3810365891 +693814130 +1027559085 +495669366 +3235948416 +3819897208 +4263014353 +2631337613 +1077302804 +2709781321 +4062962008 +71363998 +558351324 +2853672000 +1715179116 +2474556114 +1734643119 +326438570 +513128655 +3658107712 +1947508607 +177937120 +3049878063 +4169969512 +2943443389 +1921297307 +3180236464 +1519845970 +781375225 +3961289122 +3462241872 +3198532593 +874825126 +3366395050 +1500837883 +3004453246 +348687054 +1551052367 +461185061 +1006001081 +2031457316 +910641949 +595587406 +3002192170 +1588736243 +1848043433 +4083007202 +1846348162 +2686545938 +3821449843 +334780985 +1208390865 +244813644 +3760330285 +3450548348 +1890142153 +1546613638 +352862440 +418436215 +2924444639 +1252099792 +1049790208 +2143771351 +2250807464 +905860539 +1387073409 +1395533638 +1890376836 +868591490 +2233824007 +926220677 +1655655747 +3677650647 +2721162051 +3591557301 +3731478914 +3134578418 +1587481474 +1567326961 +313587006 +4034317697 +994705160 +3438061744 +3139267937 +3591193622 +1579779961 +1039656678 +768753368 +1845740515 +2459926231 +1859626044 +4028644776 +1473114037 +3050798273 +2267872173 +1063605642 +3237018564 +979232420 +3645293219 +2933507375 +504676187 +2714990434 +1975699405 +2150743268 +3482888698 +1075944421 +3744925351 +2792754959 +2836909639 +1217772294 +263186949 +3630745851 +796634324 +2178486424 +895962186 +1030317729 +2531847716 +3725006080 +3086073702 +1715983790 +4071633445 +1831162935 +2324615519 +4116884974 +11086812 +810963506 +1113732206 +1249214351 +2055403946 +3350941441 +969016727 +1845773417 +337586456 +2957149184 +1495934058 +4060512512 +3846158337 +4291438267 +1961307094 +4041359607 +4181067148 +2100189451 +109313776 +48905154 +2192366214 +3456643498 +788297132 +491337227 +930386724 +2339916930 +3716844385 +4224231760 +4236535765 +216267215 +2321429809 +1908843364 +525306394 +189204709 +1141386852 +2514906000 +1514525159 +2166987341 +2062800216 +4040706685 +3567123536 +2168033630 +903091195 +959738155 +755927574 +2909750826 +887728301 +1513092207 +591403935 +8806202 +2637888632 +625424572 +844686298 +563717788 +2423574317 +2127567808 +2434876690 +3175959018 +3813992248 +2071586922 +2671489775 +3602043441 +276173589 +767883057 +3809329017 +2952154501 +2709154023 +420933336 +3025935637 +2706751676 +923670346 +3911029241 +436654366 +3437094734 +3004785877 +3930663493 +2846922269 +3317102215 +889674196 +937755382 +1649691453 +3598600207 +1066279074 +4098933756 +4192789984 +1338792879 +2749176256 +846856261 +2146343439 +2851837681 +767464130 +199707439 +1146717613 +1431102592 +2953685783 +3214148807 +3515379768 +3341434194 +2008329012 +1005655680 +4146052486 +2271310300 +2602333105 +2129873169 +4150866428 +2737854176 +4107383589 +909098174 +2282630823 +3379299292 +3177925867 +2807672153 +3108049745 +640582529 +608718715 +1565491949 +3256856901 +1958209850 +2739457564 +3967018634 +769855457 +3230728145 +848204430 +375953777 +3822985801 +3539052508 +2163998314 +792861706 +1579622607 +4156474522 +523342740 +1972573428 +2485236827 +2945308728 +1774829899 +3177041192 +1229003712 +141639569 +2341250486 +1156857034 +500805990 +1921040027 +3754738485 +2347102774 +3839824835 +3865450402 +2867893261 +3351635128 +975084841 +2017727255 +1500457228 +3557437019 +1935346986 +750337094 +1779823067 +843692156 +779483541 +835711429 +3842530311 +2050451765 +1698752606 +977851545 +3754057407 +3883910640 +2222985554 +1445016893 +2233330414 +2233094068 +2643337899 +1046586994 +3920471381 +3642606591 +561208034 +942368688 +1771869222 +2838368529 +3783252698 +828618122 +1648090218 +624958942 +2338871664 +1023585984 +1211143672 +2133630636 +4085399789 +1730340223 +551588852 +3819922330 +4286411510 +1613497207 +918955445 +806296635 +2075359249 +3270008253 +2620124805 +3002905047 +1470494380 +3864066357 +396760747 +120818777 +2200361344 +3238774970 +259578041 +1843035906 +3277399140 +1560426896 +3567162196 +882019477 +2603025849 +2626260383 +1212979400 +2524769443 +2953363200 +3198120553 +1311937922 +1690463208 +2153887353 +2561833041 +2629375308 +792880650 +1576690203 +1946281136 +3637373382 +3774235544 +4188448495 +3331319021 +2711111469 +3792232548 +676657137 +3666844049 +2821679692 +519521290 +1785318129 +3440715488 +3933604687 +940805686 +3494161737 +3730506087 +485528519 +2719795371 +3582257070 +2824959901 +3467765748 +223406677 +3096252824 +2176249847 +3118427064 +2428593832 +1656790615 +1380808858 +2951209336 +763364743 +1424793027 +3616052600 +3569737515 +3489167627 +645162457 +2586186530 +3225622130 +2094255190 +104110478 +3999557162 +1702722784 +466189402 +3954345890 +2234817226 +2044385707 +1181494863 +2314074392 +3756844610 +2662892898 +2470271428 +2645587886 +1898655541 +347190958 +1746349722 +4131792858 +3249726498 +2616625905 +438982537 +2382665112 +1136579816 +524214146 +3665475037 +3137172245 +1293964314 +2717781984 +2386179077 +1223350053 +146273001 +1614023089 +1481071503 +1724197938 +3452187805 +414537671 +3936128058 +3401747344 +3792304698 +2479328864 +2863443972 +3000220191 +983117034 +3133075284 +768498027 +1232524489 +3992722732 +4271734892 +1466559007 +415247056 +3224904626 +399958803 +1221328233 +2430425081 +2097280487 +325149996 +1402605581 +4065085460 +1126738687 +557613851 +182046814 +1764661010 +3988668242 +221803839 +1773966121 +1539203152 +562122772 +4142410177 +997974507 +3813166431 +1213632754 +3530788849 +3437351765 +3649674365 +2586279250 +1613883629 +3642833769 +2860438255 +2013796889 +1011861755 +425080275 +159030800 +1965719193 +1563992950 +4049736201 +2923209230 +618420243 +4083419058 +4067991252 +4155296416 +498523229 +2915485921 +3752451992 +2960916607 +1846483445 +1774570846 +1690113563 +218371647 +787549555 +1330407473 +1889476041 +2474390125 +2866896909 +3829346059 +2541648185 +2559766705 +3165243056 +1161554381 +190705178 +1679051243 +3501292922 +480598530 +502189995 +938730122 +53234998 +1115609437 +3350561392 +3440204968 +1820548185 +2074446656 +3528821729 +4256883280 +95209052 +4051063159 +14290475 +252355716 +3838404182 +1604540708 +397990049 +1906499159 +1240242479 +1934309384 +3187722300 +3851865253 +2118271237 +735124666 +4060860878 +1315916131 +2714182573 +3315989508 +1530091927 +3290803045 +3030038947 +2500816966 +2079910693 +1671576297 +67423968 +953700703 +1767995735 +2899488729 +2729083410 +4243905646 +1333191711 +1923200653 +2594120414 +1031651738 +1943602511 +898927058 +143769277 +2272062548 +3787329623 +1622947328 +2356474911 +1879596021 +4292633597 +1212501414 +683918951 +1649705769 +3248094365 +1593951097 +1343761867 +2443311129 +2662183836 +318176405 +2136863855 +679517934 +4124273329 +1593032172 +4042182818 +1625586075 +1637867167 +2298296721 +1339379040 +157487347 +1264997333 +2499748511 +1641754337 +3338574560 +2871508522 +973944131 +3717771750 +3370628125 +562533421 +1326918111 +1621179529 +1995043899 +880119640 +8563416 +4284957881 +1729423588 +1428271389 +3301860114 +1332344593 +2976488115 +2044851047 +3829408657 +475612108 +3041153068 +1078060594 +979844044 +4070030184 +2647682067 +3543014095 +2405880075 +1172671922 +1251148243 +766248357 +4194947350 +238863195 +4099336060 +176570527 +3535762554 +3168912063 +3743689975 +3906616201 +273441452 +2237175329 +3572274834 +1304993883 +1798472521 +2077913329 +1730563174 +2140651603 +631636277 +3826932966 +3409258614 +2359888984 +2110587973 +3853091412 +3928939022 +111458051 +4134894595 +3797727058 +1067116248 +1526855863 +4107549618 +2097962615 +3716733810 +3579358025 +3789802492 +197511769 +1277070218 +2349745898 +1318686433 +4027894761 +3243632374 +3443933962 +4117796954 +3104589392 +1275144945 +2223997736 +3319686217 +987155727 +3582200766 +2160127194 +557880563 +2647610064 +2798073115 +2470081242 +2714759264 +1206561810 +752009344 +3674295465 +1208355805 +2845722718 +1310703030 +3283600367 +4249755835 +1797297054 +3387061681 +745057021 +1406100931 +890568071 +1891355762 +1432146571 +1635789927 +3850574367 +3486475903 +2613406607 +1416735081 +2697791464 +3809183825 +3480993777 +1747671688 +3495465608 +3992674552 +3485917099 +3442797199 +1947557498 +3165686391 +736097282 +2159049088 +1805813734 +1464352376 +665699272 +926710034 +1206525340 +794151434 +3931075016 +3288152840 +930242666 +3178565711 +311814613 +3643428862 +2712706819 +2540597662 +3268925057 +3246620755 +1949611918 +2259802311 +3234028531 +2977285717 +1709361828 +4135007517 +547527667 +903779240 +3802696003 +4092820943 +2621584307 +3935350806 +2658899294 +2299538054 +1633079011 +2371081628 +653633827 +3393575755 +2717509486 +4065065352 +2866884212 +1591333461 +455318247 +2026418677 +2311082969 +313471817 +1336125232 +541163701 +1596785498 +1897312442 +4143086072 +3257545848 +617749547 +2974213707 +1342418059 +137682380 +1781916709 +94210263 +3664954340 +454606978 +1801974409 +1629703545 +399017597 +687640171 +1906586472 +2705504290 +348891842 +1396746752 +2343468957 +3891865205 +3321823588 +1059056333 +2315008013 +1398714405 +2542076989 +3314584205 +1111612212 +182467996 +4073472720 +756258846 +1115875438 +668857120 +901434810 +3885363762 +352684963 +1908462730 +664445567 +1354683322 +2784234899 +3797679761 +611240307 +3648438506 +2029543750 +1031590466 +3411224024 +3890369609 +1315624228 +695550944 +1089590729 +1382410679 +1428024192 +4084379982 +1701556848 +2846568508 +4257677335 +1983258360 +2536053981 +341846500 +3571277794 +3086982966 +3272199897 +3915261157 +4268342516 +1458788784 +2359988032 +2312669770 +4135541708 +2587736877 +275405229 +654747965 +110323543 +276193726 +676699517 +3751904724 +4115979293 +3321954496 +1080682791 +3740169791 +3127556181 +2324080902 +2044998939 +3466800431 +3929079985 +798587060 +3955834923 +1365937653 +2551751690 +1042797294 +4147067480 +3167389902 +4109791310 +106798732 +890016489 +2152124879 +2094509793 +2620912689 +4002388274 +442555092 +2446800406 +2482722976 +1046077290 +1595713763 +1208763757 +1728050165 +1119251693 +2971252883 +4014614260 +2379532965 +3294389406 +4205388643 +1801395351 +3648956387 +2586177872 +1267756043 +256799117 +3704773713 +1595826951 +537561550 +4279507445 +4130409830 +1921548343 +3646750498 +69644337 +1613593789 +500875671 +1265593675 +3885103058 +2615153061 +1695720878 +1969651657 +2744477416 +1606682266 +1222783690 +4293484464 +3309904799 +61143904 +2971379136 +925965496 +1927033054 +52757719 +862070559 +1442095134 +3248058249 +2380210557 +3483847515 +2768270566 +1663836104 +1947338403 +1906207899 +1784999571 +1767761040 +180410022 +3919718954 +1257118834 +1175152428 +53806292 +959968286 +698945163 +1189144090 +2460755474 +1562851608 +3751097620 +964420749 +2876126504 +1758871500 +706964685 +3649560167 +3605906082 +791598367 +414521442 +1878476659 +4293414623 +1017514700 +440382863 +2844526903 +2536371749 +1434626380 +1113457621 +1847424353 +3873992931 +1419614844 +480689200 +86010143 +2768117285 +409336340 +3934621298 +3657393980 +4128817252 +3032510455 +2255018395 +3514386173 +2240916594 +3978361357 +3524748013 +283257253 +2650924859 +3737765641 +2644342907 +2756887204 +2304026336 +705384571 +3611441093 +1777420837 +856568326 +1136260889 +522878353 +145938142 +1794358072 +3913058008 +1630501322 +3405526390 +3707987459 +252467559 +562398169 +3237979095 +790248507 +2810614245 +3069442770 +2823575260 +3644518416 +97054198 +1053608263 +1913832857 +2134146647 +2988628018 +4124773964 +1149745119 +383753236 +2213201466 +4018963928 +3029830271 +24499104 +3785476248 +3025493484 +4211508112 +1240964139 +516265402 +3636405404 +765025284 +2768329496 +1465281206 +4078848796 +2742644222 +273951747 +2189578831 +956923249 +1847415321 +3185208026 +2052181134 +2193378759 +2518122140 +2630759062 +3036167871 +551295217 +1977286279 +1287660033 +2716418558 +676130936 +2239902017 +3754385262 +3520999429 +2229332418 +412432752 +138570556 +215934258 +1452640050 +1129842285 +304570391 +67518245 +256252813 +687691786 +3616034401 +2711022148 +92031655 +2819154139 +1766893017 +858335971 +4185869499 +2450747845 +1262978068 +2797840193 +3324314403 +2901429021 +1009780939 +3254699043 +3615795752 +1035627924 +1795583585 +1866683438 +1263858495 +3004782253 +581166754 +3337262896 +2587935832 +1641351407 +622585811 +4090078240 +1106192728 +3487950614 +3592590663 +455546700 +2488163087 +3189114306 +737348617 +3670307983 +3834641277 +671131599 +2042827269 +761247961 +352936071 +2018719670 +3763251171 +884243260 +3591507103 +3317995483 +3603651887 +1503517737 +1780827984 +2334649477 +2749958564 +157333828 +2411874921 +1687320919 +3647292008 +3488990070 +2185300412 +373070768 +1744101622 +4044310582 +295610132 +2591164670 +4136702027 +2930647742 +3484051464 +654450303 +1507826732 +3174543320 +2851256675 +402607786 +536058247 +1913369098 +3438864894 +230904312 +3899950625 +4027008020 +739699322 +4165391103 +2170398149 +4280928468 +3913972324 +2773319838 +4065465281 +1534813042 +915942278 +499413663 +581468687 +2759396556 +974578797 +2625508614 +4230773681 +2013226130 +3658619637 +1243714710 +3826790181 +3035967786 +1706709300 +943212190 +3935818023 +2612443675 +265710305 +1354648248 +4154057208 +3135801871 +4222984436 +923497144 +932362160 +2872810956 +1095884591 +1876581615 +2099342201 +2310567989 +430765417 +2747676953 +2761172604 +4190173749 +3145021958 +387584024 +4008987205 +285814033 +3167155774 +2697748515 +329128280 +973135483 +1016770103 +1579230085 +1517192241 +2878140062 +2440879867 +1905760691 +2603573351 +3513767036 +3495902061 +739514505 +1327896473 +292674778 +2610628739 +2507187001 +268280250 +2503188256 +3001296354 +2684360402 +49450418 +2766009828 +2705502014 +2129565939 +2427388237 +995329402 +3284458206 +116265134 +2126215829 +2763555798 +173643499 +3298912332 +1033098231 +3618017831 +120791007 +3582848073 +1190291046 +2229846801 +2989666765 +1196062293 +1039968568 +3058006234 +3549768761 +76530251 +2861763437 +1093432954 +4017942627 +1194258840 +4161698525 +1698592439 +2285254049 +548682686 +2523864329 +1564482779 +1195165994 +3147696606 +2276754687 +1071325640 +764459723 +2713469632 +3907171988 +1482719430 +141661389 +781101426 +2254374762 +1145964191 +1092511701 +2030068808 +2678852172 +3524413033 +1113670269 +542805823 +3551296580 +859999683 +3485961921 +2335126596 +1398964427 +949409161 +1554129398 +2239228299 +397615380 +2706717275 +1055677130 +1477876861 +982081990 +4282193345 +1351399359 +1352217616 +3187418638 +158695579 +2975149658 +318409042 +2232504964 +1785162698 +935835101 +490738036 +50022709 +1518457941 +412907642 +114134372 +96710498 +3673531209 +2993392552 +2505483888 +113294851 +2778313265 +2426744393 +223106872 +397765664 +2336671001 +3362947161 +2913067915 +2352854588 +3208562679 +321473296 +3401215098 +983109 +975425677 +1690688456 +4275161488 +1509696701 +1281256796 +3279836684 +493891325 +1958788890 +3446359963 +119309654 +3885395111 +1348582996 +1817296100 +3462272140 +2802963639 +619185276 +2425535784 +1409731870 +1619696449 +1311847145 +940075881 +4185548734 +211755517 +3642911901 +688030112 +1885853211 +461119859 +3075479355 +2627355984 +94340058 +642680673 +1370001836 +2773681491 +2135158789 +911421700 +1323947506 +537950348 +331780052 +1861780332 +1299481648 +3095997466 +950853091 +1090811995 +53996866 +1706022802 +2439456208 +4209833004 +1285536836 +2796242544 +3173541677 +1463932527 +2437078946 +1970010156 +3914003930 +408488323 +4183075399 +3988592298 +2469477213 +1754836254 +1506295075 +2013400588 +2619859878 +3750895564 +1351467627 +188798882 +2016779410 +2038717583 +4119332801 +3519521207 +1840968846 +1047237809 +890537883 +2402553796 +3454610071 +2219188168 +580114076 +1382224931 +2264134668 +3442813448 +2966647838 +1403880951 +2622313912 +1210527504 +3739075758 +1549414306 +1967270508 +2715207952 +3498912171 +1775556312 +1935959361 +1534570128 +1704667537 +957564349 +1566496565 +1917029497 +43982735 +2254666116 +1314530765 +3695957858 +4141837442 +3566999467 +2284462278 +2653865008 +1300297251 +845026991 +2590708030 +2817302398 +2985977927 +3096548078 +3857898460 +437230919 +3328407458 +2851136635 +3518237210 +3313316040 +1720131892 +610380400 +3547660935 +1728600739 +2194869199 +3638186258 +3020299534 +477811034 +1820418202 +1764432617 +497198552 +1433732245 +531570253 +3822805777 +2340676841 +4142518189 +4110711907 +1833793551 +960725744 +3058264344 +2990571925 +3646795275 +625124405 +3459529473 +2886816294 +2456105749 +3848194798 +3496623479 +729200986 +3299888089 +2060901032 +271228381 +3772319363 +2590586133 +3804969278 +1034785294 +3048013097 +3240832871 +44850990 +2077752758 +1991944758 +3931215414 +1089989416 +4084595418 +3082295357 +3102576169 +2390990962 +624635048 +2681453444 +600922880 +3645273385 +2728012176 +2815745664 +2627891749 +1396093296 +4287204244 +1691958452 +1331250173 +735965168 +3121901178 +3934429187 +3780647786 +2435273304 +4184368715 +1196413650 +1579169630 +3605141720 +3260068208 +84284961 +2936868042 +3419076002 +2438533227 +1606912762 +2023326315 +2159493456 +2557595309 +3887521973 +3770319352 +482594308 +1445542209 +552636567 +1957889812 +4099041298 +1834226616 +337716071 +24306034 +4018114971 +1146278923 +3620679184 +2676742593 +2050556771 +4146728774 +281382355 +790096056 +3244248400 +201753479 +1746800856 +1514015578 +3299509437 +3530166461 +3800430040 +1202197725 +2415326343 +1660501592 +1167007994 +1353369291 +1387121167 +1761429320 +1236356071 +193131312 +3402204892 +910760257 +3219022796 +4188670373 +1478637148 +75465564 +1199447080 +470192903 +3354839136 +3178547502 +454529786 +1660627746 +3586231925 +2202806167 +1609138267 +1829564223 +2943834599 +2753984097 +1254005320 +4170826164 +3164351788 +2598680 +262318655 +340285249 +3147002700 +3698181311 +2250467945 +2862355953 +2963228270 +379876551 +3536580887 +4122147345 +1226957844 +3342390291 +965184480 +207012965 +973617301 +948166193 +2667770313 +540109626 +64966370 +2609523889 +3625169505 +1360794644 +3991283513 +2406124136 +2040790397 +2760308091 +894563417 +1668780444 +1861588850 +3819607776 +4104201913 +4006776079 +2638567430 +1340677702 +1583307609 +384561556 +198523880 +3172629985 +130306960 +3632377850 +3938815067 +2667045504 +1537428840 +4244925672 +3116225489 +856400307 +2491612233 +242467916 +2559908813 +3249892117 +3040643046 +40880461 +3620883929 +3325999990 +2986019529 +1980493334 +2535960488 +3123668483 +1452638677 +2641652354 +2747561512 +715106102 +4145652491 +3881207299 +612435175 +2231754746 +3140699948 +2710276286 +702095251 +2016638535 +2871186259 +533076491 +1094957413 +1927067944 +1501574983 +4064333604 +2747138737 +1918561824 +377844369 +1944146529 +51573040 +1710514570 +2101389704 +35014874 +4122353771 +3242854723 +1801484701 +3676269364 +2916635215 +2248867800 +2646635411 +3812730089 +2333685765 +325138324 +742926414 +3412577672 +947018790 +3572490212 +4157495273 +3633421896 +1105082707 +411345158 +700710280 +3701228310 +2495482553 +1191980288 +4243798433 +3874265760 +732986222 +1240300677 +2035674456 +1236462756 +3492342385 +713678480 +1856345419 +288510102 +34444867 +1935623460 +2314016175 +3986052519 +4222898330 +3321507467 +2658318694 +3024170965 +1200235932 +2774363888 +3077141503 +2952418538 +2002020495 +3173696835 +2483056602 +3399812740 +1897677875 +861270578 +3573482983 +1493437830 +365201134 +1348345142 +3263929494 +735470975 +3597712315 +822917411 +1942939695 +3283689326 +348388 +1851912047 +1595879747 +2681532950 +315386741 +2732350333 +205325705 +1299864804 +311372073 +2158212847 +1564262971 +3972608965 +799697814 +3645865195 +104820850 +3875875729 +3580382806 +2091590444 +1460793550 +3928815526 +3406704546 +4154644069 +2305530113 +2140073325 +3008657964 +1889160817 +212254521 +1915119386 +3771578573 +1404089675 +75224001 +3190961490 +3977021113 +2559975201 +2635997043 +1602834359 +3166121066 +3239355242 +4200925530 +4239692016 +1462603557 +2464332240 +1626865342 +3883155117 +4005585391 +2245511893 +1370309138 +1671927928 +3001988595 +1999178395 +405415172 +4020592073 +2685197012 +3865571823 +2642401070 +2878079876 +2650882161 +1611222870 +3678165817 +3311505398 +3165022437 +2787324317 +1125371520 +3916470197 +641850353 +874205963 +898294045 +694443358 +2335822440 +3706343512 +1895081925 +2843497935 +4150783033 +3407728067 +1367065899 +55797987 +2173721476 +3282919604 +412793429 +222365940 +4139698294 +25131186 +1282790403 +658500184 +4182274666 +2067009632 +443684381 +2448411522 +1182762333 +3253891413 +687347699 +4233840776 +2345723506 +3882737996 +1001392189 +1566268184 +4176750435 +962418872 +2443141865 +735717991 +1631920906 +4103394505 +2051040370 +891902183 +3132783068 +534023914 +744753201 +2904838576 +2335196997 +2634589372 +452793627 +3314882928 +1999007289 +1062040911 +1943108158 +821111887 +3874711892 +3910381779 +1970360756 +384926902 +269141906 +3402621484 +2741388557 +698721951 +834770287 +1929291140 +2178763064 +4227778560 +2470696301 +2288130441 +1426002425 +2252960653 +3659721782 +3578584985 +1033889819 +917038861 +3662877258 +2678988937 +2499127705 +3265831657 +3456908192 +243457385 +373210425 +626439885 +1919252617 +3731060507 +560458893 +2478553665 +272947952 +2622612651 +1252080948 +2675630815 +3538036247 +2708380108 +3885022723 +3275337773 +202141144 +3544428308 +3054869000 +415164280 +3810487872 +4294757363 +2918946674 +264977522 +613625556 +782891813 +2262688932 +186667766 +3617280808 +3273293900 +2771452265 +3170797206 +3279197520 +1324980161 +3298186478 +788769614 +3138321079 +3593423476 +3682194876 +2459038401 +770815739 +846520790 +3890661757 +2206860911 +2913691696 +3920814091 +807283002 +2959862876 +944649627 +2726443387 +886117713 +1014240669 +2403148490 +927842931 +3939680977 +715871456 +4056790224 +3855503911 +1335143363 +897887085 +1063898070 +2758538161 +2623627401 +380311070 +1790679406 +3562555101 +464623713 +2653115702 +813962825 +2247779845 +899990744 +509717256 +4269670499 +2895139458 +1562147518 +1880219001 +810388715 +3287356725 +2957473758 +82328998 +4263380215 +2403904510 +1528522831 +2996965259 +3170530431 +1885377943 +3023033193 +3113843845 +1408116682 +2447641652 +3756536810 +3529501515 +4197162664 +2321873906 +304791101 +1295982172 +809675038 +3645134264 +2520546207 +1895007714 +1096315451 +167973852 +3743403099 +2152809404 +4025144774 +913776865 +4242885266 +2904946467 +1737145864 +4245873824 +4100555029 +3016494453 +802506648 +876821704 +1559943174 +2470562801 +1146090019 +2827044301 +1950039035 +960063979 +2399567107 +9385138 +3678640350 +1212148683 +2144266720 +3781244084 +278278670 +321834776 +3754260289 +896593370 +140525080 +1880210741 +4168638242 +908318145 +1380950728 +2078401813 +4124767316 +3686280513 +3686147896 +950103544 +4143847431 +2768943180 +2642145383 +4235421827 +191461455 +3336692058 +1748069617 +3968360977 +2508509850 +3564688329 +2605662346 +1774191844 +1664226440 +1960342760 +1256605388 +1522533312 +1116176967 +1101133113 +1575936467 +191313245 +3441471213 +3995368225 +3216164682 +4183947660 +866445930 +1034421910 +3475020344 +2994036582 +2038752540 +4062058869 +1950500709 +1789063618 +2353685264 +535335489 +995419772 +1021562761 +1355711980 +1604623032 +2271742243 +2931384021 +3745082984 +1532417914 +1211297037 +1018214315 +3727869283 +4086892699 +2857554004 +254063285 +1007397488 +2559631135 +4037785841 +3925712273 +1907094923 +1087977990 +3540095035 +959374538 +1463450657 +3841659518 +3488666191 +1226207515 +2597973135 +664110795 +2574868648 +736450376 +339165910 +1066488857 +3228009012 +1152613483 +300716403 +4082682412 +3351578765 +2067764889 +764274504 +4215944968 +419507292 +755733810 +1267739227 +460352807 +2559511720 +3321666038 +3330382953 +1517247596 +3088211524 +2428079234 +334002478 +978419925 +755020380 +4188691128 +3940699996 +3414909254 +677745754 +2572489431 +304057574 +3955870978 +4138736321 +547202807 +3348008071 +3901242551 +1576327180 +2445024081 +525180300 +3270611131 +1409012873 +1615815881 +3383527568 +2765933819 +473605073 +3426939448 +1211419332 +1301324699 +2376915004 +2929773056 +209136864 +3856012130 +2450961392 +87399316 +3545537811 +3421991372 +1783387580 +2009737503 +3941580719 +741540271 +597643891 +270442411 +193721489 +2502940102 +2635513837 +300920102 +1755447964 +2812409859 +1827340506 +1732046364 +3164331103 +3917017595 +442289904 +4265847184 +3363303773 +3688834237 +343676192 +446576427 +636733962 +2475359167 +1997173436 +917015889 +950893359 +1564803169 +2221955565 +3943671456 +1735062548 +2747152778 +3085332056 +3251644077 +2840842498 +970357091 +1408021008 +2519568809 +3245031600 +3129950639 +1119131142 +3751535521 +978688344 +3445108409 +2204606814 +4181879247 +2364953897 +3882165908 +2072803988 +1637498656 +3287694549 +498217956 +868684082 +3208462471 +587943326 +984123941 +1982427644 +1932816583 +2090310562 +2674196225 +4259690269 +1104692667 +3531745947 +1927350879 +2246329514 +2451321261 +1632224043 +4101213714 +3256561457 +1463834728 +714153887 +3621244098 +990103025 +397992997 +1302037626 +1651169438 +740851807 +2413944828 +2664093505 +3505864590 +3316459618 +995398273 +4009034108 +697013806 +2564137343 +2025703196 +1195439225 +3396626035 +1006508036 +1589112718 +1319727742 +2196072006 +1042278675 +3377803138 +1191644477 +1427857965 +624581339 +4162517720 +1379489751 +3670705390 +466459560 +247114212 +1547746689 +128434362 +2058247720 +1797723579 +830866401 +1906526786 +1532548701 +3435835076 +1890127359 +2668091832 +2615810192 +3466883350 +516194401 +3507456579 +1576602573 +708187120 +4213569705 +4233726262 +3874144522 +2755068526 +2565811822 +3293689197 +733091957 +3639932900 +4088066368 +296200353 +2090266120 +2240284370 +4224417077 +1792804792 +2314609617 +1317471944 +4195185923 +1741163148 +2321725017 +489362029 +747333252 +1429457013 +2863997435 +578440726 +4044132094 +856762955 +2722223651 +3507154563 +2239326939 +1492892868 +2647219828 +1391382241 +2348383682 +741615662 +1040500412 +1163648826 +911295633 +2772922132 +2627600570 +3034572189 +1256137300 +3055412399 +695310340 +1055571529 +2600288139 +4237536614 +1511235650 +1973343279 +2762180562 +1623207660 +2817461409 +1153361884 +1471148290 +174262513 +758747028 +3087997916 +3454513312 +3876866478 +3750564697 +147753392 +4114221999 +1974896810 +804905894 +1911346784 +2837320389 +2260085728 +1773329600 +1534532223 +121188203 +1117136700 +3260307799 +2969761903 +3074471776 +2813875987 +1108028203 +2604509712 +119734535 +2080626772 +4154056254 +2485201636 +3016023117 +4147155728 +3927733139 +1517577163 +3932578722 +2608242369 +191473425 +2039615647 +4165482394 +2094321484 +2233399318 +357954992 +1308020453 +2887461588 +2379601205 +1990775328 +2803190366 +1096079281 +456808553 +1842303540 +1216433873 +4240392048 +726164637 +4033618682 +1657154991 +3010230023 +271053136 +3837096573 +255277705 +2577884490 +3179517171 +2628778574 +2020950579 +3618953390 +1626189045 +3549756629 +278853875 +3437422767 +3635640786 +3602290462 +4200031621 +2117112601 +659190281 +2682702146 +3974175798 +4166223072 +2688932456 +644173202 +2917046033 +1127998902 +3877843307 +2307553859 +662773413 +4240014324 +209825504 +3062984540 +3737101738 +3660959844 +620553797 +2876291638 +3645386833 +3736244021 +3138797514 +3149764063 +2433560641 +306906757 +4254170206 +3773211627 +356419361 +2037478430 +3882386769 +943718445 +3748688162 +2513623369 +1936641148 +3379614344 +4127090714 +575243408 +1054703504 +2077964781 +3884077173 +922366188 +3488645853 +2479392240 +3538010120 +2637270334 +4164633370 +2811262181 +3156726663 +4225532829 +4131020506 +2496794188 +2004420854 +1047074222 +3630668422 +4234517787 +1590844888 +1779640780 +3980268515 +822666154 +2557756905 +17290977 +2581445394 +4217933802 +372760181 +2640294605 +1708510156 +2552160225 +1398685400 +3401022997 +2518465268 +3574050694 +113259732 +2553453723 +238287439 +1218244104 +43759084 +2564628877 +2989602035 +648178461 +797816686 +3735813830 +1523603945 +1490368270 +1823942043 +2236317306 +21722619 +1263111029 +2190890120 +3875188285 +3562642835 +4269423219 +2009891184 +1281708292 +782216052 +493284146 +2458886132 +2818589514 +3635210377 +2931910227 +2822153820 +908331382 +4284465663 +92999672 +2046989356 +2394366699 +96271999 +3920873225 +3480302578 +815347485 +1553725658 +1961476901 +3291575136 +3667015437 +4109116290 +3703628917 +2138703240 +2591828825 +823353204 +2588862341 +3775496805 +1388824571 +52623109 +1879945717 +4004789290 +1195222222 +3042460536 +1464677169 +1867693946 +4222739431 +1282077607 +3334411258 +2332943504 +265680352 +2761127573 +3532576199 +1276224375 +1711958085 +3892043812 +1965994259 +746743471 +2740235382 +204541527 +1928121093 +2079823083 +2264328523 +4150479665 +3121970724 +2305576763 +646019670 +3244891858 +3873486414 +1337734538 +167996473 +1377946594 +4215098840 +3752427150 +3435024840 +629592773 +2387920987 +2192286473 +3851378277 +2054195182 +2101937193 +160500154 +527184210 +2776811557 +3643389694 +1881867209 +455758941 +591593968 +771898881 +4063998928 +1697871828 +1527239498 +433684483 +1907287194 +2985905453 +4208270874 +1915753898 +4255899866 +3640950136 +419788608 +2174491247 +1748808281 +2853003058 +1669787538 +1997085588 +161740547 +816257649 +963874688 +1298336248 +764913504 +1147775622 +2296722402 +1725186048 +660188756 +650819570 +688640691 +3381530934 +1329995197 +1771265376 +2526901817 +2812939023 +2642964663 +2733580318 +3290681829 +650008141 +1302443626 +1162688378 +1572176755 +1058834516 +1362932083 +690998389 +2848517030 +1307350002 +1696690104 +4096988075 +867104308 +1265102008 +3595675752 +1968934909 +132216250 +1365947990 +1529160929 +2032906159 +3853410716 +1749005556 +1529961465 +3892784617 +267318517 +739691320 +4275078469 +2733955770 +3262489581 +1859651871 +2660469019 +742066281 +2626264116 +2459342977 +3984901932 +2499415252 +3459175451 +4078944221 +1748400033 +2630105570 +1034415960 +2657065185 +2701594925 +3625010494 +1637662234 +2359267550 +2768183384 +1760126403 +3191560334 +1512038885 +3655899285 +3945240016 +1358287271 +2340197430 +3394828120 +71008889 +3156219828 +1596791167 +1889114110 +524780498 +3669595342 +1968819489 +2420116555 +2859517038 +563091141 +2280493550 +2977194099 +3063100748 +867687335 +2758319746 +1459463076 +4009706455 +1012475152 +2562540989 +3389350977 +2882161504 +4162085142 +831032247 +3579503541 +1629602056 +1545704138 +1627174203 +2666000147 +1876332636 +1644804847 +2655350157 +1417567614 +1483237937 +852758770 +2265421444 +988520601 +2706945265 +2391353746 +1718691618 +1763158469 +187935935 +84889600 +58475166 +222967100 +3341924719 +3450295676 +2652366462 +3311140489 +4069518363 +3201965074 +587126225 +2712813129 +933770261 +2026335872 +1480454936 +2308123826 +2465192966 +2564973304 +2995118820 +3960159770 +1270003919 +251889800 +3426931721 +784689313 +1462744306 +2762913513 +2305934881 +1579998090 +947256698 +3374565910 +1280757084 +606715276 +1822752234 +3401174815 +1260481625 +3126245007 +677621385 +356951669 +1163837632 +2899634271 +2372459795 +3317787562 +3965114007 +1308481149 +2493689573 +2924102186 +3126342992 +3760318775 +2530597235 +4177601925 +786777801 +129188944 +724540294 +896082016 +405435634 +913107139 +3440492903 +1962357062 +899566460 +400893916 +2596264151 +3675070400 +994654433 +1123756515 +2386161640 +2506845252 +3000100940 +1184830378 +1092781633 +165371336 +418773755 +4275797911 +2773328530 +2094510118 +2662185482 +519612241 +1513872552 +1136764470 +917422290 +3674688424 +927246051 +2711785923 +94806925 +1411585994 +2872234114 +3054647024 +2905688003 +16581949 +2468493961 +3192733326 +2959379296 +4029240874 +2121833940 +3381016122 +903653999 +865491479 +2058555870 +1586445886 +2452086731 +3564666163 +3672746092 +3562748941 +2867638093 +2713204853 +272914271 +3035354475 +3449213903 +2892537905 +2151290230 +1137407689 +648219772 +531037657 +2648455916 +4022976027 +2208589449 +1088698077 +4046049616 +1963767748 +2171691572 +2370328893 +2457830979 +1154906823 +805364313 +1188263669 +1860290697 +2958650021 +1294028101 +1924821788 +3728757694 +2063050046 +899326822 +1825301069 +3086229276 +1802168728 +1218325681 +1478151445 +3377095251 +703684208 +3296867231 +1085317979 +2305823716 +185444826 +2164728262 +2834968537 +3869371344 +3179029697 \ No newline at end of file diff --git a/PHF_benchmark/SPHF-RTLP/main.cpp b/PHF_benchmark/SPHF-RTLP/main.cpp new file mode 100755 index 0000000..08ee5c4 --- /dev/null +++ b/PHF_benchmark/SPHF-RTLP/main.cpp @@ -0,0 +1,263 @@ +#include +#include +#include +#include +#include +#include +// #include +#include +#include +#include + +#include + +#include "IntUtils.h" +#include "FastStrHash.h" +#include "PerfectHash.h" +#include "PerfectHashBuilder.h" +#include "PerfectHashBuilder.h" +//------------------------------------------------------------------------------ +using namespace std; + +vector filePath; + +// struct timeval{ +// long tv_sec; +// long tv_usec; +// }; + +double generate(const char * filename, uint64_t &maxStorageCost) +{ + // define hash array for input hash keys + vector inputKey; + int ind = 0; + // import from input file + // const char * filename = (argv[1]); + ifstream input(filename, ios::in); + string line; + // fprintf(stderr,"results are:\n"); + while (getline(input, line)) { + const char *l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line.\r\n"); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string '%s' is too short or too long \r\n",line.c_str()); + return 0; + } + uint64_t h = FastStrHash(l, len); + // fprintf(stderr,"%lu\n",h); + //key[ind++] = h; // load the string hash value + inputKey.push_back(h); + } + + // fprintf(stderr,"finish loading hash keys \r\n"); + uint64_t key[inputKey.size()]; + for (int i=0;i= bucketEnd) + { + fprintf(stderr,"nslots: %d \r\n", nSlot); + fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*9 + nBucket*2; + if (curCost < minCost) + { + TPerfectHashBuilder myB; + gettimeofday(&gBegin,NULL); + // int nPerSlot = 0; + bool success = myB.Build(hash, nHash, nBucket, nSlot, 0); + if (success) { + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // // fprintf(stderr,"num of hash space per slot, nPerSlot: %d \r\n", nPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %lu \r\n", nHash); + // fprintf(stderr,"num of buckets, nBucket: %lu \r\n", nBucket); + // fprintf(stderr,"num of slots: %lu \r\n", RoundUpPrime(nHash*100/nPerSlot)); + // fprintf(stderr,"Use Time:%f\r\n",timeuse); + // Now, current myB contains the best parameters, output to files + + // ofstream output; + // string outFileName = "function.txt"; + // output.open(outFileName); + // output << nBucket << endl; + // output << nPerSlot << endl; + // // output each d value in d[](dArrayBest) + // for (int slot=0;slot1;nHashPerSlot--) + // { + // int nPerSlot = nHashPerSlot*100; + + // TPerfectHashBuilder myB; + // gettimeofday(&gBegin,NULL); + // bool success = myB.Build(hash, nHash, nBucket, nPerSlot, nSpace); + // if (success) { + // // fprintf(stderr,"success!!! \r\n"); + // // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // // // fprintf(stderr,"num of hash space per slot, nPerSlot: %d \r\n", nPerSlot); + // // fprintf(stderr,"num of hash keys, nHash: %lu \r\n", nHash); + // // fprintf(stderr,"num of buckets, nBucket: %lu \r\n", nBucket); + // // fprintf(stderr,"num of slots: %lu \r\n", RoundUpPrime(nHash*100/nPerSlot)); + // // fprintf(stderr,"Use Time:%f\r\n",timeuse); + // // Now, current myB contains the best parameters, output to files + + // // ofstream output; + // // string outFileName = "function.txt"; + // // output.open(outFileName); + // // output << nBucket << endl; + // // output << nPerSlot << endl; + // // // output each d value in d[](dArrayBest) + // // for (int slot=0;slotd_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + else if (entry->d_type == 8) + { + string filePathName = (path + entry->d_name); + // fprintf(stderr,"%s\n", filePathName); + filePath.push_back(filePathName); + } + else if (entry->d_type == 10) + continue; + else if (entry->d_type == 4) // this is a folder, not a file + { + listdir(path + entry->d_name + "/"); + } + + } + + closedir(dp); + return 0; +} + +//------------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + // make sure two args + if( (argc<2) || (argc>2) ) + { + fprintf(stderr,"Check hash : Generate folderName\r\n"); + return 1; + } + + string path = argv[1]; + listdir(path); + + int fileNum = filePath.size(); + double accTime = 0.0; + double maxTime = 0.0; + + uint64_t maxStorageCost = 0; + //maxStorageCost = 0; + for (int i=0;i maxTime){ + maxTime = curTime; + } + } + fprintf(stderr,"Maximum storage cost is: %d bit\n", maxStorageCost); + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + return 1; +} +//------------------------------------------------------------------------------ \ No newline at end of file diff --git a/PHF_benchmark/SPHF/.vscode/settings.json b/PHF_benchmark/SPHF/.vscode/settings.json new file mode 100755 index 0000000..8f4afb2 --- /dev/null +++ b/PHF_benchmark/SPHF/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "iosfwd": "cpp" + } +} \ No newline at end of file diff --git a/PHF_benchmark/SPHF/Allocator.h b/PHF_benchmark/SPHF/Allocator.h new file mode 100755 index 0000000..26a51e7 --- /dev/null +++ b/PHF_benchmark/SPHF/Allocator.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- +#ifndef AllocatorH +#define AllocatorH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +enum TAllocConsts +{ +#ifdef __BORLANDC__ + acDefAlign = sizeof(int), +#else + acDefAlign = 32, +#endif +}; +//--------------------------------------------------------------------------- +class TAllocator +{ +public: + char *Malloc(size_t size,int align=acDefAlign); + char *Realloc(void *mem,size_t size,int align=acDefAlign,size_t oldSize=0); + void Free(void *mem); +}; +//--------------------------------------------------------------------------- +extern TAllocator defAllocator; +//--------------------------------------------------------------------------- +//#if !defined(WIN32) && !defined(_WIN32) +//#include +//#else +void *vmalloc(size_t sz); +void vfree(void *mem); +//#endif//WIN32 +//--------------------------------------------------------------------------- +void *vmallocReserve(size_t sz); +bool vmallocCommit(void* ptr,size_t sz); +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF/AllocatorBase.cpp b/PHF_benchmark/SPHF/AllocatorBase.cpp new file mode 100755 index 0000000..12bf882 --- /dev/null +++ b/PHF_benchmark/SPHF/AllocatorBase.cpp @@ -0,0 +1,5 @@ +//---- -------------------------------------------------------------------------------------------------------- +#include "Allocator.h" +//---- -------------------------------------------------------------------------------------------------------- +TAllocator defAllocator; +//---- -------------------------------------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF/AllocatorC.cpp b/PHF_benchmark/SPHF/AllocatorC.cpp new file mode 100755 index 0000000..a9743ef --- /dev/null +++ b/PHF_benchmark/SPHF/AllocatorC.cpp @@ -0,0 +1,44 @@ +//--------------------------------------------------------------------------- +#include "Allocator.h" +#include +#include +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +// If there is no suitable allocator, use the default C allocator. +//--------------------------------------------------------------------------- +char *TAllocator::Malloc(size_t size,int align) +{ + logEmbdMsg("Prepare alloc %d-byte memory of align %d.\r\n",(int)size,align); +// #ifndef __LSeRTOS__ +// assert(align<=(int)sizeof(int)); +// #endif // __LSeRTOS__ + return (char*)malloc(size); +} +//--------------------------------------------------------------------------- +char *TAllocator::Realloc(void *mem,size_t size,int align,size_t oldSize) +{ + logEmbdMsg("Realloc %d-byte memory of align %d.\r\n",(int)size,align); +#ifndef __LSeRTOS__ + if(align>(int)sizeof(void *)) + { + char *p = Malloc(size,align); + if(p==NULL) + return NULL; + //This is WRONG. We should query the actual size of mem. But we havn't that interface yet. + if(oldSize==0) + oldSize = size; + memcpy(p,mem,oldSize); + Free(mem); + return p; + } +#endif // __LSeRTOS__ + + return (char*)realloc(mem,size); +} +//--------------------------------------------------------------------------- +void TAllocator::Free(void *mem) +{ + free(mem); +} +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF/Array.h b/PHF_benchmark/SPHF/Array.h new file mode 100755 index 0000000..8e0847a --- /dev/null +++ b/PHF_benchmark/SPHF/Array.h @@ -0,0 +1,319 @@ +#pragma once +#ifndef ArrayH +#define ArrayH +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +// #include "Mem/FastMem.h" +#include +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +#define __is_trivial(x) false +#endif// __BORLANDC__ +//#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#define DefCommArrMath(func,retType) \ + retType func(int64_t num=0) const \ + { \ + if(num<=0) \ + num = Number; \ + \ + return Arr##func(&ObjConst(0),num); \ + } +//--------------------------------------------------------------------------- +// Causion: only one-time allocated array's alignment is preserved! +// Any increasement with New() will break the alignment set by Alloc. +//--------------------------------------------------------------------------- +template +class TArraySafe:public TArrayPubBase +{ +protected: + virtual void CallConstructor(void *obj) const + { + new (obj) T; + } + + virtual void CallDestructor(void *obj) const + { + ((T *)obj)->~T(); + } + + virtual bool IsTrivialElem() const + { + return __is_trivial(T); + } + + virtual int GetTypeSize() const + { + return sizeof(T); + } + +public: + TArraySafe() + { + } + + TArraySafe(int64_t num) + { + Alloc(num); + } + + virtual ~TArraySafe() + { + Close(); + } + + void Transfer(TArraySafe &o) + { + Close(); + img = o.img; + len = o.len; + Number = o.Number; + + o.ClearDataNoFree(); + } + + T &New(int64_t expandUnit=64) + { + return *(T*)TArrayPubBase::New(expandUnit); + } + + T &Obj(int64_t i) + { + assert(img); + assert(i>=0); + assert(i=0); + assert(i &operator=(TArraySafe &o) + { + Alloc(o.Number); + + for(int64_t i=0;i=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=pos;i--) + Obj(i+newNum) = Obj(i); + } + + return &Obj(pos); + } + + T *SlowDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(delNum>=1); + + int tail = Number-delNum; + + if(keepOrder==false) + { + for(int64_t i=0;i +class TArray:public TArraySafe +{ +public: + TArray() + { + } + + TArray(int64_t num) + :TArraySafe(num) + { + } + + void InitZero() + { + memset(this->img,0,sizeof(T)*this->len); + } + + void FastInit(T val) + { + MemSetType(this->img,val,sizeof(T)*this->len); + } + + void FastCopy(TArray &o,int64_t l=-1) + { + if( (l<0) || (l>o.Number) ) + l = o.Number; + + FastCopy(o(),l); + } + + void FastCopy(T *o,int64_t l) + { + this->Alloc(l); + memcpy(this->img,o,sizeof(T)*l); + TArraySafe::Number = l; + } + + T *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastInsert(pos,newNum,keepOrder); + } + + T *FastDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastDel(pos,delNum,keepOrder); + } + + void FastBInsert(T &obj,TSortCmp cmp,bool canRepeat=false) + { + TArrayPubBase::FastBInsert(&obj,cmp,canRepeat); + } +}; +//--------------------------------------------------------------------------- +typedef TArray TGrayArray; +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH + diff --git a/PHF_benchmark/SPHF/ArrayPre.cpp b/PHF_benchmark/SPHF/ArrayPre.cpp new file mode 100755 index 0000000..197aff3 --- /dev/null +++ b/PHF_benchmark/SPHF/ArrayPre.cpp @@ -0,0 +1,173 @@ +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +TArrayPubBase::~TArrayPubBase() +{ +} +//--------------------------------------------------------------------------- +void TArrayPubBase::Alloc(int64_t maxNum,int align, bool noConstructor) +{ + + logEmbdMsg("Prepare to alloc mem for array num=%d align=%d.\r\n",(int)maxNum,align); + Close(); + + logEmbdMsg("Array close ok.\r\n"); + + int typeSize = GetTypeSize(); + + logEmbdMsg("Get type size=%d ok.\r\n",typeSize); + + int64_t memSize = maxNum*typeSize; +#ifndef XrossCPP_In_64 + assert((memSize>>31)==0);//on 32-bit platforms, no memory alloc can larger than 2GB-1 +#endif // XrossCPP_In_64 + + logEmbdMsg("Ready to alloc %d-byte mem, defAllocator=%p.\r\n",(int)memSize,defAllocator); + // fprintf(stderr,"memSize is: %lu\n", memSize); + // fprintf(stderr,"align is: %d\n", align); + + img = defAllocator.Malloc((size_t)memSize,align); + logEmbdMsg("Alloc returned img=%p.\r\n",img); + + assert(img); + + len = maxNum; + + logEmbdMsg("Ready to call constructor.\r\n"); + + if( (noConstructor==false) && !IsTrivialElem() ) + { + logEmbdMsg("Now call constructor.\r\n"); + + for(int64_t i=0;i=0); + + if(newNum==len) + return; + + if(newNum==0) + { + Close(); + return; + } + + int typeSize = GetTypeSize(); + + if(newNumlen) + { + for(int64_t i=len;i=0) + { + if( (ret!=0) || canRepeat ) + memcpy(New(),key,typeSize); + + return; + } + + int64_t low = 0; + int64_t high = Number; + + while(low>1); + + ret = cmp(&key,img+mid*typeSize); + + if(ret==0) + { + if(canRepeat) + memcpy(FastInsert(mid,1,true),key,typeSize); + + return; + } + + if(ret<0) + high = mid; + else + low = mid+1; + } + + if(cmp(&key,img+low*typeSize)>0) + low ++; + + memcpy(FastInsert(low,1,true),key,typeSize); +} +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF/ArrayPre.h b/PHF_benchmark/SPHF/ArrayPre.h new file mode 100755 index 0000000..280f812 --- /dev/null +++ b/PHF_benchmark/SPHF/ArrayPre.h @@ -0,0 +1,289 @@ +#pragma once +#ifndef ArrayPreH +#define ArrayPreH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "SortBase.h" +#include "Allocator.h" +// #include "Mem/FastMem.h" +#include "Type64.h" +//--------------------------------------------------------------------------- +#ifndef NULL +#define NULL 0 +#endif //NULL +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TArrayPubBase +{ +protected: + char *img; + +public: + int64_t len; + int64_t Number; + +protected: + virtual void CallConstructor(void *obj) const = 0; + virtual void CallDestructor(void *obj) const = 0; + virtual bool IsTrivialElem() const = 0; + virtual int GetTypeSize() const = 0; + + void *New(int64_t expandUnit=64) + { + if(Number==len) + ChCapacity(len+expandUnit); + + void *p = img+(size_t)Number*GetTypeSize(); + + Number ++; + + return p; + } + + void *Search(const void *key,TSortCmp cmp,int64_t n=-1) const; + + void *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=0); + assert(pos<=Number); + assert(delNum>=1); + + int typeSize = GetTypeSize(); + int64_t tail = Number-delNum; + char *mPos = img+(size_t)pos*typeSize; + + if(keepOrder==false) + memcpy(mPos,img+(size_t)tail*typeSize,(size_t)delNum*typeSize); + else + memcpy(mPos,mPos+(size_t)delNum*typeSize,(size_t)(tail-pos)*typeSize); + + Number = tail; + + return mPos; + } + + void FastBInsert(void *key,TSortCmp cmp,bool canRepeat=true); + +public: + TArrayPubBase() + { + img = NULL; + len = 0; + Number = 0; + } + + virtual ~TArrayPubBase(); + + void Close(bool noConstructor=false); + + void ClearDataNoFree() + { + img = NULL; + len = 0; + Number = 0; + } + + void Alloc(int64_t maxNum,int align=32, bool noConstructor=false); + void AllocFill(int64_t maxNum,int align=32, bool noConstructor=false) + { + Alloc(maxNum,align,noConstructor); + Number = len; + } + void ChCapacity(int64_t newNum,int align=32); + + int64_t Size() const + { + return Number*GetTypeSize(); + } + + int64_t StorageSize() const + { + return len*GetTypeSize(); + } + + int64_t SpaceSize() const + { + return (len-Number)*GetTypeSize(); + } + + void *ObjAt(int64_t inx) const + { + assert(inx>=0); + assert(inx o.Move(TArray src) + void Move(TArrayPubBase &src) + { + Close(); + + img = src.img; + len = src.len; + Number = src.Number; + + src.img = NULL; + src.len = 0; + src.Number = 0; + } + + void Grow(int64_t nGrow) + { + if((Number+nGrow)>len) + ChCapacity(Number+nGrow); + + Number += nGrow; + } +}; +//--------------------------------------------------------------------------- +template +int64_t ArrLargest(T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i*tmp) + { + tmp = array+i; + index = i; + } + } + + return index; +} +//--------------------------------------------------------------------------- +template +int64_t ArrSmallest(const T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i +void ArrMinMax(const T *array,int64_t num,int64_t &minIndex,int64_t &maxIndex) +{ + T *tMin = array; + T *tMax = array; + + int64_t iMin=0, iMax=0; + + for(int64_t i=1;i*tMax) + { + *tMax = array+i; + iMax = i; + } + } + + minIndex = iMin; + maxIndex = iMax; +} +//--------------------------------------------------------------------------- +template +void ArrTotal(const T *array,int64_t num,T &ret) +{ + ret = array[0]; + + for(int64_t i=1;i +inline void ArrMean(const T *array,int64_t num,T &ret) +{ + T tmp; + + ArrTotal(array,num,tmp); + + ret = tmp/num; +} +//--------------------------------------------------------------------------- +//base e entropy +//--------------------------------------------------------------------------- +template +double ArrEntropyE(const T *array,int64_t num) +{ + T sum; + + ArrTotal(array,num,sum); + + double e = 0; + double m = 1.0/sum; + + for(int64_t i=0;i1e-30) + e -= t*log(t); + } + + return e; +} +//--------------------------------------------------------------------------- +template +inline double ArrEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)*1.4426950408889634073599246810019; //log2(e) +} +//--------------------------------------------------------------------------- +template +inline double ArrNormEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)/log(num); +} +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH diff --git a/PHF_benchmark/SPHF/CMakeLists.txt b/PHF_benchmark/SPHF/CMakeLists.txt new file mode 100755 index 0000000..37c670f --- /dev/null +++ b/PHF_benchmark/SPHF/CMakeLists.txt @@ -0,0 +1,12 @@ +# CMake 最低版本号要求 +cmake_minimum_required (VERSION 2.8) + +# 项目信息 +project (CheckHash) + +set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD_REQUIRED True) + +# 指定生成目标 +add_executable(CheckHash main.cpp IntUtils.cpp PerfectHashBuilder.cpp ArrayPre.cpp AllocatorBase.cpp AllocatorC.cpp City64.cpp) + diff --git a/PHF_benchmark/SPHF/CheckHash b/PHF_benchmark/SPHF/CheckHash new file mode 100755 index 0000000..6ff137b Binary files /dev/null and b/PHF_benchmark/SPHF/CheckHash differ diff --git a/PHF_benchmark/SPHF/City64.cpp b/PHF_benchmark/SPHF/City64.cpp new file mode 100755 index 0000000..3ec6352 --- /dev/null +++ b/PHF_benchmark/SPHF/City64.cpp @@ -0,0 +1,259 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides CityHash64() and related functions. +// +// It's probably possible to create even faster hash functions by +// writing a program that systematically explores some of the space of +// possible hash functions, by using SIMD instructions, or by +// compromising on hash quality. +// +// Comment by LHZ 2017.5.19: +// This hash function has been tested by the following dataset: +// 1. 2G (items) Chinese word groups from 40G Chinese news text +// 2. 4M Chinese words from 40G Chinese news text +// 3. 1M Chinese words dictionary +// No conflict found yet. + +#include "City64.h" +#include "Type64.h" +#include + +#define Fetch64(x) (*(uint64_t*)(x)) +#define Fetch32(x) (*(uint32_t*)(x)) + +enum +{ +// Some primes between 2^63 and 2^64 for various uses. + k0 = 0xc3a5c85c97cb3127ULL, + k1 = 0xb492b66fbe98f273ULL, + k2 = 0x9ae16a3b2f90404fULL, + k3 = 0xc949d7c7509e6557ULL, +// for Hash128to64 + kMul = 0x9ddfea08eb382d69ULL, +}; +// Hash 128 input bits down to 64 bits of output. +// This is intended to be a reasonably good hash function. +inline uint64_t Hash128to64(uint64_t vL, uint64_t vH) { + // Murmur-inspired hashing. + uint64_t a = (vL ^ vH) * kMul; + a ^= (a >> 47); + uint64_t b = (vH ^ a) * kMul; + b ^= (b >> 47); + b *= kMul; + return b; +} + +// Bitwise right rotate. Normally this will compile to a single +// instruction, especially if the shift is a manifest constant. +inline uint64_t Rotate(uint64_t val, int shift) { + // Avoid shifting by 64: doing so yields an undefined result. + return shift == 0 ? val : ((val >> shift) | (val << (64 - shift))); +} + +// Equivalent to Rotate(), but requires the second arg to be non-zero. +// On x86-64, and probably others, it's possible for this to compile +// to a single instruction if both args are already in registers. +inline uint64_t RotateByAtLeast1(uint64_t val, int shift) { + return (val >> shift) | (val << (64 - shift)); +} + +inline uint64_t ShiftMix(uint64_t val) { + return val ^ (val >> 47); +} + +#define HashLen16 Hash128to64 + +inline uint64_t HashLen0to16(const char *s, size_t len) { + if (len > 8) { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + if (len >= 4) { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + if (len > 0) { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + return k2; +} +/* +inline uint64_t HashLen0to16(const char *s, size_t len) { + static uint8_t off[]={ + 3, + 2,2,2, + 1,1,1,1,1, + 0,0,0,0,0,0,0,0}; + + switch(off[len]) + { + case 0: + { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + case 1: + { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + case 2: + { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + case 3: + return k2; + } +} +*/ + +// This probably works well for 16-byte strings as well, but it may be overkill +// in that case. +inline uint64_t HashLen17to32(const char *s, size_t len) { + uint64_t a = Fetch64(s) * k1; + uint64_t b = Fetch64(s + 8); + uint64_t c = Fetch64(s + len - 8) * k2; + uint64_t d = Fetch64(s + len - 16) * k0; + return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d, + a + Rotate(b ^ k3, 20) - c + len); +} + +// Return a 16-byte hash for 48 bytes. Quick and dirty. +// Callers do best to use "random-looking" values for a and b. +inline void WeakHashLen32WithSeeds(TX128Data &out, + uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) { + a += w; + b = Rotate(b + a + z, 21); + uint64_t c = a; + a += x; + a += y; + b += Rotate(a, 44); + out.u64[0] = a+z; + out.u64[1] = b+c; +} + +// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. +inline void WeakHashLen32WithSeeds(TX128Data &out, + const char* s, uint64_t a, uint64_t b) { + WeakHashLen32WithSeeds(out,Fetch64(s), + Fetch64(s + 8), + Fetch64(s + 16), + Fetch64(s + 24), + a, + b); +} + +// Return an 8-byte hash for 33 to 64 bytes. +inline uint64_t HashLen33to64(const char *s, size_t len) { + uint64_t z = Fetch64(s + 24); + uint64_t a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0; + uint64_t b = Rotate(a + z, 52); + uint64_t c = Rotate(a, 37); + a += Fetch64(s + 8); + c += Rotate(a, 7); + a += Fetch64(s + 16); + uint64_t vf = a + z; + uint64_t vs = b + Rotate(a, 31) + c; + a = Fetch64(s + 16) + Fetch64(s + len - 32); + z = Fetch64(s + len - 8); + b = Rotate(a + z, 52); + c = Rotate(a, 37); + a += Fetch64(s + len - 24); + c += Rotate(a, 7); + a += Fetch64(s + len - 16); + uint64_t wf = a + z; + uint64_t ws = b + Rotate(a, 31) + c; + uint64_t r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0); + return ShiftMix(r * k0 + vs) * k2; +} + +uint64_t CityHash64(const char *s, size_t len) { + if (len <= 32) { + if (len <= 16) { + return HashLen0to16(s, len); + } else { + return HashLen17to32(s, len); + } + } else if (len <= 64) { + return HashLen33to64(s, len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + uint64_t x = Fetch64(s + len - 40); + uint64_t y = Fetch64(s + len - 16) + Fetch64(s + len - 56); + uint64_t z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); + TX128Data v,w; + + WeakHashLen32WithSeeds(v, s + len - 64, len, z); + WeakHashLen32WithSeeds(w, s + len - 32, y + k1, x); + x = x * k1 + Fetch64(s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + len = (len - 1) & ~static_cast(63); + do { + x = Rotate(x + y + v.u64[0] + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.u64[1] + Fetch64(s + 48), 42) * k1; + x ^= w.u64[1]; + y += v.u64[0] + Fetch64(s + 40); + z = Rotate(z + w.u64[0], 33) * k1; + WeakHashLen32WithSeeds(v, s, v.u64[1] * k1, x + w.u64[0]); + WeakHashLen32WithSeeds(w, s + 32, z + w.u64[1], y + Fetch64(s + 16)); + uint64_t tmp=z;z=x;x=tmp; + s += 64; + len -= 64; + } while (len != 0); + return HashLen16(HashLen16(v.u64[0], w.u64[0]) + ShiftMix(y) * k1 + z, + HashLen16(v.u64[1], w.u64[1]) + x); +} + + +uint64_t CityHash64WithSeeds(const char *s, size_t len, + uint64_t seed0, uint64_t seed1) { + return HashLen16(CityHash64(s, len) - seed0, seed1); +} + +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed) { + return CityHash64WithSeeds(s, len, k2, seed); +} + +uint64_t FastStrHash(const char *str,int len) +{ + if(len<0) + len = strlen(str); + + return CityHash64(str,len); +} + +uint64_t FastIntHash(uint64_t hash,uint64_t seed) +{ + return HashLen16(hash - k2, seed); +} diff --git a/PHF_benchmark/SPHF/City64.h b/PHF_benchmark/SPHF/City64.h new file mode 100755 index 0000000..a386595 --- /dev/null +++ b/PHF_benchmark/SPHF/City64.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides a few functions for hashing strings. On x86-64 +// hardware in 2011, CityHash64() is faster than other high-quality +// hash functions, such as Murmur. This is largely due to higher +// instruction-level parallelism. CityHash64() and CityHash128() also perform +// well on hash-quality tests. +// +// CityHash128() is optimized for relatively long strings and returns +// a 128-bit hash. For strings more than about 2000 bytes it can be +// faster than CityHash64(). +// +// Functions in the CityHash family are not suitable for cryptography. +// +// WARNING: This code has not been tested on big-endian platforms! +// It is known to work well on little-endian platforms that have a small penalty +// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs. +// +// By the way, for some hash functions, given strings a and b, the hash +// of a+b is easily derived from the hashes of a and b. This property +// doesn't hold for any hash functions in this file. + +#ifndef CITY_HASH_64_H_ +#define CITY_HASH_64_H_ + +#include +#include + +// Hash function for a byte array. +uint64_t CityHash64(const char *buf, size_t len); +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed); +uint64_t CityHash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t seed1); + +#endif // CITY_HASH_H_ diff --git a/PHF_benchmark/SPHF/FastStrHash.h b/PHF_benchmark/SPHF/FastStrHash.h new file mode 100755 index 0000000..8e59f44 --- /dev/null +++ b/PHF_benchmark/SPHF/FastStrHash.h @@ -0,0 +1,17 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef FastStrHashH +#define FastStrHashH +//---- -------------------------------------------------------------------------------------------------------- +#include +//#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +/*--------------------------------------------------------------------------- +A wrapper on Google's City64 hash function. +---------------------------------------------------------------------------*/ +uint64_t FastStrHash(const char *str,int len=-1); +uint64_t FastIntHash(uint64_t hash,uint64_t seed); +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF/IntUtils.cpp b/PHF_benchmark/SPHF/IntUtils.cpp new file mode 100755 index 0000000..9ba1eec --- /dev/null +++ b/PHF_benchmark/SPHF/IntUtils.cpp @@ -0,0 +1,184 @@ +//--------------------------------------------------------------------------- +#include "IntUtils.h" +#include +// #include "Sys/CpuUtils.h" +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2) +{ +#if defined(XrossCPP_In_64) + return ((__int128_t)val1 * val2) >> 64; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + return (m2>>32) + (uint64_t)v1H*v2H + (c>>31); +#endif +} +//--------------------------------------------------------------------------- +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low) +{ +#if defined(XrossCPP_In_64) + __int128_t tmp = (__int128_t)val1 * val2; + high = (uint64_t)(tmp>>64); + low = (uint64_t) tmp; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + high = (m2>>32) + (uint64_t)v1H*v2H + (c>>31); + low = mLL+(m1<<32); +#endif +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val) +{ + val--; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + val |= val >> 32; + return val+1; +} +//--------------------------------------------------------------------------- +// We havn't implement them yet +//--------------------------------------------------------------------------- +/* +#ifndef XrossCPP_In_64 +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +#endif // XrossCPP_In_64 +*/ +// //--------------------------------------------------------------------------- +// static bool RM_witness(uint64_t n, uint64_t a, uint64_t s, unsigned tMinus1) +// { +// uint64_t v = 1; + +// while (s > 0) +// { +// if ( (s&1) == 1 ) +// v = Mul64Mod(n,v,a); + +// a = Mul64Mod(n,a,a); +// s >>= 1; +// } + +// if (1 == v) +// return true; + +// uint64_t nM1 = n-1; + +// for (unsigned i = 0; v != nM1; i++) +// { +// if (i == tMinus1) +// return false; + +// v = Mul64Mod(n,v,v); +// } + +// return true; +// } +//--------------------------------------------------------------------------- +bool RM_PrimeTest(uint64_t p) +{ + uint64_t x = (uint64_t)sqrt(p); + uint64_t i = 3; + if(p==2)return true; + if(p%2 == 0)return false; + while(i>= t; + +// t--; // we use t-1 all the time + +// /* +// * Witness 2 is deterministic for all n < 2047. Witnesses 2, 7, 61 +// * are deterministic for all n < 4,759,123,141. +// */ + +// if (RM_witness(n, 2, s, t)==false) +// return false; + +// if (n < 2027) +// return true; + +// if (RM_witness(n, 7, s, t)==false) +// return false; + +// if(n<4759123141ull) +// return RM_witness(n, 61, s, t); + +// static const uint8_t witness64[] = { 3, 5, 11, 13, 17, 19, 23, 29, 31, 37 }; // 2 & 7 are tested already + +// for (unsigned i = 0; i < (sizeof(witness64)/sizeof(witness64[0])); i++) +// { +// if (!RM_witness(n, witness64[i], s, t)) +// return false; +// } + +// return true; +// } +//--------------------------------------------------------------------------- +uint64_t RoundUpPrime(uint64_t val) +{ + val |= 1; + + while( (RM_PrimeTest(val)==false) && (val>1) ) + val += 2; + + return (val<=1?0:val); +} +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF/IntUtils.h b/PHF_benchmark/SPHF/IntUtils.h new file mode 100755 index 0000000..68ad792 --- /dev/null +++ b/PHF_benchmark/SPHF/IntUtils.h @@ -0,0 +1,62 @@ +//--------------------------------------------------------------------------- +#ifndef IntUtilsH +#define IntUtilsH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "Type64.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2); +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low); +//--------------------------------------------------------------------------- +// Following functions can be optimized by asm +// mul1*mul2 -> 64-bit result%d +inline uint32_t /*__fastcall*/ MulMod(uint32_t m1,uint32_t m2,uint32_t d) +{ + return (uint32_t)(((uint64_t)m1*m2)%d); +} +// p1*p2 -> 64-bit result+c +inline uint64_t /*__fastcall*/ MulAdd(uint32_t m1,uint32_t m2,uint32_t c) +{ + return ((uint64_t)m1*m2)+c; +} +// m1*m2 -> 64-bit result +inline uint64_t /*__fastcall*/ Mul(uint32_t m1,uint32_t m2) +{ + return ((uint64_t)m1*m2); +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val); +uint64_t RoundUpPrime(uint64_t val); +/*--------------------------------------------------------------------------- +Rabin-Miller primality test for up to max uint64_t. +Causion: we think 0, 1, 2 are not prime. +Causion: only work on x64 platform. +---------------------------------------------------------------------------*/ +bool RM_PrimeTest(uint64_t n); +//--------------------------------------------------------------------------- +//High efficient mul and div funcs for x64 platform only +//#ifdef XrossCPP_In_X64 +#ifdef __cplusplus +extern "C" +{ +#endif//__cplusplus +//--------------------------------------------------------------------------- +/* (m1*m2) % modV */ +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2); +/* (m1*m2) / divV */ +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2); +/* (m1*m2) /% divV, return both */ +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2); +//--------------------------------------------------------------------------- +#ifdef __cplusplus +} +#endif//__cplusplus +//#endif //XrossCPP_In_X64 +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF/Makefile b/PHF_benchmark/SPHF/Makefile new file mode 100755 index 0000000..5de593b --- /dev/null +++ b/PHF_benchmark/SPHF/Makefile @@ -0,0 +1,358 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/keran2/Work/timeComparePHF/phf1 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/keran2/Work/timeComparePHF/phf1 + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/timeComparePHF/phf1/CMakeFiles /home/keran2/Work/timeComparePHF/phf1/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/timeComparePHF/phf1/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named CheckHash + +# Build rule for target. +CheckHash: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 CheckHash +.PHONY : CheckHash + +# fast build rule for target. +CheckHash/fast: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/build +.PHONY : CheckHash/fast + +AllocatorBase.o: AllocatorBase.cpp.o + +.PHONY : AllocatorBase.o + +# target to build an object file +AllocatorBase.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorBase.cpp.o +.PHONY : AllocatorBase.cpp.o + +AllocatorBase.i: AllocatorBase.cpp.i + +.PHONY : AllocatorBase.i + +# target to preprocess a source file +AllocatorBase.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorBase.cpp.i +.PHONY : AllocatorBase.cpp.i + +AllocatorBase.s: AllocatorBase.cpp.s + +.PHONY : AllocatorBase.s + +# target to generate assembly for a file +AllocatorBase.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorBase.cpp.s +.PHONY : AllocatorBase.cpp.s + +AllocatorC.o: AllocatorC.cpp.o + +.PHONY : AllocatorC.o + +# target to build an object file +AllocatorC.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorC.cpp.o +.PHONY : AllocatorC.cpp.o + +AllocatorC.i: AllocatorC.cpp.i + +.PHONY : AllocatorC.i + +# target to preprocess a source file +AllocatorC.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorC.cpp.i +.PHONY : AllocatorC.cpp.i + +AllocatorC.s: AllocatorC.cpp.s + +.PHONY : AllocatorC.s + +# target to generate assembly for a file +AllocatorC.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/AllocatorC.cpp.s +.PHONY : AllocatorC.cpp.s + +ArrayPre.o: ArrayPre.cpp.o + +.PHONY : ArrayPre.o + +# target to build an object file +ArrayPre.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/ArrayPre.cpp.o +.PHONY : ArrayPre.cpp.o + +ArrayPre.i: ArrayPre.cpp.i + +.PHONY : ArrayPre.i + +# target to preprocess a source file +ArrayPre.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/ArrayPre.cpp.i +.PHONY : ArrayPre.cpp.i + +ArrayPre.s: ArrayPre.cpp.s + +.PHONY : ArrayPre.s + +# target to generate assembly for a file +ArrayPre.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/ArrayPre.cpp.s +.PHONY : ArrayPre.cpp.s + +City64.o: City64.cpp.o + +.PHONY : City64.o + +# target to build an object file +City64.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/City64.cpp.o +.PHONY : City64.cpp.o + +City64.i: City64.cpp.i + +.PHONY : City64.i + +# target to preprocess a source file +City64.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/City64.cpp.i +.PHONY : City64.cpp.i + +City64.s: City64.cpp.s + +.PHONY : City64.s + +# target to generate assembly for a file +City64.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/City64.cpp.s +.PHONY : City64.cpp.s + +IntUtils.o: IntUtils.cpp.o + +.PHONY : IntUtils.o + +# target to build an object file +IntUtils.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/IntUtils.cpp.o +.PHONY : IntUtils.cpp.o + +IntUtils.i: IntUtils.cpp.i + +.PHONY : IntUtils.i + +# target to preprocess a source file +IntUtils.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/IntUtils.cpp.i +.PHONY : IntUtils.cpp.i + +IntUtils.s: IntUtils.cpp.s + +.PHONY : IntUtils.s + +# target to generate assembly for a file +IntUtils.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/IntUtils.cpp.s +.PHONY : IntUtils.cpp.s + +PerfectHashBuilder.o: PerfectHashBuilder.cpp.o + +.PHONY : PerfectHashBuilder.o + +# target to build an object file +PerfectHashBuilder.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/PerfectHashBuilder.cpp.o +.PHONY : PerfectHashBuilder.cpp.o + +PerfectHashBuilder.i: PerfectHashBuilder.cpp.i + +.PHONY : PerfectHashBuilder.i + +# target to preprocess a source file +PerfectHashBuilder.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/PerfectHashBuilder.cpp.i +.PHONY : PerfectHashBuilder.cpp.i + +PerfectHashBuilder.s: PerfectHashBuilder.cpp.s + +.PHONY : PerfectHashBuilder.s + +# target to generate assembly for a file +PerfectHashBuilder.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/PerfectHashBuilder.cpp.s +.PHONY : PerfectHashBuilder.cpp.s + +main.o: main.cpp.o + +.PHONY : main.o + +# target to build an object file +main.cpp.o: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i + +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s + +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) -f CMakeFiles/CheckHash.dir/build.make CMakeFiles/CheckHash.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... CheckHash" + @echo "... edit_cache" + @echo "... AllocatorBase.o" + @echo "... AllocatorBase.i" + @echo "... AllocatorBase.s" + @echo "... AllocatorC.o" + @echo "... AllocatorC.i" + @echo "... AllocatorC.s" + @echo "... ArrayPre.o" + @echo "... ArrayPre.i" + @echo "... ArrayPre.s" + @echo "... City64.o" + @echo "... City64.i" + @echo "... City64.s" + @echo "... IntUtils.o" + @echo "... IntUtils.i" + @echo "... IntUtils.s" + @echo "... PerfectHashBuilder.o" + @echo "... PerfectHashBuilder.i" + @echo "... PerfectHashBuilder.s" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/PHF_benchmark/SPHF/PerfectHash.h b/PHF_benchmark/SPHF/PerfectHash.h new file mode 100755 index 0000000..e70ff5e --- /dev/null +++ b/PHF_benchmark/SPHF/PerfectHash.h @@ -0,0 +1,37 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectHashH +#define PerfectHashH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "Type64.h" +#include "FastStrHash.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#define PHDataHdr "PerfectHash0.10" +//--------------------------------------------------------------------------- +struct TPerfectHashData +{ + uint64_t r; + uint64_t m; + //In general d uses uint8_t is enough. For very difficult cases may change to uint16_t. + uint8_t d[sizeof(int64_t)/sizeof(uint8_t)]; //Causion: the number is dummy for syntax only, should be computed by builder! + + //The core hash function. For int data with length less than 64-bit, f(x)=x can be used for the first hash + uint64_t Hash(uint64_t val) + { + return FastIntHash(val,d[val%r])%m; + } + + //For variable length strings, it is hashed to 64-bit fixed length int first + uint64_t HashStr(const char *str,int len=-1) + { + return Hash(FastStrHash(str,len)); + } +}; +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF/PerfectHashBuilder.cpp b/PHF_benchmark/SPHF/PerfectHashBuilder.cpp new file mode 100755 index 0000000..5a2026b --- /dev/null +++ b/PHF_benchmark/SPHF/PerfectHashBuilder.cpp @@ -0,0 +1,129 @@ +//--------------------------------------------------------------------------- +#include +#include "PerfectHashBuilder.h" +#include "PerfectHash.h" +#include "IntUtils.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint64_t startPos; + int64_t nItem; +}; +//--------------------------------------------------------------------------- +int CmpSlot(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectHashBuilder::Build(uint64_t *hash,uint64_t nHash,uint64_t nBucket,int nPerSlot,uint64_t nSpace) +{ + if( (nHash==0) || (nPerSlot<=0) || ((uint64_t)nPerSlot>nHash) ) + return false; + int64_t nSlot = RoundUpPrime(nHash*100/nPerSlot); + + if(nSlot==0) + return false; + + if(nBucket==0) + nBucket = RoundUpPrime(nHash); + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + return false; + } + + if(nSpace==0) + nSpace = nBucket; + + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + + for(uint64_t i=0;i sortedHash; + sortedHash.AllocFill(nHash); + + for(uint64_t i=0;ir = nSlot; + // p->m = nBucket; + + TBitArray maskBits; + maskBits.Alloc(nBucket); + + TArray bitStack; + bitStack.AllocFill(slots[0].nItem); + + for(int64_t i=0;id[0])*8))-1; + // fprintf(stderr,"maxD = %ld. \r\n", maxD); + int64_t maxD = 255; + for(int64_t d=0;d=nBucket) || (maskBits[f]) ) + { + while(j>0) + { + j--; + maskBits.ClearBit(bitStack[j]); + } + fail = true; + break; + } + + maskBits.SetBit(f); + bitStack[j] = f; + } + + if(fail==false) + { + // p->d[sortedHash[startPos]%nSlot] = (uint16_t)d; + data[sortedHash[startPos]%nSlot] = (uint16_t)d; + break; + } + } + + if(fail) + return false; // we can't find suitable d in [0,65535] + } + + return true; +} + +//--------------------------------------------------------------------------- diff --git a/PHF_benchmark/SPHF/PerfectHashBuilder.h b/PHF_benchmark/SPHF/PerfectHashBuilder.h new file mode 100755 index 0000000..a7e4019 --- /dev/null +++ b/PHF_benchmark/SPHF/PerfectHashBuilder.h @@ -0,0 +1,108 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectHashBuilderH +#define PerfectHashBuilderH +//--------------------------------------------------------------------------- +#include +#include +#include +// #include "Hash/PerfectHash.h" +#include "Array.h" +// #include "SyncUtils.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TBitArray +{ +public: + uint64_t *arr; + int64_t nBit; + + TBitArray() + { + arr = NULL; + nBit = 0; + } + + ~TBitArray() + { + Close(); + } + + void Close() + { + if(arr) + { + delete arr; + nBit = 0; + } + } + + void Alloc(int64_t _nBit) + { + Close(); + + nBit = (_nBit+63)&~63ull; + arr = new uint64_t[nBit>>6]; + ClearAll(); + } + + bool operator[](int64_t inx) + { + assert(inx>=0); + assert(inx>6]&(1ull<<(inx&63)))!=0; + } + + void SetBit(int64_t inx) + { + assert(inx>=0); + assert(inx>6); + int64_t mask = (1ull<<(inx&63)); + + arr[ip] |= mask; + } + + void ClearBit(int64_t inx) + { + assert(inx>=0); + assert(inx>6); + int64_t mask = (1ull<<(inx&63)); + + arr[ip] &= ~mask; + } + + void ClearAll() + { + assert(arr); + memset(arr,0,(nBit>>3)); + } +};//--------------------------------------------------------------------------- +class TPerfectHashBuilder +{ +public: + TArray data; + + ~TPerfectHashBuilder() + { + Close(); + } + + void Close() + { + data.Close(); + } + + //if nBucket==0, nBucket = nHash round up to prime. + //To find MPH, set nBucket=nHash + //nPerSlot= realNumItemPerSlot*100 (can less than 100, meaning avg less than 1 per slot) + //nSpace is used to setup more bucket spaces to reduce the search difficulty on very difficult dataset. + bool Build(uint64_t *hash,uint64_t nHash,uint64_t nBucket=0,int nPerSlot=400,uint64_t nSpace=0); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectHashBuilder &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF/README.md b/PHF_benchmark/SPHF/README.md new file mode 100755 index 0000000..e87ad94 --- /dev/null +++ b/PHF_benchmark/SPHF/README.md @@ -0,0 +1,21 @@ +# SPHF +Satellite Perfect Hash Function is used to map input keys(IP addresses) on satellite to non-conflict integers. + +It is designed to handle small scale datasets. The space cost of function is around 4bits / key. + +The query step is friendly to be optimized according to hardware constraints. + +# Compile and Run +Use cmake with g++ to compile the program. + +``` +cmake .. +make +``` + +To test all files in the folder. Results will be shown in terminal. +For example, FOLDER_PATH="../Input_data" + +`./CheckHash FOLDER_PATH/` + +Any questions, please contact keran_zhang@outlook.com diff --git a/PHF_benchmark/SPHF/SortBase.h b/PHF_benchmark/SPHF/SortBase.h new file mode 100755 index 0000000..7f2c4bf --- /dev/null +++ b/PHF_benchmark/SPHF/SortBase.h @@ -0,0 +1,20 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef sortBaseH +#define sortBaseH +//---- -------------------------------------------------------------------------------------------------------- +#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +//---- -------------------------------------------------------------------------------------------------------- +typedef int (*TSortCmp)(const void *r1,const void *r2); +//---- -------------------------------------------------------------------------------------------------------- +inline void XchgStorage(void *d1,void *d2,void *buff,int w) +{ + memcpy(buff,d1,w); + memcpy(d1,d2,w); + memcpy(d2,buff,w); +} +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/PHF_benchmark/SPHF/Type64.h b/PHF_benchmark/SPHF/Type64.h new file mode 100755 index 0000000..a77e44c --- /dev/null +++ b/PHF_benchmark/SPHF/Type64.h @@ -0,0 +1,110 @@ +#pragma once +#ifndef Type64H +#define Type64H +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#undef XrossCPP_In_64 +#undef XrossCPP_In_32 +#undef XrossCPP_In_IA64 +#undef XrossCPP_In_PC +#undef XrossCPP_In_X64 +#undef XrossCPP_In_X86 +#undef XrossCPP_In_ARM +#undef XrossCPP_In_ARM_thumb +//--------------------------------------------------------------------------- +#ifdef __GNUC__ +# if defined (__amd64__) || defined (__amd64) || defined (__x86_64__) || defined (__x86_64) +# define XrossCPP_In_X64 +# define XrossCPP_In_64 +# define XrossCPP_In_PC +# elif defined (_IA64) || defined (__ia64__) || defined (__IA64__) +# define XrossCPP_In_IA64 +# define XrossCPP_In_64 +# elif defined (__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +# elif defined (__arm__) +# if defined (__thumb__) +# define XrossCPP_In_ARM_thumb +# endif +# define XrossCPP_In_ARM +# define XrossCPP_In_32 +# endif +#elif defined (__BORLANDC__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +#endif +//--------------------------------------------------------------------------- +#if !defined(WIN32) && !defined(_WIN32) +#define __fastcall +#endif +//--------------------------------------------------------------------------- +#ifdef XrossCPP_In_64 + typedef int64_t sint_t; + typedef uint64_t uint_t; +#elif !defined(__LSeRTOS__) + typedef int32_t sint_t; + typedef uint32_t uint_t; +#endif +//--------------------------------------------------------------------------- +union TX64Data +{ + int64_t i64; + uint64_t u64; + + int32_t i32[2]; + int16_t i16[4]; + int8_t i8[8]; + + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8[8]; + + double df; + float f[2]; +}; +//--------------------------------------------------------------------------- +#define x64Low32(x) ((TX64Data*)&x)->u32[0] +#define x64High32(x) ((TX64Data*)&x)->u32[1] +//--------------------------------------------------------------------------- +union TX128Data +{ + TX64Data x64[2]; + int64_t i64[2]; + uint64_t u64[2]; + + int32_t i32[4]; + int16_t i16[8]; + int8_t i8[16]; + + uint32_t u32[4]; + uint16_t u16[8]; + uint8_t u8[16]; + + double df[2]; + float f[4]; + + TX128Data() + { + } + + TX128Data(uint64_t vL,uint64_t vH) + { + u64[0] = vL; + u64[1] = vH; + } +}; +//--------------------------------------------------------------------------- +typedef TX128Data int128_t; +//--------------------------------------------------------------------------- +#define x128Low64(x) ((TX128Data*)&x)->u64[0] +#define x128High64(x) ((TX128Data*)&x)->u64[1] +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif // Type64H diff --git a/PHF_benchmark/SPHF/embdDbg.h b/PHF_benchmark/SPHF/embdDbg.h new file mode 100755 index 0000000..f56dc17 --- /dev/null +++ b/PHF_benchmark/SPHF/embdDbg.h @@ -0,0 +1,21 @@ +#ifndef embdDbgH +#define embdDbgH +//---- -------------------------------------------------------------------------------------------------------- +#ifdef __HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#include +#define logEmbdMsg(...) printf(__VA_ARGS__) +//---- -------------------------------------------------------------------------------------------------------- +#else//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +inline void logEmbdMsg(const char *msg,...) +{ +} +#else +#define logEmbdMsg(...) +#endif // __BORLANDC__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//embdDbgH diff --git a/PHF_benchmark/SPHF/function.txt b/PHF_benchmark/SPHF/function.txt new file mode 100755 index 0000000..b59efb3 --- /dev/null +++ b/PHF_benchmark/SPHF/function.txt @@ -0,0 +1,5021 @@ +10427 +200 +4 +1 +0 +2 +4 +0 +2 +1 +1 +0 +0 +7 +3 +0 +16 +1 +0 +0 +0 +5 +13 +1 +0 +6 +1 +9 +2 +0 +0 +1 +20 +4 +1 +12 +1 +0 +1 +0 +0 +11 +1 +0 +3 +22 +3 +3 +3 +6 +0 +0 +4 +2 +0 +1 +9 +10 +0 +4 +0 +4 +9 +6 +4 +0 +0 +2 +0 +9 +4 +2 +4 +12 +0 +4 +1 +0 +9 +0 +0 +1 +0 +1 +0 +0 +1 +0 +1 +10 +3 +9 +0 +6 +0 +0 +0 +0 +1 +2 +0 +0 +0 +0 +1 +1 +0 +3 +1 +4 +0 +2 +0 +0 +0 +0 +1 +6 +0 +0 +0 +0 +0 +0 +0 +28 +3 +6 +0 +0 +0 +1 +0 +3 +0 +2 +0 +0 +0 +8 +0 +0 +0 +9 +0 +0 +1 +3 +5 +0 +0 +15 +0 +0 +0 +7 +1 +1 +1 +1 +0 +2 +2 +2 +6 +7 +0 +6 +0 +0 +5 +0 +0 +11 +0 +2 +0 +2 +3 +0 +2 +0 +6 +3 +0 +0 +6 +0 +8 +10 +2 +0 +6 +12 +10 +1 +0 +9 +14 +0 +0 +1 +2 +0 +0 +1 +0 +2 +2 +0 +1 +33 +2 +2 +2 +3 +1 +2 +5 +0 +8 +0 +6 +0 +0 +0 +7 +3 +1 +1 +0 +1 +3 +0 +1 +4 +0 +1 +10 +2 +0 +1 +0 +0 +22 +4 +2 +0 +3 +2 +10 +5 +16 +1 +0 +0 +0 +8 +0 +0 +0 +0 +3 +1 +5 +2 +1 +1 +11 +2 +0 +0 +5 +0 +10 +6 +5 +1 +0 +8 +1 +2 +2 +0 +0 +0 +3 +3 +1 +0 +1 +7 +4 +0 +3 +1 +1 +1 +6 +0 +0 +7 +0 +0 +1 +12 +0 +7 +15 +0 +0 +1 +7 +0 +1 +2 +0 +3 +0 +0 +5 +3 +0 +1 +0 +2 +0 +1 +0 +0 +2 +1 +0 +0 +9 +11 +0 +10 +0 +1 +10 +4 +0 +1 +0 +2 +2 +9 +0 +0 +1 +0 +2 +0 +4 +1 +16 +1 +2 +6 +2 +2 +3 +4 +0 +1 +18 +5 +0 +23 +2 +12 +5 +1 +2 +13 +23 +0 +0 +0 +9 +0 +0 +7 +0 +0 +6 +0 +8 +0 +4 +0 +9 +0 +12 +0 +3 +0 +5 +2 +5 +2 +0 +14 +6 +1 +7 +3 +4 +2 +11 +2 +0 +5 +3 +0 +0 +4 +2 +3 +0 +12 +31 +0 +0 +0 +5 +2 +2 +3 +4 +1 +0 +0 +1 +1 +1 +3 +13 +5 +0 +5 +12 +0 +0 +3 +3 +1 +7 +14 +1 +0 +0 +10 +1 +6 +4 +1 +0 +0 +0 +3 +22 +0 +17 +1 +3 +0 +0 +3 +9 +0 +4 +4 +2 +1 +5 +2 +7 +4 +3 +1 +1 +1 +10 +2 +2 +3 +0 +6 +0 +2 +4 +2 +4 +0 +3 +3 +11 +0 +36 +1 +0 +0 +0 +4 +10 +0 +5 +9 +5 +0 +3 +17 +5 +0 +16 +1 +2 +0 +20 +0 +2 +7 +0 +2 +1 +5 +20 +7 +7 +0 +3 +11 +1 +1 +4 +1 +0 +4 +0 +1 +0 +0 +4 +12 +1 +0 +1 +5 +16 +0 +1 +0 +1 +0 +1 +0 +2 +5 +10 +0 +1 +24 +3 +0 +2 +1 +0 +3 +0 +0 +0 +2 +1 +0 +4 +2 +0 +20 +0 +0 +0 +1 +1 +0 +0 +0 +8 +2 +10 +0 +6 +0 +10 +0 +0 +15 +0 +7 +1 +4 +0 +2 +1 +3 +9 +1 +0 +1 +9 +1 +0 +2 +3 +3 +5 +0 +1 +3 +7 +0 +0 +1 +0 +0 +0 +0 +0 +3 +0 +2 +7 +10 +3 +8 +0 +3 +1 +6 +1 +5 +0 +0 +0 +4 +3 +0 +1 +13 +4 +2 +0 +3 +1 +2 +12 +3 +3 +6 +4 +1 +3 +0 +1 +11 +5 +0 +11 +0 +2 +2 +0 +23 +4 +0 +9 +1 +1 +3 +0 +1 +8 +2 +7 +0 +0 +5 +0 +0 +4 +0 +2 +5 +0 +8 +2 +0 +1 +2 +2 +6 +3 +1 +21 +1 +1 +1 +0 +0 +11 +11 +12 +3 +0 +13 +2 +10 +1 +19 +4 +1 +0 +5 +13 +11 +0 +4 +2 +0 +16 +6 +7 +11 +1 +3 +1 +9 +2 +2 +0 +6 +2 +6 +0 +6 +3 +6 +20 +0 +1 +0 +1 +0 +12 +0 +1 +11 +1 +0 +13 +6 +1 +1 +1 +0 +4 +5 +12 +9 +1 +4 +0 +1 +2 +0 +10 +0 +12 +3 +1 +8 +11 +1 +16 +3 +0 +0 +29 +7 +0 +1 +1 +6 +0 +0 +0 +2 +1 +0 +4 +7 +1 +2 +0 +1 +5 +7 +0 +1 +9 +9 +3 +3 +0 +2 +0 +4 +3 +5 +0 +0 +5 +12 +2 +9 +0 +1 +0 +0 +1 +3 +2 +0 +24 +0 +7 +3 +2 +5 +0 +3 +15 +0 +10 +1 +0 +5 +0 +4 +8 +9 +6 +0 +1 +1 +6 +0 +4 +0 +1 +0 +0 +2 +0 +7 +0 +9 +6 +4 +11 +6 +1 +1 +4 +0 +2 +0 +1 +0 +0 +1 +0 +11 +0 +9 +1 +1 +7 +1 +0 +0 +0 +0 +0 +1 +0 +8 +18 +1 +3 +0 +4 +3 +0 +5 +1 +0 +0 +1 +1 +12 +8 +0 +3 +1 +1 +0 +0 +6 +2 +0 +4 +14 +3 +1 +5 +4 +4 +5 +0 +2 +0 +1 +1 +0 +4 +6 +0 +2 +1 +0 +0 +1 +0 +0 +1 +2 +1 +2 +26 +1 +12 +18 +0 +1 +0 +2 +4 +16 +0 +5 +1 +8 +1 +0 +3 +6 +3 +9 +4 +0 +4 +5 +6 +3 +13 +1 +2 +15 +1 +4 +4 +0 +0 +11 +1 +1 +3 +0 +6 +2 +0 +0 +4 +4 +2 +0 +3 +1 +0 +14 +1 +1 +10 +1 +8 +5 +14 +0 +1 +0 +1 +0 +0 +2 +12 +0 +0 +0 +0 +5 +0 +4 +29 +4 +0 +7 +0 +3 +7 +1 +1 +5 +2 +0 +2 +1 +26 +20 +0 +6 +2 +11 +11 +11 +1 +0 +2 +0 +2 +5 +1 +3 +0 +4 +1 +1 +1 +0 +1 +3 +4 +0 +0 +3 +2 +0 +3 +3 +14 +8 +0 +20 +0 +8 +4 +6 +2 +0 +6 +7 +5 +1 +20 +3 +7 +9 +0 +11 +5 +0 +6 +2 +6 +6 +6 +0 +2 +5 +0 +0 +0 +1 +2 +3 +1 +1 +1 +18 +10 +0 +4 +16 +0 +0 +3 +3 +7 +0 +3 +0 +1 +0 +16 +30 +4 +4 +9 +0 +1 +9 +7 +7 +0 +0 +11 +1 +1 +0 +2 +0 +3 +1 +0 +1 +0 +0 +1 +15 +1 +3 +1 +1 +0 +15 +8 +2 +3 +5 +2 +0 +8 +0 +5 +6 +0 +3 +3 +1 +2 +4 +0 +8 +0 +1 +3 +3 +2 +0 +4 +4 +7 +0 +2 +18 +15 +0 +1 +3 +17 +6 +2 +0 +2 +0 +4 +0 +8 +7 +3 +0 +9 +0 +14 +2 +7 +1 +5 +0 +0 +0 +0 +0 +2 +1 +5 +2 +1 +9 +0 +5 +27 +1 +1 +22 +0 +0 +16 +3 +0 +1 +0 +14 +0 +3 +5 +5 +5 +0 +2 +28 +1 +1 +4 +1 +0 +12 +29 +1 +19 +1 +2 +3 +4 +1 +7 +5 +1 +5 +6 +5 +0 +1 +1 +2 +0 +5 +1 +0 +6 +31 +1 +5 +5 +4 +0 +0 +0 +0 +8 +7 +3 +9 +7 +1 +0 +4 +1 +0 +4 +2 +3 +10 +0 +0 +15 +17 +1 +15 +29 +5 +2 +3 +2 +1 +7 +6 +4 +3 +1 +0 +8 +16 +1 +2 +3 +0 +6 +2 +5 +16 +0 +0 +1 +2 +6 +27 +3 +6 +4 +7 +0 +11 +15 +0 +2 +0 +0 +3 +3 +11 +1 +2 +0 +0 +5 +1 +6 +4 +20 +6 +5 +1 +2 +2 +5 +2 +0 +0 +18 +2 +0 +25 +16 +8 +2 +0 +20 +0 +18 +3 +0 +0 +10 +8 +13 +30 +13 +4 +17 +11 +0 +4 +23 +2 +1 +4 +3 +9 +16 +7 +8 +0 +0 +11 +0 +6 +0 +20 +6 +10 +0 +2 +0 +1 +0 +1 +16 +1 +28 +0 +0 +1 +6 +12 +15 +1 +5 +3 +1 +0 +27 +4 +1 +1 +0 +0 +3 +2 +22 +12 +6 +1 +0 +0 +13 +1 +0 +16 +0 +8 +2 +0 +3 +6 +0 +4 +1 +2 +18 +1 +4 +0 +1 +2 +7 +0 +0 +2 +16 +0 +2 +4 +3 +16 +8 +0 +12 +2 +0 +1 +3 +1 +2 +8 +21 +1 +3 +0 +10 +1 +3 +0 +0 +10 +0 +5 +0 +1 +0 +0 +2 +2 +0 +4 +3 +1 +5 +4 +2 +8 +14 +5 +0 +2 +6 +14 +6 +3 +2 +2 +15 +14 +0 +32 +2 +7 +0 +8 +0 +0 +3 +1 +2 +21 +0 +4 +0 +3 +11 +4 +10 +1 +0 +0 +7 +1 +5 +10 +4 +5 +3 +8 +0 +5 +0 +2 +3 +0 +0 +0 +2 +0 +2 +0 +2 +3 +13 +2 +0 +5 +6 +1 +0 +0 +1 +0 +0 +3 +0 +2 +13 +6 +0 +0 +0 +5 +7 +0 +2 +1 +6 +0 +0 +0 +12 +3 +0 +6 +0 +3 +10 +7 +0 +0 +1 +9 +0 +1 +9 +3 +5 +5 +0 +4 +3 +0 +0 +21 +0 +4 +0 +35 +0 +0 +4 +0 +12 +1 +0 +1 +7 +6 +7 +0 +3 +7 +10 +13 +8 +5 +5 +1 +0 +3 +2 +1 +1 +5 +18 +11 +9 +0 +0 +5 +8 +0 +4 +5 +0 +12 +9 +0 +0 +0 +17 +1 +2 +0 +7 +7 +11 +3 +1 +0 +13 +0 +18 +2 +0 +7 +11 +0 +0 +13 +2 +0 +3 +0 +1 +3 +0 +6 +1 +27 +0 +9 +6 +1 +20 +0 +0 +3 +1 +2 +9 +0 +6 +1 +5 +0 +1 +6 +1 +6 +3 +0 +12 +1 +2 +5 +1 +10 +0 +2 +1 +3 +0 +0 +1 +0 +0 +9 +0 +8 +6 +8 +13 +2 +0 +5 +0 +2 +14 +2 +14 +20 +10 +7 +4 +0 +9 +0 +0 +0 +0 +2 +19 +2 +26 +1 +0 +10 +6 +13 +0 +0 +5 +5 +0 +4 +0 +8 +0 +0 +22 +1 +3 +5 +2 +2 +1 +10 +0 +0 +9 +15 +9 +9 +1 +6 +0 +0 +3 +0 +4 +5 +3 +8 +0 +0 +17 +4 +5 +0 +9 +15 +12 +7 +8 +13 +6 +0 +9 +4 +0 +2 +5 +5 +7 +0 +0 +4 +12 +0 +0 +0 +0 +2 +16 +0 +2 +1 +14 +0 +1 +2 +2 +1 +0 +27 +0 +0 +16 +24 +2 +7 +2 +27 +0 +13 +0 +0 +1 +0 +0 +11 +10 +1 +6 +8 +0 +0 +0 +0 +12 +5 +10 +2 +0 +2 +10 +6 +0 +0 +16 +1 +12 +6 +1 +0 +2 +6 +5 +0 +2 +0 +1 +1 +0 +15 +4 +2 +0 +0 +6 +14 +1 +4 +0 +0 +0 +7 +5 +6 +6 +3 +1 +22 +6 +24 +17 +9 +5 +0 +2 +1 +8 +2 +5 +0 +3 +0 +2 +11 +5 +10 +0 +2 +22 +11 +0 +0 +8 +2 +12 +1 +12 +11 +0 +7 +1 +1 +0 +0 +3 +5 +7 +2 +2 +0 +3 +4 +7 +0 +4 +3 +0 +3 +8 +5 +3 +11 +5 +0 +2 +7 +0 +2 +0 +3 +6 +1 +0 +2 +1 +2 +1 +0 +1 +0 +0 +0 +6 +4 +1 +1 +25 +0 +3 +28 +0 +0 +13 +0 +26 +3 +0 +2 +5 +0 +4 +13 +4 +0 +2 +26 +0 +0 +23 +0 +12 +32 +0 +6 +0 +0 +12 +2 +9 +0 +7 +15 +8 +0 +4 +8 +4 +38 +0 +0 +0 +0 +1 +6 +2 +12 +9 +3 +1 +5 +0 +5 +4 +0 +4 +5 +1 +5 +22 +3 +10 +6 +0 +9 +10 +0 +7 +2 +23 +9 +0 +7 +7 +6 +0 +6 +2 +7 +1 +8 +0 +3 +4 +0 +8 +5 +3 +8 +0 +5 +4 +0 +16 +2 +7 +0 +7 +13 +18 +0 +0 +3 +3 +0 +0 +2 +1 +9 +6 +9 +0 +15 +2 +0 +4 +19 +1 +3 +10 +9 +0 +1 +10 +3 +0 +0 +0 +0 +0 +0 +7 +0 +4 +16 +1 +0 +8 +2 +0 +1 +0 +2 +0 +0 +2 +1 +7 +0 +2 +1 +2 +3 +0 +0 +0 +2 +8 +0 +4 +1 +0 +3 +0 +8 +1 +5 +9 +14 +0 +25 +1 +0 +9 +0 +3 +1 +8 +1 +1 +1 +0 +0 +15 +4 +0 +0 +0 +6 +30 +12 +4 +0 +1 +0 +13 +1 +13 +1 +0 +0 +20 +1 +3 +0 +3 +7 +0 +13 +1 +3 +6 +0 +0 +24 +4 +0 +1 +12 +5 +1 +0 +0 +1 +33 +3 +4 +10 +2 +10 +0 +0 +2 +20 +0 +0 +6 +21 +17 +6 +0 +6 +0 +1 +2 +2 +0 +0 +26 +2 +0 +10 +24 +39 +0 +3 +24 +7 +15 +6 +2 +0 +1 +4 +10 +2 +19 +6 +10 +7 +0 +1 +24 +7 +4 +51 +0 +26 +12 +6 +1 +5 +0 +9 +2 +4 +4 +0 +0 +0 +0 +1 +1 +1 +2 +2 +4 +53 +0 +6 +0 +0 +18 +0 +9 +0 +6 +6 +0 +0 +12 +7 +3 +4 +11 +0 +2 +18 +1 +0 +26 +11 +0 +3 +0 +18 +2 +0 +0 +4 +26 +0 +2 +10 +0 +21 +3 +0 +28 +9 +0 +1 +3 +8 +2 +0 +0 +0 +0 +0 +10 +0 +2 +1 +8 +1 +18 +3 +0 +0 +0 +0 +6 +4 +1 +8 +8 +2 +0 +1 +36 +0 +2 +7 +0 +0 +2 +4 +0 +3 +1 +15 +0 +8 +2 +1 +12 +2 +4 +0 +2 +1 +3 +0 +4 +0 +12 +3 +21 +49 +0 +17 +0 +0 +0 +14 +3 +0 +0 +7 +9 +2 +9 +16 +3 +3 +3 +0 +0 +2 +6 +7 +0 +15 +0 +0 +0 +2 +0 +0 +4 +3 +1 +2 +7 +0 +0 +3 +16 +0 +2 +1 +3 +4 +5 +0 +1 +0 +0 +0 +0 +13 +5 +8 +5 +24 +4 +13 +0 +18 +6 +11 +3 +0 +4 +9 +1 +0 +4 +3 +0 +0 +12 +14 +1 +1 +0 +3 +3 +13 +0 +0 +13 +15 +2 +26 +4 +0 +1 +13 +1 +9 +8 +1 +7 +3 +16 +3 +11 +8 +2 +0 +1 +12 +0 +4 +0 +5 +14 +6 +4 +1 +3 +7 +0 +7 +8 +1 +25 +8 +6 +0 +0 +0 +5 +1 +13 +1 +0 +0 +22 +0 +3 +17 +2 +3 +0 +1 +1 +2 +6 +6 +3 +7 +4 +0 +0 +2 +25 +0 +6 +0 +6 +10 +0 +1 +6 +0 +0 +4 +25 +7 +6 +3 +11 +0 +28 +46 +7 +0 +0 +2 +11 +18 +0 +2 +0 +1 +0 +5 +4 +3 +6 +41 +3 +3 +3 +1 +0 +10 +29 +2 +25 +5 +0 +0 +1 +9 +2 +1 +1 +4 +7 +14 +2 +9 +0 +0 +1 +15 +9 +16 +0 +5 +9 +0 +0 +3 +18 +0 +2 +0 +7 +3 +0 +28 +21 +32 +1 +6 +6 +5 +1 +9 +1 +2 +5 +0 +6 +19 +0 +6 +10 +1 +9 +6 +0 +4 +39 +0 +0 +2 +0 +10 +0 +3 +11 +0 +3 +7 +1 +2 +3 +3 +1 +0 +0 +20 +20 +2 +10 +12 +0 +14 +0 +0 +4 +4 +0 +3 +0 +10 +28 +20 +0 +8 +9 +19 +5 +8 +14 +17 +0 +4 +39 +0 +10 +0 +2 +1 +39 +3 +11 +5 +4 +5 +0 +3 +14 +4 +3 +28 +0 +0 +17 +11 +11 +0 +0 +0 +0 +0 +26 +0 +3 +5 +0 +9 +2 +28 +0 +6 +1 +1 +12 +23 +3 +4 +1 +26 +4 +23 +0 +19 +22 +27 +2 +1 +0 +3 +0 +0 +0 +14 +0 +10 +1 +9 +53 +3 +1 +0 +0 +35 +33 +6 +0 +7 +12 +38 +6 +6 +0 +5 +26 +5 +16 +8 +29 +1 +1 +12 +9 +0 +5 +5 +0 +0 +4 +9 +13 +1 +4 +1 +0 +6 +13 +1 +0 +5 +21 +26 +1 +42 +0 +32 +2 +3 +38 +3 +9 +0 +0 +2 +1 +0 +0 +1 +5 +0 +9 +1 +12 +14 +9 +16 +6 +8 +9 +2 +0 +9 +3 +0 +2 +10 +11 +0 +16 +0 +3 +1 +0 +2 +8 +2 +3 +0 +0 +8 +0 +6 +5 +7 +0 +4 +8 +4 +0 +0 +18 +0 +1 +23 +15 +7 +1 +0 +2 +6 +58 +6 +14 +4 +1 +0 +10 +3 +13 +5 +2 +18 +7 +4 +29 +1 +1 +4 +1 +5 +0 +5 +0 +1 +18 +1 +1 +0 +2 +0 +0 +7 +1 +10 +0 +32 +0 +22 +59 +0 +5 +33 +25 +32 +15 +2 +6 +4 +0 +5 +13 +1 +21 +0 +3 +1 +4 +15 +0 +8 +82 +34 +0 +18 +3 +0 +8 +2 +2 +0 +10 +9 +3 +6 +0 +24 +3 +7 +0 +9 +0 +0 +19 +4 +4 +32 +3 +0 +2 +5 +1 +6 +17 +0 +0 +7 +3 +0 +0 +1 +5 +1 +2 +6 +4 +0 +1 +0 +4 +0 +10 +0 +4 +6 +0 +0 +0 +0 +2 +3 +18 +0 +3 +8 +19 +15 +3 +18 +3 +3 +6 +1 +13 +5 +13 +26 +1 +2 +2 +0 +0 +0 +1 +27 +5 +19 +0 +12 +0 +4 +18 +14 +22 +3 +3 +1 +16 +5 +6 +3 +8 +31 +3 +16 +0 +4 +0 +0 +0 +3 +25 +23 +14 +0 +0 +0 +8 +3 +0 +8 +3 +5 +32 +13 +0 +9 +12 +12 +5 +4 +5 +2 +0 +3 +2 +2 +2 +5 +0 +3 +0 +6 +2 +1 +3 +25 +35 +0 +19 +3 +1 +1 +3 +3 +6 +0 +25 +11 +8 +2 +2 +10 +4 +0 +1 +47 +0 +0 +15 +2 +0 +0 +0 +43 +5 +0 +2 +0 +4 +22 +4 +42 +0 +1 +27 +8 +0 +0 +8 +0 +57 +0 +1 +0 +0 +8 +5 +0 +0 +0 +4 +0 +12 +0 +20 +1 +14 +7 +2 +10 +0 +3 +19 +2 +9 +32 +0 +0 +1 +40 +8 +3 +10 +0 +8 +4 +6 +0 +1 +6 +3 +2 +4 +0 +6 +0 +0 +1 +5 +9 +7 +0 +0 +0 +0 +0 +0 +23 +5 +6 +3 +5 +0 +20 +9 +5 +0 +0 +0 +0 +12 +24 +21 +32 +0 +3 +6 +25 +4 +1 +0 +10 +2 +0 +13 +3 +0 +5 +17 +0 +0 +8 +0 +0 +0 +4 +21 +12 +1 +1 +10 +7 +12 +4 +0 +6 +12 +0 +4 +4 +2 +4 +3 +0 +0 +10 +0 +4 +4 +0 +10 +22 +5 +4 +7 +50 +2 +3 +13 +0 +0 +0 +19 +0 +7 +8 +3 +20 +0 +14 +12 +6 +0 +19 +0 +16 +59 +0 +1 +30 +5 +3 +1 +18 +0 +5 +8 +1 +7 +15 +1 +1 +55 +35 +23 +15 +0 +2 +4 +26 +2 +41 +1 +8 +0 +8 +46 +6 +18 +2 +4 +0 +12 +12 +85 +0 +16 +9 +0 +0 +1 +3 +2 +0 +10 +2 +3 +0 +12 +0 +0 +0 +15 +7 +24 +12 +14 +2 +5 +0 +1 +15 +17 +13 +0 +1 +2 +0 +17 +1 +0 +6 +5 +3 +10 +0 +13 +15 +0 +1 +5 +8 +32 +30 +9 +8 +17 +0 +22 +1 +15 +5 +5 +0 +16 +0 +12 +3 +11 +4 +0 +5 +4 +11 +12 +7 +3 +0 +0 +5 +0 +3 +7 +0 +0 +8 +0 +5 +0 +43 +21 +9 +25 +0 +11 +3 +0 +0 +0 +13 +2 +9 +36 +0 +2 +13 +21 +105 +3 +12 +8 +19 +0 +0 +0 +0 +2 +0 +2 +6 +11 +5 +10 +0 +0 +0 +14 +0 +12 +15 +8 +3 +0 +20 +0 +1 +1 +25 +9 +0 +0 +18 +0 +14 +10 +11 +0 +0 +1 +0 +0 +11 +0 +4 +0 +0 +9 +10 +3 +0 +1 +13 +0 +14 +45 +3 +7 +0 +2 +6 +1 +0 +4 +1 +5 +2 +37 +12 +13 +0 +0 +28 +3 +4 +0 +3 +2 +0 +0 +3 +43 +3 +4 +14 +8 +33 +0 +0 +0 +30 +0 +0 +2 +2 +10 +6 +0 +0 +13 +8 +5 +2 +0 +11 +1 +88 +21 +0 +0 +9 +24 +15 +5 +19 +1 +11 +6 +0 +8 +0 +0 +21 +8 +34 +0 +64 +2 +18 +3 +33 +10 +0 +2 +42 +0 +3 +25 +4 +12 +1 +14 +38 +0 +0 +1 +77 +10 +48 +11 +2 +0 +7 +0 +14 +32 +48 +0 +9 +1 +13 +0 +13 +1 +31 +1 +0 +3 +0 +24 +1 +0 +1 +11 +5 +3 +29 +1 +12 +1 +1 +11 +1 +26 +25 +5 +0 +3 +7 +11 +26 +0 +0 +0 +4 +2 +44 +0 +0 +52 +18 +24 +13 +2 +7 +0 +3 +20 +10 +0 +0 +10 +0 +3 +12 +0 +0 +33 +20 +2 +8 +16 +9 +13 +0 +15 +28 +2 +25 +0 +4 +0 +0 +1 +3 +0 +25 +43 +10 +0 +2 +2 +11 +11 +4 +1 +0 +24 +3 +0 +2 +1 +1 +11 +2 +21 +0 +3 +0 +0 +0 +0 +0 +0 +5 +0 +13 +8 +4 +0 +5 +2 +1 +5 +1 +1 +0 +4 +13 +5 +65 +13 +0 +6 +0 +3 +0 +0 +0 +1 +15 +3 +5 +0 +11 +20 +20 +11 +0 +2 +0 +7 +43 +3 +16 +5 +0 +26 +0 +20 +19 +24 +35 +14 +7 +3 +12 +0 +14 +7 +31 +0 +1 +2 +8 +4 +0 +2 +0 +5 +20 +26 +0 +34 +5 +1 +0 +13 +13 +3 +24 +22 +3 +2 +7 +4 +52 +15 +3 +8 +7 +1 +24 +48 +1 +0 +0 +2 +3 +0 +4 +8 +12 +5 +0 +34 +23 +5 +5 +0 +5 +1 +11 +2 +10 +8 +21 +25 +16 +0 +12 +1 +2 +4 +0 +5 +8 +17 +13 +1 +28 +51 +2 +1 +10 +4 +17 +0 +13 +9 +12 +2 +27 +0 +0 +21 +3 +39 +16 +8 +10 +5 +0 +18 +0 +29 +0 +0 +0 +14 +0 +15 +6 +0 +0 +42 +10 +0 +0 +6 +16 +71 +18 +5 +11 +6 +40 +11 +12 +4 +0 +4 +3 +57 +6 +0 +0 +0 +13 +0 +7 +0 +0 +10 +0 +6 +0 +0 +0 +6 +0 +17 +47 +6 +0 +0 +43 +47 +0 +30 +26 +81 +32 +0 +40 +9 +8 +6 +0 +16 +0 +99 +40 +2 +6 +0 +7 +21 +0 +55 +0 +4 +0 +4 +0 +2 +24 +0 +4 +0 +3 +3 +46 +20 +3 +14 +6 +60 +0 +9 +1 +0 +9 +0 +33 +43 +8 +21 +27 +9 +15 +8 +3 +5 +3 +1 +61 +39 +19 +1 +28 +0 +2 +6 +35 +22 +0 +20 +30 +0 +45 +39 +28 +8 +54 +1 +1 +0 +45 +15 +7 +39 +0 +7 +4 +1 +0 +0 +1 +24 +45 +0 +10 +3 +5 +15 +0 +0 +0 +22 +3 +0 +2 +0 +6 +7 +7 +9 +0 +23 +1 +0 +3 +61 +24 +6 +0 +8 +9 +2 +1 +0 +4 +56 +2 +10 +17 +0 +0 +19 +0 +0 +8 +3 +10 +0 +21 +0 +2 +0 +5 +32 +18 +1 +12 +14 +0 +2 +6 +5 +1 +0 +0 +2 +10 +9 +7 +1 +0 +4 +0 +19 +13 +3 +13 +0 +1 +3 +16 +6 +0 +3 +1 +10 +7 +7 +9 +8 +45 +6 +0 +5 +8 +0 +25 +6 +0 +1 +7 +7 +0 +3 +1 +13 +0 +10 +2 +7 +0 +3 +19 +0 +10 +4 +0 +3 +21 +26 +19 +1 +2 +40 +7 +10 +0 +3 +0 +7 +10 +11 +19 +29 +8 +21 +19 +7 +4 +0 +0 +1 +11 +34 +0 +0 +28 +5 +1 +42 +0 +0 +34 +54 +65 +0 +14 +19 +20 +4 +20 +34 +5 +4 +14 +2 +23 +12 +4 +0 +61 +20 +1 +14 +32 +17 +12 +6 +13 +1 +0 +5 +2 +0 +1 +22 +37 +0 +42 +3 +5 +10 +0 +1 +15 +0 +3 +7 +0 +34 +4 +11 +7 +10 +32 +9 +15 +83 +5 +33 +0 +0 +2 +4 +5 +3 +23 +2 +32 +51 +5 +0 +0 +2 +1 +0 +14 +3 +16 +0 +1 +10 +28 +49 +3 +0 +43 +9 +0 +0 +4 +5 +6 +0 +5 +50 +0 +6 +5 +3 +34 +0 +0 +2 +57 +3 +9 +8 +36 +0 +32 +21 +31 +16 +0 +0 +24 +0 +3 +1 +56 +0 +31 +0 +3 +29 +34 +43 +1 +0 +1 +19 +29 +3 +6 +13 +0 +13 +5 +1 +25 +0 +11 +8 +26 +43 +4 +4 +20 +16 +4 +5 +7 +6 +53 +0 +15 +8 +16 +0 +10 +0 +46 +0 +28 +22 +9 +12 +0 +5 +0 +0 +1 +18 +21 +1 +2 +0 +0 +9 +2 +11 +2 +22 +13 +0 +21 +0 +3 +23 +0 +7 +0 +0 +9 +0 +2 +0 +12 +6 +33 +0 +0 +29 +7 +63 +4 +0 +0 +0 +15 +0 +1 +26 +17 +29 +3 +12 +3 +2 +0 +15 +16 +11 +0 +1 +5 +12 +10 +11 +14 +10 +8 +3 +12 +0 +10 +18 +1 +0 +25 +17 +0 +21 +0 +0 +12 +14 +22 +40 +22 +15 +20 +7 +44 +6 +2 +29 +0 +0 +0 +0 +5 +8 +13 +14 +72 +1 +55 +4 +0 +0 +24 +3 +0 +17 +24 +4 +3 +19 +15 +6 +19 +0 +35 +8 +13 +4 +20 +11 +11 +4 +0 +11 +0 +22 +2 +6 +4 +11 +41 +2 +0 +7 +13 +7 +5 +7 +0 +18 +22 +29 +6 +3 +0 +12 +0 +22 +40 +0 +3 +19 +2 +6 +0 +85 +1 +0 +14 +29 +119 +16 +0 +0 +26 +1 +16 +7 +28 +14 +1 +9 +15 +55 +16 +9 +5 +23 +3 +9 +13 +16 +8 +16 +30 +35 +2 +6 +7 +84 +6 +3 +19 +2 +33 +4 +0 +13 +1 +28 +9 +43 +18 +23 +27 +3 +0 +0 +46 +30 +8 +2 +0 +1 +36 +6 +4 +1 +0 +0 +18 +18 +1 +6 +11 +7 +7 +0 +55 +15 +2 +29 +7 +31 +1 +0 +14 +0 +7 +3 +1 +40 +6 +0 +0 +0 +18 +8 +0 +9 +0 +9 +1 +28 +0 +33 +0 +37 +0 +8 +24 +16 +21 +0 +36 +25 +12 +1 +28 +4 +20 +0 +12 +5 +7 +26 +0 +8 +29 +31 +13 +0 +14 +0 +2 +1 +1 +17 +1 +0 +2 +3 +0 +0 +10 +0 +24 +24 +0 +7 +9 +7 +1 +24 +10 +4 +36 +3 +1 +7 +0 +27 +0 +0 +43 +5 +0 +0 +0 +0 +33 +7 +0 +39 +3 +2 +66 +19 +38 +11 +14 +4 +0 +3 +34 +0 +11 +3 +7 +6 +0 +0 +6 +51 +29 +0 +14 +14 +3 +0 +59 +28 +59 +1 +35 +0 +0 +34 +37 +52 +0 +0 +4 +25 +4 +7 +9 +16 +0 +0 +4 +2 +4 +16 +1 +34 +0 +4 +2 +4 +6 +9 +1 +5 +16 +0 +31 +8 +44 +10 +27 +4 +55 +15 +75 +46 +1 +31 +0 +5 +3 +0 +56 +6 +0 +0 +0 +125 +25 +7 +0 +49 +4 +1 +0 +0 +24 +0 +23 +11 +8 +28 +0 +57 +27 +4 +2 +60 +0 +21 +0 +9 +42 +17 +40 +0 +3 +1 +10 +41 +14 +42 +28 +8 +0 +22 +14 +10 +0 +1 +22 +0 +38 +13 +4 +2 +0 +42 +19 +0 +26 +14 +11 +0 +29 +15 +10 +0 +20 +61 +0 +1 +1 +2 +0 +3 +26 +1 +1 +3 +24 +0 +0 +2 +3 +3 +11 +4 +0 +3 +14 +0 +16 +3 +45 +10 +5 +63 +1 +3 +8 +0 +5 +4 +9 +4 +16 +30 +9 +3 +0 +6 +0 +0 +1 +15 +22 +0 +9 +4 +16 +6 +45 +2 +0 +0 +0 +2 +8 +26 +0 +14 +27 +1 +0 +0 +2 +0 +31 +6 +11 +3 +27 +29 +0 +1 +23 +23 +6 +12 +3 +1 +0 +0 +26 +6 +21 +22 +10 +103 +29 +24 +11 +20 +5 +0 +51 +0 +0 +3 +3 +8 +1 +20 +26 +23 +67 +7 +0 +7 +25 +1 +11 +26 +4 +0 +3 +0 +1 +0 +0 +0 +5 +16 +0 +66 +3 +0 +2 +13 +0 +0 +11 +5 +0 +1 +61 +0 +0 +1 +25 +43 +12 +4 +2 +1 +13 +28 +0 +79 +13 +2 +4 +18 +17 +7 +48 +1 +28 +53 +14 +23 +34 +18 +0 +0 +2 +0 +0 +9 +0 +24 +10 +10 +6 +0 +23 +0 +0 +0 +0 +51 +2 +13 +5 +21 +12 +1 +4 +45 +0 +13 +71 +1 +21 +0 +9 +47 +30 +0 +61 +3 +21 +81 +33 +4 +5 +8 +14 +1 +17 +26 +0 +46 +3 +2 +84 +0 +17 +0 +55 +31 +7 +0 +0 +46 +19 +100 +72 +4 +3 +0 +7 +0 +30 +16 +0 +0 +2 +0 +0 +1 +29 +52 +17 +5 +27 +16 +3 +0 +32 +0 +0 +0 +37 +0 +2 +4 +7 +28 +23 +0 +34 +35 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/PHF_benchmark/SPHF/input.txt b/PHF_benchmark/SPHF/input.txt new file mode 100755 index 0000000..e7d7889 --- /dev/null +++ b/PHF_benchmark/SPHF/input.txt @@ -0,0 +1,10000 @@ +2432620340 +2127031707 +2358798315 +3127220536 +344458652 +1799197182 +2234767759 +486667153 +2583337370 +3332453180 +4021428184 +113503513 +359305085 +2885677567 +1986960997 +3791358433 +784096144 +2588041436 +659441353 +3787339936 +4154846838 +948692350 +2298946245 +2069876928 +1985185298 +894818177 +2827922050 +306835441 +2976570575 +2354620076 +3372556695 +2075415935 +3148484349 +3356625982 +3941426032 +3124343427 +179735569 +46944133 +660340847 +2975678414 +4276473109 +2588196033 +974722435 +1314122697 +3557830843 +726928438 +1802353683 +3326349724 +503856171 +2584876825 +3799801871 +4121956691 +743677118 +2106910407 +4106710030 +1929981742 +3300250558 +438012465 +765111242 +3836236586 +2460449918 +773502258 +2563621183 +2657957066 +1447979258 +4008358226 +354559029 +1668736925 +3401855352 +1837382121 +2504310773 +1558270405 +1756147442 +1586394126 +2784533026 +2700679135 +2280618136 +1417282186 +646207977 +1095299007 +1124211606 +5159183 +762301698 +1273896551 +1846601083 +3716126718 +3755951403 +1510839983 +265331297 +2400683173 +3727278404 +1516893154 +1400397321 +4114297185 +4199850762 +774639952 +2263035992 +444594530 +2954024452 +2921824587 +1887648911 +881741651 +794429697 +3305564011 +117021257 +4029052011 +943521532 +4136581304 +4153264099 +2008206049 +1040938135 +3537944303 +1070656338 +2657947785 +2338214026 +2246711614 +394988060 +4073952703 +287357165 +3675451057 +2929278260 +1774926040 +1458650736 +273990593 +3500664523 +2631487466 +38960827 +506947279 +1860179626 +4129318846 +299438033 +890219621 +3304089141 +4236670539 +4199320055 +2482468076 +160072759 +3367756989 +21617710 +3935366703 +1638788079 +2721015026 +553219400 +4047847747 +1510280015 +3633381974 +1896460519 +1925702092 +3233597664 +993342716 +3086792142 +3552838960 +4136274270 +1179079247 +1040646309 +77755059 +4086300794 +3752586449 +3364120597 +4157807516 +867736610 +2965195654 +284659825 +1833177082 +530821525 +3626647270 +1916968617 +2175572580 +1017403781 +3607276225 +3622993694 +629204867 +1807520733 +2985985476 +1810744787 +3152742900 +3346797335 +3790713207 +2956009703 +1669436898 +2467784865 +75028770 +1068315795 +3064862340 +2173690574 +101027779 +2558754523 +3159883251 +1074880556 +3541345105 +3874186720 +252037971 +1810061627 +3773947204 +3032074313 +1200281605 +3605946163 +3916871838 +1287233070 +536258104 +500605453 +1341904978 +1956520933 +3951097768 +3027079444 +1006891187 +1048398449 +1394101313 +2035261709 +2551254371 +215012808 +526690373 +2115186149 +2156646778 +2543285477 +4128562273 +1041994048 +4204075948 +3163894069 +2764692747 +518848729 +646815685 +1850521886 +3028466453 +2632183280 +2401248841 +669739981 +3283567817 +2438699095 +2595786996 +2564218861 +1553426308 +214370235 +2688928756 +1358369045 +2202934024 +3510420984 +2987480572 +1045581713 +1194077924 +3413425539 +878079092 +3819906227 +180553861 +2076269481 +3636258390 +52450109 +642195700 +3421825602 +3763487196 +2082009843 +2542105110 +1252681807 +3142800741 +806875414 +314531855 +2217560722 +3831913987 +3103249412 +3535593765 +2324637075 +1831261756 +2199902244 +1180536370 +608722685 +2749053388 +2641134146 +101972162 +606684310 +1686748048 +1147046988 +3928994104 +3919375902 +338523815 +3740099816 +4273025071 +4058617294 +1539461917 +1587723140 +3781347210 +3660479805 +3642490679 +2179360591 +599316598 +815513241 +60795650 +3099091842 +2794435533 +2839961102 +4286250765 +3260208052 +698137985 +3540122502 +1316152807 +1174728176 +4154294259 +312974681 +4127894533 +102471443 +1892546523 +1918690936 +2214064843 +1703004358 +3137949533 +2630663346 +2388591772 +289394055 +3108844009 +339895166 +3756615578 +795336977 +2751975675 +423365355 +1599014071 +1035478333 +3232412785 +1928649557 +2003362912 +1235630740 +3872701174 +835402839 +2153379505 +1801539282 +1877373303 +188975962 +953456983 +2782049653 +980026389 +1085546647 +1803445949 +353619948 +869075414 +2259013505 +2289701279 +3645713860 +3504113838 +1775565840 +1457500329 +444919834 +3314531081 +2744712725 +109992957 +1488780578 +1266193730 +3105028285 +368925492 +2207605743 +2329235182 +513149248 +370906205 +4038445847 +2436225138 +2542080996 +2137127651 +1903685290 +3452889134 +2480281254 +3696022372 +3770177982 +1529393945 +161457995 +579540637 +1975385299 +2225974398 +650462198 +3065420301 +2508520345 +1022562401 +1192913781 +370280918 +2337814539 +3570799412 +2388884937 +2411430348 +3702185471 +2675010611 +3443410202 +4092984792 +1912318075 +306159750 +1560426980 +3017545209 +2045445253 +909307446 +4124201259 +3209389418 +4115794556 +1143668673 +703086143 +3326953546 +2787899575 +2233536496 +4164535915 +3060191934 +3357230125 +1383034068 +699274182 +1243499850 +2527351055 +1810391912 +1123754047 +3858589354 +288910708 +4218136311 +2506631200 +1191566089 +2677120356 +2982577117 +837936595 +2067576523 +3084508573 +3830553278 +1454265582 +3146020116 +1879327694 +1848940707 +3719837808 +1925480724 +2591406035 +595830398 +1100688613 +2612457909 +3123988154 +2370189564 +725985530 +3915184232 +4085719406 +1748044528 +4068953122 +1088262602 +1621631186 +1175633973 +2595965702 +941749685 +1626445443 +1295841152 +2772011832 +2988003222 +4072777183 +619257117 +1582662572 +4163639296 +3192802986 +2403729589 +617757833 +2734710363 +3531965896 +3931958571 +3873560442 +25776170 +3927244388 +3743502401 +2448411338 +1468810217 +4033597831 +1599678023 +1986045884 +1641646849 +2767625968 +2292262249 +847514676 +3743830178 +766235157 +2717309966 +2578661263 +1733721215 +1469860720 +1116360423 +2545704803 +2484876665 +3105781635 +1773590253 +1942283253 +4241421277 +1010441405 +4135110651 +2861187389 +3272850547 +1150952066 +63132150 +3818038125 +2699797975 +2483757649 +3520370893 +733574921 +2138501597 +548270386 +220850327 +2707192187 +598735702 +3328233454 +3181475106 +2759123966 +3450935935 +3314587417 +471499200 +4037891537 +2263152685 +2621354658 +1923480876 +1876937213 +3985360808 +2671791012 +1272843702 +1884396002 +2017211334 +223742100 +2503914400 +1681536889 +3086031445 +3480312399 +1193719002 +2844317936 +1841131427 +2182171424 +3103133539 +3353799772 +27350821 +2564879785 +2401217327 +4000766954 +1277093933 +3346029081 +498361253 +1586435621 +3868545159 +2787350270 +1667378690 +801685309 +1646006628 +3152807841 +3873248678 +514675104 +2667225619 +3338810050 +4056715814 +3693978988 +3090591119 +3965790670 +178499544 +1087711420 +3799556360 +591991384 +3876981777 +4153195468 +3798073603 +2892384363 +1538778111 +1870654301 +3706944191 +707699131 +631003502 +4232930443 +2692246615 +3641895771 +1800407718 +3004878093 +791935412 +2365565521 +697240813 +2947586179 +3187784162 +2731369863 +1220090452 +2269954543 +533643997 +1181610174 +4264319078 +2339249627 +1719299712 +1870006744 +64695642 +411633823 +4069861027 +2442555230 +2732604610 +3521692718 +3892226652 +4132272114 +3597456351 +2536314993 +3968086549 +3043705910 +2588089224 +3791980220 +2351373781 +1493008336 +3357528087 +2878937436 +3154279394 +3888353836 +3792508245 +3331969030 +1513532100 +220127812 +223046160 +2021803145 +2832244564 +2617942795 +1809750673 +816638662 +524252587 +3142085509 +323456048 +1596313956 +4681012 +155287962 +1141127284 +3566346332 +2239030213 +1293695926 +1232642258 +474848186 +2582173773 +3427806876 +2129608798 +1638496000 +3114860381 +2970097487 +2519570161 +409027545 +3519040010 +2886219458 +1904026375 +1567823539 +1643648318 +2740431828 +2948718025 +463912954 +3469951872 +191153467 +1163895832 +4160209408 +2922430977 +3845026205 +2860508602 +2507237833 +3270692220 +2571254721 +3615986333 +1634748796 +2075611798 +13371468 +2063532785 +1651785787 +1351152224 +3641292042 +1969005358 +3605944283 +2017101408 +1067488666 +3683725204 +1374209841 +2714264561 +2532585922 +1022602338 +488114476 +536924597 +1965866131 +1089857052 +2177283156 +4076352720 +2428212620 +1278895854 +2514391903 +2768124759 +657152619 +2260692879 +2008984755 +2052706035 +3616918749 +1844270677 +2676529092 +3409233509 +3875690691 +2138040253 +2357895525 +4138024251 +2715258349 +2259189892 +2529946737 +2817081095 +1869562343 +2573399872 +2506359718 +2891139213 +135889931 +2780261233 +104597580 +2097530130 +718113565 +1641409036 +2747393390 +2352613739 +2381742410 +3733063198 +519147418 +4294036712 +2000911666 +3252269088 +1254121098 +4015254546 +1613346749 +1189273657 +1161796724 +3993689371 +1459620785 +1693941699 +195878441 +3131981375 +3048558028 +265604004 +1650342325 +1089547417 +2642207843 +1096004633 +3828295073 +915263168 +4250524159 +2536610796 +3864384867 +4217437574 +2659882068 +956292534 +3226028014 +2259702535 +2557722565 +482926764 +3961762551 +590973792 +474680383 +2276827441 +2423386461 +1397142420 +3246597207 +3317054703 +682631813 +2550082351 +2334685324 +3789077992 +3408527859 +4132099150 +796901575 +3527520392 +1442133062 +3345418470 +449605946 +1687613224 +960618062 +1524219745 +3764328723 +355466774 +1407868609 +3973981774 +2170493875 +2248617486 +1867189840 +2663171600 +3026412861 +2929821565 +4208672997 +2054247670 +1230117424 +779820572 +268213054 +3043138611 +2890960055 +1290211884 +900499770 +2686989684 +1985905168 +2756438949 +1358529125 +2104146799 +2158630026 +2164220337 +2717750047 +2452895105 +829605721 +3979884094 +3744139997 +3957498079 +2822682311 +1113345439 +777658842 +3028696590 +921983072 +3780076214 +3456541127 +721813328 +3563244670 +3286227696 +1247821228 +3738686085 +1978644807 +1565756977 +1056951421 +2999515919 +2250548083 +463492671 +2262467575 +4219217166 +840933813 +2676614673 +3982485078 +2432702502 +2712376496 +2508889930 +2443870053 +1860353775 +2287354389 +3278678756 +2324108309 +3571148896 +1002207465 +3464109257 +903013002 +2559167206 +3388667019 +1872656369 +1536079866 +2215376473 +3734321566 +2414189016 +76577175 +123431548 +960193322 +2559229853 +1821917306 +2912781563 +1937771124 +3872168990 +2213978399 +3670721494 +3967235350 +1701998932 +2577677993 +950895663 +1797761130 +3338687067 +2677902274 +2742335656 +541118043 +1363594569 +2309891637 +2084337836 +283254380 +3773960165 +3260547887 +1586424084 +1344554563 +2906367623 +506693611 +1549860640 +2174640963 +1717685266 +3075168221 +2411700940 +2405709318 +3163565864 +1783278017 +3852425591 +2431925771 +3539578052 +2022248991 +2802125683 +2091193331 +4006974830 +1256927465 +972122177 +3903504559 +236974839 +3922146894 +3530157742 +3617265338 +94044409 +1265040980 +3878855055 +23580353 +2858341320 +1913808191 +1413435793 +193307277 +561945828 +679313792 +257748728 +3758014786 +3652051994 +2821763094 +3836606344 +2820047911 +3545188656 +122386519 +1433560450 +222235860 +1639218682 +130510404 +765751054 +3479075650 +3335953561 +2451006369 +1948377246 +2617448333 +3300737217 +202086042 +3670942484 +2183515372 +3952576440 +2904308714 +3591379651 +3295931928 +39785698 +1571461088 +2889728934 +3819167360 +3398778347 +1564528965 +1318175101 +3864275491 +1036977207 +4272443200 +2421178766 +2851786790 +2965162970 +1124193927 +594982015 +157037638 +2382438444 +362301182 +812773258 +1622006019 +630856245 +3135664986 +2093846832 +2026084368 +2558805735 +3646428040 +2131954033 +2605445894 +2788780366 +4147323393 +2662343521 +2566253611 +1299334185 +2717348804 +2752973223 +3063499859 +2705643665 +2881417409 +2255493904 +2828670937 +3562449876 +1292359701 +2257718953 +2511328014 +2573937458 +3234889482 +3426418430 +107169931 +2755519714 +376008909 +1551558806 +3845227941 +2401007406 +803870285 +2360136043 +564527533 +1318854830 +230086924 +3602190128 +1935562740 +1968446405 +1514513858 +3515577633 +1712721079 +260538185 +3896989813 +4248255402 +2293152697 +1416958822 +62989027 +3200069245 +1246417338 +3991543728 +763808499 +2657687523 +2938941929 +4146160081 +1822525210 +2843892211 +3156024255 +1099634584 +982191897 +2932631235 +112066835 +2216371340 +112213852 +569730111 +3228375302 +2899827934 +46506970 +3540001502 +2225649207 +170122717 +2489626528 +1237394788 +2753312763 +2224925173 +3367724082 +3389169157 +3175709756 +3720154106 +3478575197 +329283638 +1709486665 +3323607752 +1483550765 +3508751869 +1717275167 +3889157416 +4207112896 +112577768 +2183745357 +1553324203 +2511653167 +116331724 +1977819601 +3567667660 +69475336 +1608055256 +812844658 +4138094194 +997919630 +4042289640 +3851678663 +1446820160 +1543068033 +1765972265 +119808263 +1622265598 +350227320 +34571518 +2146308006 +3035332777 +4083395092 +3054894665 +2433400287 +3171523066 +3241927040 +4231567339 +601947846 +427061298 +2392108476 +1620569222 +2897838655 +3753316106 +83284846 +3251472860 +3713383258 +3438405547 +3312922595 +601187058 +2144468123 +1424738935 +1241117332 +2995937118 +1369736534 +868538956 +2569727356 +2604396824 +179805396 +762974905 +4162518623 +1972771216 +2968681167 +1578088554 +4154993716 +2539095894 +1000820237 +1656240897 +980935920 +3496476658 +2335439386 +1512247632 +1086787884 +1331831842 +720185461 +3385614058 +3410746920 +3246850318 +960399840 +3950281496 +3357698099 +582249257 +4119331196 +3805271339 +1050185815 +3466592404 +1258676964 +738503986 +2818712103 +1355949013 +2737511934 +3480886819 +217947545 +183057980 +3793630122 +2905762666 +2058754958 +3159969735 +1401166393 +3952542226 +22711572 +1778539451 +1440574975 +4060821439 +2269744617 +1638990922 +3400911776 +593100527 +667559440 +2676867213 +18427740 +2899403868 +3815175136 +616605467 +1463755002 +621434728 +162352459 +3698655784 +2717228799 +2019708042 +3655891012 +330159177 +3630781779 +1563802338 +2329048147 +1925286617 +388473328 +2967567959 +1310012573 +3936760035 +1363171302 +3638225813 +254633000 +3113635535 +4260920609 +3748537767 +3304064121 +1714888228 +1342417663 +413279806 +3139136183 +2718307208 +3731529712 +392450247 +3188026597 +3701831632 +2504057606 +2235670595 +3856615603 +4263466107 +2709772020 +4253304856 +796194420 +2955885529 +3194964025 +2638872141 +3619263538 +522731074 +1583093246 +3477248348 +4007228677 +2229510693 +2269945881 +1226678102 +554294429 +3724773298 +3556855494 +3489634254 +1036947813 +2037624393 +64160794 +792042646 +4037455367 +4196847189 +3659452954 +1987881906 +2036920414 +3530808604 +426034108 +3594012038 +676430890 +3952424756 +3826603760 +290709063 +3326024882 +3485316669 +3642290070 +1934573961 +404316711 +2597239617 +3654956667 +2099092186 +3203144283 +3945845884 +842670081 +4235588729 +4219080773 +3165044958 +1999541421 +422123576 +2061096083 +67733309 +1748674298 +3465738553 +1930119014 +761634827 +2834039247 +176588109 +84941904 +3076578436 +3913574184 +3385452519 +619470508 +1683597277 +3601980101 +1073229646 +2365974553 +1605213464 +457123038 +3724479121 +1186711351 +1265836655 +1571507699 +3175253054 +1971891953 +2616065889 +1540264933 +2348751632 +2709965882 +998812970 +2394416874 +614943406 +4211153693 +71652869 +3397168049 +3148265875 +1234693237 +4113162009 +3972402177 +1562649830 +2238591757 +381061429 +841612718 +2102292476 +3633509046 +3673741366 +3566978945 +3169781305 +770270944 +3557130047 +247833752 +1640467961 +164610492 +2035609423 +1684113941 +2713824473 +2744444950 +3542778046 +400897575 +1312819440 +486875315 +2630448170 +4284006138 +415864144 +540557539 +42111231 +3235891407 +140013021 +4109572786 +231524798 +1355117792 +552537397 +1079256124 +3624302504 +266661133 +40348386 +419952449 +592928753 +3550809048 +13844854 +2201038652 +3313265271 +2094010270 +638741508 +1977703367 +892086865 +352590124 +2246888824 +2863129856 +3566178256 +3659861243 +517176552 +3442684649 +1570585546 +2657170356 +624541017 +2752570810 +2350340466 +3949180693 +1805912330 +823527835 +1126334745 +1240368362 +566300029 +4271475693 +3104194441 +11540645 +1412286255 +1593084522 +1455285067 +15224525 +2605344160 +37021037 +834714831 +3506261144 +3121267976 +1786523998 +2203815461 +1883279072 +3483350219 +1677623309 +2720316885 +153664616 +524491070 +203591129 +1536800252 +1004199715 +1755986193 +1675252925 +289164353 +2301986233 +2973445227 +634630949 +3224717859 +3058142375 +2493226197 +2877862662 +2426627663 +367468925 +1996175390 +2627938404 +4274436329 +1070095061 +299072638 +1759343979 +1450466394 +619265404 +1737072501 +3941902509 +1025715272 +860307722 +630141793 +6683040 +1050065273 +1028129133 +3982711428 +37937278 +1613531775 +1900809159 +2971983598 +1274500575 +3700608775 +663763998 +2223258662 +3701903792 +1075554979 +3268968167 +3673551638 +4257158824 +754643648 +100891208 +2865649757 +1873353074 +4100692391 +2210198893 +1485122072 +525321696 +893519081 +2750866897 +2888802512 +3236710314 +921547828 +3456926878 +111103566 +2682031641 +631326916 +1185142231 +394918604 +3042767492 +2357250118 +3851148455 +2709205066 +1308278686 +3654284902 +3556404563 +2432349733 +3998523981 +2609339255 +4035419769 +935528154 +1059820895 +1808581018 +1461238415 +2424151880 +309976980 +2128086034 +2288025054 +2378589794 +56143637 +1681700108 +2152591638 +2412935448 +2106421509 +3258405735 +584923377 +3726211298 +3914369535 +1129073090 +227719057 +251213182 +1029906968 +4215454757 +2627272624 +171841543 +4115053734 +126044339 +4174783910 +2668519056 +3935625759 +2073546487 +568073511 +1159834430 +2182669171 +2532513849 +3447877876 +3945495570 +3422881377 +3256243213 +3774579381 +1260184864 +4188686644 +1174490442 +3052472707 +3726135624 +518434878 +2588692343 +3895626503 +3453280448 +4032090428 +176835955 +1043346968 +178778573 +3502506874 +3842659710 +76240090 +2865812122 +3475898958 +2093625333 +3961337137 +3814532060 +1198923583 +1639716149 +3677624463 +1669160132 +3726304077 +2951151137 +596538953 +607331223 +4286992625 +1814085717 +924485488 +3422738740 +2899215027 +1890523510 +1140671064 +342539843 +1498188627 +582705360 +3672352267 +2894560189 +1605337701 +2718901929 +819513482 +4013058727 +3244096250 +123095160 +706026970 +3616555199 +3727180223 +483725362 +2293948487 +446699630 +2676090329 +4178212513 +1182996039 +1405754653 +2594381519 +2095746165 +319557029 +2420767802 +327603039 +3431331494 +305925746 +1738042683 +236984540 +3553334629 +3394278813 +2454891222 +3492689389 +646556152 +1854999408 +142165210 +2043593545 +286004192 +3871534313 +3833025200 +1617893675 +2959206985 +3373300199 +427453104 +1344302864 +2018088836 +404808776 +1048131281 +3825365751 +3302983815 +1579672174 +548865158 +2480862233 +992248607 +3832857413 +541113075 +3877740991 +3307272377 +2308941053 +2194742357 +1314942142 +2239106862 +166137395 +1319062381 +947454245 +255125856 +3980388928 +512676008 +1809985437 +2981053639 +313388872 +1577717542 +3048250247 +768485798 +3933938075 +185221805 +1441233953 +3053614944 +2455205147 +614864318 +1428022215 +2356363033 +1451362064 +1949724515 +1748638911 +2869821598 +4170277003 +145608650 +3981580990 +32494899 +3991667746 +3895346725 +3874590011 +3809324673 +1603452974 +172719776 +2746440736 +3455360245 +2453290621 +3803918114 +1645170850 +2809663756 +3110264141 +182877079 +448040857 +1702499752 +3221283256 +2639489185 +22791283 +2524442638 +187949422 +3957579457 +469016604 +729878522 +2794604555 +2730195657 +2520867208 +4192657284 +3893152309 +335552687 +3039712256 +2484495391 +2368139516 +2066570624 +1121470390 +3568228427 +3271478003 +2477052528 +2769551516 +3781208711 +1511376231 +3482500661 +1937058196 +1212845961 +4267090951 +2010317353 +319670345 +761498762 +338862861 +278592924 +2285307017 +3258152845 +3173270582 +628434617 +1233035826 +2005560118 +1326407697 +4104562080 +1821039065 +3402119251 +685542157 +1796449869 +3266909840 +878107485 +4123559706 +785558753 +3525900538 +3872507797 +2775532993 +2952867859 +88360683 +3269847937 +2478939217 +1321216694 +3730349281 +2800950273 +2833148928 +2090284632 +2505128482 +2615172491 +814040100 +1329226656 +4077281217 +157161132 +3434253788 +293224132 +3292700684 +2913131212 +2915753328 +1612680903 +2023969435 +2826840949 +201119470 +3122493285 +159159070 +2247537328 +3176474390 +3054356980 +3584841072 +1356541046 +2959426068 +1274893807 +1765687668 +1021646537 +1156191573 +3133782231 +778037259 +611692964 +1212904036 +528905009 +2650869668 +3562839801 +2440403110 +2561950432 +579870754 +2417554482 +2855490853 +1903681674 +506238254 +2006109177 +252696307 +4005001826 +3379695687 +2128633968 +179059723 +639024783 +78244936 +2863661234 +2532547089 +2277631617 +1699004175 +3705221033 +1899836146 +1961568934 +1779744192 +55309017 +3017422878 +2812874888 +4015417881 +3875594117 +557634679 +960285174 +1220925696 +678330840 +3384442923 +858012028 +772208339 +2020158908 +2404596468 +2125375196 +2079618509 +2746245147 +314909956 +1564800446 +618740049 +3364049326 +1751600707 +633385430 +3394199965 +1159789406 +862361601 +713071799 +2927859211 +3956048909 +1642158488 +3106308623 +1208944721 +244385245 +3477857008 +833542367 +3908973421 +2613945605 +2730375757 +1222589962 +1129491419 +2238189449 +1217622451 +1729084364 +3143389686 +3355771170 +1470978890 +4112702674 +1892787043 +3431977723 +1227273152 +740927971 +3032487709 +2639378972 +3968098045 +2018385342 +93469957 +2545788405 +1232963247 +2824189874 +1950209862 +4079334718 +3930325807 +2573355546 +708721224 +3454425197 +916547862 +3421972427 +185049442 +561746642 +1025256618 +1259013068 +1889091687 +2040238523 +300404309 +2159807608 +1239264942 +2017658986 +146972956 +3842324966 +356538540 +1014130078 +1364992679 +907187550 +3101694881 +307564896 +4153304542 +2235870202 +236525014 +1303478412 +557322625 +2388293328 +2306930822 +1498713808 +3099473899 +2053283572 +2247147991 +2663394698 +2258852580 +2715512380 +3192751114 +462154683 +1473204743 +3421669421 +3458132442 +626095890 +2739708671 +3739229555 +2637433584 +2027133032 +457057552 +990114918 +1878378915 +214257907 +3319924106 +3650040990 +3892614082 +1811213429 +3537073085 +1641064239 +1408751169 +3532652421 +3521618006 +1269720639 +2925422386 +358605377 +2155237915 +1497876383 +3689526582 +1729792964 +22307564 +1516208938 +3421625378 +937311632 +2732081735 +3946427111 +4136208369 +3851621608 +3277422787 +349500039 +648399759 +990381034 +1577715367 +691365790 +1784824257 +1253592435 +4084770408 +170818138 +1252243100 +3760611897 +2051592358 +235308270 +2437184225 +2620847907 +2092310629 +2717773172 +133679598 +796325422 +826383012 +846161896 +1131174914 +538054201 +239074701 +3070716350 +3740971212 +1739347626 +916310132 +1101231773 +1756516850 +1236843889 +4071821065 +4091993028 +2580158247 +2739923205 +1103955750 +3177732285 +2956536945 +2655821066 +243386306 +4174838649 +1258314758 +3388146401 +2806088249 +2588763302 +180497651 +2460321930 +1996140093 +1630511663 +3535678061 +537257490 +3286559096 +384278767 +3793434824 +3169304353 +1632308140 +2681251146 +4231237465 +3978109459 +417192129 +1913060365 +681387263 +2497000609 +2465506869 +3371274653 +578618701 +2239791959 +3941592435 +2324633941 +2368275655 +794915219 +3750928951 +2278038915 +1153101466 +4028226184 +2619964244 +3897426995 +1849307775 +3549280860 +512408081 +4250879235 +3839088085 +3247140764 +956784552 +1914728119 +1452656786 +3300202984 +1652674767 +1331930148 +1630873719 +398478674 +3701645942 +623600313 +357897434 +1721586388 +1446280256 +1126289475 +910865649 +1622264605 +2710535805 +3975901108 +3312853288 +856431129 +570963671 +1512869720 +3777543850 +3302549372 +215579663 +387874571 +403384694 +793501601 +3272436241 +1656058242 +3756335267 +2282440800 +4271975338 +1053615694 +401273674 +2770385780 +4191113746 +2092840014 +2995591277 +728785901 +665892902 +575276274 +3051550744 +2409601267 +3800605224 +2042641258 +77766132 +2637188550 +866150203 +1341780020 +814875486 +3216890206 +132663820 +61412614 +1951748261 +1621292896 +2745888891 +2706657717 +3250575829 +2058964328 +3243810446 +325214425 +3656358242 +2742442770 +1392135247 +3771601946 +3657341184 +33149189 +1087062822 +2334001068 +2023635261 +667134625 +2443056757 +567971537 +2868651342 +949598430 +3264233362 +3666273042 +1104587134 +528185632 +3591898359 +2910576341 +175948691 +984877766 +3599042772 +3291492166 +437323073 +1387646304 +4252700685 +3428333302 +2618453706 +3728075615 +418781236 +119319392 +779916745 +442845484 +1286844377 +3400161273 +3210285203 +435805441 +2066434570 +2142073024 +94135635 +4036847756 +2015726319 +4192542091 +2922000143 +2191348955 +1340543441 +2188889805 +1202888120 +3943808033 +2908060098 +339724444 +3358184108 +2954422815 +917687462 +3952693660 +129672324 +603468380 +4165417209 +3825015025 +1792285778 +73001125 +1868133302 +2431117974 +1392114579 +2072388605 +3947114731 +1898897389 +4281971279 +880652115 +3903785904 +3057379567 +626153034 +1403122712 +114812974 +1376517038 +3309663714 +3151072302 +1804322318 +917636598 +3248611127 +2454407180 +1605953803 +3916497229 +3937343853 +3498851299 +2750047293 +2783534254 +2742400062 +4148744271 +2436249813 +1414533276 +1475219262 +2919071799 +1719904033 +3859084425 +1234122122 +370999499 +960539823 +2057842390 +3364062194 +3950124350 +531039455 +2844509278 +3973552471 +3098605112 +3551530793 +2636045004 +4155000720 +2252641070 +226282968 +2197084095 +1151778064 +1603905122 +2946574028 +3637295911 +4221221592 +3027378739 +1721006104 +3127385015 +3167761214 +2765576726 +2391056924 +3058243139 +3402983108 +2608315786 +3785194364 +3863981278 +222565798 +1263459166 +3482202700 +2506483893 +2698058331 +1226444999 +3439549624 +1333222647 +1807238265 +951451390 +2633925796 +604080405 +4241687969 +2560787312 +3304334803 +2776281370 +3224017989 +2986680958 +881394435 +1739409719 +2915015081 +2363612066 +1876707842 +2771033718 +3651711889 +3534686374 +1977926989 +1847054337 +1437325158 +3898780253 +4006043459 +2329226652 +752288600 +2023812150 +4091747577 +115968134 +6265501 +2701062647 +495046923 +746620834 +2684023094 +2033821841 +380952289 +3043188751 +1649104251 +3003972020 +3931278147 +1092579061 +1438285915 +428027343 +3129256619 +3075561994 +2154416758 +4061370980 +1353661681 +3744500560 +54894311 +777325136 +2235779587 +4294901563 +2375721291 +1403038990 +3630095421 +408399649 +967553044 +1831078830 +3447255237 +2729001732 +1362207639 +3983903108 +2464618322 +2594372135 +1658522495 +1972325625 +857669952 +1714820351 +3639153519 +1877819688 +103249924 +1433161778 +732450487 +3933142471 +3494710812 +1209791763 +1306651494 +1276996154 +3970910131 +223792768 +1448588254 +299023472 +602707666 +3898112762 +16913201 +787381219 +890232540 +3626751280 +839843850 +2995712874 +258448828 +503018465 +2771539419 +1576042558 +638941541 +930617723 +1339711239 +489810848 +2133326164 +2668161661 +3621307409 +1401153495 +1628157519 +671811844 +2663168044 +2685744284 +2366617786 +2719371301 +3690735452 +1553638622 +2568959650 +3471616875 +3456854841 +1652377184 +250631385 +3619052601 +1926295091 +2761481876 +1116863430 +3914238680 +798417266 +1825148045 +931968509 +698909994 +243506923 +482559069 +3089526363 +3952535550 +3143317768 +3905833857 +3536687256 +2212318697 +1613332135 +1755030535 +596791621 +3530671477 +4169695416 +2762903721 +2114838291 +963166244 +2121815044 +2290531204 +1695939074 +4025367611 +3762189496 +2455001713 +1751604778 +3924223594 +2745977247 +3165414580 +412167368 +2088468266 +1659865868 +2974706309 +1873189660 +1629577787 +935837221 +3284136975 +876004607 +858564656 +2498486962 +2490529797 +1020260619 +2933131365 +2517809917 +1765600700 +2082937488 +1779209704 +714438097 +3323084156 +1404001911 +2072983239 +3946019608 +4005781238 +1153291020 +989562520 +4099301651 +1353133566 +2457100257 +2539468239 +4048937418 +882241155 +3992449970 +225916024 +2286319901 +1169689920 +1206524539 +3735905169 +1207131744 +2872277008 +1493642016 +417398803 +690708357 +178888404 +3836218897 +3311788801 +2571765436 +684167208 +1136213085 +900454610 +1308391170 +763618653 +2823505681 +2402046303 +3608616396 +4261725752 +653307004 +2371196937 +2770914835 +3478208015 +3661875255 +1604001011 +1769731838 +44742197 +4056262483 +886712664 +3523208270 +2004671487 +603552262 +341701675 +3332167977 +2381727671 +929347605 +836464067 +1988131877 +68041483 +1563199327 +932455228 +3212057919 +1744156976 +4174451636 +1572057334 +2863852703 +2980354966 +2321372535 +1686726795 +2844720427 +840096521 +3724773514 +2343339546 +3735823775 +3981644065 +3556191984 +1989344221 +4180397558 +1073932991 +1017564528 +1915759755 +3951386030 +1278320667 +2901643040 +74777999 +1551662983 +56801411 +961753080 +1082803098 +1429035726 +2361695013 +3928452638 +1473201959 +2812028887 +4234075307 +1118147967 +2879942694 +1572411610 +554690339 +806495541 +2335930464 +4069575682 +1344691849 +3964593004 +3721865029 +3171156289 +1761261587 +4025756521 +571137916 +3980165039 +1082457038 +40800310 +508947279 +365687949 +165712864 +3617695388 +3095869056 +4050056703 +2548776557 +4170728684 +3496416852 +252956041 +482251575 +3802027900 +2367113512 +680612387 +3236559965 +2334043760 +2410136615 +817277405 +947934915 +1017009177 +2911946924 +3888967478 +4036063321 +3067803251 +1313850085 +1582534724 +840089934 +936228955 +4090310809 +3816987702 +255398919 +3892256940 +1745570110 +3196661004 +1854283120 +1255951030 +3234684432 +1119065689 +4235735678 +2922254464 +88725575 +738937632 +3722754091 +2964821813 +2533865341 +1175663591 +2494241554 +1205567575 +565427928 +1008426767 +2968099020 +1330546642 +505995910 +3266271000 +3339671143 +503859283 +3235244395 +3779725971 +37947543 +2128663330 +4030312151 +103595306 +3791176610 +104504883 +218063150 +461996390 +996938257 +1779405754 +4179870026 +4111290340 +3985264743 +4195182149 +1264629851 +3122030764 +2347817495 +1685996052 +3599711326 +4033104946 +2920911844 +2035828800 +3930090006 +810137551 +2963926600 +216734586 +2248961100 +2326805046 +2003881575 +2344639823 +2801542317 +3393147722 +3915133660 +2804220835 +972389778 +1608700202 +1378209271 +2355789863 +4199952261 +1920884694 +3328608501 +647291628 +3690731849 +2978243444 +1079434555 +69040561 +1885917647 +1064406586 +3804338930 +4242311641 +947308094 +1968969130 +3031700694 +3419232639 +3269295488 +1267559121 +4121221500 +977206583 +3002615670 +2934857643 +3716154217 +990211072 +223173338 +3365129552 +3218068175 +343833011 +2460897807 +2111114219 +1118544028 +3380233396 +4181653493 +3950965046 +2744878600 +3792153283 +3872078873 +2708345208 +3209389086 +4202338519 +1495316875 +1415767084 +3254127234 +2184345157 +1294274766 +516908375 +2263818240 +486696018 +1302975055 +1050654776 +2836979504 +1305375456 +2089729504 +2887614464 +4055605864 +4023309015 +2351119292 +1563036158 +3545620988 +1999150859 +3582297645 +4197628210 +945701236 +3790642124 +3088835493 +535718759 +1122314928 +510968223 +4285078729 +3300305427 +3168559591 +2378635458 +3895355229 +1652930401 +1778082363 +1031053732 +3755169289 +3987603234 +4254350961 +3068344859 +911651709 +2607645019 +2290148178 +3575542805 +236579921 +1362330618 +3415400631 +1336391860 +674893410 +2831012691 +1078405701 +3620574361 +1147269352 +2200373543 +2581695421 +4104020618 +3583500133 +311752031 +1770148625 +333405043 +4046062444 +3432808186 +471714860 +3260634009 +3918931231 +1248642401 +4198939866 +1913938785 +2930950062 +747064115 +4242715373 +3690306550 +1519758355 +2882112439 +521863875 +1386946598 +1918619932 +2346817277 +1173383693 +2466928243 +1681460812 +4236792309 +1303231875 +3468614244 +2938574063 +209159751 +145491810 +3221582355 +449745792 +2184137317 +1802716533 +1817295499 +1926313136 +12135251 +1478146698 +3645383516 +1874524688 +1128347951 +3112400767 +1694336432 +824899246 +1742764224 +286945839 +2739569678 +4047631347 +918055585 +2668363091 +3353886120 +348138486 +1225230028 +3395994367 +2567789516 +1180622050 +1017538581 +2146827743 +3866453447 +3026324959 +930297041 +4108450645 +3109309173 +4263414098 +360902739 +1996649827 +915560481 +1948738830 +1386633457 +3131609733 +1993273621 +2934098044 +3300579237 +3627840243 +1244542037 +1772202674 +2268470253 +3821248890 +3290074064 +2610033006 +1128448474 +657233608 +2592856084 +939655606 +325459836 +1204556722 +1479198606 +2080836260 +2787888919 +1995193712 +2691056214 +3850436381 +1530140248 +1576078255 +2672927278 +2913592112 +2995822944 +4248011468 +1565589844 +1250859971 +2247828082 +2087817913 +2372758693 +3937522657 +309298636 +1839412147 +1192792474 +583344496 +2653972257 +2062798221 +3823789234 +1489086513 +1050798738 +2742056137 +1433312227 +633063303 +4015635715 +3008202037 +596225945 +2664988982 +587544270 +2681780162 +3451682611 +2208459537 +1627745 +2911881409 +714138739 +3262308744 +1101499425 +1966359247 +1450751326 +636350292 +3604316592 +3427257200 +2581199398 +3241496227 +3674927709 +3152303726 +2038785747 +586644409 +194303910 +3653366981 +462717171 +1195117264 +1653146828 +403327256 +3439041498 +1260530719 +1329966904 +990365249 +2425682641 +479674031 +2198785525 +1185291807 +22654523 +1209246946 +3708488625 +939389070 +3729156003 +2466190492 +2626288495 +2727553250 +169036262 +1856622608 +530727332 +4107789913 +252912730 +73107743 +2325640306 +3869192153 +1297395231 +2497680859 +3718990931 +394789676 +3700630200 +1396237210 +2975345009 +2511281548 +3814995979 +477651413 +3508451142 +3948886971 +2231246984 +1881392652 +2801451116 +2547651706 +634185274 +1655894420 +1369641012 +1511125791 +3708571878 +1068101556 +1042123081 +1998415090 +265044099 +3808299921 +62407428 +3272651855 +2480687755 +1843307138 +221119531 +865302847 +2790514616 +2212063783 +1365939001 +912347761 +2021507854 +3089014851 +3948789107 +1406453776 +678758510 +2477763005 +4047587621 +3995211898 +4009249518 +3527646518 +1671209653 +3311947582 +2627888155 +2142030316 +1779614874 +911622784 +3406593231 +2588542590 +2645751286 +41800075 +3276913566 +1556832997 +3772897255 +4055747600 +2301672488 +2918562164 +2782107232 +1431430627 +4134921679 +2678074446 +3852674008 +3501965771 +492552821 +686939864 +1475431947 +2799680717 +9176967 +2699935888 +1630047423 +2120978928 +1180751955 +99102830 +2393585682 +1398852891 +2416212263 +3028829936 +3035426872 +3074442312 +1114212928 +4091711032 +1579122060 +2168672810 +1673460361 +3951723212 +4251690806 +3102767691 +4016889843 +995679086 +993388382 +180212579 +2511682504 +2778639017 +1122550333 +771806046 +4197704634 +1323033047 +3405162003 +553907685 +2238190813 +2117885606 +301576278 +2025695857 +2042462585 +152664735 +1061086330 +3302784200 +2197066594 +1350004628 +3074934010 +2674708076 +2058661002 +1431203639 +4256959338 +1064828766 +780770878 +1740645757 +13052809 +2144226940 +3608021395 +2344120054 +1430687654 +2526181645 +3404526334 +2335473938 +2771481799 +4060071198 +1981637855 +2217240126 +1065491328 +4101624659 +3680106225 +3685310256 +1477525669 +1237638642 +3826718666 +1775646839 +3911247815 +3267596590 +2576384377 +2764306721 +3194058612 +856123202 +3156096368 +2630715241 +479806465 +1924736864 +682574243 +3618141848 +1472551733 +3427313107 +690669867 +104014059 +148271813 +1488472328 +3641627696 +2343285071 +1504653093 +2305651854 +1571761186 +4245556979 +85803379 +3454845596 +3084887808 +223128415 +3491006515 +3415454961 +2005776017 +411726737 +2728808987 +2701127517 +510578317 +1486024321 +1717486491 +22897941 +4271875590 +2686417795 +1285108897 +1501335890 +1047269014 +279352576 +83291469 +2779276298 +3325277281 +1982276095 +2591879374 +4224799692 +78749925 +2657374796 +2486591362 +3557554528 +3960826739 +1095375508 +3581363890 +1787811968 +1825092715 +871926210 +3891617307 +3672866923 +3633865046 +2199915759 +3412514934 +2244812560 +2991698085 +3242293965 +1102918157 +516510674 +253903322 +4210411845 +3752504576 +483850493 +1704451156 +3389400418 +3843325686 +2882643741 +49790387 +2002093053 +1963582255 +1155867012 +4159165417 +2806389562 +1409170710 +832490754 +3947428969 +3535172374 +25585603 +754411277 +3685825554 +3034424958 +1740697036 +2992377993 +1267082009 +3497973560 +2101264691 +2064367195 +3264959801 +3319420659 +634967219 +3604404240 +1382282036 +1924501150 +2864465602 +3119323204 +33828236 +159362536 +229706909 +2010379446 +627662428 +3843072378 +791477929 +1451818768 +3948205695 +1420537794 +1252518712 +2244028830 +477759505 +3252365421 +2226873031 +351983629 +1475945565 +3732560692 +2444105173 +3848620758 +3107000248 +3982530913 +1175579108 +1892287304 +1810716242 +667727286 +3860796115 +2203724177 +3967045931 +1805167314 +729361387 +3524612305 +2687171646 +21352410 +2172292223 +1204267585 +431172472 +4084314043 +472231800 +655420309 +1333815739 +3384637997 +2667737888 +3950366284 +1274836430 +3133589550 +60398814 +1605191929 +4162134853 +64871930 +3789610429 +1616147336 +3358500261 +763304054 +1791183187 +1032914965 +2896918362 +1464162695 +1990799441 +1969242586 +1171379935 +2416401298 +3846959601 +3685110229 +2190698 +50968702 +570041646 +2455853605 +2574293235 +824412542 +476795443 +3356802614 +2259349842 +3570720071 +2700544903 +922040838 +3488244320 +2028182450 +3593734511 +3359279220 +2793959457 +1372714774 +3346346467 +3891231451 +348502678 +3113026413 +3019888593 +1972708974 +3095164343 +1999785218 +2847938459 +3466777075 +506778818 +1941401893 +3754057236 +470442332 +153813918 +3851869707 +2291787364 +1854632490 +3593736886 +2090949679 +1006670387 +2967896769 +948096166 +3703232415 +3195256632 +3455188226 +3037857885 +3923477858 +1003514760 +2753812149 +4191880515 +2234639545 +2938159468 +3311175886 +4274336710 +1843254555 +3973778257 +1511524898 +2221855846 +723019591 +92771762 +2825973074 +3730142081 +3915038289 +1035278254 +2726822064 +3919309387 +2121099670 +3646048945 +2488285066 +1147430042 +3009583529 +3578598933 +4085511290 +3928960949 +2544723643 +466412306 +1377564253 +1756542013 +105919577 +929650913 +3129079340 +2861494849 +3264320549 +927979271 +1702473050 +407611380 +3020970461 +825362738 +1696887602 +3866976261 +2303280185 +1774879007 +3825741391 +994811018 +1729380070 +1561513836 +4110042492 +4224222254 +3454439042 +3496313031 +2485279771 +3652567156 +4234962975 +3409354566 +1552989136 +1998914663 +3124065609 +1901973486 +2240736541 +2041342927 +2798183706 +3956093238 +3369089195 +2043795028 +2381465067 +4038757637 +1541629869 +943880739 +2444244289 +2174387498 +1368149385 +3812594299 +1911684395 +1443462471 +2258863950 +1750623322 +2676016783 +3692919129 +1876381328 +1261849132 +3822519468 +2336494641 +1359514296 +913611038 +452978262 +3508136149 +4147456948 +100261959 +3911454813 +2008138442 +2371883405 +3790646025 +3763809499 +4046102049 +3429447427 +2255267613 +443293966 +1887862573 +2361561121 +1462476483 +4275547794 +1138690706 +190269204 +1319838177 +3757976135 +2803524219 +3934689880 +3811260163 +4018413133 +3531436442 +1460519239 +3375662166 +332798254 +3648656648 +3323728831 +1105870098 +251463272 +1623112719 +958280399 +1575947967 +1669186700 +607617149 +4074162628 +672344199 +3928681324 +3397328897 +1934709576 +3838001196 +1548575787 +1167074724 +1769080901 +326274446 +428012971 +983367054 +3747807303 +3125974160 +3643990466 +3297612941 +263666501 +3057722581 +2239848050 +2060962109 +2168350371 +1120617065 +3969145695 +3675329363 +379220090 +1406404213 +3341074296 +2216331404 +2979254535 +1745751430 +2586183487 +2837754342 +3804534381 +3055380902 +2181234017 +2698221761 +2354807930 +3907330762 +1671459715 +2516698250 +1647288893 +2466919264 +1046492038 +233420086 +1615066478 +3546537389 +2743224507 +3192501045 +2972795777 +3704807459 +1333547657 +3866955075 +1509092682 +2896613608 +1628463449 +3045664452 +443031715 +3607937985 +3302956313 +4220120484 +444184404 +2148129793 +74143767 +3826787950 +3969623643 +480091760 +1170117180 +1620698509 +3899206656 +18483313 +1661274354 +974255980 +373623690 +1774372594 +170851685 +124784889 +1199066945 +1518056380 +1833449351 +342667121 +2507980860 +767390567 +2037278598 +3642767874 +455750378 +24341882 +4242772694 +1671491918 +1361241062 +3527031865 +4110785864 +3401725268 +3088082666 +3171705537 +315072449 +2021831162 +2202161254 +2749000530 +3144456293 +50473590 +3275561756 +2843245285 +2261501275 +1341405282 +775954173 +2132392757 +698536674 +3805124805 +704826365 +3261250738 +3703346640 +3176459179 +4026754498 +1084439194 +2307065339 +3748056781 +3314750287 +4260602080 +3164095311 +2648948382 +4141964944 +1750668066 +2194820712 +4234520687 +697979228 +4174142572 +494782065 +2647576748 +3454945985 +3015238900 +4212897966 +4261200239 +4235271279 +449808251 +892032411 +2645051389 +748391918 +3662183043 +1191713895 +1752853222 +3485121568 +2735406119 +1064175130 +1901134421 +592889699 +1443459292 +3626903617 +2993348022 +3363405127 +1697893951 +958415954 +3934632380 +1165054846 +1286257949 +4254659254 +2020263941 +3339482430 +3405268222 +3388335966 +1193332041 +512461122 +2799953121 +2547262992 +2267748407 +742727028 +687281498 +3678199428 +3467968363 +3726557175 +3202557214 +1943732528 +1034487636 +1206023697 +2499704597 +4270780843 +3373569273 +665310034 +1483837753 +3450677462 +3863247860 +2385107919 +3768555628 +1795150509 +726542185 +409684454 +3211944714 +931424902 +3181619983 +2533342500 +15948119 +2259944081 +3617872006 +321514752 +1326528536 +3368854051 +2079173885 +4020225116 +2874985113 +1086456412 +3032078996 +2434671755 +2367415913 +1869910503 +1006868639 +2001773588 +3654528382 +4194824628 +4241363498 +3050214240 +2703856682 +3844534556 +2444358683 +1115605904 +3781882121 +991705225 +660621102 +2531354668 +114029217 +3777728977 +1181913072 +962704687 +2503720653 +3361007134 +125192272 +2851767060 +2424348490 +622547543 +3244155189 +2766977431 +1886689803 +2715501397 +2241328659 +3449509546 +3201471807 +802258379 +449313788 +1796327975 +3233935500 +1226320330 +1181883118 +2574157491 +1958994943 +76735125 +501321417 +3866528761 +2147789123 +469420644 +3727654891 +1473040578 +1869484495 +1275060634 +3025483428 +2325113096 +1216820460 +574590332 +1122185619 +38109619 +759681887 +3875197724 +3790033102 +1340678892 +3573845168 +3772291411 +1157802013 +426082654 +438636417 +563587993 +3940876359 +2122000588 +212002594 +3174005963 +603409636 +3022742702 +2260744561 +3198404938 +1485067924 +4021994500 +264751628 +125633192 +934244586 +484844933 +1617718024 +3262523871 +1686352572 +2628601534 +275973420 +2185623719 +282111929 +1350618117 +3242594725 +3937441961 +463601220 +3656195955 +2513365553 +2784728800 +1396112563 +2040180879 +4031834421 +2806369621 +152052140 +1647162021 +2653717408 +2667502212 +346495439 +422006676 +4179204593 +1927007304 +3909029914 +2069353530 +383935359 +488286797 +4276411083 +609525431 +1836891976 +2513242996 +2879349400 +3566907459 +2200427867 +2082974161 +2767712407 +841564174 +946079397 +2684516872 +3174077842 +1980657892 +2821240387 +1581216472 +2819461298 +2890238773 +569610423 +2913010224 +37907788 +3491174385 +2647944014 +987423552 +3855821064 +2984592710 +4044657230 +4174437350 +3019070698 +4031197456 +1884282589 +3677783625 +2698643142 +2593164345 +3592773772 +3817081958 +19341617 +4129900740 +728948501 +257108131 +2212662189 +3201019581 +3908390786 +283633134 +4095944503 +1785232977 +1113619566 +285999804 +3029060464 +1394988220 +2968029156 +2752005174 +2092187791 +526156713 +4105844991 +3971376549 +1238216551 +2626671202 +2597282993 +3968511479 +3381553430 +2296343017 +3777486354 +3532622101 +1135064884 +2042649509 +2675082693 +1932269144 +2736434583 +464018704 +3595146432 +3532446565 +523705493 +1791740111 +1489360407 +119885383 +2632149773 +621984430 +72480451 +1420639991 +1171803867 +2039274792 +2573710352 +2801477351 +2729803108 +1320327602 +2745043551 +1767633482 +1843301442 +1078833209 +2805764032 +747064168 +3252153521 +822606486 +901010396 +2007096897 +1306419038 +2807515681 +592732454 +3497861786 +3454904311 +829959472 +3190152684 +3071232292 +3669861670 +2162175845 +2995583027 +2613781689 +1268188422 +333150953 +1878883667 +2956198438 +2866233240 +3251684678 +1720649752 +2818066104 +4014212726 +1684662683 +1976840435 +2956251414 +967742611 +3947494317 +1225327231 +2604895346 +4261805074 +1007155152 +2292593052 +2023979253 +4236869979 +3036622534 +4166686525 +2417427056 +2369931179 +139649403 +111875860 +3159341152 +1864883864 +1150133560 +1252971410 +1094301354 +2082419787 +1851161058 +1803485153 +1839975130 +2707084136 +1163094871 +4013260689 +175822092 +3291841124 +4228359193 +4015448043 +2644781496 +91120747 +243336410 +4195462845 +1181082236 +3770736833 +1808117916 +1210684273 +763811445 +3135491795 +4001480095 +2624819923 +4275800221 +2935709572 +4214951226 +3494362654 +1766184857 +2126403382 +3760982713 +2374126416 +3675919081 +1984915853 +3155085828 +38273631 +3194198089 +2385757447 +2180323448 +1541208839 +3610618370 +2209946316 +2822763075 +2763019553 +817703402 +1247698912 +441695884 +3574359386 +2927950630 +3686851476 +1512418626 +1211694269 +1923886323 +1712955029 +414432797 +2256377575 +4077134141 +1879436849 +3888354648 +3945152236 +390185053 +3407077786 +2934600631 +307486187 +2927745951 +391219631 +3506880421 +2732504709 +2649101041 +1659371333 +648052631 +3048141064 +2519303174 +1009231088 +1812151789 +3318438870 +4186065874 +3563620334 +4110766916 +2052329564 +789330115 +207364161 +2086288736 +1273791535 +1491110521 +3015924037 +61724544 +3066058264 +579492163 +31978896 +1135305720 +2904273198 +2293655987 +2959479503 +3571987324 +1275265646 +1115252568 +2631130112 +1341640540 +2941768272 +3271866703 +3889439811 +4036196116 +1178694666 +1684574775 +3333876322 +2370122249 +717590979 +2746353009 +3301346132 +1239165084 +1968129364 +3587306123 +1131107301 +968007966 +658918480 +2402053743 +1776233384 +3739603080 +669815138 +2393920352 +1302112427 +1894201147 +1186935409 +4283330471 +1669581817 +4198286233 +73154696 +3594686154 +2247529074 +2881059039 +2414598029 +2379280559 +1246676349 +4287293395 +151523475 +3443270533 +809868503 +3015333115 +711397924 +1556614441 +2763879263 +1370870364 +3500247196 +929583452 +1053497655 +1799594308 +3391690888 +2212097006 +1758776633 +3052691762 +4167290896 +655003154 +83569970 +979432035 +1092702483 +890555300 +3509701676 +883420920 +4190984141 +2585145352 +4006900956 +4093585483 +33076878 +3544887925 +2562172018 +1068809759 +39654038 +3158457351 +4009579617 +891076488 +3309810234 +3220671388 +2014565335 +3822280584 +424283210 +2257647294 +1153918457 +3223019848 +2449888628 +909861581 +1371159030 +2429011428 +802556084 +2496543431 +3314559528 +3469152924 +43507631 +3893953056 +2989931811 +410096281 +4122744179 +2340825571 +1402775658 +3141879347 +956658105 +2841942190 +692156465 +2979099670 +173783595 +1272287311 +816132630 +1658209589 +4140158657 +1855880302 +4289257527 +284313632 +3507802751 +645819405 +2101489915 +1748874487 +97539905 +1400948897 +1202151993 +685589063 +3882255010 +4077677906 +1900088260 +3094715866 +445404866 +2334777959 +982119618 +2436535942 +3633493072 +3962610595 +2868930844 +3544313065 +4246963186 +206726377 +503236600 +2414859870 +3821559543 +941186709 +3967179814 +1955641283 +2388592069 +1089973239 +2947888936 +146393450 +1718746863 +823442891 +3154219161 +2422775291 +1388579177 +1644657317 +490086861 +2717357177 +3907853337 +2735317889 +4080046850 +3415505733 +1416260401 +294362133 +1282667788 +693496554 +2447883119 +1236350921 +889356860 +980766279 +2615943456 +1487637331 +3576286751 +2099862803 +945774381 +143951862 +2573487519 +1418953575 +1857097172 +2121327360 +3810475034 +3171293100 +542007736 +2422479354 +3585247936 +1761059106 +2764704724 +3980592195 +1506722872 +4238103025 +1994541319 +4259351641 +2627277483 +2623092405 +2178576545 +2291396526 +2874364294 +3032263420 +4270776161 +705128041 +1126111114 +98150626 +1768826728 +3713125306 +2916482567 +184011025 +915139558 +2049738428 +2364873142 +97536190 +1764735075 +3061885906 +1331483139 +189740362 +214278478 +1378878330 +1246168430 +343821843 +3548063216 +167348584 +373321763 +3181440191 +4124864126 +1609667601 +1034994717 +3093483371 +2319875231 +194038581 +91759212 +3549374484 +3939751924 +602857214 +3503420380 +1605096250 +144233765 +1093920562 +369931785 +4238992727 +3244111644 +2707519855 +1552559108 +413654407 +4091702839 +2884049691 +1869753929 +727634584 +1470728677 +3654243155 +1231247408 +245364604 +3326969080 +836846992 +1248176370 +2924963463 +2991949593 +1841434053 +3812446272 +2858442759 +1524950936 +3607454596 +2117164549 +848097372 +4078121680 +2694356125 +2439243328 +274571557 +3891791926 +1142472921 +1372215528 +1532192842 +3076894903 +3539450338 +1302832650 +688381230 +1083014494 +2110917625 +3274103428 +1223556612 +1957146070 +2981751458 +1347216177 +2020739845 +3787556059 +1538926983 +4169673020 +3018177702 +3072533357 +3805479923 +1212854311 +3851036429 +3855370779 +4269252911 +1210543623 +3793038350 +428177928 +2285471388 +2706298809 +128550065 +2499072459 +3358368294 +2040336586 +407057084 +397622794 +1809042018 +2832769142 +973838873 +1833378733 +4262101098 +3427088032 +1307295910 +3237619961 +1692666190 +2647967619 +884034315 +2977020599 +3990929875 +2916543536 +2445012008 +4096382955 +2326681905 +3793793278 +207816212 +3461878470 +3998290316 +721076500 +249119346 +1165178675 +1127330751 +1108375760 +2114014625 +1898289510 +3005460259 +256585502 +513546495 +670696595 +3087633961 +2081703246 +1803064523 +1146716299 +269606047 +1832186194 +2943743004 +4165338727 +3707183251 +1762608415 +3558718010 +2306475895 +1279695514 +2957676729 +179087730 +2354128484 +3747319268 +2796718566 +947026097 +1646614984 +1878378508 +3203250343 +2446246732 +4157914015 +3453823704 +3184894798 +4174544756 +2230499800 +1975225516 +2812719593 +252796069 +2065099078 +3252487688 +3092165499 +3983121304 +4009615555 +2558839164 +3380791411 +1995639424 +4113637018 +365684189 +943819335 +1935375627 +1825827625 +2615688389 +1674664862 +1980717076 +3716385460 +3090039409 +1961103 +3205187785 +1511394430 +805990440 +1307346441 +3080284495 +4225963320 +4280470826 +2750502072 +3812267443 +2735665958 +457931269 +151213070 +3274839343 +2497652345 +551020217 +510685389 +1075425759 +1146571825 +164645799 +4011941143 +273523254 +555085413 +320106951 +1743874742 +452274572 +881517041 +2548262402 +111586726 +3608098876 +1482629575 +653425988 +3688927335 +3406661295 +2187765223 +3994668336 +1067864856 +394760442 +2685083259 +3075109656 +4011060682 +989455211 +139969692 +3411760824 +2723839175 +3501356773 +31798812 +1879441894 +2943984270 +97213258 +4069884063 +2141115028 +2974456645 +1572682885 +4076621184 +400058606 +3191210846 +3073947956 +2995284141 +3118017026 +1817071497 +1254053177 +579204987 +2833931032 +571636911 +2762489745 +3010932606 +306337909 +2081811577 +3366527353 +2731819433 +2297828267 +565952206 +3487787197 +3466492247 +3228896741 +1478282475 +1121233885 +1573327729 +3172536023 +4243888433 +2893149341 +2513514717 +1277168152 +4248649827 +444405806 +734925254 +1413826340 +3570029652 +3110525837 +945909782 +2998023544 +1692935782 +725946751 +3170451695 +556120150 +1916685564 +1118167550 +2353091167 +94494446 +1343228719 +3994920305 +3090250617 +2457088903 +1129790203 +1092428215 +2334277177 +3786924066 +156204085 +3217440667 +4211862096 +2219682635 +1484660868 +2002086318 +2454839937 +919984957 +566789003 +3021581092 +3618605540 +2191025716 +4265419514 +42969073 +3012461489 +1635325925 +3269246512 +2605248904 +2998861528 +3907239469 +83453916 +1343434781 +2087201049 +582216862 +1434237010 +1949336463 +1343469659 +4096584933 +4139209394 +2937691692 +4140437197 +2575148724 +3883516334 +1667283921 +3063966782 +2249344065 +963371992 +1765985379 +1595459979 +972103310 +3804332592 +3272223762 +2817386243 +1005293590 +2751802885 +1927740232 +1581636502 +2493018044 +1897902562 +823313041 +1470194342 +1230234864 +3506723428 +769466238 +890310655 +2196521338 +2476599476 +4077625846 +3530223108 +1042605327 +323057172 +1692920946 +153216694 +1319868068 +400135361 +273616284 +2715515305 +2569546515 +1853596257 +1658826815 +3632146570 +4234317441 +2026816864 +699423084 +2036214625 +3158521865 +2950422047 +2609847466 +379745081 +1206903346 +1246505891 +3853287307 +4135717646 +228949334 +4044267195 +3928088189 +2190292569 +1559145138 +1168748663 +3721900094 +3258780770 +3386429857 +1366392104 +1736471046 +66245129 +1624947620 +2063258306 +1154410491 +1083226266 +623973403 +3513647909 +85670128 +2698560166 +1117114086 +3161271214 +1937101853 +3719671383 +398488831 +3045168151 +709974948 +2542912106 +2822150944 +3180556892 +547761295 +1903218498 +1416143774 +205962520 +1090377227 +426738816 +1005672353 +2604036003 +2645261376 +178581900 +2353216564 +2919029300 +220179378 +452305103 +1200244020 +229462673 +3772461430 +91221610 +3519976144 +1984446559 +3434660732 +3632316798 +2299829630 +2231806758 +942238991 +356082541 +1354218940 +3466352977 +3620742056 +896707051 +4140612642 +82613453 +2203038722 +4252744649 +1615654611 +4173883463 +848662284 +3156383310 +799780076 +2258783500 +1283627320 +359958482 +1353524349 +1365961962 +218307789 +3945594087 +2794673253 +965740910 +3503173776 +4160856251 +3676682345 +1312196765 +3142648709 +3201570894 +1022225218 +3055524674 +698349117 +2878489221 +1649037792 +2076153525 +1810418798 +1330060852 +1499323185 +1637838389 +806678191 +1988705254 +972952227 +1085813824 +944550432 +3208198571 +2148915695 +913813593 +1250180674 +1041077825 +2642787760 +2833003978 +1171166376 +1277492098 +1765642859 +2286629702 +2651917282 +3965603162 +2682440012 +3302605924 +3121548387 +724950528 +505538503 +3308480282 +2273536347 +1155822374 +510930801 +1557065506 +271677833 +1128270457 +1179150894 +2862804126 +652085796 +2095702003 +1070325426 +3177450701 +1675163216 +3961064576 +867323300 +964846962 +3640555714 +2435866226 +2224166973 +3157046437 +1860715482 +1084673262 +513928188 +1628946194 +1639418906 +1361515015 +1707595699 +4111414837 +3245171145 +398697984 +3552448193 +3805212457 +3766098910 +3562995718 +2052586555 +2736045931 +1899279703 +256781064 +2571498409 +3788935821 +291104604 +3501535729 +1282204239 +2786648543 +1591363902 +2054851109 +1225208270 +64322622 +3385496348 +2713204383 +3973125151 +3265065103 +2927563386 +2151249113 +3551843327 +2602369751 +1501901458 +4242118371 +3074953127 +2260826051 +1181846513 +379241666 +4166797758 +335652366 +968913393 +1682244203 +1519114563 +1987756924 +2519314281 +2905047615 +2087731956 +280188162 +976200974 +285462068 +3646902719 +1285901047 +4137532814 +259820314 +3814563570 +2323805903 +918724936 +3669218778 +2541753327 +3135267967 +3700417953 +4165405866 +2776042875 +4266473289 +1775686499 +1916292204 +648082802 +2749757176 +1384247571 +2408718312 +120762291 +1135401223 +679240626 +769282458 +1317687283 +2534739800 +4109263400 +1836942853 +1837345315 +2859737649 +3194492564 +1045607375 +4284447056 +2044678207 +3470350651 +3417526780 +573146228 +1710406261 +140267710 +2336234501 +336735832 +594164495 +3193357901 +2178529627 +1758992365 +1970960405 +1941065214 +2045803675 +1083241138 +748611472 +2203087457 +4191290377 +3026418349 +2130987606 +3922580875 +2603952471 +1780362360 +1472679344 +3916536894 +3608641354 +1881791958 +2782449254 +273962152 +1495743607 +266608341 +2584265200 +1874261641 +1068057507 +3569755980 +62313745 +3263196741 +4075675648 +2066592699 +2977966880 +3998351919 +2593895501 +3262194748 +3002214416 +1289464888 +2218004334 +459117904 +1017611603 +1005058549 +4013159341 +4225373720 +3082828959 +1624959749 +3585236652 +3397363797 +381488177 +3232045919 +1526446029 +4079237691 +3516192482 +3547354839 +2817444603 +4115884495 +2107056134 +3841355001 +3701162414 +1000945062 +2196287883 +2250301160 +4215229388 +129488673 +3629796477 +3147459015 +2004878390 +1331120222 +1201152502 +3202889035 +3229620373 +1652751528 +2181496080 +2637242160 +1603908015 +2207081805 +3459146937 +4011489465 +419159345 +822220767 +3182279108 +4006388778 +2046509800 +2341493666 +3137765322 +457527970 +1172394240 +347049519 +2613940392 +3416254082 +1366580684 +3341929703 +1182862905 +2322773627 +4254231430 +2203670751 +3168261932 +286661558 +644018723 +2437072891 +1304942880 +396583662 +928340756 +2366462099 +869518651 +74331576 +897036260 +3966158426 +1831611353 +1440311688 +967278109 +540317911 +1910688032 +629162735 +1211560736 +436505636 +2204853886 +688806406 +1322527623 +4278353913 +3326234105 +2295277955 +366453660 +1806345517 +2620773772 +2096787997 +731912519 +3896396173 +2918900026 +316650653 +2240679163 +2637493370 +582920146 +1366290332 +260466506 +3209573792 +3793256905 +760953596 +4126730898 +2082686180 +1786673210 +3343771989 +1277923184 +2482293656 +1175949015 +2504689513 +1623070797 +972095724 +2769789299 +2897387443 +3086085699 +2448341546 +1865983804 +4130774026 +4251724231 +3452121580 +541075067 +2856005274 +325955731 +1692180733 +2248740341 +4289247372 +1889959598 +373580340 +83480710 +3990944965 +169316846 +131721704 +2874429029 +234858936 +3351100968 +2484066310 +2916501390 +4250796864 +3329013023 +3757372052 +1440902898 +3547483127 +3895471120 +458147223 +3670169833 +3737568089 +3203036166 +850232151 +2765292335 +3498327330 +2626729463 +4040941121 +620052852 +1687919236 +2284264771 +3050244572 +869472472 +1422873700 +254291530 +3241543269 +913745668 +1562445102 +2053294431 +3747619459 +4189682883 +427827324 +1076699537 +569499515 +2382053072 +1228962995 +3951745825 +160373154 +3455048142 +1123306623 +2716774632 +3720948038 +136748593 +837114854 +4214906756 +2358831789 +1274774430 +1072394140 +1260465204 +3342812494 +1145238786 +823506448 +637387210 +3067387441 +1732546697 +2499887792 +3297156320 +2184388361 +2213014534 +4125284552 +597999708 +2137912594 +1046091527 +1667374357 +216796427 +1984345147 +3022281075 +1964388040 +4041595006 +1130782404 +2227789478 +228019405 +3126470816 +1777949109 +4146709274 +397716758 +2895191372 +2214231390 +3206302597 +2776266686 +3789997439 +1698186039 +843697756 +2118345838 +1347038692 +965438044 +408857113 +846963723 +772446502 +1246349240 +2544737151 +2729543545 +4025803824 +1675747680 +3942484224 +4232118771 +4016160750 +1639317357 +394149763 +2359732336 +577511350 +3515811266 +266496029 +1985655967 +2152546948 +84045952 +1271044441 +1776653181 +1062303570 +140647935 +3668765751 +740597904 +4162437287 +1811629412 +949813939 +393460510 +3461819538 +4275529613 +3241351706 +141269760 +3238294823 +2188697557 +2748775126 +1160611814 +1082457555 +1983749663 +2266992083 +1083638046 +1654229212 +1391881692 +2310067459 +1196799226 +1420072290 +4233482406 +1310123329 +3832564744 +2806139907 +190727507 +2539533779 +346806482 +1879946309 +1971620548 +1648732682 +3540016164 +483181326 +1562916858 +1077933099 +1669295564 +739389016 +1178526973 +725132844 +1265903931 +1228668286 +2434896623 +261297278 +1577117439 +121352157 +1270041270 +3476984470 +1845965884 +873938926 +1710511468 +4062490117 +3350680836 +1481925908 +680663189 +3074979075 +940102827 +2938284034 +3648188757 +1907774369 +2065994979 +3939720992 +2096485749 +2297632025 +1720165379 +505870863 +881056282 +334291212 +33575756 +2956735691 +4179947884 +2533474551 +3623795156 +302056322 +1507977437 +3802525595 +2011117542 +4260257033 +452495919 +1117008353 +2282619172 +2786629591 +181653520 +2746405134 +1229804230 +1026273695 +3771817659 +3501926537 +3955159719 +1862694057 +2543109553 +2667215730 +895002010 +3185560490 +3647844390 +1052289949 +3364303518 +4144002999 +597890251 +929892173 +177859178 +777117654 +1837622391 +3140400676 +2633606223 +3570540420 +2760574715 +4162391045 +3827687577 +838336989 +1928821676 +3096758844 +4248382611 +3326307448 +353538429 +1960167450 +3758944103 +4048381009 +238476414 +3243005293 +2822005022 +2187260281 +2522392534 +2135177136 +2600130462 +36096571 +3586388761 +3972530794 +3745372152 +4223559752 +1481387095 +3785755012 +1859588133 +2659729574 +2614489129 +1971362799 +1126025703 +4083042994 +954360390 +588428559 +372546839 +668525135 +2082786649 +2463896458 +638039720 +3392829748 +1660162547 +3565872651 +2576988874 +2076886516 +3345712149 +3785609298 +593238396 +1648224241 +2476816772 +3822466386 +1129053756 +1544357178 +392372577 +1234113788 +1603550777 +461510728 +480299405 +1072741836 +3670839652 +3249894946 +1745637149 +988295883 +2678153064 +1323196058 +1577703598 +2244096478 +2804394777 +1068742595 +2851184752 +1666606757 +2852217254 +4092517152 +3320098911 +307834532 +2137976190 +620391778 +3727645946 +4065152538 +2650980805 +178268634 +2134037110 +4149225382 +3909459582 +3438560515 +1373079255 +2390366917 +267213357 +984880322 +3493175703 +2345438858 +2676241793 +1548978828 +363284352 +1965538726 +2227333318 +425961889 +512919631 +2840310866 +352001328 +171974576 +828542465 +517582141 +2152859063 +1847242844 +1424358372 +2733599367 +4174970819 +2758906536 +3127480646 +2809913043 +1186756248 +1959586977 +2795353298 +1850263433 +732725897 +3212918238 +2602794980 +1896706156 +1921276549 +1983844103 +3039293755 +161841747 +3440962848 +3122765127 +734623228 +1206564994 +634548003 +1500982331 +31447827 +464451422 +3449304600 +4048254802 +47441173 +2830141053 +3959510923 +2840691066 +22187923 +1879115670 +2670133193 +1871353593 +3223523039 +4088180178 +2392802190 +3988705879 +155072511 +4120241765 +3288065755 +839896905 +2329809154 +3519319605 +2538640902 +1241701722 +387093825 +336875369 +2739479346 +2102708534 +659060533 +1389841946 +1525483892 +1991786777 +1053530306 +1332820776 +3764588937 +3555203242 +3848835073 +428662474 +2159575279 +2006926094 +1046771655 +1895228841 +2408812765 +3299443420 +3266862197 +761726271 +336729162 +953955632 +3828936034 +2846744739 +801406604 +1384696354 +4203892306 +1921063915 +776711828 +2253923976 +1220115894 +1309325954 +4152916517 +1785934671 +1713299066 +115649379 +382030817 +3021618481 +284508009 +1398560684 +3676950394 +1854822496 +2948727251 +1506028143 +1256732211 +3651836235 +2516686832 +3486865899 +1094777160 +2411978369 +3496965354 +2974385745 +3250159917 +71957190 +3444444202 +1651433557 +2283664573 +2752903034 +2929182674 +3335795166 +403061083 +3458576257 +3623386907 +2546240750 +1920877983 +4279466824 +1623498258 +3710575723 +4239197272 +1275448236 +1815379606 +242182130 +1203776531 +3787878131 +2473691665 +3219097415 +2852962191 +1460511946 +2418940007 +654357916 +1137386072 +2187812777 +2574355319 +831308390 +2432479605 +2709416752 +215813794 +4281053214 +2778828128 +3428889064 +4031572665 +4131605855 +3352899672 +215475806 +3307888853 +1632767652 +1719184508 +3144872456 +694044327 +4273065162 +2736396538 +342721701 +2736474633 +4236945716 +2151121170 +2659330004 +1156625086 +1424040970 +609194264 +2119171468 +3804914689 +1477699614 +1660897535 +3649881135 +3156282377 +4109064263 +3049551543 +2635098243 +2841505727 +1294388972 +3979989837 +1292481983 +229936355 +1595101375 +3113606313 +844162486 +2988975505 +3194593701 +333947602 +3574633752 +3579255136 +131439844 +235819864 +4219309216 +3663990643 +615773639 +2516732478 +72373041 +264970086 +1473247344 +1645365034 +988941563 +3645652849 +2991964569 +3407067908 +576372189 +464182519 +3373489749 +3853946108 +646382222 +1379194845 +459837598 +2122532892 +2880265964 +3934183475 +3260507771 +2471327827 +3316464216 +2489023636 +909266836 +1369714096 +3490747383 +3959947570 +1964436764 +2378136006 +2002553918 +4056982845 +2661828461 +764496014 +2453317017 +3466891649 +2019449629 +1015717252 +1597295610 +2618163647 +1601276335 +1889042771 +3275283035 +694319320 +3040898449 +3235310315 +2650624643 +3119880349 +1733779501 +1171391941 +821287985 +2674285814 +1670403780 +3970057397 +3024254450 +2631005942 +3600336315 +3544377093 +1592310789 +4294420676 +1996031148 +18631946 +3294139213 +410419358 +2614738325 +591149548 +2546041917 +3893795553 +751479267 +757794581 +123451017 +1223166133 +1370050777 +3947450985 +621239504 +1540926470 +2381201541 +1693006159 +3891953593 +1328356723 +575235293 +2013452436 +3242859744 +1574367500 +399027438 +3618485351 +1309698935 +800021350 +960348813 +3356649756 +633676420 +2667409381 +1497404830 +1004433875 +4129199653 +2622583822 +2294416208 +1005697488 +3899656602 +2144981070 +948209359 +343697051 +513550848 +3904477761 +4012954809 +3173834195 +465325109 +2978403056 +583217760 +4231822986 +2701562555 +2667420251 +1184712981 +572296933 +182942132 +2786538867 +1223212691 +2760794889 +851563555 +2240465202 +3035583033 +1272032188 +2845871536 +1026397824 +189877904 +2419145822 +2798413687 +2877219122 +1110728141 +196684 +1933423403 +166891889 +3725419151 +2853019578 +2332232477 +2637328939 +1082900817 +1610757710 +2893754548 +2512092819 +2769767007 +871600562 +1091920758 +2362661338 +2218490481 +3584545157 +1413766617 +3446524738 +1997645679 +1535169553 +102069353 +1089046965 +1628115006 +3707071215 +3829947542 +2702702609 +1458932145 +2750848480 +459561242 +3087201231 +1611471496 +2912621232 +433863986 +675027795 +3111398575 +491728924 +1312097572 +3427788181 +3655423692 +785422050 +963671867 +3095884880 +2308440376 +2869773262 +378356791 +2770424043 +4069773111 +1517622728 +2904856699 +427513147 +2809218764 +1167056205 +2766426283 +380088539 +4099324829 +2767069903 +3673766394 +3816456147 +3695971352 +218963847 +2449523776 +1923231729 +1251060863 +2200741550 +643051296 +2519220454 +319236759 +1580833523 +1737196235 +3910988663 +1249504881 +2863402006 +819033608 +1058157775 +2157971464 +1518564103 +904066243 +2762656081 +3398975294 +2711887438 +4002814696 +1699285239 +128848931 +1305723024 +1796423995 +392170091 +2360824075 +36449157 +2177695896 +1974637024 +1998059266 +476178147 +1660182241 +1220489455 +2475036296 +1710767826 +1865315507 +1859952682 +2936233862 +1470863535 +477332653 +2656840168 +3015628205 +1616848824 +3812476717 +1143901272 +1347650641 +1285911130 +2257125038 +4017992630 +2733318126 +2250124352 +1012073225 +3556248563 +3799333398 +1081474291 +2554332569 +2055375111 +2974680267 +2682795258 +744453425 +231481925 +2442095540 +1099034061 +781806065 +49047325 +711905096 +3054527858 +557800484 +2562022676 +3251662125 +3336320032 +2221161626 +1298910980 +3668992322 +321675912 +748032424 +2891258992 +391992789 +1389168357 +1739214362 +459419496 +3639200661 +1732953069 +876914495 +2440782364 +756114409 +557799621 +1411671445 +447790123 +1966479863 +3667588260 +3716594684 +4141731860 +2193299740 +1602463619 +3028363621 +285179643 +1240872569 +461997090 +3360353040 +1349178752 +440561904 +3902688686 +1299545870 +832666804 +154698162 +1561921247 +1160079095 +2749514803 +2983889046 +2845744836 +1655407258 +1005696963 +1899808477 +1715837006 +1865562401 +3724916714 +1317895556 +4139456886 +975293848 +2705313024 +3959698516 +1269173818 +2602663088 +1863868295 +3389454144 +2981226436 +4199660507 +3741336863 +4046467935 +998837050 +1730225229 +3069654762 +3165149539 +2112978785 +2503119184 +2428140284 +182208202 +1016903190 +3576217787 +2007125911 +2961557793 +852271552 +452968493 +515423071 +1687592390 +1483595520 +2925998341 +1493716323 +286265442 +2470381769 +2609176750 +3078623045 +657507255 +4097715870 +4210770984 +2320800203 +1900930525 +1426307357 +743532714 +2977787630 +2724023766 +3485031765 +1806623997 +277708228 +179569704 +3497489813 +4099061302 +1476733276 +3372498051 +2391992002 +2497636584 +2829031262 +4283912347 +1137116873 +874841505 +612223941 +915225645 +1927027595 +3668750297 +3277429777 +41572078 +1149896172 +3925988791 +992097300 +3403238346 +1423836509 +4049774243 +1318291246 +1518241992 +4104894369 +1140628975 +1767443316 +179949066 +2261683644 +2935442127 +830641857 +4212805569 +4026005383 +1456276230 +1843667449 +2000917977 +4153003812 +2528684661 +69435810 +1349278108 +367274102 +2192128459 +1336996793 +463505102 +2893411780 +3493633733 +1474366411 +3161822587 +41871998 +1138153582 +2793614770 +1421885113 +566848038 +1158952809 +467420036 +1391213535 +2599532496 +447810156 +3597338706 +3514822890 +2309984660 +517694367 +4072776802 +3674497208 +1807105732 +350340541 +1573291291 +598696226 +1403096253 +1677383233 +1147814376 +1369051262 +1260174990 +3493441354 +3106046432 +3356007350 +2497268544 +3702514981 +2330071268 +2221908886 +3632056976 +2103563218 +70753255 +3490195431 +1740395120 +3730814942 +3614693040 +3954934761 +1823585623 +534530284 +644912344 +947211113 +1243002307 +2050847942 +1789482219 +2470705164 +2028118896 +3502617682 +936059029 +2198823232 +3611405669 +706417818 +1273531781 +648234696 +136620577 +2177176128 +2783862586 +1012908017 +1910502064 +3164983519 +532822229 +709423775 +4176677440 +2999834008 +3287109330 +1014168351 +2799220746 +2840152596 +1652910449 +3957030899 +1064671281 +87216439 +3917811800 +3061101842 +752500283 +326580866 +2042940817 +2697949797 +2712525593 +3435599011 +3101490412 +642698214 +1871527221 +1266929039 +3368859798 +2957873600 +1610376024 +173640245 +898114815 +2929430121 +1064829412 +3350014791 +711495375 +858808433 +724591266 +3930159138 +1916715452 +3302246195 +517316653 +2791031237 +1553794982 +2134593724 +3345362912 +2987216235 +3110983445 +4124862528 +2108942811 +2113997396 +365303813 +3179988367 +2068786288 +419020755 +4232016494 +4272683098 +2972469603 +984689449 +1800023969 +3195886103 +1883817176 +1177997342 +89497099 +3338180098 +399978387 +1786916042 +1817143281 +3272528294 +2279203897 +414884993 +1751993706 +742043644 +255417484 +3826234878 +626368200 +1563437813 +428611840 +4275101212 +142593445 +1475342431 +3775408867 +1965394321 +44488477 +2274206925 +3440410714 +498747230 +4163555716 +2504221865 +576483589 +3947380149 +939245955 +1640970819 +1443121292 +2617916636 +1562263261 +2717528450 +2500730660 +189829817 +984352464 +1961071255 +838900979 +2663694459 +2679010290 +546318426 +502482898 +3057545998 +2551255311 +117738809 +1766099164 +1708343083 +2991661740 +4215304885 +1096512556 +1014747394 +2236440061 +2004368666 +351266173 +1186443552 +1206816974 +2594021620 +2792699120 +3282129274 +1491045585 +3448472593 +3904977558 +2548200827 +2769530210 +3176289174 +1200614814 +2896306108 +1935090937 +1181956876 +2832100896 +2529835215 +1666275138 +3916994466 +998056788 +1569005715 +4093154519 +4262866682 +2685844224 +2039744777 +317656239 +23635496 +521989195 +3868830140 +1216283851 +3761578600 +3127872598 +2547468528 +108481240 +3195324298 +1187106754 +3273844045 +2062952919 +2922203657 +2512368247 +1935840022 +1577058646 +3159346255 +817223604 +2948232082 +3752252437 +169510430 +2146352242 +4173290217 +3547978877 +3346640747 +3335419486 +2540929601 +3107779519 +3831888665 +3096066858 +1243676725 +1885440018 +3157514562 +2412223362 +2797738078 +1444192266 +1548742665 +1475447138 +2552697058 +3806379223 +2480465595 +2624631352 +2824579072 +417368802 +630231552 +2250005182 +2822271013 +2374758608 +2740813009 +4049411132 +2191623148 +3082940863 +1016233841 +2014568449 +1429333224 +3976777294 +4160953191 +3261188618 +2739295960 +77304324 +1592418296 +648474623 +2845350688 +3694160969 +2406253797 +2940120264 +3684539407 +815869273 +1590291475 +372869309 +2461078823 +453748093 +3950025395 +405526666 +1573550292 +3250683511 +2687227069 +2631449907 +2239561126 +3699058829 +2206797640 +514529622 +718096438 +4270521216 +1938748397 +1394305689 +624332850 +3996992685 +4168809140 +3998557738 +976668486 +3264171239 +277871735 +1599981264 +3497768521 +3602533923 +456988544 +363265418 +768876728 +1927245978 +63016585 +2104925071 +63231954 +966408198 +1363328320 +2855282938 +4213553057 +1399371818 +858982906 +3308168545 +1181479873 +1790979912 +9952288 +2977695574 +2117908928 +82697936 +3073918473 +2979787818 +3584289545 +2968671219 +3595989940 +1112262853 +638773180 +3988637905 +2791885072 +4099018993 +292509580 +1864319611 +3343800725 +2272557518 +687983558 +2281459281 +2965619136 +4171864154 +3000485968 +461805910 +537495899 +472784663 +646378825 +4088165977 +3479535959 +917963863 +2428941973 +1958764201 +3045156291 +2233801881 +3855505675 +2826487791 +3740735680 +785924809 +1987484896 +2078936472 +2256374739 +1327038955 +1013253884 +969218582 +3595002268 +902572152 +1657629493 +1038919879 +2727983764 +3379377804 +1779141384 +3492544402 +3770803297 +3757079277 +2746144673 +1664064122 +948462453 +2647013363 +2740659282 +1970761406 +3140288333 +1790430496 +3491031507 +503700894 +2476958682 +204353858 +4277473096 +908698352 +2691244418 +3472550748 +1609448545 +1459428139 +3750081373 +3740807105 +791104748 +4087912515 +294158392 +4152884451 +3107900614 +3745086503 +3082933352 +1063247437 +173838778 +4080046799 +1732731011 +80120608 +1150165458 +3645295592 +503763697 +1227478041 +1465959674 +1889837976 +4172762198 +3412575905 +3453616454 +2405774360 +1502718655 +3044803045 +2336859252 +2321974182 +3128636769 +1924094794 +1924026053 +1372681863 +947389367 +2553232638 +642912823 +3384054934 +3471225387 +2633428360 +2310564238 +3709554363 +2512143751 +884836654 +3730914839 +1440641846 +495859363 +2028572570 +3543939625 +1966842237 +1037726542 +3828427270 +242522406 +2726715302 +3652108153 +1946921427 +1808379592 +2638282033 +1561867132 +2786591960 +1666015051 +3927553647 +1857525078 +1328976671 +3815688857 +3248013878 +1413607248 +3435594563 +1046540133 +1284529831 +977450130 +568639648 +1848594947 +2708751716 +4292304578 +3829497817 +111954890 +200919717 +562191629 +1835515764 +827363727 +563305021 +2214315880 +2196109666 +1611428212 +1226243346 +2857797393 +3536022920 +3988969785 +475887735 +2059967747 +2653441948 +3211147223 +2800929125 +3701455618 +3002163553 +4077280187 +4105787564 +3522671601 +1031478185 +2915919222 +3868971010 +459102514 +1359298065 +2985704683 +3049077248 +2236210877 +4164333285 +254912302 +2251393583 +367410615 +436512978 +3143653190 +438650594 +2759779852 +1853842494 +2599142548 +1739781219 +1462941622 +1428729429 +2359643381 +2062717380 +506201045 +3316400801 +2491060184 +1125963013 +4008147411 +454740262 +2899483734 +3063768707 +2317091592 +3538284137 +1527277385 +1468489988 +2171710946 +3711497278 +1227636501 +1341007697 +3436511688 +1271420555 +110413289 +3833803143 +3152018392 +1058165820 +172298632 +4290541278 +3280871914 +1567754769 +2884916629 +1640981303 +4154831071 +3453909683 +1643209626 +2512128536 +2395365654 +2711505716 +350318653 +1995827271 +253288679 +1950547122 +121329069 +1628990537 +1827650016 +1895850563 +3295015445 +1918830443 +1285751343 +3593460238 +1042546282 +1626130572 +1030312476 +3524656758 +1436578987 +2710706244 +3191785377 +2123967731 +498336047 +3543733358 +1580193987 +1719407233 +702067871 +127572679 +1697819348 +3011688781 +1827666794 +1877124517 +3521429057 +1921413709 +3438106487 +157774410 +3908868482 +2827581239 +3479869402 +4038860167 +1653059929 +2625192523 +2805835987 +3836367982 +1703314052 +1241640539 +3676280870 +477026631 +3512635055 +3783920068 +186316848 +1474893043 +9639138 +1493897874 +4029918129 +2854967539 +4255883790 +629610776 +160890661 +31136773 +4209539381 +2860051483 +2443932599 +758166120 +2151014095 +2187861249 +877033329 +2774398491 +3527603126 +647515886 +2335146023 +670254665 +3533031183 +118518981 +211455576 +2684236937 +3623288443 +3242189560 +657737362 +2760081509 +795711016 +4045787378 +22721158 +2805231281 +2077344448 +143141771 +2458239256 +188338053 +1051143594 +3792484298 +3077236233 +2889031726 +3539855952 +2367869319 +539804457 +3067341490 +2162163001 +1429158556 +4146889901 +2072033278 +2722141736 +1219331270 +3864977547 +1988663955 +216513897 +537372552 +2888178290 +3892854692 +2394707918 +73168456 +1037053390 +2113113511 +2736926780 +1854732860 +3288951000 +781205584 +148625777 +2167091171 +1336336096 +1823179593 +1354511947 +874605856 +296825270 +2127689678 +845636297 +3709487042 +2158762349 +1141892436 +4058043871 +714829652 +1750878781 +2330299972 +4252582863 +653238139 +2422700351 +3526909478 +3784560226 +1004701238 +3999407749 +2633895509 +309581630 +465441891 +927240865 +1385823038 +3116537748 +1529493097 +3872116303 +3232046307 +1013512544 +3060295739 +1753366682 +796466994 +1664860768 +1357765923 +96045458 +1531537106 +2322365341 +1933493896 +414835406 +1210205649 +537172242 +931851747 +616782222 +516331241 +1012569285 +1823281471 +2396307933 +1020198167 +1682962882 +3508260251 +2288190394 +1082248452 +594761392 +4088822248 +2881568149 +153163435 +433996639 +1003734899 +2678366529 +276964931 +3239301896 +3602688878 +210763555 +4114156521 +2935774080 +1027772626 +2398524558 +1818242005 +2792852401 +1284541068 +2564119158 +4123077280 +1484365920 +2555222260 +2913105614 +1079169046 +1774880534 +788254756 +2915733793 +1993038751 +544697832 +1278235039 +37722610 +4023567429 +2601229565 +1172192962 +1537505814 +2589996301 +531444421 +3185544243 +401315277 +4072359596 +2726366626 +1727795309 +3634777561 +3290517248 +3935512009 +4031482011 +3347754557 +3641999466 +3972692612 +857119232 +4026888343 +714844359 +367596127 +3588026486 +3233780460 +1662645188 +1740453829 +2343805122 +364093557 +491409659 +528942590 +4026239253 +3852334845 +1842475611 +1961921173 +1167521621 +1544219386 +2019190850 +2981672044 +565134750 +4221738741 +4043455778 +2088922406 +3943353476 +4130024801 +648731938 +3881254648 +3333239143 +877624333 +3145106145 +1308249775 +1895091086 +1495523004 +337315113 +2701414575 +2429263200 +1004803070 +3518103173 +2831376240 +3786975516 +2667949906 +873932682 +3253335612 +3876092498 +375318028 +1719291519 +2143169154 +572261464 +2499449231 +3031169166 +1327603506 +2917510217 +1120945145 +1354494072 +363154694 +2608351526 +926254564 +3296212136 +2970008792 +416691410 +4246919207 +397185453 +2391412465 +2205304967 +921342779 +3125862620 +466290190 +3288251362 +943201100 +2579083796 +3225735447 +1701657929 +335646159 +1240952538 +3410008866 +3933554981 +1378164567 +2055860402 +2104968062 +625583034 +2912534199 +395713245 +1440958670 +2929263626 +2772408339 +1062297001 +3947469679 +1827688339 +2998098960 +3474717338 +3309872438 +1416882752 +60813770 +3970036385 +3416061703 +766763108 +3180067705 +4250634038 +3111952367 +3247927454 +582952232 +2472878601 +936991574 +2716007723 +2623608477 +2634419457 +1129139338 +1985974403 +717999322 +1106319946 +1390679928 +3672329570 +2148383262 +3445866674 +4106667313 +998108521 +1336193095 +1525142215 +2829742950 +4190138105 +1452647123 +902980588 +3816656609 +219754962 +2653823226 +487716202 +472449694 +491525436 +3049657386 +4190257471 +3750810315 +1075537240 +1499586492 +566137172 +274777397 +1689713812 +435950630 +3798729452 +672195204 +1805486011 +2218827045 +1164773797 +1568660257 +743372613 +3515468557 +598629169 +1475461845 +494158549 +4010408211 +469990939 +671464457 +357335066 +1364865200 +1852739113 +1109685761 +880513638 +3986845734 +2990783194 +1242583354 +641189669 +2248899470 +1033537315 +3203216872 +1875330246 +2256949331 +2223212544 +3681030640 +1227359113 +1404250798 +3960620711 +525796886 +3378340351 +2956954346 +2760390975 +1833811200 +1654800032 +2708754625 +349637141 +2032793963 +315130649 +3715430284 +2248866129 +2862271043 +2471737830 +1894870145 +1977450241 +991966158 +1148355472 +110638331 +3644699312 +332962483 +2767514500 +2106805816 +1083927125 +203594798 +197318997 +963380277 +4185342550 +1669482731 +1105054259 +3257931357 +1479111044 +948370569 +228443986 +3119010726 +4257799681 +920358075 +3752279581 +1917127281 +3270954036 +2848068905 +3450867837 +1303313239 +2089900612 +2646508228 +2864787132 +2594548916 +3095266805 +2458667673 +3463983645 +3375179053 +3907119090 +2356927627 +1907399088 +3738895611 +907258841 +1641978057 +3064130077 +2648606676 +407704009 +2695709754 +3709634761 +2007749723 +1114620365 +741906399 +2469723339 +1742705472 +1788990747 +3306288643 +2619786045 +4203275255 +601920798 +2637934088 +4042713259 +3585224826 +2621384525 +1822687661 +2159407388 +889302426 +1441510000 +1298489969 +664329857 +1871349791 +1888608042 +793412444 +1835482947 +4055631953 +3903243498 +193645406 +2950551920 +701193453 +3877359379 +3197120259 +209991703 +3890932735 +3438000905 +1308191459 +3619540468 +2356525390 +1208039345 +2664130256 +2330139327 +3833976179 +3130421938 +3273246370 +2256091566 +3403386429 +532044154 +1294459018 +893678480 +3051981405 +3421017350 +2487987673 +1667123925 +218579325 +2426589446 +1982245784 +3110474687 +269009137 +2039107284 +1280596473 +549933724 +2899806667 +1623973434 +1640469902 +559566689 +2952529770 +976555304 +4104229491 +2581877519 +2875247302 +2426651909 +3275201537 +1529999588 +2423175954 +1230373900 +276778343 +1148354738 +857508284 +3473389755 +1993284544 +907058553 +2909322811 +208691703 +599749737 +552396891 +1604783062 +3017579122 +2392489408 +31461904 +27807980 +3486398897 +2667394267 +1544411615 +3658084606 +3529989844 +4272285751 +189191113 +2936791350 +3165340405 +2187860616 +625454873 +3075582495 +2314998587 +878003900 +3819782524 +4053692520 +1200968311 +1979941917 +84422463 +809238780 +2065014332 +2360978266 +4213675286 +2368274780 +3148307188 +2816020448 +2768980224 +2994021283 +1702497457 +2602585952 +502503261 +2738769041 +729590068 +4103290326 +3129727179 +1118739011 +175028913 +3467428204 +102608557 +3926592357 +233484133 +2029260452 +2064220980 +1972901374 +3407131391 +488540820 +1174609418 +3171458451 +639162559 +832449777 +3865874325 +3946037072 +957272122 +675900480 +885535937 +446098052 +4227349623 +2409664402 +2057699317 +582531129 +2094790402 +3606721896 +2563398574 +2970130063 +786995530 +2158175123 +22863483 +2127187441 +3914280713 +187461810 +338506327 +637187434 +2596057900 +192242906 +2841427152 +1614561807 +4092067892 +2299511636 +346936576 +2633527478 +1629318303 +2730816333 +42706952 +53648146 +3679499887 +1838874463 +2896816885 +2444829595 +2613437537 +3165885625 +3580542990 +1282193503 +3407510707 +379517752 +2179549787 +3536929992 +4108420485 +3961590162 +461057755 +1810686263 +4105677893 +2592850351 +3523623411 +2858489195 +1669568496 +2521829275 +1050865853 +168691876 +1308900931 +1144865842 +2870838646 +1052922347 +1107887608 +4123012752 +3815578526 +244155629 +375952683 +1529612913 +145903942 +2238024302 +1958119076 +3094072276 +1649568554 +3942347306 +1086095447 +4024767408 +2873526558 +3799752805 +823655220 +354697641 +3786715808 +530351069 +1837362049 +3240979167 +1436497197 +2337638153 +2691551732 +2339741436 +2506795383 +1049004829 +2960816824 +4044870380 +181425907 +1638829027 +1704608490 +3994236297 +777972676 +1800681243 +1807882043 +513924527 +3408526397 +1187980819 +4171657867 +3200723026 +2284178388 +1826143665 +3972239607 +3186789004 +901391703 +637790900 +1291468291 +1581301446 +2113478568 +626975043 +792719510 +1635499387 +273174554 +260177908 +2898005622 +1118083369 +2129170451 +3242986418 +1878225331 +3017401705 +1656649526 +312930095 +2344928157 +3991798791 +989209589 +4250363562 +816236765 +1627977865 +745841916 +4243751559 +3763530133 +936182221 +2164950744 +2650299166 +1729188915 +861756600 +452013555 +1713107881 +2637795695 +440355462 +2049023424 +2589475688 +2867382271 +3462570495 +1603388558 +1173862468 +156545566 +2083285178 +3917992869 +1693826137 +100101070 +991836432 +1905891767 +2605409657 +1285564325 +1540145504 +2359394433 +2252548570 +4088468394 +2048683694 +3142100771 +1079599872 +293421446 +1436042900 +2908892678 +511819856 +3733265427 +3171772465 +2253765025 +1553729422 +108378565 +2838831876 +2696844242 +3505098048 +1766790909 +1087599426 +3561338020 +3345581575 +4088750777 +2712050579 +1707007351 +1189273847 +2377510162 +2054030092 +883465205 +4172000957 +4046581337 +1078599719 +1162268096 +857129488 +3146204386 +235801304 +3846475176 +2059482904 +1257504634 +1978132624 +536370050 +2929083322 +4294729301 +3623431583 +2426489071 +4132380496 +2473966199 +1631287112 +2229145532 +1088496656 +1767193136 +2800884805 +2805047542 +3743501042 +2336822125 +1615475722 +1507812708 +2861643668 +2039476413 +2156828960 +2558414104 +3150507886 +1837506429 +472686661 +2078762469 +242416161 +2857824819 +3533849195 +3436582554 +1516936783 +3115291583 +994250636 +1044576464 +2465610668 +1401081592 +1160955351 +3111537387 +2704285958 +709012 +1991577452 +195250786 +3678154969 +3155120448 +2843603140 +589309650 +109981009 +2791024746 +3960759929 +3737163702 +3031704516 +2354608168 +1407711956 +3269219134 +645540877 +2745259926 +4109086411 +1541842087 +3259418488 +3403516671 +2997902936 +2643088655 +111474575 +1293554210 +2409636471 +3213889320 +1379405981 +4049751152 +1020849274 +3600235462 +407522209 +2375585100 +796087124 +2327207781 +1199404926 +3057490830 +3044891121 +2765779480 +2739871118 +2716960935 +3193825217 +1664479999 +1639878783 +3421758574 +1863424409 +2428594981 +1421730926 +1902303941 +631410217 +3971147937 +1564407291 +1605172270 +1330392264 +2499449885 +502628327 +2234525742 +3783379254 +1609804389 +2896148341 +3147364257 +368108959 +26722575 +1774985495 +831275676 +2552700897 +3528533257 +460397815 +4150112387 +2570503116 +1753205331 +546211059 +485299014 +3608726072 +1037569642 +1370913265 +830614895 +762958599 +1247056948 +527271953 +1918537676 +974345927 +2087723958 +1948213887 +1966565699 +1083174517 +543570688 +3631912443 +1549841820 +3841971589 +457014935 +287816739 +580325671 +3434889461 +2881964626 +329262166 +1450084997 +1802163898 +1558366248 +1289644725 +1114603319 +2076095423 +522024405 +4188088059 +1274419424 +3423592474 +2465975972 +3772009281 +2742418257 +3702476689 +1734414447 +3802175852 +3567871759 +430630147 +2407142191 +3467715557 +1360704679 +955208170 +1365427829 +3602269064 +3055695962 +665080048 +3981051497 +4056478989 +1400780321 +2120221840 +1112625724 +3725781805 +4049611520 +3697475952 +1912588356 +140045535 +2034878505 +3356601198 +3006943304 +2614749229 +4184320029 +2695508921 +1234892190 +2136955088 +3288979242 +812930464 +3192068314 +490200017 +3848439145 +3855376629 +344898982 +3425665444 +3587105883 +3170832711 +3980454264 +2595053813 +635106999 +430716352 +453606438 +3056416645 +2508039012 +2116748265 +725538189 +119312423 +786947679 +1107174960 +2498610304 +3811605200 +2848683065 +859584423 +2286742697 +920842739 +2927695023 +3240860682 +3988327699 +616703336 +3737658339 +3543217135 +1269430695 +906741922 +1268326088 +2382446159 +2304265302 +24250506 +1070133516 +2646910000 +4042862389 +178188290 +2305378272 +3845299736 +2633894203 +3251062752 +119968394 +254299016 +10100816 +4265208826 +3175682452 +376626895 +245036439 +1092872025 +2310790917 +1910465102 +2540531343 +489134299 +2315550139 +200316420 +3007265965 +811700220 +932908240 +3583901710 +4248102817 +3453332964 +3981704423 +683058298 +117601873 +613453132 +1535755108 +4148295106 +895537581 +3247152126 +2779846209 +2637518466 +935113161 +3472879976 +3676354683 +1290334829 +3805107066 +2204975850 +993977782 +908056721 +2212991352 +3748179331 +572118808 +2173385405 +3322370722 +3530821679 +3810365891 +693814130 +1027559085 +495669366 +3235948416 +3819897208 +4263014353 +2631337613 +1077302804 +2709781321 +4062962008 +71363998 +558351324 +2853672000 +1715179116 +2474556114 +1734643119 +326438570 +513128655 +3658107712 +1947508607 +177937120 +3049878063 +4169969512 +2943443389 +1921297307 +3180236464 +1519845970 +781375225 +3961289122 +3462241872 +3198532593 +874825126 +3366395050 +1500837883 +3004453246 +348687054 +1551052367 +461185061 +1006001081 +2031457316 +910641949 +595587406 +3002192170 +1588736243 +1848043433 +4083007202 +1846348162 +2686545938 +3821449843 +334780985 +1208390865 +244813644 +3760330285 +3450548348 +1890142153 +1546613638 +352862440 +418436215 +2924444639 +1252099792 +1049790208 +2143771351 +2250807464 +905860539 +1387073409 +1395533638 +1890376836 +868591490 +2233824007 +926220677 +1655655747 +3677650647 +2721162051 +3591557301 +3731478914 +3134578418 +1587481474 +1567326961 +313587006 +4034317697 +994705160 +3438061744 +3139267937 +3591193622 +1579779961 +1039656678 +768753368 +1845740515 +2459926231 +1859626044 +4028644776 +1473114037 +3050798273 +2267872173 +1063605642 +3237018564 +979232420 +3645293219 +2933507375 +504676187 +2714990434 +1975699405 +2150743268 +3482888698 +1075944421 +3744925351 +2792754959 +2836909639 +1217772294 +263186949 +3630745851 +796634324 +2178486424 +895962186 +1030317729 +2531847716 +3725006080 +3086073702 +1715983790 +4071633445 +1831162935 +2324615519 +4116884974 +11086812 +810963506 +1113732206 +1249214351 +2055403946 +3350941441 +969016727 +1845773417 +337586456 +2957149184 +1495934058 +4060512512 +3846158337 +4291438267 +1961307094 +4041359607 +4181067148 +2100189451 +109313776 +48905154 +2192366214 +3456643498 +788297132 +491337227 +930386724 +2339916930 +3716844385 +4224231760 +4236535765 +216267215 +2321429809 +1908843364 +525306394 +189204709 +1141386852 +2514906000 +1514525159 +2166987341 +2062800216 +4040706685 +3567123536 +2168033630 +903091195 +959738155 +755927574 +2909750826 +887728301 +1513092207 +591403935 +8806202 +2637888632 +625424572 +844686298 +563717788 +2423574317 +2127567808 +2434876690 +3175959018 +3813992248 +2071586922 +2671489775 +3602043441 +276173589 +767883057 +3809329017 +2952154501 +2709154023 +420933336 +3025935637 +2706751676 +923670346 +3911029241 +436654366 +3437094734 +3004785877 +3930663493 +2846922269 +3317102215 +889674196 +937755382 +1649691453 +3598600207 +1066279074 +4098933756 +4192789984 +1338792879 +2749176256 +846856261 +2146343439 +2851837681 +767464130 +199707439 +1146717613 +1431102592 +2953685783 +3214148807 +3515379768 +3341434194 +2008329012 +1005655680 +4146052486 +2271310300 +2602333105 +2129873169 +4150866428 +2737854176 +4107383589 +909098174 +2282630823 +3379299292 +3177925867 +2807672153 +3108049745 +640582529 +608718715 +1565491949 +3256856901 +1958209850 +2739457564 +3967018634 +769855457 +3230728145 +848204430 +375953777 +3822985801 +3539052508 +2163998314 +792861706 +1579622607 +4156474522 +523342740 +1972573428 +2485236827 +2945308728 +1774829899 +3177041192 +1229003712 +141639569 +2341250486 +1156857034 +500805990 +1921040027 +3754738485 +2347102774 +3839824835 +3865450402 +2867893261 +3351635128 +975084841 +2017727255 +1500457228 +3557437019 +1935346986 +750337094 +1779823067 +843692156 +779483541 +835711429 +3842530311 +2050451765 +1698752606 +977851545 +3754057407 +3883910640 +2222985554 +1445016893 +2233330414 +2233094068 +2643337899 +1046586994 +3920471381 +3642606591 +561208034 +942368688 +1771869222 +2838368529 +3783252698 +828618122 +1648090218 +624958942 +2338871664 +1023585984 +1211143672 +2133630636 +4085399789 +1730340223 +551588852 +3819922330 +4286411510 +1613497207 +918955445 +806296635 +2075359249 +3270008253 +2620124805 +3002905047 +1470494380 +3864066357 +396760747 +120818777 +2200361344 +3238774970 +259578041 +1843035906 +3277399140 +1560426896 +3567162196 +882019477 +2603025849 +2626260383 +1212979400 +2524769443 +2953363200 +3198120553 +1311937922 +1690463208 +2153887353 +2561833041 +2629375308 +792880650 +1576690203 +1946281136 +3637373382 +3774235544 +4188448495 +3331319021 +2711111469 +3792232548 +676657137 +3666844049 +2821679692 +519521290 +1785318129 +3440715488 +3933604687 +940805686 +3494161737 +3730506087 +485528519 +2719795371 +3582257070 +2824959901 +3467765748 +223406677 +3096252824 +2176249847 +3118427064 +2428593832 +1656790615 +1380808858 +2951209336 +763364743 +1424793027 +3616052600 +3569737515 +3489167627 +645162457 +2586186530 +3225622130 +2094255190 +104110478 +3999557162 +1702722784 +466189402 +3954345890 +2234817226 +2044385707 +1181494863 +2314074392 +3756844610 +2662892898 +2470271428 +2645587886 +1898655541 +347190958 +1746349722 +4131792858 +3249726498 +2616625905 +438982537 +2382665112 +1136579816 +524214146 +3665475037 +3137172245 +1293964314 +2717781984 +2386179077 +1223350053 +146273001 +1614023089 +1481071503 +1724197938 +3452187805 +414537671 +3936128058 +3401747344 +3792304698 +2479328864 +2863443972 +3000220191 +983117034 +3133075284 +768498027 +1232524489 +3992722732 +4271734892 +1466559007 +415247056 +3224904626 +399958803 +1221328233 +2430425081 +2097280487 +325149996 +1402605581 +4065085460 +1126738687 +557613851 +182046814 +1764661010 +3988668242 +221803839 +1773966121 +1539203152 +562122772 +4142410177 +997974507 +3813166431 +1213632754 +3530788849 +3437351765 +3649674365 +2586279250 +1613883629 +3642833769 +2860438255 +2013796889 +1011861755 +425080275 +159030800 +1965719193 +1563992950 +4049736201 +2923209230 +618420243 +4083419058 +4067991252 +4155296416 +498523229 +2915485921 +3752451992 +2960916607 +1846483445 +1774570846 +1690113563 +218371647 +787549555 +1330407473 +1889476041 +2474390125 +2866896909 +3829346059 +2541648185 +2559766705 +3165243056 +1161554381 +190705178 +1679051243 +3501292922 +480598530 +502189995 +938730122 +53234998 +1115609437 +3350561392 +3440204968 +1820548185 +2074446656 +3528821729 +4256883280 +95209052 +4051063159 +14290475 +252355716 +3838404182 +1604540708 +397990049 +1906499159 +1240242479 +1934309384 +3187722300 +3851865253 +2118271237 +735124666 +4060860878 +1315916131 +2714182573 +3315989508 +1530091927 +3290803045 +3030038947 +2500816966 +2079910693 +1671576297 +67423968 +953700703 +1767995735 +2899488729 +2729083410 +4243905646 +1333191711 +1923200653 +2594120414 +1031651738 +1943602511 +898927058 +143769277 +2272062548 +3787329623 +1622947328 +2356474911 +1879596021 +4292633597 +1212501414 +683918951 +1649705769 +3248094365 +1593951097 +1343761867 +2443311129 +2662183836 +318176405 +2136863855 +679517934 +4124273329 +1593032172 +4042182818 +1625586075 +1637867167 +2298296721 +1339379040 +157487347 +1264997333 +2499748511 +1641754337 +3338574560 +2871508522 +973944131 +3717771750 +3370628125 +562533421 +1326918111 +1621179529 +1995043899 +880119640 +8563416 +4284957881 +1729423588 +1428271389 +3301860114 +1332344593 +2976488115 +2044851047 +3829408657 +475612108 +3041153068 +1078060594 +979844044 +4070030184 +2647682067 +3543014095 +2405880075 +1172671922 +1251148243 +766248357 +4194947350 +238863195 +4099336060 +176570527 +3535762554 +3168912063 +3743689975 +3906616201 +273441452 +2237175329 +3572274834 +1304993883 +1798472521 +2077913329 +1730563174 +2140651603 +631636277 +3826932966 +3409258614 +2359888984 +2110587973 +3853091412 +3928939022 +111458051 +4134894595 +3797727058 +1067116248 +1526855863 +4107549618 +2097962615 +3716733810 +3579358025 +3789802492 +197511769 +1277070218 +2349745898 +1318686433 +4027894761 +3243632374 +3443933962 +4117796954 +3104589392 +1275144945 +2223997736 +3319686217 +987155727 +3582200766 +2160127194 +557880563 +2647610064 +2798073115 +2470081242 +2714759264 +1206561810 +752009344 +3674295465 +1208355805 +2845722718 +1310703030 +3283600367 +4249755835 +1797297054 +3387061681 +745057021 +1406100931 +890568071 +1891355762 +1432146571 +1635789927 +3850574367 +3486475903 +2613406607 +1416735081 +2697791464 +3809183825 +3480993777 +1747671688 +3495465608 +3992674552 +3485917099 +3442797199 +1947557498 +3165686391 +736097282 +2159049088 +1805813734 +1464352376 +665699272 +926710034 +1206525340 +794151434 +3931075016 +3288152840 +930242666 +3178565711 +311814613 +3643428862 +2712706819 +2540597662 +3268925057 +3246620755 +1949611918 +2259802311 +3234028531 +2977285717 +1709361828 +4135007517 +547527667 +903779240 +3802696003 +4092820943 +2621584307 +3935350806 +2658899294 +2299538054 +1633079011 +2371081628 +653633827 +3393575755 +2717509486 +4065065352 +2866884212 +1591333461 +455318247 +2026418677 +2311082969 +313471817 +1336125232 +541163701 +1596785498 +1897312442 +4143086072 +3257545848 +617749547 +2974213707 +1342418059 +137682380 +1781916709 +94210263 +3664954340 +454606978 +1801974409 +1629703545 +399017597 +687640171 +1906586472 +2705504290 +348891842 +1396746752 +2343468957 +3891865205 +3321823588 +1059056333 +2315008013 +1398714405 +2542076989 +3314584205 +1111612212 +182467996 +4073472720 +756258846 +1115875438 +668857120 +901434810 +3885363762 +352684963 +1908462730 +664445567 +1354683322 +2784234899 +3797679761 +611240307 +3648438506 +2029543750 +1031590466 +3411224024 +3890369609 +1315624228 +695550944 +1089590729 +1382410679 +1428024192 +4084379982 +1701556848 +2846568508 +4257677335 +1983258360 +2536053981 +341846500 +3571277794 +3086982966 +3272199897 +3915261157 +4268342516 +1458788784 +2359988032 +2312669770 +4135541708 +2587736877 +275405229 +654747965 +110323543 +276193726 +676699517 +3751904724 +4115979293 +3321954496 +1080682791 +3740169791 +3127556181 +2324080902 +2044998939 +3466800431 +3929079985 +798587060 +3955834923 +1365937653 +2551751690 +1042797294 +4147067480 +3167389902 +4109791310 +106798732 +890016489 +2152124879 +2094509793 +2620912689 +4002388274 +442555092 +2446800406 +2482722976 +1046077290 +1595713763 +1208763757 +1728050165 +1119251693 +2971252883 +4014614260 +2379532965 +3294389406 +4205388643 +1801395351 +3648956387 +2586177872 +1267756043 +256799117 +3704773713 +1595826951 +537561550 +4279507445 +4130409830 +1921548343 +3646750498 +69644337 +1613593789 +500875671 +1265593675 +3885103058 +2615153061 +1695720878 +1969651657 +2744477416 +1606682266 +1222783690 +4293484464 +3309904799 +61143904 +2971379136 +925965496 +1927033054 +52757719 +862070559 +1442095134 +3248058249 +2380210557 +3483847515 +2768270566 +1663836104 +1947338403 +1906207899 +1784999571 +1767761040 +180410022 +3919718954 +1257118834 +1175152428 +53806292 +959968286 +698945163 +1189144090 +2460755474 +1562851608 +3751097620 +964420749 +2876126504 +1758871500 +706964685 +3649560167 +3605906082 +791598367 +414521442 +1878476659 +4293414623 +1017514700 +440382863 +2844526903 +2536371749 +1434626380 +1113457621 +1847424353 +3873992931 +1419614844 +480689200 +86010143 +2768117285 +409336340 +3934621298 +3657393980 +4128817252 +3032510455 +2255018395 +3514386173 +2240916594 +3978361357 +3524748013 +283257253 +2650924859 +3737765641 +2644342907 +2756887204 +2304026336 +705384571 +3611441093 +1777420837 +856568326 +1136260889 +522878353 +145938142 +1794358072 +3913058008 +1630501322 +3405526390 +3707987459 +252467559 +562398169 +3237979095 +790248507 +2810614245 +3069442770 +2823575260 +3644518416 +97054198 +1053608263 +1913832857 +2134146647 +2988628018 +4124773964 +1149745119 +383753236 +2213201466 +4018963928 +3029830271 +24499104 +3785476248 +3025493484 +4211508112 +1240964139 +516265402 +3636405404 +765025284 +2768329496 +1465281206 +4078848796 +2742644222 +273951747 +2189578831 +956923249 +1847415321 +3185208026 +2052181134 +2193378759 +2518122140 +2630759062 +3036167871 +551295217 +1977286279 +1287660033 +2716418558 +676130936 +2239902017 +3754385262 +3520999429 +2229332418 +412432752 +138570556 +215934258 +1452640050 +1129842285 +304570391 +67518245 +256252813 +687691786 +3616034401 +2711022148 +92031655 +2819154139 +1766893017 +858335971 +4185869499 +2450747845 +1262978068 +2797840193 +3324314403 +2901429021 +1009780939 +3254699043 +3615795752 +1035627924 +1795583585 +1866683438 +1263858495 +3004782253 +581166754 +3337262896 +2587935832 +1641351407 +622585811 +4090078240 +1106192728 +3487950614 +3592590663 +455546700 +2488163087 +3189114306 +737348617 +3670307983 +3834641277 +671131599 +2042827269 +761247961 +352936071 +2018719670 +3763251171 +884243260 +3591507103 +3317995483 +3603651887 +1503517737 +1780827984 +2334649477 +2749958564 +157333828 +2411874921 +1687320919 +3647292008 +3488990070 +2185300412 +373070768 +1744101622 +4044310582 +295610132 +2591164670 +4136702027 +2930647742 +3484051464 +654450303 +1507826732 +3174543320 +2851256675 +402607786 +536058247 +1913369098 +3438864894 +230904312 +3899950625 +4027008020 +739699322 +4165391103 +2170398149 +4280928468 +3913972324 +2773319838 +4065465281 +1534813042 +915942278 +499413663 +581468687 +2759396556 +974578797 +2625508614 +4230773681 +2013226130 +3658619637 +1243714710 +3826790181 +3035967786 +1706709300 +943212190 +3935818023 +2612443675 +265710305 +1354648248 +4154057208 +3135801871 +4222984436 +923497144 +932362160 +2872810956 +1095884591 +1876581615 +2099342201 +2310567989 +430765417 +2747676953 +2761172604 +4190173749 +3145021958 +387584024 +4008987205 +285814033 +3167155774 +2697748515 +329128280 +973135483 +1016770103 +1579230085 +1517192241 +2878140062 +2440879867 +1905760691 +2603573351 +3513767036 +3495902061 +739514505 +1327896473 +292674778 +2610628739 +2507187001 +268280250 +2503188256 +3001296354 +2684360402 +49450418 +2766009828 +2705502014 +2129565939 +2427388237 +995329402 +3284458206 +116265134 +2126215829 +2763555798 +173643499 +3298912332 +1033098231 +3618017831 +120791007 +3582848073 +1190291046 +2229846801 +2989666765 +1196062293 +1039968568 +3058006234 +3549768761 +76530251 +2861763437 +1093432954 +4017942627 +1194258840 +4161698525 +1698592439 +2285254049 +548682686 +2523864329 +1564482779 +1195165994 +3147696606 +2276754687 +1071325640 +764459723 +2713469632 +3907171988 +1482719430 +141661389 +781101426 +2254374762 +1145964191 +1092511701 +2030068808 +2678852172 +3524413033 +1113670269 +542805823 +3551296580 +859999683 +3485961921 +2335126596 +1398964427 +949409161 +1554129398 +2239228299 +397615380 +2706717275 +1055677130 +1477876861 +982081990 +4282193345 +1351399359 +1352217616 +3187418638 +158695579 +2975149658 +318409042 +2232504964 +1785162698 +935835101 +490738036 +50022709 +1518457941 +412907642 +114134372 +96710498 +3673531209 +2993392552 +2505483888 +113294851 +2778313265 +2426744393 +223106872 +397765664 +2336671001 +3362947161 +2913067915 +2352854588 +3208562679 +321473296 +3401215098 +983109 +975425677 +1690688456 +4275161488 +1509696701 +1281256796 +3279836684 +493891325 +1958788890 +3446359963 +119309654 +3885395111 +1348582996 +1817296100 +3462272140 +2802963639 +619185276 +2425535784 +1409731870 +1619696449 +1311847145 +940075881 +4185548734 +211755517 +3642911901 +688030112 +1885853211 +461119859 +3075479355 +2627355984 +94340058 +642680673 +1370001836 +2773681491 +2135158789 +911421700 +1323947506 +537950348 +331780052 +1861780332 +1299481648 +3095997466 +950853091 +1090811995 +53996866 +1706022802 +2439456208 +4209833004 +1285536836 +2796242544 +3173541677 +1463932527 +2437078946 +1970010156 +3914003930 +408488323 +4183075399 +3988592298 +2469477213 +1754836254 +1506295075 +2013400588 +2619859878 +3750895564 +1351467627 +188798882 +2016779410 +2038717583 +4119332801 +3519521207 +1840968846 +1047237809 +890537883 +2402553796 +3454610071 +2219188168 +580114076 +1382224931 +2264134668 +3442813448 +2966647838 +1403880951 +2622313912 +1210527504 +3739075758 +1549414306 +1967270508 +2715207952 +3498912171 +1775556312 +1935959361 +1534570128 +1704667537 +957564349 +1566496565 +1917029497 +43982735 +2254666116 +1314530765 +3695957858 +4141837442 +3566999467 +2284462278 +2653865008 +1300297251 +845026991 +2590708030 +2817302398 +2985977927 +3096548078 +3857898460 +437230919 +3328407458 +2851136635 +3518237210 +3313316040 +1720131892 +610380400 +3547660935 +1728600739 +2194869199 +3638186258 +3020299534 +477811034 +1820418202 +1764432617 +497198552 +1433732245 +531570253 +3822805777 +2340676841 +4142518189 +4110711907 +1833793551 +960725744 +3058264344 +2990571925 +3646795275 +625124405 +3459529473 +2886816294 +2456105749 +3848194798 +3496623479 +729200986 +3299888089 +2060901032 +271228381 +3772319363 +2590586133 +3804969278 +1034785294 +3048013097 +3240832871 +44850990 +2077752758 +1991944758 +3931215414 +1089989416 +4084595418 +3082295357 +3102576169 +2390990962 +624635048 +2681453444 +600922880 +3645273385 +2728012176 +2815745664 +2627891749 +1396093296 +4287204244 +1691958452 +1331250173 +735965168 +3121901178 +3934429187 +3780647786 +2435273304 +4184368715 +1196413650 +1579169630 +3605141720 +3260068208 +84284961 +2936868042 +3419076002 +2438533227 +1606912762 +2023326315 +2159493456 +2557595309 +3887521973 +3770319352 +482594308 +1445542209 +552636567 +1957889812 +4099041298 +1834226616 +337716071 +24306034 +4018114971 +1146278923 +3620679184 +2676742593 +2050556771 +4146728774 +281382355 +790096056 +3244248400 +201753479 +1746800856 +1514015578 +3299509437 +3530166461 +3800430040 +1202197725 +2415326343 +1660501592 +1167007994 +1353369291 +1387121167 +1761429320 +1236356071 +193131312 +3402204892 +910760257 +3219022796 +4188670373 +1478637148 +75465564 +1199447080 +470192903 +3354839136 +3178547502 +454529786 +1660627746 +3586231925 +2202806167 +1609138267 +1829564223 +2943834599 +2753984097 +1254005320 +4170826164 +3164351788 +2598680 +262318655 +340285249 +3147002700 +3698181311 +2250467945 +2862355953 +2963228270 +379876551 +3536580887 +4122147345 +1226957844 +3342390291 +965184480 +207012965 +973617301 +948166193 +2667770313 +540109626 +64966370 +2609523889 +3625169505 +1360794644 +3991283513 +2406124136 +2040790397 +2760308091 +894563417 +1668780444 +1861588850 +3819607776 +4104201913 +4006776079 +2638567430 +1340677702 +1583307609 +384561556 +198523880 +3172629985 +130306960 +3632377850 +3938815067 +2667045504 +1537428840 +4244925672 +3116225489 +856400307 +2491612233 +242467916 +2559908813 +3249892117 +3040643046 +40880461 +3620883929 +3325999990 +2986019529 +1980493334 +2535960488 +3123668483 +1452638677 +2641652354 +2747561512 +715106102 +4145652491 +3881207299 +612435175 +2231754746 +3140699948 +2710276286 +702095251 +2016638535 +2871186259 +533076491 +1094957413 +1927067944 +1501574983 +4064333604 +2747138737 +1918561824 +377844369 +1944146529 +51573040 +1710514570 +2101389704 +35014874 +4122353771 +3242854723 +1801484701 +3676269364 +2916635215 +2248867800 +2646635411 +3812730089 +2333685765 +325138324 +742926414 +3412577672 +947018790 +3572490212 +4157495273 +3633421896 +1105082707 +411345158 +700710280 +3701228310 +2495482553 +1191980288 +4243798433 +3874265760 +732986222 +1240300677 +2035674456 +1236462756 +3492342385 +713678480 +1856345419 +288510102 +34444867 +1935623460 +2314016175 +3986052519 +4222898330 +3321507467 +2658318694 +3024170965 +1200235932 +2774363888 +3077141503 +2952418538 +2002020495 +3173696835 +2483056602 +3399812740 +1897677875 +861270578 +3573482983 +1493437830 +365201134 +1348345142 +3263929494 +735470975 +3597712315 +822917411 +1942939695 +3283689326 +348388 +1851912047 +1595879747 +2681532950 +315386741 +2732350333 +205325705 +1299864804 +311372073 +2158212847 +1564262971 +3972608965 +799697814 +3645865195 +104820850 +3875875729 +3580382806 +2091590444 +1460793550 +3928815526 +3406704546 +4154644069 +2305530113 +2140073325 +3008657964 +1889160817 +212254521 +1915119386 +3771578573 +1404089675 +75224001 +3190961490 +3977021113 +2559975201 +2635997043 +1602834359 +3166121066 +3239355242 +4200925530 +4239692016 +1462603557 +2464332240 +1626865342 +3883155117 +4005585391 +2245511893 +1370309138 +1671927928 +3001988595 +1999178395 +405415172 +4020592073 +2685197012 +3865571823 +2642401070 +2878079876 +2650882161 +1611222870 +3678165817 +3311505398 +3165022437 +2787324317 +1125371520 +3916470197 +641850353 +874205963 +898294045 +694443358 +2335822440 +3706343512 +1895081925 +2843497935 +4150783033 +3407728067 +1367065899 +55797987 +2173721476 +3282919604 +412793429 +222365940 +4139698294 +25131186 +1282790403 +658500184 +4182274666 +2067009632 +443684381 +2448411522 +1182762333 +3253891413 +687347699 +4233840776 +2345723506 +3882737996 +1001392189 +1566268184 +4176750435 +962418872 +2443141865 +735717991 +1631920906 +4103394505 +2051040370 +891902183 +3132783068 +534023914 +744753201 +2904838576 +2335196997 +2634589372 +452793627 +3314882928 +1999007289 +1062040911 +1943108158 +821111887 +3874711892 +3910381779 +1970360756 +384926902 +269141906 +3402621484 +2741388557 +698721951 +834770287 +1929291140 +2178763064 +4227778560 +2470696301 +2288130441 +1426002425 +2252960653 +3659721782 +3578584985 +1033889819 +917038861 +3662877258 +2678988937 +2499127705 +3265831657 +3456908192 +243457385 +373210425 +626439885 +1919252617 +3731060507 +560458893 +2478553665 +272947952 +2622612651 +1252080948 +2675630815 +3538036247 +2708380108 +3885022723 +3275337773 +202141144 +3544428308 +3054869000 +415164280 +3810487872 +4294757363 +2918946674 +264977522 +613625556 +782891813 +2262688932 +186667766 +3617280808 +3273293900 +2771452265 +3170797206 +3279197520 +1324980161 +3298186478 +788769614 +3138321079 +3593423476 +3682194876 +2459038401 +770815739 +846520790 +3890661757 +2206860911 +2913691696 +3920814091 +807283002 +2959862876 +944649627 +2726443387 +886117713 +1014240669 +2403148490 +927842931 +3939680977 +715871456 +4056790224 +3855503911 +1335143363 +897887085 +1063898070 +2758538161 +2623627401 +380311070 +1790679406 +3562555101 +464623713 +2653115702 +813962825 +2247779845 +899990744 +509717256 +4269670499 +2895139458 +1562147518 +1880219001 +810388715 +3287356725 +2957473758 +82328998 +4263380215 +2403904510 +1528522831 +2996965259 +3170530431 +1885377943 +3023033193 +3113843845 +1408116682 +2447641652 +3756536810 +3529501515 +4197162664 +2321873906 +304791101 +1295982172 +809675038 +3645134264 +2520546207 +1895007714 +1096315451 +167973852 +3743403099 +2152809404 +4025144774 +913776865 +4242885266 +2904946467 +1737145864 +4245873824 +4100555029 +3016494453 +802506648 +876821704 +1559943174 +2470562801 +1146090019 +2827044301 +1950039035 +960063979 +2399567107 +9385138 +3678640350 +1212148683 +2144266720 +3781244084 +278278670 +321834776 +3754260289 +896593370 +140525080 +1880210741 +4168638242 +908318145 +1380950728 +2078401813 +4124767316 +3686280513 +3686147896 +950103544 +4143847431 +2768943180 +2642145383 +4235421827 +191461455 +3336692058 +1748069617 +3968360977 +2508509850 +3564688329 +2605662346 +1774191844 +1664226440 +1960342760 +1256605388 +1522533312 +1116176967 +1101133113 +1575936467 +191313245 +3441471213 +3995368225 +3216164682 +4183947660 +866445930 +1034421910 +3475020344 +2994036582 +2038752540 +4062058869 +1950500709 +1789063618 +2353685264 +535335489 +995419772 +1021562761 +1355711980 +1604623032 +2271742243 +2931384021 +3745082984 +1532417914 +1211297037 +1018214315 +3727869283 +4086892699 +2857554004 +254063285 +1007397488 +2559631135 +4037785841 +3925712273 +1907094923 +1087977990 +3540095035 +959374538 +1463450657 +3841659518 +3488666191 +1226207515 +2597973135 +664110795 +2574868648 +736450376 +339165910 +1066488857 +3228009012 +1152613483 +300716403 +4082682412 +3351578765 +2067764889 +764274504 +4215944968 +419507292 +755733810 +1267739227 +460352807 +2559511720 +3321666038 +3330382953 +1517247596 +3088211524 +2428079234 +334002478 +978419925 +755020380 +4188691128 +3940699996 +3414909254 +677745754 +2572489431 +304057574 +3955870978 +4138736321 +547202807 +3348008071 +3901242551 +1576327180 +2445024081 +525180300 +3270611131 +1409012873 +1615815881 +3383527568 +2765933819 +473605073 +3426939448 +1211419332 +1301324699 +2376915004 +2929773056 +209136864 +3856012130 +2450961392 +87399316 +3545537811 +3421991372 +1783387580 +2009737503 +3941580719 +741540271 +597643891 +270442411 +193721489 +2502940102 +2635513837 +300920102 +1755447964 +2812409859 +1827340506 +1732046364 +3164331103 +3917017595 +442289904 +4265847184 +3363303773 +3688834237 +343676192 +446576427 +636733962 +2475359167 +1997173436 +917015889 +950893359 +1564803169 +2221955565 +3943671456 +1735062548 +2747152778 +3085332056 +3251644077 +2840842498 +970357091 +1408021008 +2519568809 +3245031600 +3129950639 +1119131142 +3751535521 +978688344 +3445108409 +2204606814 +4181879247 +2364953897 +3882165908 +2072803988 +1637498656 +3287694549 +498217956 +868684082 +3208462471 +587943326 +984123941 +1982427644 +1932816583 +2090310562 +2674196225 +4259690269 +1104692667 +3531745947 +1927350879 +2246329514 +2451321261 +1632224043 +4101213714 +3256561457 +1463834728 +714153887 +3621244098 +990103025 +397992997 +1302037626 +1651169438 +740851807 +2413944828 +2664093505 +3505864590 +3316459618 +995398273 +4009034108 +697013806 +2564137343 +2025703196 +1195439225 +3396626035 +1006508036 +1589112718 +1319727742 +2196072006 +1042278675 +3377803138 +1191644477 +1427857965 +624581339 +4162517720 +1379489751 +3670705390 +466459560 +247114212 +1547746689 +128434362 +2058247720 +1797723579 +830866401 +1906526786 +1532548701 +3435835076 +1890127359 +2668091832 +2615810192 +3466883350 +516194401 +3507456579 +1576602573 +708187120 +4213569705 +4233726262 +3874144522 +2755068526 +2565811822 +3293689197 +733091957 +3639932900 +4088066368 +296200353 +2090266120 +2240284370 +4224417077 +1792804792 +2314609617 +1317471944 +4195185923 +1741163148 +2321725017 +489362029 +747333252 +1429457013 +2863997435 +578440726 +4044132094 +856762955 +2722223651 +3507154563 +2239326939 +1492892868 +2647219828 +1391382241 +2348383682 +741615662 +1040500412 +1163648826 +911295633 +2772922132 +2627600570 +3034572189 +1256137300 +3055412399 +695310340 +1055571529 +2600288139 +4237536614 +1511235650 +1973343279 +2762180562 +1623207660 +2817461409 +1153361884 +1471148290 +174262513 +758747028 +3087997916 +3454513312 +3876866478 +3750564697 +147753392 +4114221999 +1974896810 +804905894 +1911346784 +2837320389 +2260085728 +1773329600 +1534532223 +121188203 +1117136700 +3260307799 +2969761903 +3074471776 +2813875987 +1108028203 +2604509712 +119734535 +2080626772 +4154056254 +2485201636 +3016023117 +4147155728 +3927733139 +1517577163 +3932578722 +2608242369 +191473425 +2039615647 +4165482394 +2094321484 +2233399318 +357954992 +1308020453 +2887461588 +2379601205 +1990775328 +2803190366 +1096079281 +456808553 +1842303540 +1216433873 +4240392048 +726164637 +4033618682 +1657154991 +3010230023 +271053136 +3837096573 +255277705 +2577884490 +3179517171 +2628778574 +2020950579 +3618953390 +1626189045 +3549756629 +278853875 +3437422767 +3635640786 +3602290462 +4200031621 +2117112601 +659190281 +2682702146 +3974175798 +4166223072 +2688932456 +644173202 +2917046033 +1127998902 +3877843307 +2307553859 +662773413 +4240014324 +209825504 +3062984540 +3737101738 +3660959844 +620553797 +2876291638 +3645386833 +3736244021 +3138797514 +3149764063 +2433560641 +306906757 +4254170206 +3773211627 +356419361 +2037478430 +3882386769 +943718445 +3748688162 +2513623369 +1936641148 +3379614344 +4127090714 +575243408 +1054703504 +2077964781 +3884077173 +922366188 +3488645853 +2479392240 +3538010120 +2637270334 +4164633370 +2811262181 +3156726663 +4225532829 +4131020506 +2496794188 +2004420854 +1047074222 +3630668422 +4234517787 +1590844888 +1779640780 +3980268515 +822666154 +2557756905 +17290977 +2581445394 +4217933802 +372760181 +2640294605 +1708510156 +2552160225 +1398685400 +3401022997 +2518465268 +3574050694 +113259732 +2553453723 +238287439 +1218244104 +43759084 +2564628877 +2989602035 +648178461 +797816686 +3735813830 +1523603945 +1490368270 +1823942043 +2236317306 +21722619 +1263111029 +2190890120 +3875188285 +3562642835 +4269423219 +2009891184 +1281708292 +782216052 +493284146 +2458886132 +2818589514 +3635210377 +2931910227 +2822153820 +908331382 +4284465663 +92999672 +2046989356 +2394366699 +96271999 +3920873225 +3480302578 +815347485 +1553725658 +1961476901 +3291575136 +3667015437 +4109116290 +3703628917 +2138703240 +2591828825 +823353204 +2588862341 +3775496805 +1388824571 +52623109 +1879945717 +4004789290 +1195222222 +3042460536 +1464677169 +1867693946 +4222739431 +1282077607 +3334411258 +2332943504 +265680352 +2761127573 +3532576199 +1276224375 +1711958085 +3892043812 +1965994259 +746743471 +2740235382 +204541527 +1928121093 +2079823083 +2264328523 +4150479665 +3121970724 +2305576763 +646019670 +3244891858 +3873486414 +1337734538 +167996473 +1377946594 +4215098840 +3752427150 +3435024840 +629592773 +2387920987 +2192286473 +3851378277 +2054195182 +2101937193 +160500154 +527184210 +2776811557 +3643389694 +1881867209 +455758941 +591593968 +771898881 +4063998928 +1697871828 +1527239498 +433684483 +1907287194 +2985905453 +4208270874 +1915753898 +4255899866 +3640950136 +419788608 +2174491247 +1748808281 +2853003058 +1669787538 +1997085588 +161740547 +816257649 +963874688 +1298336248 +764913504 +1147775622 +2296722402 +1725186048 +660188756 +650819570 +688640691 +3381530934 +1329995197 +1771265376 +2526901817 +2812939023 +2642964663 +2733580318 +3290681829 +650008141 +1302443626 +1162688378 +1572176755 +1058834516 +1362932083 +690998389 +2848517030 +1307350002 +1696690104 +4096988075 +867104308 +1265102008 +3595675752 +1968934909 +132216250 +1365947990 +1529160929 +2032906159 +3853410716 +1749005556 +1529961465 +3892784617 +267318517 +739691320 +4275078469 +2733955770 +3262489581 +1859651871 +2660469019 +742066281 +2626264116 +2459342977 +3984901932 +2499415252 +3459175451 +4078944221 +1748400033 +2630105570 +1034415960 +2657065185 +2701594925 +3625010494 +1637662234 +2359267550 +2768183384 +1760126403 +3191560334 +1512038885 +3655899285 +3945240016 +1358287271 +2340197430 +3394828120 +71008889 +3156219828 +1596791167 +1889114110 +524780498 +3669595342 +1968819489 +2420116555 +2859517038 +563091141 +2280493550 +2977194099 +3063100748 +867687335 +2758319746 +1459463076 +4009706455 +1012475152 +2562540989 +3389350977 +2882161504 +4162085142 +831032247 +3579503541 +1629602056 +1545704138 +1627174203 +2666000147 +1876332636 +1644804847 +2655350157 +1417567614 +1483237937 +852758770 +2265421444 +988520601 +2706945265 +2391353746 +1718691618 +1763158469 +187935935 +84889600 +58475166 +222967100 +3341924719 +3450295676 +2652366462 +3311140489 +4069518363 +3201965074 +587126225 +2712813129 +933770261 +2026335872 +1480454936 +2308123826 +2465192966 +2564973304 +2995118820 +3960159770 +1270003919 +251889800 +3426931721 +784689313 +1462744306 +2762913513 +2305934881 +1579998090 +947256698 +3374565910 +1280757084 +606715276 +1822752234 +3401174815 +1260481625 +3126245007 +677621385 +356951669 +1163837632 +2899634271 +2372459795 +3317787562 +3965114007 +1308481149 +2493689573 +2924102186 +3126342992 +3760318775 +2530597235 +4177601925 +786777801 +129188944 +724540294 +896082016 +405435634 +913107139 +3440492903 +1962357062 +899566460 +400893916 +2596264151 +3675070400 +994654433 +1123756515 +2386161640 +2506845252 +3000100940 +1184830378 +1092781633 +165371336 +418773755 +4275797911 +2773328530 +2094510118 +2662185482 +519612241 +1513872552 +1136764470 +917422290 +3674688424 +927246051 +2711785923 +94806925 +1411585994 +2872234114 +3054647024 +2905688003 +16581949 +2468493961 +3192733326 +2959379296 +4029240874 +2121833940 +3381016122 +903653999 +865491479 +2058555870 +1586445886 +2452086731 +3564666163 +3672746092 +3562748941 +2867638093 +2713204853 +272914271 +3035354475 +3449213903 +2892537905 +2151290230 +1137407689 +648219772 +531037657 +2648455916 +4022976027 +2208589449 +1088698077 +4046049616 +1963767748 +2171691572 +2370328893 +2457830979 +1154906823 +805364313 +1188263669 +1860290697 +2958650021 +1294028101 +1924821788 +3728757694 +2063050046 +899326822 +1825301069 +3086229276 +1802168728 +1218325681 +1478151445 +3377095251 +703684208 +3296867231 +1085317979 +2305823716 +185444826 +2164728262 +2834968537 +3869371344 +3179029697 \ No newline at end of file diff --git a/PHF_benchmark/SPHF/main.cpp b/PHF_benchmark/SPHF/main.cpp new file mode 100755 index 0000000..4e92d5d --- /dev/null +++ b/PHF_benchmark/SPHF/main.cpp @@ -0,0 +1,196 @@ +#include +#include +#include +#include +#include +#include +// #include +#include +#include +#include + +#include + +#include "IntUtils.h" +#include "FastStrHash.h" +#include "PerfectHash.h" +#include "PerfectHashBuilder.h" +#include "PerfectHashBuilder.h" +//------------------------------------------------------------------------------ +using namespace std; + +vector filePath; + +// struct timeval{ +// long tv_sec; +// long tv_usec; +// }; + +double generate(const char * filename, uint64_t &maxStorageCost) +{ + // define hash array for input hash keys + vector inputKey; + int ind = 0; + // import from input file + // const char * filename = (argv[1]); + ifstream input(filename, ios::in); + string line; + // fprintf(stderr,"results are:\n"); + while (getline(input, line)) { + const char *l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line.\r\n"); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string '%s' is too short or too long \r\n",line.c_str()); + return 0; + } + uint64_t h = FastStrHash(l, len); + // fprintf(stderr,"%lu\n",h); + //key[ind++] = h; // load the string hash value + inputKey.push_back(h); + } + + // fprintf(stderr,"finish loading hash keys \r\n"); + uint64_t key[inputKey.size()]; + for (int i=0;i1;nHashPerSlot--) + { + int nPerSlot = nHashPerSlot*100; + + TPerfectHashBuilder myB; + gettimeofday(&gBegin,NULL); + bool success = myB.Build(hash, nHash, nBucket, nPerSlot, nSpace); + if (success) { + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // // fprintf(stderr,"num of hash space per slot, nPerSlot: %d \r\n", nPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %lu \r\n", nHash); + // fprintf(stderr,"num of buckets, nBucket: %lu \r\n", nBucket); + // fprintf(stderr,"num of slots: %lu \r\n", RoundUpPrime(nHash*100/nPerSlot)); + // fprintf(stderr,"Use Time:%f\r\n",timeuse); + // Now, current myB contains the best parameters, output to files + + // ofstream output; + // string outFileName = "function.txt"; + // output.open(outFileName); + // output << nBucket << endl; + // output << nPerSlot << endl; + // // output each d value in d[](dArrayBest) + // for (int slot=0;slotd_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + else if (entry->d_type == 8) + { + string filePathName = (path + entry->d_name); + // fprintf(stderr,"%s\n", filePathName); + filePath.push_back(filePathName); + } + else if (entry->d_type == 10) + continue; + else if (entry->d_type == 4) // this is a folder, not a file + { + listdir(path + entry->d_name + "/"); + } + + } + + closedir(dp); + return 0; +} + +//------------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + // make sure two args + if( (argc<2) || (argc>2) ) + { + fprintf(stderr,"Check hash : Generate folderName\r\n"); + return 1; + } + + string path = argv[1]; + listdir(path); + + int fileNum = filePath.size(); + double accTime = 0.0; + double maxTime = 0.0; + + uint64_t maxStorageCost = 0; + //maxStorageCost = 0; + for (int i=0;i maxTime){ + maxTime = curTime; + } + } + fprintf(stderr,"Maximum storage cost is: %d bit\n", maxStorageCost); + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + return 1; +} +//------------------------------------------------------------------------------ \ No newline at end of file diff --git a/PHF_benchmark/bbhash/BooPHF.h b/PHF_benchmark/bbhash/BooPHF.h new file mode 100755 index 0000000..88c03fe --- /dev/null +++ b/PHF_benchmark/bbhash/BooPHF.h @@ -0,0 +1,1342 @@ +// BooPHF library +// intended to be a minimal perfect hash function with fast and low memory construction, at the cost of (slightly) higher bits/elem than other state of the art libraries once built. +// should work with arbitray large number of elements, based on a cascade of "collision-free" bit arrays + +#pragma once +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include // for make_shared +#include + + + +namespace boomphf { +//////////////////////////////////////////////////////////////// + //// 打印pthread信息 + inline u_int64_t printPt( pthread_t pt) { + unsigned char *ptc = (unsigned char*)(void*)(&pt); + u_int64_t res =0; + for (size_t i=0; i +class bfile_iterator : public std::iterator{ +public: + + bfile_iterator() + : _is(nullptr) + , _pos(0) ,_inbuff (0), _cptread(0) + { + _buffsize = 10000; + _buffer = (basetype *) malloc(_buffsize*sizeof(basetype)); + } + + bfile_iterator(const bfile_iterator& cr) + { + _buffsize = cr._buffsize; + _pos = cr._pos; + _is = cr._is; + _buffer = (basetype *) malloc(_buffsize*sizeof(basetype)); + memcpy(_buffer,cr._buffer,_buffsize*sizeof(basetype) ); + _inbuff = cr._inbuff; + _cptread = cr._cptread; + _elem = cr._elem; + } + + bfile_iterator(FILE* is): _is(is) , _pos(0) ,_inbuff (0), _cptread(0) + { + //printf("bf it %p\n",_is); + _buffsize = 10000; + _buffer = (basetype *) malloc(_buffsize*sizeof(basetype)); + int reso = fseek(_is,0,SEEK_SET); + advance(); + } + + ~bfile_iterator() + { + if(_buffer!=NULL) + free(_buffer); + } + + + basetype const& operator*() { return _elem; } + + bfile_iterator& operator++() + { + advance(); + return *this; + } + + friend bool operator==(bfile_iterator const& lhs, bfile_iterator const& rhs) + { + if (!lhs._is || !rhs._is) { if (!lhs._is && !rhs._is) { return true; } else { return false; } } + assert(lhs._is == rhs._is); + return rhs._pos == lhs._pos; + } + + friend bool operator!=(bfile_iterator const& lhs, bfile_iterator const& rhs) { return !(lhs == rhs); } +private: + void advance() + { + //printf("_cptread %i _inbuff %i \n",_cptread,_inbuff); + _pos++; + + if(_cptread >= _inbuff) + { + + int res = fread(_buffer,sizeof(basetype),_buffsize,_is); + + //printf("read %i new elem last %llu %p\n",res,_buffer[res-1],_is); + _inbuff = res; _cptread = 0; + + if(res == 0) + { + _is = nullptr; + _pos = 0; + return; + } + } + + _elem = _buffer[_cptread]; + _cptread ++; + } + basetype _elem; + FILE * _is; + unsigned long _pos; + + basetype * _buffer; // for buffered read + int _inbuff, _cptread; + int _buffsize; +}; +//// end 定义从文件系统读取数据的iterator + +//// begin 定义读取文件的句柄 +template +class file_binary{ +public: + + file_binary(const char* filename) + { + _is = fopen(filename, "rb"); + + if (!_is) { + throw std::invalid_argument("Error opening " + std::string(filename)); + } + } + + ~file_binary() + { + fclose(_is); + } + + bfile_iterator begin() const + { + return bfile_iterator(_is); + } + + bfile_iterator end() const {return bfile_iterator(); } + + size_t size () const { return 0; }//todo ? + +private: + FILE * _is; +}; +//// end 定义读取文件的句柄 + + +//// begin 两个哈希函数 +inline unsigned int popcount_32(unsigned int x) +{ + unsigned int m1 = 0x55555555; + unsigned int m2 = 0x33333333; + unsigned int m4 = 0x0f0f0f0f; + unsigned int h01 = 0x01010101; + x -= (x >> 1) & m1; /* put count of each 2 bits into those 2 bits */ + x = (x & m2) + ((x >> 2) & m2); /* put count of each 4 bits in */ + x = (x + (x >> 4)) & m4; /* put count of each 8 bits in partie droite 4bit piece*/ + return (x * h01) >> 24; /* returns left 8 bits of x + (x<<8) + ... */ +} + +inline unsigned int popcount_64(uint64_t x) +{ + unsigned int low = x & 0xffffffff ; + unsigned int high = ( x >> 32LL) & 0xffffffff ; + + return (popcount_32(low) + popcount_32(high)); +} +//// end 两个哈希函数 + + +///// begin progress bar 确认目前generator的progress到哪里 +class Progress +{ +public: + std::string message; + + uint64_t done; + uint64_t todo; + int subdiv ; // progress printed every 1/subdiv of total to do + double partial; + int _nthreads; + std::vector partial_threaded; + std::vector done_threaded; + + double steps ; //steps = todo/subidv + + void init(uint64_t ntasks, const char * msg,int nthreads =1) + { + _nthreads = nthreads; + message = std::string(msg); + + todo= ntasks; + done = 0; + partial =0; + + partial_threaded.resize(_nthreads); + done_threaded.resize(_nthreads); + + for (int ii=0; ii<_nthreads;ii++) partial_threaded[ii]=0; + for (int ii=0; ii<_nthreads;ii++) done_threaded[ii]=0; + subdiv= 1000; + steps = (double)todo / (double)subdiv; + } + void finish() + { + set(todo); + todo= 0; + done = 0; + partial =0; + + } + void finish_threaded()// called by only one of the threads + { + done = 0; + double rem = 0; + for (int ii=0; ii<_nthreads;ii++) done += (done_threaded[ii] ); + for (int ii=0; ii<_nthreads;ii++) partial += (partial_threaded[ii] ); + + finish(); + + } + void inc(uint64_t ntasks_done) + { + done += ntasks_done; + partial += ntasks_done; + + + while(partial >= steps) + { + partial -= steps; + } + } + void inc(uint64_t ntasks_done, int tid) //threads collaborate to this same progress bar + { + partial_threaded[tid] += ntasks_done; + done_threaded[tid] += ntasks_done; + while(partial_threaded[tid] >= steps) + { + + partial_threaded[tid] -= steps; + + } + } + void set(uint64_t ntasks_done) + { + if(ntasks_done > done) + inc(ntasks_done-done); + } + // Progress () : timer_mode(0) {} + //include timer, to print ETA ? +}; +///// end progress bar 确认目前generator的progress到哪里 + + +//// begin 哈希生成器HashFunctor 类,根据key的index给出hash seed,并采用哈希函数 +//////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark hasher +//////////////////////////////////////////////////////////////// +typedef std::array hash_set_t; +typedef std::array hash_pair_t; + +template class HashFunctors +{ +public: + /** Constructor. + * \param[in] nbFct : number of hash functions to be used + * \param[in] seed : some initialization code for defining the hash functions. */ + HashFunctors () + { + _nbFct = 7; // use 7 hash func + _user_seed = 0; + generate_hash_seed (); + } + + //return one hash + uint64_t operator () (const Item& key, size_t idx) const { return hash64 (key, _seed_tab[idx]); } + + uint64_t hashWithSeed(const Item& key, uint64_t seed) const { return hash64 (key, seed); } + //this one returns all the 7 hashes + //maybe use xorshift instead, for faster hash compute + hash_set_t operator () (const Item& key) + { + hash_set_t hset; + + for(size_t ii=0;ii<10; ii++) + { + hset[ii] = hash64 (key, _seed_tab[ii]); + } + return hset; + } + +private: + inline static uint64_t hash64 (Item key, uint64_t seed) + { + uint64_t hash = seed; + hash ^= (hash << 7) ^ key * (hash >> 3) ^ (~((hash << 11) + (key ^ (hash >> 5)))); + hash = (~hash) + (hash << 21); + hash = hash ^ (hash >> 24); + hash = (hash + (hash << 3)) + (hash << 8); + hash = hash ^ (hash >> 14); + hash = (hash + (hash << 2)) + (hash << 4); + hash = hash ^ (hash >> 28); + hash = hash + (hash << 31); + return hash; + } + /* */ + void generate_hash_seed () + { + static const uint64_t rbase[MAXNBFUNC] = + { + 0xAAAAAAAA55555555ULL, 0x33333333CCCCCCCCULL, 0x6666666699999999ULL, 0xB5B5B5B54B4B4B4BULL, + 0xAA55AA5555335533ULL, 0x33CC33CCCC66CC66ULL, 0x6699669999B599B5ULL, 0xB54BB54B4BAA4BAAULL, + 0xAA33AA3355CC55CCULL, 0x33663366CC99CC99ULL + }; + + for (size_t i=0; i class SingleHashFunctor +{ +public: + uint64_t operator () (const Item& key, uint64_t seed=0xAAAAAAAA55555555ULL) const { return hashFunctors.hashWithSeed(key, seed); } + +private: + HashFunctors hashFunctors; +}; + +template class XorshiftHashFunctors +{ + /* Xorshift128* + Written in 2014 by Sebastiano Vigna (vigna@acm.org) + + To the extent possible under law, the author has dedicated all copyright + and related and neighboring rights to this software to the public domain + worldwide. This software is distributed without any warranty. + + See . */ + /* This is the fastest generator passing BigCrush without + systematic failures, but due to the relatively short period it is + acceptable only for applications with a mild amount of parallelism; + otherwise, use a xorshift1024* generator. + + The state must be seeded so that it is not everywhere zero. If you have + a nonzero 64-bit seed, we suggest to pass it twice through + MurmurHash3's avalanching function. */ + + // uint64_t s[ 2 ]; + + uint64_t next(uint64_t * s) { + uint64_t s1 = s[ 0 ]; + const uint64_t s0 = s[ 1 ]; + s[ 0 ] = s0; + s1 ^= s1 << 23; // a + return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c + } + + public: + uint64_t h0(hash_pair_t & s, const Item& key ) + { + s[0] = singleHasher (key, 0xAAAAAAAA55555555ULL); + return s[0]; + } + + uint64_t h1(hash_pair_t & s, const Item& key ) + { + s[1] = singleHasher (key, 0x33333333CCCCCCCCULL); + return s[1]; + } + + //return next hash an update state s + uint64_t next(hash_pair_t & s ) { + uint64_t s1 = s[ 0 ]; + const uint64_t s0 = s[ 1 ]; + s[ 0 ] = s0; + s1 ^= s1 << 23; // a + return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b, c + } + + //this one returns all the hashes + hash_set_t operator () (const Item& key) + { + uint64_t s[ 2 ]; + + hash_set_t hset; + + hset[0] = singleHasher (key, 0xAAAAAAAA55555555ULL); + hset[1] = singleHasher (key, 0x33333333CCCCCCCCULL); + + s[0] = hset[0]; + s[1] = hset[1]; + + for(size_t ii=2;ii< 10 /* it's much better have a constant here, for inlining; this loop is super performance critical*/; ii++) + { + hset[ii] = next(s); + } + + return hset; + } +private: + SingleHasher_t singleHasher; +}; + + + + +//// +//////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark iterators +//////////////////////////////////////////////////////////////// +template +struct iter_range +{ + iter_range(Iterator b, Iterator e) + : m_begin(b) + , m_end(e) + {} + + Iterator begin() const + { return m_begin; } + + Iterator end() const + { return m_end; } + + Iterator m_begin, m_end; +}; + +template +iter_range range(Iterator begin, Iterator end) +{ + return iter_range(begin, end); +} + + +//// begin bit array 例如:每一级的A和C,每个元素代表某个key是否成功哈希的标志 +//////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark BitVector +//////////////////////////////////////////////////////////////// +class bitVector { +public: + + bitVector() : _size(0) + { + _bitArray = nullptr; + } + + bitVector(uint64_t n) : _size(n) + { + _nchar = (1ULL+n/64ULL); + _bitArray = (uint64_t *) calloc (_nchar,sizeof(uint64_t)); + } + + ~bitVector() + { + if(_bitArray != nullptr) + free(_bitArray); + } + + //copy constructor + bitVector(bitVector const &r) + { + _size = r._size; + _nchar = r._nchar; + _ranks = r._ranks; + _bitArray = (uint64_t *) calloc (_nchar,sizeof(uint64_t)); + memcpy(_bitArray, r._bitArray, _nchar*sizeof(uint64_t) ); + } + + // Copy assignment operator + bitVector &operator=(bitVector const &r) + { + if (&r != this) + { + _size = r._size; + _nchar = r._nchar; + _ranks = r._ranks; + if(_bitArray != nullptr) + free(_bitArray); + _bitArray = (uint64_t *) calloc (_nchar,sizeof(uint64_t)); + memcpy(_bitArray, r._bitArray, _nchar*sizeof(uint64_t) ); + } + return *this; + } + + // Move assignment operator + bitVector &operator=(bitVector &&r) + { + //printf("bitVector move assignment \n"); + if (&r != this) + { + if(_bitArray != nullptr) + free(_bitArray); + + _size = std::move (r._size); + _nchar = std::move (r._nchar); + _ranks = std::move (r._ranks); + _bitArray = r._bitArray; + r._bitArray = nullptr; + } + return *this; + } + // Move constructor + bitVector(bitVector &&r) : _bitArray ( nullptr),_size(0) + { + *this = std::move(r); + } + + void resize(uint64_t newsize) + { + //printf("bitvector resize from %llu bits to %llu \n",_size,newsize); + _nchar = (1ULL+newsize/64ULL); + _bitArray = (uint64_t *) realloc(_bitArray,_nchar*sizeof(uint64_t)); + _size = newsize; + } + + size_t size() const + { + return _size; + } + + uint64_t bitSize() const {return (_nchar*64ULL + _ranks.capacity()*64ULL );} + + //clear whole array + void clear() + { + memset(_bitArray,0,_nchar*sizeof(uint64_t)); + } + + //clear collisions in interval, only works with start and size multiple of 64 + void clearCollisions(uint64_t start, size_t size, bitVector * cc) + { + assert( (start & 63) ==0); + assert( (size & 63) ==0); + uint64_t ids = (start/64ULL); + for(uint64_t ii =0; ii< (size/64ULL); ii++ ) + { + _bitArray[ids+ii] = _bitArray[ids+ii] & (~ (cc->get64(ii)) ); + } + + cc->clear(); + } + + //clear interval, only works with start and size multiple of 64 + void clear(uint64_t start, size_t size) + { + assert( (start & 63) ==0); + assert( (size & 63) ==0); + memset(_bitArray + (start/64ULL),0,(size/64ULL)*sizeof(uint64_t)); + } + + //for debug purposes + void print() const + { + printf("bit array of size %lli: \n",(long long int)_size); + for(uint64_t ii = 0; ii< _size; ii++) + { + if(ii%10==0) + printf(" (%llu) ",(long long unsigned int)ii); + int val = (_bitArray[ii >> 6] >> (ii & 63 ) ) & 1; + printf("%i",val); + } + printf("\n"); + + printf("rank array : size %lu \n",_ranks.size()); + for (uint64_t ii = 0; ii< _ranks.size(); ii++) + { + printf("%llu : %lli, ",(long long unsigned int)ii,(long long int)_ranks[ii]); + } + printf("\n"); + } + + //return value at pos + uint64_t operator[](uint64_t pos) const + { + //unsigned char * _bitArray8 = (unsigned char *) _bitArray; + //return (_bitArray8[pos >> 3ULL] >> (pos & 7 ) ) & 1; + + return (_bitArray[pos >> 6ULL] >> (pos & 63 ) ) & 1; + + } + + //atomically return old val and set to 1 + uint64_t atomic_test_and_set(uint64_t pos) + { + uint64_t oldval = __sync_fetch_and_or (_bitArray + (pos >> 6), (uint64_t) (1ULL << (pos & 63)) ); + + return ( oldval >> (pos & 63 ) ) & 1; + } + + + uint64_t get(uint64_t pos) const + { + return (*this)[pos]; + } + + uint64_t get64(uint64_t cell64) const + { + return _bitArray[cell64]; + } + + //set bit pos to 1 + void set(uint64_t pos) + { + assert(pos<_size); + //_bitArray [pos >> 6] |= (1ULL << (pos & 63) ) ; + __sync_fetch_and_or (_bitArray + (pos >> 6ULL), (1ULL << (pos & 63)) ); + } + + //set bit pos to 0 + void reset(uint64_t pos) + { + //_bitArray [pos >> 6] &= ~(1ULL << (pos & 63) ) ; + __sync_fetch_and_and (_bitArray + (pos >> 6ULL), ~(1ULL << (pos & 63) )); + } + + //return value of last rank + // add offset to all ranks computed + uint64_t build_ranks(uint64_t offset =0) + { + _ranks.reserve(2+ _size/_nb_bits_per_rank_sample); + + uint64_t curent_rank = offset; + for (size_t ii = 0; ii < _nchar; ii++) { + if (((ii*64) % _nb_bits_per_rank_sample) == 0) { + _ranks.push_back(curent_rank); + } + curent_rank += popcount_64(_bitArray[ii]); + } + + return curent_rank; + } + + void load(std::istream& is) + { + is.read(reinterpret_cast(&_size), sizeof(_size)); + is.read(reinterpret_cast(&_nchar), sizeof(_nchar)); + this->resize(_size); + is.read(reinterpret_cast(_bitArray), (std::streamsize)(sizeof(uint64_t) * _nchar)); + + size_t sizer; + is.read(reinterpret_cast(&sizer), sizeof(size_t)); + _ranks.resize(sizer); + is.read(reinterpret_cast(_ranks.data()), (std::streamsize)(sizeof(_ranks[0]) * _ranks.size())); + } + +protected: + uint64_t* _bitArray; + //uint64_t* _bitArray; + uint64_t _size; + uint64_t _nchar; + + // epsilon = 64 / _nb_bits_per_rank_sample bits + // additional size for rank is epsilon * _size + static const uint64_t _nb_bits_per_rank_sample = 512; //512 seems ok + std::vector _ranks; +}; +//// end bit array 例如:每一级的A和C,每个元素代表某个key是否成功哈希的标志 + + + +//// level 类,包含: +// 对应的bit Array A (bitVector) +// get函数输入key,找到hash_domain后,能得到A中的标志位信息(是否已经成功哈希) +//////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark level +//////////////////////////////////////////////////////////////// +static inline uint64_t fastrange64(uint64_t word, uint64_t p) { + //return word % p; + return (uint64_t)(((__uint128_t)word * (__uint128_t)p) >> 64); +} + +class level{ +public: + level(){ } + + ~level() { + } + + uint64_t get(uint64_t hash_raw) + { + // uint64_t hashi = hash_raw % hash_domain; // + //uint64_t hashi = (uint64_t)( ((__uint128_t) hash_raw * (__uint128_t) hash_domain) >> 64ULL); + uint64_t hashi = fastrange64(hash_raw,hash_domain); + return bitset.get(hashi); + } + + uint64_t idx_begin; + uint64_t hash_domain; + bitVector bitset; +}; +//// end level 类 + + + + + +//////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark mphf +//////////////////////////////////////////////////////////////// +#define NBBUFF 10000 +//#define NBBUFF 2 +template +struct thread_args +{ + void * boophf; + Range const * range; + std::shared_ptr it_p; /* used to be "Iterator it" but because of fastmode, iterator is polymorphic; TODO: think about whether it should be a unique_ptr actually */ + std::shared_ptr until_p; /* to cache the "until" variable */ + int level; +}; + +//forward declaration +template +void * thread_processLevel(void * args); + + +/* Hasher_t returns a single hash when operator()(elem_t key) is called. + if used with XorshiftHashFunctors, it must have the following operator: operator()(elem_t key, uint64_t seed) */ +template + + +//// mphf定义开始 +class mphf { + + /* this mechanisms gets P hashes out of Hasher_t */ + typedef XorshiftHashFunctors MultiHasher_t ; + // typedef HashFunctors MultiHasher_t; // original code (but only works for int64 keys) (seems to be as fast as the current xorshift) + //typedef IndepHashFunctors MultiHasher_t; //faster than xorshift + +public: + mphf() : _built(false) + {} + + ~mphf() + { + + } + + // allow perc_elem_loaded elements to be loaded in ram for faster construction (default 3%), set to 0 to desactivate + template + mphf( size_t n, Range const& input_range,int num_thread = 1, double gamma = 2.0 , bool writeEach = true, bool progress =true, float perc_elem_loaded = 0.03) : + _gamma(gamma), _hash_domain(size_t(ceil(double(n) * gamma))), _nelem(n), _num_thread(num_thread), _percent_elem_loaded_for_fastMode (perc_elem_loaded), _withprogress(progress) + { + if(n ==0) return; + + _fastmode = false; + + if(_percent_elem_loaded_for_fastMode > 0.0 ) + _fastmode =true; + + if(writeEach) + { + _writeEachLevel =true; + _fastmode = false; + } + else + { + _writeEachLevel = false; + } + + setup(); + + // if(_withprogress) + // { + + // double total_raw = _nb_levels; + + // double sum_geom_read = ( 1.0 / (1.0 - _proba_collision)); + // double total_writeEach = sum_geom_read + 1.0; + + // double total_fastmode_ram = (_fastModeLevel+1) + ( pow(_proba_collision,_fastModeLevel)) * (_nb_levels-(_fastModeLevel+1)) ; + + // // printf("for info, total work write each : %.3f total work inram from level %i : %.3f total work raw : %.3f \n",total_writeEach,_fastModeLevel,total_fastmode_ram,total_raw); + + // if(writeEach) + // { + // _progressBar.init(_nelem * total_writeEach,"Building BooPHF",num_thread); + // } + // else if(_fastmode) + // _progressBar.init( _nelem * total_fastmode_ram ,"Building BooPHF",num_thread); + // else + // _progressBar.init( _nelem * _nb_levels ,"Building BooPHF",num_thread); + // } + + uint64_t offset = 0; + for(int ii = 0; ii< _nb_levels; ii++) + { + _tempBitset = new bitVector(_levels[ii].hash_domain); // temp collision bitarray for this level + + processLevel(input_range,ii); + + _levels[ii].bitset.clearCollisions(0 , _levels[ii].hash_domain , _tempBitset); + + offset = _levels[ii].bitset.build_ranks(offset); + + delete _tempBitset; + } + + // if(_withprogress) + // _progressBar.finish_threaded(); + + + _lastbitsetrank = offset ; + + //printf("used temp ram for construction : %lli MB \n",setLevelFastmode.capacity()* sizeof(elem_t) /1024ULL/1024ULL); + + std::vector().swap(setLevelFastmode); // clear setLevelFastmode reallocating + + + pthread_mutex_destroy(&_mutex); + + _built = true; + } + + uint64_t nbKeys() const + { + return _nelem; + } + + uint64_t totalBitSize() + { + + uint64_t totalsizeBitset = 0; + for(int ii=0; ii<_nb_levels; ii++) + { + totalsizeBitset += _levels[ii].bitset.bitSize(); + } + + uint64_t totalsize = totalsizeBitset + _final_hash.size()*42*8 ; // unordered map takes approx 42B per elem [personal test] (42B with uint64_t key, would be larger for other type of elem) + + printf("Bitarray %12llu bits (%.2f %%) (array + ranks )\n", + totalsizeBitset, 100*(float)totalsizeBitset/totalsize); + printf("Last level hash %12lu bits (%.2f %%) (nb in last level hash %lu)\n", + _final_hash.size()*42*8, 100*(float)(_final_hash.size()*42*8)/totalsize, + _final_hash.size() ); + return totalsize; + } + + template //typename Range, + void pthread_processLevel( std::vector & buffer , std::shared_ptr shared_it, std::shared_ptr until_p, int i) + { + uint64_t nb_done =0; + int tid = __sync_fetch_and_add (&_nb_living, 1); + auto until = *until_p; + uint64_t inbuff =0; + + uint64_t writebuff =0; + std::vector< elem_t > & myWriteBuff = bufferperThread[tid]; + + + for (bool isRunning=true; isRunning ; ) + { + + //safely copy n items into buffer + pthread_mutex_lock(&_mutex); + for(; inbuff= setLevelFastmode.size()) + _fastmode = false; + else + setLevelFastmode[idxl2] = val; // create set for fast mode + } + + //insert to level i+1 : either next level of the cascade or final hash if last level reached + if(i == _nb_levels-1) //stop cascade here, insert into exact hash + { + uint64_t hashidx = __sync_fetch_and_add (& _hashidx, 1); + + pthread_mutex_lock(&_mutex); //see later if possible to avoid this, mais pas bcp item vont la + // calc rank de fin precedent level qq part, puis init hashidx avec ce rank, direct minimal, pas besoin inser ds bitset et rank + _final_hash[val] = hashidx; + pthread_mutex_unlock(&_mutex); + } + else + { + //ils ont reach ce level + //insert elem into curr level on disk --> sera utilise au level+1 , (mais encore besoin filtre) + + if(_writeEachLevel && i > 0 && i < _nb_levels -1) + { + if(writebuff>=NBBUFF) + { + //flush buffer + flockfile(_currlevelFile); + fwrite(myWriteBuff.data(),sizeof(elem_t),writebuff,_currlevelFile); + funlockfile(_currlevelFile); + writebuff = 0; + } + myWriteBuff[writebuff++] = val; + } + + //computes next hash + if ( level == 0) + level_hash = _hasher.h0(bbhash,val); + else if ( level == 1) + level_hash = _hasher.h1(bbhash,val); + else + { + level_hash = _hasher.next(bbhash); + } + insertIntoLevel(level_hash,i); //should be safe + } + } + nb_done++; + // if((nb_done&1023) ==0 && _withprogress) {_progressBar.inc(nb_done,tid);nb_done=0; } + } + inbuff = 0; + } + if(_writeEachLevel && writebuff>0) + { + //flush buffer + flockfile(_currlevelFile); + fwrite(myWriteBuff.data(),sizeof(elem_t),writebuff,_currlevelFile); + funlockfile(_currlevelFile); + writebuff = 0; + } + + } + + void load(std::istream& is) + { + + is.read(reinterpret_cast(&_gamma), sizeof(_gamma)); + is.read(reinterpret_cast(&_nb_levels), sizeof(_nb_levels)); + is.read(reinterpret_cast(&_lastbitsetrank), sizeof(_lastbitsetrank)); + is.read(reinterpret_cast(&_nelem), sizeof(_nelem)); + + _levels.resize(_nb_levels); + + + for(int ii=0; ii<_nb_levels; ii++) + { + //_levels[ii].bitset = new bitVector(); + _levels[ii].bitset.load(is); + } + + //mini setup, recompute size of each level + _proba_collision = 1.0 - pow(((_gamma*(double)_nelem -1 ) / (_gamma*(double)_nelem)),_nelem-1); + uint64_t previous_idx =0; + _hash_domain = (size_t) (ceil(double(_nelem) * _gamma)) ; + for(int ii=0; ii<_nb_levels; ii++) + { + //_levels[ii] = new level(); + _levels[ii].idx_begin = previous_idx; + _levels[ii].hash_domain = (( (uint64_t) (_hash_domain * pow(_proba_collision,ii)) + 63) / 64 ) * 64; + if(_levels[ii].hash_domain == 0 ) + _levels[ii].hash_domain = 64 ; + previous_idx += _levels[ii].hash_domain; + } + + //restore final hash + + _final_hash.clear(); + size_t final_hash_size ; + + is.read(reinterpret_cast(&final_hash_size), sizeof(size_t)); + + for(unsigned int ii=0; ii(&key), sizeof(elem_t)); + is.read(reinterpret_cast(&value), sizeof(uint64_t)); + + _final_hash[key] = value; + } + _built = true; + } + + private : + + void setup() + { + pthread_mutex_init(&_mutex, NULL); + + _pid = getpid() + printPt(pthread_self()) ;// + pthread_self(); + //printf("pt self %llu pid %i \n",printPt(pthread_self()),_pid); + + _cptTotalProcessed=0; + + if(_fastmode) + { + setLevelFastmode.resize(_percent_elem_loaded_for_fastMode * (double)_nelem ); + } + + + bufferperThread.resize(_num_thread); + if(_writeEachLevel) + { + for(int ii=0; ii<_num_thread; ii++) + { + bufferperThread[ii].resize(NBBUFF); + } + } + + _proba_collision = 1.0 - pow(((_gamma*(double)_nelem -1 ) / (_gamma*(double)_nelem)),_nelem-1); + + double sum_geom =_gamma * ( 1.0 + _proba_collision / (1.0 - _proba_collision)); + //printf("proba collision %f sum_geom %f \n",_proba_collision,sum_geom); + + _nb_levels = 25; + _levels.resize(_nb_levels); + + //build levels + uint64_t previous_idx =0; + for(int ii=0; ii<_nb_levels; ii++) + { + _levels[ii].idx_begin = previous_idx; + + // round size to nearest superior multiple of 64, makes it easier to clear a level + _levels[ii].hash_domain = (( (uint64_t) (_hash_domain * pow(_proba_collision,ii)) + 63) / 64 ) * 64; + if(_levels[ii].hash_domain == 0 ) _levels[ii].hash_domain = 64 ; + previous_idx += _levels[ii].hash_domain; + + //printf("build level %i bit array : start %12llu, size %12llu ",ii,_levels[ii]->idx_begin,_levels[ii]->hash_domain ); + //printf(" expected elems : %.2f %% total \n",100.0*pow(_proba_collision,ii)); + } + + for(int ii=0; ii<_nb_levels; ii++) + { + if(pow(_proba_collision,ii) < _percent_elem_loaded_for_fastMode) + { + _fastModeLevel = ii; + //printf("fast mode level : %i \n",ii); + break; + } + } + } + + //compute level and returns hash of last level reached + uint64_t getLevel(hash_pair_t & bbhash, const elem_t &val, int * res_level, int maxlevel = 100, int minlevel =0) + //uint64_t getLevel(hash_pair_t & bbhash, elem_t val,int * res_level, int maxlevel = 100, int minlevel =0) + { + int level = 0; + uint64_t hash_raw=0; + + for (int ii = 0; ii<(_nb_levels-1) && ii < maxlevel ; ii++ ) + { + + //calc le hash suivant + if ( ii == 0) + hash_raw = _hasher.h0(bbhash,val); + else if ( ii == 1) + hash_raw = _hasher.h1(bbhash,val); + else + { + hash_raw = _hasher.next(bbhash); + } + + if( ii >= minlevel && _levels[ii].get(hash_raw) ) // + //if( _levels[ii].get(hash_raw) ) // + + { + break; + } + + level++; + } + + *res_level = level; + return hash_raw; + } + + //insert into bitarray + void insertIntoLevel(uint64_t level_hash, int i) + { + // uint64_t hashl = level_hash % _levels[i].hash_domain; + uint64_t hashl = fastrange64( level_hash,_levels[i].hash_domain); + + if( _levels[i].bitset.atomic_test_and_set(hashl) ) + { + _tempBitset->atomic_test_and_set(hashl); + } + } + + //loop to insert into level i + template + void processLevel(Range const& input_range,int i) + { + ////alloc the bitset for this level + _levels[i].bitset = bitVector(_levels[i].hash_domain); ; + + //printf("---process level %i wr %i fast %i ---\n",i,_writeEachLevel,_fastmode); + + char fname_old[1000]; + sprintf(fname_old,"temp_p%i_level_%i",_pid,i-2); + + char fname_curr[1000]; + sprintf(fname_curr,"temp_p%i_level_%i",_pid,i); + + char fname_prev[1000]; + sprintf(fname_prev,"temp_p%i_level_%i",_pid,i-1); + + if(_writeEachLevel) + { + //file management : + + if(i>2) //delete previous file + { + unlink(fname_old); + } + + if(i< _nb_levels-1 && i > 0 ) //create curr file + { + _currlevelFile = fopen(fname_curr,"w"); + } + } + + _cptLevel = 0; + _hashidx = 0; + _idxLevelsetLevelFastmode =0; + _nb_living =0; + //create threads + pthread_t *tab_threads= new pthread_t [_num_thread]; + typedef decltype(input_range.begin()) it_type; + thread_args t_arg; // meme arg pour tous + t_arg.boophf = this; + t_arg.range = &input_range; + t_arg.it_p = std::static_pointer_cast(std::make_shared(input_range.begin())); + t_arg.until_p = std::static_pointer_cast(std::make_shared(input_range.end())); + + t_arg.level = i; + + if(_writeEachLevel && (i > 1)) + { + + auto data_iterator_level = file_binary(fname_prev); + + typedef decltype(data_iterator_level.begin()) disklevel_it_type; + + //data_iterator_level.begin(); + t_arg.it_p = std::static_pointer_cast(std::make_shared(data_iterator_level.begin())); + t_arg.until_p = std::static_pointer_cast(std::make_shared(data_iterator_level.end())); + + for(int ii=0;ii<_num_thread;ii++) + pthread_create (&tab_threads[ii], NULL, thread_processLevel, &t_arg); //&t_arg[ii] + + //must join here before the block is closed and file_binary is destroyed (and closes the file) + for(int ii=0;ii<_num_thread;ii++) + { + pthread_join(tab_threads[ii], NULL); + } + } + + else + { + if(_fastmode && i >= (_fastModeLevel+1)) + { + + /* we'd like to do t_arg.it = data_iterator.begin() but types are different; + so, casting to (void*) because of that; and we remember the type in the template */ + typedef decltype(setLevelFastmode.begin()) fastmode_it_type; + t_arg.it_p = std::static_pointer_cast(std::make_shared(setLevelFastmode.begin())); + t_arg.until_p = std::static_pointer_cast(std::make_shared(setLevelFastmode.end())); + + /* we'd like to do t_arg.it = data_iterator.begin() but types are different; + so, casting to (void*) because of that; and we remember the type in the template */ + + for(int ii=0;ii<_num_thread;ii++) + pthread_create (&tab_threads[ii], NULL, thread_processLevel, &t_arg); //&t_arg[ii] + + } + else + { + for(int ii=0;ii<_num_thread;ii++) + pthread_create (&tab_threads[ii], NULL, thread_processLevel, &t_arg); //&t_arg[ii] + } + //joining + for(int ii=0;ii<_num_thread;ii++) + { + pthread_join(tab_threads[ii], NULL); + } + } + //printf("\ngoing to level %i : %llu elems %.2f %% expected : %.2f %% \n",i,_cptLevel,100.0* _cptLevel/(float)_nelem,100.0* pow(_proba_collision,i) ); + + //printf("\ncpt total processed %llu \n",_cptTotalProcessed); + if(_fastmode && i == _fastModeLevel) //shrink to actual number of elements in set + { + //printf("\nresize setLevelFastmode to %lli \n",_idxLevelsetLevelFastmode); + setLevelFastmode.resize(_idxLevelsetLevelFastmode); + } + delete [] tab_threads; + + if(_writeEachLevel) + { + if(i< _nb_levels-1 && i>0) + { + fflush(_currlevelFile); + fclose(_currlevelFile); + } + + if(i== _nb_levels- 1) //delete last file + { + unlink(fname_prev); + } + } + + } + +private: + //level ** _levels; + std::vector _levels; + int _nb_levels; + MultiHasher_t _hasher; + bitVector * _tempBitset; + + double _gamma; + uint64_t _hash_domain; + uint64_t _nelem; + std::unordered_map _final_hash; + // Progress _progressBar; + int _nb_living; + int _num_thread; + uint64_t _hashidx; + double _proba_collision; + uint64_t _lastbitsetrank; + uint64_t _idxLevelsetLevelFastmode; + uint64_t _cptLevel; + uint64_t _cptTotalProcessed; + + // fast build mode , requires that _percent_elem_loaded_for_fastMode % elems are loaded in ram + float _percent_elem_loaded_for_fastMode ; + bool _fastmode; + std::vector< elem_t > setLevelFastmode; +// std::vector< elem_t > setLevelFastmode_next; // todo shrinker le set e nram a chaque niveau ? + + std::vector< std::vector< elem_t > > bufferperThread; + + int _fastModeLevel; + bool _withprogress; + bool _built; + bool _writeEachLevel; + FILE * _currlevelFile; + int _pid; +public: + pthread_mutex_t _mutex; +}; + + +//// 针对某一个args(包括iterator 和 要处理的range) +// 线程处理某一个level +//////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark threading +//////////////////////////////////////////////////////////////// +template +void * thread_processLevel(void * args) +{ + if(args ==NULL) return NULL; + + thread_args *targ = (thread_args*) args; + + mphf * obw = (mphf *) targ->boophf; + int level = targ->level; + std::vector buffer; + buffer.resize(NBBUFF); + + pthread_mutex_t * mutex = & obw->_mutex; + + pthread_mutex_lock(mutex); // from comment above: "//get starting iterator for this thread, must be protected (must not be currently used by other thread to copy elems in buff)" + std::shared_ptr startit = std::static_pointer_cast(targ->it_p); + std::shared_ptr until_p = std::static_pointer_cast(targ->until_p); + pthread_mutex_unlock(mutex); + + obw->pthread_processLevel(buffer, startit, until_p, level); + + return NULL; +} + + + +} diff --git a/PHF_benchmark/bbhash/LICENSE b/PHF_benchmark/bbhash/LICENSE new file mode 100755 index 0000000..5e44658 --- /dev/null +++ b/PHF_benchmark/bbhash/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Guillaume Rizk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/PHF_benchmark/bbhash/README.md b/PHF_benchmark/bbhash/README.md new file mode 100755 index 0000000..59352fc --- /dev/null +++ b/PHF_benchmark/bbhash/README.md @@ -0,0 +1,42 @@ +[![Build Status](https://travis-ci.org/rizkg/BBHash.svg?branch=master)](https://travis-ci.org/rizkg/BBHash) + +# BBHash +**BBHash** is a simple library for building minimal perfect hash function. +It is designed to handle large scale datasets. The function is just a little bit larger than other state-of-the-art libraries, it takes approximately 3 bits / elements (compared to 2.62 bits/elem for the emphf lib), but construction is faster and does not require additional memory. + +It is easy to include in other projects (just include a single .h file) and has no dependencies. + +# Citation + +A. Limasset, G. Rizk, R. Chikhi, P. Peterlongo, _Fast and Scalable Minimal Perfect Hashing for Massive Key Sets_, SEA 2017: http://drops.dagstuhl.de/opus/volltexte/2017/7619/pdf/LIPIcs-SEA-2017-25.pdf + +``` +@InProceedings{bbhash, + author ={Antoine Limasset and Guillaume Rizk and Rayan Chikhi and Pierre Peterlongo}, + title ={{Fast and Scalable Minimal Perfect Hashing for Massive Key Sets}}, + booktitle ={16th International Symposium on Experimental Algorithms (SEA 2017)}, + pages ={25:1--25:16}, + series ={Leibniz International Proceedings in Informatics (LIPIcs)}, + year ={2017}, + volume ={75}, + ISSN ={1868-8969}, + publisher ={Schloss Dagstuhl--Leibniz-Zentrum fuer Informatik}, + address ={Dagstuhl, Germany}, + URL ={http://drops.dagstuhl.de/opus/volltexte/2017/7619}, + doi ={10.4230/LIPIcs.SEA.2017.25} +} +``` + +# Modification +The BBHash source code is copied here without any modification. + +Use testTime.cpp as the default benchmark program for input as a folder. +For example, FOLDER_PATH="../Input_data" + +``` +make +./testTime FOLDER_PATH/ +``` + +Above commands will test the input files in FOLDER_PATH, and provide the time and space result. + diff --git a/PHF_benchmark/bbhash/bootest.cpp b/PHF_benchmark/bbhash/bootest.cpp new file mode 100755 index 0000000..82ba9ab --- /dev/null +++ b/PHF_benchmark/bbhash/bootest.cpp @@ -0,0 +1,916 @@ +#include "BooPHF.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +//#include + + +u_int64_t *data; + + +using namespace std; + + +//uncomment to check correctness of the func +//#define CHECK_MPHF + + +#define MAX_RANDOM 2147483648 +#define srandomdev() srand((unsigned) time(NULL)) + + +inline double get_time_usecs() { + struct timeval tv; + gettimeofday(&tv, NULL); + return double(tv.tv_sec) * 1000000 + double(tv.tv_usec); +} + + +uint64_t random64 (){ + uint64_t low, high,res; + low = random(); + high = random(); + + res = (high << 32) + low; + return res; +} + + +typedef boomphf::SingleHashFunctor hasher_t; +typedef boomphf::mphf< u_int64_t, hasher_t > boophf_t; + + +// iterator from disk file of u_int64_t with buffered read, todo template +class bfile_iterator : public std::iterator{ + public: + + bfile_iterator() + : _is(nullptr) + , _pos(0) ,_inbuff (0), _cptread(0) + { + _buffsize = 10000; + _buffer = (u_int64_t *) malloc(_buffsize*sizeof(u_int64_t)); + } + + bfile_iterator(const bfile_iterator& cr) + { + _buffsize = cr._buffsize; + _pos = cr._pos; + _is = cr._is; + _buffer = (u_int64_t *) malloc(_buffsize*sizeof(u_int64_t)); + memcpy(_buffer,cr._buffer,_buffsize*sizeof(u_int64_t) ); + _inbuff = cr._inbuff; + _cptread = cr._cptread; + _elem = cr._elem; + } + + bfile_iterator(FILE* is): _is(is) , _pos(0) ,_inbuff (0), _cptread(0) + { + _buffsize = 10000; + _buffer = (u_int64_t *) malloc(_buffsize*sizeof(u_int64_t)); + int reso = fseek(_is,0,SEEK_SET); + advance(); + } + + ~bfile_iterator() + { + if(_buffer!=NULL) + free(_buffer); + } + + + u_int64_t const& operator*() { return _elem; } + + bfile_iterator& operator++() + { + advance(); + return *this; + } + + friend bool operator==(bfile_iterator const& lhs, bfile_iterator const& rhs) + { + if (!lhs._is || !rhs._is) { if (!lhs._is && !rhs._is) { return true; } else { return false; } } + assert(lhs._is == rhs._is); + return rhs._pos == lhs._pos; + } + + friend bool operator!=(bfile_iterator const& lhs, bfile_iterator const& rhs) { return !(lhs == rhs); } + private: + void advance() + { + _pos++; + + if(_cptread >= _inbuff) + { + int res = fread(_buffer,sizeof(u_int64_t),_buffsize,_is); + _inbuff = res; _cptread = 0; + + if(res == 0) + { + _is = nullptr; + _pos = 0; + return; + } + } + + _elem = _buffer[_cptread]; + _cptread ++; + } + u_int64_t _elem; + FILE * _is; + unsigned long _pos; + + u_int64_t * _buffer; // for buffered read + int _inbuff, _cptread; + int _buffsize; +}; + + +class file_binary{ + public: + + file_binary(const char* filename) + { + _is = fopen(filename, "rb"); + if (!_is) { + throw std::invalid_argument("Error opening " + std::string(filename)); + } + } + + ~file_binary() + { + fclose(_is); + } + + bfile_iterator begin() const + { + return bfile_iterator(_is); + } + + bfile_iterator end() const {return bfile_iterator(); } + + size_t size () const { return 0; }//todo ? + + private: + FILE * _is; +}; + + + +//simple iterator to generate list of distinct u_int64_t keys (not random, just equally distributed in [0;ULLONG_MAX]) +class uint64_iterator : public std::iterator{ +public: + + uint64_iterator() : _nb_elem(0) , _curr(ULLONG_MAX), _step(0),_nb_iterated(0) + { + } + + uint64_iterator(const uint64_iterator& cr) + { + _nb_elem = cr._nb_elem; + _curr = cr._curr; + _step = cr._step; + _stop = cr._stop; + _nb_iterated = cr._nb_iterated; + } + + uint64_iterator(u_int64_t nb_elem, u_int64_t stop ) : _nb_elem(nb_elem) , _curr(0),_nb_iterated(0), _stop(stop) + { + _step = ULLONG_MAX / _nb_elem; + } + + ~uint64_iterator() + { + } + + u_int64_t const& operator*() { return _curr; } + + uint64_iterator& operator++() + { + + _curr = _curr + _step; + _nb_iterated++; + if(_nb_iterated >= _stop) _nb_elem = 0; + return *this; + } + + friend bool operator==(uint64_iterator const& lhs, uint64_iterator const& rhs) + { + if (!lhs._nb_elem || !rhs._nb_elem) { if (!lhs._nb_elem && !rhs._nb_elem) { return true; } else { return false; } } + assert(lhs._nb_elem == rhs._nb_elem); + return rhs._curr == lhs._curr; + } + + friend bool operator!=(uint64_iterator const& lhs, uint64_iterator const& rhs) { return !(lhs == rhs); } + + u_int64_t _nb_elem; + u_int64_t _curr; + u_int64_t _step; + u_int64_t _stop; + u_int64_t _nb_iterated; +}; + +//will generate range over [0;ULLONG_MAX] +//elem equally spaced , separated by ULLONG_MAX/nb_elem starting at 0 +//will stop after nbiter +class uint64_range{ +public: + uint64_range(u_int64_t nb_elem, u_int64_t nbiter) : _nb_elem(nb_elem), _stop(nbiter) + { + + } + ~uint64_range() + { + + } + + uint64_iterator begin() const + { + return uint64_iterator(_nb_elem,_stop); + } + uint64_iterator end() const + { + return uint64_iterator(); + } + + +private: + u_int64_t _nb_elem; + u_int64_t _stop; + +}; + +//stolen from emphf +struct stats_accumulator { + stats_accumulator() + : m_n(0) + , m_mean(0) + , m_m2(0) + {} + + void add(double x) + { + m_n += 1; + auto delta = x - m_mean; + m_mean += delta / m_n; + m_m2 += delta * (x - m_mean); + } + + double mean() const + { + return m_mean; + } + + double variance() const + { + return m_m2 / (m_n - 1); + } + + double relative_stddev() const + { + return std::sqrt(variance()) / mean() * 100; + } + +private: + double m_n; + double m_mean; + double m_m2; +}; + + +//PARAMETERS +u_int64_t nelem = 1000*1000; +uint nthreads = 1; //warning must be a divisor of nBuckets +double gammaFactor = 1.0; +bool write_each = false; + +u_int64_t nb_in_bench_file; + + +uint64_t korenXor(uint64_t x){ + x ^= (x << 21); + x ^= (x >> 35); + x ^= (x << 4); + return x; +} + + +uint nBuckets = 96; +uint nMphfByBucket(96); +vector vFiles(nBuckets); +vector elinbuckets(nBuckets*nMphfByBucket); +vector MPHFs(nBuckets*nMphfByBucket); + + +void multipleMPHF(const vector>& datas, uint start, uint n,uint bucketNum){ + for(uint ii(start);ii(&datas[ii][0]), static_cast(&datas[ii][0]+datas[ii].size())); + MPHFs[bucketNum*nMphfByBucket+ii]= boomphf::mphf(datas[ii].size(),data_iterator2,1,gammaFactor,write_each,false); + } +} + + +void compactBucket(uint start, uint n){ + //foreach bucket + + for(uint i(start);i> datas(nMphfByBucket); + + for(uint ireserve(0);ireserve threads; + for(uint tn(0);tn<1;++tn){ + threads.push_back(thread(multipleMPHF,datas,tn*(nMphfByBucket/1),nMphfByBucket/1,i)); + } + // threads.push_back(thread(multipleMPHF,datas,(nthreads)*(nMphfByBucket/nthreads),nMphfByBucket-(nthreads)*(nMphfByBucket/nthreads),i)); + + for(auto &t : threads){t.join();} + } +} + + +template +int check_mphf_correctness (phf_t * bphf, Range const& input_range){ + u_int64_t nb_collision_detected = 0; + u_int64_t range_problems = 0; + u_int64_t mphf_value; + boomphf::bitVector check_table (nelem); + //auto data_iterator = file_binary("keyfile"); + + for (auto const& val: input_range) + { + mphf_value = bphf->lookup(val); + //printf("%llu mphf_value %llu\n",val,mphf_value); + + if(mphf_value>=nelem) + { + range_problems++; continue; + } + if(check_table[mphf_value]==0) + { + check_table.set(mphf_value); + } + else + { + //printf("collision for val %lli : \n",mphf_value); + printf("collision for %llu mphf_value %llu\n",val,mphf_value); + + nb_collision_detected++; + } + } + + + + if(nb_collision_detected == 0 && range_problems ==0) + { + printf(" --- boophf working correctly --- \n"); + return 0; + + } + else + { + printf("!!! problem, %llu collisions detected; %llu out of range !!!\n",nb_collision_detected,range_problems); + return 1; + + } +} + + +template +void bench_mphf_lookup (phf_t * bphf, Range const& input_range){ + + + vector sample; + u_int64_t mphf_value; + + //copy sample in ram + for (auto const& key: input_range) { + sample.push_back(key); + } + + printf("bench lookups sample size %lu \n",sample.size()); + //bench procedure taken from emphf + stats_accumulator stats; + double tick = get_time_usecs(); + size_t lookups = 0; + static const size_t lookups_per_sample = 1 << 16; + u_int64_t dumb=0; + double elapsed; + size_t runs = 10; + + for (size_t run = 0; run < runs; ++run) { + for (size_t ii = 0; ii < sample.size(); ++ii) { + + mphf_value = bphf->lookup(sample[ii]); + //do some silly work + dumb+= mphf_value; + + if (++lookups == lookups_per_sample) { + elapsed = get_time_usecs() - tick; + stats.add(elapsed / (double)lookups); + tick = get_time_usecs(); + lookups = 0; + } + } + } + printf("BBhash bench lookups average %.2f ns +- stddev %.2f %% (fingerprint %llu) \n", 1000.0*stats.mean(),stats.relative_stddev(),dumb); + +} + + +//#include "bucketing.h" + + +int main (int argc, char* argv[]){ + //if we want a random seed from timer +// typedef std::chrono::high_resolution_clock myclock; +// myclock::time_point beginning = myclock::now(); + + bool check_correctness = false; + bool bench_lookup = false; + bool save_mphf = false; + bool load_mphf = false; + bool buckets = false; + bool from_disk = true; + bool bench_lookup_out = false; + bool on_the_fly= false; + write_each = true; + if(argc <4 ){ + printf("Usage :\n"); + printf("%s [options]\n",argv[0]); + printf("Options:\n"); + printf("\t-check (check correctness of mphf)\n"); + printf("\t-bench (bench query time of mphf)\n"); + printf("\t-save\n"); + printf("\t-load\n"); + printf("\t-inram\n"); + printf("\t-nodisk (do not write each intermediate level on disk)\n"); + printf("\t-buckets\n"); + printf("\t-outquery (bench the fp rate of the mphf)\n"); // bench fp rate + printf("\t-onthefly (generates key on the fly without storing them on disk or in ram)\n"); + + + + return EXIT_FAILURE; + } + + if(argc >=4 ){ + nelem = strtoul(argv[1], NULL,0); + nthreads = atoi(argv[2]); + gammaFactor = atoi(argv[3]); + } + + + + for (int ii=4; ii [options]\n",argv[0]); + exit(1); + } + + +// ///testing terator +// printf("testing terator :\n"); +// uint64_range terator_in = uint64_range(10,10); +// uint64_range terator = uint64_range(terator_in); +// +// +// for (auto const& val: terator) { +// printf("%llu \n",val); +// +// } +// exit(0); + + + FILE * key_file = NULL; + FILE * bench_file = NULL; + + if(from_disk){ + key_file = fopen("keyfile","w+"); + } + + uint64_t ii, jj; + + ///// generation of keys + if(!from_disk && !buckets){ + uint64_t rab = 100; + + static std::mt19937_64 rng; + rng.seed(std::mt19937_64::default_seed); //default seed + + //rng.seed(seed2); //random seed from timer + data = (u_int64_t * ) calloc(nelem+rab,sizeof(u_int64_t)); + + for (u_int64_t i = 1; i < nelem+rab; i++){ + data[i] = rng(); + } + printf("de-duplicating items \n"); + + std::sort(data,data+nelem+rab); + + for (ii = 1, jj = 0; ii < nelem+rab; ii++) { + if (data[ii] != data[jj]) + data[++jj] = data[ii]; + } + printf("found %lli duplicated items \n",nelem+rab-(jj + 1) ); + } + else{ + if(!on_the_fly) + { + //methode simple pas besoin de de-dupliquer, mais pas "random" + u_int64_t step = ULLONG_MAX / nelem; + // u_int64_t step = 100 / nelem; + u_int64_t current = 0; + for (u_int64_t i = 0; i < nelem; i++) + { + fwrite(¤t, sizeof(u_int64_t), 1, key_file); + //printf("%llu \n",current); + current = current + step; + } + fclose(key_file); + printf("key file generated \n"); + + if(bench_lookup) + { + bench_file = fopen("benchfile","w+"); + //create a test file + //if n < 10 M take all elements, otherwise regular sample to have 10 M elements + u_int64_t stepb = nelem / 10000000; + if(stepb==0) stepb=1; + auto data_iterator = file_binary("keyfile"); + u_int64_t cpt = 0; + nb_in_bench_file=0; + for (auto const& key: data_iterator) { + if( (cpt % stepb) == 0) + { + fwrite(&key, sizeof(u_int64_t), 1, bench_file); + nb_in_bench_file++; + } + cpt++; + } + fclose(bench_file); + } + } + } + + + vector nb_elem_in_previous_buckets (nBuckets*nMphfByBucket); + + + if(buckets){ + clock_t begin, end; + double t_begin,t_end; struct timeval timet; + gettimeofday(&timet, NULL); t_begin = timet.tv_sec +(timet.tv_usec/1000000.0); + + + for(uint i(0);i > buffers (nBuckets); + for(int ii=0; ii threads; + for(uint n(0);n=nelem){ + range_problems++; + printf("there is %llu problems \n", range_problems); + } + if(check_table[mphf_value]==0) + { + check_table.set(mphf_value); + } + else + { + //printf("collision for val %lli \n",mphf_value); + nb_collision_detected++; + } + current2 += step2; + } + printf("there is %llu problems\n", range_problems); + printf("there is %llu coll\n", nb_collision_detected); + + end = clock(); + //printf("BooPHF %llu lookups in %.2fs, approx %.2f ns per lookup \n", nelem, (double)(end - begin) / CLOCKS_PER_SEC, ((double)(end - begin) / CLOCKS_PER_SEC)*1000000000/nelem); + } + + if(bench_lookup) + { + + auto input_range = file_binary("benchfile"); + + vector sample; + u_int64_t mphf_value; + + //copy sample in ram + for (auto const& key: input_range) { + sample.push_back(key); + } + + printf("bench lookups sample size %lu \n",sample.size()); + //bench procedure taken from emphf + stats_accumulator stats; + double tick = get_time_usecs(); + size_t lookups = 0; + static const size_t lookups_per_sample = 1 << 16; + u_int64_t dumb=0; + double elapsed; + size_t runs = 10; + + for (size_t run = 0; run < runs; ++run) { + for (size_t ii = 0; ii < sample.size(); ++ii) { + + uint64_t hash=korenXor(sample[ii])%(nBuckets*nMphfByBucket); + mphf_value = MPHFs[hash].lookup(sample[ii]) + nb_elem_in_previous_buckets [hash]; + dumb+= mphf_value; + + //do some silly work + + if (++lookups == lookups_per_sample) { + elapsed = get_time_usecs() - tick; + stats.add(elapsed / (double)lookups); + tick = get_time_usecs(); + lookups = 0; + } + } + } + printf("BBhash buckets bench lookups average %.2f ns +- stddev %.2f %% (fingerprint %llu) \n", 1000.0*stats.mean(),stats.relative_stddev(),dumb); + + /// + } + + + + return EXIT_SUCCESS; + } + + + + std::string output_filename; + output_filename = "saved_mphf"; + boophf_t * bphf = NULL;; + + + clock_t begin, end; + double t_begin,t_end; struct timeval timet; + + if(!load_mphf){ + printf("Construct a BooPHF with %lli elements \n",nelem); + ///create the boophf + + gettimeofday(&timet, NULL); t_begin = timet.tv_sec +(timet.tv_usec/1000000.0); + + //MPHF CREATION + if (on_the_fly) + { + auto data_iterator = uint64_range(nelem,nelem) ; + bphf = new boomphf::mphf(nelem,data_iterator,nthreads,gammaFactor,write_each); + } + else if(from_disk) + { + auto data_iterator = file_binary("keyfile"); + bphf = new boomphf::mphf(nelem,data_iterator,nthreads,gammaFactor,write_each); + } + else + { + auto data_iterator = boomphf::range(static_cast(data), static_cast(data+nelem)); + bphf = new boomphf::mphf(nelem,data_iterator,nthreads,gammaFactor,write_each); + } + + gettimeofday(&timet, NULL); t_end = timet.tv_sec +(timet.tv_usec/1000000.0); + + double elapsed = t_end - t_begin; + + + printf("BooPHF constructed perfect hash for %llu keys in %.2fs\n", nelem,elapsed); + printf("boophf bits/elem : %f\n",(float) (bphf->totalBitSize())/nelem); + + } + else{ + //assumes the mphf was saved before, reload it + bphf = new boomphf::mphf(); + + printf("Loading a BooPHF with %lli elements \n",nelem); + + gettimeofday(&timet, NULL); t_begin = timet.tv_sec +(timet.tv_usec/1000000.0); + + std::ifstream is(output_filename, std::ios::binary); + bphf->load(is); + + gettimeofday(&timet, NULL); t_end = timet.tv_sec +(timet.tv_usec/1000000.0); + double elapsed = t_end - t_begin; + + printf("BooPHF re-loaded perfect hash for %llu keys in %.2fs\n", nelem,elapsed); + printf("boophf bits/elem : %f\n",(float) (bphf->totalBitSize())/nelem); + } + + + if(save_mphf) + { + std::ofstream os(output_filename, std::ios::binary); + bphf->save(os); + } + + + if(check_correctness && on_the_fly ) + { + auto data_iterator = uint64_range(nelem,nelem) ; + check_mphf_correctness(bphf ,data_iterator); + } + else if(check_correctness && from_disk ) + { + auto data_iterator = file_binary("keyfile"); + check_mphf_correctness(bphf ,data_iterator); + } + else if(check_correctness && !from_disk ) + { + auto data_iterator = boomphf::range(static_cast(data), static_cast(data+nelem)); + check_mphf_correctness(bphf ,data_iterator); + } + + + if(bench_lookup && on_the_fly) + { + auto data_iterator = uint64_range(nelem,1000000) ; + + bench_mphf_lookup(bphf,data_iterator); + + } + else if(bench_lookup && from_disk) + { + auto data_iterator = file_binary("benchfile"); + + bench_mphf_lookup(bphf,data_iterator); + + } + else if(bench_lookup && !from_disk) + { + auto data_iterator = boomphf::range(static_cast(data), static_cast(data+nelem)); + + bench_mphf_lookup(bphf,data_iterator); + } + + if(bench_lookup_out) + { + int nrandom = 100000000; //10000000 + static std::mt19937_64 rng; + rng.seed(std::mt19937_64::default_seed); //default seed + u_int64_t * data_random = (u_int64_t * ) calloc(nrandom,sizeof(u_int64_t)); + for (u_int64_t i = 0; i < nrandom; i++){ + data_random[i] = rng(); + // printf("%llu \n",data_random[i]); + } + u_int64_t mphf_value; + u_int64_t dumb=0; + u_int64_t nb_fp =0; + u_int64_t nb_out_of_range =0; + + + for (size_t ii = 0; ii < nrandom; ++ii) { + + mphf_value = bphf->lookup(data_random[ii]); + + //printf("m %llu \n",mphf_value); + + if(mphf_value != ULLONG_MAX) + { + nb_fp++; + } + + if((mphf_value != ULLONG_MAX) && (mphf_value >= nelem)) + { + nb_out_of_range++; + } + + } + + + double tick = get_time_usecs(); + + for (size_t ii = 0; ii < nrandom; ++ii) { + mphf_value = bphf->lookup(data_random[ii]); + //do some silly work + dumb+= mphf_value; + + } + double elapsed = get_time_usecs() - tick; + + printf("query %i elem out of set FP rate %.2f nb issues %llu lookup %.2f ns \n",nrandom, nb_fp/(float)nrandom,nb_out_of_range + ,1000.0*elapsed/(double)nrandom ); + } + + + if(!from_disk){ + free(data); + } + + delete bphf; + + return EXIT_SUCCESS; +} diff --git a/PHF_benchmark/bbhash/example.cpp b/PHF_benchmark/bbhash/example.cpp new file mode 100755 index 0000000..add5c3d --- /dev/null +++ b/PHF_benchmark/bbhash/example.cpp @@ -0,0 +1,92 @@ +#include "BooPHF.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +typedef boomphf::SingleHashFunctor hasher_t; +typedef boomphf::mphf< u_int64_t, hasher_t > boophf_t; + +int main (int argc, char* argv[]){ + + //PARAMETERS + u_int64_t nelem = 1000000; + uint nthreads = 1; + + if(argc !=3 ){ + printf("Usage :\n"); + printf("%s \n",argv[0]); + return EXIT_FAILURE; + } + + if(argc ==3 ){ + nelem = strtoul(argv[1], NULL,0); + nthreads = atoi(argv[2]); + } + + uint64_t ii, jj; + u_int64_t *data; + + ///// generation of random keys + uint64_t rab = 100; + static std::mt19937_64 rng; + rng.seed(std::mt19937_64::default_seed); //default seed + + //rng.seed(seed2); //random seed from timer + data = (u_int64_t * ) calloc(nelem+rab,sizeof(u_int64_t)); + + for (u_int64_t i = 1; i < nelem+rab; i++){ + data[i] = rng(); + } + printf("de-duplicating items \n"); + + std::sort(data,data+nelem+rab); + + for (ii = 1, jj = 0; ii < nelem+rab; ii++) { + if (data[ii] != data[jj]) + data[++jj] = data[ii]; + } + printf("found %lli duplicated items \n",nelem+rab-(jj + 1) ); + + ////////////////// + // at this point, array data contains a set of nelem random unique keys + + + boophf_t * bphf = NULL; + double t_begin,t_end; struct timeval timet; + + + printf("Construct a BooPHF with %lli elements \n",nelem); + + gettimeofday(&timet, NULL); t_begin = timet.tv_sec +(timet.tv_usec/1000000.0); + + // mphf takes as input a c++ range. A simple array of keys can be wrapped with boomphf::range + // but could be from a user defined iterator (enabling keys to be read from a file or from some complex non-contiguous structure) + auto data_iterator = boomphf::range(static_cast(data), static_cast(data+nelem)); + + double gammaFactor = 1.0; // lowest bit/elem is achieved with gamma=1, higher values lead to larger mphf but faster construction/query + + //build the mphf + bphf = new boomphf::mphf(nelem,data_iterator,nthreads,gammaFactor); + + gettimeofday(&timet, NULL); t_end = timet.tv_sec +(timet.tv_usec/1000000.0); + double elapsed = t_end - t_begin; + + + printf("BooPHF constructed perfect hash for %llu keys in %.2fs\n", nelem,elapsed); + printf("boophf bits/elem : %f\n",(float) (bphf->totalBitSize())/nelem); + + //query mphf like this + uint64_t idx = bphf->lookup(data[0]); + printf(" example query %lli -----> %llu \n",data[0],idx); + + free(data); + delete bphf; + return EXIT_SUCCESS; +} diff --git a/PHF_benchmark/bbhash/example_custom_hash b/PHF_benchmark/bbhash/example_custom_hash new file mode 100755 index 0000000..2d00411 Binary files /dev/null and b/PHF_benchmark/bbhash/example_custom_hash differ diff --git a/PHF_benchmark/bbhash/example_custom_hash.cpp b/PHF_benchmark/bbhash/example_custom_hash.cpp new file mode 100755 index 0000000..0bdc31d --- /dev/null +++ b/PHF_benchmark/bbhash/example_custom_hash.cpp @@ -0,0 +1,120 @@ +#include "BooPHF.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + + + +//example with user provided custom hasher for uint64_t type : + +class Custom_uint64_Hasher +{ +public: + // the class should have operator () with this signature : + // BBhash will use the 'seed' paramater to generate two different hash values form this key. + //then it will generate internally a sequence of hash values using xorshifts, using these two first hash values as starting point. + uint64_t operator () (uint64_t key, uint64_t seed=0) const + { + + key ^= key >> 33; + key *= 0xff51afd7ed558ccd; + key ^= key >> 33; + key *= 0xc4ceb9fe1a85ec53; + key ^= key >> 33; + + key ^= seed; + + return key; + } +}; + + +//then tell BBhash to use this custom hash : (also appears below, line 104) +typedef boomphf::mphf< u_int64_t, Custom_uint64_Hasher > boophf_t; + + +int main (int argc, char* argv[]){ + + //PARAMETERS + u_int64_t nelem = 1000000; + uint nthreads = 1; + + if(argc !=3 ){ + printf("Usage :\n"); + printf("%s \n",argv[0]); + return EXIT_FAILURE; + } + + if(argc ==3 ){ + nelem = strtoul(argv[1], NULL,0); + nthreads = atoi(argv[2]); + } + + uint64_t ii, jj; + u_int64_t *data; + + ///// generation of random keys + uint64_t rab = 100; + static std::mt19937_64 rng; + rng.seed(std::mt19937_64::default_seed); //default seed + + //rng.seed(seed2); //random seed from timer + data = (u_int64_t * ) calloc(nelem+rab,sizeof(u_int64_t)); + + for (u_int64_t i = 1; i < nelem+rab; i++){ + data[i] = rng(); + } + printf("de-duplicating items \n"); + + std::sort(data,data+nelem+rab); + + for (ii = 1, jj = 0; ii < nelem+rab; ii++) { + if (data[ii] != data[jj]) + data[++jj] = data[ii]; + } + printf("found %lli duplicated items \n",nelem+rab-(jj + 1) ); + + ////////////////// + // at this point, array data contains a set of nelem random unique keys + + + boophf_t * bphf = NULL; + double t_begin,t_end; struct timeval timet; + + + printf("Construct a BooPHF with %lli elements \n",nelem); + + gettimeofday(&timet, NULL); t_begin = timet.tv_sec +(timet.tv_usec/1000000.0); + + // mphf takes as input a c++ range. A simple array of keys can be wrapped with boomphf::range + // but could be from a user defined iterator (enabling keys to be read from a file or from some complex non-contiguous structure) + auto data_iterator = boomphf::range(static_cast(data), static_cast(data+nelem)); + + double gammaFactor = 2.0; // lowest bit/elem is achieved with gamma=1, higher values lead to larger mphf but faster construction/query + // gamma = 2 is a good tradeoff (leads to approx 3.7 bits/key ) + + //build the mphf + bphf = new boomphf::mphf(nelem,data_iterator,nthreads,gammaFactor); + + gettimeofday(&timet, NULL); t_end = timet.tv_sec +(timet.tv_usec/1000000.0); + double elapsed = t_end - t_begin; + + + printf("BooPHF constructed perfect hash for %llu keys in %.2fs\n", nelem,elapsed); + printf("boophf bits/elem : %f\n",(float) (bphf->totalBitSize())/nelem); + + //query mphf like this + uint64_t idx = bphf->lookup(data[0]); + printf(" example query %lli -----> %llu \n",data[0],idx); + + free(data); + delete bphf; + return EXIT_SUCCESS; +} diff --git a/PHF_benchmark/bbhash/makefile b/PHF_benchmark/bbhash/makefile new file mode 100755 index 0000000..c2b88c1 --- /dev/null +++ b/PHF_benchmark/bbhash/makefile @@ -0,0 +1,32 @@ +# CC=/usr/bin/g++ +CXX ?= g++ +CFLAGS = -O3 -std=c++11 -lpthread -Wno-unused-result -Wno-format +EXEC=testTime +all: $(EXEC) + +ifeq ($(prof),1) + CFLAGS+= -pg +endif +ifeq ($(deb),1) + CFLAGS+= -O0 -DASSERTS -g +endif + +ifeq ($(sani),1) + CFLAGS= -std=c++11 -lpthread -fsanitize=address -fno-omit-frame-pointer -O1 -fno-optimize-sibling-calls -g +endif + +.PHONY: clean + + +all: $(EXEC) + +testTime: testTime.cpp + $(CXX) -o $@ $^ $(CFLAGS) + +%.o: %.cpp %.h + $(CXX) -o $@ -c $< $(CFLAGS) + + +clean: + rm -rf *.o + rm testTime diff --git a/PHF_benchmark/bbhash/testTime.cpp b/PHF_benchmark/bbhash/testTime.cpp new file mode 100755 index 0000000..f1860e7 --- /dev/null +++ b/PHF_benchmark/bbhash/testTime.cpp @@ -0,0 +1,131 @@ +#include "BooPHF.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace std; + +vector filePath; + +typedef boomphf::SingleHashFunctor hasher_t; +typedef boomphf::mphf< u_int64_t, hasher_t > boophf_t; + + +double generate(const char * filename) +{ + //tells bbhash to use included hash function working on u_int64_t input keys : + typedef boomphf::SingleHashFunctor hasher_t; + typedef boomphf::mphf< u_int64_t, hasher_t > boophf_t; + + std::vector input_keys; + uint nthreads = 1; + + // import from input file + // define hash array for input hash keys + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + u_int64_t h = atoi(l.c_str()); + input_keys.push_back(h); // load the string hash value + } + + //build the mphf + struct timeval gStart, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + double gammaFactor = 5.0; + boophf_t * bphf = new boomphf::mphf(input_keys.size(),input_keys,nthreads,gammaFactor); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gStart.tv_sec + (gEnd.tv_usec - gStart.tv_usec)/1000000.0; + // fprintf(stderr,"Use Time:%f\r\n",timeuse); + + //query the mphf example: + // uint64_t idx = bphf->lookup(input_keys[0]); + + return timeuse; +} + + +int listdir(string path) { + struct dirent *entry; + DIR *dp; + + dp = opendir(path.c_str()); + if (dp == NULL) { + perror("opendir: Path does not exist or could not be read."); + return -1; + } + + while ((entry = readdir(dp))) + { + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + else if (entry->d_type == 8) + { + string filePathName = (path + entry->d_name); + // fprintf(stderr,"%s\n", filePathName); + filePath.push_back(filePathName); + } + else if (entry->d_type == 10) + continue; + else if (entry->d_type == 4) // this is a folder, not a file + { + listdir(path + entry->d_name + "/"); + } + + } + + closedir(dp); + return 0; +} + +int main (int argc, char* argv[]){ + + // make sure two args + if( (argc<2) || (argc>2) ) + { + fprintf(stderr,"Check hash : Generate folderName\r\n"); + return 1; + } + + string path = argv[1]; + listdir(path); + + int fileNum = filePath.size(); + double accTime = 0.0; + double maxTime = 0.0; + for (int i=0;i maxTime){ + maxTime = curTime; + } + } + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + return 1; +} diff --git a/PHF_benchmark/cmph/Makefile b/PHF_benchmark/cmph/Makefile new file mode 100755 index 0000000..751b71c --- /dev/null +++ b/PHF_benchmark/cmph/Makefile @@ -0,0 +1,17 @@ +current_dir = $(shell pwd) + +#benchmphf: main.cpp emphf/emphf_config.hpp libcmph/include/cmph.h +benchmphf: main.cpp libcmph/include/cmph.h + g++ main.cpp -std=c++11 -O3 -o benchmphf -lcmph -L./libcmph/lib + +#emphf/emphf_config.hpp: emphf/emphf_config.hpp.in +# cd emphf/ && cmake . && cd .. + +#libcmph/include/cmph.h: +# cd cmph && ./configure --prefix=${current_dir}/libcmph && make && make install + +clean: +# rm -f benchmphf emphf/emphf_config.hpp emphf/CMakeCache.txt cmake_install.cmake +# rm -Rf emphf/CMakeFiles + rm benchmphf +# cd cmph && make clean diff --git a/PHF_benchmark/cmph/README.md b/PHF_benchmark/cmph/README.md new file mode 100755 index 0000000..c819753 --- /dev/null +++ b/PHF_benchmark/cmph/README.md @@ -0,0 +1,20 @@ + +# Step1: Compile the cmph library and copy the libcmph folder into the main directory + +```export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/libcmph/lib +make +``` +# Step2: Run program +make sure to add "/" at the end of FOLDER_PATH +For example, FOLDER_PATH="../Input_data" + +To use BDZ_PH as phf algorithm: + +`./benchmphf FOLDER_PATH/ CMPH_BDZ_PH` + +To use CHD_PH as phf algorithm: + +`./benchmphf FOLDER_PATH/ CMPH_CHD_PH` + +Above commands will test the input files in FOLDER_PATH, and provide the time and space result. + diff --git a/PHF_benchmark/cmph/benchmphf b/PHF_benchmark/cmph/benchmphf new file mode 100755 index 0000000..c62ca4f Binary files /dev/null and b/PHF_benchmark/cmph/benchmphf differ diff --git a/PHF_benchmark/cmph/function_file b/PHF_benchmark/cmph/function_file new file mode 100755 index 0000000..236baa2 Binary files /dev/null and b/PHF_benchmark/cmph/function_file differ diff --git a/PHF_benchmark/cmph/input.txt b/PHF_benchmark/cmph/input.txt new file mode 100755 index 0000000..e7d7889 --- /dev/null +++ b/PHF_benchmark/cmph/input.txt @@ -0,0 +1,10000 @@ +2432620340 +2127031707 +2358798315 +3127220536 +344458652 +1799197182 +2234767759 +486667153 +2583337370 +3332453180 +4021428184 +113503513 +359305085 +2885677567 +1986960997 +3791358433 +784096144 +2588041436 +659441353 +3787339936 +4154846838 +948692350 +2298946245 +2069876928 +1985185298 +894818177 +2827922050 +306835441 +2976570575 +2354620076 +3372556695 +2075415935 +3148484349 +3356625982 +3941426032 +3124343427 +179735569 +46944133 +660340847 +2975678414 +4276473109 +2588196033 +974722435 +1314122697 +3557830843 +726928438 +1802353683 +3326349724 +503856171 +2584876825 +3799801871 +4121956691 +743677118 +2106910407 +4106710030 +1929981742 +3300250558 +438012465 +765111242 +3836236586 +2460449918 +773502258 +2563621183 +2657957066 +1447979258 +4008358226 +354559029 +1668736925 +3401855352 +1837382121 +2504310773 +1558270405 +1756147442 +1586394126 +2784533026 +2700679135 +2280618136 +1417282186 +646207977 +1095299007 +1124211606 +5159183 +762301698 +1273896551 +1846601083 +3716126718 +3755951403 +1510839983 +265331297 +2400683173 +3727278404 +1516893154 +1400397321 +4114297185 +4199850762 +774639952 +2263035992 +444594530 +2954024452 +2921824587 +1887648911 +881741651 +794429697 +3305564011 +117021257 +4029052011 +943521532 +4136581304 +4153264099 +2008206049 +1040938135 +3537944303 +1070656338 +2657947785 +2338214026 +2246711614 +394988060 +4073952703 +287357165 +3675451057 +2929278260 +1774926040 +1458650736 +273990593 +3500664523 +2631487466 +38960827 +506947279 +1860179626 +4129318846 +299438033 +890219621 +3304089141 +4236670539 +4199320055 +2482468076 +160072759 +3367756989 +21617710 +3935366703 +1638788079 +2721015026 +553219400 +4047847747 +1510280015 +3633381974 +1896460519 +1925702092 +3233597664 +993342716 +3086792142 +3552838960 +4136274270 +1179079247 +1040646309 +77755059 +4086300794 +3752586449 +3364120597 +4157807516 +867736610 +2965195654 +284659825 +1833177082 +530821525 +3626647270 +1916968617 +2175572580 +1017403781 +3607276225 +3622993694 +629204867 +1807520733 +2985985476 +1810744787 +3152742900 +3346797335 +3790713207 +2956009703 +1669436898 +2467784865 +75028770 +1068315795 +3064862340 +2173690574 +101027779 +2558754523 +3159883251 +1074880556 +3541345105 +3874186720 +252037971 +1810061627 +3773947204 +3032074313 +1200281605 +3605946163 +3916871838 +1287233070 +536258104 +500605453 +1341904978 +1956520933 +3951097768 +3027079444 +1006891187 +1048398449 +1394101313 +2035261709 +2551254371 +215012808 +526690373 +2115186149 +2156646778 +2543285477 +4128562273 +1041994048 +4204075948 +3163894069 +2764692747 +518848729 +646815685 +1850521886 +3028466453 +2632183280 +2401248841 +669739981 +3283567817 +2438699095 +2595786996 +2564218861 +1553426308 +214370235 +2688928756 +1358369045 +2202934024 +3510420984 +2987480572 +1045581713 +1194077924 +3413425539 +878079092 +3819906227 +180553861 +2076269481 +3636258390 +52450109 +642195700 +3421825602 +3763487196 +2082009843 +2542105110 +1252681807 +3142800741 +806875414 +314531855 +2217560722 +3831913987 +3103249412 +3535593765 +2324637075 +1831261756 +2199902244 +1180536370 +608722685 +2749053388 +2641134146 +101972162 +606684310 +1686748048 +1147046988 +3928994104 +3919375902 +338523815 +3740099816 +4273025071 +4058617294 +1539461917 +1587723140 +3781347210 +3660479805 +3642490679 +2179360591 +599316598 +815513241 +60795650 +3099091842 +2794435533 +2839961102 +4286250765 +3260208052 +698137985 +3540122502 +1316152807 +1174728176 +4154294259 +312974681 +4127894533 +102471443 +1892546523 +1918690936 +2214064843 +1703004358 +3137949533 +2630663346 +2388591772 +289394055 +3108844009 +339895166 +3756615578 +795336977 +2751975675 +423365355 +1599014071 +1035478333 +3232412785 +1928649557 +2003362912 +1235630740 +3872701174 +835402839 +2153379505 +1801539282 +1877373303 +188975962 +953456983 +2782049653 +980026389 +1085546647 +1803445949 +353619948 +869075414 +2259013505 +2289701279 +3645713860 +3504113838 +1775565840 +1457500329 +444919834 +3314531081 +2744712725 +109992957 +1488780578 +1266193730 +3105028285 +368925492 +2207605743 +2329235182 +513149248 +370906205 +4038445847 +2436225138 +2542080996 +2137127651 +1903685290 +3452889134 +2480281254 +3696022372 +3770177982 +1529393945 +161457995 +579540637 +1975385299 +2225974398 +650462198 +3065420301 +2508520345 +1022562401 +1192913781 +370280918 +2337814539 +3570799412 +2388884937 +2411430348 +3702185471 +2675010611 +3443410202 +4092984792 +1912318075 +306159750 +1560426980 +3017545209 +2045445253 +909307446 +4124201259 +3209389418 +4115794556 +1143668673 +703086143 +3326953546 +2787899575 +2233536496 +4164535915 +3060191934 +3357230125 +1383034068 +699274182 +1243499850 +2527351055 +1810391912 +1123754047 +3858589354 +288910708 +4218136311 +2506631200 +1191566089 +2677120356 +2982577117 +837936595 +2067576523 +3084508573 +3830553278 +1454265582 +3146020116 +1879327694 +1848940707 +3719837808 +1925480724 +2591406035 +595830398 +1100688613 +2612457909 +3123988154 +2370189564 +725985530 +3915184232 +4085719406 +1748044528 +4068953122 +1088262602 +1621631186 +1175633973 +2595965702 +941749685 +1626445443 +1295841152 +2772011832 +2988003222 +4072777183 +619257117 +1582662572 +4163639296 +3192802986 +2403729589 +617757833 +2734710363 +3531965896 +3931958571 +3873560442 +25776170 +3927244388 +3743502401 +2448411338 +1468810217 +4033597831 +1599678023 +1986045884 +1641646849 +2767625968 +2292262249 +847514676 +3743830178 +766235157 +2717309966 +2578661263 +1733721215 +1469860720 +1116360423 +2545704803 +2484876665 +3105781635 +1773590253 +1942283253 +4241421277 +1010441405 +4135110651 +2861187389 +3272850547 +1150952066 +63132150 +3818038125 +2699797975 +2483757649 +3520370893 +733574921 +2138501597 +548270386 +220850327 +2707192187 +598735702 +3328233454 +3181475106 +2759123966 +3450935935 +3314587417 +471499200 +4037891537 +2263152685 +2621354658 +1923480876 +1876937213 +3985360808 +2671791012 +1272843702 +1884396002 +2017211334 +223742100 +2503914400 +1681536889 +3086031445 +3480312399 +1193719002 +2844317936 +1841131427 +2182171424 +3103133539 +3353799772 +27350821 +2564879785 +2401217327 +4000766954 +1277093933 +3346029081 +498361253 +1586435621 +3868545159 +2787350270 +1667378690 +801685309 +1646006628 +3152807841 +3873248678 +514675104 +2667225619 +3338810050 +4056715814 +3693978988 +3090591119 +3965790670 +178499544 +1087711420 +3799556360 +591991384 +3876981777 +4153195468 +3798073603 +2892384363 +1538778111 +1870654301 +3706944191 +707699131 +631003502 +4232930443 +2692246615 +3641895771 +1800407718 +3004878093 +791935412 +2365565521 +697240813 +2947586179 +3187784162 +2731369863 +1220090452 +2269954543 +533643997 +1181610174 +4264319078 +2339249627 +1719299712 +1870006744 +64695642 +411633823 +4069861027 +2442555230 +2732604610 +3521692718 +3892226652 +4132272114 +3597456351 +2536314993 +3968086549 +3043705910 +2588089224 +3791980220 +2351373781 +1493008336 +3357528087 +2878937436 +3154279394 +3888353836 +3792508245 +3331969030 +1513532100 +220127812 +223046160 +2021803145 +2832244564 +2617942795 +1809750673 +816638662 +524252587 +3142085509 +323456048 +1596313956 +4681012 +155287962 +1141127284 +3566346332 +2239030213 +1293695926 +1232642258 +474848186 +2582173773 +3427806876 +2129608798 +1638496000 +3114860381 +2970097487 +2519570161 +409027545 +3519040010 +2886219458 +1904026375 +1567823539 +1643648318 +2740431828 +2948718025 +463912954 +3469951872 +191153467 +1163895832 +4160209408 +2922430977 +3845026205 +2860508602 +2507237833 +3270692220 +2571254721 +3615986333 +1634748796 +2075611798 +13371468 +2063532785 +1651785787 +1351152224 +3641292042 +1969005358 +3605944283 +2017101408 +1067488666 +3683725204 +1374209841 +2714264561 +2532585922 +1022602338 +488114476 +536924597 +1965866131 +1089857052 +2177283156 +4076352720 +2428212620 +1278895854 +2514391903 +2768124759 +657152619 +2260692879 +2008984755 +2052706035 +3616918749 +1844270677 +2676529092 +3409233509 +3875690691 +2138040253 +2357895525 +4138024251 +2715258349 +2259189892 +2529946737 +2817081095 +1869562343 +2573399872 +2506359718 +2891139213 +135889931 +2780261233 +104597580 +2097530130 +718113565 +1641409036 +2747393390 +2352613739 +2381742410 +3733063198 +519147418 +4294036712 +2000911666 +3252269088 +1254121098 +4015254546 +1613346749 +1189273657 +1161796724 +3993689371 +1459620785 +1693941699 +195878441 +3131981375 +3048558028 +265604004 +1650342325 +1089547417 +2642207843 +1096004633 +3828295073 +915263168 +4250524159 +2536610796 +3864384867 +4217437574 +2659882068 +956292534 +3226028014 +2259702535 +2557722565 +482926764 +3961762551 +590973792 +474680383 +2276827441 +2423386461 +1397142420 +3246597207 +3317054703 +682631813 +2550082351 +2334685324 +3789077992 +3408527859 +4132099150 +796901575 +3527520392 +1442133062 +3345418470 +449605946 +1687613224 +960618062 +1524219745 +3764328723 +355466774 +1407868609 +3973981774 +2170493875 +2248617486 +1867189840 +2663171600 +3026412861 +2929821565 +4208672997 +2054247670 +1230117424 +779820572 +268213054 +3043138611 +2890960055 +1290211884 +900499770 +2686989684 +1985905168 +2756438949 +1358529125 +2104146799 +2158630026 +2164220337 +2717750047 +2452895105 +829605721 +3979884094 +3744139997 +3957498079 +2822682311 +1113345439 +777658842 +3028696590 +921983072 +3780076214 +3456541127 +721813328 +3563244670 +3286227696 +1247821228 +3738686085 +1978644807 +1565756977 +1056951421 +2999515919 +2250548083 +463492671 +2262467575 +4219217166 +840933813 +2676614673 +3982485078 +2432702502 +2712376496 +2508889930 +2443870053 +1860353775 +2287354389 +3278678756 +2324108309 +3571148896 +1002207465 +3464109257 +903013002 +2559167206 +3388667019 +1872656369 +1536079866 +2215376473 +3734321566 +2414189016 +76577175 +123431548 +960193322 +2559229853 +1821917306 +2912781563 +1937771124 +3872168990 +2213978399 +3670721494 +3967235350 +1701998932 +2577677993 +950895663 +1797761130 +3338687067 +2677902274 +2742335656 +541118043 +1363594569 +2309891637 +2084337836 +283254380 +3773960165 +3260547887 +1586424084 +1344554563 +2906367623 +506693611 +1549860640 +2174640963 +1717685266 +3075168221 +2411700940 +2405709318 +3163565864 +1783278017 +3852425591 +2431925771 +3539578052 +2022248991 +2802125683 +2091193331 +4006974830 +1256927465 +972122177 +3903504559 +236974839 +3922146894 +3530157742 +3617265338 +94044409 +1265040980 +3878855055 +23580353 +2858341320 +1913808191 +1413435793 +193307277 +561945828 +679313792 +257748728 +3758014786 +3652051994 +2821763094 +3836606344 +2820047911 +3545188656 +122386519 +1433560450 +222235860 +1639218682 +130510404 +765751054 +3479075650 +3335953561 +2451006369 +1948377246 +2617448333 +3300737217 +202086042 +3670942484 +2183515372 +3952576440 +2904308714 +3591379651 +3295931928 +39785698 +1571461088 +2889728934 +3819167360 +3398778347 +1564528965 +1318175101 +3864275491 +1036977207 +4272443200 +2421178766 +2851786790 +2965162970 +1124193927 +594982015 +157037638 +2382438444 +362301182 +812773258 +1622006019 +630856245 +3135664986 +2093846832 +2026084368 +2558805735 +3646428040 +2131954033 +2605445894 +2788780366 +4147323393 +2662343521 +2566253611 +1299334185 +2717348804 +2752973223 +3063499859 +2705643665 +2881417409 +2255493904 +2828670937 +3562449876 +1292359701 +2257718953 +2511328014 +2573937458 +3234889482 +3426418430 +107169931 +2755519714 +376008909 +1551558806 +3845227941 +2401007406 +803870285 +2360136043 +564527533 +1318854830 +230086924 +3602190128 +1935562740 +1968446405 +1514513858 +3515577633 +1712721079 +260538185 +3896989813 +4248255402 +2293152697 +1416958822 +62989027 +3200069245 +1246417338 +3991543728 +763808499 +2657687523 +2938941929 +4146160081 +1822525210 +2843892211 +3156024255 +1099634584 +982191897 +2932631235 +112066835 +2216371340 +112213852 +569730111 +3228375302 +2899827934 +46506970 +3540001502 +2225649207 +170122717 +2489626528 +1237394788 +2753312763 +2224925173 +3367724082 +3389169157 +3175709756 +3720154106 +3478575197 +329283638 +1709486665 +3323607752 +1483550765 +3508751869 +1717275167 +3889157416 +4207112896 +112577768 +2183745357 +1553324203 +2511653167 +116331724 +1977819601 +3567667660 +69475336 +1608055256 +812844658 +4138094194 +997919630 +4042289640 +3851678663 +1446820160 +1543068033 +1765972265 +119808263 +1622265598 +350227320 +34571518 +2146308006 +3035332777 +4083395092 +3054894665 +2433400287 +3171523066 +3241927040 +4231567339 +601947846 +427061298 +2392108476 +1620569222 +2897838655 +3753316106 +83284846 +3251472860 +3713383258 +3438405547 +3312922595 +601187058 +2144468123 +1424738935 +1241117332 +2995937118 +1369736534 +868538956 +2569727356 +2604396824 +179805396 +762974905 +4162518623 +1972771216 +2968681167 +1578088554 +4154993716 +2539095894 +1000820237 +1656240897 +980935920 +3496476658 +2335439386 +1512247632 +1086787884 +1331831842 +720185461 +3385614058 +3410746920 +3246850318 +960399840 +3950281496 +3357698099 +582249257 +4119331196 +3805271339 +1050185815 +3466592404 +1258676964 +738503986 +2818712103 +1355949013 +2737511934 +3480886819 +217947545 +183057980 +3793630122 +2905762666 +2058754958 +3159969735 +1401166393 +3952542226 +22711572 +1778539451 +1440574975 +4060821439 +2269744617 +1638990922 +3400911776 +593100527 +667559440 +2676867213 +18427740 +2899403868 +3815175136 +616605467 +1463755002 +621434728 +162352459 +3698655784 +2717228799 +2019708042 +3655891012 +330159177 +3630781779 +1563802338 +2329048147 +1925286617 +388473328 +2967567959 +1310012573 +3936760035 +1363171302 +3638225813 +254633000 +3113635535 +4260920609 +3748537767 +3304064121 +1714888228 +1342417663 +413279806 +3139136183 +2718307208 +3731529712 +392450247 +3188026597 +3701831632 +2504057606 +2235670595 +3856615603 +4263466107 +2709772020 +4253304856 +796194420 +2955885529 +3194964025 +2638872141 +3619263538 +522731074 +1583093246 +3477248348 +4007228677 +2229510693 +2269945881 +1226678102 +554294429 +3724773298 +3556855494 +3489634254 +1036947813 +2037624393 +64160794 +792042646 +4037455367 +4196847189 +3659452954 +1987881906 +2036920414 +3530808604 +426034108 +3594012038 +676430890 +3952424756 +3826603760 +290709063 +3326024882 +3485316669 +3642290070 +1934573961 +404316711 +2597239617 +3654956667 +2099092186 +3203144283 +3945845884 +842670081 +4235588729 +4219080773 +3165044958 +1999541421 +422123576 +2061096083 +67733309 +1748674298 +3465738553 +1930119014 +761634827 +2834039247 +176588109 +84941904 +3076578436 +3913574184 +3385452519 +619470508 +1683597277 +3601980101 +1073229646 +2365974553 +1605213464 +457123038 +3724479121 +1186711351 +1265836655 +1571507699 +3175253054 +1971891953 +2616065889 +1540264933 +2348751632 +2709965882 +998812970 +2394416874 +614943406 +4211153693 +71652869 +3397168049 +3148265875 +1234693237 +4113162009 +3972402177 +1562649830 +2238591757 +381061429 +841612718 +2102292476 +3633509046 +3673741366 +3566978945 +3169781305 +770270944 +3557130047 +247833752 +1640467961 +164610492 +2035609423 +1684113941 +2713824473 +2744444950 +3542778046 +400897575 +1312819440 +486875315 +2630448170 +4284006138 +415864144 +540557539 +42111231 +3235891407 +140013021 +4109572786 +231524798 +1355117792 +552537397 +1079256124 +3624302504 +266661133 +40348386 +419952449 +592928753 +3550809048 +13844854 +2201038652 +3313265271 +2094010270 +638741508 +1977703367 +892086865 +352590124 +2246888824 +2863129856 +3566178256 +3659861243 +517176552 +3442684649 +1570585546 +2657170356 +624541017 +2752570810 +2350340466 +3949180693 +1805912330 +823527835 +1126334745 +1240368362 +566300029 +4271475693 +3104194441 +11540645 +1412286255 +1593084522 +1455285067 +15224525 +2605344160 +37021037 +834714831 +3506261144 +3121267976 +1786523998 +2203815461 +1883279072 +3483350219 +1677623309 +2720316885 +153664616 +524491070 +203591129 +1536800252 +1004199715 +1755986193 +1675252925 +289164353 +2301986233 +2973445227 +634630949 +3224717859 +3058142375 +2493226197 +2877862662 +2426627663 +367468925 +1996175390 +2627938404 +4274436329 +1070095061 +299072638 +1759343979 +1450466394 +619265404 +1737072501 +3941902509 +1025715272 +860307722 +630141793 +6683040 +1050065273 +1028129133 +3982711428 +37937278 +1613531775 +1900809159 +2971983598 +1274500575 +3700608775 +663763998 +2223258662 +3701903792 +1075554979 +3268968167 +3673551638 +4257158824 +754643648 +100891208 +2865649757 +1873353074 +4100692391 +2210198893 +1485122072 +525321696 +893519081 +2750866897 +2888802512 +3236710314 +921547828 +3456926878 +111103566 +2682031641 +631326916 +1185142231 +394918604 +3042767492 +2357250118 +3851148455 +2709205066 +1308278686 +3654284902 +3556404563 +2432349733 +3998523981 +2609339255 +4035419769 +935528154 +1059820895 +1808581018 +1461238415 +2424151880 +309976980 +2128086034 +2288025054 +2378589794 +56143637 +1681700108 +2152591638 +2412935448 +2106421509 +3258405735 +584923377 +3726211298 +3914369535 +1129073090 +227719057 +251213182 +1029906968 +4215454757 +2627272624 +171841543 +4115053734 +126044339 +4174783910 +2668519056 +3935625759 +2073546487 +568073511 +1159834430 +2182669171 +2532513849 +3447877876 +3945495570 +3422881377 +3256243213 +3774579381 +1260184864 +4188686644 +1174490442 +3052472707 +3726135624 +518434878 +2588692343 +3895626503 +3453280448 +4032090428 +176835955 +1043346968 +178778573 +3502506874 +3842659710 +76240090 +2865812122 +3475898958 +2093625333 +3961337137 +3814532060 +1198923583 +1639716149 +3677624463 +1669160132 +3726304077 +2951151137 +596538953 +607331223 +4286992625 +1814085717 +924485488 +3422738740 +2899215027 +1890523510 +1140671064 +342539843 +1498188627 +582705360 +3672352267 +2894560189 +1605337701 +2718901929 +819513482 +4013058727 +3244096250 +123095160 +706026970 +3616555199 +3727180223 +483725362 +2293948487 +446699630 +2676090329 +4178212513 +1182996039 +1405754653 +2594381519 +2095746165 +319557029 +2420767802 +327603039 +3431331494 +305925746 +1738042683 +236984540 +3553334629 +3394278813 +2454891222 +3492689389 +646556152 +1854999408 +142165210 +2043593545 +286004192 +3871534313 +3833025200 +1617893675 +2959206985 +3373300199 +427453104 +1344302864 +2018088836 +404808776 +1048131281 +3825365751 +3302983815 +1579672174 +548865158 +2480862233 +992248607 +3832857413 +541113075 +3877740991 +3307272377 +2308941053 +2194742357 +1314942142 +2239106862 +166137395 +1319062381 +947454245 +255125856 +3980388928 +512676008 +1809985437 +2981053639 +313388872 +1577717542 +3048250247 +768485798 +3933938075 +185221805 +1441233953 +3053614944 +2455205147 +614864318 +1428022215 +2356363033 +1451362064 +1949724515 +1748638911 +2869821598 +4170277003 +145608650 +3981580990 +32494899 +3991667746 +3895346725 +3874590011 +3809324673 +1603452974 +172719776 +2746440736 +3455360245 +2453290621 +3803918114 +1645170850 +2809663756 +3110264141 +182877079 +448040857 +1702499752 +3221283256 +2639489185 +22791283 +2524442638 +187949422 +3957579457 +469016604 +729878522 +2794604555 +2730195657 +2520867208 +4192657284 +3893152309 +335552687 +3039712256 +2484495391 +2368139516 +2066570624 +1121470390 +3568228427 +3271478003 +2477052528 +2769551516 +3781208711 +1511376231 +3482500661 +1937058196 +1212845961 +4267090951 +2010317353 +319670345 +761498762 +338862861 +278592924 +2285307017 +3258152845 +3173270582 +628434617 +1233035826 +2005560118 +1326407697 +4104562080 +1821039065 +3402119251 +685542157 +1796449869 +3266909840 +878107485 +4123559706 +785558753 +3525900538 +3872507797 +2775532993 +2952867859 +88360683 +3269847937 +2478939217 +1321216694 +3730349281 +2800950273 +2833148928 +2090284632 +2505128482 +2615172491 +814040100 +1329226656 +4077281217 +157161132 +3434253788 +293224132 +3292700684 +2913131212 +2915753328 +1612680903 +2023969435 +2826840949 +201119470 +3122493285 +159159070 +2247537328 +3176474390 +3054356980 +3584841072 +1356541046 +2959426068 +1274893807 +1765687668 +1021646537 +1156191573 +3133782231 +778037259 +611692964 +1212904036 +528905009 +2650869668 +3562839801 +2440403110 +2561950432 +579870754 +2417554482 +2855490853 +1903681674 +506238254 +2006109177 +252696307 +4005001826 +3379695687 +2128633968 +179059723 +639024783 +78244936 +2863661234 +2532547089 +2277631617 +1699004175 +3705221033 +1899836146 +1961568934 +1779744192 +55309017 +3017422878 +2812874888 +4015417881 +3875594117 +557634679 +960285174 +1220925696 +678330840 +3384442923 +858012028 +772208339 +2020158908 +2404596468 +2125375196 +2079618509 +2746245147 +314909956 +1564800446 +618740049 +3364049326 +1751600707 +633385430 +3394199965 +1159789406 +862361601 +713071799 +2927859211 +3956048909 +1642158488 +3106308623 +1208944721 +244385245 +3477857008 +833542367 +3908973421 +2613945605 +2730375757 +1222589962 +1129491419 +2238189449 +1217622451 +1729084364 +3143389686 +3355771170 +1470978890 +4112702674 +1892787043 +3431977723 +1227273152 +740927971 +3032487709 +2639378972 +3968098045 +2018385342 +93469957 +2545788405 +1232963247 +2824189874 +1950209862 +4079334718 +3930325807 +2573355546 +708721224 +3454425197 +916547862 +3421972427 +185049442 +561746642 +1025256618 +1259013068 +1889091687 +2040238523 +300404309 +2159807608 +1239264942 +2017658986 +146972956 +3842324966 +356538540 +1014130078 +1364992679 +907187550 +3101694881 +307564896 +4153304542 +2235870202 +236525014 +1303478412 +557322625 +2388293328 +2306930822 +1498713808 +3099473899 +2053283572 +2247147991 +2663394698 +2258852580 +2715512380 +3192751114 +462154683 +1473204743 +3421669421 +3458132442 +626095890 +2739708671 +3739229555 +2637433584 +2027133032 +457057552 +990114918 +1878378915 +214257907 +3319924106 +3650040990 +3892614082 +1811213429 +3537073085 +1641064239 +1408751169 +3532652421 +3521618006 +1269720639 +2925422386 +358605377 +2155237915 +1497876383 +3689526582 +1729792964 +22307564 +1516208938 +3421625378 +937311632 +2732081735 +3946427111 +4136208369 +3851621608 +3277422787 +349500039 +648399759 +990381034 +1577715367 +691365790 +1784824257 +1253592435 +4084770408 +170818138 +1252243100 +3760611897 +2051592358 +235308270 +2437184225 +2620847907 +2092310629 +2717773172 +133679598 +796325422 +826383012 +846161896 +1131174914 +538054201 +239074701 +3070716350 +3740971212 +1739347626 +916310132 +1101231773 +1756516850 +1236843889 +4071821065 +4091993028 +2580158247 +2739923205 +1103955750 +3177732285 +2956536945 +2655821066 +243386306 +4174838649 +1258314758 +3388146401 +2806088249 +2588763302 +180497651 +2460321930 +1996140093 +1630511663 +3535678061 +537257490 +3286559096 +384278767 +3793434824 +3169304353 +1632308140 +2681251146 +4231237465 +3978109459 +417192129 +1913060365 +681387263 +2497000609 +2465506869 +3371274653 +578618701 +2239791959 +3941592435 +2324633941 +2368275655 +794915219 +3750928951 +2278038915 +1153101466 +4028226184 +2619964244 +3897426995 +1849307775 +3549280860 +512408081 +4250879235 +3839088085 +3247140764 +956784552 +1914728119 +1452656786 +3300202984 +1652674767 +1331930148 +1630873719 +398478674 +3701645942 +623600313 +357897434 +1721586388 +1446280256 +1126289475 +910865649 +1622264605 +2710535805 +3975901108 +3312853288 +856431129 +570963671 +1512869720 +3777543850 +3302549372 +215579663 +387874571 +403384694 +793501601 +3272436241 +1656058242 +3756335267 +2282440800 +4271975338 +1053615694 +401273674 +2770385780 +4191113746 +2092840014 +2995591277 +728785901 +665892902 +575276274 +3051550744 +2409601267 +3800605224 +2042641258 +77766132 +2637188550 +866150203 +1341780020 +814875486 +3216890206 +132663820 +61412614 +1951748261 +1621292896 +2745888891 +2706657717 +3250575829 +2058964328 +3243810446 +325214425 +3656358242 +2742442770 +1392135247 +3771601946 +3657341184 +33149189 +1087062822 +2334001068 +2023635261 +667134625 +2443056757 +567971537 +2868651342 +949598430 +3264233362 +3666273042 +1104587134 +528185632 +3591898359 +2910576341 +175948691 +984877766 +3599042772 +3291492166 +437323073 +1387646304 +4252700685 +3428333302 +2618453706 +3728075615 +418781236 +119319392 +779916745 +442845484 +1286844377 +3400161273 +3210285203 +435805441 +2066434570 +2142073024 +94135635 +4036847756 +2015726319 +4192542091 +2922000143 +2191348955 +1340543441 +2188889805 +1202888120 +3943808033 +2908060098 +339724444 +3358184108 +2954422815 +917687462 +3952693660 +129672324 +603468380 +4165417209 +3825015025 +1792285778 +73001125 +1868133302 +2431117974 +1392114579 +2072388605 +3947114731 +1898897389 +4281971279 +880652115 +3903785904 +3057379567 +626153034 +1403122712 +114812974 +1376517038 +3309663714 +3151072302 +1804322318 +917636598 +3248611127 +2454407180 +1605953803 +3916497229 +3937343853 +3498851299 +2750047293 +2783534254 +2742400062 +4148744271 +2436249813 +1414533276 +1475219262 +2919071799 +1719904033 +3859084425 +1234122122 +370999499 +960539823 +2057842390 +3364062194 +3950124350 +531039455 +2844509278 +3973552471 +3098605112 +3551530793 +2636045004 +4155000720 +2252641070 +226282968 +2197084095 +1151778064 +1603905122 +2946574028 +3637295911 +4221221592 +3027378739 +1721006104 +3127385015 +3167761214 +2765576726 +2391056924 +3058243139 +3402983108 +2608315786 +3785194364 +3863981278 +222565798 +1263459166 +3482202700 +2506483893 +2698058331 +1226444999 +3439549624 +1333222647 +1807238265 +951451390 +2633925796 +604080405 +4241687969 +2560787312 +3304334803 +2776281370 +3224017989 +2986680958 +881394435 +1739409719 +2915015081 +2363612066 +1876707842 +2771033718 +3651711889 +3534686374 +1977926989 +1847054337 +1437325158 +3898780253 +4006043459 +2329226652 +752288600 +2023812150 +4091747577 +115968134 +6265501 +2701062647 +495046923 +746620834 +2684023094 +2033821841 +380952289 +3043188751 +1649104251 +3003972020 +3931278147 +1092579061 +1438285915 +428027343 +3129256619 +3075561994 +2154416758 +4061370980 +1353661681 +3744500560 +54894311 +777325136 +2235779587 +4294901563 +2375721291 +1403038990 +3630095421 +408399649 +967553044 +1831078830 +3447255237 +2729001732 +1362207639 +3983903108 +2464618322 +2594372135 +1658522495 +1972325625 +857669952 +1714820351 +3639153519 +1877819688 +103249924 +1433161778 +732450487 +3933142471 +3494710812 +1209791763 +1306651494 +1276996154 +3970910131 +223792768 +1448588254 +299023472 +602707666 +3898112762 +16913201 +787381219 +890232540 +3626751280 +839843850 +2995712874 +258448828 +503018465 +2771539419 +1576042558 +638941541 +930617723 +1339711239 +489810848 +2133326164 +2668161661 +3621307409 +1401153495 +1628157519 +671811844 +2663168044 +2685744284 +2366617786 +2719371301 +3690735452 +1553638622 +2568959650 +3471616875 +3456854841 +1652377184 +250631385 +3619052601 +1926295091 +2761481876 +1116863430 +3914238680 +798417266 +1825148045 +931968509 +698909994 +243506923 +482559069 +3089526363 +3952535550 +3143317768 +3905833857 +3536687256 +2212318697 +1613332135 +1755030535 +596791621 +3530671477 +4169695416 +2762903721 +2114838291 +963166244 +2121815044 +2290531204 +1695939074 +4025367611 +3762189496 +2455001713 +1751604778 +3924223594 +2745977247 +3165414580 +412167368 +2088468266 +1659865868 +2974706309 +1873189660 +1629577787 +935837221 +3284136975 +876004607 +858564656 +2498486962 +2490529797 +1020260619 +2933131365 +2517809917 +1765600700 +2082937488 +1779209704 +714438097 +3323084156 +1404001911 +2072983239 +3946019608 +4005781238 +1153291020 +989562520 +4099301651 +1353133566 +2457100257 +2539468239 +4048937418 +882241155 +3992449970 +225916024 +2286319901 +1169689920 +1206524539 +3735905169 +1207131744 +2872277008 +1493642016 +417398803 +690708357 +178888404 +3836218897 +3311788801 +2571765436 +684167208 +1136213085 +900454610 +1308391170 +763618653 +2823505681 +2402046303 +3608616396 +4261725752 +653307004 +2371196937 +2770914835 +3478208015 +3661875255 +1604001011 +1769731838 +44742197 +4056262483 +886712664 +3523208270 +2004671487 +603552262 +341701675 +3332167977 +2381727671 +929347605 +836464067 +1988131877 +68041483 +1563199327 +932455228 +3212057919 +1744156976 +4174451636 +1572057334 +2863852703 +2980354966 +2321372535 +1686726795 +2844720427 +840096521 +3724773514 +2343339546 +3735823775 +3981644065 +3556191984 +1989344221 +4180397558 +1073932991 +1017564528 +1915759755 +3951386030 +1278320667 +2901643040 +74777999 +1551662983 +56801411 +961753080 +1082803098 +1429035726 +2361695013 +3928452638 +1473201959 +2812028887 +4234075307 +1118147967 +2879942694 +1572411610 +554690339 +806495541 +2335930464 +4069575682 +1344691849 +3964593004 +3721865029 +3171156289 +1761261587 +4025756521 +571137916 +3980165039 +1082457038 +40800310 +508947279 +365687949 +165712864 +3617695388 +3095869056 +4050056703 +2548776557 +4170728684 +3496416852 +252956041 +482251575 +3802027900 +2367113512 +680612387 +3236559965 +2334043760 +2410136615 +817277405 +947934915 +1017009177 +2911946924 +3888967478 +4036063321 +3067803251 +1313850085 +1582534724 +840089934 +936228955 +4090310809 +3816987702 +255398919 +3892256940 +1745570110 +3196661004 +1854283120 +1255951030 +3234684432 +1119065689 +4235735678 +2922254464 +88725575 +738937632 +3722754091 +2964821813 +2533865341 +1175663591 +2494241554 +1205567575 +565427928 +1008426767 +2968099020 +1330546642 +505995910 +3266271000 +3339671143 +503859283 +3235244395 +3779725971 +37947543 +2128663330 +4030312151 +103595306 +3791176610 +104504883 +218063150 +461996390 +996938257 +1779405754 +4179870026 +4111290340 +3985264743 +4195182149 +1264629851 +3122030764 +2347817495 +1685996052 +3599711326 +4033104946 +2920911844 +2035828800 +3930090006 +810137551 +2963926600 +216734586 +2248961100 +2326805046 +2003881575 +2344639823 +2801542317 +3393147722 +3915133660 +2804220835 +972389778 +1608700202 +1378209271 +2355789863 +4199952261 +1920884694 +3328608501 +647291628 +3690731849 +2978243444 +1079434555 +69040561 +1885917647 +1064406586 +3804338930 +4242311641 +947308094 +1968969130 +3031700694 +3419232639 +3269295488 +1267559121 +4121221500 +977206583 +3002615670 +2934857643 +3716154217 +990211072 +223173338 +3365129552 +3218068175 +343833011 +2460897807 +2111114219 +1118544028 +3380233396 +4181653493 +3950965046 +2744878600 +3792153283 +3872078873 +2708345208 +3209389086 +4202338519 +1495316875 +1415767084 +3254127234 +2184345157 +1294274766 +516908375 +2263818240 +486696018 +1302975055 +1050654776 +2836979504 +1305375456 +2089729504 +2887614464 +4055605864 +4023309015 +2351119292 +1563036158 +3545620988 +1999150859 +3582297645 +4197628210 +945701236 +3790642124 +3088835493 +535718759 +1122314928 +510968223 +4285078729 +3300305427 +3168559591 +2378635458 +3895355229 +1652930401 +1778082363 +1031053732 +3755169289 +3987603234 +4254350961 +3068344859 +911651709 +2607645019 +2290148178 +3575542805 +236579921 +1362330618 +3415400631 +1336391860 +674893410 +2831012691 +1078405701 +3620574361 +1147269352 +2200373543 +2581695421 +4104020618 +3583500133 +311752031 +1770148625 +333405043 +4046062444 +3432808186 +471714860 +3260634009 +3918931231 +1248642401 +4198939866 +1913938785 +2930950062 +747064115 +4242715373 +3690306550 +1519758355 +2882112439 +521863875 +1386946598 +1918619932 +2346817277 +1173383693 +2466928243 +1681460812 +4236792309 +1303231875 +3468614244 +2938574063 +209159751 +145491810 +3221582355 +449745792 +2184137317 +1802716533 +1817295499 +1926313136 +12135251 +1478146698 +3645383516 +1874524688 +1128347951 +3112400767 +1694336432 +824899246 +1742764224 +286945839 +2739569678 +4047631347 +918055585 +2668363091 +3353886120 +348138486 +1225230028 +3395994367 +2567789516 +1180622050 +1017538581 +2146827743 +3866453447 +3026324959 +930297041 +4108450645 +3109309173 +4263414098 +360902739 +1996649827 +915560481 +1948738830 +1386633457 +3131609733 +1993273621 +2934098044 +3300579237 +3627840243 +1244542037 +1772202674 +2268470253 +3821248890 +3290074064 +2610033006 +1128448474 +657233608 +2592856084 +939655606 +325459836 +1204556722 +1479198606 +2080836260 +2787888919 +1995193712 +2691056214 +3850436381 +1530140248 +1576078255 +2672927278 +2913592112 +2995822944 +4248011468 +1565589844 +1250859971 +2247828082 +2087817913 +2372758693 +3937522657 +309298636 +1839412147 +1192792474 +583344496 +2653972257 +2062798221 +3823789234 +1489086513 +1050798738 +2742056137 +1433312227 +633063303 +4015635715 +3008202037 +596225945 +2664988982 +587544270 +2681780162 +3451682611 +2208459537 +1627745 +2911881409 +714138739 +3262308744 +1101499425 +1966359247 +1450751326 +636350292 +3604316592 +3427257200 +2581199398 +3241496227 +3674927709 +3152303726 +2038785747 +586644409 +194303910 +3653366981 +462717171 +1195117264 +1653146828 +403327256 +3439041498 +1260530719 +1329966904 +990365249 +2425682641 +479674031 +2198785525 +1185291807 +22654523 +1209246946 +3708488625 +939389070 +3729156003 +2466190492 +2626288495 +2727553250 +169036262 +1856622608 +530727332 +4107789913 +252912730 +73107743 +2325640306 +3869192153 +1297395231 +2497680859 +3718990931 +394789676 +3700630200 +1396237210 +2975345009 +2511281548 +3814995979 +477651413 +3508451142 +3948886971 +2231246984 +1881392652 +2801451116 +2547651706 +634185274 +1655894420 +1369641012 +1511125791 +3708571878 +1068101556 +1042123081 +1998415090 +265044099 +3808299921 +62407428 +3272651855 +2480687755 +1843307138 +221119531 +865302847 +2790514616 +2212063783 +1365939001 +912347761 +2021507854 +3089014851 +3948789107 +1406453776 +678758510 +2477763005 +4047587621 +3995211898 +4009249518 +3527646518 +1671209653 +3311947582 +2627888155 +2142030316 +1779614874 +911622784 +3406593231 +2588542590 +2645751286 +41800075 +3276913566 +1556832997 +3772897255 +4055747600 +2301672488 +2918562164 +2782107232 +1431430627 +4134921679 +2678074446 +3852674008 +3501965771 +492552821 +686939864 +1475431947 +2799680717 +9176967 +2699935888 +1630047423 +2120978928 +1180751955 +99102830 +2393585682 +1398852891 +2416212263 +3028829936 +3035426872 +3074442312 +1114212928 +4091711032 +1579122060 +2168672810 +1673460361 +3951723212 +4251690806 +3102767691 +4016889843 +995679086 +993388382 +180212579 +2511682504 +2778639017 +1122550333 +771806046 +4197704634 +1323033047 +3405162003 +553907685 +2238190813 +2117885606 +301576278 +2025695857 +2042462585 +152664735 +1061086330 +3302784200 +2197066594 +1350004628 +3074934010 +2674708076 +2058661002 +1431203639 +4256959338 +1064828766 +780770878 +1740645757 +13052809 +2144226940 +3608021395 +2344120054 +1430687654 +2526181645 +3404526334 +2335473938 +2771481799 +4060071198 +1981637855 +2217240126 +1065491328 +4101624659 +3680106225 +3685310256 +1477525669 +1237638642 +3826718666 +1775646839 +3911247815 +3267596590 +2576384377 +2764306721 +3194058612 +856123202 +3156096368 +2630715241 +479806465 +1924736864 +682574243 +3618141848 +1472551733 +3427313107 +690669867 +104014059 +148271813 +1488472328 +3641627696 +2343285071 +1504653093 +2305651854 +1571761186 +4245556979 +85803379 +3454845596 +3084887808 +223128415 +3491006515 +3415454961 +2005776017 +411726737 +2728808987 +2701127517 +510578317 +1486024321 +1717486491 +22897941 +4271875590 +2686417795 +1285108897 +1501335890 +1047269014 +279352576 +83291469 +2779276298 +3325277281 +1982276095 +2591879374 +4224799692 +78749925 +2657374796 +2486591362 +3557554528 +3960826739 +1095375508 +3581363890 +1787811968 +1825092715 +871926210 +3891617307 +3672866923 +3633865046 +2199915759 +3412514934 +2244812560 +2991698085 +3242293965 +1102918157 +516510674 +253903322 +4210411845 +3752504576 +483850493 +1704451156 +3389400418 +3843325686 +2882643741 +49790387 +2002093053 +1963582255 +1155867012 +4159165417 +2806389562 +1409170710 +832490754 +3947428969 +3535172374 +25585603 +754411277 +3685825554 +3034424958 +1740697036 +2992377993 +1267082009 +3497973560 +2101264691 +2064367195 +3264959801 +3319420659 +634967219 +3604404240 +1382282036 +1924501150 +2864465602 +3119323204 +33828236 +159362536 +229706909 +2010379446 +627662428 +3843072378 +791477929 +1451818768 +3948205695 +1420537794 +1252518712 +2244028830 +477759505 +3252365421 +2226873031 +351983629 +1475945565 +3732560692 +2444105173 +3848620758 +3107000248 +3982530913 +1175579108 +1892287304 +1810716242 +667727286 +3860796115 +2203724177 +3967045931 +1805167314 +729361387 +3524612305 +2687171646 +21352410 +2172292223 +1204267585 +431172472 +4084314043 +472231800 +655420309 +1333815739 +3384637997 +2667737888 +3950366284 +1274836430 +3133589550 +60398814 +1605191929 +4162134853 +64871930 +3789610429 +1616147336 +3358500261 +763304054 +1791183187 +1032914965 +2896918362 +1464162695 +1990799441 +1969242586 +1171379935 +2416401298 +3846959601 +3685110229 +2190698 +50968702 +570041646 +2455853605 +2574293235 +824412542 +476795443 +3356802614 +2259349842 +3570720071 +2700544903 +922040838 +3488244320 +2028182450 +3593734511 +3359279220 +2793959457 +1372714774 +3346346467 +3891231451 +348502678 +3113026413 +3019888593 +1972708974 +3095164343 +1999785218 +2847938459 +3466777075 +506778818 +1941401893 +3754057236 +470442332 +153813918 +3851869707 +2291787364 +1854632490 +3593736886 +2090949679 +1006670387 +2967896769 +948096166 +3703232415 +3195256632 +3455188226 +3037857885 +3923477858 +1003514760 +2753812149 +4191880515 +2234639545 +2938159468 +3311175886 +4274336710 +1843254555 +3973778257 +1511524898 +2221855846 +723019591 +92771762 +2825973074 +3730142081 +3915038289 +1035278254 +2726822064 +3919309387 +2121099670 +3646048945 +2488285066 +1147430042 +3009583529 +3578598933 +4085511290 +3928960949 +2544723643 +466412306 +1377564253 +1756542013 +105919577 +929650913 +3129079340 +2861494849 +3264320549 +927979271 +1702473050 +407611380 +3020970461 +825362738 +1696887602 +3866976261 +2303280185 +1774879007 +3825741391 +994811018 +1729380070 +1561513836 +4110042492 +4224222254 +3454439042 +3496313031 +2485279771 +3652567156 +4234962975 +3409354566 +1552989136 +1998914663 +3124065609 +1901973486 +2240736541 +2041342927 +2798183706 +3956093238 +3369089195 +2043795028 +2381465067 +4038757637 +1541629869 +943880739 +2444244289 +2174387498 +1368149385 +3812594299 +1911684395 +1443462471 +2258863950 +1750623322 +2676016783 +3692919129 +1876381328 +1261849132 +3822519468 +2336494641 +1359514296 +913611038 +452978262 +3508136149 +4147456948 +100261959 +3911454813 +2008138442 +2371883405 +3790646025 +3763809499 +4046102049 +3429447427 +2255267613 +443293966 +1887862573 +2361561121 +1462476483 +4275547794 +1138690706 +190269204 +1319838177 +3757976135 +2803524219 +3934689880 +3811260163 +4018413133 +3531436442 +1460519239 +3375662166 +332798254 +3648656648 +3323728831 +1105870098 +251463272 +1623112719 +958280399 +1575947967 +1669186700 +607617149 +4074162628 +672344199 +3928681324 +3397328897 +1934709576 +3838001196 +1548575787 +1167074724 +1769080901 +326274446 +428012971 +983367054 +3747807303 +3125974160 +3643990466 +3297612941 +263666501 +3057722581 +2239848050 +2060962109 +2168350371 +1120617065 +3969145695 +3675329363 +379220090 +1406404213 +3341074296 +2216331404 +2979254535 +1745751430 +2586183487 +2837754342 +3804534381 +3055380902 +2181234017 +2698221761 +2354807930 +3907330762 +1671459715 +2516698250 +1647288893 +2466919264 +1046492038 +233420086 +1615066478 +3546537389 +2743224507 +3192501045 +2972795777 +3704807459 +1333547657 +3866955075 +1509092682 +2896613608 +1628463449 +3045664452 +443031715 +3607937985 +3302956313 +4220120484 +444184404 +2148129793 +74143767 +3826787950 +3969623643 +480091760 +1170117180 +1620698509 +3899206656 +18483313 +1661274354 +974255980 +373623690 +1774372594 +170851685 +124784889 +1199066945 +1518056380 +1833449351 +342667121 +2507980860 +767390567 +2037278598 +3642767874 +455750378 +24341882 +4242772694 +1671491918 +1361241062 +3527031865 +4110785864 +3401725268 +3088082666 +3171705537 +315072449 +2021831162 +2202161254 +2749000530 +3144456293 +50473590 +3275561756 +2843245285 +2261501275 +1341405282 +775954173 +2132392757 +698536674 +3805124805 +704826365 +3261250738 +3703346640 +3176459179 +4026754498 +1084439194 +2307065339 +3748056781 +3314750287 +4260602080 +3164095311 +2648948382 +4141964944 +1750668066 +2194820712 +4234520687 +697979228 +4174142572 +494782065 +2647576748 +3454945985 +3015238900 +4212897966 +4261200239 +4235271279 +449808251 +892032411 +2645051389 +748391918 +3662183043 +1191713895 +1752853222 +3485121568 +2735406119 +1064175130 +1901134421 +592889699 +1443459292 +3626903617 +2993348022 +3363405127 +1697893951 +958415954 +3934632380 +1165054846 +1286257949 +4254659254 +2020263941 +3339482430 +3405268222 +3388335966 +1193332041 +512461122 +2799953121 +2547262992 +2267748407 +742727028 +687281498 +3678199428 +3467968363 +3726557175 +3202557214 +1943732528 +1034487636 +1206023697 +2499704597 +4270780843 +3373569273 +665310034 +1483837753 +3450677462 +3863247860 +2385107919 +3768555628 +1795150509 +726542185 +409684454 +3211944714 +931424902 +3181619983 +2533342500 +15948119 +2259944081 +3617872006 +321514752 +1326528536 +3368854051 +2079173885 +4020225116 +2874985113 +1086456412 +3032078996 +2434671755 +2367415913 +1869910503 +1006868639 +2001773588 +3654528382 +4194824628 +4241363498 +3050214240 +2703856682 +3844534556 +2444358683 +1115605904 +3781882121 +991705225 +660621102 +2531354668 +114029217 +3777728977 +1181913072 +962704687 +2503720653 +3361007134 +125192272 +2851767060 +2424348490 +622547543 +3244155189 +2766977431 +1886689803 +2715501397 +2241328659 +3449509546 +3201471807 +802258379 +449313788 +1796327975 +3233935500 +1226320330 +1181883118 +2574157491 +1958994943 +76735125 +501321417 +3866528761 +2147789123 +469420644 +3727654891 +1473040578 +1869484495 +1275060634 +3025483428 +2325113096 +1216820460 +574590332 +1122185619 +38109619 +759681887 +3875197724 +3790033102 +1340678892 +3573845168 +3772291411 +1157802013 +426082654 +438636417 +563587993 +3940876359 +2122000588 +212002594 +3174005963 +603409636 +3022742702 +2260744561 +3198404938 +1485067924 +4021994500 +264751628 +125633192 +934244586 +484844933 +1617718024 +3262523871 +1686352572 +2628601534 +275973420 +2185623719 +282111929 +1350618117 +3242594725 +3937441961 +463601220 +3656195955 +2513365553 +2784728800 +1396112563 +2040180879 +4031834421 +2806369621 +152052140 +1647162021 +2653717408 +2667502212 +346495439 +422006676 +4179204593 +1927007304 +3909029914 +2069353530 +383935359 +488286797 +4276411083 +609525431 +1836891976 +2513242996 +2879349400 +3566907459 +2200427867 +2082974161 +2767712407 +841564174 +946079397 +2684516872 +3174077842 +1980657892 +2821240387 +1581216472 +2819461298 +2890238773 +569610423 +2913010224 +37907788 +3491174385 +2647944014 +987423552 +3855821064 +2984592710 +4044657230 +4174437350 +3019070698 +4031197456 +1884282589 +3677783625 +2698643142 +2593164345 +3592773772 +3817081958 +19341617 +4129900740 +728948501 +257108131 +2212662189 +3201019581 +3908390786 +283633134 +4095944503 +1785232977 +1113619566 +285999804 +3029060464 +1394988220 +2968029156 +2752005174 +2092187791 +526156713 +4105844991 +3971376549 +1238216551 +2626671202 +2597282993 +3968511479 +3381553430 +2296343017 +3777486354 +3532622101 +1135064884 +2042649509 +2675082693 +1932269144 +2736434583 +464018704 +3595146432 +3532446565 +523705493 +1791740111 +1489360407 +119885383 +2632149773 +621984430 +72480451 +1420639991 +1171803867 +2039274792 +2573710352 +2801477351 +2729803108 +1320327602 +2745043551 +1767633482 +1843301442 +1078833209 +2805764032 +747064168 +3252153521 +822606486 +901010396 +2007096897 +1306419038 +2807515681 +592732454 +3497861786 +3454904311 +829959472 +3190152684 +3071232292 +3669861670 +2162175845 +2995583027 +2613781689 +1268188422 +333150953 +1878883667 +2956198438 +2866233240 +3251684678 +1720649752 +2818066104 +4014212726 +1684662683 +1976840435 +2956251414 +967742611 +3947494317 +1225327231 +2604895346 +4261805074 +1007155152 +2292593052 +2023979253 +4236869979 +3036622534 +4166686525 +2417427056 +2369931179 +139649403 +111875860 +3159341152 +1864883864 +1150133560 +1252971410 +1094301354 +2082419787 +1851161058 +1803485153 +1839975130 +2707084136 +1163094871 +4013260689 +175822092 +3291841124 +4228359193 +4015448043 +2644781496 +91120747 +243336410 +4195462845 +1181082236 +3770736833 +1808117916 +1210684273 +763811445 +3135491795 +4001480095 +2624819923 +4275800221 +2935709572 +4214951226 +3494362654 +1766184857 +2126403382 +3760982713 +2374126416 +3675919081 +1984915853 +3155085828 +38273631 +3194198089 +2385757447 +2180323448 +1541208839 +3610618370 +2209946316 +2822763075 +2763019553 +817703402 +1247698912 +441695884 +3574359386 +2927950630 +3686851476 +1512418626 +1211694269 +1923886323 +1712955029 +414432797 +2256377575 +4077134141 +1879436849 +3888354648 +3945152236 +390185053 +3407077786 +2934600631 +307486187 +2927745951 +391219631 +3506880421 +2732504709 +2649101041 +1659371333 +648052631 +3048141064 +2519303174 +1009231088 +1812151789 +3318438870 +4186065874 +3563620334 +4110766916 +2052329564 +789330115 +207364161 +2086288736 +1273791535 +1491110521 +3015924037 +61724544 +3066058264 +579492163 +31978896 +1135305720 +2904273198 +2293655987 +2959479503 +3571987324 +1275265646 +1115252568 +2631130112 +1341640540 +2941768272 +3271866703 +3889439811 +4036196116 +1178694666 +1684574775 +3333876322 +2370122249 +717590979 +2746353009 +3301346132 +1239165084 +1968129364 +3587306123 +1131107301 +968007966 +658918480 +2402053743 +1776233384 +3739603080 +669815138 +2393920352 +1302112427 +1894201147 +1186935409 +4283330471 +1669581817 +4198286233 +73154696 +3594686154 +2247529074 +2881059039 +2414598029 +2379280559 +1246676349 +4287293395 +151523475 +3443270533 +809868503 +3015333115 +711397924 +1556614441 +2763879263 +1370870364 +3500247196 +929583452 +1053497655 +1799594308 +3391690888 +2212097006 +1758776633 +3052691762 +4167290896 +655003154 +83569970 +979432035 +1092702483 +890555300 +3509701676 +883420920 +4190984141 +2585145352 +4006900956 +4093585483 +33076878 +3544887925 +2562172018 +1068809759 +39654038 +3158457351 +4009579617 +891076488 +3309810234 +3220671388 +2014565335 +3822280584 +424283210 +2257647294 +1153918457 +3223019848 +2449888628 +909861581 +1371159030 +2429011428 +802556084 +2496543431 +3314559528 +3469152924 +43507631 +3893953056 +2989931811 +410096281 +4122744179 +2340825571 +1402775658 +3141879347 +956658105 +2841942190 +692156465 +2979099670 +173783595 +1272287311 +816132630 +1658209589 +4140158657 +1855880302 +4289257527 +284313632 +3507802751 +645819405 +2101489915 +1748874487 +97539905 +1400948897 +1202151993 +685589063 +3882255010 +4077677906 +1900088260 +3094715866 +445404866 +2334777959 +982119618 +2436535942 +3633493072 +3962610595 +2868930844 +3544313065 +4246963186 +206726377 +503236600 +2414859870 +3821559543 +941186709 +3967179814 +1955641283 +2388592069 +1089973239 +2947888936 +146393450 +1718746863 +823442891 +3154219161 +2422775291 +1388579177 +1644657317 +490086861 +2717357177 +3907853337 +2735317889 +4080046850 +3415505733 +1416260401 +294362133 +1282667788 +693496554 +2447883119 +1236350921 +889356860 +980766279 +2615943456 +1487637331 +3576286751 +2099862803 +945774381 +143951862 +2573487519 +1418953575 +1857097172 +2121327360 +3810475034 +3171293100 +542007736 +2422479354 +3585247936 +1761059106 +2764704724 +3980592195 +1506722872 +4238103025 +1994541319 +4259351641 +2627277483 +2623092405 +2178576545 +2291396526 +2874364294 +3032263420 +4270776161 +705128041 +1126111114 +98150626 +1768826728 +3713125306 +2916482567 +184011025 +915139558 +2049738428 +2364873142 +97536190 +1764735075 +3061885906 +1331483139 +189740362 +214278478 +1378878330 +1246168430 +343821843 +3548063216 +167348584 +373321763 +3181440191 +4124864126 +1609667601 +1034994717 +3093483371 +2319875231 +194038581 +91759212 +3549374484 +3939751924 +602857214 +3503420380 +1605096250 +144233765 +1093920562 +369931785 +4238992727 +3244111644 +2707519855 +1552559108 +413654407 +4091702839 +2884049691 +1869753929 +727634584 +1470728677 +3654243155 +1231247408 +245364604 +3326969080 +836846992 +1248176370 +2924963463 +2991949593 +1841434053 +3812446272 +2858442759 +1524950936 +3607454596 +2117164549 +848097372 +4078121680 +2694356125 +2439243328 +274571557 +3891791926 +1142472921 +1372215528 +1532192842 +3076894903 +3539450338 +1302832650 +688381230 +1083014494 +2110917625 +3274103428 +1223556612 +1957146070 +2981751458 +1347216177 +2020739845 +3787556059 +1538926983 +4169673020 +3018177702 +3072533357 +3805479923 +1212854311 +3851036429 +3855370779 +4269252911 +1210543623 +3793038350 +428177928 +2285471388 +2706298809 +128550065 +2499072459 +3358368294 +2040336586 +407057084 +397622794 +1809042018 +2832769142 +973838873 +1833378733 +4262101098 +3427088032 +1307295910 +3237619961 +1692666190 +2647967619 +884034315 +2977020599 +3990929875 +2916543536 +2445012008 +4096382955 +2326681905 +3793793278 +207816212 +3461878470 +3998290316 +721076500 +249119346 +1165178675 +1127330751 +1108375760 +2114014625 +1898289510 +3005460259 +256585502 +513546495 +670696595 +3087633961 +2081703246 +1803064523 +1146716299 +269606047 +1832186194 +2943743004 +4165338727 +3707183251 +1762608415 +3558718010 +2306475895 +1279695514 +2957676729 +179087730 +2354128484 +3747319268 +2796718566 +947026097 +1646614984 +1878378508 +3203250343 +2446246732 +4157914015 +3453823704 +3184894798 +4174544756 +2230499800 +1975225516 +2812719593 +252796069 +2065099078 +3252487688 +3092165499 +3983121304 +4009615555 +2558839164 +3380791411 +1995639424 +4113637018 +365684189 +943819335 +1935375627 +1825827625 +2615688389 +1674664862 +1980717076 +3716385460 +3090039409 +1961103 +3205187785 +1511394430 +805990440 +1307346441 +3080284495 +4225963320 +4280470826 +2750502072 +3812267443 +2735665958 +457931269 +151213070 +3274839343 +2497652345 +551020217 +510685389 +1075425759 +1146571825 +164645799 +4011941143 +273523254 +555085413 +320106951 +1743874742 +452274572 +881517041 +2548262402 +111586726 +3608098876 +1482629575 +653425988 +3688927335 +3406661295 +2187765223 +3994668336 +1067864856 +394760442 +2685083259 +3075109656 +4011060682 +989455211 +139969692 +3411760824 +2723839175 +3501356773 +31798812 +1879441894 +2943984270 +97213258 +4069884063 +2141115028 +2974456645 +1572682885 +4076621184 +400058606 +3191210846 +3073947956 +2995284141 +3118017026 +1817071497 +1254053177 +579204987 +2833931032 +571636911 +2762489745 +3010932606 +306337909 +2081811577 +3366527353 +2731819433 +2297828267 +565952206 +3487787197 +3466492247 +3228896741 +1478282475 +1121233885 +1573327729 +3172536023 +4243888433 +2893149341 +2513514717 +1277168152 +4248649827 +444405806 +734925254 +1413826340 +3570029652 +3110525837 +945909782 +2998023544 +1692935782 +725946751 +3170451695 +556120150 +1916685564 +1118167550 +2353091167 +94494446 +1343228719 +3994920305 +3090250617 +2457088903 +1129790203 +1092428215 +2334277177 +3786924066 +156204085 +3217440667 +4211862096 +2219682635 +1484660868 +2002086318 +2454839937 +919984957 +566789003 +3021581092 +3618605540 +2191025716 +4265419514 +42969073 +3012461489 +1635325925 +3269246512 +2605248904 +2998861528 +3907239469 +83453916 +1343434781 +2087201049 +582216862 +1434237010 +1949336463 +1343469659 +4096584933 +4139209394 +2937691692 +4140437197 +2575148724 +3883516334 +1667283921 +3063966782 +2249344065 +963371992 +1765985379 +1595459979 +972103310 +3804332592 +3272223762 +2817386243 +1005293590 +2751802885 +1927740232 +1581636502 +2493018044 +1897902562 +823313041 +1470194342 +1230234864 +3506723428 +769466238 +890310655 +2196521338 +2476599476 +4077625846 +3530223108 +1042605327 +323057172 +1692920946 +153216694 +1319868068 +400135361 +273616284 +2715515305 +2569546515 +1853596257 +1658826815 +3632146570 +4234317441 +2026816864 +699423084 +2036214625 +3158521865 +2950422047 +2609847466 +379745081 +1206903346 +1246505891 +3853287307 +4135717646 +228949334 +4044267195 +3928088189 +2190292569 +1559145138 +1168748663 +3721900094 +3258780770 +3386429857 +1366392104 +1736471046 +66245129 +1624947620 +2063258306 +1154410491 +1083226266 +623973403 +3513647909 +85670128 +2698560166 +1117114086 +3161271214 +1937101853 +3719671383 +398488831 +3045168151 +709974948 +2542912106 +2822150944 +3180556892 +547761295 +1903218498 +1416143774 +205962520 +1090377227 +426738816 +1005672353 +2604036003 +2645261376 +178581900 +2353216564 +2919029300 +220179378 +452305103 +1200244020 +229462673 +3772461430 +91221610 +3519976144 +1984446559 +3434660732 +3632316798 +2299829630 +2231806758 +942238991 +356082541 +1354218940 +3466352977 +3620742056 +896707051 +4140612642 +82613453 +2203038722 +4252744649 +1615654611 +4173883463 +848662284 +3156383310 +799780076 +2258783500 +1283627320 +359958482 +1353524349 +1365961962 +218307789 +3945594087 +2794673253 +965740910 +3503173776 +4160856251 +3676682345 +1312196765 +3142648709 +3201570894 +1022225218 +3055524674 +698349117 +2878489221 +1649037792 +2076153525 +1810418798 +1330060852 +1499323185 +1637838389 +806678191 +1988705254 +972952227 +1085813824 +944550432 +3208198571 +2148915695 +913813593 +1250180674 +1041077825 +2642787760 +2833003978 +1171166376 +1277492098 +1765642859 +2286629702 +2651917282 +3965603162 +2682440012 +3302605924 +3121548387 +724950528 +505538503 +3308480282 +2273536347 +1155822374 +510930801 +1557065506 +271677833 +1128270457 +1179150894 +2862804126 +652085796 +2095702003 +1070325426 +3177450701 +1675163216 +3961064576 +867323300 +964846962 +3640555714 +2435866226 +2224166973 +3157046437 +1860715482 +1084673262 +513928188 +1628946194 +1639418906 +1361515015 +1707595699 +4111414837 +3245171145 +398697984 +3552448193 +3805212457 +3766098910 +3562995718 +2052586555 +2736045931 +1899279703 +256781064 +2571498409 +3788935821 +291104604 +3501535729 +1282204239 +2786648543 +1591363902 +2054851109 +1225208270 +64322622 +3385496348 +2713204383 +3973125151 +3265065103 +2927563386 +2151249113 +3551843327 +2602369751 +1501901458 +4242118371 +3074953127 +2260826051 +1181846513 +379241666 +4166797758 +335652366 +968913393 +1682244203 +1519114563 +1987756924 +2519314281 +2905047615 +2087731956 +280188162 +976200974 +285462068 +3646902719 +1285901047 +4137532814 +259820314 +3814563570 +2323805903 +918724936 +3669218778 +2541753327 +3135267967 +3700417953 +4165405866 +2776042875 +4266473289 +1775686499 +1916292204 +648082802 +2749757176 +1384247571 +2408718312 +120762291 +1135401223 +679240626 +769282458 +1317687283 +2534739800 +4109263400 +1836942853 +1837345315 +2859737649 +3194492564 +1045607375 +4284447056 +2044678207 +3470350651 +3417526780 +573146228 +1710406261 +140267710 +2336234501 +336735832 +594164495 +3193357901 +2178529627 +1758992365 +1970960405 +1941065214 +2045803675 +1083241138 +748611472 +2203087457 +4191290377 +3026418349 +2130987606 +3922580875 +2603952471 +1780362360 +1472679344 +3916536894 +3608641354 +1881791958 +2782449254 +273962152 +1495743607 +266608341 +2584265200 +1874261641 +1068057507 +3569755980 +62313745 +3263196741 +4075675648 +2066592699 +2977966880 +3998351919 +2593895501 +3262194748 +3002214416 +1289464888 +2218004334 +459117904 +1017611603 +1005058549 +4013159341 +4225373720 +3082828959 +1624959749 +3585236652 +3397363797 +381488177 +3232045919 +1526446029 +4079237691 +3516192482 +3547354839 +2817444603 +4115884495 +2107056134 +3841355001 +3701162414 +1000945062 +2196287883 +2250301160 +4215229388 +129488673 +3629796477 +3147459015 +2004878390 +1331120222 +1201152502 +3202889035 +3229620373 +1652751528 +2181496080 +2637242160 +1603908015 +2207081805 +3459146937 +4011489465 +419159345 +822220767 +3182279108 +4006388778 +2046509800 +2341493666 +3137765322 +457527970 +1172394240 +347049519 +2613940392 +3416254082 +1366580684 +3341929703 +1182862905 +2322773627 +4254231430 +2203670751 +3168261932 +286661558 +644018723 +2437072891 +1304942880 +396583662 +928340756 +2366462099 +869518651 +74331576 +897036260 +3966158426 +1831611353 +1440311688 +967278109 +540317911 +1910688032 +629162735 +1211560736 +436505636 +2204853886 +688806406 +1322527623 +4278353913 +3326234105 +2295277955 +366453660 +1806345517 +2620773772 +2096787997 +731912519 +3896396173 +2918900026 +316650653 +2240679163 +2637493370 +582920146 +1366290332 +260466506 +3209573792 +3793256905 +760953596 +4126730898 +2082686180 +1786673210 +3343771989 +1277923184 +2482293656 +1175949015 +2504689513 +1623070797 +972095724 +2769789299 +2897387443 +3086085699 +2448341546 +1865983804 +4130774026 +4251724231 +3452121580 +541075067 +2856005274 +325955731 +1692180733 +2248740341 +4289247372 +1889959598 +373580340 +83480710 +3990944965 +169316846 +131721704 +2874429029 +234858936 +3351100968 +2484066310 +2916501390 +4250796864 +3329013023 +3757372052 +1440902898 +3547483127 +3895471120 +458147223 +3670169833 +3737568089 +3203036166 +850232151 +2765292335 +3498327330 +2626729463 +4040941121 +620052852 +1687919236 +2284264771 +3050244572 +869472472 +1422873700 +254291530 +3241543269 +913745668 +1562445102 +2053294431 +3747619459 +4189682883 +427827324 +1076699537 +569499515 +2382053072 +1228962995 +3951745825 +160373154 +3455048142 +1123306623 +2716774632 +3720948038 +136748593 +837114854 +4214906756 +2358831789 +1274774430 +1072394140 +1260465204 +3342812494 +1145238786 +823506448 +637387210 +3067387441 +1732546697 +2499887792 +3297156320 +2184388361 +2213014534 +4125284552 +597999708 +2137912594 +1046091527 +1667374357 +216796427 +1984345147 +3022281075 +1964388040 +4041595006 +1130782404 +2227789478 +228019405 +3126470816 +1777949109 +4146709274 +397716758 +2895191372 +2214231390 +3206302597 +2776266686 +3789997439 +1698186039 +843697756 +2118345838 +1347038692 +965438044 +408857113 +846963723 +772446502 +1246349240 +2544737151 +2729543545 +4025803824 +1675747680 +3942484224 +4232118771 +4016160750 +1639317357 +394149763 +2359732336 +577511350 +3515811266 +266496029 +1985655967 +2152546948 +84045952 +1271044441 +1776653181 +1062303570 +140647935 +3668765751 +740597904 +4162437287 +1811629412 +949813939 +393460510 +3461819538 +4275529613 +3241351706 +141269760 +3238294823 +2188697557 +2748775126 +1160611814 +1082457555 +1983749663 +2266992083 +1083638046 +1654229212 +1391881692 +2310067459 +1196799226 +1420072290 +4233482406 +1310123329 +3832564744 +2806139907 +190727507 +2539533779 +346806482 +1879946309 +1971620548 +1648732682 +3540016164 +483181326 +1562916858 +1077933099 +1669295564 +739389016 +1178526973 +725132844 +1265903931 +1228668286 +2434896623 +261297278 +1577117439 +121352157 +1270041270 +3476984470 +1845965884 +873938926 +1710511468 +4062490117 +3350680836 +1481925908 +680663189 +3074979075 +940102827 +2938284034 +3648188757 +1907774369 +2065994979 +3939720992 +2096485749 +2297632025 +1720165379 +505870863 +881056282 +334291212 +33575756 +2956735691 +4179947884 +2533474551 +3623795156 +302056322 +1507977437 +3802525595 +2011117542 +4260257033 +452495919 +1117008353 +2282619172 +2786629591 +181653520 +2746405134 +1229804230 +1026273695 +3771817659 +3501926537 +3955159719 +1862694057 +2543109553 +2667215730 +895002010 +3185560490 +3647844390 +1052289949 +3364303518 +4144002999 +597890251 +929892173 +177859178 +777117654 +1837622391 +3140400676 +2633606223 +3570540420 +2760574715 +4162391045 +3827687577 +838336989 +1928821676 +3096758844 +4248382611 +3326307448 +353538429 +1960167450 +3758944103 +4048381009 +238476414 +3243005293 +2822005022 +2187260281 +2522392534 +2135177136 +2600130462 +36096571 +3586388761 +3972530794 +3745372152 +4223559752 +1481387095 +3785755012 +1859588133 +2659729574 +2614489129 +1971362799 +1126025703 +4083042994 +954360390 +588428559 +372546839 +668525135 +2082786649 +2463896458 +638039720 +3392829748 +1660162547 +3565872651 +2576988874 +2076886516 +3345712149 +3785609298 +593238396 +1648224241 +2476816772 +3822466386 +1129053756 +1544357178 +392372577 +1234113788 +1603550777 +461510728 +480299405 +1072741836 +3670839652 +3249894946 +1745637149 +988295883 +2678153064 +1323196058 +1577703598 +2244096478 +2804394777 +1068742595 +2851184752 +1666606757 +2852217254 +4092517152 +3320098911 +307834532 +2137976190 +620391778 +3727645946 +4065152538 +2650980805 +178268634 +2134037110 +4149225382 +3909459582 +3438560515 +1373079255 +2390366917 +267213357 +984880322 +3493175703 +2345438858 +2676241793 +1548978828 +363284352 +1965538726 +2227333318 +425961889 +512919631 +2840310866 +352001328 +171974576 +828542465 +517582141 +2152859063 +1847242844 +1424358372 +2733599367 +4174970819 +2758906536 +3127480646 +2809913043 +1186756248 +1959586977 +2795353298 +1850263433 +732725897 +3212918238 +2602794980 +1896706156 +1921276549 +1983844103 +3039293755 +161841747 +3440962848 +3122765127 +734623228 +1206564994 +634548003 +1500982331 +31447827 +464451422 +3449304600 +4048254802 +47441173 +2830141053 +3959510923 +2840691066 +22187923 +1879115670 +2670133193 +1871353593 +3223523039 +4088180178 +2392802190 +3988705879 +155072511 +4120241765 +3288065755 +839896905 +2329809154 +3519319605 +2538640902 +1241701722 +387093825 +336875369 +2739479346 +2102708534 +659060533 +1389841946 +1525483892 +1991786777 +1053530306 +1332820776 +3764588937 +3555203242 +3848835073 +428662474 +2159575279 +2006926094 +1046771655 +1895228841 +2408812765 +3299443420 +3266862197 +761726271 +336729162 +953955632 +3828936034 +2846744739 +801406604 +1384696354 +4203892306 +1921063915 +776711828 +2253923976 +1220115894 +1309325954 +4152916517 +1785934671 +1713299066 +115649379 +382030817 +3021618481 +284508009 +1398560684 +3676950394 +1854822496 +2948727251 +1506028143 +1256732211 +3651836235 +2516686832 +3486865899 +1094777160 +2411978369 +3496965354 +2974385745 +3250159917 +71957190 +3444444202 +1651433557 +2283664573 +2752903034 +2929182674 +3335795166 +403061083 +3458576257 +3623386907 +2546240750 +1920877983 +4279466824 +1623498258 +3710575723 +4239197272 +1275448236 +1815379606 +242182130 +1203776531 +3787878131 +2473691665 +3219097415 +2852962191 +1460511946 +2418940007 +654357916 +1137386072 +2187812777 +2574355319 +831308390 +2432479605 +2709416752 +215813794 +4281053214 +2778828128 +3428889064 +4031572665 +4131605855 +3352899672 +215475806 +3307888853 +1632767652 +1719184508 +3144872456 +694044327 +4273065162 +2736396538 +342721701 +2736474633 +4236945716 +2151121170 +2659330004 +1156625086 +1424040970 +609194264 +2119171468 +3804914689 +1477699614 +1660897535 +3649881135 +3156282377 +4109064263 +3049551543 +2635098243 +2841505727 +1294388972 +3979989837 +1292481983 +229936355 +1595101375 +3113606313 +844162486 +2988975505 +3194593701 +333947602 +3574633752 +3579255136 +131439844 +235819864 +4219309216 +3663990643 +615773639 +2516732478 +72373041 +264970086 +1473247344 +1645365034 +988941563 +3645652849 +2991964569 +3407067908 +576372189 +464182519 +3373489749 +3853946108 +646382222 +1379194845 +459837598 +2122532892 +2880265964 +3934183475 +3260507771 +2471327827 +3316464216 +2489023636 +909266836 +1369714096 +3490747383 +3959947570 +1964436764 +2378136006 +2002553918 +4056982845 +2661828461 +764496014 +2453317017 +3466891649 +2019449629 +1015717252 +1597295610 +2618163647 +1601276335 +1889042771 +3275283035 +694319320 +3040898449 +3235310315 +2650624643 +3119880349 +1733779501 +1171391941 +821287985 +2674285814 +1670403780 +3970057397 +3024254450 +2631005942 +3600336315 +3544377093 +1592310789 +4294420676 +1996031148 +18631946 +3294139213 +410419358 +2614738325 +591149548 +2546041917 +3893795553 +751479267 +757794581 +123451017 +1223166133 +1370050777 +3947450985 +621239504 +1540926470 +2381201541 +1693006159 +3891953593 +1328356723 +575235293 +2013452436 +3242859744 +1574367500 +399027438 +3618485351 +1309698935 +800021350 +960348813 +3356649756 +633676420 +2667409381 +1497404830 +1004433875 +4129199653 +2622583822 +2294416208 +1005697488 +3899656602 +2144981070 +948209359 +343697051 +513550848 +3904477761 +4012954809 +3173834195 +465325109 +2978403056 +583217760 +4231822986 +2701562555 +2667420251 +1184712981 +572296933 +182942132 +2786538867 +1223212691 +2760794889 +851563555 +2240465202 +3035583033 +1272032188 +2845871536 +1026397824 +189877904 +2419145822 +2798413687 +2877219122 +1110728141 +196684 +1933423403 +166891889 +3725419151 +2853019578 +2332232477 +2637328939 +1082900817 +1610757710 +2893754548 +2512092819 +2769767007 +871600562 +1091920758 +2362661338 +2218490481 +3584545157 +1413766617 +3446524738 +1997645679 +1535169553 +102069353 +1089046965 +1628115006 +3707071215 +3829947542 +2702702609 +1458932145 +2750848480 +459561242 +3087201231 +1611471496 +2912621232 +433863986 +675027795 +3111398575 +491728924 +1312097572 +3427788181 +3655423692 +785422050 +963671867 +3095884880 +2308440376 +2869773262 +378356791 +2770424043 +4069773111 +1517622728 +2904856699 +427513147 +2809218764 +1167056205 +2766426283 +380088539 +4099324829 +2767069903 +3673766394 +3816456147 +3695971352 +218963847 +2449523776 +1923231729 +1251060863 +2200741550 +643051296 +2519220454 +319236759 +1580833523 +1737196235 +3910988663 +1249504881 +2863402006 +819033608 +1058157775 +2157971464 +1518564103 +904066243 +2762656081 +3398975294 +2711887438 +4002814696 +1699285239 +128848931 +1305723024 +1796423995 +392170091 +2360824075 +36449157 +2177695896 +1974637024 +1998059266 +476178147 +1660182241 +1220489455 +2475036296 +1710767826 +1865315507 +1859952682 +2936233862 +1470863535 +477332653 +2656840168 +3015628205 +1616848824 +3812476717 +1143901272 +1347650641 +1285911130 +2257125038 +4017992630 +2733318126 +2250124352 +1012073225 +3556248563 +3799333398 +1081474291 +2554332569 +2055375111 +2974680267 +2682795258 +744453425 +231481925 +2442095540 +1099034061 +781806065 +49047325 +711905096 +3054527858 +557800484 +2562022676 +3251662125 +3336320032 +2221161626 +1298910980 +3668992322 +321675912 +748032424 +2891258992 +391992789 +1389168357 +1739214362 +459419496 +3639200661 +1732953069 +876914495 +2440782364 +756114409 +557799621 +1411671445 +447790123 +1966479863 +3667588260 +3716594684 +4141731860 +2193299740 +1602463619 +3028363621 +285179643 +1240872569 +461997090 +3360353040 +1349178752 +440561904 +3902688686 +1299545870 +832666804 +154698162 +1561921247 +1160079095 +2749514803 +2983889046 +2845744836 +1655407258 +1005696963 +1899808477 +1715837006 +1865562401 +3724916714 +1317895556 +4139456886 +975293848 +2705313024 +3959698516 +1269173818 +2602663088 +1863868295 +3389454144 +2981226436 +4199660507 +3741336863 +4046467935 +998837050 +1730225229 +3069654762 +3165149539 +2112978785 +2503119184 +2428140284 +182208202 +1016903190 +3576217787 +2007125911 +2961557793 +852271552 +452968493 +515423071 +1687592390 +1483595520 +2925998341 +1493716323 +286265442 +2470381769 +2609176750 +3078623045 +657507255 +4097715870 +4210770984 +2320800203 +1900930525 +1426307357 +743532714 +2977787630 +2724023766 +3485031765 +1806623997 +277708228 +179569704 +3497489813 +4099061302 +1476733276 +3372498051 +2391992002 +2497636584 +2829031262 +4283912347 +1137116873 +874841505 +612223941 +915225645 +1927027595 +3668750297 +3277429777 +41572078 +1149896172 +3925988791 +992097300 +3403238346 +1423836509 +4049774243 +1318291246 +1518241992 +4104894369 +1140628975 +1767443316 +179949066 +2261683644 +2935442127 +830641857 +4212805569 +4026005383 +1456276230 +1843667449 +2000917977 +4153003812 +2528684661 +69435810 +1349278108 +367274102 +2192128459 +1336996793 +463505102 +2893411780 +3493633733 +1474366411 +3161822587 +41871998 +1138153582 +2793614770 +1421885113 +566848038 +1158952809 +467420036 +1391213535 +2599532496 +447810156 +3597338706 +3514822890 +2309984660 +517694367 +4072776802 +3674497208 +1807105732 +350340541 +1573291291 +598696226 +1403096253 +1677383233 +1147814376 +1369051262 +1260174990 +3493441354 +3106046432 +3356007350 +2497268544 +3702514981 +2330071268 +2221908886 +3632056976 +2103563218 +70753255 +3490195431 +1740395120 +3730814942 +3614693040 +3954934761 +1823585623 +534530284 +644912344 +947211113 +1243002307 +2050847942 +1789482219 +2470705164 +2028118896 +3502617682 +936059029 +2198823232 +3611405669 +706417818 +1273531781 +648234696 +136620577 +2177176128 +2783862586 +1012908017 +1910502064 +3164983519 +532822229 +709423775 +4176677440 +2999834008 +3287109330 +1014168351 +2799220746 +2840152596 +1652910449 +3957030899 +1064671281 +87216439 +3917811800 +3061101842 +752500283 +326580866 +2042940817 +2697949797 +2712525593 +3435599011 +3101490412 +642698214 +1871527221 +1266929039 +3368859798 +2957873600 +1610376024 +173640245 +898114815 +2929430121 +1064829412 +3350014791 +711495375 +858808433 +724591266 +3930159138 +1916715452 +3302246195 +517316653 +2791031237 +1553794982 +2134593724 +3345362912 +2987216235 +3110983445 +4124862528 +2108942811 +2113997396 +365303813 +3179988367 +2068786288 +419020755 +4232016494 +4272683098 +2972469603 +984689449 +1800023969 +3195886103 +1883817176 +1177997342 +89497099 +3338180098 +399978387 +1786916042 +1817143281 +3272528294 +2279203897 +414884993 +1751993706 +742043644 +255417484 +3826234878 +626368200 +1563437813 +428611840 +4275101212 +142593445 +1475342431 +3775408867 +1965394321 +44488477 +2274206925 +3440410714 +498747230 +4163555716 +2504221865 +576483589 +3947380149 +939245955 +1640970819 +1443121292 +2617916636 +1562263261 +2717528450 +2500730660 +189829817 +984352464 +1961071255 +838900979 +2663694459 +2679010290 +546318426 +502482898 +3057545998 +2551255311 +117738809 +1766099164 +1708343083 +2991661740 +4215304885 +1096512556 +1014747394 +2236440061 +2004368666 +351266173 +1186443552 +1206816974 +2594021620 +2792699120 +3282129274 +1491045585 +3448472593 +3904977558 +2548200827 +2769530210 +3176289174 +1200614814 +2896306108 +1935090937 +1181956876 +2832100896 +2529835215 +1666275138 +3916994466 +998056788 +1569005715 +4093154519 +4262866682 +2685844224 +2039744777 +317656239 +23635496 +521989195 +3868830140 +1216283851 +3761578600 +3127872598 +2547468528 +108481240 +3195324298 +1187106754 +3273844045 +2062952919 +2922203657 +2512368247 +1935840022 +1577058646 +3159346255 +817223604 +2948232082 +3752252437 +169510430 +2146352242 +4173290217 +3547978877 +3346640747 +3335419486 +2540929601 +3107779519 +3831888665 +3096066858 +1243676725 +1885440018 +3157514562 +2412223362 +2797738078 +1444192266 +1548742665 +1475447138 +2552697058 +3806379223 +2480465595 +2624631352 +2824579072 +417368802 +630231552 +2250005182 +2822271013 +2374758608 +2740813009 +4049411132 +2191623148 +3082940863 +1016233841 +2014568449 +1429333224 +3976777294 +4160953191 +3261188618 +2739295960 +77304324 +1592418296 +648474623 +2845350688 +3694160969 +2406253797 +2940120264 +3684539407 +815869273 +1590291475 +372869309 +2461078823 +453748093 +3950025395 +405526666 +1573550292 +3250683511 +2687227069 +2631449907 +2239561126 +3699058829 +2206797640 +514529622 +718096438 +4270521216 +1938748397 +1394305689 +624332850 +3996992685 +4168809140 +3998557738 +976668486 +3264171239 +277871735 +1599981264 +3497768521 +3602533923 +456988544 +363265418 +768876728 +1927245978 +63016585 +2104925071 +63231954 +966408198 +1363328320 +2855282938 +4213553057 +1399371818 +858982906 +3308168545 +1181479873 +1790979912 +9952288 +2977695574 +2117908928 +82697936 +3073918473 +2979787818 +3584289545 +2968671219 +3595989940 +1112262853 +638773180 +3988637905 +2791885072 +4099018993 +292509580 +1864319611 +3343800725 +2272557518 +687983558 +2281459281 +2965619136 +4171864154 +3000485968 +461805910 +537495899 +472784663 +646378825 +4088165977 +3479535959 +917963863 +2428941973 +1958764201 +3045156291 +2233801881 +3855505675 +2826487791 +3740735680 +785924809 +1987484896 +2078936472 +2256374739 +1327038955 +1013253884 +969218582 +3595002268 +902572152 +1657629493 +1038919879 +2727983764 +3379377804 +1779141384 +3492544402 +3770803297 +3757079277 +2746144673 +1664064122 +948462453 +2647013363 +2740659282 +1970761406 +3140288333 +1790430496 +3491031507 +503700894 +2476958682 +204353858 +4277473096 +908698352 +2691244418 +3472550748 +1609448545 +1459428139 +3750081373 +3740807105 +791104748 +4087912515 +294158392 +4152884451 +3107900614 +3745086503 +3082933352 +1063247437 +173838778 +4080046799 +1732731011 +80120608 +1150165458 +3645295592 +503763697 +1227478041 +1465959674 +1889837976 +4172762198 +3412575905 +3453616454 +2405774360 +1502718655 +3044803045 +2336859252 +2321974182 +3128636769 +1924094794 +1924026053 +1372681863 +947389367 +2553232638 +642912823 +3384054934 +3471225387 +2633428360 +2310564238 +3709554363 +2512143751 +884836654 +3730914839 +1440641846 +495859363 +2028572570 +3543939625 +1966842237 +1037726542 +3828427270 +242522406 +2726715302 +3652108153 +1946921427 +1808379592 +2638282033 +1561867132 +2786591960 +1666015051 +3927553647 +1857525078 +1328976671 +3815688857 +3248013878 +1413607248 +3435594563 +1046540133 +1284529831 +977450130 +568639648 +1848594947 +2708751716 +4292304578 +3829497817 +111954890 +200919717 +562191629 +1835515764 +827363727 +563305021 +2214315880 +2196109666 +1611428212 +1226243346 +2857797393 +3536022920 +3988969785 +475887735 +2059967747 +2653441948 +3211147223 +2800929125 +3701455618 +3002163553 +4077280187 +4105787564 +3522671601 +1031478185 +2915919222 +3868971010 +459102514 +1359298065 +2985704683 +3049077248 +2236210877 +4164333285 +254912302 +2251393583 +367410615 +436512978 +3143653190 +438650594 +2759779852 +1853842494 +2599142548 +1739781219 +1462941622 +1428729429 +2359643381 +2062717380 +506201045 +3316400801 +2491060184 +1125963013 +4008147411 +454740262 +2899483734 +3063768707 +2317091592 +3538284137 +1527277385 +1468489988 +2171710946 +3711497278 +1227636501 +1341007697 +3436511688 +1271420555 +110413289 +3833803143 +3152018392 +1058165820 +172298632 +4290541278 +3280871914 +1567754769 +2884916629 +1640981303 +4154831071 +3453909683 +1643209626 +2512128536 +2395365654 +2711505716 +350318653 +1995827271 +253288679 +1950547122 +121329069 +1628990537 +1827650016 +1895850563 +3295015445 +1918830443 +1285751343 +3593460238 +1042546282 +1626130572 +1030312476 +3524656758 +1436578987 +2710706244 +3191785377 +2123967731 +498336047 +3543733358 +1580193987 +1719407233 +702067871 +127572679 +1697819348 +3011688781 +1827666794 +1877124517 +3521429057 +1921413709 +3438106487 +157774410 +3908868482 +2827581239 +3479869402 +4038860167 +1653059929 +2625192523 +2805835987 +3836367982 +1703314052 +1241640539 +3676280870 +477026631 +3512635055 +3783920068 +186316848 +1474893043 +9639138 +1493897874 +4029918129 +2854967539 +4255883790 +629610776 +160890661 +31136773 +4209539381 +2860051483 +2443932599 +758166120 +2151014095 +2187861249 +877033329 +2774398491 +3527603126 +647515886 +2335146023 +670254665 +3533031183 +118518981 +211455576 +2684236937 +3623288443 +3242189560 +657737362 +2760081509 +795711016 +4045787378 +22721158 +2805231281 +2077344448 +143141771 +2458239256 +188338053 +1051143594 +3792484298 +3077236233 +2889031726 +3539855952 +2367869319 +539804457 +3067341490 +2162163001 +1429158556 +4146889901 +2072033278 +2722141736 +1219331270 +3864977547 +1988663955 +216513897 +537372552 +2888178290 +3892854692 +2394707918 +73168456 +1037053390 +2113113511 +2736926780 +1854732860 +3288951000 +781205584 +148625777 +2167091171 +1336336096 +1823179593 +1354511947 +874605856 +296825270 +2127689678 +845636297 +3709487042 +2158762349 +1141892436 +4058043871 +714829652 +1750878781 +2330299972 +4252582863 +653238139 +2422700351 +3526909478 +3784560226 +1004701238 +3999407749 +2633895509 +309581630 +465441891 +927240865 +1385823038 +3116537748 +1529493097 +3872116303 +3232046307 +1013512544 +3060295739 +1753366682 +796466994 +1664860768 +1357765923 +96045458 +1531537106 +2322365341 +1933493896 +414835406 +1210205649 +537172242 +931851747 +616782222 +516331241 +1012569285 +1823281471 +2396307933 +1020198167 +1682962882 +3508260251 +2288190394 +1082248452 +594761392 +4088822248 +2881568149 +153163435 +433996639 +1003734899 +2678366529 +276964931 +3239301896 +3602688878 +210763555 +4114156521 +2935774080 +1027772626 +2398524558 +1818242005 +2792852401 +1284541068 +2564119158 +4123077280 +1484365920 +2555222260 +2913105614 +1079169046 +1774880534 +788254756 +2915733793 +1993038751 +544697832 +1278235039 +37722610 +4023567429 +2601229565 +1172192962 +1537505814 +2589996301 +531444421 +3185544243 +401315277 +4072359596 +2726366626 +1727795309 +3634777561 +3290517248 +3935512009 +4031482011 +3347754557 +3641999466 +3972692612 +857119232 +4026888343 +714844359 +367596127 +3588026486 +3233780460 +1662645188 +1740453829 +2343805122 +364093557 +491409659 +528942590 +4026239253 +3852334845 +1842475611 +1961921173 +1167521621 +1544219386 +2019190850 +2981672044 +565134750 +4221738741 +4043455778 +2088922406 +3943353476 +4130024801 +648731938 +3881254648 +3333239143 +877624333 +3145106145 +1308249775 +1895091086 +1495523004 +337315113 +2701414575 +2429263200 +1004803070 +3518103173 +2831376240 +3786975516 +2667949906 +873932682 +3253335612 +3876092498 +375318028 +1719291519 +2143169154 +572261464 +2499449231 +3031169166 +1327603506 +2917510217 +1120945145 +1354494072 +363154694 +2608351526 +926254564 +3296212136 +2970008792 +416691410 +4246919207 +397185453 +2391412465 +2205304967 +921342779 +3125862620 +466290190 +3288251362 +943201100 +2579083796 +3225735447 +1701657929 +335646159 +1240952538 +3410008866 +3933554981 +1378164567 +2055860402 +2104968062 +625583034 +2912534199 +395713245 +1440958670 +2929263626 +2772408339 +1062297001 +3947469679 +1827688339 +2998098960 +3474717338 +3309872438 +1416882752 +60813770 +3970036385 +3416061703 +766763108 +3180067705 +4250634038 +3111952367 +3247927454 +582952232 +2472878601 +936991574 +2716007723 +2623608477 +2634419457 +1129139338 +1985974403 +717999322 +1106319946 +1390679928 +3672329570 +2148383262 +3445866674 +4106667313 +998108521 +1336193095 +1525142215 +2829742950 +4190138105 +1452647123 +902980588 +3816656609 +219754962 +2653823226 +487716202 +472449694 +491525436 +3049657386 +4190257471 +3750810315 +1075537240 +1499586492 +566137172 +274777397 +1689713812 +435950630 +3798729452 +672195204 +1805486011 +2218827045 +1164773797 +1568660257 +743372613 +3515468557 +598629169 +1475461845 +494158549 +4010408211 +469990939 +671464457 +357335066 +1364865200 +1852739113 +1109685761 +880513638 +3986845734 +2990783194 +1242583354 +641189669 +2248899470 +1033537315 +3203216872 +1875330246 +2256949331 +2223212544 +3681030640 +1227359113 +1404250798 +3960620711 +525796886 +3378340351 +2956954346 +2760390975 +1833811200 +1654800032 +2708754625 +349637141 +2032793963 +315130649 +3715430284 +2248866129 +2862271043 +2471737830 +1894870145 +1977450241 +991966158 +1148355472 +110638331 +3644699312 +332962483 +2767514500 +2106805816 +1083927125 +203594798 +197318997 +963380277 +4185342550 +1669482731 +1105054259 +3257931357 +1479111044 +948370569 +228443986 +3119010726 +4257799681 +920358075 +3752279581 +1917127281 +3270954036 +2848068905 +3450867837 +1303313239 +2089900612 +2646508228 +2864787132 +2594548916 +3095266805 +2458667673 +3463983645 +3375179053 +3907119090 +2356927627 +1907399088 +3738895611 +907258841 +1641978057 +3064130077 +2648606676 +407704009 +2695709754 +3709634761 +2007749723 +1114620365 +741906399 +2469723339 +1742705472 +1788990747 +3306288643 +2619786045 +4203275255 +601920798 +2637934088 +4042713259 +3585224826 +2621384525 +1822687661 +2159407388 +889302426 +1441510000 +1298489969 +664329857 +1871349791 +1888608042 +793412444 +1835482947 +4055631953 +3903243498 +193645406 +2950551920 +701193453 +3877359379 +3197120259 +209991703 +3890932735 +3438000905 +1308191459 +3619540468 +2356525390 +1208039345 +2664130256 +2330139327 +3833976179 +3130421938 +3273246370 +2256091566 +3403386429 +532044154 +1294459018 +893678480 +3051981405 +3421017350 +2487987673 +1667123925 +218579325 +2426589446 +1982245784 +3110474687 +269009137 +2039107284 +1280596473 +549933724 +2899806667 +1623973434 +1640469902 +559566689 +2952529770 +976555304 +4104229491 +2581877519 +2875247302 +2426651909 +3275201537 +1529999588 +2423175954 +1230373900 +276778343 +1148354738 +857508284 +3473389755 +1993284544 +907058553 +2909322811 +208691703 +599749737 +552396891 +1604783062 +3017579122 +2392489408 +31461904 +27807980 +3486398897 +2667394267 +1544411615 +3658084606 +3529989844 +4272285751 +189191113 +2936791350 +3165340405 +2187860616 +625454873 +3075582495 +2314998587 +878003900 +3819782524 +4053692520 +1200968311 +1979941917 +84422463 +809238780 +2065014332 +2360978266 +4213675286 +2368274780 +3148307188 +2816020448 +2768980224 +2994021283 +1702497457 +2602585952 +502503261 +2738769041 +729590068 +4103290326 +3129727179 +1118739011 +175028913 +3467428204 +102608557 +3926592357 +233484133 +2029260452 +2064220980 +1972901374 +3407131391 +488540820 +1174609418 +3171458451 +639162559 +832449777 +3865874325 +3946037072 +957272122 +675900480 +885535937 +446098052 +4227349623 +2409664402 +2057699317 +582531129 +2094790402 +3606721896 +2563398574 +2970130063 +786995530 +2158175123 +22863483 +2127187441 +3914280713 +187461810 +338506327 +637187434 +2596057900 +192242906 +2841427152 +1614561807 +4092067892 +2299511636 +346936576 +2633527478 +1629318303 +2730816333 +42706952 +53648146 +3679499887 +1838874463 +2896816885 +2444829595 +2613437537 +3165885625 +3580542990 +1282193503 +3407510707 +379517752 +2179549787 +3536929992 +4108420485 +3961590162 +461057755 +1810686263 +4105677893 +2592850351 +3523623411 +2858489195 +1669568496 +2521829275 +1050865853 +168691876 +1308900931 +1144865842 +2870838646 +1052922347 +1107887608 +4123012752 +3815578526 +244155629 +375952683 +1529612913 +145903942 +2238024302 +1958119076 +3094072276 +1649568554 +3942347306 +1086095447 +4024767408 +2873526558 +3799752805 +823655220 +354697641 +3786715808 +530351069 +1837362049 +3240979167 +1436497197 +2337638153 +2691551732 +2339741436 +2506795383 +1049004829 +2960816824 +4044870380 +181425907 +1638829027 +1704608490 +3994236297 +777972676 +1800681243 +1807882043 +513924527 +3408526397 +1187980819 +4171657867 +3200723026 +2284178388 +1826143665 +3972239607 +3186789004 +901391703 +637790900 +1291468291 +1581301446 +2113478568 +626975043 +792719510 +1635499387 +273174554 +260177908 +2898005622 +1118083369 +2129170451 +3242986418 +1878225331 +3017401705 +1656649526 +312930095 +2344928157 +3991798791 +989209589 +4250363562 +816236765 +1627977865 +745841916 +4243751559 +3763530133 +936182221 +2164950744 +2650299166 +1729188915 +861756600 +452013555 +1713107881 +2637795695 +440355462 +2049023424 +2589475688 +2867382271 +3462570495 +1603388558 +1173862468 +156545566 +2083285178 +3917992869 +1693826137 +100101070 +991836432 +1905891767 +2605409657 +1285564325 +1540145504 +2359394433 +2252548570 +4088468394 +2048683694 +3142100771 +1079599872 +293421446 +1436042900 +2908892678 +511819856 +3733265427 +3171772465 +2253765025 +1553729422 +108378565 +2838831876 +2696844242 +3505098048 +1766790909 +1087599426 +3561338020 +3345581575 +4088750777 +2712050579 +1707007351 +1189273847 +2377510162 +2054030092 +883465205 +4172000957 +4046581337 +1078599719 +1162268096 +857129488 +3146204386 +235801304 +3846475176 +2059482904 +1257504634 +1978132624 +536370050 +2929083322 +4294729301 +3623431583 +2426489071 +4132380496 +2473966199 +1631287112 +2229145532 +1088496656 +1767193136 +2800884805 +2805047542 +3743501042 +2336822125 +1615475722 +1507812708 +2861643668 +2039476413 +2156828960 +2558414104 +3150507886 +1837506429 +472686661 +2078762469 +242416161 +2857824819 +3533849195 +3436582554 +1516936783 +3115291583 +994250636 +1044576464 +2465610668 +1401081592 +1160955351 +3111537387 +2704285958 +709012 +1991577452 +195250786 +3678154969 +3155120448 +2843603140 +589309650 +109981009 +2791024746 +3960759929 +3737163702 +3031704516 +2354608168 +1407711956 +3269219134 +645540877 +2745259926 +4109086411 +1541842087 +3259418488 +3403516671 +2997902936 +2643088655 +111474575 +1293554210 +2409636471 +3213889320 +1379405981 +4049751152 +1020849274 +3600235462 +407522209 +2375585100 +796087124 +2327207781 +1199404926 +3057490830 +3044891121 +2765779480 +2739871118 +2716960935 +3193825217 +1664479999 +1639878783 +3421758574 +1863424409 +2428594981 +1421730926 +1902303941 +631410217 +3971147937 +1564407291 +1605172270 +1330392264 +2499449885 +502628327 +2234525742 +3783379254 +1609804389 +2896148341 +3147364257 +368108959 +26722575 +1774985495 +831275676 +2552700897 +3528533257 +460397815 +4150112387 +2570503116 +1753205331 +546211059 +485299014 +3608726072 +1037569642 +1370913265 +830614895 +762958599 +1247056948 +527271953 +1918537676 +974345927 +2087723958 +1948213887 +1966565699 +1083174517 +543570688 +3631912443 +1549841820 +3841971589 +457014935 +287816739 +580325671 +3434889461 +2881964626 +329262166 +1450084997 +1802163898 +1558366248 +1289644725 +1114603319 +2076095423 +522024405 +4188088059 +1274419424 +3423592474 +2465975972 +3772009281 +2742418257 +3702476689 +1734414447 +3802175852 +3567871759 +430630147 +2407142191 +3467715557 +1360704679 +955208170 +1365427829 +3602269064 +3055695962 +665080048 +3981051497 +4056478989 +1400780321 +2120221840 +1112625724 +3725781805 +4049611520 +3697475952 +1912588356 +140045535 +2034878505 +3356601198 +3006943304 +2614749229 +4184320029 +2695508921 +1234892190 +2136955088 +3288979242 +812930464 +3192068314 +490200017 +3848439145 +3855376629 +344898982 +3425665444 +3587105883 +3170832711 +3980454264 +2595053813 +635106999 +430716352 +453606438 +3056416645 +2508039012 +2116748265 +725538189 +119312423 +786947679 +1107174960 +2498610304 +3811605200 +2848683065 +859584423 +2286742697 +920842739 +2927695023 +3240860682 +3988327699 +616703336 +3737658339 +3543217135 +1269430695 +906741922 +1268326088 +2382446159 +2304265302 +24250506 +1070133516 +2646910000 +4042862389 +178188290 +2305378272 +3845299736 +2633894203 +3251062752 +119968394 +254299016 +10100816 +4265208826 +3175682452 +376626895 +245036439 +1092872025 +2310790917 +1910465102 +2540531343 +489134299 +2315550139 +200316420 +3007265965 +811700220 +932908240 +3583901710 +4248102817 +3453332964 +3981704423 +683058298 +117601873 +613453132 +1535755108 +4148295106 +895537581 +3247152126 +2779846209 +2637518466 +935113161 +3472879976 +3676354683 +1290334829 +3805107066 +2204975850 +993977782 +908056721 +2212991352 +3748179331 +572118808 +2173385405 +3322370722 +3530821679 +3810365891 +693814130 +1027559085 +495669366 +3235948416 +3819897208 +4263014353 +2631337613 +1077302804 +2709781321 +4062962008 +71363998 +558351324 +2853672000 +1715179116 +2474556114 +1734643119 +326438570 +513128655 +3658107712 +1947508607 +177937120 +3049878063 +4169969512 +2943443389 +1921297307 +3180236464 +1519845970 +781375225 +3961289122 +3462241872 +3198532593 +874825126 +3366395050 +1500837883 +3004453246 +348687054 +1551052367 +461185061 +1006001081 +2031457316 +910641949 +595587406 +3002192170 +1588736243 +1848043433 +4083007202 +1846348162 +2686545938 +3821449843 +334780985 +1208390865 +244813644 +3760330285 +3450548348 +1890142153 +1546613638 +352862440 +418436215 +2924444639 +1252099792 +1049790208 +2143771351 +2250807464 +905860539 +1387073409 +1395533638 +1890376836 +868591490 +2233824007 +926220677 +1655655747 +3677650647 +2721162051 +3591557301 +3731478914 +3134578418 +1587481474 +1567326961 +313587006 +4034317697 +994705160 +3438061744 +3139267937 +3591193622 +1579779961 +1039656678 +768753368 +1845740515 +2459926231 +1859626044 +4028644776 +1473114037 +3050798273 +2267872173 +1063605642 +3237018564 +979232420 +3645293219 +2933507375 +504676187 +2714990434 +1975699405 +2150743268 +3482888698 +1075944421 +3744925351 +2792754959 +2836909639 +1217772294 +263186949 +3630745851 +796634324 +2178486424 +895962186 +1030317729 +2531847716 +3725006080 +3086073702 +1715983790 +4071633445 +1831162935 +2324615519 +4116884974 +11086812 +810963506 +1113732206 +1249214351 +2055403946 +3350941441 +969016727 +1845773417 +337586456 +2957149184 +1495934058 +4060512512 +3846158337 +4291438267 +1961307094 +4041359607 +4181067148 +2100189451 +109313776 +48905154 +2192366214 +3456643498 +788297132 +491337227 +930386724 +2339916930 +3716844385 +4224231760 +4236535765 +216267215 +2321429809 +1908843364 +525306394 +189204709 +1141386852 +2514906000 +1514525159 +2166987341 +2062800216 +4040706685 +3567123536 +2168033630 +903091195 +959738155 +755927574 +2909750826 +887728301 +1513092207 +591403935 +8806202 +2637888632 +625424572 +844686298 +563717788 +2423574317 +2127567808 +2434876690 +3175959018 +3813992248 +2071586922 +2671489775 +3602043441 +276173589 +767883057 +3809329017 +2952154501 +2709154023 +420933336 +3025935637 +2706751676 +923670346 +3911029241 +436654366 +3437094734 +3004785877 +3930663493 +2846922269 +3317102215 +889674196 +937755382 +1649691453 +3598600207 +1066279074 +4098933756 +4192789984 +1338792879 +2749176256 +846856261 +2146343439 +2851837681 +767464130 +199707439 +1146717613 +1431102592 +2953685783 +3214148807 +3515379768 +3341434194 +2008329012 +1005655680 +4146052486 +2271310300 +2602333105 +2129873169 +4150866428 +2737854176 +4107383589 +909098174 +2282630823 +3379299292 +3177925867 +2807672153 +3108049745 +640582529 +608718715 +1565491949 +3256856901 +1958209850 +2739457564 +3967018634 +769855457 +3230728145 +848204430 +375953777 +3822985801 +3539052508 +2163998314 +792861706 +1579622607 +4156474522 +523342740 +1972573428 +2485236827 +2945308728 +1774829899 +3177041192 +1229003712 +141639569 +2341250486 +1156857034 +500805990 +1921040027 +3754738485 +2347102774 +3839824835 +3865450402 +2867893261 +3351635128 +975084841 +2017727255 +1500457228 +3557437019 +1935346986 +750337094 +1779823067 +843692156 +779483541 +835711429 +3842530311 +2050451765 +1698752606 +977851545 +3754057407 +3883910640 +2222985554 +1445016893 +2233330414 +2233094068 +2643337899 +1046586994 +3920471381 +3642606591 +561208034 +942368688 +1771869222 +2838368529 +3783252698 +828618122 +1648090218 +624958942 +2338871664 +1023585984 +1211143672 +2133630636 +4085399789 +1730340223 +551588852 +3819922330 +4286411510 +1613497207 +918955445 +806296635 +2075359249 +3270008253 +2620124805 +3002905047 +1470494380 +3864066357 +396760747 +120818777 +2200361344 +3238774970 +259578041 +1843035906 +3277399140 +1560426896 +3567162196 +882019477 +2603025849 +2626260383 +1212979400 +2524769443 +2953363200 +3198120553 +1311937922 +1690463208 +2153887353 +2561833041 +2629375308 +792880650 +1576690203 +1946281136 +3637373382 +3774235544 +4188448495 +3331319021 +2711111469 +3792232548 +676657137 +3666844049 +2821679692 +519521290 +1785318129 +3440715488 +3933604687 +940805686 +3494161737 +3730506087 +485528519 +2719795371 +3582257070 +2824959901 +3467765748 +223406677 +3096252824 +2176249847 +3118427064 +2428593832 +1656790615 +1380808858 +2951209336 +763364743 +1424793027 +3616052600 +3569737515 +3489167627 +645162457 +2586186530 +3225622130 +2094255190 +104110478 +3999557162 +1702722784 +466189402 +3954345890 +2234817226 +2044385707 +1181494863 +2314074392 +3756844610 +2662892898 +2470271428 +2645587886 +1898655541 +347190958 +1746349722 +4131792858 +3249726498 +2616625905 +438982537 +2382665112 +1136579816 +524214146 +3665475037 +3137172245 +1293964314 +2717781984 +2386179077 +1223350053 +146273001 +1614023089 +1481071503 +1724197938 +3452187805 +414537671 +3936128058 +3401747344 +3792304698 +2479328864 +2863443972 +3000220191 +983117034 +3133075284 +768498027 +1232524489 +3992722732 +4271734892 +1466559007 +415247056 +3224904626 +399958803 +1221328233 +2430425081 +2097280487 +325149996 +1402605581 +4065085460 +1126738687 +557613851 +182046814 +1764661010 +3988668242 +221803839 +1773966121 +1539203152 +562122772 +4142410177 +997974507 +3813166431 +1213632754 +3530788849 +3437351765 +3649674365 +2586279250 +1613883629 +3642833769 +2860438255 +2013796889 +1011861755 +425080275 +159030800 +1965719193 +1563992950 +4049736201 +2923209230 +618420243 +4083419058 +4067991252 +4155296416 +498523229 +2915485921 +3752451992 +2960916607 +1846483445 +1774570846 +1690113563 +218371647 +787549555 +1330407473 +1889476041 +2474390125 +2866896909 +3829346059 +2541648185 +2559766705 +3165243056 +1161554381 +190705178 +1679051243 +3501292922 +480598530 +502189995 +938730122 +53234998 +1115609437 +3350561392 +3440204968 +1820548185 +2074446656 +3528821729 +4256883280 +95209052 +4051063159 +14290475 +252355716 +3838404182 +1604540708 +397990049 +1906499159 +1240242479 +1934309384 +3187722300 +3851865253 +2118271237 +735124666 +4060860878 +1315916131 +2714182573 +3315989508 +1530091927 +3290803045 +3030038947 +2500816966 +2079910693 +1671576297 +67423968 +953700703 +1767995735 +2899488729 +2729083410 +4243905646 +1333191711 +1923200653 +2594120414 +1031651738 +1943602511 +898927058 +143769277 +2272062548 +3787329623 +1622947328 +2356474911 +1879596021 +4292633597 +1212501414 +683918951 +1649705769 +3248094365 +1593951097 +1343761867 +2443311129 +2662183836 +318176405 +2136863855 +679517934 +4124273329 +1593032172 +4042182818 +1625586075 +1637867167 +2298296721 +1339379040 +157487347 +1264997333 +2499748511 +1641754337 +3338574560 +2871508522 +973944131 +3717771750 +3370628125 +562533421 +1326918111 +1621179529 +1995043899 +880119640 +8563416 +4284957881 +1729423588 +1428271389 +3301860114 +1332344593 +2976488115 +2044851047 +3829408657 +475612108 +3041153068 +1078060594 +979844044 +4070030184 +2647682067 +3543014095 +2405880075 +1172671922 +1251148243 +766248357 +4194947350 +238863195 +4099336060 +176570527 +3535762554 +3168912063 +3743689975 +3906616201 +273441452 +2237175329 +3572274834 +1304993883 +1798472521 +2077913329 +1730563174 +2140651603 +631636277 +3826932966 +3409258614 +2359888984 +2110587973 +3853091412 +3928939022 +111458051 +4134894595 +3797727058 +1067116248 +1526855863 +4107549618 +2097962615 +3716733810 +3579358025 +3789802492 +197511769 +1277070218 +2349745898 +1318686433 +4027894761 +3243632374 +3443933962 +4117796954 +3104589392 +1275144945 +2223997736 +3319686217 +987155727 +3582200766 +2160127194 +557880563 +2647610064 +2798073115 +2470081242 +2714759264 +1206561810 +752009344 +3674295465 +1208355805 +2845722718 +1310703030 +3283600367 +4249755835 +1797297054 +3387061681 +745057021 +1406100931 +890568071 +1891355762 +1432146571 +1635789927 +3850574367 +3486475903 +2613406607 +1416735081 +2697791464 +3809183825 +3480993777 +1747671688 +3495465608 +3992674552 +3485917099 +3442797199 +1947557498 +3165686391 +736097282 +2159049088 +1805813734 +1464352376 +665699272 +926710034 +1206525340 +794151434 +3931075016 +3288152840 +930242666 +3178565711 +311814613 +3643428862 +2712706819 +2540597662 +3268925057 +3246620755 +1949611918 +2259802311 +3234028531 +2977285717 +1709361828 +4135007517 +547527667 +903779240 +3802696003 +4092820943 +2621584307 +3935350806 +2658899294 +2299538054 +1633079011 +2371081628 +653633827 +3393575755 +2717509486 +4065065352 +2866884212 +1591333461 +455318247 +2026418677 +2311082969 +313471817 +1336125232 +541163701 +1596785498 +1897312442 +4143086072 +3257545848 +617749547 +2974213707 +1342418059 +137682380 +1781916709 +94210263 +3664954340 +454606978 +1801974409 +1629703545 +399017597 +687640171 +1906586472 +2705504290 +348891842 +1396746752 +2343468957 +3891865205 +3321823588 +1059056333 +2315008013 +1398714405 +2542076989 +3314584205 +1111612212 +182467996 +4073472720 +756258846 +1115875438 +668857120 +901434810 +3885363762 +352684963 +1908462730 +664445567 +1354683322 +2784234899 +3797679761 +611240307 +3648438506 +2029543750 +1031590466 +3411224024 +3890369609 +1315624228 +695550944 +1089590729 +1382410679 +1428024192 +4084379982 +1701556848 +2846568508 +4257677335 +1983258360 +2536053981 +341846500 +3571277794 +3086982966 +3272199897 +3915261157 +4268342516 +1458788784 +2359988032 +2312669770 +4135541708 +2587736877 +275405229 +654747965 +110323543 +276193726 +676699517 +3751904724 +4115979293 +3321954496 +1080682791 +3740169791 +3127556181 +2324080902 +2044998939 +3466800431 +3929079985 +798587060 +3955834923 +1365937653 +2551751690 +1042797294 +4147067480 +3167389902 +4109791310 +106798732 +890016489 +2152124879 +2094509793 +2620912689 +4002388274 +442555092 +2446800406 +2482722976 +1046077290 +1595713763 +1208763757 +1728050165 +1119251693 +2971252883 +4014614260 +2379532965 +3294389406 +4205388643 +1801395351 +3648956387 +2586177872 +1267756043 +256799117 +3704773713 +1595826951 +537561550 +4279507445 +4130409830 +1921548343 +3646750498 +69644337 +1613593789 +500875671 +1265593675 +3885103058 +2615153061 +1695720878 +1969651657 +2744477416 +1606682266 +1222783690 +4293484464 +3309904799 +61143904 +2971379136 +925965496 +1927033054 +52757719 +862070559 +1442095134 +3248058249 +2380210557 +3483847515 +2768270566 +1663836104 +1947338403 +1906207899 +1784999571 +1767761040 +180410022 +3919718954 +1257118834 +1175152428 +53806292 +959968286 +698945163 +1189144090 +2460755474 +1562851608 +3751097620 +964420749 +2876126504 +1758871500 +706964685 +3649560167 +3605906082 +791598367 +414521442 +1878476659 +4293414623 +1017514700 +440382863 +2844526903 +2536371749 +1434626380 +1113457621 +1847424353 +3873992931 +1419614844 +480689200 +86010143 +2768117285 +409336340 +3934621298 +3657393980 +4128817252 +3032510455 +2255018395 +3514386173 +2240916594 +3978361357 +3524748013 +283257253 +2650924859 +3737765641 +2644342907 +2756887204 +2304026336 +705384571 +3611441093 +1777420837 +856568326 +1136260889 +522878353 +145938142 +1794358072 +3913058008 +1630501322 +3405526390 +3707987459 +252467559 +562398169 +3237979095 +790248507 +2810614245 +3069442770 +2823575260 +3644518416 +97054198 +1053608263 +1913832857 +2134146647 +2988628018 +4124773964 +1149745119 +383753236 +2213201466 +4018963928 +3029830271 +24499104 +3785476248 +3025493484 +4211508112 +1240964139 +516265402 +3636405404 +765025284 +2768329496 +1465281206 +4078848796 +2742644222 +273951747 +2189578831 +956923249 +1847415321 +3185208026 +2052181134 +2193378759 +2518122140 +2630759062 +3036167871 +551295217 +1977286279 +1287660033 +2716418558 +676130936 +2239902017 +3754385262 +3520999429 +2229332418 +412432752 +138570556 +215934258 +1452640050 +1129842285 +304570391 +67518245 +256252813 +687691786 +3616034401 +2711022148 +92031655 +2819154139 +1766893017 +858335971 +4185869499 +2450747845 +1262978068 +2797840193 +3324314403 +2901429021 +1009780939 +3254699043 +3615795752 +1035627924 +1795583585 +1866683438 +1263858495 +3004782253 +581166754 +3337262896 +2587935832 +1641351407 +622585811 +4090078240 +1106192728 +3487950614 +3592590663 +455546700 +2488163087 +3189114306 +737348617 +3670307983 +3834641277 +671131599 +2042827269 +761247961 +352936071 +2018719670 +3763251171 +884243260 +3591507103 +3317995483 +3603651887 +1503517737 +1780827984 +2334649477 +2749958564 +157333828 +2411874921 +1687320919 +3647292008 +3488990070 +2185300412 +373070768 +1744101622 +4044310582 +295610132 +2591164670 +4136702027 +2930647742 +3484051464 +654450303 +1507826732 +3174543320 +2851256675 +402607786 +536058247 +1913369098 +3438864894 +230904312 +3899950625 +4027008020 +739699322 +4165391103 +2170398149 +4280928468 +3913972324 +2773319838 +4065465281 +1534813042 +915942278 +499413663 +581468687 +2759396556 +974578797 +2625508614 +4230773681 +2013226130 +3658619637 +1243714710 +3826790181 +3035967786 +1706709300 +943212190 +3935818023 +2612443675 +265710305 +1354648248 +4154057208 +3135801871 +4222984436 +923497144 +932362160 +2872810956 +1095884591 +1876581615 +2099342201 +2310567989 +430765417 +2747676953 +2761172604 +4190173749 +3145021958 +387584024 +4008987205 +285814033 +3167155774 +2697748515 +329128280 +973135483 +1016770103 +1579230085 +1517192241 +2878140062 +2440879867 +1905760691 +2603573351 +3513767036 +3495902061 +739514505 +1327896473 +292674778 +2610628739 +2507187001 +268280250 +2503188256 +3001296354 +2684360402 +49450418 +2766009828 +2705502014 +2129565939 +2427388237 +995329402 +3284458206 +116265134 +2126215829 +2763555798 +173643499 +3298912332 +1033098231 +3618017831 +120791007 +3582848073 +1190291046 +2229846801 +2989666765 +1196062293 +1039968568 +3058006234 +3549768761 +76530251 +2861763437 +1093432954 +4017942627 +1194258840 +4161698525 +1698592439 +2285254049 +548682686 +2523864329 +1564482779 +1195165994 +3147696606 +2276754687 +1071325640 +764459723 +2713469632 +3907171988 +1482719430 +141661389 +781101426 +2254374762 +1145964191 +1092511701 +2030068808 +2678852172 +3524413033 +1113670269 +542805823 +3551296580 +859999683 +3485961921 +2335126596 +1398964427 +949409161 +1554129398 +2239228299 +397615380 +2706717275 +1055677130 +1477876861 +982081990 +4282193345 +1351399359 +1352217616 +3187418638 +158695579 +2975149658 +318409042 +2232504964 +1785162698 +935835101 +490738036 +50022709 +1518457941 +412907642 +114134372 +96710498 +3673531209 +2993392552 +2505483888 +113294851 +2778313265 +2426744393 +223106872 +397765664 +2336671001 +3362947161 +2913067915 +2352854588 +3208562679 +321473296 +3401215098 +983109 +975425677 +1690688456 +4275161488 +1509696701 +1281256796 +3279836684 +493891325 +1958788890 +3446359963 +119309654 +3885395111 +1348582996 +1817296100 +3462272140 +2802963639 +619185276 +2425535784 +1409731870 +1619696449 +1311847145 +940075881 +4185548734 +211755517 +3642911901 +688030112 +1885853211 +461119859 +3075479355 +2627355984 +94340058 +642680673 +1370001836 +2773681491 +2135158789 +911421700 +1323947506 +537950348 +331780052 +1861780332 +1299481648 +3095997466 +950853091 +1090811995 +53996866 +1706022802 +2439456208 +4209833004 +1285536836 +2796242544 +3173541677 +1463932527 +2437078946 +1970010156 +3914003930 +408488323 +4183075399 +3988592298 +2469477213 +1754836254 +1506295075 +2013400588 +2619859878 +3750895564 +1351467627 +188798882 +2016779410 +2038717583 +4119332801 +3519521207 +1840968846 +1047237809 +890537883 +2402553796 +3454610071 +2219188168 +580114076 +1382224931 +2264134668 +3442813448 +2966647838 +1403880951 +2622313912 +1210527504 +3739075758 +1549414306 +1967270508 +2715207952 +3498912171 +1775556312 +1935959361 +1534570128 +1704667537 +957564349 +1566496565 +1917029497 +43982735 +2254666116 +1314530765 +3695957858 +4141837442 +3566999467 +2284462278 +2653865008 +1300297251 +845026991 +2590708030 +2817302398 +2985977927 +3096548078 +3857898460 +437230919 +3328407458 +2851136635 +3518237210 +3313316040 +1720131892 +610380400 +3547660935 +1728600739 +2194869199 +3638186258 +3020299534 +477811034 +1820418202 +1764432617 +497198552 +1433732245 +531570253 +3822805777 +2340676841 +4142518189 +4110711907 +1833793551 +960725744 +3058264344 +2990571925 +3646795275 +625124405 +3459529473 +2886816294 +2456105749 +3848194798 +3496623479 +729200986 +3299888089 +2060901032 +271228381 +3772319363 +2590586133 +3804969278 +1034785294 +3048013097 +3240832871 +44850990 +2077752758 +1991944758 +3931215414 +1089989416 +4084595418 +3082295357 +3102576169 +2390990962 +624635048 +2681453444 +600922880 +3645273385 +2728012176 +2815745664 +2627891749 +1396093296 +4287204244 +1691958452 +1331250173 +735965168 +3121901178 +3934429187 +3780647786 +2435273304 +4184368715 +1196413650 +1579169630 +3605141720 +3260068208 +84284961 +2936868042 +3419076002 +2438533227 +1606912762 +2023326315 +2159493456 +2557595309 +3887521973 +3770319352 +482594308 +1445542209 +552636567 +1957889812 +4099041298 +1834226616 +337716071 +24306034 +4018114971 +1146278923 +3620679184 +2676742593 +2050556771 +4146728774 +281382355 +790096056 +3244248400 +201753479 +1746800856 +1514015578 +3299509437 +3530166461 +3800430040 +1202197725 +2415326343 +1660501592 +1167007994 +1353369291 +1387121167 +1761429320 +1236356071 +193131312 +3402204892 +910760257 +3219022796 +4188670373 +1478637148 +75465564 +1199447080 +470192903 +3354839136 +3178547502 +454529786 +1660627746 +3586231925 +2202806167 +1609138267 +1829564223 +2943834599 +2753984097 +1254005320 +4170826164 +3164351788 +2598680 +262318655 +340285249 +3147002700 +3698181311 +2250467945 +2862355953 +2963228270 +379876551 +3536580887 +4122147345 +1226957844 +3342390291 +965184480 +207012965 +973617301 +948166193 +2667770313 +540109626 +64966370 +2609523889 +3625169505 +1360794644 +3991283513 +2406124136 +2040790397 +2760308091 +894563417 +1668780444 +1861588850 +3819607776 +4104201913 +4006776079 +2638567430 +1340677702 +1583307609 +384561556 +198523880 +3172629985 +130306960 +3632377850 +3938815067 +2667045504 +1537428840 +4244925672 +3116225489 +856400307 +2491612233 +242467916 +2559908813 +3249892117 +3040643046 +40880461 +3620883929 +3325999990 +2986019529 +1980493334 +2535960488 +3123668483 +1452638677 +2641652354 +2747561512 +715106102 +4145652491 +3881207299 +612435175 +2231754746 +3140699948 +2710276286 +702095251 +2016638535 +2871186259 +533076491 +1094957413 +1927067944 +1501574983 +4064333604 +2747138737 +1918561824 +377844369 +1944146529 +51573040 +1710514570 +2101389704 +35014874 +4122353771 +3242854723 +1801484701 +3676269364 +2916635215 +2248867800 +2646635411 +3812730089 +2333685765 +325138324 +742926414 +3412577672 +947018790 +3572490212 +4157495273 +3633421896 +1105082707 +411345158 +700710280 +3701228310 +2495482553 +1191980288 +4243798433 +3874265760 +732986222 +1240300677 +2035674456 +1236462756 +3492342385 +713678480 +1856345419 +288510102 +34444867 +1935623460 +2314016175 +3986052519 +4222898330 +3321507467 +2658318694 +3024170965 +1200235932 +2774363888 +3077141503 +2952418538 +2002020495 +3173696835 +2483056602 +3399812740 +1897677875 +861270578 +3573482983 +1493437830 +365201134 +1348345142 +3263929494 +735470975 +3597712315 +822917411 +1942939695 +3283689326 +348388 +1851912047 +1595879747 +2681532950 +315386741 +2732350333 +205325705 +1299864804 +311372073 +2158212847 +1564262971 +3972608965 +799697814 +3645865195 +104820850 +3875875729 +3580382806 +2091590444 +1460793550 +3928815526 +3406704546 +4154644069 +2305530113 +2140073325 +3008657964 +1889160817 +212254521 +1915119386 +3771578573 +1404089675 +75224001 +3190961490 +3977021113 +2559975201 +2635997043 +1602834359 +3166121066 +3239355242 +4200925530 +4239692016 +1462603557 +2464332240 +1626865342 +3883155117 +4005585391 +2245511893 +1370309138 +1671927928 +3001988595 +1999178395 +405415172 +4020592073 +2685197012 +3865571823 +2642401070 +2878079876 +2650882161 +1611222870 +3678165817 +3311505398 +3165022437 +2787324317 +1125371520 +3916470197 +641850353 +874205963 +898294045 +694443358 +2335822440 +3706343512 +1895081925 +2843497935 +4150783033 +3407728067 +1367065899 +55797987 +2173721476 +3282919604 +412793429 +222365940 +4139698294 +25131186 +1282790403 +658500184 +4182274666 +2067009632 +443684381 +2448411522 +1182762333 +3253891413 +687347699 +4233840776 +2345723506 +3882737996 +1001392189 +1566268184 +4176750435 +962418872 +2443141865 +735717991 +1631920906 +4103394505 +2051040370 +891902183 +3132783068 +534023914 +744753201 +2904838576 +2335196997 +2634589372 +452793627 +3314882928 +1999007289 +1062040911 +1943108158 +821111887 +3874711892 +3910381779 +1970360756 +384926902 +269141906 +3402621484 +2741388557 +698721951 +834770287 +1929291140 +2178763064 +4227778560 +2470696301 +2288130441 +1426002425 +2252960653 +3659721782 +3578584985 +1033889819 +917038861 +3662877258 +2678988937 +2499127705 +3265831657 +3456908192 +243457385 +373210425 +626439885 +1919252617 +3731060507 +560458893 +2478553665 +272947952 +2622612651 +1252080948 +2675630815 +3538036247 +2708380108 +3885022723 +3275337773 +202141144 +3544428308 +3054869000 +415164280 +3810487872 +4294757363 +2918946674 +264977522 +613625556 +782891813 +2262688932 +186667766 +3617280808 +3273293900 +2771452265 +3170797206 +3279197520 +1324980161 +3298186478 +788769614 +3138321079 +3593423476 +3682194876 +2459038401 +770815739 +846520790 +3890661757 +2206860911 +2913691696 +3920814091 +807283002 +2959862876 +944649627 +2726443387 +886117713 +1014240669 +2403148490 +927842931 +3939680977 +715871456 +4056790224 +3855503911 +1335143363 +897887085 +1063898070 +2758538161 +2623627401 +380311070 +1790679406 +3562555101 +464623713 +2653115702 +813962825 +2247779845 +899990744 +509717256 +4269670499 +2895139458 +1562147518 +1880219001 +810388715 +3287356725 +2957473758 +82328998 +4263380215 +2403904510 +1528522831 +2996965259 +3170530431 +1885377943 +3023033193 +3113843845 +1408116682 +2447641652 +3756536810 +3529501515 +4197162664 +2321873906 +304791101 +1295982172 +809675038 +3645134264 +2520546207 +1895007714 +1096315451 +167973852 +3743403099 +2152809404 +4025144774 +913776865 +4242885266 +2904946467 +1737145864 +4245873824 +4100555029 +3016494453 +802506648 +876821704 +1559943174 +2470562801 +1146090019 +2827044301 +1950039035 +960063979 +2399567107 +9385138 +3678640350 +1212148683 +2144266720 +3781244084 +278278670 +321834776 +3754260289 +896593370 +140525080 +1880210741 +4168638242 +908318145 +1380950728 +2078401813 +4124767316 +3686280513 +3686147896 +950103544 +4143847431 +2768943180 +2642145383 +4235421827 +191461455 +3336692058 +1748069617 +3968360977 +2508509850 +3564688329 +2605662346 +1774191844 +1664226440 +1960342760 +1256605388 +1522533312 +1116176967 +1101133113 +1575936467 +191313245 +3441471213 +3995368225 +3216164682 +4183947660 +866445930 +1034421910 +3475020344 +2994036582 +2038752540 +4062058869 +1950500709 +1789063618 +2353685264 +535335489 +995419772 +1021562761 +1355711980 +1604623032 +2271742243 +2931384021 +3745082984 +1532417914 +1211297037 +1018214315 +3727869283 +4086892699 +2857554004 +254063285 +1007397488 +2559631135 +4037785841 +3925712273 +1907094923 +1087977990 +3540095035 +959374538 +1463450657 +3841659518 +3488666191 +1226207515 +2597973135 +664110795 +2574868648 +736450376 +339165910 +1066488857 +3228009012 +1152613483 +300716403 +4082682412 +3351578765 +2067764889 +764274504 +4215944968 +419507292 +755733810 +1267739227 +460352807 +2559511720 +3321666038 +3330382953 +1517247596 +3088211524 +2428079234 +334002478 +978419925 +755020380 +4188691128 +3940699996 +3414909254 +677745754 +2572489431 +304057574 +3955870978 +4138736321 +547202807 +3348008071 +3901242551 +1576327180 +2445024081 +525180300 +3270611131 +1409012873 +1615815881 +3383527568 +2765933819 +473605073 +3426939448 +1211419332 +1301324699 +2376915004 +2929773056 +209136864 +3856012130 +2450961392 +87399316 +3545537811 +3421991372 +1783387580 +2009737503 +3941580719 +741540271 +597643891 +270442411 +193721489 +2502940102 +2635513837 +300920102 +1755447964 +2812409859 +1827340506 +1732046364 +3164331103 +3917017595 +442289904 +4265847184 +3363303773 +3688834237 +343676192 +446576427 +636733962 +2475359167 +1997173436 +917015889 +950893359 +1564803169 +2221955565 +3943671456 +1735062548 +2747152778 +3085332056 +3251644077 +2840842498 +970357091 +1408021008 +2519568809 +3245031600 +3129950639 +1119131142 +3751535521 +978688344 +3445108409 +2204606814 +4181879247 +2364953897 +3882165908 +2072803988 +1637498656 +3287694549 +498217956 +868684082 +3208462471 +587943326 +984123941 +1982427644 +1932816583 +2090310562 +2674196225 +4259690269 +1104692667 +3531745947 +1927350879 +2246329514 +2451321261 +1632224043 +4101213714 +3256561457 +1463834728 +714153887 +3621244098 +990103025 +397992997 +1302037626 +1651169438 +740851807 +2413944828 +2664093505 +3505864590 +3316459618 +995398273 +4009034108 +697013806 +2564137343 +2025703196 +1195439225 +3396626035 +1006508036 +1589112718 +1319727742 +2196072006 +1042278675 +3377803138 +1191644477 +1427857965 +624581339 +4162517720 +1379489751 +3670705390 +466459560 +247114212 +1547746689 +128434362 +2058247720 +1797723579 +830866401 +1906526786 +1532548701 +3435835076 +1890127359 +2668091832 +2615810192 +3466883350 +516194401 +3507456579 +1576602573 +708187120 +4213569705 +4233726262 +3874144522 +2755068526 +2565811822 +3293689197 +733091957 +3639932900 +4088066368 +296200353 +2090266120 +2240284370 +4224417077 +1792804792 +2314609617 +1317471944 +4195185923 +1741163148 +2321725017 +489362029 +747333252 +1429457013 +2863997435 +578440726 +4044132094 +856762955 +2722223651 +3507154563 +2239326939 +1492892868 +2647219828 +1391382241 +2348383682 +741615662 +1040500412 +1163648826 +911295633 +2772922132 +2627600570 +3034572189 +1256137300 +3055412399 +695310340 +1055571529 +2600288139 +4237536614 +1511235650 +1973343279 +2762180562 +1623207660 +2817461409 +1153361884 +1471148290 +174262513 +758747028 +3087997916 +3454513312 +3876866478 +3750564697 +147753392 +4114221999 +1974896810 +804905894 +1911346784 +2837320389 +2260085728 +1773329600 +1534532223 +121188203 +1117136700 +3260307799 +2969761903 +3074471776 +2813875987 +1108028203 +2604509712 +119734535 +2080626772 +4154056254 +2485201636 +3016023117 +4147155728 +3927733139 +1517577163 +3932578722 +2608242369 +191473425 +2039615647 +4165482394 +2094321484 +2233399318 +357954992 +1308020453 +2887461588 +2379601205 +1990775328 +2803190366 +1096079281 +456808553 +1842303540 +1216433873 +4240392048 +726164637 +4033618682 +1657154991 +3010230023 +271053136 +3837096573 +255277705 +2577884490 +3179517171 +2628778574 +2020950579 +3618953390 +1626189045 +3549756629 +278853875 +3437422767 +3635640786 +3602290462 +4200031621 +2117112601 +659190281 +2682702146 +3974175798 +4166223072 +2688932456 +644173202 +2917046033 +1127998902 +3877843307 +2307553859 +662773413 +4240014324 +209825504 +3062984540 +3737101738 +3660959844 +620553797 +2876291638 +3645386833 +3736244021 +3138797514 +3149764063 +2433560641 +306906757 +4254170206 +3773211627 +356419361 +2037478430 +3882386769 +943718445 +3748688162 +2513623369 +1936641148 +3379614344 +4127090714 +575243408 +1054703504 +2077964781 +3884077173 +922366188 +3488645853 +2479392240 +3538010120 +2637270334 +4164633370 +2811262181 +3156726663 +4225532829 +4131020506 +2496794188 +2004420854 +1047074222 +3630668422 +4234517787 +1590844888 +1779640780 +3980268515 +822666154 +2557756905 +17290977 +2581445394 +4217933802 +372760181 +2640294605 +1708510156 +2552160225 +1398685400 +3401022997 +2518465268 +3574050694 +113259732 +2553453723 +238287439 +1218244104 +43759084 +2564628877 +2989602035 +648178461 +797816686 +3735813830 +1523603945 +1490368270 +1823942043 +2236317306 +21722619 +1263111029 +2190890120 +3875188285 +3562642835 +4269423219 +2009891184 +1281708292 +782216052 +493284146 +2458886132 +2818589514 +3635210377 +2931910227 +2822153820 +908331382 +4284465663 +92999672 +2046989356 +2394366699 +96271999 +3920873225 +3480302578 +815347485 +1553725658 +1961476901 +3291575136 +3667015437 +4109116290 +3703628917 +2138703240 +2591828825 +823353204 +2588862341 +3775496805 +1388824571 +52623109 +1879945717 +4004789290 +1195222222 +3042460536 +1464677169 +1867693946 +4222739431 +1282077607 +3334411258 +2332943504 +265680352 +2761127573 +3532576199 +1276224375 +1711958085 +3892043812 +1965994259 +746743471 +2740235382 +204541527 +1928121093 +2079823083 +2264328523 +4150479665 +3121970724 +2305576763 +646019670 +3244891858 +3873486414 +1337734538 +167996473 +1377946594 +4215098840 +3752427150 +3435024840 +629592773 +2387920987 +2192286473 +3851378277 +2054195182 +2101937193 +160500154 +527184210 +2776811557 +3643389694 +1881867209 +455758941 +591593968 +771898881 +4063998928 +1697871828 +1527239498 +433684483 +1907287194 +2985905453 +4208270874 +1915753898 +4255899866 +3640950136 +419788608 +2174491247 +1748808281 +2853003058 +1669787538 +1997085588 +161740547 +816257649 +963874688 +1298336248 +764913504 +1147775622 +2296722402 +1725186048 +660188756 +650819570 +688640691 +3381530934 +1329995197 +1771265376 +2526901817 +2812939023 +2642964663 +2733580318 +3290681829 +650008141 +1302443626 +1162688378 +1572176755 +1058834516 +1362932083 +690998389 +2848517030 +1307350002 +1696690104 +4096988075 +867104308 +1265102008 +3595675752 +1968934909 +132216250 +1365947990 +1529160929 +2032906159 +3853410716 +1749005556 +1529961465 +3892784617 +267318517 +739691320 +4275078469 +2733955770 +3262489581 +1859651871 +2660469019 +742066281 +2626264116 +2459342977 +3984901932 +2499415252 +3459175451 +4078944221 +1748400033 +2630105570 +1034415960 +2657065185 +2701594925 +3625010494 +1637662234 +2359267550 +2768183384 +1760126403 +3191560334 +1512038885 +3655899285 +3945240016 +1358287271 +2340197430 +3394828120 +71008889 +3156219828 +1596791167 +1889114110 +524780498 +3669595342 +1968819489 +2420116555 +2859517038 +563091141 +2280493550 +2977194099 +3063100748 +867687335 +2758319746 +1459463076 +4009706455 +1012475152 +2562540989 +3389350977 +2882161504 +4162085142 +831032247 +3579503541 +1629602056 +1545704138 +1627174203 +2666000147 +1876332636 +1644804847 +2655350157 +1417567614 +1483237937 +852758770 +2265421444 +988520601 +2706945265 +2391353746 +1718691618 +1763158469 +187935935 +84889600 +58475166 +222967100 +3341924719 +3450295676 +2652366462 +3311140489 +4069518363 +3201965074 +587126225 +2712813129 +933770261 +2026335872 +1480454936 +2308123826 +2465192966 +2564973304 +2995118820 +3960159770 +1270003919 +251889800 +3426931721 +784689313 +1462744306 +2762913513 +2305934881 +1579998090 +947256698 +3374565910 +1280757084 +606715276 +1822752234 +3401174815 +1260481625 +3126245007 +677621385 +356951669 +1163837632 +2899634271 +2372459795 +3317787562 +3965114007 +1308481149 +2493689573 +2924102186 +3126342992 +3760318775 +2530597235 +4177601925 +786777801 +129188944 +724540294 +896082016 +405435634 +913107139 +3440492903 +1962357062 +899566460 +400893916 +2596264151 +3675070400 +994654433 +1123756515 +2386161640 +2506845252 +3000100940 +1184830378 +1092781633 +165371336 +418773755 +4275797911 +2773328530 +2094510118 +2662185482 +519612241 +1513872552 +1136764470 +917422290 +3674688424 +927246051 +2711785923 +94806925 +1411585994 +2872234114 +3054647024 +2905688003 +16581949 +2468493961 +3192733326 +2959379296 +4029240874 +2121833940 +3381016122 +903653999 +865491479 +2058555870 +1586445886 +2452086731 +3564666163 +3672746092 +3562748941 +2867638093 +2713204853 +272914271 +3035354475 +3449213903 +2892537905 +2151290230 +1137407689 +648219772 +531037657 +2648455916 +4022976027 +2208589449 +1088698077 +4046049616 +1963767748 +2171691572 +2370328893 +2457830979 +1154906823 +805364313 +1188263669 +1860290697 +2958650021 +1294028101 +1924821788 +3728757694 +2063050046 +899326822 +1825301069 +3086229276 +1802168728 +1218325681 +1478151445 +3377095251 +703684208 +3296867231 +1085317979 +2305823716 +185444826 +2164728262 +2834968537 +3869371344 +3179029697 \ No newline at end of file diff --git a/PHF_benchmark/cmph/libcmph/bin/cmph b/PHF_benchmark/cmph/libcmph/bin/cmph new file mode 100755 index 0000000..a91732e Binary files /dev/null and b/PHF_benchmark/cmph/libcmph/bin/cmph differ diff --git a/PHF_benchmark/cmph/libcmph/eg.c b/PHF_benchmark/cmph/libcmph/eg.c new file mode 100755 index 0000000..81b25c4 --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/eg.c @@ -0,0 +1,41 @@ +#include "include/cmph.h" +#include +// Create minimal perfect hash function from in-memory vector +int main(int argc, char **argv) +{ + + // Creating a filled vector + unsigned int i = 0; + const char *vector[] = {"aaaaaaaaaa", "bbbbbbbbbb", "cccccccccc", "dddddddddd", "eeeeeeeeee", + "ffffffffff", "gggggggggg", "hhhhhhhhhh", "iiiiiiiiii", "jjjjjjjjjj"}; + unsigned int nkeys = 10; + FILE* mphf_fd = fopen("temp.mph", "w"); + // Source of keys + cmph_io_adapter_t *source = cmph_io_vector_adapter((char **)vector, nkeys); + + //Create minimal perfect hash function using the brz algorithm. + cmph_config_t *config = cmph_config_new(source); + cmph_config_set_algo(config, CMPH_BRZ); + cmph_config_set_mphf_fd(config, mphf_fd); + cmph_t *hash = cmph_new(config); + cmph_config_destroy(config); + cmph_dump(hash, mphf_fd); + cmph_destroy(hash); + fclose(mphf_fd); + + //Find key + mphf_fd = fopen("temp.mph", "r"); + hash = cmph_load(mphf_fd); + while (i < nkeys) { + const char *key = vector[i]; + unsigned int id = cmph_search(hash, key, (cmph_uint32)strlen(key)); + fprintf(stderr, "key:%s -- hash:%u\n", key, id); + i++; + } + + //Destroy hash + cmph_destroy(hash); + cmph_io_vector_adapter_destroy(source); + fclose(mphf_fd); + return 0; +} diff --git a/PHF_benchmark/cmph/libcmph/include/chd_ph.h b/PHF_benchmark/cmph/libcmph/include/chd_ph.h new file mode 100755 index 0000000..03e4087 --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/include/chd_ph.h @@ -0,0 +1,59 @@ +#ifndef _CMPH_CHD_PH_H__ +#define _CMPH_CHD_PH_H__ + +#include "cmph.h" + +typedef struct __chd_ph_data_t chd_ph_data_t; +typedef struct __chd_ph_config_data_t chd_ph_config_data_t; + +/* Config API */ +chd_ph_config_data_t *chd_ph_config_new(void); +void chd_ph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); + +/** \fn void chd_ph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); + * \brief Allows to set the number of keys per bin. + * \param mph pointer to the configuration structure + * \param keys_per_bin value for the number of keys per bin + */ +void chd_ph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); + +/** \fn void chd_ph_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket); + * \brief Allows to set the number of keys per bucket. + * \param mph pointer to the configuration structure + * \param keys_per_bucket value for the number of keys per bucket + */ +void chd_ph_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket); +void chd_ph_config_destroy(cmph_config_t *mph); + + +/* Chd algorithm API */ +cmph_t *chd_ph_new(cmph_config_t *mph, double c); +void chd_ph_load(FILE *fd, cmph_t *mphf); +int chd_ph_dump(cmph_t *mphf, FILE *fd); +void chd_ph_destroy(cmph_t *mphf); +cmph_uint32 chd_ph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void chd_ph_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void chd_ph_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 chd_ph_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 chd_ph_packed_size(cmph_t *mphf); + +/** cmph_uint32 chd_ph_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 chd_ph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/PHF_benchmark/cmph/libcmph/include/cmph.h b/PHF_benchmark/cmph/libcmph/include/cmph.h new file mode 100755 index 0000000..1bc009e --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/include/cmph.h @@ -0,0 +1,112 @@ +#ifndef __CMPH_H__ +#define __CMPH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "cmph_types.h" + +typedef struct __config_t cmph_config_t; +typedef struct __cmph_t cmph_t; + +typedef struct +{ + void *data; + cmph_uint32 nkeys; + int (*read)(void *, char **, cmph_uint32 *); + void (*dispose)(void *, char *, cmph_uint32); + void (*rewind)(void *); +} cmph_io_adapter_t; + +/** Adapter pattern API **/ +/* please call free() in the created adapters */ +cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys); +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_struct_vector_adapter(void * vector, + cmph_uint32 struct_size, + cmph_uint32 key_offset, + cmph_uint32 key_len, + cmph_uint32 nkeys); + +void cmph_io_struct_vector_adapter_destroy(cmph_io_adapter_t * key_source); + +/** Hash configuration API **/ +cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); +void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); +void cmph_config_set_graphsize(cmph_config_t *mph, double c); +void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void cmph_config_set_b(cmph_config_t *mph, cmph_uint32 b); +void cmph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); +void cmph_config_destroy(cmph_config_t *mph); + +/** Hash API **/ +cmph_t *cmph_new(cmph_config_t *mph); + +/** cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + * \brief Computes the mphf value. + * \param mphf pointer to the resulting function + * \param key is the key to be hashed + * \param keylen is the key legth in bytes + * \return The mphf value + */ +cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +cmph_uint32 cmph_size(cmph_t *mphf); +void cmph_destroy(cmph_t *mphf); + +/** Hash serialization/deserialization */ +int cmph_dump(cmph_t *mphf, FILE *f); +cmph_t *cmph_load(FILE *f); + +/** \fn void cmph_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the + * \param resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void cmph_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 cmph_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 cmph_packed_size(cmph_t *mphf); + +/** cmph_uint32 cmph_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 cmph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +// TIMING functions. To use the macro CMPH_TIMING must be defined +#include "cmph_time.h" + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PHF_benchmark/cmph/libcmph/include/cmph_time.h b/PHF_benchmark/cmph/libcmph/include/cmph_time.h new file mode 100755 index 0000000..d801809 --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/include/cmph_time.h @@ -0,0 +1,62 @@ +#ifdef ELAPSED_TIME_IN_SECONDS +#undef ELAPSED_TIME_IN_SECONDS +#endif + +#ifdef ELAPSED_TIME_IN_uSECONDS +#undef ELAPSED_TIME_IN_uSECONDS +#endif + +#ifdef WIN32 +// include headers to use gettimeofday +#else + #ifdef __GNUC__ + #include + #include + #endif +#endif + +#ifdef __GNUC__ + #ifndef __CMPH_TIME_H__ + #define __CMPH_TIME_H__ + static inline void elapsed_time_in_seconds(double * elapsed_time) + { + struct timeval e_time; + if (gettimeofday(&e_time, NULL) < 0) { + return; + } + *elapsed_time = (double)e_time.tv_sec + ((double)e_time.tv_usec/1000000.0); + } + static inline void dummy_elapsed_time_in_seconds() + { + } + static inline void elapsed_time_in_useconds(cmph_uint64 * elapsed_time) + { + struct timeval e_time; + if (gettimeofday(&e_time, NULL) < 0) { + return; + } + *elapsed_time = (cmph_uint64)(e_time.tv_sec*1000000 + e_time.tv_usec); + } + static inline void dummy_elapsed_time_in_useconds() + { + } + #endif +#endif + +#ifdef CMPH_TIMING + #ifdef __GNUC__ + #define ELAPSED_TIME_IN_SECONDS elapsed_time_in_seconds + #define ELAPSED_TIME_IN_uSECONDS elapsed_time_in_useconds + #else + #define ELAPSED_TIME_IN_SECONDS dummy_elapsed_time_in_seconds + #define ELAPSED_TIME_IN_uSECONDS dummy_elapsed_time_in_useconds + #endif +#else + #ifdef __GNUC__ + #define ELAPSED_TIME_IN_SECONDS + #define ELAPSED_TIME_IN_uSECONDS + #else + #define ELAPSED_TIME_IN_SECONDS dummy_elapsed_time_in_seconds + #define ELAPSED_TIME_IN_uSECONDS dummy_elapsed_time_in_useconds + #endif +#endif diff --git a/PHF_benchmark/cmph/libcmph/include/cmph_types.h b/PHF_benchmark/cmph/libcmph/include/cmph_types.h new file mode 100755 index 0000000..40f4332 --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/include/cmph_types.h @@ -0,0 +1,42 @@ +#ifndef __CMPH_TYPES_H__ +#define __CMPH_TYPES_H__ + +typedef char cmph_int8; +typedef unsigned char cmph_uint8; + +typedef short cmph_int16; +typedef unsigned short cmph_uint16; + +typedef int cmph_int32; +typedef unsigned int cmph_uint32; + +#if defined(__ia64) || defined(__x86_64__) + /** \typedef long cmph_int64; + * \brief 64-bit integer for a 64-bit achitecture. + */ + typedef long cmph_int64; + + /** \typedef unsigned long cmph_uint64; + * \brief Unsigned 64-bit integer for a 64-bit achitecture. + */ + typedef unsigned long cmph_uint64; +#else + /** \typedef long long cmph_int64; + * \brief 64-bit integer for a 32-bit achitecture. + */ + typedef long long cmph_int64; + + /** \typedef unsigned long long cmph_uint64; + * \brief Unsigned 64-bit integer for a 32-bit achitecture. + */ + typedef unsigned long long cmph_uint64; +#endif + +typedef enum { CMPH_HASH_JENKINS, CMPH_HASH_COUNT } CMPH_HASH; +extern const char *cmph_hash_names[]; +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_FCH, + CMPH_BDZ, CMPH_BDZ_PH, + CMPH_CHD_PH, CMPH_CHD, CMPH_COUNT } CMPH_ALGO; +extern const char *cmph_names[]; + +#endif diff --git a/PHF_benchmark/cmph/libcmph/lib/libcmph.a b/PHF_benchmark/cmph/libcmph/lib/libcmph.a new file mode 100755 index 0000000..aefc296 Binary files /dev/null and b/PHF_benchmark/cmph/libcmph/lib/libcmph.a differ diff --git a/PHF_benchmark/cmph/libcmph/lib/libcmph.la b/PHF_benchmark/cmph/libcmph/lib/libcmph.la new file mode 100755 index 0000000..4745693 --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/lib/libcmph.la @@ -0,0 +1,41 @@ +# libcmph.la - a libtool library file +# Generated by ltmain.sh (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libcmph.so.0' + +# Names of this library. +library_names='libcmph.so.0.0.0 libcmph.so.0 libcmph.so' + +# The name of the static archive. +old_library='libcmph.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -lm' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libcmph. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/home/keran2/Work/timeComparePHF/cmph/libcmph/lib' diff --git a/PHF_benchmark/cmph/libcmph/lib/libcmph.so b/PHF_benchmark/cmph/libcmph/lib/libcmph.so new file mode 100755 index 0000000..218be5f --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/lib/libcmph.so @@ -0,0 +1 @@ +libcmph.so.0.0.0 \ No newline at end of file diff --git a/PHF_benchmark/cmph/libcmph/lib/libcmph.so.0 b/PHF_benchmark/cmph/libcmph/lib/libcmph.so.0 new file mode 100755 index 0000000..218be5f --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/lib/libcmph.so.0 @@ -0,0 +1 @@ +libcmph.so.0.0.0 \ No newline at end of file diff --git a/PHF_benchmark/cmph/libcmph/lib/libcmph.so.0.0.0 b/PHF_benchmark/cmph/libcmph/lib/libcmph.so.0.0.0 new file mode 100755 index 0000000..3c46ab2 Binary files /dev/null and b/PHF_benchmark/cmph/libcmph/lib/libcmph.so.0.0.0 differ diff --git a/PHF_benchmark/cmph/libcmph/lib/pkgconfig/cmph.pc b/PHF_benchmark/cmph/libcmph/lib/pkgconfig/cmph.pc new file mode 100755 index 0000000..a0cf723 --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/lib/pkgconfig/cmph.pc @@ -0,0 +1,12 @@ +url=http://cmph.sourceforge.net/ +prefix=/home/keran2/Work/timeComparePHF/cmph/libcmph +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: cmph +Description: minimal perfect hashing library +Version: 2.0 +Libs: -L${libdir} -lcmph +Cflags: -I${includedir} +URL: ${url} diff --git a/PHF_benchmark/cmph/libcmph/share/man/man1/cmph.1 b/PHF_benchmark/cmph/libcmph/share/man/man1/cmph.1 new file mode 100755 index 0000000..cdc717a --- /dev/null +++ b/PHF_benchmark/cmph/libcmph/share/man/man1/cmph.1 @@ -0,0 +1,67 @@ +.TH CMPH "1" "October 2007" "cmph 0.6" "User Commands" +.SH NAME +cmph \- minimum perfect hashing tool +.SH SYNOPSIS +.B cmph +[-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b BRZ_parameter] [-d tmp_dir] [-m file.mph] keysfile +.SH DESCRIPTION +.PP +Command line tool to generate and query minimal perfect hash functions. +.PP +Please refer to http://cmph.sf.net for full documentation. +.TP +\fB\-h\fR +Print an help message +.TP +\fB\-c\fR +This value determines: the number of vertices in the graph for the algorithms BMZ and CHM; the number of bits per key required in the FCH algorithm +.TP +\fB\-a\fR +Algorithm. Valid values are: bmz, bmz8, chm, brz, fch +.TP +\fB\-f\fR +hash function (may be used multiple times). valid values are: djb2, fnv, jenkins, sdbm +.TP +\fB\-V\fR +Print version number and exit +.TP +\fB\-v\fR +Increase verbosity (may be used multiple times) +.TP +\fB\-k\fR +Number of keys +.TP +\fB\-g\fR +Generation mode +.TP +\fB\-s\fR +Random seed +.TP +\fB\-m\fR +Minimum perfect hash function file +.TP +\fB\-M\fR +Main memory availability (in MB) +.TP +\fB\-d\fR +Temporary directory used in brz algorithm +.TP +\fB\-b\fR +Parameter of BRZ algorithm to make the maximal number of keys in a bucket lower than 256 +.TP +\fBkeysfile\fR +Line separated file with keys +.SH EXAMPLE +$ # Using the default algorithm (chm) for constructing a mphf +.br +$ # for keys in file keys_file. Lines in keys_file _must_ be unique. +.br +$ ./cmph -v -g keys_file +.br +$ # Query id of keys in the file keys_query +.br +$ ./cmph -v -m keys_file.mph keys_query +.SH AUTHOR +This manual page was written by Enrico Tassi , +for the Debian project (but may be used by others). + diff --git a/PHF_benchmark/cmph/main.cpp b/PHF_benchmark/cmph/main.cpp new file mode 100755 index 0000000..369debe --- /dev/null +++ b/PHF_benchmark/cmph/main.cpp @@ -0,0 +1,187 @@ +#include +#include +#include +#include +#include "libcmph/include/cmph.h" /* cmph library */ +#include +// #include +// #include +// #include + +#include +#include +#include +// #include + +/* + * benchmark of two mphf libraries: + * - phf + * - emphf + * + */ +using namespace std; +// Time calculation +float diffUserTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_utime.tv_sec - start->ru_utime.tv_sec) + + 1e-6*(end->ru_utime.tv_usec - start->ru_utime.tv_usec); +} + +float diffSystemTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_stime.tv_sec - start->ru_stime.tv_sec) + + 1e-6*(end->ru_stime.tv_usec - start->ru_stime.tv_usec); +} + +double do_function(const char* inputFile, const char* algorithm) +{ + //Open file with newline separated list of keys + FILE * keys_fd = fopen(inputFile, "r"); + cmph_t *hash = NULL; + if (keys_fd == NULL) + { + fprintf(stderr, "File %s not found\n", inputFile); + exit(1); + } + + struct timeval gStart, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + + // generate phase + // Source of keys + cmph_io_adapter_t *source = cmph_io_nlfile_adapter(keys_fd); + cmph_config_t *config = cmph_config_new(source); + string algo = algorithm; + if (algo == "CMPH_CHM") + { + cmph_config_set_algo(config, CMPH_CHM); + } + else if (algo == "CMPH_BMZ") + { + cmph_config_set_algo(config, CMPH_BMZ); + } + // else if (algo == "CMPH_BMZ8") // doesn't work + // { + // cmph_config_set_algo(config, CMPH_BMZ8); + // } + // else if (algo == "CMPH_BRZ") // doesn't work + // { + // cmph_config_set_algo(config, CMPH_BRZ); + // } + // else if (algo == "CMPH_FCH") // very long time + // { + // cmph_config_set_algo(config, CMPH_FCH); + // } + else if (algo == "CMPH_BDZ") + { + cmph_config_set_algo(config, CMPH_BDZ); + } + else if (algo == "CMPH_BDZ_PH") + { + cmph_config_set_algo(config, CMPH_BDZ_PH); + } + else if (algo == "CMPH_CHD_PH") + { + cmph_config_set_algo(config, CMPH_CHD_PH); + } + else if (algo == "CMPH_CHD") + { + cmph_config_set_algo(config, CMPH_CHD); + } + else + { + perror("Check input algorithm name again."); + throw "Check input algorithm name again."; + } + hash = cmph_new(config); + cmph_config_destroy(config); + + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gStart.tv_sec + (gEnd.tv_usec - gStart.tv_usec)/1000000.0; + + // fprintf(stderr,"Use Time:%f\r\n",timeuse); + + //dump mphf parameters into a file + FILE * mphf_fd = fopen("function_file", "w"); + cmph_dump(hash, mphf_fd); + fclose(mphf_fd); + + // query phase + FILE * f = fopen("function_file", "r"); + fseek(f, 0, SEEK_END); + unsigned long len = (unsigned long)ftell(f); + /* add query logic here: + // const char *key1 = "2432620340"; + // unsigned int id1 = cmph_search(hash, key1, (cmph_uint32)strlen(key1)); + // fprintf(stderr, "Id:%u\n", id1); + */ + fclose(f); + + //Destroy hash + cmph_destroy(hash); + cmph_io_nlfile_adapter_destroy(source); + fclose(keys_fd); + return timeuse; +} + +vector filePath; + +int listdir(string path) { + struct dirent *entry; + DIR *dp; + + dp = opendir(path.c_str()); + if (dp == NULL) { + perror("opendir: Path does not exist or could not be read."); + return -1; + } + + while ((entry = readdir(dp))) + { + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + else if (entry->d_type == 8) + { + string filePathName = (path + entry->d_name); + // fprintf(stderr,"%s\n", filePathName); + filePath.push_back(filePathName); + } + else if (entry->d_type == 10) + continue; + else if (entry->d_type == 4) // this is a folder, not a file + { + listdir(path + entry->d_name + "/"); + } + } + + closedir(dp); + return 0; +} + +int main (int argc, char* argv[]) +{ + string path = argv[1]; + + listdir(path); + + int fileNum = filePath.size(); + double accTime = 0.0; + double maxTime = 0.0; + const char *algo = argv[2]; + for (int i=0;i maxTime){ + maxTime = curTime; + } + } + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + return 1; +} diff --git a/PHF_benchmark/plot-python/comparison.xlsx b/PHF_benchmark/plot-python/comparison.xlsx new file mode 100755 index 0000000..9c83e2d Binary files /dev/null and b/PHF_benchmark/plot-python/comparison.xlsx differ diff --git a/PHF_benchmark/plot-python/plot_avg_time.py b/PHF_benchmark/plot-python/plot_avg_time.py new file mode 100755 index 0000000..7090a92 --- /dev/null +++ b/PHF_benchmark/plot-python/plot_avg_time.py @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt +import numpy as np +import xlrd +import math +import sys +import csv + +f_input = xlrd.open_workbook(r"./comparison.xlsx") +time_sheet = f_input.sheet_by_name('Time') +# input_row = time_sheet.row_values(4) + +xlabel = ['1k','2k','3k','4k','5k','6k','7k','8k','9k','10k'] + +SPHF_matrix = np.zeros((2, 10), dtype=np.float32) +BDZ_matrix = np.zeros((2, 10), dtype=np.float32) +CHD_matrix = np.zeros((2, 10), dtype=np.float32) +BBHash_matrix = np.zeros((2, 10), dtype=np.float32) + +SPHF_matrix[0][:] = time_sheet.row_values(3)[2:12] +BDZ_matrix[0][:] = time_sheet.row_values(9)[2:12] +CHD_matrix[0][:] = time_sheet.row_values(15)[2:12] +BBHash_matrix[0][:] = time_sheet.row_values(21)[2:12] + +plt.plot(xlabel,BDZ_matrix[0][:],'go-',ms=8,label='BDZ_PH') +plt.plot(xlabel,CHD_matrix[0][:],'yo-',ms=8,label='CHD_PH') +plt.plot(xlabel,BBHash_matrix[0][:],'ro-',ms=8,label='BBHash') +plt.plot(xlabel,SPHF_matrix[0][:],'ko-',ms=8,label='SPHF') + +plt.xlabel('Number of Input IP Addresses',fontsize=18) +plt.ylabel('Average Construction Time (ms)',fontsize=18) +plt.tick_params(labelsize=15) +plt.legend(fontsize=15) + +plt.show() \ No newline at end of file diff --git a/PHF_benchmark/plot-python/plot_max_time.py b/PHF_benchmark/plot-python/plot_max_time.py new file mode 100755 index 0000000..2bc921a --- /dev/null +++ b/PHF_benchmark/plot-python/plot_max_time.py @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt +import numpy as np +import xlrd +import math +import sys +import csv + +f_input = xlrd.open_workbook(r"./comparison.xlsx") +time_sheet = f_input.sheet_by_name('Time') +# input_row = time_sheet.row_values(4) + +xlabel = ['1k','2k','3k','4k','5k','6k','7k','8k','9k','10k'] + +SPHF_matrix = np.zeros((2, 10), dtype=np.float32) +BDZ_matrix = np.zeros((2, 10), dtype=np.float32) +CHD_matrix = np.zeros((2, 10), dtype=np.float32) +BBHash_matrix = np.zeros((2, 10), dtype=np.float32) + +SPHF_matrix[0][:] = time_sheet.row_values(5)[2:12] +BDZ_matrix[0][:] = time_sheet.row_values(11)[2:12] +CHD_matrix[0][:] = time_sheet.row_values(17)[2:12] +BBHash_matrix[0][:] = time_sheet.row_values(23)[2:12] + +plt.plot(xlabel,BDZ_matrix[0][:],'go-',ms=8,label='BDZ_PH') +plt.plot(xlabel,CHD_matrix[0][:],'yo-',ms=8,label='CHD_PH') +plt.plot(xlabel,BBHash_matrix[0][:],'ro-',ms=8,label='BBHash') +plt.plot(xlabel,SPHF_matrix[0][:],'ko-',ms=8,label='SPHF') + +plt.xlabel('Number of Input IP Addresses',fontsize=18) +plt.ylabel('Max Construction Time (ms)',fontsize=18) +plt.tick_params(labelsize=15) +plt.legend(fontsize=15) + +plt.show() \ No newline at end of file diff --git a/PHF_benchmark/plot-python/plot_merge.py b/PHF_benchmark/plot-python/plot_merge.py new file mode 100755 index 0000000..9a27b0d --- /dev/null +++ b/PHF_benchmark/plot-python/plot_merge.py @@ -0,0 +1,107 @@ +import matplotlib.pyplot as plt +import numpy as np +# import xlrd +import xlrd2 +import math +import sys +import csv + + + + +xlabel = ['1k','2k','3k','4k','5k','6k','7k','8k','9k','10k'] + + +def lc1(): + a1 = plt.subplot(131) + time_sheet = f_input.sheet_by_name('Time') + plt.title('Average Construction Time',fontsize=18) + + SPHF_matrix = np.zeros((2, 10), dtype=np.float32) + BDZ_matrix = np.zeros((2, 10), dtype=np.float32) + CHD_matrix = np.zeros((2, 10), dtype=np.float32) + BBHash_matrix = np.zeros((2, 10), dtype=np.float32) + + SPHF_matrix[0][:] = time_sheet.row_values(3)[2:12] + BDZ_matrix[0][:] = time_sheet.row_values(9)[2:12] + CHD_matrix[0][:] = time_sheet.row_values(15)[2:12] + BBHash_matrix[0][:] = time_sheet.row_values(21)[2:12] + + a1.plot(xlabel,BDZ_matrix[0][:],'go-',ms=8,label='BDZ_PH') + a1.plot(xlabel,CHD_matrix[0][:],'yo-',ms=8,label='CHD_PH') + a1.plot(xlabel,BBHash_matrix[0][:],'ro-',ms=8,label='BBHash') + a1.plot(xlabel,SPHF_matrix[0][:],'ko-',ms=8,label='SPHF') + a1.set_xlabel('Num of Keys',fontsize=18) + a1.set_ylabel('ms',fontsize=18) + + a1.tick_params(labelsize=15) + a1.legend(fontsize=15) + + +def lc2(): + a1 = plt.subplot(132) + time_sheet = f_input.sheet_by_name('Time') + plt.title('Max Construction Time',fontsize=18) + + SPHF_matrix = np.zeros((2, 10), dtype=np.float32) + BDZ_matrix = np.zeros((2, 10), dtype=np.float32) + CHD_matrix = np.zeros((2, 10), dtype=np.float32) + BBHash_matrix = np.zeros((2, 10), dtype=np.float32) + + SPHF_matrix[0][:] = time_sheet.row_values(5)[2:12] + BDZ_matrix[0][:] = time_sheet.row_values(11)[2:12] + CHD_matrix[0][:] = time_sheet.row_values(17)[2:12] + BBHash_matrix[0][:] = time_sheet.row_values(23)[2:12] + + a1.plot(xlabel,BDZ_matrix[0][:],'go-',ms=8,label='BDZ_PH') + a1.plot(xlabel,CHD_matrix[0][:],'yo-',ms=8,label='CHD_PH') + a1.plot(xlabel,BBHash_matrix[0][:],'ro-',ms=8,label='BBHash') + a1.plot(xlabel,SPHF_matrix[0][:],'ko-',ms=8,label='SPHF') + a1.set_xlabel('Num of Keys',fontsize=18) + a1.set_ylabel('ms',fontsize=18) + + a1.tick_params(labelsize=15) + a1.legend(fontsize=15) + +def lc3(): + a1 = plt.subplot(133) + time_sheet = f_input.sheet_by_name('Space') + plt.title('Storage Estimation',fontsize=18) + + SPHF_matrix = np.zeros((2, 10), dtype=np.float32) + BDZ_matrix = np.zeros((2, 10), dtype=np.float32) + CHD_matrix = np.zeros((2, 10), dtype=np.float32) + BBHash_matrix = np.zeros((2, 10), dtype=np.float32) + + SPHF_matrix[0][:] = time_sheet.row_values(6)[2:12] + BDZ_matrix[0][:] = time_sheet.row_values(10)[2:12] + CHD_matrix[0][:] = time_sheet.row_values(14)[2:12] + BBHash_matrix[0][:] = time_sheet.row_values(18)[2:12] + + a1.plot(xlabel,BDZ_matrix[0][:],'go-',ms=8,label='BDZ_PH') + a1.plot(xlabel,CHD_matrix[0][:],'yo-',ms=8,label='CHD_PH') + a1.plot(xlabel,BBHash_matrix[0][:],'ro-',ms=8,label='BBHash') + a1.plot(xlabel,SPHF_matrix[0][:],'ko-',ms=8,label='SPHF') + a1.set_xlabel('Num of Keys',fontsize=18) + a1.set_ylabel('Kb',fontsize=18) + + a1.tick_params(labelsize=15) + a1.legend(fontsize=15) + +if __name__ == '__main__': + f_input = xlrd2.open_workbook(r"./comparison.xlsx") + # input_row = time_sheet.row_values(4) + + plt.figure(figsize=(24, 4)) + plt.subplots_adjust(wspace=0.3, hspace=0.2) + plt.rcParams['font.family'] = 'Times New Roman' + plt.rcParams['axes.unicode_minus'] = False + lc1() + lc2() + lc3() + plt.subplots_adjust(left=0.05, right=0.97, top=0.9, bottom=0.15) + plt.savefig('constructionPHF.png') + plt.show() + + f_input.close() + diff --git a/PHF_benchmark/plot-python/plot_space.py b/PHF_benchmark/plot-python/plot_space.py new file mode 100755 index 0000000..beb9022 --- /dev/null +++ b/PHF_benchmark/plot-python/plot_space.py @@ -0,0 +1,32 @@ +import matplotlib.pyplot as plt +import numpy as np +import xlrd +import math +import sys +import csv + +f_input = xlrd.open_workbook(r"./comparison.xlsx") +time_sheet = f_input.sheet_by_name('Space') + +xlabel = ['1k','2k','3k','4k','5k','6k','7k','8k','9k','10k'] + +SPHF_matrix = np.zeros((2, 10), dtype=np.float32) +BDZ_matrix = np.zeros((2, 10), dtype=np.float32) +CHD_matrix = np.zeros((2, 10), dtype=np.float32) +BBHash_matrix = np.zeros((2, 10), dtype=np.float32) + +SPHF_matrix[0][:] = time_sheet.row_values(6)[2:12] +BDZ_matrix[0][:] = time_sheet.row_values(10)[2:12] +CHD_matrix[0][:] = time_sheet.row_values(14)[2:12] +BBHash_matrix[0][:] = time_sheet.row_values(18)[2:12] + +plt.plot(xlabel,BDZ_matrix[0][:],'go-',ms=8,label='BDZ_PH') +plt.plot(xlabel,CHD_matrix[0][:],'yo-',ms=8,label='CHD_PH') +plt.plot(xlabel,BBHash_matrix[0][:],'ro-',ms=8,label='BBHash') +plt.plot(xlabel,SPHF_matrix[0][:],'ko-',ms=8,label='SPHF') + +plt.xlabel('Number of Input IP Addresses',fontsize=18) +plt.ylabel('Storage Estimation (Kb)',fontsize=18) +plt.tick_params(labelsize=15) +plt.legend(fontsize=15) +plt.show() \ No newline at end of file diff --git a/README.md b/README.md new file mode 100755 index 0000000..6a7a8ee --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# Routing Lookup project + +This project deals with Routing Table LookuP using Perfect Hash oriented solutions. + +Three folders are used to provide source code and experiment results. Each folder can be used as an independant project. + +1. PHF_benchmark + +Benchmark code for existing PHF algorithms: BDZ_PH, CHD_PH, BBHash, SPHF, SPHF-RL(algorithm for routing lookup task). + +2. RHF + +Routing Hash Function(RHF) source code: RHF1, RHF2 and RHF1-a. + +3. RHF_64 + +Routing Hash Function(RHF) source code: RHF1_64. + +4. RHF_10000 + +Routing Hash Function(RHF) source code: RHF1_64. + +--------------------------------- +The source code for hardware modules below is not available at this time. + +5. HLS +Vivado HLS on Xilinx FPGA. + +6. Vivado +RTL implementations on Xilinx FPGA. + +# Citation +The current work is for IEEE TRANSACTIONS ON AEROSPACE AND ELECTRONIC SYSTEMS. +Any questions, please contact keran_zhang@outlook.com +# Routing_lookup diff --git a/RHF/Input_data/generate_test_data.py b/RHF/Input_data/generate_test_data.py new file mode 100755 index 0000000..1905b9c --- /dev/null +++ b/RHF/Input_data/generate_test_data.py @@ -0,0 +1,71 @@ +import sys +import math +import os +import random +import numpy as np + +# You need to generate different input IP files +# In this file, the input is set to IPV6 address as a string +# eg: "x.x.x.x.x.x.x.x", each "x" is a number from str(0) to str(15) +# "." does not appear in the string +# Total number of possible IP addesses is: d1 = 16*16*16*16*16*16*16*16 +# The function rand_ip(8) casts this IPv6 string with 8 chars into an integer +# maximum possible integer of rand_ip(8) would be: (2^32 - 1) +max_ip_num = 16 +# Set n value first +n = 10000 # each set has n input keys +z = 8 ## the name of the file would be 0000_1_54_4.txt + +# set the total number of key set +max_key_set = 1000 +# set the total number of test files +max_itr = 1 + +# generate a random IP address with length = l +# the random number for each 4bits follows uniform distribution +# In hardware, the input IPs do not need to be cast between data types, +# since they are always binary data +def rand_ip(l): + tmp_ip = int(random.uniform(0,max_ip_num)) + for s in range(l-1): + tmp_ip = tmp_ip*16 + int(random.uniform(0,max_ip_num)) + return tmp_ip +# # numpy random +# def np_rand_ip(l): +# tmp_ip = numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# for s in range(l-1): +# tmp_ip = tmp_ip*16 + numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# return tmp_ip + +if __name__=='__main__': + print('begin') + ################################ + ## curent folder + for folder_name in range(max_key_set): + cur_dir = "./Data_%d/%d"%(n,folder_name) + if not os.path.exists(cur_dir): + os.makedirs(cur_dir) + ip_list = [] + i = 0 + while(i < n): + ##for i in range(n): + ## generate 1 random IP + # 4 xxx IP strings + tmp_ip = str(rand_ip(z)) + if (tmp_ip not in ip_list): + # tmp_ip = np_rand_ip(4) # numpy version + ip_list.append(tmp_ip) + i += 1 + print('size of ip set is: ', len(ip_list)) + print('writing to txt file for folder %d...'%(folder_name)) + # divide the ip list into z group + # shuffle -> divide -> output + for itr in range(max_itr): + random.shuffle(ip_list) + fin = open("%s/key_0000_1_%d_%d__%s.txt"%(cur_dir,n,z,str(itr).zfill(6)),'w') + s = '\n' + fin.write(s.join(ip_list)) + fin.close() + print('finish all folders.') + + diff --git a/RHF/README.md b/RHF/README.md new file mode 100755 index 0000000..4e551ed --- /dev/null +++ b/RHF/README.md @@ -0,0 +1,63 @@ +# RHF +Routing Hash Function(RHF) is used to hash from input IPs to output interface numbers. + +Two RHFdesigns (RHF1, RHF2) are implemented with respect to hardware constraints and different balance points in construction time, lookup latency and resource cost. +Targeting 10000 32-bit input IPs, two RHF design is proposed. + +# Implementation +## Compile program +``` +cd router_mega +cmake .. +make +``` + +## Used for single input file, commands in the router_mega folder +Specify the number of router(n = 1/2/3) first. 1 is for RHF1, 2 is for RHF2, 3 is for RHF1-a in the original paper. + +To report construction time:s + +`./Generate n FOLDERPATH` + +For example, FOLDER_PATH="../Input_data/Data_10000" when num of key is 10000. +To generate function: Specify an input file (input.txt) first, function.txt will be generated with parameters of RHF. + +`./Generate n input.txt function.txt` + +Test generated function: + +`./Generate n input.txt function.txt -t` + +The program use input.txt as test case, and check whether the generated RHF can map correctly. + +## Used for folder with multiple input files, commands in the RHF folder +Generate all function files in routerFuncData/ folder. By default, n is set to 1.(change line 26 to modify router number) + +`sh generate.sh` + +Test all function files for files in Input_data/, n is set to 1. + +`sh test.sh` + +# RL Results for RHF1 and RHF2 (10000 32 bit input IPs) +RHF algorithms are calculated as follow: + +1, For construction time, 1000 experiments are conducted. The max time and average time are calculated. + +2, For storage cost, the source code of algorithms is analyzed and storage is estimated considering data structures used in construction steps. + +3, For function size, The storage is estimated with consideration of D[] and I[]. + +Method |AVG time(ms) |MAX time(ms) |Storage(Kb) |Function Size(Kb) +-------------|------------------|:-------------:|:-------------:|:---------: +BDZ-PH-RL |3.73+e |6.85+e |3457 |39.6 +CHD-PH-RL |2.69+e |4.79+e |957 |30 +BBHash-RL |7.64+e |28.62+e |352 |39.2 +SPHF-RL |3.05+e |5.96+e |538 |50 +RHF1 |3.34 |6.31 |469 |43 +RHF1-a |1.83 |2.95 |605 |80 +RHF2 |64.49 |79.19 |541 |31 + +# Citation +The current work is for IEEE TRANSACTIONS ON AEROSPACE AND ELECTRONIC SYSTEMS. +Any questions, please contact keran_zhang@outlook.com diff --git a/RHF/generate.sh b/RHF/generate.sh new file mode 100755 index 0000000..534b53d --- /dev/null +++ b/RHF/generate.sh @@ -0,0 +1,29 @@ +#!/bin/sh +#获取文件夹下所有文件 +# +folder="./Input_data/Data_10000/" +funcFolder="./routerFuncData/Function_10000/" + +if [ ! -d "$funcFolder" ];then +mkdir ${funcFolder} +echo "build ${funcFolder} successfull." +else +echo "${funcFolder} already exists, overwrite all files in it..." +fi +echo "" +softFolder=$(ls $folder) +for subFolder in ${softFolder} +do + # build the same dirs for funcFolder + # echo "subFolder: ${folder}${subFolder}" + if [ ! -d "${funcFolder}${subFolder}" ];then + mkdir ${funcFolder}${subFolder} + fi + sFile=$(ls ${folder}${subFolder}) + for inFIle in ${sFile} + do + # echo "inFIle: ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle}" + ./router_mega/Generate 1 ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle} + done +done + diff --git a/RHF/routerFuncData/README.md b/RHF/routerFuncData/README.md new file mode 100755 index 0000000..6e40b25 --- /dev/null +++ b/RHF/routerFuncData/README.md @@ -0,0 +1 @@ +This folder contains generated RHF function parameters. diff --git a/RHF/router_mega/Allocator.h b/RHF/router_mega/Allocator.h new file mode 100755 index 0000000..26a51e7 --- /dev/null +++ b/RHF/router_mega/Allocator.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- +#ifndef AllocatorH +#define AllocatorH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +enum TAllocConsts +{ +#ifdef __BORLANDC__ + acDefAlign = sizeof(int), +#else + acDefAlign = 32, +#endif +}; +//--------------------------------------------------------------------------- +class TAllocator +{ +public: + char *Malloc(size_t size,int align=acDefAlign); + char *Realloc(void *mem,size_t size,int align=acDefAlign,size_t oldSize=0); + void Free(void *mem); +}; +//--------------------------------------------------------------------------- +extern TAllocator defAllocator; +//--------------------------------------------------------------------------- +//#if !defined(WIN32) && !defined(_WIN32) +//#include +//#else +void *vmalloc(size_t sz); +void vfree(void *mem); +//#endif//WIN32 +//--------------------------------------------------------------------------- +void *vmallocReserve(size_t sz); +bool vmallocCommit(void* ptr,size_t sz); +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/AllocatorBase.cpp b/RHF/router_mega/AllocatorBase.cpp new file mode 100755 index 0000000..12bf882 --- /dev/null +++ b/RHF/router_mega/AllocatorBase.cpp @@ -0,0 +1,5 @@ +//---- -------------------------------------------------------------------------------------------------------- +#include "Allocator.h" +//---- -------------------------------------------------------------------------------------------------------- +TAllocator defAllocator; +//---- -------------------------------------------------------------------------------------------------------- diff --git a/RHF/router_mega/AllocatorC.cpp b/RHF/router_mega/AllocatorC.cpp new file mode 100755 index 0000000..a9743ef --- /dev/null +++ b/RHF/router_mega/AllocatorC.cpp @@ -0,0 +1,44 @@ +//--------------------------------------------------------------------------- +#include "Allocator.h" +#include +#include +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +// If there is no suitable allocator, use the default C allocator. +//--------------------------------------------------------------------------- +char *TAllocator::Malloc(size_t size,int align) +{ + logEmbdMsg("Prepare alloc %d-byte memory of align %d.\r\n",(int)size,align); +// #ifndef __LSeRTOS__ +// assert(align<=(int)sizeof(int)); +// #endif // __LSeRTOS__ + return (char*)malloc(size); +} +//--------------------------------------------------------------------------- +char *TAllocator::Realloc(void *mem,size_t size,int align,size_t oldSize) +{ + logEmbdMsg("Realloc %d-byte memory of align %d.\r\n",(int)size,align); +#ifndef __LSeRTOS__ + if(align>(int)sizeof(void *)) + { + char *p = Malloc(size,align); + if(p==NULL) + return NULL; + //This is WRONG. We should query the actual size of mem. But we havn't that interface yet. + if(oldSize==0) + oldSize = size; + memcpy(p,mem,oldSize); + Free(mem); + return p; + } +#endif // __LSeRTOS__ + + return (char*)realloc(mem,size); +} +//--------------------------------------------------------------------------- +void TAllocator::Free(void *mem) +{ + free(mem); +} +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Array.h b/RHF/router_mega/Array.h new file mode 100755 index 0000000..71a670e --- /dev/null +++ b/RHF/router_mega/Array.h @@ -0,0 +1,320 @@ +#pragma once +#ifndef ArrayH +#define ArrayH +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +// #include "Mem/FastMem.h" +#include +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +#define __is_trivial(x) false +#endif// __BORLANDC__ +//#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#define DefCommArrMath(func,retType) \ + retType func(int64_t num=0) const \ + { \ + if(num<=0) \ + num = Number; \ + \ + return Arr##func(&ObjConst(0),num); \ + } +//--------------------------------------------------------------------------- +// Causion: only one-time allocated array's alignment is preserved! +// Any increasement with New() will break the alignment set by Alloc. +//--------------------------------------------------------------------------- +template +class TArraySafe:public TArrayPubBase +{ +protected: + virtual void CallConstructor(void *obj) const + { + new (obj) T; + } + + virtual void CallDestructor(void *obj) const + { + ((T *)obj)->~T(); + } + + virtual bool IsTrivialElem() const + { + return __is_trivial(T); + } + + virtual int GetTypeSize() const + { + return sizeof(T); + } + +public: + TArraySafe() + { + } + + TArraySafe(int64_t num) + { + Alloc(num); + // Number = num; // allocate number value + } + + virtual ~TArraySafe() + { + Close(); + } + + void Transfer(TArraySafe &o) + { + Close(); + img = o.img; + len = o.len; + Number = o.Number; + + o.ClearDataNoFree(); + } + + T &New(int64_t expandUnit=64) + { + return *(T*)TArrayPubBase::New(expandUnit); + } + + T &Obj(int64_t i) + { + assert(img); + assert(i>=0); + // assert(i=0); + // assert(i &operator=(TArraySafe &o) + { + Alloc(o.Number); + + for(int64_t i=0;i=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=pos;i--) + Obj(i+newNum) = Obj(i); + } + + return &Obj(pos); + } + + T *SlowDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(delNum>=1); + + int tail = Number-delNum; + + if(keepOrder==false) + { + for(int64_t i=0;i +class TArray:public TArraySafe +{ +public: + TArray() + { + } + + TArray(int64_t num) + :TArraySafe(num) + { + } + + void InitZero() + { + memset(this->img,0,sizeof(T)*this->len); + } + + void FastInit(T val) + { + MemSetType(this->img,val,sizeof(T)*this->len); + } + + void FastCopy(TArray &o,int64_t l=-1) + { + if( (l<0) || (l>o.Number) ) + l = o.Number; + + FastCopy(o(),l); + } + + void FastCopy(T *o,int64_t l) + { + this->Alloc(l); + memcpy(this->img,o,sizeof(T)*l); + TArraySafe::Number = l; + } + + T *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastInsert(pos,newNum,keepOrder); + } + + T *FastDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastDel(pos,delNum,keepOrder); + } + + void FastBInsert(T &obj,TSortCmp cmp,bool canRepeat=false) + { + TArrayPubBase::FastBInsert(&obj,cmp,canRepeat); + } +}; +//--------------------------------------------------------------------------- +typedef TArray TGrayArray; +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH + diff --git a/RHF/router_mega/ArrayPre.cpp b/RHF/router_mega/ArrayPre.cpp new file mode 100755 index 0000000..197aff3 --- /dev/null +++ b/RHF/router_mega/ArrayPre.cpp @@ -0,0 +1,173 @@ +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +TArrayPubBase::~TArrayPubBase() +{ +} +//--------------------------------------------------------------------------- +void TArrayPubBase::Alloc(int64_t maxNum,int align, bool noConstructor) +{ + + logEmbdMsg("Prepare to alloc mem for array num=%d align=%d.\r\n",(int)maxNum,align); + Close(); + + logEmbdMsg("Array close ok.\r\n"); + + int typeSize = GetTypeSize(); + + logEmbdMsg("Get type size=%d ok.\r\n",typeSize); + + int64_t memSize = maxNum*typeSize; +#ifndef XrossCPP_In_64 + assert((memSize>>31)==0);//on 32-bit platforms, no memory alloc can larger than 2GB-1 +#endif // XrossCPP_In_64 + + logEmbdMsg("Ready to alloc %d-byte mem, defAllocator=%p.\r\n",(int)memSize,defAllocator); + // fprintf(stderr,"memSize is: %lu\n", memSize); + // fprintf(stderr,"align is: %d\n", align); + + img = defAllocator.Malloc((size_t)memSize,align); + logEmbdMsg("Alloc returned img=%p.\r\n",img); + + assert(img); + + len = maxNum; + + logEmbdMsg("Ready to call constructor.\r\n"); + + if( (noConstructor==false) && !IsTrivialElem() ) + { + logEmbdMsg("Now call constructor.\r\n"); + + for(int64_t i=0;i=0); + + if(newNum==len) + return; + + if(newNum==0) + { + Close(); + return; + } + + int typeSize = GetTypeSize(); + + if(newNumlen) + { + for(int64_t i=len;i=0) + { + if( (ret!=0) || canRepeat ) + memcpy(New(),key,typeSize); + + return; + } + + int64_t low = 0; + int64_t high = Number; + + while(low>1); + + ret = cmp(&key,img+mid*typeSize); + + if(ret==0) + { + if(canRepeat) + memcpy(FastInsert(mid,1,true),key,typeSize); + + return; + } + + if(ret<0) + high = mid; + else + low = mid+1; + } + + if(cmp(&key,img+low*typeSize)>0) + low ++; + + memcpy(FastInsert(low,1,true),key,typeSize); +} +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/ArrayPre.h b/RHF/router_mega/ArrayPre.h new file mode 100755 index 0000000..280f812 --- /dev/null +++ b/RHF/router_mega/ArrayPre.h @@ -0,0 +1,289 @@ +#pragma once +#ifndef ArrayPreH +#define ArrayPreH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "SortBase.h" +#include "Allocator.h" +// #include "Mem/FastMem.h" +#include "Type64.h" +//--------------------------------------------------------------------------- +#ifndef NULL +#define NULL 0 +#endif //NULL +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TArrayPubBase +{ +protected: + char *img; + +public: + int64_t len; + int64_t Number; + +protected: + virtual void CallConstructor(void *obj) const = 0; + virtual void CallDestructor(void *obj) const = 0; + virtual bool IsTrivialElem() const = 0; + virtual int GetTypeSize() const = 0; + + void *New(int64_t expandUnit=64) + { + if(Number==len) + ChCapacity(len+expandUnit); + + void *p = img+(size_t)Number*GetTypeSize(); + + Number ++; + + return p; + } + + void *Search(const void *key,TSortCmp cmp,int64_t n=-1) const; + + void *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=0); + assert(pos<=Number); + assert(delNum>=1); + + int typeSize = GetTypeSize(); + int64_t tail = Number-delNum; + char *mPos = img+(size_t)pos*typeSize; + + if(keepOrder==false) + memcpy(mPos,img+(size_t)tail*typeSize,(size_t)delNum*typeSize); + else + memcpy(mPos,mPos+(size_t)delNum*typeSize,(size_t)(tail-pos)*typeSize); + + Number = tail; + + return mPos; + } + + void FastBInsert(void *key,TSortCmp cmp,bool canRepeat=true); + +public: + TArrayPubBase() + { + img = NULL; + len = 0; + Number = 0; + } + + virtual ~TArrayPubBase(); + + void Close(bool noConstructor=false); + + void ClearDataNoFree() + { + img = NULL; + len = 0; + Number = 0; + } + + void Alloc(int64_t maxNum,int align=32, bool noConstructor=false); + void AllocFill(int64_t maxNum,int align=32, bool noConstructor=false) + { + Alloc(maxNum,align,noConstructor); + Number = len; + } + void ChCapacity(int64_t newNum,int align=32); + + int64_t Size() const + { + return Number*GetTypeSize(); + } + + int64_t StorageSize() const + { + return len*GetTypeSize(); + } + + int64_t SpaceSize() const + { + return (len-Number)*GetTypeSize(); + } + + void *ObjAt(int64_t inx) const + { + assert(inx>=0); + assert(inx o.Move(TArray src) + void Move(TArrayPubBase &src) + { + Close(); + + img = src.img; + len = src.len; + Number = src.Number; + + src.img = NULL; + src.len = 0; + src.Number = 0; + } + + void Grow(int64_t nGrow) + { + if((Number+nGrow)>len) + ChCapacity(Number+nGrow); + + Number += nGrow; + } +}; +//--------------------------------------------------------------------------- +template +int64_t ArrLargest(T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i*tmp) + { + tmp = array+i; + index = i; + } + } + + return index; +} +//--------------------------------------------------------------------------- +template +int64_t ArrSmallest(const T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i +void ArrMinMax(const T *array,int64_t num,int64_t &minIndex,int64_t &maxIndex) +{ + T *tMin = array; + T *tMax = array; + + int64_t iMin=0, iMax=0; + + for(int64_t i=1;i*tMax) + { + *tMax = array+i; + iMax = i; + } + } + + minIndex = iMin; + maxIndex = iMax; +} +//--------------------------------------------------------------------------- +template +void ArrTotal(const T *array,int64_t num,T &ret) +{ + ret = array[0]; + + for(int64_t i=1;i +inline void ArrMean(const T *array,int64_t num,T &ret) +{ + T tmp; + + ArrTotal(array,num,tmp); + + ret = tmp/num; +} +//--------------------------------------------------------------------------- +//base e entropy +//--------------------------------------------------------------------------- +template +double ArrEntropyE(const T *array,int64_t num) +{ + T sum; + + ArrTotal(array,num,sum); + + double e = 0; + double m = 1.0/sum; + + for(int64_t i=0;i1e-30) + e -= t*log(t); + } + + return e; +} +//--------------------------------------------------------------------------- +template +inline double ArrEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)*1.4426950408889634073599246810019; //log2(e) +} +//--------------------------------------------------------------------------- +template +inline double ArrNormEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)/log(num); +} +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH diff --git a/RHF/router_mega/Builder/PerfectRouterBuilder1.cpp b/RHF/router_mega/Builder/PerfectRouterBuilder1.cpp new file mode 100755 index 0000000..263f34c --- /dev/null +++ b/RHF/router_mega/Builder/PerfectRouterBuilder1.cpp @@ -0,0 +1,165 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include "PerfectRouterBuilder1.h" +#include "../IntUtils.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint32_t startPos; + int32_t nItem; + int index; +}; +//--------------------------------------------------------------------------- +int CmpSlot1(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectRouterBuilder1::Build(int *pn, uint32_t *hash,int nHash,int nBucket,int nSlot) +{ + if(nSlot==0) + return false; + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + throw "exception, nBucket is zero!"; + return false; + } + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + // bit-shift represents the mod operation + int bucketWidth = (int) (log(nBucket)/log(2)); + int shiftBucket = 32 - bucketWidth; + + int nSlotWidth = (int)(log(nSlot)/log(2)); + int shiftSlot = 32 - nSlotWidth; + + // update information for each slot + for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + slots[idx].nItem ++; + slots[idx].index = idx; + } + + // begin key - item mapping + slots[0].startPos = slots[0].nItem-1; + + for(int i=1;i sortedHash; + sortedHash.AllocFill(nHash); + TArray sortedPn; + sortedPn.AllocFill(nHash); + + for(int i=0;i> shiftSlot; // uint32_t idx = hash[i]%nSlot; + + sortedHash[slots[idx].startPos] = hash[i]; + sortedPn[slots[idx].startPos] = pn[i]; + slots[idx].startPos --; + } + // finish key - item mapping + + // sort slot using number of items, in descending order + slots.QSort(CmpSlot1); + + // initialize dArray, bucketArray and bucketItemStack + dArray.AllocFill(nSlot * 4); // 16bit x nSlot + dArray.InitZero(); + + bucketArray.AllocFill(nBucket * 4); // 32bit x number of buckets + bucketArray.InitZero(); + + bucketItemStack.AllocFill(slots[0].nItem * 4); // 32bit x item number of slots[0] + bucketItemStack.InitZero(); + + /* begin building */ + for(int i=0;i> 10; + // x_key = x_key ^ (x_key >> 1); + int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + int pnGT = sortedPn[startPos+j]; + + if (bucketArray[f] > 0) + { + if (bucketArray[f] == pnGT) + { + bucketItemStack[j] = nBucket; // mark as bad value + continue; + } else + { + int j1 = j; + while(j1>0) + { + j1--; + if (bucketItemStack[j1] < nBucket) + { + bucketArray[bucketItemStack[j1]] = 0; // not bad value, delete + } + } + fail = 1; + break; + } + } else + { + bucketArray[f] = pnGT; + bucketItemStack[j] = f; + } + } + if(fail==0) // current d is successfully found + { + dArray[index] = d; // int idx_d = sortedHash[]%nSlot; + break; + } + } + if(fail==1) // we can't find suitable d in [0,maxD-1], building failure + { + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return false; + } + } + /* end building */ + + // if success, update the r and m for nSlot and nBucket + // bucketArray, dArray already updated + r = nSlot; + m = nBucket; + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Builder/PerfectRouterBuilder1.h b/RHF/router_mega/Builder/PerfectRouterBuilder1.h new file mode 100755 index 0000000..201b8a0 --- /dev/null +++ b/RHF/router_mega/Builder/PerfectRouterBuilder1.h @@ -0,0 +1,112 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterBuilder1H +#define PerfectRouterBuilder1H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//------------------------ not used for now ------------------------------ +// class TBitArray +// { +// public: +// uint32_t *arr; +// int64_t nBit; + +// TBitArray() +// { +// arr = NULL; +// nBit = 0; +// } + +// ~TBitArray() +// { +// Close(); +// } + +// void Close() +// { +// if(arr) +// { +// delete arr; +// nBit = 0; +// } +// } + +// void Alloc(int64_t _nBit) +// { +// Close(); + +// nBit = (_nBit+63)&~63ull; +// arr = new uint32_t[nBit>>6]; // change uint64_t to uint32_t +// ClearAll(); +// } + +// bool operator[](int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6]&(1ull<<(inx&63)))!=0; +// } + +// void SetBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] |= mask; +// } + +// void ClearBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] &= ~mask; +// } + +// void ClearAll() +// { +// assert(arr); +// memset(arr,0,(nBit>>3)); +// } +// };//--------------------------------------------------------------------------- +class TPerfectRouterBuilder1 +{ +public: + uint32_t r; + uint32_t m; + TArray dArray; + TArray bucketArray; + // TArray bucketStack; + TArray bucketItemStack; + + ~TPerfectRouterBuilder1() + { + Close(); + } + + void Close() + { + dArray.Close(); + bucketArray.Close(); + // bucketStack.Close(); + bucketItemStack.Close(); + r = (uint32_t) 0; + m = (uint32_t) 0; + } + + bool Build(int *pn,uint32_t *hash,int nHash,int nBucket=0,int nSlot=400); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectRouterBuilder1 &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Builder/PerfectRouterBuilder2.cpp b/RHF/router_mega/Builder/PerfectRouterBuilder2.cpp new file mode 100755 index 0000000..ada3c0a --- /dev/null +++ b/RHF/router_mega/Builder/PerfectRouterBuilder2.cpp @@ -0,0 +1,183 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include "PerfectRouterBuilder2.h" +#include "../IntUtils.h" +#include "../City64.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint32_t startPos; + int32_t nItem; + int index; +}; +//--------------------------------------------------------------------------- +int CmpSlot2(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectRouterBuilder2::Build(int *pn, uint32_t *hash,int nHash,int nBucket,int nSlot) +// bool TPerfectRouterBuilder2::Build(int *pn, uint32_t *hash,int nHash,int nBucket,int nSlot, int sl0, int sl1, int s0, int s1) +{ + if(nSlot==0) + return false; + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + throw "exception, nBucket is zero!"; + return false; + } + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + // bit-shift represents the mod operation + int bucketWidth = (int) (log(nBucket)/log(2)); + int shiftBucket = 32 - bucketWidth; + + int nSlotWidth = (int)(log(nSlot)/log(2)); + int shiftSlot = 32 - nSlotWidth; + + // update information for each slot + for(int i=0;i> sl0) ^ (hash[i] << sl1) ^ hash[i]) << shiftSlot >> shiftSlot); + int idx = (hash[i] << shiftSlot) >> shiftSlot; // int idx = hash[i]%nSlot; + slots[idx].nItem ++; + slots[idx].index = idx; + } + + // begin key - item mapping + slots[0].startPos = slots[0].nItem-1; + + for(int i=1;i sortedHash; + sortedHash.AllocFill(nHash); + TArray sortedPn; + sortedPn.AllocFill(nHash); + + for(int i=0;i> sl0) ^ (hash[i] << sl1) ^ hash[i]) << shiftSlot >> shiftSlot); + int idx = (hash[i] << shiftSlot) >> shiftSlot; // uint32_t idx = hash[i]%nSlot; + + sortedHash[slots[idx].startPos] = hash[i]; + sortedPn[slots[idx].startPos] = pn[i]; + slots[idx].startPos --; + } + // finish key - item mapping + + // sort slot using number of items, in descending order + slots.QSort(CmpSlot2); + + // initialize dArray, bucketArray and bucketItemStack + dArray.AllocFill(nSlot * 4); // 16bit x nSlot + dArray.InitZero(); + + bucketArray.AllocFill(nBucket * 4); // 32bit x number of buckets + bucketArray.InitZero(); + + bucketItemStack.AllocFill(slots[0].nItem * 4); // 32bit x item number of slots[0] + bucketItemStack.InitZero(); + + /* begin building */ + for(int i=0;i> 10; + // int f = ( ((x_key + (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + // int f = FastIntHash(x_key, (uint32_t)d) << shiftBucket >> shiftBucket; + + uint32_t k2 = (uint32_t) 0x40000007; + uint32_t kMul = (uint32_t) 0x40000003; + uint32_t a = ((x_key - k2) ^ (uint32_t)d) * kMul; + a ^= (a >> 13); + uint32_t b = ((uint32_t)d ^ a) * kMul; + b ^= (b >> 13); + b *= kMul; + int f = b << shiftBucket >> shiftBucket; + + int pnGT = sortedPn[startPos+j]; + + if (bucketArray[f] > 0) + { + if (bucketArray[f] == pnGT) + { + bucketItemStack[j] = nBucket; // mark as bad value + continue; + } else + { + int j1 = j; + while(j1>0) + { + j1--; + if (bucketItemStack[j1] < nBucket) + { + bucketArray[bucketItemStack[j1]] = 0; // not bad value, delete + } + } + fail = 1; + break; + } + } else + { + // if (sortedHash[startPos+j] == (uint32_t)179551886) + // { + // // int idx_d = sortedHash[startPos+j]%nSlot; + // int idx_d = ((sortedHash[startPos+j] << shiftSlot) >> shiftSlot); + // } + bucketArray[f] = pnGT; + bucketItemStack[j] = f; + } + } + if(fail==0) // current d is successfully found + { + dArray[index] = d; // int idx_d = sortedHash[]%nSlot; + break; + } + } + if(fail==1) // we can't find suitable d in [0,maxD-1], building failure + { + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return false; + } + } + /* end building */ + + // if success, update the r and m for nSlot and nBucket + // bucketArray, dArray already updated + r = nSlot; + m = nBucket; + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Builder/PerfectRouterBuilder2.h b/RHF/router_mega/Builder/PerfectRouterBuilder2.h new file mode 100755 index 0000000..dfe2de3 --- /dev/null +++ b/RHF/router_mega/Builder/PerfectRouterBuilder2.h @@ -0,0 +1,112 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterBuilder2H +#define PerfectRouterBuilder2H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//------------------------ not used for now ------------------------------ +// class TBitArray +// { +// public: +// uint32_t *arr; +// int64_t nBit; + +// TBitArray() +// { +// arr = NULL; +// nBit = 0; +// } + +// ~TBitArray() +// { +// Close(); +// } + +// void Close() +// { +// if(arr) +// { +// delete arr; +// nBit = 0; +// } +// } + +// void Alloc(int64_t _nBit) +// { +// Close(); + +// nBit = (_nBit+63)&~63ull; +// arr = new uint32_t[nBit>>6]; // change uint64_t to uint32_t +// ClearAll(); +// } + +// bool operator[](int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6]&(1ull<<(inx&63)))!=0; +// } + +// void SetBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] |= mask; +// } + +// void ClearBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] &= ~mask; +// } + +// void ClearAll() +// { +// assert(arr); +// memset(arr,0,(nBit>>3)); +// } +// };//--------------------------------------------------------------------------- +class TPerfectRouterBuilder2 +{ +public: + uint32_t r; + uint32_t m; + TArray dArray; + TArray bucketArray; + // TArray bucketStack; + TArray bucketItemStack; + + ~TPerfectRouterBuilder2() + { + Close(); + } + + void Close() + { + dArray.Close(); + bucketArray.Close(); + // bucketStack.Close(); + bucketItemStack.Close(); + r = (uint32_t) 0; + m = (uint32_t) 0; + } + + bool Build(int *pn,uint32_t *hash,int nHash,int nBucket=0,int nSlot=400); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectRouterBuilder2 &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Builder/PerfectRouterBuilder3.cpp b/RHF/router_mega/Builder/PerfectRouterBuilder3.cpp new file mode 100755 index 0000000..e8d6d3b --- /dev/null +++ b/RHF/router_mega/Builder/PerfectRouterBuilder3.cpp @@ -0,0 +1,171 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include "PerfectRouterBuilder3.h" +#include "../IntUtils.h" +//--------------------------------------------------------------------------- +// enum +// { +// // kMul64 = 0x9ddfea08eb382d69ULL, +// kMul32 = 0xeb382d69UL, +// }; + +struct TSlotInfo +{ + uint32_t startPos; + int32_t nItem; + int index; +}; +//--------------------------------------------------------------------------- +int CmpSlot3(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectRouterBuilder3::Build(int *pn, uint32_t *hash,int nHash,int nBucket,int nSlot) +{ + if(nSlot==0) + return false; + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + throw "exception, nBucket is zero!"; + return false; + } + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + // bit-shift represents the mod operation + int bucketWidth = (int) (log(nBucket)/log(2)); + int shiftBucket = 32 - bucketWidth; + + int nSlotWidth = (int)(log(nSlot)/log(2)); + int shiftSlot = 32 - nSlotWidth; + + // update information for each slot + for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + slots[idx].nItem ++; + slots[idx].index = idx; + } + + // begin key - item mapping + slots[0].startPos = slots[0].nItem-1; + + for(int i=1;i sortedHash; + sortedHash.AllocFill(nHash); + TArray sortedPn; + sortedPn.AllocFill(nHash); + + for(int i=0;i> shiftSlot; // uint32_t idx = hash[i]%nSlot; + + sortedHash[slots[idx].startPos] = hash[i]; + sortedPn[slots[idx].startPos] = pn[i]; + slots[idx].startPos --; + } + // finish key - item mapping + + // sort slot using number of items, in descending order + slots.QSort(CmpSlot3); + + // initialize dArray, bucketArray and bucketItemStack + dArray.AllocFill(nSlot * 4); // 16bit x nSlot + dArray.InitZero(); + + bucketArray.AllocFill(nBucket * 4); // 32bit x number of buckets + bucketArray.InitZero(); + + bucketItemStack.AllocFill(slots[0].nItem * 4); // 32bit x item number of slots[0] + bucketItemStack.InitZero(); + + /* begin building */ + for(int i=0;i> 11; + + int f = ( ((x_key * (uint32_t)d) >> 7) << shiftBucket >> shiftBucket); + int pnGT = sortedPn[startPos+j]; + + if (bucketArray[f] > 0) + { + if (bucketArray[f] == pnGT) + { + bucketItemStack[j] = nBucket; // mark as bad value + continue; + } else + { + int j1 = j; + while(j1>0) + { + j1--; + if (bucketItemStack[j1] < nBucket) + { + bucketArray[bucketItemStack[j1]] = 0; // not bad value, delete + } + } + fail = 1; + break; + } + } else + { + bucketArray[f] = pnGT; + bucketItemStack[j] = f; + } + } + if(fail==0) // current d is successfully found + { + dArray[index] = d; // int idx_d = sortedHash[]%nSlot; + break; + } + } + if(fail==1) // we can't find suitable d in [0,maxD-1], building failure + { + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return false; + } + } + /* end building */ + + // if success, update the r and m for nSlot and nBucket + // bucketArray, dArray already updated + r = nSlot; + m = nBucket; + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Builder/PerfectRouterBuilder3.h b/RHF/router_mega/Builder/PerfectRouterBuilder3.h new file mode 100755 index 0000000..fb121f1 --- /dev/null +++ b/RHF/router_mega/Builder/PerfectRouterBuilder3.h @@ -0,0 +1,112 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterBuilder3H +#define PerfectRouterBuilder3H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//------------------------ not used for now ------------------------------ +// class TBitArray +// { +// public: +// uint32_t *arr; +// int64_t nBit; + +// TBitArray() +// { +// arr = NULL; +// nBit = 0; +// } + +// ~TBitArray() +// { +// Close(); +// } + +// void Close() +// { +// if(arr) +// { +// delete arr; +// nBit = 0; +// } +// } + +// void Alloc(int64_t _nBit) +// { +// Close(); + +// nBit = (_nBit+63)&~63ull; +// arr = new uint32_t[nBit>>6]; // change uint64_t to uint32_t +// ClearAll(); +// } + +// bool operator[](int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6]&(1ull<<(inx&63)))!=0; +// } + +// void SetBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] |= mask; +// } + +// void ClearBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] &= ~mask; +// } + +// void ClearAll() +// { +// assert(arr); +// memset(arr,0,(nBit>>3)); +// } +// };//--------------------------------------------------------------------------- +class TPerfectRouterBuilder3 +{ +public: + uint32_t r; + uint32_t m; + TArray dArray; + TArray bucketArray; + // TArray bucketStack; + TArray bucketItemStack; + + ~TPerfectRouterBuilder3() + { + Close(); + } + + void Close() + { + dArray.Close(); + bucketArray.Close(); + // bucketStack.Close(); + bucketItemStack.Close(); + r = (uint32_t) 0; + m = (uint32_t) 0; + } + + bool Build(int *pn,uint32_t *hash,int nHash,int nBucket=0,int nSlot=400); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectRouterBuilder3 &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/CMakeLists.txt b/RHF/router_mega/CMakeLists.txt new file mode 100755 index 0000000..d77ba73 --- /dev/null +++ b/RHF/router_mega/CMakeLists.txt @@ -0,0 +1,16 @@ +# CMake 最低版本号要求 +cmake_minimum_required (VERSION 2.8) + +# 项目信息 +project (Generate) + +set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD_REQUIRED True) + +# 指定生成目标 +add_executable(Generate main.cpp Generator.cpp / +CTimer1.cpp CTimer2.cpp CTimer3.cpp / +Builder/PerfectRouterBuilder1.cpp Builder/PerfectRouterBuilder2.cpp Builder/PerfectRouterBuilder3.cpp / +Tester/PerfectRouterTester1.cpp Tester/PerfectRouterTester2.cpp Tester/PerfectRouterTester3.cpp / +Performance/Performance.cpp IntUtils.cpp ArrayPre.cpp AllocatorBase.cpp AllocatorC.cpp City64.cpp) + diff --git a/RHF/router_mega/CTimer1.cpp b/RHF/router_mega/CTimer1.cpp new file mode 100755 index 0000000..5893b97 --- /dev/null +++ b/RHF/router_mega/CTimer1.cpp @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include +#include "CTimer1.h" + +//------------------------------------------------------------------------------ +using namespace std; + +double CTimer1::getCTime(uint32_t *hash, int *pn,int nHash, uint64_t &maxStorageCost) +{ + /////////////////////////////////// + // we fix the nBucket and nSlot to compare construction time + // start with maximum number of buckets + int bucketStart = 16384; + int bucketEnd = 16384; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 1024; + int nSlotEnd = 1024; + + int minCost = nSlotEnd*11 + bucketStart*2 + 1; + int bestBucketSize = bucketStart-1; + int bestSlotSize = nSlotStart; + + int nBucket; + int nSlot = nSlotStart; + + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + // time calculation + struct timeval gStart, gBegin, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + TPerfectRouterBuilder1 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*11 + nBucket*2; + // avoid some unuseful builds + if (curCost < minCost) + { + gettimeofday(&gBegin,NULL); + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gBegin.tv_sec + (gEnd.tv_usec - gBegin.tv_usec)/1000000.0; + fprintf(stderr,"success!!! \r\n"); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + fprintf(stderr,"bit memory cost = 11 bit x nSlot + 2 bit x nBucket = %d \r\n", minCost); + uint64_t storageCost = (uint64_t) minCost; + if(maxStorageCost < storageCost){ + maxStorageCost = storageCost; + } + return timeuse; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + // nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + myB.Close(); + return timeuse; +} + +double CTimer1::getFileTime(const char * filename, uint64_t & maxStorageCost) +{ + uint32_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint32_t h = atoi(l.c_str()); + key[ind++] = h; // load the string hash value + } + int nHash = ind; + + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + fprintf(stderr,"nHash: %d\r\n", nHash); + fprintf(stderr,"nHash1: %d\r\n", nHash1); + fprintf(stderr,"check file %s.\r\n", filename); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + uint32_t *hash = key; + int *pn = port; + double timeuse; + timeuse = getCTime(hash, pn, nHash, maxStorageCost); + + return timeuse; +} + +//------------------------------------------------------------------------------ diff --git a/RHF/router_mega/CTimer1.h b/RHF/router_mega/CTimer1.h new file mode 100755 index 0000000..2f24be2 --- /dev/null +++ b/RHF/router_mega/CTimer1.h @@ -0,0 +1,32 @@ +#include +#include "Builder/PerfectRouterBuilder1.h" + +//--------------------------------------------------------------------------- +#ifndef CTimer1H +#define CTimer1H +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//---------------------------------------------------------------------------、 +class CTimer1 +{ +public: + + ~CTimer1() + { + Close(); + } + + void Close() + { + } + + double getCTime(uint32_t *hash, int *pn, int nHash, uint64_t &maxStorageCost); + double getFileTime(const char * filename, uint64_t &maxStorageCost); +}; + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF/router_mega/CTimer2.cpp b/RHF/router_mega/CTimer2.cpp new file mode 100755 index 0000000..5332dfa --- /dev/null +++ b/RHF/router_mega/CTimer2.cpp @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include "CTimer2.h" + +//------------------------------------------------------------------------------ +using namespace std; + +double CTimer2::getCTime(uint32_t *hash, int *pn,int nHash, uint64_t &maxStorageCost) +{ + /////////////////////////////////// + // we fix the nBucket and nSlot to compare construction time + // start with maximum number of buckets + int bucketStart = 8192; + int bucketEnd = 8192; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 1024; + int nSlotEnd = 1024; + + int slotWidth = 15; + int minCost = nSlotEnd*slotWidth + bucketStart*2 + 1; + int bestBucketSize = bucketStart+1; + int bestSlotSize = nSlotStart; + + // number of buckets + int nBucket; + int nSlot = nSlotStart; + + TArray dArrayBest; + TArray bucketArrayBest; + + // time calculation + struct timeval gStart, gBegin, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + TPerfectRouterBuilder2 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + // number of slots + int curCost = nSlot*slotWidth + nBucket*2; + if (curCost < minCost) + { + gettimeofday(&gBegin,NULL); + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gBegin.tv_sec + (gEnd.tv_usec - gBegin.tv_usec)/1000000.0; + fprintf(stderr,"success!!! \r\n"); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + fprintf(stderr,"bit memory cost = %d bit x nSlot + 2 bit x nBucket = %d \r\n", slotWidth, minCost); + uint64_t storageCost = (uint64_t) minCost; + if(maxStorageCost < storageCost){ + maxStorageCost = storageCost; + } + + return timeuse; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart+1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + myB.Close(); + return timeuse; +} + +double CTimer2::getFileTime(const char * filename, uint64_t &maxStorageCost) +{ + uint32_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint32_t h = atoi(l.c_str()); + key[ind++] = h; // load the string hash value + } + int nHash = ind; + + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + fprintf(stderr,"nHash: %d\r\n", nHash); + fprintf(stderr,"nHash1: %d\r\n", nHash1); + fprintf(stderr,"check file %s.\r\n", filename); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + uint32_t *hash = key; + int *pn = port; + double timeuse; + timeuse = getCTime(hash, pn, nHash, maxStorageCost); + + return timeuse; +} + +//------------------------------------------------------------------------------ diff --git a/RHF/router_mega/CTimer2.h b/RHF/router_mega/CTimer2.h new file mode 100755 index 0000000..ad8fd2d --- /dev/null +++ b/RHF/router_mega/CTimer2.h @@ -0,0 +1,32 @@ +#include +#include "Builder/PerfectRouterBuilder2.h" + +//--------------------------------------------------------------------------- +#ifndef CTimer2H +#define CTimer2H +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//---------------------------------------------------------------------------、 +class CTimer2 +{ +public: + + ~CTimer2() + { + Close(); + } + + void Close() + { + } + + double getCTime(uint32_t *hash, int *pn,int nHash, uint64_t &maxStorageCost); + double getFileTime(const char * filename, uint64_t &maxStorageCost); +}; + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF/router_mega/CTimer3.cpp b/RHF/router_mega/CTimer3.cpp new file mode 100755 index 0000000..1e0ee89 --- /dev/null +++ b/RHF/router_mega/CTimer3.cpp @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#include +#include "CTimer3.h" + +//------------------------------------------------------------------------------ +using namespace std; + +double CTimer3::getCTime(uint32_t *hash, int *pn,int nHash, uint64_t &maxStorageCost) +{ + /////////////////////////////////// + // we fix the nBucket and nSlot to compare construction time + // start with maximum number of buckets + int bucketStart = 32768; + int bucketEnd = 32768; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 2048; + int nSlotEnd = 2048; + + int slotWidth = 8; + int minCost = nSlotEnd*slotWidth + bucketStart*2 + 1; + int bestBucketSize = bucketStart-1; + int bestSlotSize = nSlotStart; + + int nBucket; + int nSlot = nSlotStart; + + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + // time calculation + struct timeval gStart, gBegin, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + TPerfectRouterBuilder3 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*slotWidth + nBucket*2; + // avoid some unuseful builds + if (curCost < minCost) + { + gettimeofday(&gBegin,NULL); + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gBegin.tv_sec + (gEnd.tv_usec - gBegin.tv_usec)/1000000.0; + fprintf(stderr,"success!!! \r\n"); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + fprintf(stderr,"bit memory cost = %d bit x nSlot + 2 bit x nBucket = %d \r\n", slotWidth, minCost); + uint64_t storageCost = (uint64_t) minCost; + if(maxStorageCost < storageCost){ + maxStorageCost = storageCost; + } + return timeuse; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + // nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + myB.Close(); + return timeuse; +} + +double CTimer3::getFileTime(const char * filename, uint64_t & maxStorageCost) +{ + uint32_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint32_t h = atoi(l.c_str()); + key[ind++] = h; // load the string hash value + } + int nHash = ind; + + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + fprintf(stderr,"nHash: %d\r\n", nHash); + fprintf(stderr,"nHash1: %d\r\n", nHash1); + fprintf(stderr,"check file %s.\r\n", filename); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + uint32_t *hash = key; + int *pn = port; + double timeuse; + timeuse = getCTime(hash, pn, nHash, maxStorageCost); + + return timeuse; +} + +//------------------------------------------------------------------------------ diff --git a/RHF/router_mega/CTimer3.h b/RHF/router_mega/CTimer3.h new file mode 100755 index 0000000..3322dac --- /dev/null +++ b/RHF/router_mega/CTimer3.h @@ -0,0 +1,32 @@ +#include +#include "Builder/PerfectRouterBuilder3.h" + +//--------------------------------------------------------------------------- +#ifndef CTimer3H +#define CTimer3H +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//---------------------------------------------------------------------------、 +class CTimer3 +{ +public: + + ~CTimer3() + { + Close(); + } + + void Close() + { + } + + double getCTime(uint32_t *hash, int *pn, int nHash, uint64_t &maxStorageCost); + double getFileTime(const char * filename, uint64_t &maxStorageCost); +}; + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF/router_mega/City64.cpp b/RHF/router_mega/City64.cpp new file mode 100755 index 0000000..3ec6352 --- /dev/null +++ b/RHF/router_mega/City64.cpp @@ -0,0 +1,259 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides CityHash64() and related functions. +// +// It's probably possible to create even faster hash functions by +// writing a program that systematically explores some of the space of +// possible hash functions, by using SIMD instructions, or by +// compromising on hash quality. +// +// Comment by LHZ 2017.5.19: +// This hash function has been tested by the following dataset: +// 1. 2G (items) Chinese word groups from 40G Chinese news text +// 2. 4M Chinese words from 40G Chinese news text +// 3. 1M Chinese words dictionary +// No conflict found yet. + +#include "City64.h" +#include "Type64.h" +#include + +#define Fetch64(x) (*(uint64_t*)(x)) +#define Fetch32(x) (*(uint32_t*)(x)) + +enum +{ +// Some primes between 2^63 and 2^64 for various uses. + k0 = 0xc3a5c85c97cb3127ULL, + k1 = 0xb492b66fbe98f273ULL, + k2 = 0x9ae16a3b2f90404fULL, + k3 = 0xc949d7c7509e6557ULL, +// for Hash128to64 + kMul = 0x9ddfea08eb382d69ULL, +}; +// Hash 128 input bits down to 64 bits of output. +// This is intended to be a reasonably good hash function. +inline uint64_t Hash128to64(uint64_t vL, uint64_t vH) { + // Murmur-inspired hashing. + uint64_t a = (vL ^ vH) * kMul; + a ^= (a >> 47); + uint64_t b = (vH ^ a) * kMul; + b ^= (b >> 47); + b *= kMul; + return b; +} + +// Bitwise right rotate. Normally this will compile to a single +// instruction, especially if the shift is a manifest constant. +inline uint64_t Rotate(uint64_t val, int shift) { + // Avoid shifting by 64: doing so yields an undefined result. + return shift == 0 ? val : ((val >> shift) | (val << (64 - shift))); +} + +// Equivalent to Rotate(), but requires the second arg to be non-zero. +// On x86-64, and probably others, it's possible for this to compile +// to a single instruction if both args are already in registers. +inline uint64_t RotateByAtLeast1(uint64_t val, int shift) { + return (val >> shift) | (val << (64 - shift)); +} + +inline uint64_t ShiftMix(uint64_t val) { + return val ^ (val >> 47); +} + +#define HashLen16 Hash128to64 + +inline uint64_t HashLen0to16(const char *s, size_t len) { + if (len > 8) { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + if (len >= 4) { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + if (len > 0) { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + return k2; +} +/* +inline uint64_t HashLen0to16(const char *s, size_t len) { + static uint8_t off[]={ + 3, + 2,2,2, + 1,1,1,1,1, + 0,0,0,0,0,0,0,0}; + + switch(off[len]) + { + case 0: + { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + case 1: + { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + case 2: + { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + case 3: + return k2; + } +} +*/ + +// This probably works well for 16-byte strings as well, but it may be overkill +// in that case. +inline uint64_t HashLen17to32(const char *s, size_t len) { + uint64_t a = Fetch64(s) * k1; + uint64_t b = Fetch64(s + 8); + uint64_t c = Fetch64(s + len - 8) * k2; + uint64_t d = Fetch64(s + len - 16) * k0; + return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d, + a + Rotate(b ^ k3, 20) - c + len); +} + +// Return a 16-byte hash for 48 bytes. Quick and dirty. +// Callers do best to use "random-looking" values for a and b. +inline void WeakHashLen32WithSeeds(TX128Data &out, + uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) { + a += w; + b = Rotate(b + a + z, 21); + uint64_t c = a; + a += x; + a += y; + b += Rotate(a, 44); + out.u64[0] = a+z; + out.u64[1] = b+c; +} + +// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. +inline void WeakHashLen32WithSeeds(TX128Data &out, + const char* s, uint64_t a, uint64_t b) { + WeakHashLen32WithSeeds(out,Fetch64(s), + Fetch64(s + 8), + Fetch64(s + 16), + Fetch64(s + 24), + a, + b); +} + +// Return an 8-byte hash for 33 to 64 bytes. +inline uint64_t HashLen33to64(const char *s, size_t len) { + uint64_t z = Fetch64(s + 24); + uint64_t a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0; + uint64_t b = Rotate(a + z, 52); + uint64_t c = Rotate(a, 37); + a += Fetch64(s + 8); + c += Rotate(a, 7); + a += Fetch64(s + 16); + uint64_t vf = a + z; + uint64_t vs = b + Rotate(a, 31) + c; + a = Fetch64(s + 16) + Fetch64(s + len - 32); + z = Fetch64(s + len - 8); + b = Rotate(a + z, 52); + c = Rotate(a, 37); + a += Fetch64(s + len - 24); + c += Rotate(a, 7); + a += Fetch64(s + len - 16); + uint64_t wf = a + z; + uint64_t ws = b + Rotate(a, 31) + c; + uint64_t r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0); + return ShiftMix(r * k0 + vs) * k2; +} + +uint64_t CityHash64(const char *s, size_t len) { + if (len <= 32) { + if (len <= 16) { + return HashLen0to16(s, len); + } else { + return HashLen17to32(s, len); + } + } else if (len <= 64) { + return HashLen33to64(s, len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + uint64_t x = Fetch64(s + len - 40); + uint64_t y = Fetch64(s + len - 16) + Fetch64(s + len - 56); + uint64_t z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); + TX128Data v,w; + + WeakHashLen32WithSeeds(v, s + len - 64, len, z); + WeakHashLen32WithSeeds(w, s + len - 32, y + k1, x); + x = x * k1 + Fetch64(s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + len = (len - 1) & ~static_cast(63); + do { + x = Rotate(x + y + v.u64[0] + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.u64[1] + Fetch64(s + 48), 42) * k1; + x ^= w.u64[1]; + y += v.u64[0] + Fetch64(s + 40); + z = Rotate(z + w.u64[0], 33) * k1; + WeakHashLen32WithSeeds(v, s, v.u64[1] * k1, x + w.u64[0]); + WeakHashLen32WithSeeds(w, s + 32, z + w.u64[1], y + Fetch64(s + 16)); + uint64_t tmp=z;z=x;x=tmp; + s += 64; + len -= 64; + } while (len != 0); + return HashLen16(HashLen16(v.u64[0], w.u64[0]) + ShiftMix(y) * k1 + z, + HashLen16(v.u64[1], w.u64[1]) + x); +} + + +uint64_t CityHash64WithSeeds(const char *s, size_t len, + uint64_t seed0, uint64_t seed1) { + return HashLen16(CityHash64(s, len) - seed0, seed1); +} + +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed) { + return CityHash64WithSeeds(s, len, k2, seed); +} + +uint64_t FastStrHash(const char *str,int len) +{ + if(len<0) + len = strlen(str); + + return CityHash64(str,len); +} + +uint64_t FastIntHash(uint64_t hash,uint64_t seed) +{ + return HashLen16(hash - k2, seed); +} diff --git a/RHF/router_mega/City64.h b/RHF/router_mega/City64.h new file mode 100755 index 0000000..56fce8c --- /dev/null +++ b/RHF/router_mega/City64.h @@ -0,0 +1,55 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides a few functions for hashing strings. On x86-64 +// hardware in 2011, CityHash64() is faster than other high-quality +// hash functions, such as Murmur. This is largely due to higher +// instruction-level parallelism. CityHash64() and CityHash128() also perform +// well on hash-quality tests. +// +// CityHash128() is optimized for relatively long strings and returns +// a 128-bit hash. For strings more than about 2000 bytes it can be +// faster than CityHash64(). +// +// Functions in the CityHash family are not suitable for cryptography. +// +// WARNING: This code has not been tested on big-endian platforms! +// It is known to work well on little-endian platforms that have a small penalty +// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs. +// +// By the way, for some hash functions, given strings a and b, the hash +// of a+b is easily derived from the hashes of a and b. This property +// doesn't hold for any hash functions in this file. + +#ifndef CITY_HASH_64_H_ +#define CITY_HASH_64_H_ + +#include +#include + +// Hash function for a byte array. +uint64_t CityHash64(const char *buf, size_t len); +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed); +uint64_t CityHash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t seed1); +uint64_t FastIntHash(uint64_t hash,uint64_t seed); + +#endif // CITY_HASH_H_ diff --git a/RHF/router_mega/FastStrHash.h b/RHF/router_mega/FastStrHash.h new file mode 100755 index 0000000..8e59f44 --- /dev/null +++ b/RHF/router_mega/FastStrHash.h @@ -0,0 +1,17 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef FastStrHashH +#define FastStrHashH +//---- -------------------------------------------------------------------------------------------------------- +#include +//#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +/*--------------------------------------------------------------------------- +A wrapper on Google's City64 hash function. +---------------------------------------------------------------------------*/ +uint64_t FastStrHash(const char *str,int len=-1); +uint64_t FastIntHash(uint64_t hash,uint64_t seed); +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Generate b/RHF/router_mega/Generate new file mode 100755 index 0000000..93eb82e Binary files /dev/null and b/RHF/router_mega/Generate differ diff --git a/RHF/router_mega/Generator.cpp b/RHF/router_mega/Generator.cpp new file mode 100755 index 0000000..a5b9a3a --- /dev/null +++ b/RHF/router_mega/Generator.cpp @@ -0,0 +1,291 @@ + +#include +#include +#include "Array.h" +#include "Builder/PerfectRouterBuilder1.h" +#include "Builder/PerfectRouterBuilder2.h" +#include "Builder/PerfectRouterBuilder3.h" +//------------------------------------------------------------------------------ +using namespace std; + +bool generateFunction1(const char *funcFileName, uint32_t *hash, int *pn,int nHash) +{ + // // start with maximum number of buckets + // int bucketStart = 16384; + // int bucketEnd = 2048; // this number must be larger than 4 + // // start with minimum number slots + // int nSlotStart = 512; + // int nSlotEnd = 4096; + // start with maximum number of buckets + int bucketStart = 16384; + int bucketEnd = 16384; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 1024; + int nSlotEnd = 1024; + + int slotWidth = 11; + int minCost = nSlotStart*slotWidth + bucketStart*2 + 1; + int bestBucketSize = bucketStart-1; + int bestSlotSize = nSlotStart; + + int nBucket; + int nSlot = nSlotStart; + + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + TPerfectRouterBuilder1 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*slotWidth + nBucket*2; + if (curCost < minCost) + { + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %d \r\n", nHash); + // fprintf(stderr,"num of slots: %d \r\n", myB.r); + // fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + // Now, current myB contains the best parameters, output to files + ofstream output; + string outFileName = funcFileName; + output.open(outFileName); + output << rBest << endl; + output << mBest << endl; + // output each d value in d[](dArrayBest) + for (int slot=0;slot dArrayBest; + TArray bucketArrayBest; + + TPerfectRouterBuilder2 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + fprintf(stderr,"nslots: %d \r\n", nSlot); + fprintf(stderr,"nbuckets: %d \r\n", nBucket); + // number of slots + int curCost = nSlot*slotWidth + nBucket*2; + if (curCost < minCost) + { + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %d \r\n", nHash); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + break; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart+1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + // Now, current myB contains the best parameters, output to files + ofstream output; + string outFileName = funcFileName; + output.open(outFileName); + output << rBest << endl; + output << mBest << endl; + // output each d value in d[](dArrayBest) + for (int slot=0;slot dArrayBest; + TArray bucketArrayBest; + + TPerfectRouterBuilder3 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*slotWidth + nBucket*2; + if (curCost < minCost) + { + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %d \r\n", nHash); + // fprintf(stderr,"num of slots: %d \r\n", myB.r); + // fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart+1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + // Now, current myB contains the best parameters, output to files + ofstream output; + string outFileName = funcFileName; + output.open(outFileName); + output << rBest << endl; + output << mBest << endl; + // output each d value in d[](dArrayBest) + for (int slot=0;slot + +//--------------------------------------------------------------------------- +#ifndef GeneratorH +#define GeneratorH +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +double generateFunction1(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +double generateFunction2(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +double generateFunction3(const char *funcFileName, uint32_t *hash, int *pn,int nHash); + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF/router_mega/IntUtils.cpp b/RHF/router_mega/IntUtils.cpp new file mode 100755 index 0000000..9ba1eec --- /dev/null +++ b/RHF/router_mega/IntUtils.cpp @@ -0,0 +1,184 @@ +//--------------------------------------------------------------------------- +#include "IntUtils.h" +#include +// #include "Sys/CpuUtils.h" +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2) +{ +#if defined(XrossCPP_In_64) + return ((__int128_t)val1 * val2) >> 64; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + return (m2>>32) + (uint64_t)v1H*v2H + (c>>31); +#endif +} +//--------------------------------------------------------------------------- +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low) +{ +#if defined(XrossCPP_In_64) + __int128_t tmp = (__int128_t)val1 * val2; + high = (uint64_t)(tmp>>64); + low = (uint64_t) tmp; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + high = (m2>>32) + (uint64_t)v1H*v2H + (c>>31); + low = mLL+(m1<<32); +#endif +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val) +{ + val--; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + val |= val >> 32; + return val+1; +} +//--------------------------------------------------------------------------- +// We havn't implement them yet +//--------------------------------------------------------------------------- +/* +#ifndef XrossCPP_In_64 +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +#endif // XrossCPP_In_64 +*/ +// //--------------------------------------------------------------------------- +// static bool RM_witness(uint64_t n, uint64_t a, uint64_t s, unsigned tMinus1) +// { +// uint64_t v = 1; + +// while (s > 0) +// { +// if ( (s&1) == 1 ) +// v = Mul64Mod(n,v,a); + +// a = Mul64Mod(n,a,a); +// s >>= 1; +// } + +// if (1 == v) +// return true; + +// uint64_t nM1 = n-1; + +// for (unsigned i = 0; v != nM1; i++) +// { +// if (i == tMinus1) +// return false; + +// v = Mul64Mod(n,v,v); +// } + +// return true; +// } +//--------------------------------------------------------------------------- +bool RM_PrimeTest(uint64_t p) +{ + uint64_t x = (uint64_t)sqrt(p); + uint64_t i = 3; + if(p==2)return true; + if(p%2 == 0)return false; + while(i>= t; + +// t--; // we use t-1 all the time + +// /* +// * Witness 2 is deterministic for all n < 2047. Witnesses 2, 7, 61 +// * are deterministic for all n < 4,759,123,141. +// */ + +// if (RM_witness(n, 2, s, t)==false) +// return false; + +// if (n < 2027) +// return true; + +// if (RM_witness(n, 7, s, t)==false) +// return false; + +// if(n<4759123141ull) +// return RM_witness(n, 61, s, t); + +// static const uint8_t witness64[] = { 3, 5, 11, 13, 17, 19, 23, 29, 31, 37 }; // 2 & 7 are tested already + +// for (unsigned i = 0; i < (sizeof(witness64)/sizeof(witness64[0])); i++) +// { +// if (!RM_witness(n, witness64[i], s, t)) +// return false; +// } + +// return true; +// } +//--------------------------------------------------------------------------- +uint64_t RoundUpPrime(uint64_t val) +{ + val |= 1; + + while( (RM_PrimeTest(val)==false) && (val>1) ) + val += 2; + + return (val<=1?0:val); +} +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/IntUtils.h b/RHF/router_mega/IntUtils.h new file mode 100755 index 0000000..68ad792 --- /dev/null +++ b/RHF/router_mega/IntUtils.h @@ -0,0 +1,62 @@ +//--------------------------------------------------------------------------- +#ifndef IntUtilsH +#define IntUtilsH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "Type64.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2); +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low); +//--------------------------------------------------------------------------- +// Following functions can be optimized by asm +// mul1*mul2 -> 64-bit result%d +inline uint32_t /*__fastcall*/ MulMod(uint32_t m1,uint32_t m2,uint32_t d) +{ + return (uint32_t)(((uint64_t)m1*m2)%d); +} +// p1*p2 -> 64-bit result+c +inline uint64_t /*__fastcall*/ MulAdd(uint32_t m1,uint32_t m2,uint32_t c) +{ + return ((uint64_t)m1*m2)+c; +} +// m1*m2 -> 64-bit result +inline uint64_t /*__fastcall*/ Mul(uint32_t m1,uint32_t m2) +{ + return ((uint64_t)m1*m2); +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val); +uint64_t RoundUpPrime(uint64_t val); +/*--------------------------------------------------------------------------- +Rabin-Miller primality test for up to max uint64_t. +Causion: we think 0, 1, 2 are not prime. +Causion: only work on x64 platform. +---------------------------------------------------------------------------*/ +bool RM_PrimeTest(uint64_t n); +//--------------------------------------------------------------------------- +//High efficient mul and div funcs for x64 platform only +//#ifdef XrossCPP_In_X64 +#ifdef __cplusplus +extern "C" +{ +#endif//__cplusplus +//--------------------------------------------------------------------------- +/* (m1*m2) % modV */ +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2); +/* (m1*m2) / divV */ +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2); +/* (m1*m2) /% divV, return both */ +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2); +//--------------------------------------------------------------------------- +#ifdef __cplusplus +} +#endif//__cplusplus +//#endif //XrossCPP_In_X64 +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Makefile b/RHF/router_mega/Makefile new file mode 100755 index 0000000..cc4fd6b --- /dev/null +++ b/RHF/router_mega/Makefile @@ -0,0 +1,658 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/keran2/Work/RHF/router_mega + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/keran2/Work/RHF/router_mega + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/RHF/router_mega/CMakeFiles /home/keran2/Work/RHF/router_mega/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/RHF/router_mega/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named Generate + +# Build rule for target. +Generate: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 Generate +.PHONY : Generate + +# fast build rule for target. +Generate/fast: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/build +.PHONY : Generate/fast + +AllocatorBase.o: AllocatorBase.cpp.o + +.PHONY : AllocatorBase.o + +# target to build an object file +AllocatorBase.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.o +.PHONY : AllocatorBase.cpp.o + +AllocatorBase.i: AllocatorBase.cpp.i + +.PHONY : AllocatorBase.i + +# target to preprocess a source file +AllocatorBase.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.i +.PHONY : AllocatorBase.cpp.i + +AllocatorBase.s: AllocatorBase.cpp.s + +.PHONY : AllocatorBase.s + +# target to generate assembly for a file +AllocatorBase.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.s +.PHONY : AllocatorBase.cpp.s + +AllocatorC.o: AllocatorC.cpp.o + +.PHONY : AllocatorC.o + +# target to build an object file +AllocatorC.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.o +.PHONY : AllocatorC.cpp.o + +AllocatorC.i: AllocatorC.cpp.i + +.PHONY : AllocatorC.i + +# target to preprocess a source file +AllocatorC.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.i +.PHONY : AllocatorC.cpp.i + +AllocatorC.s: AllocatorC.cpp.s + +.PHONY : AllocatorC.s + +# target to generate assembly for a file +AllocatorC.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.s +.PHONY : AllocatorC.cpp.s + +ArrayPre.o: ArrayPre.cpp.o + +.PHONY : ArrayPre.o + +# target to build an object file +ArrayPre.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.o +.PHONY : ArrayPre.cpp.o + +ArrayPre.i: ArrayPre.cpp.i + +.PHONY : ArrayPre.i + +# target to preprocess a source file +ArrayPre.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.i +.PHONY : ArrayPre.cpp.i + +ArrayPre.s: ArrayPre.cpp.s + +.PHONY : ArrayPre.s + +# target to generate assembly for a file +ArrayPre.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.s +.PHONY : ArrayPre.cpp.s + +Builder/PerfectRouterBuilder1.o: Builder/PerfectRouterBuilder1.cpp.o + +.PHONY : Builder/PerfectRouterBuilder1.o + +# target to build an object file +Builder/PerfectRouterBuilder1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.o +.PHONY : Builder/PerfectRouterBuilder1.cpp.o + +Builder/PerfectRouterBuilder1.i: Builder/PerfectRouterBuilder1.cpp.i + +.PHONY : Builder/PerfectRouterBuilder1.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.i +.PHONY : Builder/PerfectRouterBuilder1.cpp.i + +Builder/PerfectRouterBuilder1.s: Builder/PerfectRouterBuilder1.cpp.s + +.PHONY : Builder/PerfectRouterBuilder1.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.s +.PHONY : Builder/PerfectRouterBuilder1.cpp.s + +Builder/PerfectRouterBuilder2.o: Builder/PerfectRouterBuilder2.cpp.o + +.PHONY : Builder/PerfectRouterBuilder2.o + +# target to build an object file +Builder/PerfectRouterBuilder2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.o +.PHONY : Builder/PerfectRouterBuilder2.cpp.o + +Builder/PerfectRouterBuilder2.i: Builder/PerfectRouterBuilder2.cpp.i + +.PHONY : Builder/PerfectRouterBuilder2.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.i +.PHONY : Builder/PerfectRouterBuilder2.cpp.i + +Builder/PerfectRouterBuilder2.s: Builder/PerfectRouterBuilder2.cpp.s + +.PHONY : Builder/PerfectRouterBuilder2.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.s +.PHONY : Builder/PerfectRouterBuilder2.cpp.s + +Builder/PerfectRouterBuilder3.o: Builder/PerfectRouterBuilder3.cpp.o + +.PHONY : Builder/PerfectRouterBuilder3.o + +# target to build an object file +Builder/PerfectRouterBuilder3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.o +.PHONY : Builder/PerfectRouterBuilder3.cpp.o + +Builder/PerfectRouterBuilder3.i: Builder/PerfectRouterBuilder3.cpp.i + +.PHONY : Builder/PerfectRouterBuilder3.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.i +.PHONY : Builder/PerfectRouterBuilder3.cpp.i + +Builder/PerfectRouterBuilder3.s: Builder/PerfectRouterBuilder3.cpp.s + +.PHONY : Builder/PerfectRouterBuilder3.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.s +.PHONY : Builder/PerfectRouterBuilder3.cpp.s + +CTimer1.o: CTimer1.cpp.o + +.PHONY : CTimer1.o + +# target to build an object file +CTimer1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.o +.PHONY : CTimer1.cpp.o + +CTimer1.i: CTimer1.cpp.i + +.PHONY : CTimer1.i + +# target to preprocess a source file +CTimer1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.i +.PHONY : CTimer1.cpp.i + +CTimer1.s: CTimer1.cpp.s + +.PHONY : CTimer1.s + +# target to generate assembly for a file +CTimer1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.s +.PHONY : CTimer1.cpp.s + +CTimer2.o: CTimer2.cpp.o + +.PHONY : CTimer2.o + +# target to build an object file +CTimer2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.o +.PHONY : CTimer2.cpp.o + +CTimer2.i: CTimer2.cpp.i + +.PHONY : CTimer2.i + +# target to preprocess a source file +CTimer2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.i +.PHONY : CTimer2.cpp.i + +CTimer2.s: CTimer2.cpp.s + +.PHONY : CTimer2.s + +# target to generate assembly for a file +CTimer2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.s +.PHONY : CTimer2.cpp.s + +CTimer3.o: CTimer3.cpp.o + +.PHONY : CTimer3.o + +# target to build an object file +CTimer3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.o +.PHONY : CTimer3.cpp.o + +CTimer3.i: CTimer3.cpp.i + +.PHONY : CTimer3.i + +# target to preprocess a source file +CTimer3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.i +.PHONY : CTimer3.cpp.i + +CTimer3.s: CTimer3.cpp.s + +.PHONY : CTimer3.s + +# target to generate assembly for a file +CTimer3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.s +.PHONY : CTimer3.cpp.s + +City64.o: City64.cpp.o + +.PHONY : City64.o + +# target to build an object file +City64.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.o +.PHONY : City64.cpp.o + +City64.i: City64.cpp.i + +.PHONY : City64.i + +# target to preprocess a source file +City64.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.i +.PHONY : City64.cpp.i + +City64.s: City64.cpp.s + +.PHONY : City64.s + +# target to generate assembly for a file +City64.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.s +.PHONY : City64.cpp.s + +Generator.o: Generator.cpp.o + +.PHONY : Generator.o + +# target to build an object file +Generator.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.o +.PHONY : Generator.cpp.o + +Generator.i: Generator.cpp.i + +.PHONY : Generator.i + +# target to preprocess a source file +Generator.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.i +.PHONY : Generator.cpp.i + +Generator.s: Generator.cpp.s + +.PHONY : Generator.s + +# target to generate assembly for a file +Generator.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.s +.PHONY : Generator.cpp.s + +IntUtils.o: IntUtils.cpp.o + +.PHONY : IntUtils.o + +# target to build an object file +IntUtils.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.o +.PHONY : IntUtils.cpp.o + +IntUtils.i: IntUtils.cpp.i + +.PHONY : IntUtils.i + +# target to preprocess a source file +IntUtils.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.i +.PHONY : IntUtils.cpp.i + +IntUtils.s: IntUtils.cpp.s + +.PHONY : IntUtils.s + +# target to generate assembly for a file +IntUtils.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.s +.PHONY : IntUtils.cpp.s + +Performance/Performance.o: Performance/Performance.cpp.o + +.PHONY : Performance/Performance.o + +# target to build an object file +Performance/Performance.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.o +.PHONY : Performance/Performance.cpp.o + +Performance/Performance.i: Performance/Performance.cpp.i + +.PHONY : Performance/Performance.i + +# target to preprocess a source file +Performance/Performance.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.i +.PHONY : Performance/Performance.cpp.i + +Performance/Performance.s: Performance/Performance.cpp.s + +.PHONY : Performance/Performance.s + +# target to generate assembly for a file +Performance/Performance.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.s +.PHONY : Performance/Performance.cpp.s + +Tester/PerfectRouterTester1.o: Tester/PerfectRouterTester1.cpp.o + +.PHONY : Tester/PerfectRouterTester1.o + +# target to build an object file +Tester/PerfectRouterTester1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.o +.PHONY : Tester/PerfectRouterTester1.cpp.o + +Tester/PerfectRouterTester1.i: Tester/PerfectRouterTester1.cpp.i + +.PHONY : Tester/PerfectRouterTester1.i + +# target to preprocess a source file +Tester/PerfectRouterTester1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.i +.PHONY : Tester/PerfectRouterTester1.cpp.i + +Tester/PerfectRouterTester1.s: Tester/PerfectRouterTester1.cpp.s + +.PHONY : Tester/PerfectRouterTester1.s + +# target to generate assembly for a file +Tester/PerfectRouterTester1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.s +.PHONY : Tester/PerfectRouterTester1.cpp.s + +Tester/PerfectRouterTester2.o: Tester/PerfectRouterTester2.cpp.o + +.PHONY : Tester/PerfectRouterTester2.o + +# target to build an object file +Tester/PerfectRouterTester2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.o +.PHONY : Tester/PerfectRouterTester2.cpp.o + +Tester/PerfectRouterTester2.i: Tester/PerfectRouterTester2.cpp.i + +.PHONY : Tester/PerfectRouterTester2.i + +# target to preprocess a source file +Tester/PerfectRouterTester2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.i +.PHONY : Tester/PerfectRouterTester2.cpp.i + +Tester/PerfectRouterTester2.s: Tester/PerfectRouterTester2.cpp.s + +.PHONY : Tester/PerfectRouterTester2.s + +# target to generate assembly for a file +Tester/PerfectRouterTester2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.s +.PHONY : Tester/PerfectRouterTester2.cpp.s + +Tester/PerfectRouterTester3.o: Tester/PerfectRouterTester3.cpp.o + +.PHONY : Tester/PerfectRouterTester3.o + +# target to build an object file +Tester/PerfectRouterTester3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.o +.PHONY : Tester/PerfectRouterTester3.cpp.o + +Tester/PerfectRouterTester3.i: Tester/PerfectRouterTester3.cpp.i + +.PHONY : Tester/PerfectRouterTester3.i + +# target to preprocess a source file +Tester/PerfectRouterTester3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.i +.PHONY : Tester/PerfectRouterTester3.cpp.i + +Tester/PerfectRouterTester3.s: Tester/PerfectRouterTester3.cpp.s + +.PHONY : Tester/PerfectRouterTester3.s + +# target to generate assembly for a file +Tester/PerfectRouterTester3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.s +.PHONY : Tester/PerfectRouterTester3.cpp.s + +main.o: main.cpp.o + +.PHONY : main.o + +# target to build an object file +main.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i + +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s + +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... Generate" + @echo "... edit_cache" + @echo "... AllocatorBase.o" + @echo "... AllocatorBase.i" + @echo "... AllocatorBase.s" + @echo "... AllocatorC.o" + @echo "... AllocatorC.i" + @echo "... AllocatorC.s" + @echo "... ArrayPre.o" + @echo "... ArrayPre.i" + @echo "... ArrayPre.s" + @echo "... Builder/PerfectRouterBuilder1.o" + @echo "... Builder/PerfectRouterBuilder1.i" + @echo "... Builder/PerfectRouterBuilder1.s" + @echo "... Builder/PerfectRouterBuilder2.o" + @echo "... Builder/PerfectRouterBuilder2.i" + @echo "... Builder/PerfectRouterBuilder2.s" + @echo "... Builder/PerfectRouterBuilder3.o" + @echo "... Builder/PerfectRouterBuilder3.i" + @echo "... Builder/PerfectRouterBuilder3.s" + @echo "... CTimer1.o" + @echo "... CTimer1.i" + @echo "... CTimer1.s" + @echo "... CTimer2.o" + @echo "... CTimer2.i" + @echo "... CTimer2.s" + @echo "... CTimer3.o" + @echo "... CTimer3.i" + @echo "... CTimer3.s" + @echo "... City64.o" + @echo "... City64.i" + @echo "... City64.s" + @echo "... Generator.o" + @echo "... Generator.i" + @echo "... Generator.s" + @echo "... IntUtils.o" + @echo "... IntUtils.i" + @echo "... IntUtils.s" + @echo "... Performance/Performance.o" + @echo "... Performance/Performance.i" + @echo "... Performance/Performance.s" + @echo "... Tester/PerfectRouterTester1.o" + @echo "... Tester/PerfectRouterTester1.i" + @echo "... Tester/PerfectRouterTester1.s" + @echo "... Tester/PerfectRouterTester2.o" + @echo "... Tester/PerfectRouterTester2.i" + @echo "... Tester/PerfectRouterTester2.s" + @echo "... Tester/PerfectRouterTester3.o" + @echo "... Tester/PerfectRouterTester3.i" + @echo "... Tester/PerfectRouterTester3.s" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/RHF/router_mega/Performance/Performance.cpp b/RHF/router_mega/Performance/Performance.cpp new file mode 100755 index 0000000..7c170b8 --- /dev/null +++ b/RHF/router_mega/Performance/Performance.cpp @@ -0,0 +1,21 @@ +// not use anymore + +//--------------------------------------------------------------------------- +#include "../IntUtils.h" +#include +#include +#include "Performance.h" +//--------------------------------------------------------------------------- +// Time calculation +float diffUserTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_utime.tv_sec - start->ru_utime.tv_sec) + + 1e-6*(end->ru_utime.tv_usec - start->ru_utime.tv_usec); +} + +float diffSystemTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_stime.tv_sec - start->ru_stime.tv_sec) + + 1e-6*(end->ru_stime.tv_usec - start->ru_stime.tv_usec); +} +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Performance/Performance.h b/RHF/router_mega/Performance/Performance.h new file mode 100755 index 0000000..a8e4128 --- /dev/null +++ b/RHF/router_mega/Performance/Performance.h @@ -0,0 +1,19 @@ +// not use anymore + +//--------------------------------------------------------------------------- +#ifndef PerformanceH +#define PerformanceH +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- + +float diffUserTime(struct rusage *start, struct rusage *end); + +float diffSystemTime(struct rusage *start, struct rusage *end); + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF/router_mega/SortBase.h b/RHF/router_mega/SortBase.h new file mode 100755 index 0000000..7f2c4bf --- /dev/null +++ b/RHF/router_mega/SortBase.h @@ -0,0 +1,20 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef sortBaseH +#define sortBaseH +//---- -------------------------------------------------------------------------------------------------------- +#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +//---- -------------------------------------------------------------------------------------------------------- +typedef int (*TSortCmp)(const void *r1,const void *r2); +//---- -------------------------------------------------------------------------------------------------------- +inline void XchgStorage(void *d1,void *d2,void *buff,int w) +{ + memcpy(buff,d1,w); + memcpy(d1,d2,w); + memcpy(d2,buff,w); +} +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Tester/PerfectRouterTester1.cpp b/RHF/router_mega/Tester/PerfectRouterTester1.cpp new file mode 100755 index 0000000..d2df645 --- /dev/null +++ b/RHF/router_mega/Tester/PerfectRouterTester1.cpp @@ -0,0 +1,137 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +#include "PerfectRouterTester1.h" +#include "../Performance/Performance.h" +//--------------------------------------------------------------------------- +using namespace std; +//--------------------------------------------------------------------------- +// bool checkFunc(const int *pn, const uint32_t *hash, const int nHash, const int nSlot, const int nBucket, TArray TdArray, TArray TbucketArray) +// { +// int bucketWidth = (int) (log(nBucket)/log(2)); +// int shiftBucket = 32 - bucketWidth; + +// int nSlotWidth = (int)(log(nSlot)/log(2)); +// int shiftSlot = 32 - nSlotWidth; +// fprintf(stderr,"TdArray length: %d\r\n", TdArray.Number); +// fprintf(stderr,"TbucketArray Number: %d\r\n", TbucketArray.Number); + +// for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + +// // Step2: slot lookup +// fprintf(stderr,"hash[i]: %u\r\n", hash[i]); +// fprintf(stderr,"nSlot: %d\r\n", nSlot); +// fprintf(stderr,"shiftSlot: %d\r\n", shiftSlot); +// fprintf(stderr,"idx: %d\r\n", idx); +// int d = TdArray[idx]; + +// // Step3: universal shift hash and mod m +// uint32_t x_key = hash[i] >> 8; +// int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + +// // Step4: Interface number lookup +// fprintf(stderr,"f: %d\r\n", f); +// if (TbucketArray[f] != pn[i]) +// { +// return false; +// } +// } +// return true; +// } + +bool TPerfectRouterTester1::Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash) +{ + // get function paprameters from function.txt + ifstream fInput(funcFileName, ios::in); + string funcLine; + // load r(nSlot) and m(nBucket) + getline(fInput, funcLine); + int nSlot = atoi(funcLine.c_str()); + getline(fInput, funcLine); + int nBucket = atoi(funcLine.c_str()); + + // initialize the array for TdArray[] and TbucketArray[] + TdArray.AllocFill(24+nSlot*sizeof(int)); // 16bit x nSlot + TdArray.InitZero(); + + TbucketArray.AllocFill(24+nBucket*sizeof(int)); // 32bit x number of buckets + TbucketArray.InitZero(); + + // load slot values for TdArray[] + for (int dIdx=0;dIdx> shiftSlot; // int idx = hash[i]%nSlot; + + // Step2: slot lookup + int d = TdArray[idx]; + + // Step3: universal shift hash and mod m + uint32_t x_key = hash[i] >> 10; + int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + + // Step4: Interface number lookup + if (TbucketArray[f] != pn[i]) + { + fprintf(stderr,"############################################### \r\n"); + fprintf(stderr,"testing fail for %s \r\n", funcFileName); + fprintf(stderr,"############################################### \r\n"); + fInput.close(); + return false; + } + } + getrusage(RUSAGE_SELF, &tEnd); + + fprintf(stderr,"Testing success for %s \r\n", funcFileName); + float tu = diffUserTime(&tStart, &tEnd); + float ts = diffSystemTime(&tStart, &tEnd); + float tTotal = tu + ts; + fprintf(stderr,"Testing time for all keys:\n %.06f sec, %.06f user, %.06f system\n", + tTotal, tu, ts); + fInput.close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Tester/PerfectRouterTester1.h b/RHF/router_mega/Tester/PerfectRouterTester1.h new file mode 100755 index 0000000..f3c5474 --- /dev/null +++ b/RHF/router_mega/Tester/PerfectRouterTester1.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterTester1H +#define PerfectRouterTester1H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TPerfectRouterTester1 +{ +public: + TArray TdArray; + TArray TbucketArray; + + ~TPerfectRouterTester1() + { + Close(); + } + + void Close() + { + TdArray.Close(); + TbucketArray.Close(); + } + + bool Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Tester/PerfectRouterTester2.cpp b/RHF/router_mega/Tester/PerfectRouterTester2.cpp new file mode 100755 index 0000000..58aee34 --- /dev/null +++ b/RHF/router_mega/Tester/PerfectRouterTester2.cpp @@ -0,0 +1,148 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +#include "PerfectRouterTester2.h" +#include "../Performance/Performance.h" +//--------------------------------------------------------------------------- +using namespace std; +//--------------------------------------------------------------------------- +// bool checkFunc(const int *pn, const uint32_t *hash, const int nHash, const int nSlot, const int nBucket, TArray TdArray, TArray TbucketArray) +// { +// int bucketWidth = (int) (log(nBucket)/log(2)); +// int shiftBucket = 32 - bucketWidth; + +// int nSlotWidth = (int)(log(nSlot)/log(2)); +// int shiftSlot = 32 - nSlotWidth; +// fprintf(stderr,"TdArray length: %d\r\n", TdArray.Number); +// fprintf(stderr,"TbucketArray Number: %d\r\n", TbucketArray.Number); + +// for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + +// // Step2: slot lookup +// fprintf(stderr,"hash[i]: %u\r\n", hash[i]); +// fprintf(stderr,"nSlot: %d\r\n", nSlot); +// fprintf(stderr,"shiftSlot: %d\r\n", shiftSlot); +// fprintf(stderr,"idx: %d\r\n", idx); +// int d = TdArray[idx]; + +// // Step3: universal shift hash and mod m +// uint32_t x_key = hash[i] >> 8; +// int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + +// // Step4: Interface number lookup +// fprintf(stderr,"f: %d\r\n", f); +// if (TbucketArray[f] != pn[i]) +// { +// return false; +// } +// } +// return true; +// } + +bool TPerfectRouterTester2::Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash) +{ + // get function paprameters from function.txt + ifstream fInput(funcFileName, ios::in); + string funcLine; + // load r(nSlot) and m(nBucket) + getline(fInput, funcLine); + int nSlot = atoi(funcLine.c_str()); + getline(fInput, funcLine); + int nBucket = atoi(funcLine.c_str()); + + // initialize the array for TdArray[] and TbucketArray[] + TdArray.AllocFill(24+nSlot*sizeof(int)); // 16bit x nSlot + TdArray.InitZero(); + + TbucketArray.AllocFill(24+nBucket*sizeof(int)); // 32bit x number of buckets + TbucketArray.InitZero(); + + // load slot values for TdArray[] + for (int dIdx=0;dIdx> sl0) ^ (hash[i] << sl1) ^ hash[i]) << shiftSlot >> shiftSlot); + int idx = (hash[i] << shiftSlot) >> shiftSlot; // int idx = hash[i]%nSlot; + + // Step2: slot lookup + int d = TdArray[idx]; + + // Step3: universal shift hash and mod m + uint32_t x_key = hash[i] >> 10; + // uint32_t x_key = hash[i] >> 8; + // int f = ( ((x_key + (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + + uint32_t k2 = (uint32_t) 0x40000007; + uint32_t kMul = (uint32_t) 0x40000003; + uint32_t a = ((x_key - k2) ^ (uint32_t)d) * kMul; + a ^= (a >> 13); + uint32_t b = ((uint32_t)d ^ a) * kMul; + b ^= (b >> 13); + b *= kMul; + int f = b << shiftBucket >> shiftBucket; + + // Step4: Interface number lookup + if (TbucketArray[f] != pn[i]) + { + fprintf(stderr,"############################################### \r\n"); + fprintf(stderr,"testing fail for %s \r\n", funcFileName); + fprintf(stderr,"############################################### \r\n"); + fInput.close(); + return false; + } + } + getrusage(RUSAGE_SELF, &tEnd); + + fprintf(stderr,"Testing success for %s \r\n", funcFileName); + float tu = diffUserTime(&tStart, &tEnd); + float ts = diffSystemTime(&tStart, &tEnd); + float tTotal = tu + ts; + fprintf(stderr,"Testing time for all keys:\n %.06f sec, %.06f user, %.06f system\n", + tTotal, tu, ts); + fInput.close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Tester/PerfectRouterTester2.h b/RHF/router_mega/Tester/PerfectRouterTester2.h new file mode 100755 index 0000000..238b012 --- /dev/null +++ b/RHF/router_mega/Tester/PerfectRouterTester2.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterTester2H +#define PerfectRouterTester2H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TPerfectRouterTester2 +{ +public: + TArray TdArray; + TArray TbucketArray; + + ~TPerfectRouterTester2() + { + Close(); + } + + void Close() + { + TdArray.Close(); + TbucketArray.Close(); + } + + bool Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Tester/PerfectRouterTester3.cpp b/RHF/router_mega/Tester/PerfectRouterTester3.cpp new file mode 100755 index 0000000..627210d --- /dev/null +++ b/RHF/router_mega/Tester/PerfectRouterTester3.cpp @@ -0,0 +1,137 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +#include "PerfectRouterTester3.h" +#include "../Performance/Performance.h" +//--------------------------------------------------------------------------- +using namespace std; +//--------------------------------------------------------------------------- +// bool checkFunc(const int *pn, const uint32_t *hash, const int nHash, const int nSlot, const int nBucket, TArray TdArray, TArray TbucketArray) +// { +// int bucketWidth = (int) (log(nBucket)/log(2)); +// int shiftBucket = 32 - bucketWidth; + +// int nSlotWidth = (int)(log(nSlot)/log(2)); +// int shiftSlot = 32 - nSlotWidth; +// fprintf(stderr,"TdArray length: %d\r\n", TdArray.Number); +// fprintf(stderr,"TbucketArray Number: %d\r\n", TbucketArray.Number); + +// for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + +// // Step2: slot lookup +// fprintf(stderr,"hash[i]: %u\r\n", hash[i]); +// fprintf(stderr,"nSlot: %d\r\n", nSlot); +// fprintf(stderr,"shiftSlot: %d\r\n", shiftSlot); +// fprintf(stderr,"idx: %d\r\n", idx); +// int d = TdArray[idx]; + +// // Step3: universal shift hash and mod m +// uint32_t x_key = hash[i] >> 8; +// int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + +// // Step4: Interface number lookup +// fprintf(stderr,"f: %d\r\n", f); +// if (TbucketArray[f] != pn[i]) +// { +// return false; +// } +// } +// return true; +// } + +bool TPerfectRouterTester3::Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash) +{ + // get function paprameters from function.txt + ifstream fInput(funcFileName, ios::in); + string funcLine; + // load r(nSlot) and m(nBucket) + getline(fInput, funcLine); + int nSlot = atoi(funcLine.c_str()); + getline(fInput, funcLine); + int nBucket = atoi(funcLine.c_str()); + + // initialize the array for TdArray[] and TbucketArray[] + TdArray.AllocFill(24+nSlot*sizeof(int)); // 16bit x nSlot + TdArray.InitZero(); + + TbucketArray.AllocFill(24+nBucket*sizeof(int)); // 32bit x number of buckets + TbucketArray.InitZero(); + + // load slot values for TdArray[] + for (int dIdx=0;dIdx> shiftSlot; // int idx = hash[i]%nSlot; + + // Step2: slot lookup + int d = TdArray[idx]; + + // Step3: universal shift hash and mod m + uint32_t x_key = hash[i] >> 11; + int f = ( ((x_key * (uint32_t)d) >> 7) << shiftBucket >> shiftBucket); + + // Step4: Interface number lookup + if (TbucketArray[f] != pn[i]) + { + fprintf(stderr,"############################################### \r\n"); + fprintf(stderr,"testing fail for %s \r\n", funcFileName); + fprintf(stderr,"############################################### \r\n"); + fInput.close(); + return false; + } + } + getrusage(RUSAGE_SELF, &tEnd); + + fprintf(stderr,"Testing success for %s \r\n", funcFileName); + float tu = diffUserTime(&tStart, &tEnd); + float ts = diffSystemTime(&tStart, &tEnd); + float tTotal = tu + ts; + fprintf(stderr,"Testing time for all keys:\n %.06f sec, %.06f user, %.06f system\n", + tTotal, tu, ts); + fInput.close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF/router_mega/Tester/PerfectRouterTester3.h b/RHF/router_mega/Tester/PerfectRouterTester3.h new file mode 100755 index 0000000..3f06ee4 --- /dev/null +++ b/RHF/router_mega/Tester/PerfectRouterTester3.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterTester3H +#define PerfectRouterTester3H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TPerfectRouterTester3 +{ +public: + TArray TdArray; + TArray TbucketArray; + + ~TPerfectRouterTester3() + { + Close(); + } + + void Close() + { + TdArray.Close(); + TbucketArray.Close(); + } + + bool Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF/router_mega/Type64.h b/RHF/router_mega/Type64.h new file mode 100755 index 0000000..a77e44c --- /dev/null +++ b/RHF/router_mega/Type64.h @@ -0,0 +1,110 @@ +#pragma once +#ifndef Type64H +#define Type64H +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#undef XrossCPP_In_64 +#undef XrossCPP_In_32 +#undef XrossCPP_In_IA64 +#undef XrossCPP_In_PC +#undef XrossCPP_In_X64 +#undef XrossCPP_In_X86 +#undef XrossCPP_In_ARM +#undef XrossCPP_In_ARM_thumb +//--------------------------------------------------------------------------- +#ifdef __GNUC__ +# if defined (__amd64__) || defined (__amd64) || defined (__x86_64__) || defined (__x86_64) +# define XrossCPP_In_X64 +# define XrossCPP_In_64 +# define XrossCPP_In_PC +# elif defined (_IA64) || defined (__ia64__) || defined (__IA64__) +# define XrossCPP_In_IA64 +# define XrossCPP_In_64 +# elif defined (__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +# elif defined (__arm__) +# if defined (__thumb__) +# define XrossCPP_In_ARM_thumb +# endif +# define XrossCPP_In_ARM +# define XrossCPP_In_32 +# endif +#elif defined (__BORLANDC__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +#endif +//--------------------------------------------------------------------------- +#if !defined(WIN32) && !defined(_WIN32) +#define __fastcall +#endif +//--------------------------------------------------------------------------- +#ifdef XrossCPP_In_64 + typedef int64_t sint_t; + typedef uint64_t uint_t; +#elif !defined(__LSeRTOS__) + typedef int32_t sint_t; + typedef uint32_t uint_t; +#endif +//--------------------------------------------------------------------------- +union TX64Data +{ + int64_t i64; + uint64_t u64; + + int32_t i32[2]; + int16_t i16[4]; + int8_t i8[8]; + + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8[8]; + + double df; + float f[2]; +}; +//--------------------------------------------------------------------------- +#define x64Low32(x) ((TX64Data*)&x)->u32[0] +#define x64High32(x) ((TX64Data*)&x)->u32[1] +//--------------------------------------------------------------------------- +union TX128Data +{ + TX64Data x64[2]; + int64_t i64[2]; + uint64_t u64[2]; + + int32_t i32[4]; + int16_t i16[8]; + int8_t i8[16]; + + uint32_t u32[4]; + uint16_t u16[8]; + uint8_t u8[16]; + + double df[2]; + float f[4]; + + TX128Data() + { + } + + TX128Data(uint64_t vL,uint64_t vH) + { + u64[0] = vL; + u64[1] = vH; + } +}; +//--------------------------------------------------------------------------- +typedef TX128Data int128_t; +//--------------------------------------------------------------------------- +#define x128Low64(x) ((TX128Data*)&x)->u64[0] +#define x128High64(x) ((TX128Data*)&x)->u64[1] +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif // Type64H diff --git a/RHF/router_mega/embdDbg.h b/RHF/router_mega/embdDbg.h new file mode 100755 index 0000000..f56dc17 --- /dev/null +++ b/RHF/router_mega/embdDbg.h @@ -0,0 +1,21 @@ +#ifndef embdDbgH +#define embdDbgH +//---- -------------------------------------------------------------------------------------------------------- +#ifdef __HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#include +#define logEmbdMsg(...) printf(__VA_ARGS__) +//---- -------------------------------------------------------------------------------------------------------- +#else//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +inline void logEmbdMsg(const char *msg,...) +{ +} +#else +#define logEmbdMsg(...) +#endif // __BORLANDC__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//embdDbgH diff --git a/RHF/router_mega/input.txt b/RHF/router_mega/input.txt new file mode 100755 index 0000000..c86699a --- /dev/null +++ b/RHF/router_mega/input.txt @@ -0,0 +1,10000 @@ +2861498860 +538874397 +2884970994 +955125036 +3481923597 +4023014517 +452306420 +2686122881 +2102814866 +1543734688 +3816350532 +3841160498 +3963119138 +922404466 +2036972307 +1705535499 +984531147 +632377809 +2535208120 +2736938665 +361421618 +888021451 +1992422465 +2590943442 +3555072675 +3403805089 +3970239682 +2514706003 +224507947 +656608320 +167189887 +1332681492 +1132203992 +1633750777 +1156037352 +3435200593 +4040368592 +432439924 +374071162 +4201577549 +1157933667 +2989295453 +864861915 +820979215 +3103456509 +1859991325 +1402959268 +4087957561 +4045321966 +2622802380 +1624384166 +884304166 +3238063403 +630146915 +2032758741 +670596532 +2875077786 +2349706594 +3400556235 +4059982738 +1011286726 +155877544 +1849547541 +474396246 +2055384093 +2398313517 +4018505308 +4089257323 +2958070855 +404930470 +1972861984 +1172226557 +341216918 +3263985995 +479107136 +1902793150 +3577003933 +819904387 +1595971764 +3580048896 +4207832057 +569718531 +3708966298 +792660783 +3247168844 +396295014 +1517022243 +2356109383 +2454992254 +1547386168 +2805995800 +2342241127 +20956159 +2393103766 +1093647782 +683210020 +3025282122 +1401462953 +1763662743 +3019007060 +705675524 +713720628 +2353438368 +2152453594 +1535995727 +3982350732 +340973073 +1862095641 +601954692 +707444174 +4077523347 +4012254943 +4124376599 +4007992567 +3149874012 +3429401733 +511715420 +782894591 +108121287 +2742238679 +2095210051 +3888465285 +3686478589 +3042501967 +2611795099 +3689178407 +214446974 +905348299 +2562221915 +3332690586 +1196610940 +479648610 +2025309192 +3702630017 +467907765 +2769589970 +839207402 +2436394142 +550864269 +2485299361 +1854583884 +2161957192 +1549868016 +2012976305 +1363645615 +3708731137 +3615061692 +3305887671 +104509329 +3672175031 +3785540985 +840933115 +431829541 +2108144283 +452360500 +3421577449 +224584716 +2882750898 +2013814498 +3557381781 +3893239960 +2606213487 +218005990 +2716231195 +1529741484 +3362938915 +869272588 +1477508479 +335012619 +3695552234 +3662142345 +593662724 +3133248868 +1757562604 +2730112788 +2665745855 +1935849331 +3065059485 +3132663529 +160637473 +2852191501 +2259281226 +3122093023 +1423065112 +840313174 +1084848738 +2372516405 +1631588950 +2390501859 +3113256470 +158274172 +2744258407 +1483060065 +1574572356 +2122734092 +1793480239 +2791206438 +1586440491 +1680252034 +3780364752 +877994635 +4141036588 +3636777157 +2992332000 +2291713027 +2265412831 +287374844 +2989502565 +751315072 +1344989490 +1731514616 +710785496 +561739873 +946186246 +724686233 +171321127 +187102182 +2308631300 +1467350298 +2359752157 +2210486800 +2724302556 +20608655 +95998435 +2990834751 +1328926655 +305281877 +421064177 +1368277020 +481579873 +160728629 +2435826868 +2708092073 +3477062183 +373457772 +1999601034 +2294076468 +3464110692 +4066208093 +2221238487 +764015442 +1501195435 +1523639444 +2405310581 +2504945905 +124817474 +858296069 +1816989168 +2901210771 +2883422049 +1562560938 +1900767585 +2764349343 +3796776080 +1486077666 +4152125121 +2372893627 +3440346478 +201631315 +769714985 +161959460 +730651707 +4135192686 +3415556217 +191638116 +2440885109 +3292424674 +2996188285 +969461419 +731886424 +3268808255 +4265376307 +1666607886 +1705071509 +3603987272 +1168629020 +1222925423 +4084313321 +173183736 +272153629 +1652261711 +1787623946 +3629862089 +3086104155 +3682551638 +3629243410 +1422324671 +734621069 +3893604589 +3151997439 +3550727618 +808157710 +1410293331 +172307435 +1939548034 +3960418650 +1153845820 +415729283 +2431245861 +380710555 +2049413387 +2458302114 +1354376849 +1181655714 +4053947567 +2747282301 +3467065714 +1255601394 +3726361233 +95950334 +359814828 +2009902034 +1089312384 +3329189038 +965855681 +2396348254 +2191111536 +3747209514 +1151065923 +2701916919 +3693411499 +2371415881 +1075774902 +557918012 +2604367212 +411456522 +780577214 +1177865763 +1230174069 +2975243800 +1567452695 +4030842679 +1541530725 +2201098619 +478053286 +3027309824 +443141984 +285979863 +1425679865 +3620258195 +1857049676 +2109001185 +4276513905 +287430312 +1644689549 +1444017668 +1413654243 +1365549954 +1204528307 +1199909242 +1073682674 +3442599234 +3695226321 +324941820 +2525085279 +2103644112 +1818240248 +3467261808 +2272206828 +2609070241 +1741068080 +1843757665 +3201344131 +2288125025 +449361001 +3463626260 +2023936645 +375044275 +241526182 +4045085635 +2169405428 +4162003939 +1566312522 +532290727 +156182543 +2568140688 +829983565 +1002230389 +100086339 +2421712838 +2677924688 +4097769372 +162088659 +2645881788 +2073244664 +4194671044 +2720296960 +623807259 +2000282237 +3208660157 +3224797472 +3755330383 +3543029857 +1956783556 +1337805988 +3026338831 +4062220970 +3621336037 +1686770520 +720871481 +1341205444 +2709739213 +4241803513 +2878799494 +589767416 +3757143934 +1542688963 +1847088957 +18602377 +1095751679 +1066054743 +1684750792 +4251888205 +1507592 +4003254509 +3055125331 +3561299300 +713608019 +783278470 +1576218540 +1071645329 +2879074438 +3265100048 +3370406227 +1637389888 +992144303 +1015868120 +3574851303 +681641608 +4209778292 +3809503110 +3469943037 +455235296 +3652734833 +4118802426 +434412774 +2277702160 +1818585174 +3539793219 +81815933 +65812981 +1475005068 +2966249063 +1702397384 +2646776713 +1453456432 +1936272827 +47259463 +1698241541 +2074825154 +3606285284 +1470080018 +1156201480 +2635845455 +2601542336 +822907609 +2421872341 +720516660 +2920008974 +2328182178 +740261486 +4052502604 +4054220037 +2588984523 +3538456977 +1873202006 +510750048 +1384779413 +338483377 +1030299107 +1060129625 +119215487 +3535834833 +1954717854 +4285568603 +3008959896 +4103491755 +3126697012 +3682993299 +159551159 +1730263752 +1132014013 +1902492611 +515049073 +1699348221 +2488422623 +2258085426 +212640284 +226267206 +20198293 +2459089031 +1455334843 +834786184 +3723766151 +24554342 +2425812458 +1026292653 +165671521 +2397570825 +1178045891 +1121742092 +3204386904 +3781660079 +2429842068 +3446279536 +2741408015 +4040922895 +1965615400 +1294740389 +1483293762 +1375161572 +3974440823 +1830313797 +4008444201 +1499045525 +2603807905 +3565264716 +761994886 +691266022 +625535694 +913044001 +1021300787 +3065879913 +4183693518 +368998050 +4292835837 +3791756531 +1698953315 +2420027445 +3169058410 +2048530574 +2890105462 +1708882467 +2920368244 +2707243378 +1239532990 +3461637877 +383394373 +1610126110 +2431548813 +2798971708 +4146813199 +506167898 +2260684029 +1936068371 +4186787567 +670819011 +2217690504 +2794762805 +3085832243 +1807187948 +178131849 +3162456588 +1251272278 +1097205339 +799618520 +461617504 +3005296296 +1532227729 +169216511 +2146981758 +421925961 +4183938516 +3063288075 +3556191182 +393699137 +2909126728 +3990772323 +4145958993 +1835498182 +4089504240 +3499228769 +3667462487 +1128102210 +1760370517 +47445916 +476670373 +1698728409 +1223807353 +2794183289 +3905126523 +1419133429 +2467591556 +167516273 +2563027451 +933517683 +3007914077 +2277117106 +1489371275 +3708629116 +3494108544 +732676894 +94860146 +2194640 +2795351552 +505125274 +3946122466 +595140008 +178525270 +2617506228 +103852046 +674783066 +2966407390 +24882349 +1128678928 +4051776488 +3123998572 +2563620900 +759803487 +3789209629 +1927424049 +1148426212 +2854730839 +4000433447 +1384660526 +3866263009 +3786490733 +2480707368 +2404597598 +4158864309 +2928380465 +2134991870 +382462546 +1291542263 +1997254427 +3012764792 +3200033485 +3737494583 +909262089 +2728845249 +313605155 +963097095 +3970051450 +3142749820 +1352082327 +950070275 +2553976760 +4240474530 +1725716201 +4099969902 +1413547639 +2781714950 +1879767878 +3875509486 +343830844 +1082990743 +3604144458 +4132571379 +3295994138 +2499071941 +374334964 +739142110 +4230360157 +590507141 +4021308219 +322384693 +366056191 +3854621120 +3509950666 +195827923 +3931422197 +3160387895 +133509852 +3346221674 +3412434252 +1945877923 +755859655 +485820951 +203137531 +995491834 +3919829925 +1821630900 +1860950952 +1982910560 +4178401497 +3729070758 +1968884312 +4197502196 +3715427488 +1301102013 +323746002 +3133976451 +321640909 +577158467 +3406494346 +606846639 +3023350803 +2605659196 +2385807982 +3859244255 +253377429 +2574832959 +1462884053 +1470698334 +4084771893 +198892844 +1327147316 +3886070951 +721844026 +3679315144 +1971159977 +640567693 +851594053 +2721038696 +844320707 +941337992 +2510448049 +2743587853 +1376743705 +842493052 +1902179211 +3865956859 +3734685596 +2837395533 +2371588830 +216123923 +208207821 +1576115450 +2548805262 +3437032737 +2950702366 +1433673262 +3947092549 +50326333 +1815375469 +2976508734 +3460023431 +2235730418 +3546781275 +2814632528 +3926418951 +39640996 +917504983 +1400934613 +3382875894 +285669319 +900406426 +2425732403 +301524987 +3582694915 +1698732222 +1725128860 +51258096 +1200007219 +3560035338 +1283418742 +426532475 +3244268167 +2204879475 +2341270412 +2153609873 +4208843254 +3412320486 +829138263 +769324122 +3341381531 +2437395886 +2158768896 +4200889659 +2903139180 +2764275666 +126788711 +706274184 +2767085187 +60933692 +1867549611 +703684304 +3852788253 +1188647502 +1773658994 +1941080404 +4253084053 +2200499531 +1297383254 +3948792224 +1090712509 +3305372803 +4182658625 +1617125583 +3814193531 +1964939248 +517695365 +2362318840 +768809213 +181997101 +1620357699 +4056310849 +1346069424 +3202653651 +1219889741 +3054381742 +600821458 +1466672512 +4194164544 +84204832 +2353390456 +3071590004 +3880043794 +1721263387 +2735908975 +1500442932 +1449841867 +1829944341 +3860038257 +3495357222 +1096018415 +2431441148 +3114269500 +1676664899 +2374616105 +3181797335 +2640306614 +2963775677 +366503644 +3409936666 +2664863080 +1177988998 +1134768193 +1547863621 +1307422622 +4082453210 +3543163655 +3372846797 +3971788066 +4169558809 +3525385553 +1466510156 +2321279534 +2455498786 +913242281 +1409250134 +1403042371 +766609600 +3030032708 +1451123455 +371048214 +635383608 +1385213594 +2327487022 +4211545735 +255902173 +317147838 +3347857948 +1337169273 +438881430 +4274504189 +132654761 +3190439411 +1025959578 +2729299317 +18981104 +1198909533 +1371457620 +968839770 +664865150 +2623640658 +4205817293 +2523219693 +454669570 +516794725 +3928713918 +3999218376 +3890388253 +1605807398 +998088737 +3953892002 +713771330 +1373703685 +3667967238 +986586241 +3815958476 +4213188482 +1954289115 +1531082745 +1394927910 +1365124742 +2450910401 +846828689 +468214246 +1911227146 +1961901558 +1726378030 +3436024451 +2628331093 +2564993314 +3232776468 +4197915899 +349757923 +1170487041 +3656089561 +2089004530 +3115119736 +1047800390 +120020062 +4259904985 +429995885 +1317608882 +2741244043 +2404118039 +3481234705 +1020205007 +674992205 +179955800 +930602634 +697919489 +913381397 +919598230 +899071834 +2787632127 +1833856809 +2308308088 +1471125037 +585776583 +1727692059 +938241378 +2522572467 +399169426 +1213249267 +1757509479 +2794899641 +1966838383 +3467087944 +1245048906 +2086544466 +570485730 +2583881079 +2955411923 +3624320052 +3536550790 +3034571909 +3685008568 +3558036096 +2366847662 +2640840212 +662241601 +2987303660 +1110383205 +1042951961 +690629232 +1447556278 +4238330406 +520095259 +1175939805 +60991930 +4189082158 +3453714089 +2778140263 +3274092631 +181323960 +2924447234 +3123056012 +494399332 +3408752284 +3939493656 +3133052820 +890088190 +3267787593 +2596430830 +1492614394 +1644119101 +3064662003 +2667716853 +2732597650 +1267301810 +2551759466 +2994980660 +32761679 +1179516931 +3576117882 +528902197 +857965533 +3277352275 +3111343937 +749689384 +1567788842 +2880983467 +3317458108 +311147234 +1739223663 +2577464059 +2307444537 +2246829807 +1153008849 +754662338 +359978739 +1726566387 +1572970619 +709599364 +1539326056 +2285420239 +3122962013 +826618192 +1484407833 +619368944 +3854573295 +3508705601 +1268241324 +2023120175 +1002062107 +3128931441 +2654268325 +964849996 +1407509481 +3607924245 +4137919629 +3218555250 +2580728655 +827235384 +2736345881 +195067403 +1859936801 +2623083933 +766073308 +4044587891 +1635182782 +2989680794 +1456928712 +1691114215 +1742091784 +2417028011 +2840279795 +3530067180 +1391323052 +4181973078 +1107064023 +1407163119 +3036438357 +1125521087 +3944593953 +742283908 +106751215 +3552867429 +1085828402 +1091952161 +2224708511 +2019602064 +3417312650 +285596977 +3852141209 +2406133795 +1941654876 +1921991824 +1079069887 +1936091093 +1978331654 +3376578127 +2716927464 +2297202893 +781575543 +86124136 +2133799428 +3019149993 +391642995 +506677615 +992150011 +770792788 +2281473517 +908429396 +946264677 +2014043735 +2252581600 +3393484034 +558240634 +3499172762 +4278492569 +3761718535 +1516498934 +1694450183 +1780858952 +1637612173 +3340971155 +676128637 +3049019539 +3719177842 +3375893884 +1344006628 +629467643 +2323466110 +2873855128 +1310528682 +3899261782 +2872283478 +1372112510 +478490311 +2409576406 +2838886571 +2917631090 +2377817114 +230750763 +4055085750 +795772065 +3938774845 +2770567223 +581366596 +3665156476 +1782969178 +2204738342 +1902020852 +2636202331 +2072522424 +1513801768 +3948094253 +2660748457 +131480027 +2854553468 +500195920 +430753576 +2164689174 +830164837 +800692482 +74755066 +1831890927 +4124678994 +2389358384 +3736008793 +2568094159 +3595700913 +1451771895 +286328361 +1885714491 +3498555305 +564826886 +529628755 +667684273 +427603534 +3245623276 +3753123410 +3476656029 +2007908698 +2463635613 +3395006246 +2725040314 +1669910233 +2837757871 +1922940863 +2149463697 +492974454 +273966321 +3497615342 +2378189070 +2693297660 +2475629644 +1555256081 +3640589876 +2078041146 +508638381 +2389102400 +3626568372 +207530138 +3282182254 +4080586339 +439707068 +250824388 +3669269858 +3199526009 +2764736243 +1497946930 +2969487502 +2865908328 +2950314389 +2177225005 +2775888036 +332850159 +2576043449 +2165711186 +1398768880 +1015483592 +3104434462 +2385764104 +1754114777 +3588147611 +318029526 +1762058977 +3939251101 +1463913979 +3078554727 +4105505375 +545271439 +1972636637 +504415633 +2219247860 +2421592154 +4042814101 +373866293 +3333992300 +2494238567 +1543842661 +3366799066 +1847073255 +704054708 +3831723947 +2580995307 +1322088783 +323617968 +3280729611 +3183600334 +1475283670 +3927637399 +3581014902 +3843550340 +431473572 +457456128 +700833777 +385574602 +1837474429 +2837326369 +386813757 +2556231971 +899170961 +3583572203 +2152979017 +4290222143 +2906211788 +3152116227 +1336963826 +3485291855 +1597535123 +4187109493 +1962044331 +751552360 +3374145652 +4283999955 +1762763270 +1542247015 +69711498 +3102054702 +1032474548 +234402238 +837968121 +294264482 +39072260 +958692058 +3644299624 +2743548185 +1221058749 +2348614716 +2706880553 +2929007856 +1789471049 +889426239 +3657412989 +300498413 +1901805108 +1082640753 +2863529902 +1457172110 +3496419279 +773872058 +3776338499 +426438745 +990771802 +2354184024 +1230276209 +3434567398 +3965743926 +196863151 +2438955136 +2660876744 +735352192 +3164129610 +3067162900 +957389183 +48125450 +1327719972 +2382199641 +4209969291 +3625563813 +3845091037 +1056624912 +2443636803 +2858297232 +1530072205 +4041286361 +2797880629 +3044024216 +1205207979 +1134572702 +3468368186 +3305989570 +2720209894 +2387998165 +3562946726 +1964220636 +632146396 +1311870670 +1455312136 +3734264411 +347135336 +289125322 +917862914 +677616621 +1656413759 +1867067139 +1021886214 +290418567 +3358654003 +974870066 +1771624151 +1936768264 +1681148574 +1392179728 +694991531 +412681374 +3208720170 +1674191986 +793920783 +442257291 +3077480027 +592595554 +1346236242 +91834143 +3135271846 +3806435522 +676599181 +1702770096 +1642976367 +852988370 +2389294001 +1736182646 +3927551563 +4220731208 +303276051 +4003686820 +2791922237 +797963496 +1328084514 +1984890742 +500220549 +1150298022 +1487970127 +3882533283 +3226473063 +1502267748 +2243075174 +2710047164 +245621038 +4119325840 +2138480342 +967152904 +1467806931 +646713636 +1295519588 +4031822546 +2585297459 +3171657989 +1367501167 +1345301513 +3236275046 +2120469173 +1196498853 +2149088673 +135867443 +2146788804 +3123552570 +3749319826 +4246595259 +723687105 +3700591966 +3498903595 +2013746061 +1927707522 +3956992316 +1742193426 +4230011402 +2574970474 +399842302 +1953587718 +3129212705 +2132249848 +4248203405 +4292826254 +3383986907 +3411805510 +1626869441 +389707368 +4249792723 +1397183038 +172558790 +3643128575 +2075135417 +3708364232 +2962712911 +284977016 +758874341 +3181384809 +3142003163 +2708095947 +1420312684 +85657057 +2249658184 +950790855 +2698934228 +4244928433 +658790249 +2488895246 +2744762164 +2026680957 +1082474897 +1779487995 +1746704705 +2588083660 +2416190302 +266796250 +1576748988 +3716238619 +3515963939 +2254605920 +3765644674 +3710334982 +1654420468 +626615537 +591346655 +1039580119 +2399572940 +4033509163 +845058679 +1671124111 +4284167396 +227386726 +509090428 +316019088 +151818752 +3692524126 +2828222055 +1546564842 +639578196 +2827457348 +481454850 +672088225 +694481270 +370414097 +2105682549 +3661625913 +3847342326 +225556398 +4015661436 +935483918 +2777096363 +953569038 +692952710 +1868589813 +2740809723 +3816524582 +2341227715 +777715318 +3472478637 +2968135896 +464858102 +1349335792 +1255324974 +3684690477 +1176588050 +2998655245 +4280219389 +3328508307 +996399760 +687464530 +2206749705 +2454770637 +1572323447 +1457327950 +3441491867 +2347927127 +4231592261 +2131467975 +4225684533 +3750425911 +2902476692 +1831989553 +3264276515 +1294776675 +4218106465 +2899825003 +3325369119 +1794400428 +233989359 +2978117040 +1951415543 +2441875427 +211210340 +4136831823 +1805790624 +2851648022 +989280982 +296493985 +2956082364 +3893147438 +2595362419 +2791263424 +1307725008 +1300372767 +3557416253 +1222356451 +2438285535 +472224698 +2572821188 +1426798475 +4075417465 +1378228133 +3509889661 +395729018 +892330184 +469084799 +2891417560 +2593180647 +365853403 +2545947719 +1514108006 +1950604176 +362853718 +2394463714 +2312610337 +2778411609 +3081160125 +3880710807 +520383980 +3320436030 +2864663272 +3507676232 +3192807676 +1502749323 +1617949061 +103629321 +4255229602 +2605369924 +3856036167 +1822986851 +4187137153 +293950781 +3089133197 +3016598883 +3915299365 +3689149859 +1819038543 +1561748507 +2263051377 +4020936656 +2400140578 +4200906346 +1918434123 +3876146511 +4058735980 +3372388589 +1578154856 +93567378 +3076705024 +2702606871 +1830945437 +1840949190 +2933619734 +2401407845 +2801406319 +2855473825 +1332715583 +112513828 +3736337040 +149364486 +4159448866 +1119563663 +2066933528 +1623335156 +2968960492 +312995342 +397838019 +3180784070 +3755908336 +1418036807 +2718348544 +1960623951 +37206374 +3505849515 +517436664 +1543041191 +3092858927 +3273994492 +3627442259 +674957816 +527158251 +2286335328 +440022964 +1457400408 +2825757371 +1040997493 +472232280 +1042472923 +2475715739 +957284000 +3197319206 +863184160 +1572715831 +1489584472 +4164292632 +880255163 +1000280265 +2462713279 +3166090283 +1314200974 +4093569083 +3175701794 +3603168638 +3110473263 +1116057255 +3768529292 +1054268074 +2217481039 +3913419671 +2815295562 +1190173418 +2283240796 +2431165419 +2759516183 +4289525146 +1147520490 +1252927486 +1221212322 +653406020 +3150605799 +3559007670 +3545461180 +193988687 +2489186425 +781577866 +1753778781 +3548309472 +2853405758 +3251997616 +1089894177 +1556188061 +879134831 +4051196187 +4210602705 +2014194193 +2412680478 +3643503449 +2095751302 +3495770748 +3912667613 +2530277176 +73028723 +2834215390 +442830313 +1733095978 +672539568 +109474882 +1598433378 +1979873009 +372399337 +171589825 +143800277 +1696436794 +1094496170 +4188604537 +1519210011 +3767473797 +3956477365 +1440398144 +1665243006 +215549129 +1965218622 +1183007178 +2922674683 +2903177039 +2339952603 +65514937 +134626212 +1386214374 +4043221547 +2000203276 +3795126282 +834918496 +2281350778 +2556505544 +1332038270 +2362881647 +1836952613 +2290105776 +4287515446 +599438727 +1441397185 +1368295523 +1444423988 +2291074752 +791867980 +2120155066 +1422130535 +473406216 +1142906131 +2447992104 +3270148211 +459557915 +3516412013 +2322248997 +969543363 +2381908085 +3030302770 +3247269804 +1938580995 +1557254971 +955011420 +137874667 +2879242971 +3155192962 +2045965861 +1986236169 +3842186454 +3221957191 +1119476692 +3978466435 +3618317189 +1298034713 +2972114369 +3036109772 +2629993938 +1808628768 +611150766 +852793727 +2973388804 +750870595 +170592819 +1338677384 +4076498574 +663416254 +2976358658 +484522280 +1891785544 +2656828027 +3533790871 +1533244560 +1783163356 +3742534905 +4189262749 +1967212448 +3010741159 +4029896101 +1835177698 +2688260591 +3565149296 +870744808 +3831050717 +1782224164 +1419545891 +1966153032 +901272900 +721885063 +1753659274 +3962317387 +2909643850 +3414199013 +3218321831 +3873769691 +3084098496 +674678927 +2835747354 +3233797857 +3437936776 +1363083500 +3497919331 +3614212849 +1389873388 +4199593681 +3087287671 +4147323706 +1781304322 +3839762825 +1060073424 +2987823522 +311345438 +3319343575 +642320371 +960695869 +1673987029 +527645582 +724708596 +1822437314 +2746757863 +310026428 +242731315 +1141439252 +3330757546 +3372863919 +2414206019 +2557179005 +3442105709 +3058234476 +3618671496 +2464028187 +3413136724 +3585040364 +981973671 +681605477 +909482606 +3408733431 +2536238280 +946024162 +2136551926 +4260624982 +917109869 +3603957270 +527904031 +936489591 +1518291755 +1329066370 +3926969620 +1741428999 +1045355176 +3994414527 +1160246722 +2875626228 +4073031517 +3185095282 +3190677115 +3529472864 +2003694679 +2338355234 +1139528633 +1404501098 +3360037317 +1582678696 +593848262 +2562746181 +1630959120 +2798381383 +21646775 +4226554196 +1197578155 +1487316137 +2318905339 +1211167226 +1391332108 +2066319695 +2681058266 +672836252 +3150808612 +749932675 +3411600203 +468312977 +1029413994 +50297315 +3824741022 +1954383056 +629729752 +3534946017 +2199815881 +2750182672 +2284184503 +1930459109 +4032445559 +62306583 +1474506266 +2143021115 +2924197286 +3598119663 +678658524 +2416982296 +3157220312 +2217186359 +3778309733 +2733017442 +2294346764 +3294577448 +1749902 +2835015015 +1032711102 +3059340754 +2351107559 +2571691232 +2691571899 +2142911727 +339635115 +3125835356 +750501513 +710028181 +1707534387 +188714354 +1789144130 +151549963 +1432413777 +3036825005 +3083686641 +3254881206 +1292204534 +2238554521 +463081792 +3832880761 +1512978810 +539203088 +67000859 +2756728639 +3025945921 +2856857617 +1704000347 +3158605028 +3166161740 +493765647 +3823735910 +417250757 +2535929697 +471989927 +3611884883 +3858423873 +1838334979 +3121664112 +1876583492 +3866033791 +2273311398 +3862077705 +2514273721 +2991207184 +3147832083 +1202308417 +2533475622 +4056574215 +2267792339 +2958005671 +534620703 +2859075349 +4115637097 +3766028083 +3389781149 +134671464 +2165593104 +2501244495 +1409691989 +3483220637 +3280642810 +743455759 +4036213859 +1190014430 +2334177013 +1825385672 +2125910393 +940799902 +4068938959 +1015552402 +2082740943 +2877549196 +3336842407 +296176379 +3988195039 +3417846039 +3052834914 +1295453728 +130962559 +986481474 +3940683164 +1447308834 +41298016 +3562271611 +1266305527 +3353035270 +3591754680 +1641406940 +1047038086 +2520268377 +689749084 +3628861105 +3553997432 +3736240179 +947370165 +2568129072 +3655197422 +2315592422 +4145460845 +1308252883 +1946063060 +3679995534 +1002523047 +3873329281 +874132336 +2596652805 +2912891849 +2743775053 +3056322843 +4237547172 +733839003 +2879320001 +1910566918 +4254892225 +3716355158 +3390505835 +2570735155 +581958850 +70843317 +3433910911 +1976752741 +2309093151 +405730926 +3396023857 +1312243988 +3106841972 +3449826990 +3920812330 +520234304 +3475921910 +2872598573 +3513083299 +701347916 +3530415958 +2266499195 +2424988579 +630312587 +3543774457 +3523991566 +3966442971 +98181553 +3820458601 +3293750073 +1723570939 +624057197 +208083378 +587045363 +2317773293 +2998661943 +3314631106 +4140459897 +1338188110 +3659666344 +590191272 +2482823424 +462057698 +3378043801 +731703431 +1244422765 +1417422202 +1180727527 +60982333 +1344965787 +2532432293 +2846610129 +1368877924 +3833730753 +1575476484 +1238901986 +2665827595 +2964746862 +1778051998 +2121576146 +560610002 +3308733466 +3240748834 +3640543834 +3297574182 +4147269405 +4049079496 +3610900537 +885334178 +2116992622 +4239385266 +3680045629 +3757459339 +3435804232 +2637694217 +3269931150 +2625274759 +2547325881 +4264441239 +1863999079 +1125691408 +1462102002 +1017035904 +3342599437 +1822144406 +3983489958 +1387968977 +116156107 +2154643413 +614316305 +2218579964 +2230677057 +3903821086 +3781261360 +1506660879 +3154810299 +1416033544 +2748518408 +3221458728 +4131244365 +3002630685 +58669729 +3587873643 +1329783221 +1139410155 +353223439 +1754849463 +1365792432 +2455185353 +1179433101 +4211052724 +4047133358 +1185658048 +4218770503 +2048812076 +2220390174 +2583669162 +1691897391 +1572609274 +1061448207 +3891539324 +3008145042 +894159911 +2370911973 +3085552134 +4154059534 +3025268030 +399465207 +2528530396 +1156663267 +348543156 +480938579 +85319784 +2717929197 +2101292343 +1747302919 +943168085 +4025109980 +2047424011 +4122575975 +4067681913 +2073651131 +372903841 +228618065 +1449000298 +2409836863 +3563368015 +399640792 +3409613457 +3110123821 +876906717 +589792423 +1721944058 +3951645688 +2488082312 +2562303605 +3534546027 +4010033997 +2728601367 +1789824732 +2104652553 +917941643 +1853223280 +1058168999 +2359284370 +2514026075 +4290878288 +1134511712 +181306342 +916936239 +239178315 +3690428304 +3968534808 +3046454831 +2092174714 +893257431 +283896129 +4123607500 +276066638 +2169767133 +1056220567 +1545026584 +1674110607 +1616405861 +1816921786 +503021040 +3099578887 +1284870685 +862785339 +2944972527 +3962654488 +4049857009 +3180348326 +4274976559 +619512032 +3202746495 +1461523451 +3729197796 +546012281 +485446630 +3638805136 +1204589309 +1944418240 +3490430106 +1193253182 +315145223 +1767741965 +2871722934 +887096100 +155479919 +70586248 +523526472 +2505004179 +712725294 +2481248710 +2591340669 +353951777 +2397326412 +2693953107 +1035610361 +3098465550 +3653002013 +1272266821 +286887131 +2078528281 +1837081866 +3172380193 +3286700812 +1265188842 +257603744 +1526159050 +3239317408 +3035256811 +342481498 +3145421763 +2861131343 +1724757242 +1855314551 +437914567 +3626459803 +1224209626 +1454782822 +555766490 +617159147 +2402684327 +3888046285 +3860441283 +591065601 +3281721592 +882355477 +597719932 +2270863151 +2185106230 +2857285451 +2806462230 +290020219 +3647920076 +1353356359 +3659570038 +147917256 +240425574 +431572342 +4249747916 +4182175439 +2971308653 +4233704012 +1237742703 +3582323699 +1142510030 +3207347195 +2237589035 +2455770742 +3509976415 +3703776449 +1093644254 +2379183675 +2893736875 +139613105 +1958921963 +1003413787 +3591408245 +2644061402 +455299037 +3112939720 +1837282986 +2930665490 +2924339213 +881375428 +330915968 +3978315965 +2447092665 +1472760469 +1194017681 +176915125 +3793737551 +2688281496 +2625675273 +2006932892 +733289600 +3445581525 +753263046 +2760172836 +2124834590 +2780584626 +1719948960 +694910809 +3957177732 +2043602237 +3605504003 +2749138612 +1269766255 +2488353364 +3458446197 +796267265 +1850526686 +605135684 +1153556960 +919553465 +815629686 +3926566318 +1337401028 +3682118596 +3277383508 +907118819 +3458106813 +1538560792 +2642464088 +2760964834 +683718079 +1778772333 +667794807 +3581160937 +4249563928 +1983088290 +4017045972 +1435186269 +3676304887 +3436211187 +1593631568 +2332683154 +3181479195 +101877162 +108574531 +752333880 +1840421373 +2417524584 +3452898912 +2913694947 +1111621037 +1216660927 +2804498390 +686831085 +2651205199 +69377012 +3521019317 +4103615865 +3391685284 +2707870966 +2628603360 +3467429278 +546630790 +3162702746 +3660071557 +1253046394 +900670818 +2492415580 +3814318748 +300486535 +2294195364 +2019925105 +3924752794 +2579615807 +2495641659 +3955957104 +704995150 +1596897620 +3353717579 +3550753921 +2545703981 +141583252 +3417245029 +887242873 +2926913025 +1604091200 +3277652355 +2053137324 +2495677662 +765575392 +3231942150 +98130388 +1850881689 +500888882 +1265283363 +3167142483 +4016936965 +927756403 +1506313135 +1612690862 +4274304303 +1320414428 +1128871478 +1042051717 +2317166085 +1926820513 +1153250044 +476930940 +2269332122 +566320372 +2899451163 +4061322630 +2968171984 +727839765 +3953390712 +1561971005 +1484471403 +4209216530 +3652583660 +1345599669 +1373112849 +4129406447 +3586858993 +2013915842 +2618215324 +3543970282 +291473699 +1900271913 +579065028 +1445577148 +1734764636 +428689645 +2047704357 +3457282875 +3435323372 +615880312 +2120425937 +1537757191 +1230771292 +4123226458 +4069481615 +1750721099 +1362221706 +2946242187 +2945936260 +2426719228 +495687496 +1897491422 +1109070653 +3584388869 +2965019429 +709537929 +1825757391 +1847313522 +861976944 +4260205452 +3551543015 +1473060386 +1459268762 +2353092224 +2983993522 +3071605594 +483150959 +915942819 +4244239349 +3352357314 +2899033333 +2231930403 +4271016942 +1611584324 +1944185439 +2982619739 +52883924 +1230596604 +1226552059 +1793713260 +4087295303 +1624521400 +960809925 +3788478381 +55992491 +2092267855 +140175292 +2042532758 +409416631 +3633378798 +673305381 +2009686307 +3823405292 +1915097991 +3043890866 +1274903863 +186882025 +3134033686 +1338185984 +4202062181 +4026622659 +3920172125 +2892731542 +77176520 +2432998869 +4231668537 +1780069028 +2479641534 +2027541024 +2617465503 +574060272 +646195834 +2336699811 +3816221104 +3293511181 +1766247593 +2620169039 +818947700 +583180522 +2724420558 +3707638773 +1522602916 +3269237804 +1167894482 +147571080 +3520407319 +2394067188 +2647602816 +534805898 +1116600136 +1236482483 +2278400234 +2230700652 +2487434801 +3159188011 +4018616908 +876514618 +4213702225 +3994615892 +481621182 +2043787763 +1599792205 +2164161393 +1940582824 +2301482726 +1339368143 +601361432 +1812864019 +1119697930 +3429907372 +2986327790 +1193507648 +381560819 +2886478439 +3537628498 +3917602596 +2063848581 +1828728030 +728634271 +3847531094 +741838794 +2221933571 +778290714 +1624348815 +203740908 +2978019285 +2484073926 +3326513800 +1150132983 +2092331967 +1679183902 +1567379478 +2909093570 +2785099744 +2546706175 +4088620546 +993524613 +128397165 +1635228560 +2798190147 +1659701114 +4115611305 +251189273 +3158386685 +405185990 +4180132512 +182226180 +3739875880 +647812254 +3160427458 +4178741895 +1592892883 +2239872965 +1670530732 +4001899731 +2287923750 +1664877726 +1148707621 +2720141652 +3312088019 +3363899802 +3508474832 +2149736958 +563260003 +3735639813 +1786272085 +2872036885 +3876053494 +1378560060 +1115324571 +3862670091 +4133303638 +3458851552 +4024851211 +1114397209 +3593850164 +3788670887 +1960058894 +1931299631 +1291252227 +686514016 +2327192136 +1439651304 +2909853790 +10643866 +2983181704 +1815610277 +440517640 +60545619 +4039382759 +1180101444 +3939079178 +2424946546 +1171115789 +3204290741 +1011199030 +2883806370 +3598810992 +646234185 +398960552 +1589792095 +4014627745 +3020984507 +3791407166 +2803210157 +39958882 +3556956866 +3359296726 +1663791225 +816810821 +1022249451 +3070916455 +4024051876 +162501551 +34734252 +474668577 +1293795135 +1427868940 +1415072246 +4175104133 +239560076 +2832167198 +1536139959 +2484814431 +3580896917 +1086090823 +3777354849 +976007859 +3138896329 +3804532703 +1359489854 +120426470 +138445615 +3493817474 +1369434188 +2054877620 +4074876750 +3847055164 +3449485536 +1522782794 +1966260098 +1336310434 +3465317035 +752574712 +2505357953 +2351397846 +1972120527 +3642583779 +1804834314 +3511267820 +2166021766 +23469741 +867164904 +3579820213 +1811029422 +327306994 +3755735784 +2753769954 +1001260352 +3240659724 +1460629871 +4143243837 +2160439503 +1527985956 +283298003 +3272311076 +1721675441 +3355305663 +1287924298 +3872961587 +2761006046 +880508729 +3508830817 +2933594947 +4176829079 +1948115109 +4274571295 +911892657 +446475305 +4250377164 +953094396 +3024636279 +1664227828 +3587647852 +1702630044 +3653623612 +3365688915 +673863904 +3196822240 +2736567713 +807192783 +2159912913 +3550734795 +4232840834 +540111583 +2213396166 +3614801799 +3785683983 +2828730473 +1387202617 +3262961006 +1287147506 +4013859825 +4196462471 +2327301849 +895031256 +3389174449 +967326046 +3684776205 +1707904932 +4091656982 +2113041463 +791071974 +20524455 +3181807148 +3706926936 +2448238497 +122186702 +3480872764 +2226682749 +2580338112 +1535900716 +2946194043 +2637374773 +3367677639 +4164123644 +222131265 +4255360488 +4092117181 +3353416993 +1337575243 +2047468006 +978213222 +3000395650 +3264852132 +1935145696 +554022652 +3318096365 +3099825827 +2745109632 +917672276 +618501112 +3423980576 +3880725741 +1796989509 +456887690 +1805188258 +2480264640 +4133908519 +1439785858 +2200640015 +1560482324 +1857115954 +2941486269 +943192565 +977611551 +4011944304 +2724621788 +3035596865 +4253054498 +1023949920 +3720702667 +2463738988 +259383664 +3067653320 +2272881370 +1596905751 +3232025444 +2222532567 +3829657832 +2643897108 +3881632560 +3588385846 +2492619040 +209837514 +2856407056 +806133587 +1006587327 +3982386845 +204688831 +2922318100 +801078712 +615322702 +1631824259 +3453541462 +507823991 +1050166476 +3372328060 +3870076460 +3584572481 +2845104979 +2899344591 +1741721887 +3754497246 +3337405838 +2063569175 +689655092 +181941086 +2692155345 +76255394 +2486816583 +1124601577 +2669461928 +1575299584 +2655705049 +899260232 +262298307 +1659864988 +270036991 +498106967 +1392132870 +3206717511 +4184055560 +2474939575 +3620827204 +2646378619 +2039360512 +3341404992 +3694504978 +850847949 +3195409169 +330889071 +2947982617 +1503309245 +748665943 +3383064787 +355221882 +2959832928 +2886120753 +4156801622 +3054803892 +1354565557 +1993848820 +2986554767 +3710908426 +115746314 +3775564806 +2493901704 +3539813706 +564984584 +3686781124 +309129893 +1289661366 +476425821 +3050265499 +3737588309 +2271118851 +852939262 +2573154506 +104851298 +4134935230 +825496155 +3820429688 +2725572788 +3151600700 +546564169 +1339449251 +3154361067 +2987904365 +2414915741 +3663693521 +1237357550 +1005288831 +3136839510 +1912180507 +1460182527 +569176166 +2559345397 +3796315753 +2467340857 +1947574644 +3248469502 +3830271309 +2421458660 +1777602127 +1751629361 +1205845716 +3216084322 +4123837302 +3213884383 +2237029993 +3841895658 +2875481876 +1545087813 +2880852697 +1883396234 +1755740685 +4075980697 +2481044100 +3094604137 +2776451248 +1366398251 +4127686011 +1762134921 +3494504955 +766383201 +2095767921 +944336079 +471409333 +3928571481 +1401961671 +1634101824 +4283945533 +4113069598 +3053629239 +851194195 +1677644218 +508380865 +2080736750 +1845703116 +1796270707 +2761946734 +2040576374 +1998841212 +4184541584 +3312661055 +2493376214 +1527143736 +857099307 +3907800761 +1326819739 +2404798326 +1478011703 +2502823970 +1659582601 +733828613 +307786773 +1221265805 +1209292062 +3562020162 +2970490746 +2717032959 +2936701153 +2239423836 +2138685300 +2909155490 +810553898 +4086317833 +1595962063 +3146957314 +3658216126 +1788240451 +3459399211 +1994524283 +1892216884 +1793996774 +3080239129 +3057614559 +3507006822 +3059170399 +3109744897 +1024827327 +2429573319 +3986040741 +3394715785 +54275091 +676759287 +1948146886 +493931097 +268824119 +151374007 +1225012483 +2981230773 +3226269145 +4089725375 +2820032268 +2815687307 +2726923920 +840901154 +2901991780 +688939822 +2166583274 +3274168472 +907016245 +4273464335 +3174636318 +432492654 +1742744754 +1825058606 +3430316200 +3483785833 +876746456 +2405543541 +245974786 +2045033743 +3795717527 +1156486141 +3090338701 +2083422369 +3227238470 +2488118060 +3438919689 +3562850078 +3603323183 +3617964421 +1017912961 +2922592775 +1930586098 +404112881 +3605383791 +2606872575 +1712634854 +1706234765 +3117924093 +2423669569 +2639244868 +4023347841 +3862858485 +611178223 +1867119258 +723344588 +241772547 +2531543004 +13779570 +825509432 +3577117569 +2850742857 +2314478573 +3746115131 +2663336349 +2624455658 +180975663 +1863903983 +947828028 +1161167544 +2606043726 +2274422895 +414158687 +2803114840 +3546675072 +1045232530 +3809506644 +3350642821 +235333787 +500583158 +986450680 +3878193718 +2503031807 +3631329736 +2800533588 +3009594418 +1194183188 +2648649090 +3801099205 +69571050 +399525567 +1951482348 +4161500229 +3147454558 +2599700000 +2582216162 +757231428 +3141847097 +1160327239 +2571702188 +1227547821 +91172335 +2928764302 +3736124980 +1592532630 +2546327698 +673545665 +914402769 +857004667 +3767968153 +2497460102 +3042184258 +1499090141 +2796580079 +3361327927 +1052420484 +2746426563 +4215973645 +3916872195 +4061352545 +1168149261 +460843489 +966055360 +1275767801 +4103864957 +2964988396 +3270751176 +1404654274 +3935888563 +1389309141 +241845471 +3449851435 +1100207414 +1822062020 +3477666497 +2724267027 +1793664763 +3416314365 +3978867774 +2033421221 +775018110 +4099289150 +164485773 +4100728058 +1537716550 +1965446674 +2061296604 +4087238632 +660666581 +3579761655 +3536732081 +4255195113 +378839992 +4088364244 +3362441934 +3447479250 +2926245298 +745560828 +959079975 +775528905 +1993512800 +1976295932 +2423657970 +1737233652 +3940261730 +3346886576 +3266532455 +233357644 +150328546 +1453994008 +3825039007 +3524238979 +734673223 +3930047413 +1248842398 +526223791 +377992972 +169968448 +1256850754 +2241443254 +3515872227 +1423311720 +3372047105 +3368362433 +1329697068 +138928688 +1112781690 +608785942 +725584520 +2869191968 +3333185150 +4090064587 +1320454714 +790748931 +1390640781 +3208079453 +1814115617 +388438839 +3757016480 +740776804 +1899537292 +3663085476 +2682332645 +2802275954 +110249562 +1430736919 +1976821729 +2656439037 +854276829 +2376506050 +2824247488 +825599913 +1423935721 +1951094149 +571387878 +1199136424 +2786239153 +2551018171 +4058373402 +158446665 +735910731 +1167793266 +3161657477 +344567477 +2178795020 +2028434463 +3856664779 +2542974484 +3868131896 +414093236 +4079987224 +2675966445 +1794531615 +2685351840 +183924548 +1005024555 +4129401211 +1853620535 +58369304 +1833246080 +1749817563 +1000221397 +1893192527 +1711092049 +1449163490 +4189188271 +2024567187 +631056517 +2132837126 +1470316964 +1559793236 +2991162021 +3954559447 +1874228933 +2126654760 +3170592105 +3958813222 +1712811620 +1360247687 +747200754 +1475617887 +855817054 +1369310520 +2190342726 +47255060 +3026655751 +4174866675 +4126758652 +3934942247 +3961440490 +378738545 +545470005 +4200547346 +1687114821 +4282010611 +2224040946 +930363125 +4083710342 +4241863289 +1755930622 +3002277751 +82365682 +2279416820 +1561741121 +1638153987 +3148280623 +3421134864 +2444094859 +3237388010 +318586465 +3736030294 +2314569358 +1876060335 +2598802871 +2523816067 +1777313571 +2279733244 +796209402 +141807726 +776255092 +3897028332 +1472026714 +108444758 +2974524080 +1133291302 +1021770847 +2416651383 +399225468 +2491394697 +3532354931 +601008975 +647914911 +195285001 +2214134828 +3742747319 +3926783495 +1114709281 +1898035966 +2993063823 +1353007797 +2010192759 +978896501 +2196801141 +641307943 +808339861 +3884282080 +3058210286 +2251333130 +3813775720 +568292298 +2039178848 +2840915714 +2497173099 +2290352788 +4114962203 +2758743752 +2073588710 +1393098267 +2048692371 +339165315 +398369292 +3354771573 +1975251779 +2076968628 +1944151925 +3511406495 +550201120 +1294637265 +2747350555 +1009326648 +958349398 +1084644566 +1496021763 +699234380 +1719379073 +2017453108 +1579421331 +2654207520 +2126524394 +1720566410 +2294344593 +1883100246 +3929849536 +2102876183 +292725670 +666468319 +165807653 +3652736435 +531528742 +30059607 +3826666361 +230404814 +1948351349 +1938374805 +710633500 +1868990973 +1223389883 +623666020 +1164136379 +625415764 +3603579367 +3532576994 +2841436474 +3808935020 +2903739886 +425207026 +4268032040 +2395997940 +1358269113 +1665031312 +349386507 +1435084746 +828004328 +1551563080 +3381312740 +1265160770 +3662912000 +3187912684 +1704262985 +953811173 +2024349449 +2826854644 +1957661484 +2398250250 +233340394 +4193630341 +228888093 +2485809323 +1132111929 +1436540839 +935707174 +2999016495 +1095441160 +3747700707 +1327572326 +260247083 +2213613742 +3829451103 +4118793695 +3758171442 +2982848550 +4111131176 +1450883515 +2387725606 +3430893526 +1862142251 +1886356996 +2841082120 +3181734290 +1331201922 +1643433306 +163444346 +2727469679 +4268435796 +3563589463 +1217726467 +3221146314 +2527007768 +1443967687 +1690847010 +3598975533 +1008962022 +4262656698 +3619657446 +3317179852 +231329621 +4106132776 +431003563 +2336074294 +3072177494 +3039556024 +112797682 +3459957342 +1955564451 +3852953079 +3410024728 +2682783175 +2800235398 +581284247 +2647103025 +891027066 +1914753657 +193489677 +3205262842 +1105386412 +965199743 +2136738804 +4163537425 +4007274364 +3752597043 +936756635 +3163358090 +1607065984 +845896619 +4052437086 +3668872358 +2910213851 +1805080432 +2569118948 +540759015 +2703498241 +1653433675 +561483256 +3886314959 +981231253 +1282496843 +1294066162 +199773304 +1124297107 +2187428461 +809593888 +4259263599 +1185589396 +1325175628 +1538053772 +605424139 +3063273106 +4213087889 +1154825015 +687687759 +4168202984 +3192604220 +6430357 +3728472387 +2294956558 +436092569 +285007750 +2643795719 +553758856 +2276580974 +1502263387 +383546497 +4229270222 +3728598714 +2823330951 +2209987064 +1778680921 +1660655934 +1107378493 +1517612389 +4116725794 +1976824406 +2556207788 +1589084310 +4028955480 +3906759871 +2332709105 +2905948472 +983596950 +3348528031 +4150827293 +1835115947 +4283612338 +3283407027 +4243150330 +1883715861 +1089601111 +1496855821 +2445070420 +47353556 +4058287806 +1954329467 +354588538 +611980456 +2798608028 +3632702485 +641662657 +618678627 +2274869334 +1650127829 +3402835754 +1880213078 +2693629845 +3297798283 +2586677005 +1063736432 +2186259403 +4277976630 +1458179095 +1543570948 +2813495974 +1661790444 +1787603551 +3468649583 +2365870573 +3835392787 +1569675155 +2789177241 +2871070002 +44289815 +3561687666 +4264427417 +1032749718 +1791526668 +3499990157 +4252330402 +116860105 +2831869905 +2276032185 +2640868263 +2498966451 +348359156 +153164435 +2377519818 +3516998559 +2355989140 +1209571079 +619236673 +1832722434 +253081680 +2522731725 +1287165150 +4183820251 +3619952776 +2024115372 +4010932045 +135599415 +2530274303 +1819958081 +3692065474 +2247002978 +415893043 +337793862 +3988535114 +516569459 +2311337332 +3004913337 +167847139 +1933499459 +737033885 +3368303092 +2353580343 +1569196132 +260775848 +631822041 +1453048275 +2165934373 +1996319991 +1532049646 +785110424 +2948573273 +3358204485 +787336645 +3089579635 +1159905025 +322484591 +2552412826 +1264810194 +528242115 +2258112709 +3187537362 +638493119 +885887206 +2470269660 +1750183174 +279759863 +2434016297 +1801855468 +2885290784 +678398086 +659907727 +1285277461 +211327911 +3293665008 +2474586708 +3434105651 +21878545 +2547657136 +3367581145 +2501245488 +1677639530 +3646283698 +4258894230 +1169160915 +3239448939 +3918209672 +2058839824 +1489075292 +206899403 +3476443022 +2417069751 +1530875696 +3415348595 +3431061021 +1417336537 +3463501934 +1150279297 +3921771632 +1006458386 +1299124164 +464647532 +3009900045 +1364338045 +130128719 +1773693508 +369171718 +3829249103 +3984057682 +3688308300 +1104426736 +3300271980 +3715154442 +3387370149 +3999252464 +1409946283 +3815207087 +2142132933 +1500426618 +352959056 +960557162 +4150737919 +1449564852 +2807662641 +258268257 +3804736807 +2119860667 +2976857917 +939735643 +1122811283 +1193849915 +3605232626 +1952352741 +2539755181 +1845734527 +1238864299 +279727482 +542364957 +891483541 +1043956716 +650590695 +2437428391 +1454788582 +3418086715 +353962164 +525857861 +2902720074 +1843876395 +1080492233 +2164626154 +1303422828 +3805887842 +3293933440 +2093715154 +643488723 +1745734862 +2437429415 +1246254526 +2540997954 +2701102173 +1802045384 +1056369877 +1037814521 +1994221912 +3284018838 +256910653 +1799066194 +2608590616 +3827475671 +1225455284 +2743292286 +2034201651 +1133360988 +395487668 +3032056438 +474289207 +1940679172 +3622337070 +4008852317 +57936294 +2932630872 +1465851257 +1619090210 +3863854609 +583770373 +3331245604 +4205589379 +1568890202 +2722198259 +143788720 +4162474096 +2720419441 +4102842412 +1594515990 +1798396977 +2053005769 +3522437437 +3492571346 +1086528356 +173021874 +322111527 +2188596390 +1311995950 +492569398 +1014630112 +208859493 +3529214436 +1424817705 +4090092731 +3677173665 +191298450 +3026473167 +484662683 +764600937 +3028130136 +2792373700 +2928958260 +3946701091 +3491356166 +4071037473 +1432007865 +1122004236 +320774582 +2726704527 +308301120 +734265277 +3747284415 +2960075603 +970523047 +2774524778 +3526120441 +318821356 +4208002082 +1470873970 +4108535807 +411233948 +4140481695 +2807023922 +1998219664 +2575502840 +3026369128 +1374855628 +2262935509 +2659028748 +1704434554 +3996124259 +3607405669 +489510327 +3668807315 +485310392 +1757500630 +1327888884 +3299300568 +2247092148 +2347951171 +2781076687 +2429151958 +1106651524 +984271124 +3877603713 +629411457 +1324531036 +489305053 +1274985618 +1522476438 +2263654118 +3231789403 +1650238950 +225601962 +588667610 +2089377664 +3273346657 +2175232552 +1637196643 +1385250623 +3494190495 +969942485 +3867963234 +2519077395 +3888707853 +3259534670 +3431353456 +2617742908 +4121329013 +2046600736 +3602761641 +2629530955 +3738421205 +3921107208 +1506043752 +89372295 +4284343701 +1932265561 +1274044780 +577677243 +4082120258 +1323349162 +4206996756 +491024287 +1479857632 +332179084 +3358009817 +1638643918 +708703569 +3804792479 +1842472668 +2127766971 +2444911728 +3703514844 +1464902833 +723742853 +2406048626 +1381492237 +3920702747 +62682268 +3570222637 +3200983362 +1997437933 +2748983060 +2125594095 +734188255 +1807639286 +806397388 +4172500799 +2382733404 +2047115764 +2376265705 +3579919889 +2834589797 +1287785292 +1058238843 +3026624265 +170599851 +2177415497 +2089591548 +89983709 +94959992 +934653119 +2279988645 +3475771308 +1449668259 +549225208 +2169832108 +796272129 +2816557008 +3017116962 +1162012558 +1500459218 +2399059329 +615907262 +3254350469 +2276910954 +3825709050 +382298444 +1457402998 +1573213699 +2501387930 +657054009 +340863437 +3384302129 +185683612 +4252668756 +2162961454 +994469714 +3244906567 +415613965 +3255163410 +1057902240 +3973177532 +3016282204 +2810503857 +1099336678 +643985328 +3645763883 +1629343907 +3519080453 +3462318590 +2080218528 +2252799113 +1069935407 +3353846162 +4269297285 +2492484616 +2310553402 +3499937373 +2595944778 +3502816614 +2980600437 +399946912 +2469392546 +2655396851 +3718014020 +4241150977 +3750967049 +4238107176 +348907482 +1196090257 +231865515 +2121340242 +3486184058 +175715048 +2893847225 +2946302023 +4186229563 +2847229537 +4000848006 +449369495 +2438921321 +2898227859 +3063968661 +884045055 +1766034348 +995273506 +1027275999 +3341320275 +1271532241 +3735719240 +511704102 +4111484074 +3071136090 +1062543750 +3250248392 +1243207588 +3485006011 +805526109 +2918868241 +1842018183 +1524804061 +3602284655 +2334306425 +374711291 +2715478168 +4025326669 +2847643425 +2950429535 +727658534 +3364183463 +3540131568 +3462081513 +1838077517 +1850456626 +3996818909 +2064516899 +1917728193 +656423362 +3776278708 +3562745832 +248933355 +4282297794 +3776619682 +1283899283 +2060341308 +4178281200 +581921113 +131924089 +1187219057 +2094132971 +2133595040 +1818915636 +2056819865 +676565401 +3861140731 +105390854 +1249517253 +1006261388 +3530260674 +2186592614 +2068302487 +1865041360 +4178504455 +2997131432 +494804323 +3494719463 +3512032245 +2413839129 +1161887867 +1257093559 +69001272 +866357344 +2807458538 +3390170707 +1245165883 +3238880139 +1120975621 +3254029404 +3939757183 +2287021915 +2031941952 +654417580 +919147117 +3769751490 +1189715979 +1496559065 +2676906708 +1254354486 +891517969 +3504583503 +3606210672 +3609419705 +1007728947 +2885698645 +3238062356 +113666966 +83338145 +494857792 +992109589 +1001352429 +1487990778 +2046366192 +2447895756 +3076698831 +2548519482 +496866210 +2511202819 +3981026561 +3376590372 +86857896 +33450278 +675917229 +351390892 +2976589726 +1164711943 +1957275035 +3399121335 +1134381562 +3079990171 +1910259019 +579771312 +1337285621 +3668755409 +2007977799 +4277283238 +2867400959 +3132865559 +1204776323 +4277991819 +3704216435 +3678218513 +703944130 +2549557572 +2844283276 +832835251 +3010151465 +2187803273 +439369188 +1615869008 +132336587 +2405915614 +159181347 +1147998845 +891742232 +2038132952 +138040549 +607560226 +3780508446 +1941356205 +1053123190 +3169960918 +789669399 +2680332642 +2240055460 +593337223 +2530103278 +1974598163 +39712662 +937672441 +1929072716 +4170795187 +4037242626 +2732669872 +4002484920 +1579312526 +3125087293 +3186314822 +3375041308 +629346386 +2299131681 +2416199112 +2766153432 +2177343516 +2516507248 +3933501957 +377734948 +367840483 +1355216707 +3515895781 +1266230047 +1837464284 +3701383125 +151644088 +3896506290 +549601583 +3359028518 +3602935319 +3838277810 +4064412263 +3923499488 +2739507691 +2058046327 +163913310 +2173633815 +2341971955 +130536043 +3171580982 +371496966 +117463743 +1757419973 +1436322334 +2945372806 +2219109750 +4282059032 +3769791130 +3322951499 +3670197848 +1955517872 +2419522330 +1097047760 +3643977740 +2878413065 +1617623470 +1518216417 +4097167721 +1907451961 +2174777465 +612715155 +2068411776 +1572392671 +1389374598 +591030711 +2575605467 +1777803882 +1151256558 +529924297 +2790865965 +1975197719 +1759012785 +3816878200 +1577052675 +628582078 +4083575037 +554886972 +1926667008 +3521741423 +3877053695 +2049854812 +2695844126 +2803850944 +2071406279 +2013048948 +3182226498 +3897703189 +2710218964 +3904637666 +1199785882 +3258768852 +881543754 +3895948206 +3072085059 +411630154 +2883920407 +1374655385 +701952761 +3460595236 +2942225736 +3184633492 +1527177315 +781707594 +1610168205 +2187579510 +1251827552 +1796024704 +3986827763 +2216386708 +4100552356 +2341129090 +788834784 +1537127777 +3601799648 +2239920191 +1067457066 +1580427509 +79756789 +1622982463 +1838153936 +3694873781 +589172680 +3741401636 +918210766 +1201676276 +2662495203 +4049295052 +3689802762 +3891218971 +2369285927 +2589219029 +2820005386 +2875656029 +2160673057 +24000054 +2842787445 +2880195501 +2720777235 +1626472388 +485267693 +917479883 +2639633721 +1182047994 +1767884771 +3943534960 +4257975117 +2588453156 +3591040588 +1267857743 +1594345744 +3882519453 +4097804565 +421404231 +2107683143 +425044549 +525598606 +845178443 +3637910330 +2443325255 +2531547007 +1150692316 +688313505 +854617605 +2510052319 +848445191 +4131764262 +3205647133 +602734751 +1868645929 +2633755500 +2071937890 +4230215643 +9253297 +891793665 +576427548 +2624930681 +535437423 +1936162123 +1786466657 +2797162395 +1425358347 +1496394902 +4043725280 +300066888 +325515779 +780605905 +3724384721 +1601892696 +2904297014 +450222328 +2336984333 +2034730636 +385350378 +2264797559 +3406700747 +2786679515 +1458446789 +2148730415 +3212601636 +2480721930 +3136253128 +2950803516 +1658446624 +1558433421 +3280014121 +1769170472 +3311328763 +1768028748 +3018422801 +3177751193 +3997949987 +2378365002 +4101896776 +849945248 +1989028684 +1947163785 +847913355 +100093336 +3263710662 +3314423117 +175752480 +3300293205 +887377084 +253741758 +3206721478 +2409834760 +2793259205 +1381326887 +3545401453 +1492773640 +3825968488 +245475195 +2218644609 +3579481662 +3341503369 +150361874 +1459228808 +2679241297 +690653449 +435737045 +3962747981 +65770814 +3438935318 +300453530 +2147089463 +4142077334 +735151461 +656696534 +3375754717 +3595369459 +2559965423 +2154731038 +1553133357 +2762750016 +730096809 +3258593047 +2622552722 +3455918165 +2316075167 +287581097 +478538845 +1871209794 +3858788548 +3433237539 +1936543284 +4105782609 +938134531 +2650209641 +856696922 +477046137 +595661894 +2396434295 +3678730933 +2297267849 +2336478323 +2297139598 +1274968075 +3222018761 +1136942158 +2356786872 +3287781262 +2580891897 +346644794 +2063941337 +2662700467 +683650578 +1962440125 +2229564348 +3349121418 +435091876 +840485573 +4258486331 +2770840495 +1523603141 +2960528534 +3248947786 +550092275 +3912921828 +1963986484 +3669867833 +856113567 +477087908 +3649861611 +2506329285 +1277406468 +3422406930 +523361192 +1697120518 +2738097488 +2606769864 +137695141 +3294890726 +631772438 +2686659989 +4266465133 +1336848912 +3189301592 +292595718 +1344951727 +911425886 +1057116958 +482267610 +2553667575 +1659839959 +3520359094 +3088215602 +3083109370 +1068275552 +2758266155 +641831156 +3947625857 +3334007259 +1646367971 +1931842943 +1249404838 +574870652 +1333019709 +3481869825 +4200775280 +4271250924 +1664262908 +2154389883 +3986443822 +3142878643 +1441610366 +624984239 +602536285 +3438179642 +880027056 +2042857709 +1140931327 +4088410249 +23850948 +2079935663 +3366955732 +4116579647 +3671404780 +1049505973 +3111444019 +3089407658 +1234169506 +3574629997 +1372202544 +3971770400 +966210302 +993785461 +1958007560 +3626072553 +3384203886 +3330867375 +2030165545 +464677954 +2717713164 +3180779233 +914822877 +1682078534 +3341242411 +2590584257 +1731856628 +2944051524 +2607749889 +1850316647 +1857125386 +3477266218 +2097724808 +1762595157 +2710102171 +1585851918 +2516823581 +1597266602 +3547858735 +1286097839 +3844218151 +2854549031 +1771863494 +577024113 +4291140492 +2815500651 +3351167357 +565171898 +4003273925 +1130080893 +882284686 +1612958798 +1608318602 +1306795426 +3242059792 +130179064 +2772450371 +3563875947 +1681560625 +3321046334 +1573797546 +1441040001 +2082800096 +1149876992 +220831947 +4235041068 +3263921475 +1010577479 +1775648636 +4121603500 +3556349310 +3935895010 +3598096810 +1730637909 +4203800019 +2711578025 +575967838 +2418363113 +892361647 +3286163672 +3239236140 +3112646023 +404969539 +1387416713 +1966503119 +3912430807 +1453163197 +2039125598 +2117050729 +1283593048 +562488191 +590149329 +1245479908 +439114535 +2962636392 +2062723840 +2531373901 +1054775254 +3875201408 +3590061661 +3576282406 +1074547880 +1844848602 +1006090885 +1946314825 +4053238432 +2845818885 +2991503243 +960899522 +3428204880 +947979437 +770937941 +2846121288 +2297524112 +929989230 +348548903 +647118738 +900865774 +1251336894 +833210651 +2038496543 +2012634034 +3329435286 +2216047127 +858942655 +4028216392 +2855068852 +893305655 +1836642562 +3540764531 +506471641 +952458287 +2555313950 +2952883688 +586435152 +2642193165 +1937405005 +3420649149 +787686053 +1408746656 +4040601856 +3925001117 +1882265971 +349323309 +4147068211 +525924427 +903620262 +2673607875 +2724854936 +1152992292 +333673729 +2656483720 +2371203499 +2824597303 +3431731188 +3945085282 +2584690544 +4024957330 +872981023 +2080699668 +315002015 +2056544398 +2958314126 +3255717234 +3414112410 +1566472534 +697474747 +3798681867 +4070338786 +4053357760 +1873195758 +2008244683 +3662067012 +3923716878 +2082746945 +2050337216 +691461751 +932305351 +2368433737 +2787389461 +2657985806 +4035378252 +1224383078 +2169923354 +2818168385 +767627428 +130321209 +2005437938 +4138921365 +2455059787 +4089200620 +4027046377 +1185220818 +2576689164 +1473319152 +907721926 +3183777599 +1296139421 +98671595 +830061231 +4146591766 +510560119 +1794616846 +1922007307 +1978965229 +415361570 +1878868899 +2812058514 +1473550389 +909702452 +713290203 +335833463 +2096889573 +135003365 +3453819578 +2416975095 +1830940831 +3966596130 +1708580472 +136061856 +3932718833 +718590921 +1100340751 +654062291 +2101220003 +1974790868 +905171299 +4084603576 +3697523584 +3130831902 +3982014629 +2208849930 +3672315369 +1966621392 +487935599 +2768892209 +2240431049 +1890583171 +810837392 +1756908018 +1218086116 +4122737848 +1662774768 +3496726900 +2598916520 +927808956 +1269001439 +1929954059 +1526413926 +3075200702 +2452717051 +3442328435 +791187447 +621850592 +3934948835 +880659235 +3295469625 +1491248533 +2343613062 +3930159059 +969653437 +405622430 +1161453090 +3195437117 +663798156 +4164266705 +1798393898 +3761491289 +1265619637 +189625510 +475269326 +3009234539 +2170098418 +1275980005 +520530253 +3507120963 +935456854 +3025031072 +185025029 +591809817 +3343491820 +3220719415 +4059158410 +1011334579 +1231003062 +2134445901 +3254642584 +1191962849 +2317417929 +3535407621 +398169996 +2271145348 +2305008591 +3399853640 +595858878 +3597620309 +3747963020 +991449772 +512330298 +2905615893 +541788562 +2316528591 +3712175997 +1668264912 +2729201056 +841513999 +1617128581 +2710639368 +532645081 +2899867308 +1675815720 +4114838097 +2463004200 +2148077196 +2949141814 +2293925651 +594154854 +3708485132 +3409294965 +3695511114 +2035488763 +1513634233 +4046615385 +3622342502 +2675043127 +689236315 +2703195176 +4283073535 +2713015807 +191250567 +1477666714 +127178869 +2440286674 +2808849115 +1115580105 +3810377386 +3386044672 +2294636114 +483255793 +3759169502 +1656008257 +309323435 +2674945640 +3360787696 +1784423692 +501422200 +3025736043 +731020356 +1772676243 +1175816334 +727245809 +770391884 +573876373 +857847454 +2982653472 +1429440140 +2201679787 +3730525643 +536700475 +4145334724 +48771505 +3340417167 +4099830573 +958857246 +2251289559 +1813060961 +4132200375 +1249199860 +1120669515 +2513010015 +3959007433 +337860382 +3619297004 +2078406934 +4293027460 +3071349580 +4010280375 +503898996 +2671542878 +2140297962 +3131696409 +2972866258 +1275237612 +2601347399 +2694005693 +1521187928 +3484568315 +2910684460 +3507702140 +2598847027 +2738975448 +2757960766 +3310974482 +1535484096 +705373410 +1049733700 +989184954 +61060348 +2797687264 +392547146 +3188002665 +1623364721 +2166775961 +4212126388 +2195837218 +1733799713 +934170246 +934950936 +4001208537 +989072333 +1324503152 +405941817 +3963822912 +1076167863 +3854373162 +4237067789 +859673005 +1344015591 +1089043174 +1112149325 +621931598 +2288163518 +1970828627 +2367836018 +2649297164 +2102180681 +1604769237 +2117528291 +203539547 +575615003 +2543745269 +1915751919 +3841308677 +1291935899 +3170163709 +3820883648 +3483408410 +3906010760 +4038374606 +4129767217 +469365683 +3059250631 +338999412 +1468711634 +3415658357 +2674019779 +929176153 +1834663573 +2504644124 +3693474114 +658438337 +2962624967 +4030715259 +1698273259 +179543369 +3988707443 +4139845559 +2144958133 +1275856505 +1124923250 +482856845 +2493737622 +3837591564 +93557415 +1044265321 +2611056804 +15064051 +2434951573 +3362935165 +2079431651 +4189872877 +3885101754 +1422631042 +2670735775 +4200705529 +3653141840 +3377810567 +2563335046 +3318998883 +864595373 +3632521141 +3789650941 +2793114170 +2956165912 +2487446629 +1416973871 +1150296071 +2524065988 +1237907238 +1886638652 +3866144674 +3888713740 +894386581 +1617683464 +2592411 +1513808223 +1736222609 +1121077821 +718469993 +304048163 +869231666 +3972317940 +4138287829 +1483019385 +925105553 +383912399 +3322463284 +3729197148 +3104650608 +2908782832 +2934605117 +3242514653 +1329004398 +2418294429 +3158688974 +1197303719 +2408675635 +738026694 +4082815940 +3011981434 +3420435341 +432064619 +672457503 +2628384122 +4233461196 +2423806022 +2369840347 +4104669828 +2636540820 +497346805 +2927469842 +1052366076 +318817583 +1177944495 +689237361 +2682042411 +2229276317 +1613578233 +1924614074 +4106739492 +2091084652 +2092331271 +2913224719 +168428324 +2357263342 +3422115895 +2607496061 +3147042577 +934095551 +145035794 +859772029 +2625694116 +1229834055 +2390255214 +3011597964 +104963460 +1003219059 +881927680 +2245209344 +2961527999 +4041086898 +2077431062 +3143403809 +3680044939 +2246517347 +2279704033 +2954631272 +2194732960 +3543379667 +1162643960 +3731418634 +2622241917 +296187331 +1809401482 +2809037910 +83490358 +1858217959 +282548897 +3636258734 +3571960751 +4203965387 +528274621 +3712165566 +651207474 +3714635581 +1577538685 +1400777546 +2048632056 +2683680224 +571464905 +3309179557 +79666099 +3142802840 +3331425290 +896619580 +2365851259 +673532624 +877511892 +720250859 +1724838938 +3997003299 +2746970930 +2211634420 +2361646279 +1797251097 +2278449903 +3720233432 +3530134728 +4093044754 +2728500213 +4048806213 +3709203622 +2040062920 +381930837 +2299529538 +2128865771 +1592492301 +3009749409 +1457750084 +571132770 +2693083246 +2013231260 +3714498560 +464953906 +1349459366 +858600816 +696096440 +2008807875 +2987583724 +2537297081 +2388969680 +3529187101 +1386785012 +357580294 +3674938714 +1578131871 +3665480461 +3524120014 +1024979456 +2524370630 +3120078624 +184502714 +3878224599 +3055908752 +2247435689 +537504824 +2750190610 +1251897105 +1942822668 +350565330 +1457163877 +3134889676 +1336407957 +3441142268 +152522557 +3088177633 +858467730 +459763377 +3085947924 +1252155455 +1723497561 +913103063 +1234626560 +2294331055 +535563528 +902876111 +4082172307 +4038845661 +1820004721 +4284953194 +1533312352 +982450520 +1854435329 +549487898 +2693130425 +3491907154 +2004400782 +3350296433 +3958160802 +3253117091 +349103893 +3542718798 +3502617015 +141041758 +141799095 +3002942017 +1150919132 +1977754013 +111654600 +2945685510 +3778891727 +3078563533 +2051660871 +396829123 +196430701 +1751932029 +3583645169 +2686031124 +385761245 +2849420050 +656568602 +3312472415 +2046971767 +2251413451 +2272506301 +1103647428 +116219050 +374294936 +3869683014 +4135994621 +124031717 +387288184 +1262873913 +2729468640 +4156681656 +1649565184 +762658891 +2663567873 +2478580687 +1464411726 +1160935820 +2045468762 +1374342776 +3376809110 +3593864109 +1955102909 +2327149720 +390662748 +1600598903 +2882400385 +3176040286 +858308729 +18672801 +1395574858 +1100634171 +3389489837 +3319320030 +1316189783 +676216971 +4072604478 +2054136755 +1136927436 +290842516 +4286639772 +1200309649 +3065978823 +1031467618 +824309092 +3147976540 +3797580393 +3639538467 +2114241601 +2659272069 +1296946066 +3460904902 +175919893 +3416789940 +2481370920 +3122983483 +1204621525 +3219769560 +2989265309 +4035389369 +3183265172 +2606458035 +3736102623 +479835703 +3556454436 +2992076989 +3431023618 +2854245652 +1179211647 +3201376865 +2550640750 +3264095991 +3733475872 +3204493175 +3405496446 +2464499422 +2779423147 +74060002 +3234204377 +100702390 +3009986903 +1497561451 +2821672018 +3206920567 +581042866 +3764833032 +2286743733 +941115816 +421248397 +1904000469 +2350684838 +47477030 +1396502537 +716435473 +1434109981 +1675521123 +3776221307 +3069224790 +781822954 +3635602475 +2705340553 +2755293099 +3479765995 +2945686834 +2914933146 +524651912 +2645919654 +3170572201 +2498221693 +3626824599 +2912708361 +2424554219 +4001963417 +1236919624 +523949585 +195898784 +296780871 +425792094 +660828101 +703807211 +147381160 +3075073263 +3955897607 +895338069 +4247325493 +391228013 +246416619 +3734402006 +1807163628 +2055366548 +2890053397 +1325925186 +491497440 +3401141480 +718743508 +3992033828 +3638171362 +2084777333 +1404725987 +2164596684 +128173915 +2179495898 +2734114249 +2302874173 +2601881294 +4266300959 +3240459746 +2133359060 +1892190220 +1329873257 +2923613920 +1566152290 +4072741564 +3183115975 +1474936216 +1349197057 +4198799347 +2467396884 +2590642268 +3791533802 +1595935286 +255184872 +403772478 +2546814948 +484181795 +1950244862 +4234789605 +1131157061 +2426901753 +1821521908 +721463250 +2907076902 +2839650622 +555262840 +279700534 +3885044850 +2335489663 +1301933164 +2913222502 +531554497 +636685354 +4035405012 +3972797376 +1011285494 +226388886 +2260756705 +3684747658 +1149327496 +2255188808 +806745978 +3417751566 +1029876525 +1905359153 +333548365 +3781144604 +1062851850 +799991703 +3668925388 +3706193134 +3732627677 +1416306132 +255452023 +2733696998 +2917540045 +4221795939 +1405259783 +1310761112 +4088589390 +2327832942 +3439418546 +168373216 +2676437115 +3515356815 +4286244001 +2964044278 +3239534839 +2512366498 +4028616461 +1444402675 +1659262127 +728312508 +1744056746 +3895499534 +4178674268 +3507784757 +2007925811 +3564085609 +2562405976 +2993912585 +868824647 +1489881978 +3789813094 +1608935769 +3685737463 +1439475295 +3613203929 +177644277 +3891819318 +1315586475 +2902682147 +1080100360 +1575641188 +2882709374 +1300016074 +121814969 +3303738950 +2109637858 +2289453523 +557549741 +3230395678 +2337573720 +1906679805 +2627109496 +2331603173 +3835827713 +3074701200 +2398997384 +946104350 +3717332233 +1840146004 +1500125935 +2459926681 +1605680944 +3812264274 +1594207619 +2108806447 +975340799 +252600584 +712967480 +1900612252 +3477871533 +2403724612 +3029093907 +3063669052 +3417401902 +3632964791 +2749472820 +3947203876 +1299587653 +3724872946 +1699653916 +2302370527 +2939592507 +1141633219 +2759177202 +1036599797 +2856925484 +148682033 +2931421735 +2969086108 +2722419252 +883744333 +963484265 +2861402087 +1997976234 +2921575197 +2004127043 +83306711 +869078965 +1441684959 +2909480351 +2914307132 +821713555 +2816571323 +2233178877 +2838249514 +3498271939 +95749581 +3994159664 +2919169989 +1299115737 +255713330 +3125730252 +864390226 +1137818541 +2511557946 +4103625997 +873624455 +4172651489 +1466094926 +3348254321 +532827909 +581668196 +429551152 +3670022772 +3550527352 +666920983 +2668862259 +3844026082 +2574152349 +2825178606 +650749480 +1398489453 +2728501801 +1348983443 +1944286902 +282971941 +1508544916 +221370481 +1570820839 +341554239 +4257845782 +1128280778 +363567321 +3723356570 +2272630765 +1443557240 +2771163105 +4243468085 +2605698549 +1279967098 +1659641145 +1745178144 +2710071267 +1861159942 +1894647285 +4186478662 +2102001670 +506842409 +3579200791 +719316900 +1086323391 +293216066 +747509797 +2538342550 +3785184606 +730516389 +3854788274 +1542499626 +2874947170 +382509271 +1640202176 +3391620234 +2861715973 +2085480314 +1749823641 +3256695095 +2742533682 +640087641 +111084889 +152961903 +4135700579 +1640937371 +2752700969 +655479307 +3436581929 +2004772165 +771124812 +1593410233 +1495299531 +165122413 +20298560 +522007774 +3370555087 +337578245 +2985977919 +180231306 +3679565792 +1184276752 +462696065 +1546640587 +489183138 +3374754299 +585133177 +729555041 +3463326567 +3397566478 +2439950996 +465988396 +286439368 +602152676 +392322034 +3986175605 +3444905240 +834863455 +238586625 +2944535029 +2107816550 +2053054796 +2009377405 +2254132870 +3611099551 +1536388679 +2230947490 +2070444982 +1996422208 +315543082 +3684513943 +2462999354 +41858162 +1107908514 +3929572687 +1693869588 +484967879 +1129747240 +2927303129 +3759920508 +1526007968 +3352516882 +2128381140 +3179082674 +3101177106 +1407655263 +1683886129 +631149128 +1066078783 +3495737156 +704327144 +1920392141 +3767847133 +3350433455 +531512539 +4205601449 +4234243800 +784505716 +588381900 +3278698588 +750416718 +4247086052 +1332040368 +2558356578 +2888023581 +2355328495 +3619820326 +2645545850 +3419028931 +2056022879 +3292367168 +30662872 +411448512 +1001717975 +2159513957 +3680913186 +2164988300 +2499034413 +3676804712 +2669447257 +3528362527 +2495636313 +3640214579 +2812867293 +2575481548 +1627493244 +4183079529 +517155430 +239509252 +1052368697 +1130875679 +3777888046 +3748371646 +2987082293 +2804697514 +114094292 +3138082668 +3977383203 +1129320653 +4220464076 +3853852083 +2241435394 +2365354109 +1163167511 +2367770426 +1122173048 +2967912775 +2112563482 +2045460909 +506501023 +1749536332 +2818517916 +4116453605 +4040285586 +1526142943 +379590964 +1489272606 +3151538279 +2373624697 +4263911452 +54891012 +3720855813 +2462929773 +2944141759 +1053989631 +3112720102 +115587857 +950018837 +4208116316 +3415051725 +2204598748 +2080506005 +2409958989 +2647437697 +2888324936 +2992400773 +3060221925 +1068576226 +3377172190 +2362902872 +2976883897 +3891519035 +1570884661 +2744438013 +3507384579 +2325984945 +983118447 +4133418653 +1080048420 +29486424 +1146113079 +2760999731 +1731008859 +363323578 +406246129 +2561429708 +1699224558 +385034092 +1112601917 +351101763 +1380200004 +131880954 +2220597461 +3170871714 +1768459158 +4207228358 +3853633283 +1442528840 +3348757387 +216399614 +1071160795 +2271713000 +3509220831 +664666994 +3181054847 +2623311149 +4146123211 +1298594172 +2862787255 +3965889668 +2024747788 +3499583245 +334700360 +930969908 +1501129089 +1376104624 +4036483047 +1188127895 +2645058266 +2159857434 +1891541399 +3435361256 +886974405 +2606774233 +821203751 +1337048843 +4228921359 +3828540593 +3666563079 +3147982290 +2747196915 +235969178 +1512654471 +2247253528 +3004910733 +537047904 +1284160052 +453839274 +125983218 +3069485239 +3516027764 +3775387554 +1807471530 +995878972 +2113038138 +2951645359 +4045063974 +838621307 +3073049951 +325384071 +3156938914 +1733791967 +3711068358 +499899994 +2193642345 +2878657186 +3497235927 +921388204 +1276842544 +1650669765 +2815698338 +2015568132 +2169363790 +2207494414 +626234535 +3390661097 +3627384365 +2856969574 +2086463376 +671700941 +1444332958 +3395716568 +3083310143 +3555173304 +2880418596 +666378732 +217490159 +1984252846 +3307090273 +3646816439 +3349652492 +1758256389 +218952160 +2547721987 +4264940937 +500505482 +1511381814 +2265844968 +1404695264 +662037438 +2830753425 +2183144013 +2416171731 +239089 +2408993301 +4164085145 +3023807980 +2617161161 +1396418354 +23903724 +2557465761 +2959948022 +1202139767 +2288354242 +3717275946 +1531237897 +3717050484 +1798919815 +10453811 +3166742689 +3840197167 +508173281 +2371816529 +3907819242 +2686561690 +2833227397 +340708720 +3098008890 +754354495 +1737791930 +590581035 +880732413 +1217283368 +2504525922 +2990244313 +3638281530 +1495454918 +4007908465 +1380361231 +137038918 +1275548140 +1327117624 +1859935168 +2015356366 +3385792273 +803794504 +1830236439 +1014507384 +606233517 +749832081 +3510820556 +21013678 +2052712434 +2264670336 +1116268591 +3194915770 +1990714280 +2157551963 +4145178618 +160406550 +2050948661 +3456183617 +1179717328 +1359566892 +3671913293 +385235395 +580914903 +3428444128 +487197493 +397184427 +224080487 +248643906 +73474141 +2801387908 +923837979 +1744477066 +40295137 +1006871735 +3590287266 +2611067302 +3890354545 +1097165365 +2919776849 +492938146 +1877842715 +532355130 +2497748398 +825174820 +3400484565 +2443454323 +335717192 +4174701395 +1667663418 +1297144242 +4034911091 +3114663925 +3875953020 +3406826494 +4170542378 +3259376106 +1495817045 +681986754 +2402082840 +313625689 +3859095505 +3520587148 +1898287522 +4185053173 +2687317946 +4221456660 +1466878574 +4056347827 +1538035519 +4212021115 +1976719359 +1388694684 +3982937127 +529071658 +1763198779 +3938092633 +329152793 +3215384138 +3581317521 +2876713275 +2720016332 +260552591 +2367732503 +2889343241 +2962649310 +2243878420 +2758051345 +2898042504 +3953760581 +4094359656 +1946722482 +309177396 +3151944758 +3344123925 +1007843940 +227565023 +1249162708 +2273481299 +403651676 +3128271769 +221436924 +967537651 +3729264471 +4113960392 +3792869111 +3755536648 +217297177 +693537418 +4159929091 +1947993409 +142841376 +3178564834 +3908369097 +419896682 +4170608191 +2287665559 +1743133626 +66641149 +3497520716 +1577913420 +1417785518 +953494455 +3009907683 +2452620312 +910777280 +458478297 +3948162523 +2588747450 +1640424815 +195573730 +1541506813 +4158116662 +499597045 +1216367600 +1235880268 +3702648292 +123211833 +472470565 +160825984 +1827018719 +2083491238 +1518034867 +1302715601 +2285825824 +504376673 +2203565979 +3989683272 +3883934327 +1325770737 +2338171981 +4062966416 +812583977 +579193275 +3025980484 +1355239681 +3631829658 +3010395689 +1277305016 +989396865 +4130296320 +2344194833 +1881535515 +2253729246 +1572984857 +1962731392 +1849247801 +3169095141 +1640073185 +1719949274 +3472596611 +3255498585 +2614948729 +891649237 +3533805142 +1668750833 +146997259 +361521300 +1143110198 +506668448 +3586280221 +2167764137 +747575613 +1088314588 +3845503413 +431875899 +3561266038 +887439992 +35738395 +3494614507 +3652877444 +1548337394 +3730513197 +3112346635 +2613504478 +482085716 +1344823843 +1713974446 +3593850166 +549993909 +3737024227 +25985045 +3022396722 +1907543786 +346460543 +3177644821 +1947353596 +2506665786 +2450526091 +579220959 +2135433432 +3401645336 +3688866333 +2068178873 +2332153107 +3846872092 +1539441969 +3512442631 +714507038 +3686685415 +2029278077 +3820284361 +3298625370 +2099083491 +2908485358 +2165238415 +1253169593 +2529779911 +893273087 +4286822781 +2247596142 +3353550176 +1889333322 +2684233939 +2980698423 +965946207 +2280741219 +291345692 +1828876337 +898348271 +1430113884 +1816861405 +1955501397 +2748793905 +1672451639 +3064406516 +527443227 +1592007060 +2986847903 +3173611934 +1628952837 +982936281 +3005865441 +1514081602 +3930404586 +1168633772 +1926694073 +1643106987 +2906330488 +3514592598 +930525285 +2250007080 +4156461518 +2981792954 +926638533 +2569593161 +2752866206 +2486055074 +3022971174 +4201761617 +808876182 +2744522977 +558819861 +3705281150 +2377841877 +380024119 +2221633290 +959824527 +3064164387 +262910254 +2860694961 +1216652347 +603515618 +1603155781 +2192759489 +1687788593 +1432370136 +3377618138 +4244327881 +2430045185 +1758012738 +1661983556 +717602905 +155757706 +1624613476 +2819969279 +2925498968 +2329215801 +2753150104 +18368422 +1225234004 +1531669815 +2695793657 +2208467220 +3384229855 +493383887 +2944931249 +610108837 +3449045070 +2415338722 +730378507 +58146413 +713151698 +171548561 +2384294991 +1784588158 +344952671 +1595156862 +3512943303 +1263142545 +1487234313 +208308988 +2611286967 +2263826321 +1461404405 +3355048848 +3855288307 +3039496339 +1907807048 +3986340226 +1597144457 +3439389035 +2557620623 +1000667149 +2203034589 +659560676 +1960937087 +489427974 +2938813875 +3235880223 +1235054562 +2798347680 +500036966 +1953547268 +1458970961 +3211718673 +186035483 +1381165908 +1484160093 +1201816283 +2871350537 +157355940 +2738456099 +1334746043 +1209839783 +3520882396 +3896444127 +2734873611 +2994494616 +3310644043 +3714979892 +96561537 +1479543853 +2537865518 +3454652374 +1236210394 +1821093041 +2769915180 +2774635081 +4102350142 +3181768644 +3677396387 +1540787810 +3280997560 +3990245557 +3341986999 +1823040315 +43747362 +2557029908 +4177893061 +1418321397 +2610921694 +3504515723 +4002229345 +35195014 +1576113018 +3616469320 +2076918295 +22618575 +1850499835 +991523898 +1936186308 +1305497145 +1074743611 +1457730283 +2828790831 +3173781719 +386976119 +2527024950 +1986484886 +1835348583 +1600855865 +3919620390 +2436371997 +1026481977 +343816799 +2549795084 +2046833845 +2390732922 +973803486 +113382490 +2003038972 +2895949424 +620431151 +2409506185 +3092770647 +1035127443 +2772670250 +2834130534 +2638025922 +3309966895 +3699735418 +495224770 +507001101 +1132676279 +1181565256 +190724225 +321457424 +2224414004 +3942849238 +3077219038 +1299288571 +2873654541 +632384157 +1170936730 +1817638124 +832895356 +4196103826 +2442838050 +1065647439 +1760529669 +617138305 +720027422 +321584115 +2684225844 +4044870854 +3452691844 +1648977980 +659269104 +3576456117 +3376451309 +1626575974 +598598718 +2309761113 +3920481444 +3025131466 +2239291367 +502905054 +781496848 +120419232 +2950413194 +3979070382 +3305947242 +3272478287 +1894552671 +440133326 +1539580888 +1668424719 +802195636 +414564658 +2877638458 +40064875 +3969873291 +1735994386 +3652533802 +3797062581 +2786611167 +771817238 +1817514435 +348079630 +1493822763 +2063802892 +3899154048 +504657309 +1345724284 +3630820328 +1979836110 +1730048573 +2351773573 +4048118357 +940665252 +705429113 +1095974328 +2318146563 +1642343847 +1963555453 +3305638511 +1603342723 +1863339511 +1306856932 +431114555 +871194123 +315861685 +1107998110 +3239944661 +228108625 +2537984756 +231941070 +579240412 +1276071694 +3754463056 +413855047 +1138063437 +1858707615 +2571710371 +2881431562 +2399010881 +2534746832 +3353158906 +3059971187 +3668932381 +1994784429 +1880395777 +642182973 +535892469 +473249233 +3667302988 +606823587 +4001953640 +2746246903 +791682079 +321244103 +990499594 +3302129330 +857175635 +3162269444 +3099085573 +3355417583 +4266856989 +4076380971 +976587134 +13875701 +3465422130 +3487365904 +1916668216 +1698106993 +3987658088 +3800886711 +3898270924 +1668152428 +759902756 +38500267 +1329352634 +3558344006 +2408528227 +2030019924 +2709356463 +2570060188 +3065632212 +3550991866 +1055133468 +794643714 +3189033613 +1850578141 +543232603 +2531536920 +1670800555 +1370833977 +638676539 +3079857437 +3018320100 +1285946567 +3947934608 +2353554768 +1982229237 +859209163 +2113494441 +3242892618 +4221819686 +1586667642 +2794174222 +513884152 +637277095 +3293821722 +1978410147 +838259627 +1512869048 +3773974563 +3352481125 +3291251994 +737890149 +176196758 +1068457053 +80991262 +2061424389 +1083796489 +89744099 +542074160 +838140952 +1153469645 +2141484804 +440571006 +2699004560 +2820453938 +3481716873 +2327426246 +3138905005 +2609579082 +242055820 +4020840466 +4213252442 +2850554962 +3600085570 +1518928758 +3207254709 +955362020 +673262224 +3856125218 +585864117 +3913901438 +2822887807 +1458447516 +3124538217 +3818085787 +75691821 +3064254412 +3920403997 +284497933 +4089163437 +3740817311 +3975924235 +3904521080 +1568642359 +1436428435 +450284343 +632718713 +4059827473 +1605963839 +1413873979 +3434305825 +1029604545 +1378973229 +2804130682 +3790086184 +187162723 +3699275437 +1174132993 +2496946271 +665243596 +2014906435 +1567607193 +742625051 +743582739 +1095928154 +1091419874 +3102256886 +2697812355 +1120296753 +1974148979 +458594771 +4178283424 +941868245 +1407577250 +1941321475 +2338590934 +656039399 +978341962 +2827396440 +2149998604 +2377384569 +3164784125 +264087350 +2223721228 +939642335 +3744516721 +35727078 +2471454139 +1739018553 +2830999054 +2235871694 +3274813394 +1026921713 +1796939476 +1255586826 +3552170981 +3910220444 +1320410735 +1031448754 +206404787 +1009030109 +3202086692 +205886940 +528608119 +3087578803 +2463014388 +3586661888 +1149327337 +746388374 +1827434927 +4126030034 +2423361820 +1783260481 +1997576377 +2361088250 +1053678058 +3920263600 +812660058 +673798856 +3977369103 +3118334417 +2113388210 +518382108 +696293087 +2743747427 +2231755225 +1165759097 +3576579812 +2404024062 +1443719985 +3771755811 +4172022504 +2720914838 +372340268 +57071857 +630763047 +263066305 +2661725600 +160510393 +2135448292 +2806920896 +2197476939 +2864801668 +1820485381 +3868261945 +1660883187 +2671077744 +76640626 +4114139631 +4090839991 +4132640287 +2094075027 +88954570 +1338850666 +1460724443 +2247248471 +3381564867 +3255792861 +67213855 +1423013997 +1643154088 +1419393906 +1998922245 +4088229638 +1652556796 +755106968 +726043871 +77223714 +482771764 +4239430633 +4088369133 +2709199325 +3143666423 +3905721157 +32176221 +1232877010 +1712278130 +1567224761 +3667973753 +1788249585 +4078855602 +3619417574 +2100065394 +4292027049 +3341835089 +3543381009 +718071118 +1133860786 +1261964024 +3500106325 +1631865991 +287494383 +1153384850 +3809546444 +1219472756 +403628951 +392584103 +1870002443 +1189131201 +2090260511 +4240508428 +1375970864 +114150700 +3652182152 +1807933623 +4051276277 +3918935575 +2699753353 +4255311595 +2148684689 +1073490883 +731815518 +3602335217 +1391461885 +95024448 +1386730845 +3729953259 +2198902703 +1222429746 +1614548884 +4059647857 +2827390599 +3941964856 +647775422 +3051443337 +2168149575 +3485180939 +1701508669 +2274864299 +1248023704 +3491075110 +66399684 +1542420577 +4146840313 +2655652529 +956468454 +3830587408 +1073273231 +2359469923 +2612790532 +3498518631 +3931858329 +2281546021 +1942462873 +3697441301 +119263991 +3056277062 +2597081962 +1216560876 +3059458710 +2875728150 +202588449 +1878179243 +144609223 +186363964 +986472083 +3112720015 +2091182147 +2744462395 +231166311 +1098189721 +1334416098 +995202488 +820184628 +1279751318 +1017032701 +3797592561 +2261001351 +3958816107 +1975879472 +2305436702 +430538321 +1824432583 +4285924527 +2078016407 +618986233 +3942601742 +4196949753 +1945317691 +1295718627 +1197287571 +3365186168 +4115090915 +298486585 +2204665687 +3902925707 +1068152916 +1285585396 +1343057571 +2535604156 +2778575334 +2001410696 +461947886 +1941369449 +497311100 +1437954055 +374506549 +387574293 +2860931374 +711180482 +2643111328 +3764995851 +4133291748 +1307820557 +4045241749 +2388138519 +4214890970 +2102707402 +4211923569 +3480494043 +545271501 +2131610456 +2408741211 +6685723 +1122693306 +3633057924 +1454970004 +1207087185 +2766988777 +1741698704 +2903602860 +748601843 +1253606279 +4002070084 +43500948 +4207002745 +2188166465 +3003347921 +2721696049 +678533320 +1012713788 +1221953238 +1716345360 +4236857414 +2536863746 +1288534412 +651179493 +2671036949 +3238794161 +3938263373 +261428601 +3679469516 +889977346 +1096313438 +572489062 +3597260124 +2044200486 +3431209092 +3667390888 +890713873 +3158573635 +2425085803 +2654782011 +1149547427 +3074719654 +2954091292 +1520558319 +2897700141 +4075107972 +3984712904 +3492998691 +3584945153 +157059909 +3105715516 +2423774549 +3354982108 +972055604 +1607290044 +689097511 +2161235519 +3716589231 +1856791025 +277241991 +3198292035 +3749976705 +3477355501 +3254059476 +2850721284 +3588883923 +1052802696 +3042389521 +2536332254 +1610194125 +572347458 +3649401588 +3022774135 +4274160765 +1233870224 +2460629663 +2356733375 +2826928701 +864298512 +2110529792 +26087410 +3189182994 +1485495356 +1738997443 +719375970 +2852493262 +145688773 +3392373290 +1874726300 +1989338225 +1449266640 +140459625 +1967964236 +2163496078 +2260922878 +3371887181 +201572796 +966683881 +4004240145 +548812281 +523786466 +3827014781 +1696020677 +4254086247 +2395606084 +1316342703 +2090465861 +1313066711 +3117386894 +2687485633 +88031661 +4063726086 +1549502250 +1119968828 +2226659139 +3070649030 +1054116806 +3021607016 +2384841054 +4203023022 +199145142 +3251797998 +384244118 +3079232538 +3685776252 +1177201119 +4010732782 +3381782161 +1930326567 +4218622504 +2439876892 +3760204526 +768752021 +302838223 +4149607289 +4026955591 +1324704856 +1501619189 +3733336615 +4230853973 +3425119375 +561678861 +3999201550 +1140135343 +840509395 +3990020652 +3068944636 +2721743222 +3735067546 +2122726720 +2928243760 +2883323044 +330081647 +2505235370 +2048745453 +1391648394 +1865562206 +3256165458 +2203104838 +2730011154 +603436132 +3007357817 +1204617648 +412608262 +3217821653 +3317917593 +2481882446 +536245606 +4284878055 +767736354 +123452334 +491702126 +1007395197 +1011069285 +720144863 +212784053 +3125021341 +3546377315 +1178868756 +2993748216 +1500036122 +503170430 +2081421147 +1555871489 +2191563541 +388863252 +1304395075 +1541193067 +2840508260 +792815884 +1588193044 +4055272331 +1322491999 +2611429860 +733915131 +3718470383 +3968769673 +924051523 +1371441456 +276785750 +2270006690 +4285741645 +4119487197 +1595815221 +2248201894 +3811649936 +386675256 +3457431902 +3505759188 +98053617 +2848960688 +361223118 +581796503 +2455526949 +1275671174 +2554246301 +1778039118 +3009875956 +546011388 +2426401521 +3404788417 +2542031964 +4086191489 +1993135567 +430143264 +1018952251 +4290481898 +313984199 +4208395857 +4119948456 +2695154929 +4147857887 +3039994113 +4134573109 +164702563 +2485202271 +551203756 +891655868 +1136271593 +4045998175 +3087388288 +1746176017 +235855641 +3668719330 +3703153824 +2727288475 +2782328201 +2906220608 +2719244702 +2313263904 +4071034138 +2278031502 +2517343902 +3749716208 +1132393289 +46512500 +3630555378 +3687497954 +3225784855 +1167165635 +1491638449 +1873415248 +1322465299 +2057483350 +995792768 +499002956 +2806798114 +3338644162 +1815073086 +1051001570 +3284951703 +3604527400 +1682996945 +1828268417 +1108274971 +1649581844 +2159872829 +1608704430 +272920022 +1823493011 +2339231821 +3932770733 +2607064663 +1005502182 +2953206407 +959257110 +697314104 +1027657085 +662176647 +3452461270 +885211232 +2343636617 +2521884733 +3350975903 +3245129675 +2304049068 +904617921 +2334338698 +815645090 +3010044679 +959239210 +386800128 +1795782428 +4259087301 +2834660243 +582635565 +279257586 +4087164756 +1111526645 +1174963640 +1997448503 +3451860510 +2435266061 +657198260 +1262812094 +1714005226 +3520345061 +1940575363 +723454963 +1586688728 +3527236454 +969122353 +2937676343 +3153547039 +2515491421 +1413470218 +4050782944 +1740902892 +3720648105 +3107287350 +2413952014 +1348084707 +554841786 +42017340 +3353776772 +1258499069 +25964327 +724224339 +3865246716 +2501648133 +603637611 +4259993309 +1719753114 +2977999173 +2039970841 +470136194 +406728064 +1675130202 +1907605957 +3163192753 +2685409749 +2318993452 +3782182086 +3522990799 +3900922325 +3668611672 +4088200491 +4140002401 +3467904978 +4106520801 +1105545219 +1341510853 +1376555431 +1125175467 +969230045 +2130255174 +1346140080 +3357957790 +303096358 +1932688356 +1306419243 +1523027946 +1771103553 +3514470461 +479236528 +1061071730 +1086566311 +934298154 +2090475332 +1555388121 +2652289869 +200114477 +2936611051 +1465082961 +1627315631 +408440779 +2447219610 +3321432911 +2262519071 +1817530191 +2987722351 +810234055 +2307022554 +1773740942 +726322100 +2559994876 +2047566407 +3810734025 +722405820 +3256805969 +2975804943 +3418664909 +2870187008 +1641292263 +1268751284 +416804544 +993294680 +1269879104 +2131537056 +2997957661 +1551127881 +158997699 +2919313286 +769851064 +2236604595 +1469834680 +3286898471 +832837303 +904283770 +1007266790 +2989682849 +1642413432 +2563335637 +3099505417 +1117930543 +4269621952 +3317512601 +1595607172 +3274362544 +3661696127 +303444582 +3271652665 +2209713100 +1651646276 +1863087740 +3189636080 +1719648054 +2303490738 +3979018844 +3470065908 +1664129538 +1296348308 +961515059 +3448517081 +3547789628 +3101969569 +890249750 +3141265253 +3580575502 +979260776 +1684249844 +3021902992 +3247292980 +367670687 +4286469710 +3203766256 +3233850820 +1016090612 +3796709534 +3008019124 +3347466231 +3000607769 +1885025608 +1642736676 +2457434153 +423559931 +2757980018 +3898963679 +2656161255 +2062234482 +264488990 +1222237842 +1116494059 +3859525863 +3571183164 +474712723 +1013519750 +2121055489 +1047596584 +2478669552 +1784465788 +1109959648 +1517512032 +3520343392 +2817021861 +797525109 +464321255 +3110074068 +3796704633 +2910914879 +2643163744 +2732897840 +1570809933 +2642813812 +326011216 +3118676015 +85603845 +190554251 +3527182501 +2269322664 +2814046902 +3896548332 +2871444946 +665223191 +1138081332 +638307386 +3891779567 +2712644368 +4219189534 +2228666807 +1822602606 +1561837711 +2745405361 +2058761244 +747638751 +2295964179 +1704707267 +1695959529 +3469840680 +3273200600 +2930532520 +1430138581 +3531777910 +3647853276 +568536218 +3219163007 +3575109584 +2601547666 +2649477903 +1753728020 +2245866882 +389620450 +3991126150 +748400701 +3745621805 +2376010063 +63168280 +741214787 +2290875388 +1142300521 +2554347721 +3212719536 +1911930527 +1086443233 +486354983 +447712436 +3555701869 +915220479 +2062159572 +954004320 +2110934952 +2133425378 +86013173 +104529263 +3629989067 +1647240814 +536394018 +1100221418 +2196524826 +1222047729 +3376405225 +1585692487 +831925213 +2829053522 +3261206808 +256711986 +1554703650 +1264382986 +1563351278 +2231358679 +2544787192 +1302519723 +922405852 +4282050713 +716008080 +1672765103 +3246898635 +3201435528 +2541100882 +4160116323 +1777620878 +2894041440 +4518657 +1402285851 +2151107070 +2761647310 +1694402346 +2929112031 +1080931708 +2551808960 +2506397826 +2302909093 +2574776940 +2909706703 +2340693617 +3177914124 +2633961455 +4251735176 +3831770441 +2664871191 +2019456794 +3865961477 +512341036 +1414406874 +2836659989 +2344230887 +3234444826 +1839754738 +3666586150 +3894922229 +3357993695 +3791693383 +3266341883 +3928108616 +3700764 +3693673014 +3980973227 +300093387 +3970606027 +646535704 +3012267583 +4270877338 +551154779 +3907690012 +2411428804 +1114928378 +145577341 +3898255853 +1417185800 +3389946788 +357145387 +1132161886 +2062981208 +3361318147 +684601572 +907128630 +1711769941 +455901926 +3432194994 +4044992782 +21412635 +142617545 +4194590139 +3205299017 +1851038347 +998285231 +2599421785 +3133289994 +922658994 +3990669040 +4282068978 +1593007793 +4222391985 +3778200911 +1949731948 +2084073038 +548342824 +1167039618 +925496933 +3808730263 +4097819490 +859582689 +91662937 +3299429702 +2719867697 +3246069991 +2602921029 +1482204624 +354753144 +2114356418 +2764357171 +2277834570 +2571892748 +3581178337 +3190772566 +3920995077 +3819607045 +2544538508 +924010400 +3226254478 +1935936408 +4170425973 +3140283321 +86089535 +1687371054 +3056675746 +15749197 +2014549893 +681909291 +2807125111 +4215087032 +1169469377 +3359218063 +3995570901 +3897994399 +3464073405 +3859530597 +611901582 +2235613054 +3110476438 +3476151626 +728973716 +3577587482 +3300079175 +1315300938 +3305289524 +2310600617 +2635168465 +413514935 +1985958980 +4242194753 +2332292220 +2509751826 +107663188 +2075238323 +2296342812 +1715299226 +4120141298 +3701854833 +1273421034 +2498522228 +1585996375 +688925138 +2403652969 +1169307327 +1513181013 +593091938 +1113159458 +2854588702 +3951009993 +709654296 +488217526 +2342091114 +4060933144 +1595462419 +432914696 +244063615 +3498043078 +3890133189 +1639352175 +3161983716 +254913281 +243537107 +1450617465 +2475089377 +1503305090 +2420770754 +3088213837 +706014818 +2378486672 +1163749934 +3457788758 +403563352 +1206664553 +3732826076 +495768048 +3407503233 +4099483874 +3003213645 +1180211643 +3305967813 +4016799797 +2977120247 +3439172445 +2916821613 +3676907444 +3137967215 +2333812713 +1167237448 +2554022150 +3272116956 +728695877 +2537048518 +604975855 +1122207590 +1959835585 +2688522408 +319020534 +1869016376 +2520364565 +1769508128 +1931617916 +283270538 +1318650814 +323305912 +2624088869 +1127673825 +3174125874 +348421557 +989616646 +983447954 +3820933087 +3366480613 +3719414801 +1351441064 +3494735545 +3394343385 +1381923814 +2731181651 +1597604914 +4127390819 +1011808644 +4225460828 +2568040766 +1103592338 +2348409222 +493877571 +3652641400 +2340227043 +31589455 +4088912185 +1994253417 +366963886 +1410667377 +1912841378 +1644259964 +2904358882 +1423364125 +3546746591 +3205652103 +3086281816 +4119070113 +389993289 +1994059320 +1565748270 +2587238064 +3890216247 +2174262617 +700526129 +950247615 +3257207135 +187715505 +2883860989 +654318417 +1916626307 +3243155560 +2898449745 +1359582709 +2379901840 +4138898665 +3258932095 +2962458514 +2333989340 +1550701911 +2515363552 +3431732258 +570975880 +659726807 +1540621235 +4085120661 +1215570553 +614250768 +2274129721 +3762297794 +300408936 +935760425 +2387420303 +1879061790 +789135785 +2620801692 +1897744224 +1233560420 +4293937827 +3863422825 +889556538 +984762230 +1660774021 +246961605 +148898692 +75353862 +2775846389 +1614467902 +4213471216 +3787966156 +1143076552 +3105741455 +492635229 +78279706 +1723054671 +848088575 +2699204194 +4253599485 +3531677433 +3202071124 +3775183363 +101829091 +1430210969 +1134097213 +2738657562 +3373788991 +4235298509 +1739441099 +570829850 +4004242795 +199838422 +3633247063 +2534034021 +327457288 +2360648012 +1497582539 +2908707531 +2870036176 +2533538087 +1926696766 +3556435611 +2114985740 +1813280634 +693182873 +4120063613 +3993201887 +2381140586 +2815208387 +1678577401 +3895343737 +3185263781 +1312724037 +332942652 +2902364420 +3832715097 +626858484 +1817609147 +2777494239 +1903337418 +1267423945 +433250846 +3460267435 +1955823685 +3282902411 +2626465831 +1012921598 +1982593511 +1354115159 +2511041366 +3459615824 +3840479084 +2045485035 +2989404475 +3018066568 +1029401771 +46869989 +593984290 +2406366651 +1649272217 +752103925 +2542804474 +2596709735 +2148401611 +1427733637 +1468817772 +297613365 +2885509003 +4040904959 +1214360889 +555730374 +3343483310 +913747674 +3990909507 +3324530962 +1433596024 +3764718372 +1712034860 +3722061696 +2637893601 +2013431086 +4004494837 +3860121610 +3558245116 +4144785402 +3452614293 +3267073121 +590449518 +3048956163 +2919891890 +1872121021 +2518880008 +3611830248 +3698156881 +3398366646 +1280650543 +3381299957 +2966448616 +1526232011 +2707575701 +2862424146 +2907808426 +1278168644 +1260948974 +2180313519 +1545574722 +3818720766 +3126864476 +4026004049 +996185053 +391695759 +4046473609 +2381283128 +576116512 +2485755640 +1166044480 +1215600698 +98861443 +1930185283 +4273156780 +1271547370 +100946444 +2086757724 +3530579631 +1380405743 +127068075 +2060776468 +2591956639 +587940579 +560653262 +3160882714 +550483061 +4102928092 +1556846375 +1358658217 +2036041551 +3971100883 +2586632962 +3260478323 +3306008699 +4105877295 +678671427 +950224419 +3337746296 +1583209339 +3389796102 +2310119293 +943158217 +3131236744 +4162744324 +3076088216 +1039317016 +316948167 +3909308352 +2065325187 +846561747 +348457288 +1123284842 +2976484843 +680123906 +2859458447 +3769530701 +1437941488 +1853370124 +3577295503 +3852460794 +2291145207 +4226327685 +854136262 +2142371490 +1929225034 +332980441 +290923663 +3655429442 +609100276 +1258593835 +2422948925 +4118541687 +3450499965 +3873167760 +1427705654 +3418113155 +2509275638 +1778117924 +2918033938 +1117112809 +1314567503 +308009613 +170536045 +235641132 +2137049359 +2910150131 +4232940091 +3259396399 +1555680191 +3768199637 +73683976 +184560404 +2359263659 +4005992297 +1776654680 +3058581805 +2452402546 +3306643395 +145818801 +3853041741 +3119501846 +4183221914 +1748563038 +1081839534 +1564747391 +2235659606 +1924049210 +2734344895 +3387681961 +666045978 +106922768 +3207463249 +3254103179 +285409590 +199243554 +3313628298 +2421103579 +3190833396 +1085791489 +81005956 +773827889 +862017238 +64986087 +1865775623 +3846451262 +785309661 +1568250176 +1108267908 +2040999636 +1951736775 +2869997108 +2765644687 +3564226535 +2943254350 +2452251238 +1182395690 +3332544078 +3797415315 +2260775512 +2639078793 +1413777825 +3457595233 +753889790 +1413716907 +4032964755 +1048006416 +1565271178 +1619905889 +2241168849 +1198315922 +2857611169 +3755916042 +1724949528 +3272286083 +3928322836 +3109571125 +1636075120 +220234164 +688860373 +1024754059 +1622086307 +2682589429 +4015981128 +2568722610 +1052016364 +2271201587 +2006949452 +825825116 +3645863497 +3885014151 +3383638413 +1686683208 +3602643385 +3070882317 +3523516553 +822475119 +2577977576 +572555322 +206451510 +1459678024 +2114829743 +2621897991 +1099796082 +2231027344 +4080996668 +3655292261 +2226120052 +1572905438 +3021595037 +3541753830 +3010747041 +1663963608 +37757510 +4165548567 +1560001869 +803949350 +1378694442 +882090931 +1265223675 +652784888 +438586555 +1244477522 +3978005172 +1831567861 +3051274390 +502267113 +1816466285 +3187021320 +1343335589 +3947618478 +625012630 +517583311 +3106085262 +688566026 +2350352268 +3390657116 +2409373147 +629961949 +8886558 +1864175451 +615464218 +3483795322 +3527085664 +1101018600 +587458808 +116874854 +4213678657 +1546179650 +3012049036 +1815559072 +153209534 +3253917904 +1729871793 +3449859029 +3283332432 +177390239 +3532860442 +2951314177 +3235876711 +3847593100 +2789649297 +2082911325 +820884183 +396302470 +744559517 +2422178488 +2551216385 +3449431310 +4131325867 +2574489521 +553481123 +1772461904 +2823202728 +4167554889 +1156807069 +1170341136 +2421438308 +3964952720 +1687575624 +2008295267 +426677890 +1120026207 +908813129 +1846362616 +54046780 +1496542346 +1676873614 +438572891 +32610173 +2173634522 +2554999083 +2086572204 +2028683752 +468044055 +3889480198 +940217064 +2633994360 +2681313147 +3333375464 +2671600567 +156620654 +1479022794 +1378710085 +353641987 +2891251523 +1681188715 +1587307283 +2958722749 +4224579283 +1575669296 +514988098 +3036082750 +483922025 +1699248949 +3526102593 +2319732014 +405771195 +2958520902 +4148130739 +1392961631 +2245645632 +3313896062 +2442997175 +1956378475 +2527447648 +2499832737 +2316880467 +748147483 +541437170 +1866613861 +3827606678 +605053352 +3298429222 +1114036903 +2292674074 +3496833384 +2462574571 +627653782 +2654972727 +1364110099 +3965046257 +4250918339 +4256837596 +935418396 +3958545796 +2068153039 +2963953871 +3439717889 +1892281026 +1635632595 +3893030508 +3041473048 +1933515266 +1062482484 +3564626916 +3352976015 +1040117730 +2956317060 +1814412183 +2585522301 +2255561323 +1162882485 +2993329249 +2793419263 +3452966919 +328919105 +1954885212 +1694105838 +3701164224 +1687992118 +3336122236 +4078687910 +4176409195 +3065954556 +828186723 +501919780 +421973824 +1268860327 +4220996283 +675541680 +2804022984 +208772670 +1691605127 +3850767053 +869928997 +4293630758 +3710750316 +3882968574 +3642314298 +26068493 +893617 +2906616610 +3670065283 +2883425811 +3000571255 +38773332 +2859042416 +537658632 +2121869306 +3097563390 +756755712 +3900568271 +3064779954 +3503963953 +3358281327 +3519130633 +1075677913 +1184013843 +2571517359 +1681568829 +2058911862 +3076957747 +3474069852 +4148568659 +1559965065 +1240166184 +779809320 +1065863614 +1970846316 +1098115873 +1413471094 +3896081771 +2151500705 +3073459242 +3467751947 +2914231044 +3841534256 +2825693292 +49233561 +2519977699 +506383578 +55825026 +1555806263 +4119637578 +828725181 +635436646 +2112556265 +3175837002 +2754754982 +1869438428 +2932744018 +1346756735 +1827639253 +507001757 +1769794090 +3939858447 +4054219182 +3657001080 +3328782693 +2544054886 +3445347546 +1641621781 +2065158940 +1715630719 +1452894287 +617900520 +3796238798 +715822626 +2047507838 +3945292150 +418379627 +2439927918 +2018222494 +1280154243 +621693280 +3914923819 +1497386188 +4056545177 +2455464504 +1420964556 +2206323700 +3944257808 +3177315735 +994517881 +2174069467 +2720870928 +2452155011 +4153079789 +3057008460 +1874437087 +119655371 +2749131273 +2989760342 +1875116545 +2203466065 +3963653812 +2000408074 +3846075801 +1251367398 +4236836710 +2942664404 +124171670 +4244213651 +2180707473 +478970770 +328894772 +1406696466 +1608319893 +3087141632 +3718533764 +3986579081 +3313413643 +1513803973 +2076734743 +2574589148 +3432203270 +636014348 +4112804385 +1787481058 +3386438495 +1056530663 +1142103510 +2678038683 +3129841795 +3313495897 +1737703875 +3679602268 +3289197418 +507059657 +4155331789 +3635502122 +1984992541 +3490155484 +3365126823 +65441661 +426284004 +3733580638 +1361765873 +421444083 +3220312512 +3784350457 +1057067792 +559063689 +4008486557 +2405781304 +678990900 +2986431613 +420864881 +2409223444 +1788399344 +3723942554 +4245681938 +2927557257 +1958120000 +3402195570 +4293053636 +62694539 +243005694 +3447142467 +1809913658 +4276675102 +2209856137 +410364493 +3453718543 +3683518859 +2158200544 +3557336824 +693909692 +4036711593 +3636463778 +2220033316 +1537596761 +2400010537 +170832633 +660123427 +1574194523 +3047269085 +498901171 +1787697892 +1577423548 +4217807669 +805914932 +1998313203 +2444847242 +182949353 +824769156 +2954614439 +2079277564 +3111380286 +1019326346 +2733836448 +2337891929 +2631052965 +1865968084 +1471495900 +1323143394 +4148638366 +3943966090 +120843286 +607873130 +4114181129 +280714105 +3447748995 +1766272800 +3562964027 +1891181102 +3338663433 +2121899031 +1016779947 +992464055 +1410069349 +419756287 +993953785 +3858708060 +656815936 +3380303416 +34482750 +2239772603 +3555159540 +1848688107 +2997178695 +889178495 +3092136693 +2766742239 +2849975745 +41376166 +3418214835 +240341045 +3879918340 +2324624837 +3797339934 +901815099 +4213036359 +480642412 +256000688 +88631464 +3219031076 +1997004392 +3744437412 +2418612464 +1070292164 +3892150067 +3232320887 +3685993244 +1664570747 +4100894641 +1399429588 +2819490061 +3250836832 +3876378415 +447208723 +1123805522 +3340314468 +3669754326 +2891964484 +86726792 +917042954 +2802424031 +263484366 +1090661056 +3353143779 +3793114504 +3062310162 +2371480706 +387157664 +1884453537 +3596204867 +783842611 +1572524019 +2712497247 +3086814070 +1329519266 +2728267527 +2588723306 +2633970606 +2771854336 +3893622916 +1861386951 +1857548845 +1735370601 +3774694229 +4105490382 +2983318246 +3846440367 +3906378346 +3790258500 +3058294979 +2743232407 +3796460459 +1329670968 +558036066 +2995904535 +552095575 +421105496 +1300801564 +3553777525 +535440885 +131675115 +2351729596 +164499297 +821269494 +1126658472 +2156851181 +4041337734 +3008454788 +2202425537 +1478253109 +2264420978 +2826518118 +4281800759 +3708656885 +168680347 +3666135065 +1384479668 +3045541073 +293827752 +18755160 +3678209655 +8309771 +1051148036 +1615972515 +336547522 +2806526384 +1827493271 +416319814 +1007195160 +2907002940 +2815472371 +2925370590 +1521501532 +2123347620 +1209347056 +2770227228 +675167439 +2889175664 +3761258556 +1835612690 +1750006146 +2852024045 +2126767964 +1644064134 +414621226 +795552231 +123467492 +2480787260 +4154724416 +2558156595 +298360706 +871252985 +2087316233 +3169957086 +3145619917 +3391144555 +687896070 +3201917690 +2626256489 +2195558808 +3798158420 +1476012165 +2032566723 +1685654889 +3276928186 +1663578120 +2856758055 +450876383 +3220782130 +1233751029 +3899142102 +1215466183 +4129351493 +3503500157 +3263374164 +2591743025 +1292467631 +2775542496 +1870164820 +2885669738 +1567895397 +101379293 +3206883432 +3976036813 +3580871903 +1801323385 +4084674170 +1679612235 +110818972 +3916914234 +4212586027 +3547809697 +518587537 +921748809 +1049164984 +734779916 +2528453700 +2958872953 +1866443159 +2428060379 +2870989769 +546049989 +202279501 +797117606 +3861784438 +1574003147 +4249171507 +3112857088 +1684423569 +514702011 +2506487 +2739432870 +1939639428 +855838814 +1682247456 +425407380 +1180811761 +1080415432 +615719060 +517857226 +780217891 +2808562224 +3103042699 +412800308 +500796276 +4276413542 +4180392422 +4187580856 +3356279381 +1983179837 +1281098873 +3043489471 +3665838883 +32306238 +371138280 +3870122287 +4066614927 +3013408381 +1306851986 +1670654669 +2530967770 +4199756930 +2829773944 +793860439 +3399523266 +1996201228 +84356378 +1549066948 +2127747971 +4287712956 +1706203580 +81422143 +510765217 +456078660 +1172884950 +3381704832 +1831482468 +3047547522 +1473063401 +3280356908 +3171699393 +3330213002 +1957317535 +3236670852 +3468471137 +1577197874 +3929414539 +34011551 +2584656913 +1945700734 +4165159799 +3661162412 +3985990894 +653159003 +525771990 +2257018628 +3451713689 +1299868865 +1463402181 +2599921354 +4224671589 +2757188129 +2997706235 +473019452 +4075197625 +2563938751 +2639426885 +717332315 +3370478779 +3714218865 +500565206 +3711159256 +664258271 +2659029349 +1454351334 +2076437311 +2497279872 +3730819681 +3993664661 +3060820203 +2326382327 +176453594 +4043576358 +2383314407 +1168302285 +3083307711 +3607198708 +2417219852 +2245090728 +3116402723 +656635797 +770654614 +2276669898 +2802712775 +4137383058 +220001583 +3949406174 +1111848996 +3137641960 +2075937483 +1378518811 +1152421154 +1755385854 +4249606422 +3424345637 +1430377541 +4095233558 +1416530531 +3526084027 +162031461 +1874683636 +2857595291 +75289490 +1643707900 +3060286631 +3456547209 +1651891731 +958792170 +423102359 +2630526644 +4052805086 +146782352 +2725329996 +3948440685 +231440866 +882693352 +1498999482 +3487821068 +1051203497 +1858388839 +534682610 +1217117129 +1069119803 +258829614 +2092649195 +589365781 +284146840 +2250651385 +2189020020 +1121627329 +1243492144 +2879479936 +1768251559 +215473831 +343604735 +3547060882 +2697256223 +1727825672 +4089570552 +2283771350 +3626147775 +3662368200 +3455346667 +3663876995 +3164667483 +47232703 +1011395074 +188067148 +1969624808 +4224399205 +2500645876 +4168686710 +1950867452 +3832275590 +2827201890 +3889026072 +933734906 +2550421838 +2588852789 +1660367448 +1656859271 +3814992389 +2217020991 +1698911829 +893701738 +702061805 +1976915030 +1173880487 +2037617372 +3490237518 +645229793 +471362879 +391180536 +45792520 +3316811287 +656218986 +2634579842 +2480763258 +1843229857 +2836416081 +55680835 +2376267458 +4031665684 +1035974830 +503421778 +3670674522 +2128584897 +2472607085 +617470049 +2954380216 +3791929953 +3863441347 +2029161048 +34912193 +3532930034 +4255933260 +1524474519 +1456846584 +290374611 +2361938417 +2325430527 +2745805690 +1286474344 +2645905688 +3605928561 +3341337954 +2266332555 +2494236833 +2886697143 +1148219251 +1882203850 +1310306441 +3865991802 +1244898557 +2652717041 +183938628 +1026191639 +3904213070 +587201362 +3739011724 +1877245079 +1937536376 +2853719407 +2852696310 +795033414 +3933274673 +3304461737 +3836605412 +2769944515 +1645991135 +3902719851 +3154746500 +50868407 +2864645906 +2720685458 +2379574863 +1285273913 +1625023461 +2062479328 +2012574854 +774022303 +2529886796 +894650366 +3320354804 +32168014 +1674947082 +3872303801 +1619461880 +2154187290 +1465585512 +666604655 +1834580780 +1717899553 +3421789599 +217017104 +3689662524 +3054850227 +3603119695 +1211868770 +2694008590 +3571833659 +265083876 +1720200024 +3677511197 +3021978365 +3701756657 +3239651473 +294260635 +2381771655 +3787537850 +2261515650 +3742967017 +1059165413 +2462367003 +2372304608 +1026688560 +1280983184 +3953377589 +2268184215 +727581986 +1228998064 +3223606296 +1741603698 +2522876532 +2644723330 +3115490289 +1587067604 +604567524 +1102455212 +1900717306 +739996971 +484344570 +2637119921 +603099145 +3220337429 +869925004 +1540236502 +2866461632 +836924076 +3250666188 +1674099374 +98258413 +940838178 +1000967596 +1249907692 +2901627194 +322114319 +2058274886 +341959458 +4064946171 +3829050426 +2064898765 +1041395861 +3040787583 +592111588 +779786817 +1372794386 +2508780575 +1073896215 +2136657615 +122080316 +2255009774 +542108537 +1766458714 +3206096321 +3760867405 +1927467239 +2024503556 +3585047915 +32523224 +817728304 +2865366057 +2256901047 +625551656 +3707838231 +3689199951 +974759093 +3692651196 +3987028986 +2050846306 +774983967 +1404403536 +468803222 +2623304241 +86827951 +2442812196 +1425769192 +2020650723 +1609851916 +3420628632 +2609503301 +2695742516 +1641336730 +3037955365 +216740153 +3569264553 +4106175801 +2187652554 +3518672046 +624819386 +3995356556 +2938407341 +2525553033 +4226780745 +1707693478 +228284394 +588555993 +2020861182 +3513527466 +110198645 +4106398315 +3194503949 +2132595662 +3291667199 +1836218137 +3213682800 +3181458143 +1656193439 +2992479764 +3785627349 +1670095967 +3613450789 +3624709072 +3672993746 +3906581763 +733449440 +723727400 +4137089377 +2819845198 +3408112981 +517736066 +2351988689 +2150029035 +525401623 +3005401556 +4232003899 +3646561526 +2685852710 +3351100607 +1813592525 +813337108 +3244938501 +1927095688 +4058339668 +953304972 +17068881 +2790795306 +372799090 +1098681292 +1285067491 +3125192702 +2167533171 +1903690867 +365346454 +1970316206 +1060937690 +809320934 +93732366 +2685363011 +2566454073 +1412322312 +3581394359 +1378610753 +1087241222 +3527071001 +2064377062 +4230016194 +2492606524 +1263759721 +260745997 +3033730374 +3910324280 +495968906 +1577110475 +2724013849 +4027755276 +1962061579 +2244037683 +1711553483 +3716316005 +3373160971 +3572014839 +3964823674 +690205633 +86386128 +1761003034 +2303191404 +2294550480 +911598721 +1872619645 +652519622 +410363304 +4192988373 +1278109672 +3778472461 +2997170389 +1460749199 +3049333147 +1074046646 +1834197 +4081822672 +3204913148 +2393314101 +3041981888 +258868050 +225930035 +2372393459 +3052715 +525367785 +542482471 +2437965097 +3970345214 +2958663722 +2436762510 +1995035605 +578952871 +2804550389 +4226216718 +649975543 +24537894 +4114579607 +1626908866 +4051116824 +3207222945 +384599419 +452828943 +2284560732 +3667613826 +2878899769 +3405841836 +3955195262 +1440538163 +1989087786 +2063832255 +2460396254 +2927514288 +16393764 +936398144 +423333643 +79152013 +401752307 +4229977588 +4280006737 +4134316593 +638012716 +1312245617 +2716784038 +1043382896 +1694973730 +2265845953 +855153160 +955499406 +2100201308 +1717925440 +1975003084 +2150753951 +1353523075 +3082042153 +1633279453 +195178627 +555743674 +1644879090 +726940015 +3222933413 +2377698329 +317752903 +3682853792 +4152278751 +2722787625 +3192128027 +3985282311 +2335593078 +94854686 +2599524617 +1400254647 +952318966 +2809472656 +1160750384 +2732187268 +1778657700 +4238360042 +2949723658 +4125400839 +37063521 +664807451 +3844480644 +561932581 +844958396 +1146386194 +4031372154 +1290711298 +2571168702 +1840655054 +3927760729 +1186009917 +4196686190 +81271580 +2161061426 +2391918038 +37917762 +1482669440 +1381280970 +2992926049 +3962758965 +3653535759 +2648243031 +326373918 +3936217602 +1119722463 +2729572690 +3629375996 +3007010419 +3712553175 +111883003 +2905310633 +1722925636 +2097689812 +1987814624 +2177666103 +1791930626 +2106913079 +1699848236 +3358926613 +1525440903 +2430426939 +841021652 +1674035698 +1449898481 +1142885914 +3519154251 +1547866820 +2700363160 +3129430618 +207589714 +2730156735 +1441420905 +2979218555 +1105541536 +666087697 +1729978133 +2045666751 +2580384774 +4253801860 +2837736922 +268327616 +1227507604 +3317224580 +546503909 +987518999 +2839280669 +2377223433 +3607116722 +772305783 +2501850747 +4251281816 +2911388138 +2647036657 +1986127638 +155983432 +3699771428 +924425435 +1187601274 +576044981 +1702770185 +2201702105 +2963647522 +4100122789 +802434560 +2870193323 +3420978964 +1093556301 +1106216297 +4085591986 +2718690645 +3839272521 +275257894 +1254402028 +4043045274 +1428760728 +2002504859 +1865282348 +3433004354 +1328336383 +2530792398 +800818908 +3980669797 +3838166675 +2164687931 +286457881 +73538778 +1854667295 +4034274716 +3428446097 +2384568205 +2016490737 +3293551587 +1461801523 +905386605 +1064162352 +3509854969 +45218853 +3646378796 +3449712563 +3813929454 +2584212306 +2580229288 +1715189468 +3757295317 +1174341066 +3482150468 +3326896816 +214817257 +1243173389 +85637275 +4031677226 +464279235 +261520021 +588916057 +2809675203 +2636199919 +562987856 +1259962955 +2941330039 +352583081 +87932080 +2637892584 +2235900762 +791509149 +3545886983 +2435282081 +2540277476 +2350533209 +3059748429 +326377422 +2064233640 +1183200901 +4059295914 +2317616406 +1940274640 +3460749403 +1878674569 +982954037 +2000309220 +968966005 +2973567671 +2627979352 +2784452792 +527654190 +3745740953 +820728947 +3335608193 +733989556 +119054399 +1815492686 +2302849814 +3716176338 +488151596 +2045170354 +2756809784 +649452408 +2909953595 +2402993912 +2872668465 +1454770155 +601269344 +1207576455 +1785965567 +1549702859 +3060791232 +1055645718 +4075880119 +1056955441 +750161179 +670275466 +3060020730 +145744292 +3228229761 +1781815560 +3325286054 +280861153 +819143563 +2978636144 +1131173915 +2012131374 +4177638586 +3048441847 +316789848 +162651937 +1725214066 +3731992520 +2926418155 +4004167967 +2951604035 +1493351926 +285403702 +280866785 +622776690 +2816941914 +281143193 +3925905273 +242068980 +1827602810 +2064119673 +656897814 +1744063361 +3049614781 +2228133080 +3317682170 +147522037 +4286865575 +1029177678 +3842179430 +2086780490 +2057515767 +107036323 +1850864007 +3499519519 +2910420444 +2079052509 +872752585 +2805527551 +1093302558 +3480710628 +2662225695 +1583073368 +1921386545 +2702922186 +3154711048 +4191950843 +1765333009 +1766949543 +2859897529 +2258730055 +279635104 +1143272010 +1116555883 +1810420665 +598207074 +4203847135 +988956558 +994090688 +2367600310 +2204384394 +3076795666 +99043818 +3753071599 +449077234 +3241176583 +2375408000 +3516640787 +1003450559 +3624826054 +1244771795 +1134517922 +1110568293 +2760366126 +3090654099 +3732964854 +4128740095 +3280161234 +1477473101 +3105004358 +1781504743 +788953215 +3144425921 +1864998750 +977346976 +3729200064 +1279548784 +123044720 +1433638639 +2288300471 +1608053724 +1643595346 +302538304 +861789927 +2137369553 +2396673979 +4221526419 +379555766 +869365264 +432837339 +3472050915 +154674025 +3736316029 +342444950 +2450291925 +1902543511 +2383219436 +2416804812 +2917900838 +2714382024 +3659113199 +1343405740 +3187244027 +4046811924 +2721082265 +1144770207 +1288663311 +192232710 +2304888796 +4084244476 +2837755379 +1893374208 +1333071200 +2380660788 +3778809788 +3537582497 +1255091012 +4275429175 +3500918094 +2054063359 +1552459504 +1971712635 +3205890703 +2180844833 +3633899284 +3958483067 +3715614844 +2627272961 +2257518108 +4050762587 +222038706 +2329197015 +1871159873 +2269576253 +2993924957 +1940487426 +929673490 +3755977767 +3832854283 +3964888921 +3635993017 +1830203206 +3995372197 +1115937869 +1343193127 +2930409282 +1308286751 +2598761849 +453652296 +2858570393 +656089164 +1408514251 +1135660103 +736805891 +4058616821 +1863222848 +2915982888 +2248972607 +2270958981 +2235421711 +2228230089 +2642196119 +536631574 +4165905783 +1887377025 +909830203 +4278625781 +3459810952 +93837558 +3943188413 +1731154030 +3329098574 +1097630575 +1235067997 +3322764381 +4050340592 +430781656 +2726890051 +4190936143 +3219458924 +1069819656 +3278601380 +1838718903 +1054442605 +3423235093 +4191758551 +1006995462 +1100237261 +2999994965 +2353994596 +3799792828 +2502805841 +1376349759 +2635945477 +3107024587 +611185048 +3414157184 +1616574323 +1502123553 +2988396031 +771463002 +2455142441 +1004361206 +1032615199 +2467712489 +3790171037 +1671882599 +2460542425 +377353591 +187950191 +3367194083 +4203127898 +2447293922 +2310055325 +1412135662 +1634801938 +452489433 +2883213635 +1513339993 +1720081424 +4136086783 +3585417991 +328317943 +2273007396 +3418723856 +2655125327 +2046316022 +332688795 +317515761 +3784116120 +2995011669 +1092785611 +4116755553 +52518225 +504600204 +2997557872 +48990032 +3245304417 +713495558 +3347756791 +1222153199 +3594124429 +3296839291 +3202470045 +950236893 +3095371843 +2356970324 +2101833962 +3844946020 +1798154573 +1096769788 +2821769685 +3245425876 +1175970595 +207671419 +964903438 +3609311060 +4267091104 +1333630893 +2333180405 +2438938185 +3612165206 +2263012188 +768178690 +2498993157 +1450286941 +2200264798 +4264641287 +502085093 +3024493827 +697196334 +1370562038 +3712052136 +3346214691 +2419457038 +1615101073 +1661051938 +1736526149 +1213709633 +4144646183 +2993293397 +2550071824 +4085620723 +3320167501 +1728423775 +950226007 +2237530382 +50134116 +2239604805 +3810334975 +3045984272 +1079020632 +1306200598 +3533335549 +1502665288 +3235965884 +1136651567 +3399380997 +4105552205 +158604928 +1971722827 +1571052166 +3153820260 +3157221919 +18379379 +1266918239 +1151089391 +1977143951 +359622084 +4021084821 +918061950 +4076104308 +2892851811 +3924414309 +533797605 +2113555911 +1671942707 +449964910 +2532073357 +4179073025 +648127981 +1487171161 +248542441 +730859485 +941003934 +3092391910 +3184414568 +275441145 +2051113017 +2744368780 +1907071140 +2109876179 +234511306 +1736264083 +3548140219 +1273899527 +4268217196 +2021378163 +2632330822 +787395630 +2620691752 +2817198825 +2434452645 +1067028860 +3360442717 +3297840056 +439305996 +4147211852 +2903235443 +1701374147 +2667466375 +859473894 +2316626841 +736453485 +1644585020 +1982976740 +558633308 +2298588424 +510141549 +3568252836 +1511201303 +2850307307 +2638949452 +3341893561 +3638796834 +1790715083 +3131118784 +3195661187 +2601941456 +2469126131 +442587067 +2223254268 +3780123891 +1906425421 +323411870 +2783739155 +1294416119 +2487954086 +2158473206 +1753180387 +3062733042 +3393624395 +3633760422 +2202284861 +514136950 +600507479 +552503063 +3201116915 +1687446503 +1166709360 +1427392789 +1249308021 +3735156557 +1109861844 +2427095059 +2138232626 +3309059649 +4216175672 +1072860659 +325302908 +3809690463 +2354530248 +4034645712 +2427644950 +3008594209 +2522568941 +2566158289 +2395090236 +4222894352 +1757146280 +2135127268 +3007549953 +4064194070 +756549389 +1730433250 +129199388 +4050328696 +3144942283 +797747296 +3936123808 +2310451478 +2013035892 +4221983546 +1938897696 +1767966426 +748129255 +2409422531 +2179923799 +2389893340 +2723763559 +2299330078 +1394028942 +1350536413 +1815170592 +2814086583 +3936854976 +1344098076 +1361028778 +2402497023 +367425949 +1395963243 +2203850229 +645987606 +867117062 +980652979 +299945665 +737221108 +1029483530 +3273043719 +3207348536 +1381668376 +878067666 +2434590097 +3062321211 +2993906210 +2829992177 +2744346612 +2155474596 +342552282 +2193060660 +2234198432 +3951108425 +526740835 +876345668 +3813179243 +470157867 +840974941 +581228776 +3145990871 +75673665 +3056828225 +1227670822 +3563934850 +4076768190 +370607915 +3345246600 +3612615697 +4103151527 +1122340424 +2580941900 +3597888950 +2688101827 +4204367988 +1328479955 +936653208 +4044330368 +1582799062 +847800392 +2901732221 +1494866940 +121790524 +1198211324 +3340662352 +82971621 +2326048025 +1910343825 +1101465652 +2623589887 +1598028989 +3108596263 +4061538657 +4148262192 +2089571320 +1878267777 +968449070 +1579011945 +2594880826 +1227429319 +1003400311 +567049260 +2340850418 +2772387579 +1244011204 +2580877435 +303969607 +746700661 +623918672 +1894515645 +2435667998 +4276379783 +943873709 +2306366821 +1111409740 +2689747756 +3637181669 +2301558307 +915058040 +2836817706 +3089466052 +2784015183 +148210839 +533542693 +1327770750 +844341923 +1847673909 +2993629076 +3575010593 +1646871484 +1393406630 +4201559672 +4281494443 +3440095830 +4075257615 +2846285570 +329397681 +3169116718 +1285563445 +3263469974 +2364035402 +3969706508 +174197931 +2352453073 +1212305052 +2786914155 +148856790 +1542273851 +4256851842 +2368517997 +4150387975 +1854556131 +1889717457 +641025297 +720525978 +879426841 +3496702501 +1474842209 +314799157 +555366782 +1473148962 +1588745970 +3638307538 +526743794 +3182690827 +2844303348 +606677160 +2747421735 +4077165140 +2397509764 +2317991948 +3884830254 +360514055 +254287459 +1176338918 +3468215394 +2988555824 +2845403510 +425993695 +1502221577 +341728381 +543810389 +2541259236 +258359233 +3934215849 +911354382 +3556473929 +3874431060 +2106386799 +2444976788 +2524049321 +1056610707 +3472401263 +4210263971 +3460738597 +2482123570 +2608149438 +3175031456 +1721782685 +2716985038 +2995828555 +2725839450 +2223594524 +3845078897 +2376855950 +1053795996 +1540781832 +3149940619 +2596616071 +1153370150 +3573985153 +1215360342 +3910545234 +2046891610 +668354220 +226991937 +3379807772 +3945977183 +3000284149 +2199830372 +3000453618 +2262863696 +3120778859 +2261540245 +3370067416 +2247424712 +1261487012 +3153664849 +729402233 +1973322576 +1146744915 +3662403529 +575923875 +3642953901 +238029916 +2973805704 +3984350269 +484499534 +4068215609 +1656561307 +3896496210 +265403194 +1432274269 +634086724 +2007303682 +3189944393 +2307626287 +1968357421 +556020988 +3688242484 +1323979567 +2166867774 +2874206063 +1066722466 +456738888 +3119227910 +884375220 +204482646 +2274864235 +2829858318 +4032855716 +4150346382 +1402273300 +1465642068 +1617270708 +2374205215 +4219360741 +745286611 +3430930443 +4122441979 +1282444598 +3212767537 +3220589904 +1735812846 +712168114 +4024275027 +1175545639 +2333907516 +2344923673 +22063183 +1378781112 +3662504125 +586152780 +3020884033 +1078368754 +1853096601 +930354344 +4263823286 +2051403186 +590686265 +3090505471 +2968663180 +3161550345 +1700058587 +3003811300 +4055894108 +547583729 +474971655 \ No newline at end of file diff --git a/RHF/router_mega/input_old.txt b/RHF/router_mega/input_old.txt new file mode 100755 index 0000000..eee2d25 --- /dev/null +++ b/RHF/router_mega/input_old.txt @@ -0,0 +1,10000 @@ +778811513 +1063237924 +3685135375 +4094692148 +738302150 +1708982478 +776078598 +681695007 +3371734728 +964116898 +24841534 +2541479794 +301514700 +556914513 +3688838751 +1057352269 +1558330715 +3087432192 +3027886038 +2585682343 +1537439719 +2853228254 +2077676637 +1346244092 +342880177 +2357129890 +3244027396 +2062771998 +3615838673 +2102161970 +3315026194 +3250334772 +4214040227 +3912203814 +4276800463 +925122657 +3588628974 +2387094105 +3137002209 +542909226 +180217230 +4221952878 +3466088066 +2495602076 +3831440895 +2668103963 +682340288 +1547091897 +192632519 +1255724976 +3361516963 +2387906820 +697598441 +122083473 +2841744000 +3941997463 +1014524645 +3072299353 +3440793128 +712913258 +3830556860 +891389339 +309715734 +100968533 +3393197076 +870123673 +3786778704 +1824262562 +868165922 +910573621 +2689084153 +1354284708 +1493878062 +32548274 +1185232325 +919077567 +422683006 +369242120 +4026828026 +239778016 +1789045434 +1130971854 +4215301270 +1266627442 +688081274 +2267737841 +120935679 +1270335868 +3544459091 +1701053597 +730202924 +18038067 +1877056753 +1892172318 +3537318847 +360177770 +1045295465 +1821934158 +2301026881 +2552393277 +930790783 +2041609025 +1150402656 +2484856340 +1204112845 +4063113763 +2442718541 +2724783230 +2185906739 +1791103043 +1995116521 +3141166147 +2000500087 +230051770 +3005983766 +1585582 +1593384806 +301718160 +4146286786 +3015946570 +209185739 +2401515731 +2289112551 +2873583264 +1623402501 +4227888539 +803203689 +385518795 +1954175922 +1814180704 +3147514146 +124873210 +4262326043 +4170534338 +1624342186 +2272343046 +3257113525 +3570620451 +481243255 +104261775 +1076929803 +3503679013 +19587503 +2064758204 +2763535046 +2813389998 +1716226809 +884059282 +2836896248 +2791323761 +3510181597 +363275417 +1344567441 +3337143513 +2425163555 +578556237 +2686947647 +197809951 +2137518203 +3168083452 +3414918912 +2996039931 +1670942023 +2242871316 +1810382283 +598127230 +1996543753 +4213496887 +3106656999 +3700540845 +1405932927 +3377327048 +1292115009 +2792396852 +1672273361 +2938323297 +3258320856 +1269674575 +2369332346 +423228144 +3765449180 +619792269 +2553898755 +2524267855 +2383177549 +3070283759 +1374333345 +2161452502 +1524939201 +2042251106 +4145798847 +963977339 +2156108251 +2576866911 +3296137191 +93221342 +3074735520 +1040698855 +256826547 +1731030274 +2022760082 +683379771 +3842977484 +1251865141 +1524655029 +3568984389 +4078958757 +3004538966 +2957707453 +3054460281 +2244717010 +32047771 +4018829294 +3443240386 +2279648438 +164786819 +2964610919 +1937767774 +619333454 +2859815388 +959230412 +1998489083 +1675267566 +1002763601 +2177182112 +1155306276 +600526106 +2391027078 +1157573051 +3771268201 +1760348344 +635235190 +349645816 +3031529691 +3159454237 +1141993085 +1642567973 +961824789 +1274176708 +3878828273 +4256283075 +3229229250 +1598915771 +3427299457 +657015335 +2983607232 +1590090265 +4211133504 +1707455017 +3096744580 +2880536434 +134264932 +2881990586 +3622309328 +2504536436 +1014358437 +1666429482 +632327569 +1504944942 +3817571902 +2934108500 +2371803987 +2810572883 +2930050889 +3335946013 +1924993106 +2896756703 +3934282541 +1653366529 +1909472852 +3056707061 +1216217881 +743365674 +3007709281 +2390457306 +2843897752 +4036408238 +1599686282 +3740852171 +126140730 +2006098449 +11729886 +2401626114 +82609913 +23383632 +1499742265 +2635376812 +430154059 +420428413 +1662355072 +2671360785 +3696009889 +1525067710 +643816705 +86336115 +2021568045 +1324295439 +1444451475 +181535900 +1234588294 +2654449851 +1375923253 +2092295209 +3365472778 +4020161127 +1441142598 +1685174156 +2920580644 +574144978 +2534913071 +4229161126 +2680406960 +670748237 +2795288017 +870353681 +760693127 +1073271141 +3351010044 +3007588268 +3262594031 +2884703015 +4072444359 +2420317867 +3689955548 +1467022419 +582014527 +3315306221 +3729115658 +143730671 +2825803357 +738315915 +1058274789 +2179751961 +1989006167 +2833210456 +2024298278 +4224782315 +6773064 +3918241994 +1678728942 +4167275815 +3017095254 +1752072126 +3527904919 +3888009173 +4200082843 +2675003215 +3629377676 +1687331437 +2347411119 +2111916503 +73507813 +340018646 +755661608 +4289530080 +2020813813 +3388031012 +3685045159 +11011475 +1170135569 +2302318178 +4026158878 +1022734833 +969079369 +1810729043 +946066116 +2201819007 +2240504015 +3800402167 +1537031059 +2807367013 +1876603392 +3756133793 +226153656 +2483486703 +2979947547 +1973813960 +1792340693 +4267999819 +306673659 +2916594205 +1090397113 +3380554972 +958115313 +68523283 +551222100 +567812117 +2149047017 +221923873 +1769081419 +700782776 +1103224199 +1543768192 +3629949919 +3789728135 +1197843908 +3427455912 +3575918648 +782831265 +205252792 +2226236639 +2391382458 +836352060 +3280259725 +81579478 +3951670184 +3050403929 +2369607578 +374345845 +2011448608 +2498455407 +1996134649 +2736511863 +1544119586 +41564901 +2948426426 +2450519609 +1802897585 +3466493203 +707797537 +2457492590 +584833594 +3069736931 +1612949799 +2161754281 +2300787951 +3170510216 +4133606507 +2888910753 +648235639 +2679269429 +289973491 +3622724707 +2816859572 +2165438566 +2782521230 +971896230 +1306563968 +2399336415 +2256020907 +2472932898 +2183480251 +3552466575 +3668477327 +1143121586 +2031528394 +1433955404 +1087110368 +560494488 +889565425 +3581589292 +3746104938 +3992451066 +4131703377 +284614152 +2753059618 +1808491798 +3026975411 +1024725646 +1438055547 +355062003 +2019083275 +1058617444 +2916240756 +726937652 +65389804 +2525404621 +4147362910 +1414975217 +3653577139 +305685881 +1281231655 +3981756106 +351657690 +4133925010 +1540326267 +1296682247 +1047532107 +2493424202 +4187550423 +627614373 +543232494 +1105528938 +1216726660 +3331003467 +608692398 +1546330078 +1436687679 +1933926741 +2450297232 +2223524580 +531655060 +2695158487 +3108006631 +723069206 +2610455401 +890629264 +3745225969 +4010966074 +2344964623 +1763243330 +2568109355 +2322558121 +3986983777 +3104280171 +3999660989 +3548979993 +3113165660 +346568856 +1015686825 +2328532572 +2031820560 +864706438 +532129347 +3088687602 +510314921 +3948728163 +506049452 +2961270106 +3453931268 +1940191707 +1527926240 +3397220158 +2383992219 +2077878324 +2660344132 +3751034531 +1570907325 +2013939312 +2698759280 +230294330 +1863049049 +192192415 +2885485784 +681354027 +647214709 +1563191236 +2228251913 +1648300813 +1393235514 +2223492809 +3699307415 +2907644556 +277329445 +2790563727 +162869772 +2686210925 +1869131197 +3470449651 +1927414161 +3497875176 +2288010610 +1815616598 +3706389119 +4014780503 +242612919 +510683292 +4191858551 +3963296248 +1265227870 +2208450911 +384590148 +2446567534 +3503445391 +1163998526 +619219105 +3384228418 +4288235276 +2887839453 +910652810 +350430772 +2006753656 +2028156921 +4245135334 +3338193267 +2576232252 +3023285489 +183626243 +745702531 +447331047 +2498542693 +700740092 +512428417 +3074974333 +2198928927 +2233388922 +1485323738 +1879848043 +539023381 +415227053 +1974138452 +3451788049 +370919743 +1610339435 +1074700976 +617043533 +1431605783 +2240867090 +2316923929 +1397325598 +694554429 +3376690286 +2538507913 +3908010725 +2480414065 +1332234689 +1188252366 +3155921484 +2185210809 +2549410973 +199958116 +1219210638 +2881150671 +3054008503 +2122111538 +3511205995 +4099015256 +4054786773 +3619422785 +2803527382 +4218221783 +1553080280 +3527481981 +3132529363 +3445084157 +150803614 +3867797883 +3158888046 +1138912882 +2565784244 +2274327483 +1875454524 +2391516075 +1878120720 +3573510224 +1194188475 +3467866870 +2361049644 +4267858805 +983187173 +406803811 +2492102906 +3037399513 +3052091214 +2385839143 +1991659102 +1022043902 +576163274 +3353405946 +2701434698 +3439613567 +1606792364 +2649347904 +1844529818 +1376597253 +2496587295 +3397211131 +1403282301 +3180249553 +841744593 +4150573941 +2291441011 +2962825922 +1691798755 +958691591 +3444834198 +3855597097 +796274374 +2131724222 +273985945 +604018992 +139431150 +2007941777 +132526955 +572524896 +3642002613 +2841292446 +2270222699 +1700107010 +3033025137 +3395448850 +2338015304 +3800673249 +3296899170 +3389796198 +2705935636 +3941948125 +2824563903 +1041746506 +2764737690 +629141203 +3827534448 +2496733690 +3771048792 +257259403 +1813264289 +2275915180 +340629151 +2339356455 +4226674305 +1747309313 +414977315 +1318122749 +809220958 +3661247488 +2297755550 +2829807063 +3849006616 +3532921134 +520302185 +4001439606 +879836358 +3255461740 +296852079 +2394869172 +2808132424 +3365797897 +3018589274 +3751495381 +854930494 +1063681300 +2770235442 +1202470662 +2760577726 +3867768820 +932185951 +3392823612 +3216536790 +2981922952 +4226608942 +2934318280 +666274893 +3222712841 +1614369461 +2621772923 +3569815847 +419205255 +3855260115 +3338647910 +990950484 +161514121 +1445856577 +744241940 +3399122899 +1612973984 +3223353285 +1110560041 +3947710130 +1709676154 +1521101811 +981856788 +3292491788 +1724414982 +2841423095 +2768566625 +1868586477 +412283004 +2672471809 +854005554 +2372342975 +3114830882 +3647618780 +405621806 +2952356295 +951172191 +1693550456 +2729249486 +1370615184 +3695068035 +1429206996 +3485455464 +2216333379 +2091665446 +1578877703 +2020468572 +3507063398 +3544093078 +1070057120 +3057098986 +1084984567 +3491795254 +2010344777 +600326297 +1820110080 +155569993 +3162266615 +4121221077 +137394337 +2886101556 +3610340617 +3526658786 +1900013772 +1681922230 +1761400503 +846559695 +2884100689 +103590516 +2797483721 +1919482316 +1489379609 +3624821625 +2410565015 +3801266944 +4179230254 +3791578769 +2943855026 +2949745983 +2111163097 +2563689530 +2818974594 +1888759349 +1620482232 +1172190041 +624172372 +3151871902 +512806332 +2572714684 +2194045185 +555979778 +1305895878 +2062360696 +3171652120 +3175444147 +3010728610 +3601528967 +298322987 +2533906327 +572376593 +1940835291 +4217433080 +219022893 +2540360366 +4229203981 +1409090471 +1456676784 +2249288963 +3063628987 +3945468532 +3657455174 +2060004989 +2256245176 +2914185363 +3301584331 +2216223905 +3476358587 +1031420155 +267418024 +3732624299 +2416406002 +3962018319 +3788881180 +2082945394 +2737812934 +1561465813 +3584860367 +4043238120 +1978104890 +1470211338 +1448218089 +2297756385 +222870515 +2639648518 +1703406592 +2073037564 +594667303 +4287769442 +891588757 +3430863258 +1313749268 +2688535526 +1270903865 +3926353657 +559589907 +305861846 +221132382 +4233458869 +3603006477 +1764198503 +1110497532 +3600196245 +989374976 +3117932566 +274084344 +4152316239 +3068372426 +1188645879 +2709182773 +1778763483 +2572048654 +3578256769 +494918715 +1735044960 +2732063306 +206839077 +1980605336 +772904786 +2030425664 +3359182816 +2399223650 +3284739359 +3190063897 +3328834493 +572840543 +3592797520 +2823929486 +1381023599 +2410071285 +205209676 +1900334632 +3525296981 +2476558880 +2461276927 +2767124784 +1303557591 +1338332168 +954693741 +2520019259 +2141903239 +388769453 +2479620301 +4215832411 +961791517 +3730769197 +916858728 +2429577885 +2860676729 +622542404 +1048633215 +3911683274 +1731586924 +3877739898 +523703347 +3659465004 +3481930364 +2671000029 +3110634016 +2539145405 +2048326813 +2203811558 +376741547 +1726267754 +377057678 +2170317930 +1407906002 +1427085152 +684832823 +287147675 +3465453952 +3502135169 +3141733444 +3821566519 +2808140822 +1043826826 +3308512117 +748880208 +2154067931 +1331778236 +1416054923 +1483567973 +3744337007 +2924861474 +4060106740 +2180859127 +1015350366 +2365152769 +3072055231 +502151159 +2354480356 +3408220401 +2421596078 +2903569442 +3781462862 +225807864 +453352935 +1780740007 +196351086 +3574078103 +2727276400 +2811181071 +3758279354 +3057754178 +1431431741 +249842208 +133650047 +1830095298 +2919137286 +2086863249 +1094784438 +1867701270 +2214059545 +72383588 +3677472615 +3976225192 +243507670 +1801965784 +3021488371 +3616342325 +2082680587 +3426477864 +1569242205 +920984506 +3708202614 +276646862 +3172817765 +122882490 +53433808 +1373824730 +2577965487 +2945445854 +3508159640 +2321321106 +1556506744 +3056881906 +3561258991 +2795111127 +2353881462 +1615765259 +381629487 +3844467169 +2429227880 +3787380300 +3333677126 +1460446346 +1370231931 +366782699 +3631190007 +3038848903 +2293508970 +2951631458 +3985410053 +426502099 +3990398870 +1506336571 +2160390817 +3813838055 +3642202369 +3276525856 +143972327 +3730341912 +2414272691 +1480316249 +4246258246 +185718600 +3753810076 +4213405490 +608195011 +2125431726 +1912725976 +3101512367 +204337747 +1246877984 +823001596 +1335457742 +884532131 +1875830461 +959062794 +3790967107 +1726687393 +3247188586 +1388347946 +491153925 +515723688 +592890272 +2765285025 +479985818 +3005618678 +3781344133 +2103464528 +3956614645 +2279720050 +2326107064 +279820843 +3269989243 +4078941939 +3378881313 +1093378729 +53576666 +2611338969 +774057771 +2096786781 +1117847958 +1311749970 +3207620796 +776180534 +1905150276 +3667834481 +2643068852 +551221159 +3268829671 +1875773110 +1582970252 +4024581210 +2809901705 +855324854 +363213217 +2090744016 +270537780 +100275919 +2652563406 +3815184701 +2706427688 +1978149537 +457036652 +1154561904 +1437809806 +3156833241 +227115851 +3254685499 +2683686231 +2365276760 +4104858930 +2887522465 +3242225314 +3772243877 +3423145623 +314914184 +4133021167 +1206039608 +3841777476 +3712756265 +1681754749 +2429633805 +3829925204 +1963688389 +2219327996 +2186620173 +1604242449 +597348420 +2892369266 +2890100616 +1939199126 +2370896505 +1143852599 +1987282544 +661600347 +3772781023 +4188872507 +2803346586 +4230179551 +515885799 +1768432791 +2829563133 +1233262434 +3624819848 +3244021897 +3984786420 +1573942958 +539896483 +71615499 +3012598306 +3694697599 +2089604667 +1460603390 +868564416 +3440558005 +3773543263 +217372474 +2582866198 +433516556 +562061660 +3975414344 +2500136917 +988124743 +164941843 +805584351 +2005838247 +3479625772 +2389454457 +3936709520 +3478116389 +3406437909 +3368754613 +222930557 +1551906670 +3335941549 +1902094223 +3786455292 +1737106492 +3190639082 +3696667049 +2345980722 +3875543188 +965574844 +2759616268 +1783802242 +2754948705 +2265223909 +2971124385 +1184481461 +190005186 +1320608656 +1998190226 +2608399986 +2701864409 +946040083 +2017386745 +3240520514 +648562207 +1020621283 +3040956648 +1158822216 +1542338554 +2228922387 +986387683 +2546616515 +1310197048 +1411891182 +2245373629 +2529841618 +3836998476 +1658060776 +3266231642 +708423423 +2969152989 +1377439373 +3639587212 +1709865561 +3006092337 +1604109441 +103724329 +2763736200 +1435945146 +1999211774 +2627927691 +2659343649 +1040588929 +3329127176 +1935917500 +2386222378 +4039708592 +683881218 +3533551341 +1154740507 +187589798 +876350236 +466210116 +145199074 +2324250370 +1756399988 +1569658253 +3162331237 +1386831495 +3206987642 +1718183576 +2390292180 +3634847260 +2828622129 +1103547007 +2336519566 +2146873702 +4130200851 +2062322324 +4293802201 +2664945351 +2472554067 +1199873990 +2467004858 +2811235483 +3554691316 +4088839366 +335856067 +4208997331 +287362468 +2253755913 +279637036 +3738679120 +4178497930 +370985761 +1620269758 +942238710 +1450947312 +3545549931 +3986533624 +2016474366 +3122239119 +524191516 +9002602 +3686217844 +443843460 +1221631358 +4292900957 +3881717333 +3868320366 +1298359435 +2016092359 +2716474860 +2955416645 +3036814695 +1287793323 +2478700576 +1942716384 +1043485235 +4290980762 +241835435 +1138037975 +1783083675 +2819404252 +3049200562 +987940466 +4290379338 +3566641376 +3596366743 +1691043774 +1574928679 +1241045866 +258203182 +525670711 +1733757981 +1946104481 +702791414 +964985353 +2790709632 +1365343755 +284756906 +3200174484 +1896307750 +894843547 +1383248660 +271317162 +1913891208 +1068542233 +1331868263 +1243290473 +3307448564 +4244641898 +1966079218 +1507554021 +174850129 +2822872155 +50482525 +2280740401 +31759324 +3402838475 +2776898886 +981066811 +1001309863 +4226605442 +3866444648 +1702267992 +1495239609 +3733925706 +827519437 +2237244860 +3781251739 +1844506449 +3909476694 +3284065372 +1341851916 +4075085866 +720858485 +3255315153 +1807284125 +2348033122 +222327499 +3597605731 +771234247 +3686445802 +446237896 +3749448365 +3618355783 +2944473295 +1805350788 +3497865368 +2886446646 +1601675715 +49723276 +1606848440 +2396345192 +1750552231 +2891812432 +3163267331 +1307591001 +252682830 +444145401 +3536811651 +3427012290 +3537164770 +389953580 +3673368955 +2024076663 +3754701362 +3649205416 +1167908420 +1467102813 +1381660205 +3071617106 +3937978790 +2599467044 +2914935995 +3931381065 +1656477972 +2756278064 +3504386564 +4089717941 +2325843187 +3700343931 +45784896 +3617344896 +3877575341 +702021475 +887460739 +1313248149 +3014046749 +3004599481 +890880173 +345302975 +2671435022 +1448811742 +995958250 +23233856 +3165011153 +1777259669 +3957577372 +473588333 +3545677811 +1368304500 +2162342347 +401228293 +1402456615 +3007681504 +1174159706 +1338080363 +1096559404 +53431832 +3874211069 +364470294 +2969614896 +3554467399 +1655955500 +275326227 +4279781070 +1476858683 +3254696613 +1140428275 +1435479616 +166335556 +2622679062 +802094909 +1226819114 +4222716075 +2736404757 +246801058 +1888992915 +2376109303 +578778270 +3348697287 +305912057 +1870396388 +1100188582 +444162667 +4179461176 +582675837 +1489481350 +3681560580 +219640879 +1260276003 +1609176812 +2457968635 +3681700742 +1108708763 +2062343522 +2332468689 +2013973328 +2440267245 +1880042125 +2479144458 +3851060896 +4202201329 +2804051959 +3097160476 +1493260751 +844932776 +1328827490 +3062465959 +1034664499 +526914341 +1975260406 +558977446 +1081168291 +653726756 +744886885 +2706768682 +3995355546 +1615610309 +859714395 +1050226271 +462519671 +3153669617 +1599641338 +296982529 +2785489362 +3952593461 +4187899589 +2390980325 +746501720 +3891526435 +618113810 +3663715591 +4146466405 +844933655 +236954220 +3530692069 +2009332414 +3028569467 +726989284 +1618804725 +1469974902 +4247147233 +3486835849 +823406253 +89655308 +605184997 +2016919074 +1076532984 +3120162974 +2805094505 +3058997108 +4073471404 +1002559333 +68670525 +2411294403 +2446056988 +3208512060 +3169605631 +1246780580 +309560915 +1357956638 +1568319318 +2111107704 +3641984454 +2920352574 +3611185399 +1460324282 +3589204372 +1312834059 +2042809951 +424617434 +4003096491 +875447613 +2176953375 +3216384845 +713833830 +128366005 +473214943 +4287469375 +303301402 +1207768122 +1544796248 +2568392976 +609894704 +2097765646 +500338280 +1011116093 +923371999 +3564994512 +2302347346 +3654078486 +594204172 +1411819550 +2237974516 +2040283025 +1614821896 +3678486867 +2903306524 +1039104095 +3059680981 +650879304 +2941173928 +3790080720 +3742536194 +1834142188 +2427036758 +2220214543 +2321379205 +147020004 +2880208688 +2956307561 +2854753046 +2374969057 +4131528681 +2053847711 +1267236020 +3979052556 +2294384328 +3707192197 +403356914 +1526103939 +1480890261 +3654301200 +161063190 +2591365535 +3499691771 +1032422393 +1791015440 +1540140882 +1456601438 +1718298025 +3966000187 +47096785 +3246169377 +3945301419 +3603330203 +1904733512 +2922604824 +2707857194 +2449599371 +1550427606 +2752566317 +1022073250 +2876390225 +2446183464 +3971958864 +2283656337 +2668257879 +3153190275 +1027990220 +388404622 +3383994013 +140865061 +3046947016 +3050359425 +1621937696 +2050320315 +1278917208 +4260548424 +1959450215 +3379585733 +840349688 +2161584341 +2846862040 +3169977041 +4284652845 +235263861 +3966265912 +2651415946 +1270956370 +4236812429 +1810719399 +1006305617 +3207897174 +3169224617 +3063878239 +1189515107 +2936265649 +3670266418 +3262502959 +1734117983 +3842389524 +3377967075 +3830586663 +2574927399 +4005320525 +4095565242 +1731308565 +1832857748 +1725932342 +2868637101 +3396725430 +2039366520 +3949716122 +3406698571 +545447507 +3707182165 +475758429 +948031129 +1960822995 +1986825278 +2191142566 +757136206 +521210428 +2341152158 +2125266076 +3086180432 +2912503620 +2408579864 +705641314 +4210448724 +3004785421 +1676677820 +3298009135 +4103511991 +3372997368 +1037337903 +741665724 +1081282844 +2753260321 +3311516655 +2743140387 +3870201205 +781429605 +34551850 +1313394142 +4188942942 +592029569 +3934559585 +3412826062 +1565866088 +2788594585 +3861864443 +948671901 +888821971 +3858185888 +3419051160 +4200344241 +1673791162 +520202599 +89184195 +2565960821 +3100415134 +3042959777 +451176194 +267971558 +2857071992 +1292628033 +1831645679 +4006337195 +483394981 +344799064 +2514786318 +4069521437 +72707309 +1247438754 +1642727646 +1771252348 +2076594854 +937276002 +1562442364 +2231285456 +3583538319 +316602599 +864267328 +3443019746 +1438143924 +1658871137 +909189605 +1408523034 +2269118058 +2829847284 +1291254668 +2307773284 +875903277 +892462635 +3980283864 +2604251259 +2046759221 +1191842891 +2404304305 +2687925062 +2353278085 +3666460920 +527197832 +1395867018 +1101383026 +969178579 +3481879696 +2458334152 +1360443017 +275955178 +4006349292 +2272068689 +1097703873 +1242044275 +2186789847 +803988605 +2475616877 +2931144012 +3172762609 +3584126299 +4094757986 +3225667484 +3615066192 +2355951703 +1030993332 +1973398994 +3918266638 +1450907483 +1506499030 +3726397253 +2214186027 +1764079917 +2875558261 +4033557720 +2849089949 +1107905933 +786527819 +160089831 +578036469 +3826089804 +1806995083 +3068746321 +1316776561 +1580303750 +2346643145 +3148370371 +1811036366 +2113025622 +2585737219 +2346380700 +441364662 +496832132 +3197805516 +2332623409 +3704851418 +1301045766 +4098495421 +1423227316 +3368295243 +3550023993 +1820102656 +4162882225 +3226392410 +2590579479 +2856639332 +3733132827 +4035546381 +3242347560 +3714311877 +4181227575 +191566137 +868051402 +1953218376 +3112220559 +272091119 +307558045 +2274260927 +3886184361 +3506822230 +3560578354 +1745431567 +3036361947 +3263659024 +2561958138 +1373979315 +419451214 +1966513205 +1950309709 +4004630215 +2502850551 +50332894 +3744363271 +3270331002 +1909788651 +2298512630 +4138759596 +1405504574 +1622332567 +3160699401 +1264799611 +1199923336 +2485596312 +2587114688 +4116905342 +1363350667 +452791472 +3507531479 +1161276589 +425459941 +2701754973 +3887732691 +2989720413 +535182909 +3190986415 +3892600076 +3728573138 +3874392303 +1804818703 +1380064754 +2630753079 +305197562 +2976538301 +1463159063 +3947703083 +1210343433 +2329624060 +248879169 +2738955977 +1643606618 +1450166572 +2841410274 +3085165001 +1093728027 +2094864623 +1010410624 +2012609397 +3564480875 +1730977937 +3856612948 +1252809417 +1087699862 +2589222858 +2003804608 +1014791141 +2590039774 +3006620510 +3635828860 +3014512046 +857528380 +3289573786 +2998894695 +2105881353 +248543458 +4130222167 +1069047682 +494204099 +1266192304 +1639634815 +613081384 +3399483049 +3507004009 +2884928435 +1973449501 +3324102210 +1662696447 +1009687318 +1822876173 +681627 +2211598846 +3924266000 +2128121253 +3675395879 +1762869492 +2373187384 +2991456777 +2898189041 +4015061365 +541844495 +3650212568 +1166065726 +1223027427 +757808419 +316885862 +118448594 +2578431574 +2605336946 +2692585251 +1069937984 +2893681182 +55899522 +842227075 +2491338887 +3718298326 +3912246679 +4082287674 +2145599198 +1948584060 +3816822785 +3560394185 +2660719257 +151429112 +1553055436 +3572158706 +1856686434 +492573259 +4115666409 +2283558525 +4065030629 +521919243 +525781399 +932029644 +64926338 +342110371 +3870094031 +2896651483 +1220614363 +2220057381 +2720211920 +3952604616 +2987707172 +3815736324 +2341996241 +1741167778 +692112630 +1773962257 +4151214724 +2089050352 +441249049 +4277094769 +2596328076 +4007864336 +2249488718 +721059004 +1433625585 +1928815360 +2141568176 +4155164844 +2765711731 +2764939420 +1608239911 +54198067 +3821317399 +3583298005 +1799748186 +3542351415 +1597305209 +173937408 +3987470252 +3157301676 +2785669017 +1077146827 +1741986836 +2699319696 +1684997344 +1420528368 +3857273274 +680631761 +3664170241 +1081978728 +95848940 +4159378333 +1846366656 +3684644216 +2916471035 +1863594157 +1705009111 +1302543317 +1222447947 +1230589967 +2544670596 +2553871258 +3358451777 +1899172158 +2598788225 +3085481584 +2450622847 +2298853226 +2880469259 +1261814099 +461832425 +1475905473 +1986163123 +2544136074 +3314099210 +2847247451 +3341938740 +2062397282 +2131176255 +1249469415 +1783205294 +3641090191 +882715020 +1420390892 +810641627 +2511253556 +1235867264 +2556991360 +3329876123 +4200271419 +2146472011 +2803890062 +1993782637 +1506602407 +287184466 +2257302319 +479813069 +3488451688 +141746695 +3292410142 +2118820296 +3135275320 +2565695542 +326282699 +2017454189 +3994076959 +2853847578 +2340099350 +3624408566 +2963504674 +1342814842 +100534661 +364985624 +3149318050 +4277860397 +3104385548 +945077053 +2971224444 +1270768207 +3951941458 +2853066178 +2383680851 +2853762361 +2629703130 +3411970079 +2649049065 +4097482853 +1829255860 +3866519007 +4210347225 +4174827596 +2233294901 +1222757534 +3453322046 +289122064 +172576852 +36594091 +4109917761 +1295052900 +3072291647 +1449493328 +154011128 +3298387892 +3274556598 +3320824802 +10737369 +3415461801 +2039494887 +2237079554 +1932871910 +3040408012 +2858714003 +1506673542 +109200606 +3638690992 +1359908132 +3052399868 +985961152 +2231586576 +2971100703 +3278687756 +1852872374 +153090975 +2300974661 +3806658882 +2009452807 +1452816366 +2592534223 +4282304853 +3056911368 +2069358482 +346571663 +524688985 +3699247183 +1252373335 +1431475388 +3420591758 +3340951257 +1665972785 +3591950725 +1968923694 +3797286561 +3845110989 +1111034497 +1082580120 +657400774 +1180240401 +4253263650 +819596598 +208942214 +1207483538 +118921550 +3796447180 +203552072 +2804237380 +2795674871 +2246586174 +305447625 +1170912332 +3897605636 +3037067529 +3193288730 +1684363568 +1559242041 +4153591442 +2500661331 +3409099271 +3251538921 +2604140617 +104305663 +2865538040 +703626179 +680884900 +3416765395 +1548601006 +277333709 +1018560630 +681466004 +3161103875 +2849623614 +427451283 +327994402 +3681564665 +790374616 +648002061 +2292046077 +2676161034 +3258173586 +3290338785 +799145151 +1188158511 +3037103758 +3877559298 +3664076581 +1907180383 +2765098727 +452653304 +1734734020 +33358819 +3037315631 +3700215667 +1679491511 +1564575743 +3881108504 +4287732308 +676255484 +82309000 +2949313316 +2161759799 +1943882663 +3446726007 +1568604542 +2772010068 +2753445706 +2445205758 +1758714839 +1927958515 +2437389236 +333242671 +4195176758 +3003672155 +2500506563 +1929193880 +3268308806 +2559199071 +2573040258 +433214791 +1033368540 +3243928949 +67555307 +1850990275 +385381264 +3594488345 +727437580 +1506768616 +2037101019 +4046754456 +3900185315 +1718815054 +2737924656 +3861548422 +1320045067 +485871260 +2067236316 +550346878 +669210104 +1370731304 +1233071993 +1075159790 +2751328505 +442730808 +1418466029 +284990818 +1700751072 +262302870 +1977185296 +4060018736 +4198606146 +295869732 +2157974675 +1665278659 +1277867899 +3690011785 +65329723 +3108820879 +905624128 +3034577811 +2310720076 +315985637 +1236230939 +967334082 +3315545921 +4084333530 +4020869882 +3402264068 +1830787321 +1315213838 +1140054279 +48195888 +797236325 +3749660757 +3528937278 +1742717301 +1536145267 +3435164017 +3938473369 +1302966766 +3920031835 +3500814523 +1400714039 +171714496 +82058641 +4108819020 +1715819143 +3798922915 +3482843783 +1924460613 +2561814944 +810802980 +1263955903 +661937397 +3574893796 +1359530952 +2848739373 +460310082 +3706194873 +710717533 +3328895650 +1506141162 +1979873207 +2060242378 +462133289 +1777833110 +1277103609 +3589565174 +1756109906 +3256104886 +3434714280 +3301985511 +1858665990 +3301640308 +774161168 +904252622 +2410446061 +1550935706 +1359694489 +3831971256 +278336206 +1285685805 +2739601311 +3735425201 +3100909096 +3483484684 +2452868847 +102461272 +3808318974 +109959724 +2038422516 +1179084288 +1735081703 +2659437846 +2390698394 +2132053996 +4224459905 +3239945681 +3959892374 +2953509719 +2675864630 +2975595431 +1264991952 +3251607805 +800472573 +3297482074 +2998851090 +2762465280 +4167876078 +1757159994 +3985758123 +1217117112 +722544836 +1017859254 +4133529935 +2542092420 +901465735 +197768578 +1557816262 +3854176169 +1097012631 +2521840571 +2350634398 +2431832251 +4293865816 +294749209 +2786760549 +2727362545 +615905568 +1221182844 +1475012471 +855811087 +4207377477 +3792290137 +2982240316 +2336164100 +48161586 +4248782395 +2821938119 +305824345 +1665858596 +705157120 +1694182675 +3879981750 +2725970635 +3317320693 +667356638 +1317132175 +1958205867 +3613247819 +4011755679 +2468397140 +240091716 +544534602 +809582542 +2849798049 +1419064716 +3982227068 +1906195289 +1138863879 +1158720442 +3452399205 +642182185 +649256370 +2304563821 +4177566540 +480628367 +2968350860 +2491790659 +677876906 +2635777556 +3943791002 +1994362364 +86262019 +1216813333 +3430429015 +3267072865 +2909997938 +2201445665 +3067379612 +2077296731 +2471447919 +1690186390 +959014927 +4212807365 +2133642604 +3554603995 +3307799063 +3089545274 +1944278622 +1639239019 +506931761 +2400204268 +1632591221 +4129564289 +1391163249 +86431545 +2530841827 +3567099397 +1107960883 +1170021920 +4031336597 +2573349675 +2628181637 +1378548318 +3670352236 +2715312139 +1867156574 +3420585470 +3539421085 +3704792621 +2175153388 +442412631 +1248713619 +3588352605 +4213040999 +3391274057 +3773618582 +3871512271 +299581896 +2552034429 +3122320947 +2747736160 +2145162619 +646058579 +3816717020 +1150079056 +2319076847 +1778767535 +2183133983 +51929980 +3890198668 +3519505196 +1584300366 +781855291 +1095936723 +298984256 +1716813487 +3182683224 +3343612914 +1524749993 +4036726232 +3990074634 +1798831712 +908011121 +287507484 +1597152083 +494960856 +2048740130 +1725194988 +3073256275 +694047295 +3066535539 +4116869712 +2938057179 +1633268824 +3926082665 +137525817 +1490219079 +2278388743 +791976205 +3069385968 +737218729 +2587097498 +2361124073 +1174571919 +302248182 +1234469635 +2557139926 +1201247443 +2787962745 +919061122 +1386350868 +4214294567 +2103715438 +2666024349 +960348132 +519596022 +1058628888 +3644575319 +1571431400 +3264987977 +1539098852 +726968473 +609774029 +1433912899 +3147161873 +2910057471 +264199859 +4054893310 +2613200627 +4201843838 +1267956256 +735695641 +4191655721 +934270467 +4140870675 +3341370036 +192925632 +1483260511 +3904477639 +3385173091 +4203994564 +160214813 +1172117757 +533300857 +2530536155 +3545359615 +3457113676 +3099940972 +3543637012 +1101442815 +1016457826 +2268306961 +3206204511 +2133109964 +2473475866 +1554617865 +1989872058 +206989013 +3040556353 +1619780992 +2848759445 +3870076929 +1267834968 +3196875219 +3982638382 +2510677862 +1445526417 +1587110185 +1962975124 +1507846119 +2273645059 +3063037528 +2516458088 +1559506331 +965774651 +128513876 +246051818 +4005463546 +780665289 +2447955534 +1472850621 +3218125748 +2436093102 +1823437338 +1976884000 +3571700050 +2686986264 +3553512847 +640676110 +1584886061 +4116268763 +2920545861 +2579442243 +2980770906 +3708805869 +2057104820 +4127719638 +3757530654 +816636382 +193348080 +337666550 +330270645 +2325494100 +2547522873 +2842976881 +3895060558 +2323702411 +1959876176 +4231023352 +2541080545 +2343860287 +2389308709 +2525603995 +904331257 +4089130329 +3908736735 +787636561 +4213391914 +3447112258 +4170871188 +1928519818 +2146531810 +1120789644 +2342752372 +38052119 +800212363 +1502267488 +4282249057 +2235629224 +1141701538 +3757529763 +310184418 +2812774180 +73792644 +1108171483 +1789750631 +2330216681 +4029472767 +2349036324 +690855663 +3927725852 +3374643589 +1294859019 +152697120 +110683560 +1538472970 +724364904 +4059186445 +3915443666 +1901968465 +3403735562 +4091865357 +3328179296 +502367929 +3994898429 +1841942899 +3928766393 +3800370125 +3612889686 +4286925152 +2030587663 +3076950998 +2775317770 +3397811437 +1448423227 +1320848193 +218334748 +2085251098 +1586156705 +3425761372 +899471964 +3238099692 +285838681 +757957444 +1567610568 +716911824 +1625768841 +1780989069 +2287591745 +1678854336 +2540639770 +4042696942 +3186200269 +3498857221 +2828688666 +2950547993 +68396871 +312551665 +100324 +4271538400 +2994540440 +917271533 +1058548232 +114284593 +1139574359 +3145193846 +3455516031 +899155824 +1630571943 +2180184910 +1533860609 +64593723 +2882141659 +4133423643 +3581106218 +1782284273 +681692883 +3581661944 +135884901 +1294821231 +2634534762 +1033767630 +57197309 +2938006596 +420398152 +978196329 +1261864793 +2214912903 +14064853 +357273529 +1715149661 +1084836420 +3567653057 +1980676662 +4238023937 +1155083221 +3493489066 +2715076275 +1789259460 +2993648484 +3324814973 +3816766364 +1618490347 +4043838493 +1332872921 +3006804379 +2351718287 +2999972756 +3110593463 +3541048609 +1859009272 +1996781533 +422381195 +154487946 +3798537245 +3007054038 +3390589478 +3258174461 +3987087626 +10157928 +4076392521 +2083063640 +3280849298 +2589785335 +666396975 +688269817 +1001210686 +2258449405 +1378109824 +135679069 +525538644 +1057184524 +3316228037 +1281967106 +2381216368 +2440442242 +4023696080 +1155357449 +1610275911 +3997983540 +1679591931 +3523618221 +990978654 +2910081258 +893612356 +2270633763 +2185375766 +3135608597 +695091554 +462791031 +1898815988 +2042156125 +1045786848 +3628278501 +1873041682 +1212206088 +2377815585 +533423621 +3681306320 +1980309136 +1630387881 +1278724922 +4244026289 +2793210173 +3961434064 +692381657 +492336289 +1116813470 +245390318 +1225572000 +684718165 +3102340469 +76678671 +3302497002 +772950309 +2781375365 +2607084348 +3275099575 +865660768 +298216863 +1898110510 +2639156447 +1635164058 +2389725293 +1480503409 +1639966806 +924860624 +657443257 +3122991514 +3156066364 +2547463771 +1848077594 +2253447164 +18795538 +3513052840 +1016313000 +4160188930 +2550156521 +1578498927 +2859490850 +2987529643 +4145522430 +3055172815 +3071633503 +392401133 +3297084886 +4219526834 +1720355809 +2806856492 +3276171296 +2928083227 +4246881146 +2295769999 +1537659344 +4252042533 +2014150551 +2574699 +4164537865 +1735685736 +1212655339 +169403734 +3592390911 +735526154 +3071154720 +116129218 +3728746115 +899710995 +3641957934 +221596297 +1608044186 +3598288211 +3749690398 +1715793851 +3970471065 +866781183 +366756151 +1759783167 +719017209 +709262837 +3782591348 +284679996 +1304998977 +370065306 +4080630850 +3236277460 +2847588948 +3804629116 +3451392775 +2703597770 +3845563995 +399572548 +3881966168 +4267996604 +3347231991 +3743985813 +3384279176 +388178694 +4056405304 +3027103713 +2069215473 +662918945 +3808818337 +3446122995 +3079281841 +107410102 +2367369011 +262232788 +1375149939 +60428633 +3861845950 +2152376962 +2744894587 +2338926380 +3682717513 +1419335689 +946844558 +3661409212 +2454258347 +23652321 +181901667 +3972386019 +458732346 +801326422 +3517414487 +3773765287 +1247743045 +3761451350 +874175027 +2588747636 +3084502310 +3137827561 +1289654719 +371211303 +3805257914 +2650736360 +1199758454 +2794925679 +1759023627 +4291175927 +4192373067 +3061223835 +2730031742 +1322260676 +3366419686 +1876209681 +3161596855 +2327387253 +1235761429 +873520321 +2036957540 +2626904824 +3730714375 +846144149 +1310055263 +3039818603 +201500069 +994915838 +622722391 +3126090078 +1126386818 +1019946663 +3038719144 +4125456350 +3964903286 +3909805333 +590008506 +3603946824 +1023098525 +3480063426 +1905962813 +324545705 +4242755422 +975640662 +1939487526 +1136512978 +2769794253 +2457124066 +2223812304 +293510038 +3746910824 +615570632 +3043441239 +3856622725 +3337475143 +1045388002 +3332499830 +3894311370 +432114424 +1629055184 +2171362423 +1610522166 +2225134772 +3979440134 +692242947 +2158889258 +272545546 +2652229803 +956412310 +20296591 +3561974213 +458542507 +2504468766 +1609281005 +1327949003 +132382344 +2059343508 +865514247 +3538984440 +1788827678 +768553672 +4201337400 +3215091347 +3192723901 +3464985486 +2378524730 +1183286253 +1936206216 +1677349458 +3541079912 +3338651812 +3437792122 +3274021848 +3032153338 +4237517405 +3642905590 +3767401435 +3412700309 +696990869 +1606428386 +3848000113 +1060571127 +427649896 +3057201970 +2099900397 +354962871 +956093047 +3167994352 +467108945 +242014417 +2591307849 +970147845 +1711554177 +2927532747 +3311240480 +233823844 +1490405275 +3091089244 +1177046766 +140127572 +390881463 +1563820324 +1668726467 +3038906396 +1339834079 +38756055 +2895003853 +3017860594 +2550225482 +3138155558 +456981431 +2666131776 +2004169841 +2915369396 +1064854979 +2107853225 +2751635533 +4007133480 +3152902300 +4089607097 +4059385692 +2388703341 +2268092547 +4000025189 +915299000 +172507675 +535504676 +1048876211 +2789253566 +2445558095 +568982716 +805214628 +145927037 +3442814866 +2464837072 +876627990 +876711790 +1779187840 +971481749 +3480603585 +835677863 +2407894173 +2424266220 +3805725123 +3506823155 +95520013 +4144296011 +4149406982 +1314774452 +2030397498 +4114163365 +1578371985 +3873690626 +753146936 +2460219386 +3647192245 +4152243527 +2171574105 +2583602045 +2475961736 +1300617001 +2567426573 +1256987014 +654739786 +2438708745 +4122182622 +2573455067 +4008577158 +683245356 +3423476535 +1454869903 +4292657578 +2646463476 +1515300342 +2977377239 +3519358888 +2234845992 +669671045 +219551405 +3769137522 +855659236 +927306551 +4097146616 +3712320027 +2770352858 +646105471 +1396736932 +3888673238 +3898814608 +3817389876 +843764647 +2080808246 +4231223259 +3379545386 +730383754 +1838604017 +2511401449 +36137904 +3971620417 +637367410 +3725059043 +4159147939 +4087967528 +352118195 +2011011094 +499462091 +3693348893 +3350599522 +2211172521 +363177596 +3715591520 +1158356693 +84205290 +2109280674 +4255290381 +2294218509 +2125304438 +3518846616 +3864464022 +3645523342 +1791032545 +2936881886 +2357709987 +632617441 +2579301931 +3065854881 +3525153831 +1470312976 +2528284210 +2109673680 +3730776369 +2265504624 +2197826190 +818613023 +3529089755 +4211593295 +2331984755 +3689954530 +2953827894 +2216976157 +379862339 +1497571640 +3220262400 +2682518452 +1427315383 +4062427419 +4060654711 +938722785 +932179417 +4223803353 +2181345329 +637285217 +725885086 +2754922976 +2380192144 +1703131031 +3612715602 +1558780109 +3434423085 +732411436 +1698301248 +3183274698 +3019231010 +1109178120 +3762232002 +2254243665 +1408870630 +2754798830 +3210487469 +3850936031 +1555755613 +3068674980 +1597594097 +125744005 +3322524553 +2984631851 +2237032090 +484866710 +1339670276 +2479616643 +3727386267 +1897614562 +2725604450 +4220747551 +724694769 +2489946658 +3864046581 +2173952570 +452495098 +2705965901 +522286402 +2162096080 +1961194555 +2249786016 +882312451 +1749316854 +3572445598 +1152474633 +1711928688 +3550901497 +1529714918 +458450378 +3148070282 +2247732624 +428594761 +1655542756 +2321376557 +1738830577 +4213730399 +2841909133 +2396171524 +3330810263 +3742994873 +4115885510 +2663624715 +773993883 +3988851122 +3249284269 +1730071722 +3811691317 +2721857887 +913244339 +850238829 +271607029 +443451295 +3917995426 +1678905139 +3410160262 +557380185 +1705448930 +3791914730 +1747599707 +2647773092 +258153484 +1947166323 +3837406536 +2346411552 +2799897692 +816619890 +3146808934 +3774836105 +3513552036 +4262301109 +3487413729 +2266651422 +1354866187 +3674025806 +2351187194 +1596393321 +3508090876 +1792717098 +3169867420 +3665286717 +3054539346 +3589380370 +1520608557 +1694037275 +3354652398 +2570079167 +914015430 +1128471678 +1868118795 +1011770085 +2512988922 +4065158727 +1079709898 +576536311 +1772865737 +3808607493 +1580368362 +1922469615 +2097078465 +4114613481 +3922466335 +2461278756 +1781951611 +3898529045 +859638586 +2001842142 +3553384410 +1297934536 +588370892 +4102922740 +3616228103 +1144188500 +3179179082 +2730784216 +4226474911 +3958423843 +3113426039 +2253783688 +230903799 +2117235617 +85671711 +1184001762 +2606095659 +1210912196 +3029720449 +2850497999 +3068285163 +3446726017 +526008134 +863383306 +1200291461 +26565348 +3356124154 +408471192 +291403094 +2175350380 +3700479163 +1542383195 +4167281378 +3736569408 +4122285434 +2635509658 +795076805 +664976254 +1837289464 +1645153610 +1261618058 +1877760457 +177675804 +4135760900 +1715571218 +2303279841 +1984818231 +2841254870 +1107173415 +36001402 +2595170931 +520799140 +2253645260 +4282205805 +227204355 +3078478215 +535277384 +3441673476 +1955171462 +1840039662 +1330821699 +1367045897 +2232944899 +2586248380 +848616007 +324281571 +4161952755 +415977128 +3828115507 +1460955585 +2454605375 +1362912143 +4251220562 +325809929 +2409283233 +3680913929 +1818638540 +663882289 +1668961360 +4174115227 +2766416591 +784622354 +3180417591 +4218982982 +3983834505 +3269974801 +444200171 +2185080009 +3791094323 +1033572923 +2738093960 +2817222031 +3237598307 +4144977219 +1732629925 +142256877 +1001583544 +3152745534 +635892363 +167856937 +3361981969 +1482487028 +1958050978 +1065331877 +1176024459 +3980484983 +851802843 +3403848289 +1417481339 +1514354961 +2432299837 +1728673987 +3077164644 +2081397140 +3162950391 +1662424666 +3598801205 +1737244006 +2354895735 +2078385437 +2293711400 +337391481 +3186289910 +610664566 +1735854572 +2440900633 +2100660927 +771187835 +3893273431 +1689996949 +1221840967 +587475042 +1105346822 +3411038446 +2778726311 +3207972698 +2517280837 +862482174 +444968719 +3878995916 +1992142092 +2596500329 +1996689856 +348678078 +3620621991 +2343485059 +3766424494 +3074872325 +134894453 +2667901508 +3271347740 +3060800733 +781116290 +858707231 +3048040057 +4275992127 +2698914881 +715664411 +3941737127 +2918078775 +2706897130 +3394162639 +3933019412 +1014919462 +1152966377 +1580902791 +305700054 +2850343285 +3129374471 +2960710019 +4163955107 +514107213 +3111201879 +841948619 +2200189733 +3099796692 +3487994384 +3118039730 +3807782030 +3158944909 +921734905 +213184410 +2069418313 +1269638018 +3549833390 +1098442913 +3571146690 +3841348005 +3013196428 +3954893146 +852903583 +947196392 +556179377 +3789385621 +1244184147 +2793942289 +3042281707 +2731008489 +3753067776 +403240420 +3452081862 +1539040053 +3532097793 +3437259620 +3831491016 +1545110615 +765744147 +1895632127 +2888907107 +3920675289 +3322448830 +2694595544 +1173788879 +175166250 +2821191239 +4102932259 +1678215201 +3337041854 +3487943562 +572263605 +1767509508 +3597646150 +1928478931 +1508361503 +619704792 +1186871186 +624069524 +2486168375 +2423795671 +344275692 +1739363666 +534898174 +3631092436 +1159224489 +30593155 +1684516730 +2063526531 +38524401 +2899747241 +2627909029 +2164936070 +3462930510 +3568123678 +3239492890 +2355642212 +2663998116 +827186071 +4173684842 +1169377211 +85361770 +2354414908 +2979306472 +1411076615 +1310765090 +207515965 +3128424705 +431468783 +2295960275 +864250972 +3186744563 +1569070696 +2787245114 +2474758353 +4223680517 +3257660154 +2050418644 +1971526599 +384333398 +3513988425 +3799697132 +2711864333 +2964515377 +3011062932 +264330771 +1818152349 +1632946799 +299698423 +572198572 +312285161 +3219821908 +1797603804 +714786470 +2943482701 +1223489690 +3923730002 +757100827 +662021419 +504381960 +3692708929 +681307766 +3189144310 +930503831 +368026549 +3867510991 +1320891777 +4078934193 +3402798464 +4080584628 +4031830415 +1201924586 +738660615 +1915678703 +541472717 +117991749 +784798261 +2716312514 +2913044904 +2219229797 +2957815540 +2721569189 +1896875807 +1419316209 +1838203255 +101456285 +3520061602 +309754281 +3959774275 +2168820224 +931530538 +3911882990 +4244435754 +142734797 +2776288401 +2198240298 +238333983 +3370096338 +3210143253 +1776246384 +1698866473 +4181474795 +3278667869 +2205264524 +331688175 +4127363199 +2530695711 +395458647 +1844962223 +3446124319 +1651570259 +4016355469 +1877377352 +425813622 +709315460 +1343809251 +1991860581 +3435049590 +256631425 +3435660028 +1295202772 +1722154275 +2589690876 +346183066 +607862700 +2808661518 +4286256687 +3233180005 +1354625206 +3663105928 +3978086523 +2059232008 +3336762050 +2498525930 +3913430710 +3183157967 +1053888679 +2962764947 +3049258653 +1113624749 +3511264073 +3405268963 +3814493178 +1703017297 +2119908538 +3461200283 +3074948568 +3328858153 +4240115991 +378521091 +3646210481 +1692330771 +2415930643 +687957540 +2618506767 +2656886717 +2920650294 +3867847250 +3622307349 +403349408 +2499447282 +2442492521 +1221616724 +3323440659 +3479897113 +34649248 +1466631365 +463303666 +1739261723 +693230977 +985347775 +1952777620 +3086702423 +468108863 +2636053475 +3130821608 +779336416 +3173623636 +2472237534 +1739147908 +3687019095 +3527150042 +1494700463 +3178458253 +2801222012 +2454110390 +2839717403 +1102028296 +3735309026 +2497979646 +63820576 +2741310506 +1096389060 +692991188 +2546195316 +2570673524 +4003067514 +1630357707 +2204287662 +1320989492 +2337015555 +1073767250 +3771743859 +3339760058 +1617437311 +2885553955 +3129654827 +1762508798 +3696257785 +1627280815 +4243230696 +2829962916 +3404596283 +3736473541 +2074424329 +4146461143 +2734355121 +4274159302 +2102216882 +3298173887 +1335849302 +3544194517 +1690392061 +980854589 +259360492 +66477433 +1811488023 +1226390107 +1692510210 +3261836380 +363769830 +3135199972 +100055430 +1962759202 +1103587504 +559468264 +2107871149 +927789529 +444563795 +260104391 +4181850156 +2389247047 +3216347176 +2984698749 +1528067135 +3283965590 +1617805347 +2339379904 +3061726345 +2881130400 +722188549 +1962298420 +3946984638 +2781429857 +2319331619 +4050783585 +878670942 +3626727300 +2074591441 +2377203483 +756127103 +4208852016 +503521391 +1682864996 +4206916085 +2702129810 +2147646394 +1336156508 +3182721268 +2706928488 +1786744665 +4283579494 +3956059635 +2043484888 +1571318201 +3170377531 +2251989723 +2106070424 +2786005639 +3799705634 +506816940 +328583271 +992468734 +2582438552 +3056611 +3991913846 +1914714869 +2009224044 +4027983593 +3273224376 +3646928309 +3175163557 +3207097808 +822823411 +706308071 +172795527 +3244757236 +307995918 +622474186 +2158805782 +1953259898 +2608418909 +998891915 +3166923558 +1788835997 +4163610164 +3864131845 +1645472902 +625257234 +1888692642 +2488554946 +1602645412 +2797412005 +4090795862 +340375790 +2665590742 +4110648504 +3869396850 +2753892773 +525248707 +698161852 +3553761076 +2261156614 +1079192541 +3267250233 +2886180938 +1686473520 +265540119 +2913571966 +1019810476 +3461909546 +3551790422 +17321689 +1313738733 +1427461746 +1133910550 +500962802 +1378600811 +505229958 +3218060946 +1756237059 +681267856 +3828131827 +885279682 +2731387363 +4051168106 +1532596017 +3213243156 +3977135224 +1473552780 +1741000713 +3362896462 +1702997637 +2853068883 +3082063841 +2818636689 +2288415591 +1670201639 +449233450 +434201185 +3437943132 +989808428 +3834380803 +4112874873 +4120343998 +967332983 +2338046384 +1215931780 +3281429921 +2365435060 +3586665023 +712660773 +937833055 +4232678571 +2670321166 +1301225785 +60551272 +503764927 +3854733643 +1528540062 +1502293179 +1007517788 +2933865957 +3564759715 +2770755492 +3945507118 +3369306016 +3241904974 +1512887688 +2816494953 +3326476 +792035793 +1867854628 +1316234807 +2087029811 +2513968403 +406899359 +343532096 +1520202783 +4073615880 +30269998 +1496026206 +1389067294 +996567952 +4092325377 +1243111399 +3381623885 +2591260058 +1601368403 +3344013986 +1366619404 +1810734582 +2456881482 +2891431513 +3738374423 +1789350323 +4093710770 +1381543110 +3567169646 +3352780699 +2878170015 +2609134546 +1172051856 +2106924473 +3376735623 +3622883371 +1146868095 +1331309109 +3913812117 +847497927 +1567941802 +3346245326 +3651853610 +2077247523 +710713434 +699785371 +3898137385 +3291409895 +2134528090 +1382654708 +2851841003 +2936109746 +1853163921 +3749103683 +3177268895 +2559454670 +3687369748 +2988961616 +814177939 +2141491560 +1136066322 +3304982762 +651027890 +2925303025 +2838960400 +3772820843 +3412421810 +2621379117 +697233830 +568830757 +3486177856 +2752823379 +1116645087 +2747060764 +271018595 +1175857531 +2587893568 +2173309441 +1133032195 +1039102075 +2652579117 +2447602990 +4181249545 +702760834 +3265564470 +3331181027 +2108596890 +3761017409 +4139515811 +809946129 +2246972259 +696905195 +1872256528 +2657343727 +217352588 +2778283789 +3832555375 +3564418552 +2867887182 +1093389718 +2547784494 +3277308739 +2872037510 +3409835435 +1684928240 +4031773307 +281272137 +3031155756 +1158147065 +2174856092 +1595779326 +3984938906 +1127283475 +1346375699 +582606257 +4167534639 +2762633295 +1552069320 +2663992228 +3502692642 +3065283303 +3444942960 +1984294084 +881778952 +717723916 +1872668995 +332658517 +4009286806 +3380852301 +3604126699 +2671967170 +4253042082 +3688183888 +288257248 +288529477 +736094790 +2325985632 +119779202 +1922377141 +2412006071 +3105370238 +88589478 +2184363924 +1633907367 +3514701589 +2077103965 +4169590145 +3470346995 +4140506753 +950731651 +3171289408 +22597875 +1237049894 +2093583140 +2599559453 +749121511 +3037957435 +2116037254 +409627304 +2639924917 +3416860960 +3987562357 +2277618669 +797520023 +3857322309 +635188213 +1713630461 +3015233417 +3888074618 +3537255462 +2811714790 +727466979 +1448310458 +267456581 +62313241 +1596165161 +2689365340 +3990987862 +3055284544 +2781985022 +400065902 +584376750 +1877863938 +1181614013 +813838246 +2734277859 +3881571112 +3239787570 +803950060 +359775428 +2355909938 +3510134830 +984699712 +1590587719 +4100767246 +1126050589 +1696947619 +3030111298 +3890001436 +2583036552 +4066858375 +1324730671 +3420289456 +2845557480 +1206123599 +778144218 +2714051039 +3679724249 +2995009381 +2410390881 +560597184 +3360068778 +299608150 +1788111185 +2388207471 +4028053920 +3666753550 +2187275460 +299771603 +2704947793 +3444435455 +393631831 +397920821 +538112111 +454130018 +228913473 +1931239356 +1127539883 +3418114479 +3547833440 +1420997996 +1094291778 +2366763202 +760984801 +948237479 +2671237963 +4055631026 +254788673 +3963827753 +113637006 +3936954028 +807635013 +215253544 +2484109981 +3113044378 +4139283585 +1822489907 +2130574711 +3342367026 +1867838110 +1452102297 +1889067628 +1874376841 +555964447 +1953319833 +30231579 +4144642831 +892451142 +2363041293 +2353638903 +811384272 +1490707522 +1844667740 +2646816610 +15456221 +3684071784 +1183236091 +2615311154 +3727175002 +3826013175 +1714659929 +3800429974 +2826906120 +1470708545 +2742203268 +3544523320 +25022474 +1077206782 +2362939249 +1962813686 +2719900355 +1710461286 +70617010 +3751203366 +3474388819 +3929278306 +190486863 +3607768820 +56586034 +4023941073 +316367320 +2981104018 +3653036075 +3409120583 +4079901893 +3475755374 +646248615 +1535774140 +750483809 +806213542 +2540135368 +2781630360 +1192602262 +25930740 +4034240655 +785989218 +3369044596 +2469343248 +3068430966 +3241721216 +3492318249 +1941608930 +2521757486 +3900759040 +3917899741 +1885942295 +3211067784 +517299883 +217277587 +3432352980 +3084360896 +1099829388 +3906814956 +1025034751 +3635923432 +1442486989 +3082277868 +426048926 +2385313053 +2997228573 +1654318151 +757170958 +3783053583 +937718621 +827011114 +740290508 +271446082 +3681142836 +2906909984 +1058727485 +2372497098 +3801108750 +1141531116 +3608437244 +2719616105 +2103398551 +314985408 +3714157556 +1079971091 +195878905 +1287178673 +2026590775 +2944897196 +2590688 +2107718528 +2512693325 +3978233901 +1316468361 +700763417 +3802658636 +1029205336 +3629518198 +2435103449 +1225177095 +341499023 +58414935 +707266658 +2842437467 +3501353190 +3368302646 +1926739548 +3587772681 +3165683088 +1307281469 +208268187 +2632047631 +3500676920 +2011447215 +2401237940 +2675967714 +906605930 +3737647842 +829718805 +2190416849 +3152855857 +1688745313 +1360598559 +1367948872 +2141982655 +1358499970 +570807805 +1997194924 +443597235 +630741193 +1270499162 +2021746958 +2711155636 +732012281 +2627550473 +1869284135 +579563955 +4004616136 +3858708917 +3318950534 +232883734 +369994456 +1239918746 +3679205916 +3475738899 +2626006828 +2395573335 +2131477957 +2210544244 +187307053 +923581557 +4258592812 +1690320689 +2527951380 +1243646324 +3056405614 +1885423367 +1581579975 +2442996698 +2250946206 +3415147246 +3800323715 +4026299382 +1785270150 +2384627156 +2730852433 +3164876517 +3047957256 +4222849871 +371111311 +277717066 +1609955773 +3955147777 +2012677828 +2916924073 +3261652559 +3077745383 +563697439 +2295132613 +3549969317 +2609154510 +2726896649 +1285145843 +3308414581 +2298261478 +2876927320 +3733240692 +835518909 +1112498786 +3833309630 +860896958 +539923793 +655556106 +1520145903 +577218032 +1297519093 +3707739658 +1176625417 +3097816109 +2868171997 +4284083471 +3883537215 +3829871606 +3416032022 +669669505 +602259027 +2997533663 +2379821999 +3593649914 +2984756943 +3295007956 +2227272293 +2210223731 +572358874 +2551944509 +1794664291 +1686701792 +2822718182 +2193570414 +1067669245 +3911664471 +561297268 +4119477204 +3577943608 +2828068434 +1758506283 +1337091899 +1339473484 +4100188433 +2211852199 +4161762346 +580630157 +86854939 +1955303706 +3852254123 +111098316 +3299130517 +3607561279 +3648393271 +1316686027 +677932328 +2156733600 +3655302731 +869554235 +1263972666 +595388499 +2542548537 +1344704354 +1032283213 +767495645 +2804697417 +540780067 +2643410639 +3944550966 +2296010030 +351594264 +2815002476 +2758501059 +2806304291 +1826821485 +2343809259 +3460754733 +3145768109 +3960301556 +4226081480 +3237743590 +2404793849 +4267041522 +3643328747 +64521869 +1438443536 +3614359774 +3800110573 +1236085441 +2841437052 +44512265 +1985920545 +2798316919 +2440259138 +3016543507 +631371469 +3809287385 +1500615390 +2404711822 +1147390550 +737965400 +2205971326 +1512098396 +1317583810 +3273572724 +3809135837 +4210856979 +3529339498 +4189396771 +429543748 +2122439245 +2751606535 +1332359295 +2802610791 +2588278433 +1010089025 +634860075 +2717185385 +3882864166 +1751695371 +1149004772 +11992011 +411822984 +4209465871 +1345626121 +2347395658 +3237101479 +2032709883 +3914458269 +2516067469 +1360983660 +260080249 +2360620844 +3279160740 +2485830462 +3534816180 +2694989312 +1890051183 +1616172452 +2176033030 +3321933866 +2533696228 +4264018408 +3344820903 +3623757532 +2886098849 +874310355 +3823229275 +1652203502 +1656156589 +2434541162 +991172077 +1567777821 +632943244 +27147383 +535264340 +2170034156 +3870215836 +3571003510 +3943616086 +4026800975 +862462653 +4294624160 +1048551020 +8318971 +2799631345 +4033121383 +249776911 +4185344706 +3563928614 +4201501747 +2996251292 +3367812329 +3326905897 +1624165077 +1437165123 +2705952138 +4262957767 +1436008715 +2434653528 +1061051190 +938652743 +2266985220 +580682735 +2353027131 +376598261 +1776150550 +399191036 +472329071 +2332264466 +2201185473 +3890135391 +423531920 +3736297891 +3407578755 +1314429545 +2388899488 +3268110307 +1607223305 +1603486505 +2056745785 +314486434 +2588566711 +1656717214 +711187511 +1026594829 +2892621429 +3780457231 +2446106115 +3440747737 +3808836909 +886464786 +1350675731 +123273061 +3170063217 +2014550101 +4145396290 +1771049474 +122149521 +274113951 +4161634903 +2285600256 +1843075185 +1222478560 +2344401965 +3690415963 +1416615693 +2107243711 +2202329526 +1865413358 +1409166258 +3473701151 +3013942643 +874781237 +1065766193 +532945017 +240791373 +2157182688 +1060940217 +508595268 +700958480 +374567650 +400564456 +1286018011 +329831986 +4126489576 +1718906076 +2270874335 +837917606 +832618917 +2274310832 +3556031011 +977188775 +725901180 +2933748491 +802402855 +2261959429 +2519463561 +1566236273 +3106630142 +1684418180 +2276846147 +1629333204 +2640415435 +12713719 +838012252 +2482502326 +48833275 +1984429505 +3343994079 +2558556624 +3939839458 +3074290271 +837638359 +2186469426 +1357735247 +1460254068 +2189814712 +3808419719 +2012287073 +2405389042 +4088687755 +3982123000 +2245874452 +1234381598 +4201661377 +3389151305 +2334139366 +2634651900 +2059286508 +1420803221 +3861952235 +1260349354 +1463741215 +3750733011 +111288712 +1405331091 +57641330 +1468072056 +3996369271 +4004541666 +1769755979 +1180135265 +413669601 +2778764979 +3301208693 +1014393805 +3864427148 +3416678521 +1852613421 +488168680 +2444788984 +1498280832 +174275114 +2679191822 +621120473 +1392453342 +1709785324 +3737148741 +229781842 +1852606324 +3524629353 +30987184 +2705756765 +2508873219 +3941392335 +3284891120 +1558316051 +3023145729 +2598815293 +2341426895 +378595350 +2496408794 +3589344411 +3826282394 +2076892336 +3261050065 +1954601300 +1595753950 +1154925787 +3030347765 +779498388 +2132602385 +614977064 +705534277 +2953010506 +2620662696 +3221911911 +4239103060 +2743101528 +148619729 +1350780530 +1110922989 +3909114239 +2163855716 +1996013020 +1250104406 +2803496622 +946498437 +366797245 +1461586356 +3247633109 +2631549012 +788215142 +2778061071 +2144285498 +3769533361 +1991928359 +3644505171 +1116680769 +2807008429 +1424981237 +873358435 +3486246516 +2972491891 +121238938 +1876151625 +2876245705 +1644241793 +2702328351 +2703333427 +898852683 +346605928 +1213389120 +1292839516 +2369977660 +3103968989 +2359132437 +1872042659 +1784086356 +2226667360 +3732049109 +3419927844 +2993212312 +284776589 +4108200497 +2585181384 +3678315590 +2403124189 +2597015492 +3382494040 +2237238938 +2306473338 +2639541002 +823999533 +415780169 +3355564115 +2556321148 +3251223299 +2819621591 +3288381665 +3474018650 +3774356960 +2393878713 +3225419818 +3351573188 +3300698378 +3823315237 +3196912580 +3072058753 +1170435355 +2955304046 +460082555 +2857033288 +2464912104 +3100949535 +551723785 +26639195 +4290539230 +3691626071 +1719943115 +3925107542 +3226188055 +3840790445 +4170817712 +420232139 +301056619 +3257703844 +829537484 +2976476925 +351403071 +3756778812 +1336941596 +648381928 +3965835449 +3148983286 +3376247769 +742731604 +3917278794 +1501242965 +3543618985 +438672550 +1718601589 +3896744113 +1440769510 +3851334342 +3308084039 +2025980085 +1394722753 +1276466688 +4057695608 +1204649814 +1893280316 +4084476055 +3179635210 +1937453685 +799316885 +76113341 +3944990045 +2072874771 +1851937361 +2435682937 +3879195398 +1739115397 +759622605 +3618712049 +4223584634 +3093596315 +3015838837 +1407622427 +3539326893 +2188276217 +3708519367 +3741876604 +849730858 +1767409589 +4084622489 +2348473885 +2149525023 +2715098505 +2108923461 +574884110 +403054 +1835076740 +2718420487 +3798956101 +3002484852 +4270113829 +1519217108 +1182214720 +4202960297 +4211161672 +1684744495 +2787944414 +1101780907 +1307693187 +1333361279 +1038920302 +2820549766 +433443851 +3096795213 +369022175 +2440478724 +1780915009 +3406100931 +681709934 +3011796951 +4067059452 +3532312705 +3990014403 +1087273897 +1508294145 +3109858015 +2662206711 +117982344 +1537425861 +581367772 +201406187 +3628547686 +1793695510 +458699616 +652139163 +81318337 +1174637431 +2884913091 +2172012643 +2550656183 +713668683 +3448284645 +1901901990 +3916140154 +3187021418 +2457660501 +303736427 +1415156058 +2068056840 +1442483282 +1220555286 +2636380705 +11760685 +4156745798 +557934027 +2497247655 +3567729091 +4142613184 +569038453 +4250033845 +1548090693 +1477185350 +2562504433 +2963875728 +3036006502 +1630113742 +760239684 +2514124399 +423582821 +594760057 +944298821 +1051145167 +1145497376 +3478648909 +535114724 +2032797268 +1988560261 +1879100592 +1015906449 +3762163430 +1898690951 +2723943714 +4278571987 +71873501 +1768740687 +451263350 +1514527116 +3233337628 +1732349161 +3631857813 +1872477969 +1101950439 +3417250888 +350980188 +36350493 +2160271997 +2863951735 +3443187110 +3059211241 +3299994288 +1162083387 +2198229070 +1202353714 +2212336023 +1755039248 +4163680071 +3426807178 +4011053067 +2635285650 +3239716981 +3561251101 +2366635374 +2410018439 +1168874403 +2813206424 +3582122583 +3851402805 +3856558808 +1356557305 +931675409 +3943358293 +990644962 +2286554260 +461048328 +1530072896 +2373132061 +1528457768 +1556967227 +1705494031 +3361156370 +2207080730 +3220596596 +4099026328 +1572435817 +181348544 +3916383901 +107195889 +1430199582 +424176916 +3979547858 +484525210 +217315626 +381481200 +3132133074 +3968428188 +3847324843 +127047306 +805387222 +3291868011 +2672501480 +241188081 +2531637719 +4213638174 +66050257 +2904906746 +89337478 +2980389102 +878803755 +2172448929 +4121512328 +2683591285 +1025674583 +2456951840 +1110067214 +2990211884 +130982237 +3308774060 +586998063 +1034009971 +655640026 +326565745 +2993928568 +880977465 +373330691 +2268642636 +2495935236 +2568363462 +4023084902 +3351108039 +4138200052 +275318660 +1876065917 +4133957824 +759457830 +4020908873 +1935579567 +2031790128 +2017604324 +463238299 +2497191054 +1129033957 +2686953944 +961548319 +2992376105 +2727445645 +2698272232 +3765395267 +1833289839 +1221934835 +1079719113 +520559496 +3280503901 +2466665840 +867258505 +183777483 +1967278477 +1342101682 +3685806180 +3169259951 +3174108910 +861537624 +2088101160 +221291421 +2619461948 +683023935 +3479266868 +2851449545 +394215565 +1999799571 +3481528722 +3196837961 +1085951635 +3957738890 +205600107 +1534955263 +3992943105 +2271478780 +824736298 +3666805134 +491117910 +741376810 +2159784068 +548801491 +4139669354 +2347061342 +596360044 +3388004554 +1173812951 +1204568784 +1863006430 +2002028900 +666979166 +1565963937 +3952013108 +3276911018 +3171692455 +2059386606 +1027031528 +4241001457 +2893860820 +4006785918 +692361463 +208006737 +1068997917 +3735990836 +163487092 +2591677116 +2629781402 +96554468 +3758411608 +2161392402 +1036967338 +974850811 +3154466810 +2672415303 +469313063 +206783466 +1839329682 +407484930 +1273071899 +2871948764 +2477603119 +1338417920 +3731275749 +1372332854 +2764115047 +626695256 +2443762275 +1425980958 +3663936456 +566893660 +962610943 +1864451186 +3338410595 +4213430871 +166883724 +205465860 +3091561362 +4133714937 +3624467405 +517333544 +79730626 +2794286785 +2267662213 +1304941859 +1328866020 +1717043216 +3439567266 +1526757529 +773596808 +1190422469 +3244929405 +3201889080 +2782140197 +3677802305 +176536505 +1678989751 +2325942233 +2523130369 +2567335774 +3284026454 +1152167658 +607413397 +2154752906 +701028817 +2031607803 +2743339927 +1865403467 +3693827214 +3665498571 +1471423687 +1981220074 +2237708340 +3861703214 +4099976157 +1137654133 +929625725 +647849376 +1710422657 +3231426777 +1890575831 +4012856308 +3703617338 +3922991757 +1635672218 +1187399578 +364738103 +1369785308 +3675815736 +2384449422 +1399830589 +1250373066 +4236170819 +3569191084 +2492251831 +1528303041 +959504744 +4291541191 +3328739030 +1385939171 +3302413947 +1146216939 +2358521037 +2463690188 +3502868731 +30485376 +1430742455 +3024039536 +216313557 +1461757662 +493860314 +974335480 +1088896775 +1554343052 +1510917933 +88379433 +2156078733 +2661628742 +1865126178 +2655215360 +1460557151 +3217015061 +3926016669 +2253707980 +1411149570 +3714368384 +2396376667 +2904637894 +3868912623 +3718498299 +1296075109 +363437177 +1787097928 +1012955954 +3149837713 +3429466282 +1521406011 +3585897689 +2943072512 +4288318684 +67274473 +2017635894 +3072202382 +4202099609 +1629388537 +582038331 +3407004279 +4276638416 +3975793212 +3561119669 +2018433884 +2139632283 +2693701564 +3510927582 +330001708 +1878860163 +4136801221 +26623706 +3150753808 +2624641609 +2271504217 +24438696 +3976531001 +2845977630 +2040120531 +744404766 +3630391287 +1536934359 +408143093 +2321999048 +4009104842 +1398549256 +1417781765 +4035811405 +4273169187 +2516093672 +3329186776 +2699727255 +4029230906 +4233442604 +2304196863 +303056347 +4189005717 +2266376594 +2409949178 +3349207928 +1696301941 +3429512685 +339892132 +2209738 +62108758 +2258747418 +3332991656 +4090678497 +1621232756 +4252918857 +42011194 +853089329 +4178662212 +4086312084 +2861834397 +1681933849 +3163742729 +2191880791 +4170707433 +2736556377 +542017952 +3440928266 +4221062731 +4068507968 +1790987014 +4056849326 +479172204 +1124128162 +3842157704 +2323496897 +967617865 +3505442907 +934615153 +828619364 +1969512003 +352226066 +2765994587 +1747662128 +714198024 +25239576 +4045609146 +4004866134 +3422311538 +1308905507 +4119141273 +2934090822 +2198307845 +2574708820 +2221533799 +3390890580 +851537312 +3543184338 +1465629492 +17908406 +3276527939 +3276828744 +3493647346 +1069358112 +3307055502 +2017648930 +10457825 +1711998839 +1187323665 +4084383201 +247750883 +2500272918 +1261896402 +1950557525 +176970727 +1387814049 +3839202133 +2334446980 +936857021 +3534172341 +2571606499 +249901951 +4232678130 +1427847332 +1305584777 +4225862846 +451059154 +3958158280 +3591750489 +849290691 +2514090407 +1427315404 +2703121468 +472016707 +1424274347 +2752239996 +2703362555 +2902370430 +2804763555 +1251992092 +2822178516 +2648226358 +950487772 +1874958362 +3530613938 +645937155 +1237100331 +4002433864 +3564466840 +2481059693 +2538190270 +810992202 +347413590 +3370823394 +1211205103 +1206349961 +3299671279 +685538428 +3568732384 +3686790577 +699513099 +3580643368 +73630694 +2381865874 +141886784 +805138367 +1191216868 +2673386236 +2014867525 +33051800 +1568374813 +3361849718 +861528071 +1801998437 +4050328359 +2896319688 +3665969727 +3405468366 +3858869436 +920784801 +2122241156 +1072926364 +2980261265 +429562122 +1345413266 +1287981706 +720717823 +222144288 +3510652159 +1231406855 +4198238947 +2887135323 +1506846161 +1287389156 +220567206 +4070858560 +1618802764 +1454035774 +3032155443 +2045980460 +1572056008 +587349206 +3363458813 +3369940376 +4133163152 +142300618 +1425095548 +183387298 +3427414669 +1088913041 +1527910220 +2878244062 +2653616572 +3885120539 +3063038432 +585717385 +3609392079 +2039717178 +3745383226 +2850437490 +992439795 +2941876700 +3034189065 +698345372 +2044578814 +4028130121 +2214072740 +3152661048 +961784359 +3214513481 +1428017460 +1393323684 +2245677057 +4026341977 +12224882 +528044180 +3216915862 +828087042 +230581205 +713582553 +3422168291 +738237229 +3063733189 +961214995 +1796593429 +2134709685 +3571434687 +2999451183 +2435882636 +4004120908 +1515362810 +375521426 +992667718 +1225682409 +504719173 +2828144522 +828269836 +78087301 +3468047910 +3228342463 +381678958 +320665676 +2030715566 +2001120295 +2498374122 +3540761087 +3324087287 +1267947849 +642157893 +586276471 +3427527438 +3468131894 +3590477529 +397708590 +4269699649 +4055525555 +793110441 +3301630427 +3851517726 +332869135 +3484001661 +2692944386 +2064006802 +1605470559 +4000357812 +60012344 +3255816561 +2739770564 +77291021 +1731285427 +3750062232 +2134305854 +173115341 +525459789 +2428228813 +2480777954 +886051417 +3684422356 +1589671925 +3311871808 +2713895171 +1972831944 +3030834661 +895474710 +228371438 +3706300877 +3092907596 +592731379 +3436344512 +204047373 +1100821781 +1952916849 +4142047603 +2455232689 +2444648242 +1429119375 +932539953 +3056189382 +4180132021 +3295914078 +2871758024 +2390057383 +1733819261 +1860847873 +2182913330 +2809948132 +3133712476 +3091439636 +3399474032 +61395015 +2807545293 +2653132656 +114547004 +2587918625 +1435903640 +1653590642 +903863965 +2221021242 +4202130243 +217911720 +1408998485 +4080211050 +789931160 +3796990800 +2411254947 +960238785 +3958458902 +148222763 +3693925546 +4058413777 +4151484070 +3890489278 +3432519631 +266722861 +3468895161 +428378139 +1600206844 +3936888952 +4103100424 +3650132775 +3315185174 +260127671 +1975608357 +416719259 +1792153393 +1259041471 +1332730553 +541300111 +1644910940 +843601482 +1834165926 +1936969591 +885038259 +2621041169 +541157262 +225028448 +519397549 +1025414087 +2558776515 +4282220846 +3038750409 +1153865380 +577420596 +3073443845 +3551845354 +1730971376 +3154305075 +3428030193 +2204918000 +1915233793 +2659287403 +1863157623 +3014600873 +149901391 +3897658999 +941642478 +1378494323 +3499446793 +2129760150 +842915957 +931062318 +4242984508 +2639244852 +2027580658 +3362955878 +3335698313 +1507406159 +2712281935 +1962817041 +2195316310 +1171288067 +3038887124 +3166690773 +2636041332 +3772532099 +2907616538 +1875784085 +643404769 +1046756321 +3436823771 +1387571444 +761300907 +2724660944 +2686594858 +908010875 +2878024547 +1407180869 +2689678935 +574526324 +1555916961 +3005366358 +4207317917 +2346836453 +4077192312 +2112298250 +2435282545 +3201976620 +148399575 +3179195762 +2273303406 +2725772047 +1540364277 +3533979917 +1111434174 +3659897915 +3743819363 +2535922915 +1240192426 +3438311623 +727387054 +2553268584 +2826099494 +1580758397 +1840995720 +1091817873 +2974367752 +2026795900 +967502851 +784083290 +1781201487 +2735362831 +985125741 +881850294 +1752300752 +2182682301 +2092695568 +3703575222 +1073413097 +2418402375 +239600548 +3692360246 +2980955049 +3917513594 +3278974819 +2280964684 +1335719767 +3116838368 +2710645010 +1389350601 +1267910605 +2071413019 +1065827231 +3990642861 +1988836921 +2619408974 +347008440 +1178906119 +2732274355 +2024293927 +3190425616 +799178782 +3376055349 +3675237935 +733734085 +790652935 +2689741927 +642257746 +3122739454 +3434072167 +427537226 +1033670232 +1665449072 +1405795741 +2498612955 +2453061187 +2248088039 +2252863689 +1319945191 +2126341108 +2487011379 +2134054886 +3467066788 +3403160199 +2153324560 +1891356935 +1420335705 +1967161563 +119179838 +200459836 +2496111769 +780690135 +3814266233 +2579017409 +2882393692 +2532903437 +146465037 +3411210531 +2486522286 +1928812469 +3128921869 +3051317752 +1883793361 +1115800497 +1953433277 +738570621 +3052385780 +1588697712 +206768368 +1976033836 +1468136626 +3928555474 +528445315 +2121247226 +1655584184 +3249415289 +1815099766 +4249282043 +2467975508 +3630348332 +2023134996 +304453104 +804796502 +306346341 +2956257336 +3671427084 +272453733 +636182650 +395286328 +4156208602 +887837538 +2882877550 +3360676089 +103170751 +3476187367 +3967542417 +1062446392 +2735547855 +1706144317 +120367478 +2032732985 +3793979782 +1235059099 +114510815 +3536042876 +3480974053 +3549766309 +3061780958 +651819686 +1951754482 +68704921 +2117512530 +4044115467 +384467087 +1862323167 +1001829673 +888584137 +586377664 +3297766921 +3384730110 +3799132537 +2185481043 +2170140904 +2285801891 +3023714283 +2377703059 +1591927547 +3397333662 +3921250752 +4087768973 +3077425105 +1321727233 +2688835846 +61679875 +1798157285 +3909260680 +289153992 +3338595119 +1844703594 +1950970286 +1097904318 +3106920218 +4089397606 +1175484102 +4075468977 +2955205570 +1867495677 +3160823812 +1906402316 +1237890829 +24390745 +2144190278 +1416736241 +726794034 +1578241165 +120594920 +227968066 +848611305 +3684440078 +1620571811 +1283307013 +1464285667 +2970810865 +2925035417 +3378962992 +2268693073 +4014595296 +1556887234 +1056107217 +908509215 +1352289343 +2489230146 +1937383935 +1692332669 +3644140315 +3096305732 +607530485 +900132808 +3152176535 +493452401 +3071405491 +1829016615 +3772639900 +4178800624 +2336731081 +1192757206 +1284808945 +3414738828 +3507309724 +1704178409 +3021876869 +275018012 +3971259576 +3315432935 +3020928524 +2130657272 +2408029043 +3071455141 +3260916720 +1238488000 +3096002468 +177674259 +2735863934 +3416842520 +262362884 +1479573582 +2482367017 +3844489337 +3579552714 +531331993 +2592019831 +3303442733 +1285659179 +276351199 +2553921423 +4254416693 +4235621524 +2493017133 +2173036824 +1517412301 +3740441531 +3387672975 +3871233533 +2893984453 +4282653403 +669605093 +3102504325 +2214965753 +3547555361 +1254778019 +1811829809 +949663435 +2402521844 +1715143009 +1730843408 +2671677729 +3314264945 +1260458624 +3268904884 +1660431719 +3646078153 +1171601796 +2224609615 +3550475622 +2321498491 +826918925 +620276685 +2738374684 +1468138776 +1619595041 +1464213407 +1837482532 +739979674 +3798851365 +1910846710 +2783494460 +3500978742 +428824684 +3075008464 +1442964813 +2823294026 +948792938 +3034977912 +2793383897 +2910047699 +3798095939 +835183398 +3283142257 +3941542110 +2418670646 +1074207065 +1536642434 +194021006 +61981449 +281296196 +1686130660 +3715466488 +411538539 +1538076668 +1176451177 +2529566732 +313108045 +104466553 +2176018761 +107926549 +1378492980 +1170984216 +261290226 +1284429397 +947603353 +649695875 +942266352 +3419118451 +2492403717 +2749743890 +160728147 +2361399606 +2125888038 +455296937 +845263652 +174465973 +1234017800 +1321432320 +4266832494 +1629108357 +2675441550 +2379506206 +1894334269 +1216028965 +1748036431 +1176167725 +4152666404 +4065279347 +3810838865 +3522978520 +2332034620 +1826198270 +3778443012 +1849453283 +3551981013 +1659346119 +4105698186 +2882663989 +2864429091 +2463971033 +1187563978 +1942259106 +1001446270 +427068890 +819559857 +3943406000 +1637198932 +2283185646 +1527692143 +1982842453 +366250430 +2903157248 +3032152079 +540474849 +222181477 +155551923 +3917261205 +1717817580 +3883903834 +1266711892 +489309603 +757740141 +2566809733 +3738405725 +1752835110 +86737671 +3317505541 +2044012217 +2057345636 +1941128422 +2848158735 +148152098 +2379428003 +450040227 +2687786644 +1518321143 +3961743609 +2439533451 +1199215647 +2873204222 +2549673597 +4268295760 +1655191608 +1345531891 +1720302694 +754298977 +547072190 +4256897740 +1390775696 +919716682 +1354527683 +1661957149 +580204383 +1104911072 +2941624089 +3794686187 +3981940406 +2446149177 +1918981124 +4176822145 +4126863258 +3447948742 +411356433 +1830219076 +4196330833 +3069169743 +3834882482 +2634031462 +4167469251 +2006687966 +446302994 +2602616628 +3955815744 +345615324 +852385344 +1281921102 +651354444 +431713449 +3526127097 +428654054 +2588604137 +1176804536 +682126905 +79451667 +4206376189 +3722757387 +2766757703 +1832239507 +2708568329 +2408275494 +1061303601 +2762333882 +2157093838 +2084871488 +578891519 +3559803334 +2405340198 +1712666034 +4202915333 +1778565140 +2056795201 +3712745452 +1873435136 +2564697293 +1497661996 +1651691175 +2287013582 +1375986588 +3269206676 +2934496605 +1959335696 +3890972328 +2631040786 +4213540898 +1123526 +3710291108 +3714521461 +2516321962 +4015817636 +2953659268 +546870473 +35157516 +1317115887 +2576590919 +3069768180 +3664014203 +1537967839 +827734506 +3331846421 +1701677523 +1624439680 +3731818359 +4160654774 +819627636 +2733389515 +2959450445 +2115455082 +2089489207 +2314487495 +883998342 +3822153453 +256130494 +1429201942 +853081377 +1359548900 +2997086994 +3625083428 +639603461 +3327077813 +1011712237 +4106949805 +3738721812 +1332942453 +1682545478 +585705389 +2286805447 +2455082425 +483456302 +4159218117 +1265799043 +423409136 +1020639151 +2270718267 +2996577883 +30133665 +1080523377 +870650999 +813052370 +919483306 +4227430090 +1394654538 +3991411684 +885917442 +2532406314 +3691070130 +471384460 +2526587732 +4129388919 +3829514091 +353923880 +3591821946 +3944766701 +4209888911 +696293201 +771583967 +729729341 +1556125300 +344511441 +3848518077 +1246362159 +4160059119 +1269749442 +3652433317 +2570113089 +4091470022 +2120761531 +4055187549 +86445919 +3418185927 +4049745543 +643760810 +610415970 +1620719125 +961519350 +2308399434 +714363222 +2539591858 +2441622115 +3264439468 +2004630596 +44012329 +962421530 +159427067 +2619741753 +2870456227 +2735263193 +88690149 +808802577 +3895791055 +23421554 +4093011877 +3432646420 +3054895037 +1071787866 +455730138 +255992060 +1276417573 +3100882509 +1038024937 +2839555592 +655378824 +2704576581 +2123209192 +1041838118 +4258116460 +3648299117 +3664855140 +3702086441 +3871016128 +693916810 +1246179945 +1001457809 +768345406 +2046593644 +229420089 +793188594 +571685214 +4005839032 +737276034 +1603775092 +1355955217 +2304498775 +2592905770 +328273844 +3826273428 +3715816375 +2703112480 +42037841 +2819120801 +1838363193 +1835946911 +818587824 +1218189601 +2343269141 +4102278307 +87388052 +3427175345 +3500474260 +380893524 +3955472353 +443836203 +3066742129 +3095692390 +3948174608 +4074909665 +3356247683 +2631415352 +1668242463 +590882665 +1377331737 +687839528 +4004221326 +3177612329 +4044276508 +1822871759 +3268271842 +2525782224 +2442902479 +1602488068 +214645542 +675451485 +878853775 +3178532003 +3132201601 +3679673913 +192270933 +3941160986 +2132309213 +2895611996 +505683218 +2687148684 +2810345197 +544891610 +790950578 +1322742689 +488699247 +2921247313 +2557401554 +653765816 +363111865 +1111224711 +744158949 +191945893 +3481280394 +1234853781 +5034834 +1336471548 +2801764047 +2051263022 +3108554351 +556209370 +2250753874 +2416640089 +4123586379 +2621482221 +1194951628 +2194974432 +514011356 +2635953786 +3805744118 +436198278 +1346088444 +159832462 +1161661327 +2041454327 +50940874 +2433258657 +3618889846 +138380691 +4113638585 +294547739 +4132592056 +1608316736 +2827650332 +863759627 +3092032744 +724312943 +3326735026 +852303748 +3382316963 +3971815651 +1332138044 +2363723867 +2859501826 +2638337248 +3029541912 +1893946723 +3571683892 +339202083 +3711023076 +2625877258 +1854976730 +933177061 +3122076153 +2603750980 +2729921122 +4037756155 +3943405002 +1332087827 +4122772092 +1908912014 +3294695062 +2045937756 +1101123342 +1837849916 +1671787557 +4268133763 +2680405699 +851852191 +245861003 +2225934840 +276282347 +3369056641 +186014305 +3948666103 +2107202480 +160605671 +4124260152 +1081673319 +113165711 +189844463 +702113205 +1677502396 +3571501399 +3186883901 +1439836319 +693929926 +4016135200 +1048544529 +500940277 +1243611051 +166530982 +948517310 +3808825541 +3151647835 +2056697037 +1223744257 +2696766511 +3894618902 +298261241 +755739977 +4142768637 +2886019975 +2085877313 +3234128154 +2735843125 +1374947742 +2439224768 +769325088 +1472452414 +4012947543 +3199673745 +3750307555 +2021226496 +606652236 +1654530948 +3413643749 +539067185 +1595251978 +643889839 +3512618157 +1161216925 +2227749157 +1088714253 +1381201867 +276896601 +3659944895 +1004866958 +3462673144 +3020949438 +2644283637 +407057497 +2255527690 +1937475712 +2561280282 +2768745262 +3231677538 +2347737797 +2895695836 +1763865205 +3558301192 +3655912512 +1164645964 +832026897 +650354934 +738023214 +2730850501 +3038018017 +1666925741 +1398001964 +1122791645 +1183365344 +2299766879 +1151622492 +1404194043 +640204787 +2778458095 +3419188544 +3712657295 +403983769 +2195619591 +3178954781 +2624596698 +2937603555 +3418545188 +823892322 +1824594336 +624434618 +3604287698 +2365395973 +361844252 +956506564 +1456185765 +550821411 +2406641082 +723944293 +3379397896 +1972715576 +2668265852 +3893275887 +3980499483 +4273050607 +1106627184 +1970622123 +3141674187 +2970367544 +1679555963 +639782317 +681222619 +4248580881 +619245573 +1725296638 +3590901940 +751131644 +2332353712 +1064694426 +2662748511 +724759262 +2893552143 +403598619 +823452605 +1333560458 +4042807972 +3978671103 +2733302040 +4272658681 +1062072208 +3080493445 +286591255 +4211789465 +3758605687 +109616711 +2055515111 +1496869262 +2988147911 +320262909 +1550747666 +322187027 +3157314827 +3078526441 +881679706 +604533624 +1243210717 +1279621473 +3158207857 +2606430357 +4059406231 +4150652401 +3133902618 +911095967 +2046402753 +1017754454 +2357192974 +402309390 +1920107449 +438470775 +904557180 +1052581536 +1051992797 +1830682990 +2425481323 +1566478241 +4137832421 +942545707 +3147101195 +3134764259 +1809623613 +3943451706 +1059802951 +4115221613 +1197261304 +949010088 +2592384710 +2999414601 +2022299612 +3422368456 +2502244353 +2758659750 +1432653259 +1033505791 +1847538313 +1949782325 +3402904183 +3549712414 +2209795858 +2372114266 +2365051385 +1048086437 +3732705309 +3254615597 +7251743 +2901002300 +4123371450 +2457131727 +1943516283 +2159964564 +1450548701 +2562603535 +410800373 +815936907 +3842489888 +2366463240 +2391371770 +3211382451 +3816038264 +2881562721 +491812265 +4206510464 +4259501154 +891955609 +4258580613 +3548541235 +2830087063 +4113174998 +1081632035 +383559621 +897787203 +25414831 +431086276 +3673071212 +3076629404 +2436023212 +3433709155 +1413382441 +4199364315 +4182931060 +3623859977 +365590674 +3808496540 +2266104718 +2881231001 +2697123188 +1295743377 +74780360 +2420704961 +1122474641 +2208726402 +3552382019 +1951152727 +4100891943 +3292464599 +3037003850 +2828037812 +3868077493 +96575514 +2073476766 +2205287369 +179878744 +439282470 +533518348 +2790525737 +3785704594 +2019854506 +3617120681 +947529964 +1771853535 +1111704074 +1787865707 +2734494110 +3269435387 +1261366062 +365014305 +2231374882 +3966202924 +1562376000 +4233918131 +2017314725 +419663712 +1437476329 +1516013722 +1293920737 +2325595276 +2619358006 +3324881193 +3677720286 +1065837365 +1138613603 +743617797 +3138086884 +2209565628 +2839988552 +2972769717 +3331263991 +3248995178 +3570667487 +2186266075 +2710850189 +307316433 +457945400 +2767409363 +2613110897 +2790269499 +82176554 +3283053595 +3256663627 +2586463272 +1857103732 +1087785411 +2023932868 +2572360345 +364428931 +3919709547 +1324919032 +3263947105 +2957220038 +971145531 +912025279 +2787868748 +659648337 +4190368482 +3032958390 +3071348395 +2849342078 +454892596 +637069025 +2913223163 +725216588 +3932502912 +3951808089 +3500835786 +2489114591 +2623075813 +3033833061 +137917399 +2026700121 +2014478772 +677375760 +3006529210 +2399269550 +65804542 +2647966733 +569933445 +2173830992 +3956366857 +1314168419 +1999843512 +3182335237 +1303224641 +2035440609 +3945682512 +2625030999 +4246529974 +445843990 +8198449 +888730408 +2114690531 +3207314851 +1751766817 +1485568354 +1628779909 +2034806765 +282349137 +561124129 +1327169739 +2269008161 +122092741 +2811027098 +1788730495 +2924801249 +1538354500 +4189765745 +2821480338 +3279158273 +642819952 +112368117 +1578494787 +344034356 +2936357242 +3864839024 +3380678879 +634871649 +1142666525 +628390737 +1141424793 +765763989 +2826726181 +2621806924 +694582857 +1893550649 +1933076078 +3442106214 +1447695418 +3591533566 +3943576284 +3499259690 +4214055991 +115286095 +2520395884 +3109983115 +3996322209 +31026978 +2135750522 +178054523 +1641897040 +3873952949 +3113278458 +3990508134 +2668394565 +2219000759 +3882368681 +2917430324 +3726466546 +2106369348 +1333900900 +1336750748 +2979493097 +3805253549 +2102103081 +1395830415 +4263223852 +232993068 +4149326453 +4114911568 +840142979 +196716632 +2780430677 +22111305 +851610237 +4138767325 +3293482137 +2821355305 +2933024771 +1625702823 +1086987284 +2606194473 +2391546977 +3858052957 +1050684900 +1646225236 +3470943947 +3909253649 +2878138320 +2330839778 +2697832125 +4098527336 +370699065 +3428362127 +2995811473 +251291219 +2680714853 +1768278888 +1394154888 +735447760 +2061484489 +537767856 +1167420056 +3924214310 +3124407285 +1827394370 +307095210 +3943200274 +1879161169 +728554018 +1827770708 +1362897930 +1808097212 +3512153509 +3834764794 +1363143988 +1673408731 +1170564239 +3680755924 +297488542 +135686317 +2068173212 +4285378651 +3110874371 +3818443202 +851088443 +2427875415 +259256351 +3038001084 +14207041 +2780085191 +1127609769 +1704464752 +1192477560 +2638327284 +4154594737 +3792809899 +1232057727 +2576757559 +2328174768 +886034223 +2632371122 +904539496 +477915549 +682355128 +616239882 +456690517 +87297952 +3568918311 +956028819 +3378697691 +1064517300 +732128049 +2290650275 +1830252770 +3694949201 +1947960420 +627507 +2868422856 +2268265428 +2197522784 +1803956195 +966705863 +3481713186 +3953057202 +3341727663 +1014216277 +3946137141 +1474235184 +2313900424 +4213828863 +3036712376 +3483334803 +500101465 +3585765261 +1953547059 +4115017564 +1504601287 +1235524177 +2190711373 +349363682 +58474828 +76568506 +2775347963 +238593615 +2964565428 +2212814740 +2016803050 +3571421317 +2620199224 +427760785 +2917296023 +2057637068 +4272181832 +3841366014 +406732892 +3726728354 +1610226424 +1259129174 +981499560 +3714719207 +1411200861 +3740814925 +260628946 +2469229858 +2709167145 +3618885489 +502161725 +187375548 +824803770 +1483722002 +4212965296 +556559766 +4277022696 +1265249471 +3058299124 +11522025 +376856761 +653738304 +1640153730 +3948817570 +106859380 +2326649958 +1079418577 +257513973 +2073508997 +2502151551 +1494743737 +3143307008 +2324359584 +427949562 +4133979748 +86841259 +2149216359 +3956461321 +359116687 +3959102627 +3239422301 +3048173673 +2493648071 +550972959 +129846297 +3624437749 +2027304806 +4161859008 +1143949618 +1769747881 +1031982095 +2785341835 +90865931 +568311333 +2118266382 +919523412 +330289393 +461647237 +2032541083 +1111862287 +537858522 +1738876388 +2872917483 +4966733 +2120497033 +3035343671 +2837398086 +2070193165 +79975048 +3357071622 +4004352476 +3234428262 +1437119506 +3200821430 +2201226817 +534062494 +1062643343 +2566234904 +1117291602 +2064271265 +3956988108 +2400923202 +1730682318 +3130618301 +2879972445 +1303557224 +555110885 +3425481486 +2160751533 +57185378 +1490783683 +3417487160 +960828564 +3502965959 +2968266594 +3988007655 +3472455460 +1695381209 +1199686243 +1661634358 +687009676 +3525284697 +1010535776 +2990215493 +1578821965 +654638169 +1184346389 +831516016 +1044144161 +3295606139 +2823917711 +2277257375 +1747666566 +1965561985 +984016622 +1227847321 +3799984556 +1401055781 +4028859580 +3854983279 +3568613722 +740568593 +1336643291 +2536847094 +3057019600 +1753558496 +2189110940 +1856927700 +1078797340 +2039105901 +2098401331 +1065689101 +1129210032 +1165603961 +3312902950 +257645604 +3661604390 +2564247261 +1574849237 +1419457753 +979420444 +2713314482 +2599364676 +3919630525 +3395908717 +3388582837 +1547569302 +569400893 +3975452407 +652382147 +2948522323 +1571079540 +1430320174 +1237185075 +3324389388 +2140142695 +1696378110 +1033825761 +1584801858 +3548518286 +848535614 +422361537 +540283634 +4047421719 +3699651108 +1283262102 +2515700902 +1504813060 +1047628206 +3135716444 +354389004 +1719533358 +485749072 +3193394253 +2522148587 +814851187 +475188116 +3456143784 +784308641 +1454572136 +2206295561 +2582931286 +3582502706 +2081031986 +1353002028 +1954910564 +174887008 +1826938325 +3542686830 +3338905570 +3331980178 +1001487085 +3672297220 +693510382 +1085555291 +1179618513 +3388836609 +1583591624 +1298540050 +3071310489 +3251145565 +3585996475 +3747992368 +2403320267 +4159525382 +3366327417 +3948709626 +3495304735 +1440054019 +2567670212 +3474804187 +1920046304 +2778785887 +3623544253 +3086267699 +1466025989 +511192721 +4042403881 +1740996913 +2775692812 +243910278 +3932430417 +456028279 +669684702 +3103591881 +3972883927 +3979045037 +2029483153 +2541579542 +2463014173 +3199475108 +1221574448 +2293236063 +3297101820 +3419023831 +1966212922 +2895050039 +3375279992 +3847855233 +4215401336 +1038229631 +3088562976 +3158190815 +38627986 +3195840103 +1124721008 +2543807271 +1377957809 +3551053832 +1249493177 +861854950 +3145111742 +2187623294 +3113148841 +2481203011 +1920440890 +2052414526 +2538384065 +2614425226 +3907545073 +3278120243 +230499582 +2830525878 +3890171170 +1580142047 +1365753257 +586608421 +3521691348 +674682802 +78334441 +4131969635 +3781527431 +4197093247 +1001910330 +2899619297 +2061313288 +437512285 +1667502525 +3539914739 +1905295680 +2007738300 +2159919388 +2194204617 +1271756796 +2731974240 +279960852 +1346398873 +3894516232 +4020086717 +995538847 +2174817357 +2574300665 +1250390630 +2854055030 +1160380890 +4270934618 +3957450589 +1715291259 +3118062742 +942207907 +2944212361 +1818444132 +1793532962 +1868188463 +796725577 +1977113024 +1495535719 +2762654481 +1633775501 +3966963591 +3519334456 +3762808651 +1313870810 +2857862643 +4215528004 +1343869488 +2240622175 +3864816215 +471328752 +2961326125 +3929884868 +3602835188 +1475811002 +3376353819 +14551495 +555338804 +1402759037 +920212353 +2709854088 +2955161868 +3218209025 +3798210781 +1632987166 +2470334477 +1968737803 +1082016283 +973097546 +3904132793 +638317718 +2231273382 +3660955166 +1553244833 +2865860036 +3311351298 +373803340 +2444817473 +2560110605 +1606023378 +4053274272 +3141061426 +1114205549 +4190427725 +1141303323 +1617210200 +2187498758 +2234769138 +2045586289 +3917101340 +4223041177 +3071636693 +1916078496 +2728365386 +3073123341 +192222592 +1163044467 +1276609401 +2486231917 +2581498629 +3211092220 +1881582485 +1809120517 +1506327702 +663666776 +810748310 +747896229 +635697672 +2503388486 +4111357621 +2376584548 +3261067765 +2621572286 +2382682997 +2825703135 +2987928556 +4152146825 +4215519439 +2913417111 +702269456 +3469565028 +3538162315 +2583439491 +1993122706 +2358153527 +3109483807 +3273744846 +742047884 +4204709771 +2875190641 +2772695303 +3258941821 +773574164 +3507702345 +3773622811 +488450899 +1417205252 +3819846469 +1048890222 +3110229089 +1059121213 +3164168437 +1923096487 +2488111972 +2532621703 +545165541 +2280322163 +2527919609 +581535122 +1656243594 +3438825455 +3623024080 +3603759079 +553536063 +1360658972 +2266979897 +1842536836 +2441527400 +2584777872 +3889924797 +2454274321 +1909626278 +3502201176 +1011944564 +2005140742 +3056546718 +1532224040 +2705477577 +2722238027 +2797585035 +91277745 +1177985959 +3129439203 +3775913675 +3955581289 +3895104496 +644819948 +2839607495 +1591702848 +533975839 +2998801015 +3191910656 +2525129377 +892866140 +1289584669 +180637227 +2277496728 +1070744964 +4168527060 +3748376247 +455153379 +1669872953 +1807047211 +3822441596 +34602338 +3517383201 +2999137847 +844937650 +2274423993 +2536848332 +1288331786 +1473236006 +3677818765 +233522712 +3219744272 +3349049480 +973116022 +3022554976 +1029632706 +2603273293 +3250923407 +192367100 +1585989170 +3160237393 +2534899970 +3365821323 +1766930047 +2570594104 +1093120084 +4068185501 +4016853893 +930827465 +2763445361 +2020852400 +1219629210 +2849503366 +3786744098 +3669899282 +4250738127 +4106805442 +3266797034 +3572614198 +1908669965 +3559666220 +2201771320 +117239886 +2931278044 +3805096014 +130702233 +121682733 +4133232521 +2096192303 +1257617016 +2218406981 +3616780115 +3287362939 +329570115 +1483084483 +1807959366 +1573789133 +3674538420 +673047576 +892087890 +406118830 +216933075 +3726248076 +1128102871 +3065090837 +580152723 +139751156 +1843514301 +823147773 +1697619504 +103716126 +3840149569 +4056367216 +1053454658 +3842266633 +242187453 +3883127726 +2528169343 +90175313 +1047911116 +2261561727 +2837339686 +1514452447 +3931898976 +2632537105 +3516925736 +3600746384 +1518675507 +3388305056 +4167955691 +4241530023 +2089352669 +4174072305 +1036648898 +1705172752 +3890037526 +1299221389 +1078057559 +561292002 +2725230489 +3670499752 +3157132692 +1198023555 +1948398153 +440330376 +1813304857 +1914641801 +2428939257 +509225851 +2984335490 +1845437197 +2982832673 +4258948911 +1325361040 +2334043480 +2142212424 +2701631692 +2351162315 +1225483177 +1212968412 +1164502127 +2061391997 +3104379087 +2032239633 +1523317519 +3806945524 +1288332366 +3834704085 +750743289 +680155249 +2826978674 +2900180608 +1516232726 +21608327 +2674949571 +807102749 +4264323409 +2043896680 +4285407354 +2885086253 +2233151700 +3117493252 +2829901993 +364402583 +2295291566 +3843326471 +439518148 +740460441 +4220095096 +3292751417 +803127036 +2390926221 +3509791318 +1150060511 +1372861703 +2227013762 +1252127808 +3912401516 +1861510608 +2674727706 +751933186 +1727348366 +3279690800 +2663171835 +2114048065 +1110463857 +880388812 +316017955 +4096080188 +2883124903 +1764641573 +667166311 +127970148 +2583033758 +890669286 +1437813933 +4217145002 +3121764298 +1735005006 +1667670075 +1621647327 +3082681277 +2730597185 +4108564300 +2917409655 +4144355895 +1083493848 +869295626 +1650780896 +2460991285 +3783207791 +1380457101 +1722961877 +1490346991 +3475913011 +954553833 +1934172245 +1116881440 +2274856860 +3613549791 +3981375862 +3739845791 +4230352887 +3198615882 +2517971389 +1023673523 +4228696435 +2834320420 +199002503 +3132406078 +737846556 +2532001086 +742367403 +3061344349 +2783838502 +1036252826 +668577834 +201619975 +3975640730 +4251836727 +2535319495 +1123597689 +1185558880 +1066680294 +1648789517 +630483075 +2677013069 +1679082605 +1758638582 +1201702725 +1630583948 +3160143025 +3679244768 +4105970769 +2405073664 +4219078030 +4170606146 +560466872 +4164661322 +2481183022 +1855014004 +2382914325 +2580139681 +2938404297 +341224329 +998147048 +2728601245 +3863237289 +1040290322 +2463953671 +2301117105 +279264763 +905349829 +2483597707 +671313970 +2199289224 +3537551704 +3290408152 +1832507197 +2135893976 +3526258178 +82165406 +4228721514 +29122496 +3100417180 +1437811140 +3408207732 +3295197549 +1939906747 +3558321612 +771646127 +2357260784 +3617640287 +2931313177 +2795494888 +1475409812 +2270297037 +373238097 +145104198 +1203449238 +3147945685 +1287422970 +1708864971 +3810557898 +3824874262 +358485834 +484627583 +1817136936 +2320518268 +2353105598 +2435112714 +1898580108 +3110158713 +3070727809 +1741604120 +3148335737 +632635807 +3716044032 +1355092873 +2209626681 +3343351259 +3309567489 +1794624322 +2153376046 +1292275448 +2005876782 +2306320691 +2784073952 +150560755 +1746679278 +1415520119 +4232385111 +1234410751 +1027994325 +3193852994 +3512998795 +2899607158 +573703198 +4270532226 +1478169991 +3369978151 +3064172272 +1354241469 +468456273 +3722328746 +1349187311 +1169880966 +43411398 +541882703 +504248883 +2776787366 +637890010 +3238985962 +3254113452 +777408357 +3936225732 +2149491253 +613286409 +593490162 +3250367716 +645078780 +3665023976 +2671292421 +4139920409 +1010386665 +1545640421 +240768646 +2147360438 +314118952 +2939335800 +231293007 +2451017202 +743737993 +2475695906 +3105384417 +3000175106 +793378528 +2334604573 +2085445033 +99483760 +3514360729 +3194767500 +3161559887 +209329820 +919948349 +1848864455 +3400785438 +405668389 +226804376 +3000187426 +2891504067 +3175465444 +3537012738 +2676856186 +760847874 +1712267558 +1746315012 +4005464293 +4293802191 +3540962696 +1180422881 +3657904196 +3594133682 +3953496676 +1669999873 +77369717 +2107719787 +3907527567 +4047382516 +2920893943 +1938849395 +1531105812 +2949210071 +3010388930 +1941473765 +1172464846 +321667517 +1009684340 +2947010391 +3828451376 +1914358863 +4202913050 +552743572 +2680534739 +806125083 +3638245651 +3323754880 +2274296243 +4002194679 +1987003484 +1787712180 +4204018035 +2268578178 +3073670346 +1883931273 +1002385416 +3982049098 +1127540999 +717472303 +1032332801 +198454634 +1837969909 +2149498356 +3857245402 +3673960861 +3855257644 +242163199 +62290772 +2239708349 +3270896179 +1671631658 +2535761498 +1314902854 +3985978870 +852497043 +1754923538 +3546575893 +2411653554 +3540642652 +2915407795 +1432771915 +984882135 +979698464 +3665711494 +3676632206 +1842527588 +391349251 +3794716484 +298482301 +2417502643 +560803584 +3792650301 +2685077004 +2377811223 +3237932437 +1495574946 +3699540283 +2438149291 +2424706863 +3638658353 +1824397128 +3312042895 +3176731469 +1863565847 +1182137677 +3125816748 +1082122131 +3184720564 +1702942447 +1736721248 +1786047117 +811102657 +45272591 +4242097113 +3147986842 +2810655042 +1350521188 +2805899446 +610616862 +2269842159 +3139143315 +3130431806 +2197970925 +1259326172 +3512272612 +1072708648 +3294408806 +3539201476 +1165384573 +369571060 +2818198859 +1612857273 +3886959570 +777832482 +589063105 +4247125072 +3198088565 +1139303397 +1765880470 +3782887815 +2527708144 +3736260674 +3962306046 +3795917941 +3802264824 +2248122671 +3911880659 +2575883393 +3676866659 +1942751699 +2515053386 +3190779923 +2293493190 +1726695284 +1848189624 +3981844492 +3727045854 +3573786379 +1205708913 +1352515479 +2484621019 +1701943601 +3042628333 +3756913890 +3754244896 +1748970673 +2197594500 +4016865674 +30648917 +4178336172 +814383984 +4021658367 +3244807855 +821048037 +2429115881 +1630677 +2883694327 +1576837560 +3312570387 +2232918640 +3202515940 +2852776265 +3243860354 +2960618591 +1272212522 +386149039 +1696272380 +737170071 +3077642563 +3153935123 +2424612444 +3426471013 +3874152499 +2529563586 +1908205192 +1895792526 +3968983807 +4181675842 +3173318695 +3891222097 +3511780041 +3774885167 +1231000516 +268867381 +3430843525 +1607114329 +1152411842 +78872116 +1615172996 +568102712 +3852036678 +2906091875 +2487751274 +1458134676 +921788241 +893691332 +4093462991 +2629300973 +2255251926 +1736095068 +4049894137 +3549415321 +227474446 +3723953367 +554121293 +2768425672 +2941802615 +754005926 +3208292543 +820661713 +1638636594 +2877326654 +3773513951 +3804856539 +3974142790 +97437780 +3297479383 +4124576685 +1153254233 +2783873585 +1844735116 +1245509183 +2323235929 +106141933 +2222765144 +1635864909 +3916062122 +3336139553 +2673725081 +3849900294 +4243935165 +1233105603 +601968535 +3300172697 +3655340651 +1120988159 +2379107162 +1217249828 +1904413614 +787848120 +2181219751 +1335881685 +1406108637 +1292851273 +3524091113 +3908648789 +912628047 +3656817000 +421616813 +1587683698 +226606498 +1303162415 +2336387639 +414746058 +3906109461 +2873763573 +3220461520 +3361278613 +1341822081 +2037590094 +1158979678 +3788174236 +1677812733 +1793275460 +11513390 +2255597121 +3599462653 +2667101606 +3948010174 +897149933 +2747444033 +1439579621 +1419865035 +550393454 +3653617360 +277627245 +1166550819 +1973491000 +1202322695 +142794836 +1071364915 +1948505279 +2555012474 +3263116841 +3475325755 +31485500 +4067848109 +2347710852 +3261656895 +3030749337 +3767578525 +676730830 +2286086919 +484219005 +756931786 +2199532277 +2801465280 +2730220613 +1790285377 +3659068847 +2996635398 +2403867722 +522435194 +2316722272 +2101553477 +1965151143 +2228829069 +157728167 +2755788580 +2653394299 +1567850574 +2263727674 +795961373 +1320201478 +830340576 +2358857202 +2820085529 +1215440120 +2706308359 +2997217038 +1342588616 +414358041 +1176209934 +2762091374 +664750965 +1571365059 +851968097 +3840137192 +2220717735 +844829939 +2510032654 +1523891002 +1458199703 +3703065183 +3410406664 +3768489927 +2573454198 +4063668688 +1651207092 +1823567233 +1947583429 +2783918849 +458104066 +1459927173 +2245957955 +3264630060 +1487407047 +1506087954 +2110635965 +4103080592 +1869932125 +3575090973 +799989423 +3698547977 +832528613 +2867171463 +888021838 +721429830 +2054881707 +3502563533 +2095968609 +749406934 +1721408477 +2821041966 +115970313 +107143994 +767875364 +2658898470 +3459815862 +642742119 +1465686492 +3107415597 +3760711885 +3255644132 +3005079269 +2815874886 +1435646202 +482021522 +1881561319 +192572615 +3642845822 +3829667776 +1745087220 +4048912059 +1124604254 +1842583491 +1001791989 +826768309 +3466039674 +1464129994 +527375475 +901055550 +1149649866 +2321401144 +3755048837 +3462129823 +4069525988 +2106685820 +1545334581 +535464594 +3308539909 +722564964 +614722912 +3680203555 +3707706706 +435304012 +2413600856 +368431186 +3512204806 +1886559157 +2432899868 +563322935 +3075115590 +183384060 +426572827 +803818859 +3039329339 +3504330494 +2000780022 +2789655050 +40260938 +1802440166 +2953065887 +810937877 +1219815957 +729425635 +4214054197 +250849959 +3332845357 +241647959 +990067371 +844342662 +2325057594 +646551864 +2754321913 +1350646705 +3848953796 +3255756824 +2293588539 +1315602968 +4293362602 +1010821015 +1413511860 +3342927606 +4245149978 +177973272 +3716087031 +646732513 +3134659418 +3731750657 +110239033 +1895046372 +3343268524 +322461707 +2909156252 +3943185415 +438966344 +454621581 +360318118 +2117814934 +3793241905 +1354768585 +1335328350 +362173598 +2753064895 +3896534733 +354716536 +2434220261 +1014408654 +2481419199 +1931437026 +1650384808 +3256944447 +2263577200 +2640421592 +2877764687 +3167973437 +379622190 +1644056211 +557090343 +2389744095 +330584955 +1392005969 +1775180708 +1518169383 +3909400964 +1038181507 +1179345120 +827866398 +2541914063 +1804567473 +3077949744 +3317711383 +2795913579 +292052429 +3276851815 +2099733707 +3479892307 +2354108868 +2936575537 +3263296872 +3839119323 +3542097937 +3357084214 +2998219139 +4288311723 +2976737709 +3672286984 +1888838763 +2611686645 +2018700648 +1312750005 +985349720 +1021167204 +2444080756 +3817670201 +160452112 +3825566107 +996298136 +1064492627 +2744516097 +492942930 +1233879253 +274534957 +4018317915 +3992163477 +2674868744 +60260087 +1471234432 +1753065244 +1712371127 +3944049981 +2202160274 +93148526 +2991262027 +2537150703 +3939311388 +2547416547 +3400901005 +1837952134 +1475361329 +276760840 +2834311945 +4273971852 +2963896838 +1032781578 +2679477920 +1631961839 +1774754839 +2298558375 +3711001931 +2704592232 +1968149586 +933945870 +2410503612 +642742352 +842872998 +1081593216 +359616533 +2985353885 +4119707080 +3102159912 +3538303479 +2027335645 +3705801980 +3589776716 +1736637618 +1508759852 +3964638258 +760173274 +1819862992 +428117135 +4009334080 +1314275854 +433755871 +771729011 +953467825 +320921020 +461122149 +3152728836 +1732278072 +1424297115 +2121765153 +3845517433 +655658050 +1922445038 +1741818379 +658772038 +2484964372 +3062772230 +2959213709 +863831380 +2674064850 +2739100444 +497238521 +647325075 +1507128668 +2163397022 +155514468 +39998512 +4241888673 +2314420490 +3204845808 +3234320347 +656988874 +4239379393 +2327513971 +1506864761 +1087226519 +2816236003 +1430208384 +2830207360 +2623168185 +2739750532 +3309914686 +3031190171 +2121738596 +3723928359 +3580703826 +2061078820 +1869837261 +3107333026 +3866569471 +2145977940 +3830459788 +749702072 +1999419607 +1976157905 +3350382542 +2218094216 +3696025040 +268624846 +3345496717 +1427276974 +3678534722 +50161221 +4073974376 +1095145658 +3511786899 +1737413872 +3825719949 +2641594474 +4232536063 +1826546834 +1308612763 +3428528776 +1421794699 +2622003254 +1929247528 +402163804 +1428596032 +3421094313 +2537226306 +300616022 +4092375773 +1030019295 +2402643031 +3574662640 +1009559920 +2386636536 +1248345367 +2830937543 +1432172777 +4119938779 +629372488 +2615090427 +3167546757 +2009394699 +1033623051 +2126048518 +2432148759 +414459683 +2311344848 +321615538 +2614034375 +2265803041 +821049197 +2495833769 +4027737508 +3357052485 +1929438975 +84042293 +2012711441 +3757965808 +1285542084 +2179749595 +3399873284 +1041964885 +1072688326 +1471301955 +3661757383 +3673517948 +1469551272 +111814458 +1193322423 +4294129911 +1722053043 +3389456910 +3034623242 +313685491 +3498835391 +2725795163 +792852118 +1165990085 +477953420 +969934732 +978126462 +2872351117 +650934675 +1103907536 +475777613 +1505581549 +497158132 +3590869676 +4235372960 +2557725244 +2338373128 +945347843 +3930977220 +41070193 +439000825 +3874657293 +2524530374 +1772001048 +3039426648 +1362710736 +815839122 +1435126051 +2971989262 +928184841 +2052590414 +1069888576 +3845273864 +1697527880 +3007747575 +2829980650 +3678147787 +747439057 +2150784953 +1864013843 +3139457259 +3626109310 +1648704635 +902497634 +131052180 +19538588 +4066790377 +1975612807 +310624641 +3771810310 +140254235 +3430576182 +1195291631 +783677963 +1322455698 +452551357 +4143456547 +2969205842 +3086432128 +2231505721 +3429192351 +1405783623 +3055309397 +1076705841 +2355568530 +4029609084 +4199284192 +1846012869 +2913978022 +2674068331 +4173563046 +3394945449 +3994866650 +4050555568 +1478360964 +686562872 +3382425147 +2796264598 +3855328401 +3180659750 +2489087350 +649216031 +1765932086 +2568550456 +1896304672 +469604984 +2938620288 +951642020 +2687931526 +3308188406 +632853436 +622722437 +932661297 +3136340365 +3875505837 +4177334263 +1477319509 +3537839986 +4127841284 +14703365 +1780700061 +2869269986 +4249813649 +2346768584 +1497843649 +1760139418 +2671399241 +1217296879 +2889879227 +1632548423 +205192667 +1612556576 +3636769341 +3159255368 +1036683124 +1045653521 +1466630807 +3966436154 +2559333245 +2967067738 +2715751022 +2153907312 +4188459978 +3874760149 +1069885184 +2467805962 +2459969269 +1421737635 +2891280023 +1522991069 +1984680560 +3860693213 +2516797564 +3641682582 +2716837137 +1604891797 +4131627134 +3501277906 +4234390954 +86650570 +2550528758 +1442962772 +748952443 +4073879385 +1946403965 +3755905514 +345903119 +4059069503 +1012504148 +3733105834 +1689107990 +889997706 +503173829 +1569409817 +2107544919 +2582998581 +1008536342 +1045692649 +3346797164 +3537310219 +3535546479 +323203622 +3364306637 +1221241982 +3842498086 +108490471 +336356236 +851760096 +4188074570 +1225538520 +556910391 +138588392 +2346397872 +3841745359 +4123797156 +2362076708 +906732144 +936777559 +2894361693 +192754320 +1711268461 +1307154606 +2168618277 +994638931 +802805192 +1296205379 +214412975 +1227517035 +1135502033 +107252367 +1451578797 +4184772990 +2053665319 +2075940582 +170040113 +2418063894 +3986874895 +4016588945 +4102306616 +1377065531 +3165388235 +1798950222 +1369764025 +1373427611 +1208744820 +3616050928 +4258307005 +2073006940 +1906344534 +3069371985 +2473476849 +1566493255 +2928485521 +4168363623 +1522903800 +569908344 +1394418387 +3306445201 +2764912099 +1198849298 +2591086437 +1229294953 +3593237304 +3158068266 +545060772 +3630110382 +4046647412 +684687430 +3210415432 +3667391863 +2809327761 +319310372 +2255820478 +4019094602 +1434913739 +176726805 +3742896851 +1209122351 +423482621 +2283621941 +1697214908 +3982098841 +3119631351 +1214760809 +3670223782 +3572267424 +3960534795 +1988839256 +1385931971 +2282704582 +2374358825 +3065639610 +432131062 +3811823590 +3128266903 +2580982438 +2729361015 +375465320 +2555715066 +1137356754 +686570593 +3897256818 +2622951346 +2632233258 +128690079 +4203391975 +2146405201 +1548107179 +2729830230 +3354459722 +2193794789 +982807096 +3667061550 +1864245005 +2790608796 +3079972515 +652632964 +3593000533 +2577500895 +3087171535 +3166555356 +1958028182 +2434123269 +989337448 +291591490 +671807319 +2675566760 +3480770367 +3813308525 +2308083457 +648604816 +2698830246 +225707511 +96980645 +3456204247 +1483386727 +3074735899 +2602970674 +1154362357 +2765066180 +379652979 +3734491417 +268634966 +162117467 +782125888 +127885344 +1938597353 +4081886656 +1704433350 +1930452096 +2307910644 +1260456313 +234352000 +2709210556 +249364111 +3894968516 +2524918380 +3428335561 +2096546394 +2420689378 +886380180 +1392937966 +837642190 +1913611157 +1842634191 +972866535 +1174752698 +1618834792 +1783188248 +1186876694 +2656066126 +1105658971 +456654574 +3242906387 +1771708709 +3196415747 +3442840467 +1399912378 +905721945 +2771280787 +2672431696 +73573641 +4076068229 +1577051681 +940525325 +3442145465 +2056010480 +2995680464 +2308226944 +3414431549 +350983020 +380717290 +1896814877 +4203320568 +2140176585 +1093356680 +2317777436 +4217480917 +2926940732 +1131371703 +2543577757 +3312084486 +4026135506 +3181297767 +1400838689 +4199780720 +2127605342 +190581734 +3367983425 +2520457529 +827112341 +3311442840 +3647325222 +3086339083 +2526101688 +3544280103 +43098543 +1062164878 +1299274590 +346684094 +3620422820 +2427990251 +2058925026 +1831738821 +2160068965 +259341914 +2851651099 +3967241974 +2859814399 +4287416308 +3045031609 +796193656 +1521709496 +2203498461 +3038900931 +1495027375 +4288107146 +60168310 +4150045696 +1544410816 +527940897 +1697578619 +3869568837 +1096179468 +1417666233 +1620656711 +3193924938 +3435315846 +3178075257 +1357013790 +1236597904 +1019090016 +3650314098 +1994560435 +1178550642 +3897822831 +2081107576 +2668258198 +2723384316 +3410787297 +2471812090 +2208256286 +1188411410 +2958541194 +2250672850 +2729583582 +4271347217 +3357053193 +256251708 +1380689704 +2341841341 +2457891776 +484294031 +2891033717 +1764612950 +655951011 +411593760 +996949864 +199452963 +2379941764 +566099460 +2904287949 +180849287 +2786050480 +3949342853 +1947289715 +1162436939 +2594822735 +409153181 +2522048043 +1881499536 +3665783612 +1737304298 +2448528685 +4021116354 +2155714296 +3927005866 +2916813710 +641039166 +857947414 +3024613418 +547768614 +1630265725 +1053090128 +1536291133 +2948248263 +4544826 +480337307 +1823910283 +1436396079 +217151838 +2121472296 +514837070 +2531584073 +4127487337 +3920452823 +1321403993 +2623122114 +3699773365 +3583787828 +1194683458 +977468293 +1866683686 +723288596 +1076232422 +1928452230 +1738877256 +1620628753 +1611163489 +1659260626 +2916449807 +9607824 +1423322338 +3742439235 +619101443 +1381116109 +2402661641 +3291662392 +2262992977 +112522387 +1016552684 +2687041852 +16590652 +2479017913 +1698009570 +543003626 +3206932020 +2362965247 +197064949 +2683077597 +2843268821 +966670814 +3794566136 +2550237309 +3050642072 +3018017116 +1233394953 +85857325 +3503558327 +1124696296 +1425364397 +3129668566 +445835523 +634736838 +3705742433 +2258483110 +2813719074 +2746139666 +2746176509 +1236691129 +690529152 +2651081556 +3986923223 +2901033691 +246402282 +3293496782 +2533979990 +1002994705 +2760990227 +1566386166 +2159026112 +2089336265 +1220646875 +971187813 +3806949624 +146856580 +2714506187 +1619115712 +704303694 +4129845994 +4067516017 +1656597150 +235952856 +450828891 +909393563 +4190593805 +2975093709 +4029669235 +935397164 +3020319922 +2682221411 +2655730248 +4191665392 +3155385789 +144024820 +2680222599 +1861701557 +993545297 +3433606395 +1279384155 +3439500931 +2796860889 +4113059215 +3477854778 +1400148242 +1716607618 +1517382925 +1255787279 +682998979 +3190693246 +925873818 +851640528 +3779948754 +550897061 +2592785710 +3524580474 +2757152653 +3251452261 +2044590017 +1277277575 +2389524713 +3346744905 +384309164 +1807042051 +2052941519 +814108979 +2489360199 +3693513898 +4008360493 +983475868 +2283863441 +4119853686 +4091468853 +1785727230 +3733867029 +4215646218 +3591826185 +949754527 +3040695745 +3317046560 +1040226994 +420435368 +3046239126 +3605111368 +585997752 +2367624150 +1063432639 +506371613 +3537832756 +4109431542 +3045185865 +2494519092 +333807286 +2021397217 +1048494684 +3536829388 +5925694 +4001805999 +2657099112 +2391973310 +1220198782 +187854061 +1809644595 +4256039763 +3521929975 +3099979282 +3123954121 +1362950112 +4028018381 +756356850 +3228431838 +3589514660 +441226538 +3872128730 +2416574708 +1798533263 +1919924008 +3914669025 +2514913950 +2275205238 +797402889 +4207995118 +326466310 +2528164685 +2657206680 +1301116937 +516401801 +3120409631 +1439123768 +2446200769 +1202412782 +2532719467 +4078760919 +3030418481 +4209133810 +1525724471 +66929599 +2015272900 +3039420031 +2483306352 +4163510888 +533565591 +1574786985 +44175917 +488165013 +2113986102 +2533711108 +3652224958 +3704307714 +2534601485 +2185303970 +3833779119 +2052939920 +3096064009 +1090978723 +3491773841 +3651980967 +3220865993 +1843923513 +2601736268 +3331580048 +994602956 +819692871 +1941912763 +867949714 +1554943970 +2598552386 +1784919730 +2574113993 +3864496522 +3493553794 +358627478 +2620106464 +2280057081 +3431019389 +8681985 +1075138026 +3716336177 +1626816162 +2086710847 +3711073953 +2048728761 +2262766454 +983687106 +57843311 +156212852 +2788450450 +585411433 +3306924119 +4000948681 +4160734368 +3185371862 +619438071 +1091996534 +909994702 +1941284518 +4040651466 +4275502885 +1421634123 +2709291097 +3979033949 +1453545950 +2078133916 +2421700549 +2983592477 +912240990 +32501539 +1919323061 +2430823579 +1583494737 +456395793 +1112894738 +4073066779 +1317674801 +848631027 +81163773 +201493910 +2743921984 +47644241 +415794744 +3895019014 +655125800 +1104117392 +4047321166 +1691817026 +1256060507 +2057841357 +182195390 +2145453882 +2376399530 +3799121114 +1687349411 +4239527539 +312702550 +3699924345 +980640622 +3455654763 +362355377 +2639366037 +3867751773 +2690670739 +3352077513 +1021525852 +4010280386 +2699635849 +2016225971 +734476414 +4119586636 +461617616 +2662184298 +875960735 +98116498 +4260837713 +2896406263 +1412127820 +592731846 +74205883 +4216389857 +3684945793 +293881971 +3797147805 +4098220832 +3543167619 +422337481 +860410884 +1000806237 +3667146701 +2688478547 +2149318143 +1256478717 +1765437153 +2853032876 +553743688 +2263713523 +2797882505 +1611784785 +4008107453 +3357908480 +2066366343 +3666395546 +3003557890 +3419181997 +627263719 +3251928923 +2914460490 +1838044466 +1116220002 +3141537749 +268606457 +1378182521 +2301708546 +2692270655 +1112358384 +3288637192 +287284081 +418175848 +2783272652 +1832994196 +4019155722 +3447520291 +3725411851 +185961690 +1616723639 +2281390114 +24723624 +202332214 +3487628343 +3896666185 +2414645761 +2559902909 +898800082 +1731131451 +1309131274 +2796908053 +135301914 +4201114689 +4202423305 +3014286823 +800458814 +2457426475 +1074075292 +375662802 +3254488826 +3206371271 +591814155 +3915941409 +166632850 +4211442599 +1688025836 +3118913086 +2832167515 +3317167602 +2797704316 +2201511188 +2761599312 +973935537 +2539446465 +1540421784 +2961358757 +3926128478 +3720311229 +1110323772 +1701005300 +2288746317 +51754297 +634794087 +3836834840 +257438877 +468247098 +2140849186 +591376344 +152410514 +2563294784 +3187361892 +681216511 +3789138972 +470364536 +3785126022 +1809489669 +1740557599 +88675917 +3483745176 +723379522 +3500073841 +3901622860 +1626328462 +1066909070 +1276380429 +245734004 +522623178 +3976666732 +3611578357 +4144186790 +3863106468 +3679250388 +1419673021 +2523788070 +1361838109 +3763303753 +1533853442 +1916240136 +657136291 +1572562483 +75177333 +3314855337 +3687198868 +756423119 +979072315 +3062681149 +2660208801 +2396764954 +1616591993 +1862900712 +1798792955 +2563429484 +691009202 +2690536081 +2605519353 +1451829335 +1337755668 +4122939591 +423600858 +2368200938 +1770159874 +630655247 +2919806484 +1686323224 +3764830808 +3666452744 +3754766404 +2368679209 +2381190276 +3244441465 +293822737 +1148866304 +3169843732 +72898389 +1873971794 +260318628 +4186972197 +4143384819 +539963134 +3802555726 +3238273819 +1230088268 +272362039 +3068300620 +1453458732 +4180178797 +64540786 +3007517937 +2905918988 +1589032690 +1779490414 +1053176264 +3634412787 +2852197021 +4252339805 +1974706770 +173750364 +442094662 +1787112918 +1554414530 +3987022170 +2316005475 +1001713270 +2351059849 +3128924877 +3353757427 +2360637748 +2952423703 +513292762 +2231010615 +1944671525 +4090007580 +2486535858 +974107844 +1354115708 +2222288417 +2346483033 +1508234101 +557036436 +2877530492 +2809062250 +4141665649 +1246119530 +2619957350 +2693893332 +3564235791 +4115443541 +404342050 +693464453 +1769572708 +728437813 +585807213 +4110041715 +1573959724 +575205405 +3595140224 +3521035952 +1408794797 +1733675737 +1822501973 +2770382496 +4109408653 +960674086 +72933496 +280970587 +1066333672 +709471984 +1496904716 +1748639696 +4293714565 +1038612537 +1446748786 +1274966880 +1149113484 +2142501232 +3610667607 +202256502 +2963987093 +499228278 +1268635386 +2617768678 +3327973261 +1268937836 +4290463523 +1954777581 +4083562623 +3842190942 +532863772 +4050091422 +377022836 +2927281276 +695676359 +3259924869 +4000308167 +3134350526 +1944471538 +1573382886 +342634845 +2809585505 +572027065 +2036890627 +1279988514 +1732192917 +1398390554 +988172833 +2071762561 +3720778444 +1004642434 +4274768958 +1921826994 +3884146192 +3213320865 +4254172836 +2852170291 +1689348646 +634185703 +2864233247 +3666616638 +1955965287 +3647438155 +1235538333 +1298366500 +4057864 +599332391 +2695947983 +2543248388 +3691810639 +2458923978 +3150501918 +1717061788 +4048224861 +2328195480 +2534436250 +1549205792 +4010004281 +1497055831 +1008640225 +2866438780 +165089977 +1137128194 +3731172953 +3231695590 +3184401575 +1359377703 +2244328339 +1302197120 +3259820326 +2636049985 +1489007233 +4220317654 +3686252922 +3356397961 +1947919652 +1238954762 +4182275442 +4263806246 +2982927003 +4210689153 +1810767444 +122020046 +4172832613 +206741283 +4260511768 +3577150024 +166581813 +1219377852 +1829779835 +4263240209 +4069026901 +4233581059 +3060594888 +429656485 +3681931268 +3894652311 +3546080434 +4268732684 +1190665490 +1165952672 +3919735250 +3550581189 +768384218 +2082176439 +3673914692 +1732789241 +869979440 +1968958465 +2643608487 +2577804135 +1534059921 +4017664130 +1079152925 +960236142 +2225597659 +798114930 +1839760720 +971003057 +2788920785 +395697651 +2440244884 +3082714497 +2779571075 +3268858467 +2532290032 +301154006 +4175568237 +1241102357 +775563276 +1490174146 +2702156777 +3653082642 +831274288 +105980315 +345881168 +26235453 +2564688774 +3751988942 +3416802831 +2486450451 +102682152 +2856455936 +288831755 +2322664205 +622945223 +654303825 +1531064776 +3988351586 +1121695785 +3479880689 +1946053934 +1749303636 +1943850349 +1427293593 +3081375949 +1587870746 +3102073336 +1786034024 +714693431 +1172534455 +479302607 +1483021974 +1699228912 +172505982 +2886039316 +4072154283 +758399873 +3205946373 +2512439691 +2405715873 +2820064598 +162133001 +3739900635 +2645851237 +1649313846 +2510058622 +2328652997 +1488088457 +3369703476 +3494767680 +3381476904 +4055302653 +1604234824 +2655233587 +522086614 +4036375811 +29402942 +1737194505 +1543069873 +932465208 +82375551 +2931286844 +4150201357 +1696333980 +3892714892 +1246739162 +1191378500 +2886582209 +3730095293 +4152307202 +2891250669 +1111780501 +681123710 +2122885843 +2702662468 +3066329673 +1790305884 +39801420 +3535277523 +1401872800 +720450550 +2541254183 +3118309828 +2737702438 +2678971228 +3073480779 +695233935 +225536466 +3242034192 +3348531610 +2160931698 +1345377208 +2422668467 +341814941 +285754034 +2058724763 +4207222214 +659540072 +3826032203 +1708910605 +3875108972 +1881686668 +1824463384 +1643022017 +186199390 +1446862923 +731133117 +1725762681 +367521914 +495998514 +1150820911 +4080466267 +1816093426 +389718925 +3775236958 +442252791 +840520303 +2843344613 +4222843729 +3366449401 +2142402737 +2240895204 +250610674 +2130563415 +2899313971 +2693238329 +663575081 +3098514941 +388418518 +2328306820 +1471835105 +3044599854 +377714408 +880987740 +2703334856 +3646918425 +4196054536 +1049612092 +867486951 +530868554 +3174854197 +2389700125 +455242512 +3662454679 +2691007714 +2100192620 +797302076 +1445609229 +1527074721 +3531527925 +2921108405 +597487302 +1061767068 +3555471078 +2094703631 +1936268646 +1645611122 +1435652967 +1384130335 +4066478464 +3467504269 +2875542555 +19650294 +3289781908 +3306026504 +1936990085 +2746195468 +4103362556 +4187925416 +91282968 +2232225910 +2218205635 +2602675329 +3880613183 +3733526634 +4015464775 +2940103964 +3633449805 +2222100003 +1310934219 +3385403625 +770480866 +2816772122 +2119019982 +1160922696 +1429347785 +1513635899 +1024866089 +147068340 +3742431667 +2993386300 +2652673274 +2771105597 +3760404279 +2323505008 +2113703013 +3781841393 +2631981897 +2133388362 +2792358112 +881109110 +1401152779 +484719121 +1310413364 +811593585 +1447438491 +834888786 +373214476 +165970625 +2185208742 +2958577917 +2671089987 +3250880403 +1115436396 +624856979 +2165577655 +2592119612 +775227040 +740832145 +3673169441 +2584938655 +2246126392 +55545992 +2385320892 +780808140 +497821964 +3705382535 +1484365356 +927887451 +1632352584 +2961244003 +2124390162 +4148267467 +3237430772 +367790344 +2999893878 +3244496621 +2044692506 +2319623025 +3441750759 +241244872 +2211020188 +3784523176 +1853820916 +3660205298 +2185773305 +1774497013 +4276182338 +3159111009 +578229621 +2366239960 +918562559 +2072523050 +299171320 +820254181 +2921970716 +2053245979 +1427216469 +2998044702 +919479073 +408316139 +278268733 +3252080692 +2200669628 +2416843468 +414557415 +1761558718 +94898634 +1513890548 +3574207097 +1478460888 +336147789 +3640363661 +2492395346 +1153414810 +1381044458 +3962133256 +3464413806 +2636622271 +3001876335 +655113965 +1346386461 +4039013819 +2072355938 +5256070 +1386514033 +307330504 +4267282814 +1097093402 +1693308967 +1579045984 +2666125903 +3670369723 +207554654 +462579107 +2950520985 \ No newline at end of file diff --git a/RHF/router_mega/main.cpp b/RHF/router_mega/main.cpp new file mode 100755 index 0000000..a267f75 --- /dev/null +++ b/RHF/router_mega/main.cpp @@ -0,0 +1,249 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Generator.h" +#include "Tester/PerfectRouterTester1.h" +#include "Tester/PerfectRouterTester2.h" +#include "Tester/PerfectRouterTester3.h" +#include "CTimer1.h" +#include "CTimer2.h" +#include "CTimer3.h" +// #include "Performance/Performance.h" + +//------------------------------------------------------------------------------ +using namespace std; +vector filePath; +// Resource memory calculation +// typedef struct { +// unsigned long size,resident,share,text,lib,data,dt; +// } statm_t; +int listdir(string path) { + struct dirent *entry; + DIR *dp; + + dp = opendir(path.c_str()); + if (dp == NULL) { + perror("opendir: Path does not exist or could not be read."); + return -1; + } + + while ((entry = readdir(dp))) + { + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + else if (entry->d_type == 8) + { + string filePathName = (path + entry->d_name); + // fprintf(stderr,"%s\n", filePathName); + filePath.push_back(filePathName); + } + else if (entry->d_type == 10) + continue; + else if (entry->d_type == 4) // this is a folder, not a file + { + listdir(path + entry->d_name + "/"); + } + + } + + closedir(dp); + return 0; +} +// statm_t getCurrentRSS() +// { +// statm_t result; +// FILE* fp = NULL; +// if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL ) +// { +// fprintf(stderr,"can not open /proc/self/statm \r\n"); +// return result; +// } +// if(7 != fscanf(fp,"%ld %ld %ld %ld %ld %ld %ld", +// &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt)) +// { +// fprintf(stderr,"wrong information in /proc/self/statm \r\n"); +// return result; +// } +// fclose( fp ); +// return result; // in pages +// } + +// int RoundUpPow2(int val) +// { +// int base2 = 2; +// while( base2 < val) +// { +// base2 *= 2; +// } +// return base2; +// } + +//------------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + // struct rusage start, end, gStart, gEnd; + // getrusage(RUSAGE_SELF, &start); + // make sure two args + if( (argc<3) || (argc>5) ) + { + fprintf(stderr,"%d", argc); + fprintf(stderr,"Check command:\r\n"); + fprintf(stderr,"Please specify the router n = 1/2/3\r\n"); + + fprintf(stderr,"Report construction time: ./Generate n FolderPath\r\n"); + fprintf(stderr," terminal print time information.\r\n"); + fprintf(stderr,"Generate function: ./Generate n input.txt function.txt\r\n"); + fprintf(stderr," function.txt will be generated.\r\n"); + fprintf(stderr,"Test generated function: ./Generate n input.txt function.txt -t\r\n"); + fprintf(stderr," function.txt will be tested based on input.txt\r\n"); + return 1; + } + // Check n is 1/2/3 + if ((strcmp(argv[1],"1")!=0) && strcmp(argv[1],"2")!=0 && strcmp(argv[1],"3")!=0) + { + fprintf(stderr,"Please specify the router n = 1/2/3\r\n"); + return 1; + } + + //////////////////////////////////////////////////////////////////////// + // Add more checking logic for bad input args + //////////////////////////////////////////////////////////////////////// + if (argc==3) // compare construction time + { + string path = argv[2]; + listdir(path); + + int fileNum = filePath.size(); + double accTime = 0.0; + double maxTime = 0.0; + uint64_t maxStorageCost = 0; + for (int i=0;i maxTime){ + maxTime = curTime; + } + } + fprintf(stderr,"Maximum storage cost is: %d bit\n", maxStorageCost); + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + return 0; + } + + // import from input file + const char * inFileName = (argv[2]); + // define hash array for input hash keys + uint32_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(inFileName, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", inFileName); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint32_t h = atoi(l.c_str()); + key[ind++] = h; // load the string hash value + } + + // fprintf(stderr,"Hash keys loaded for file: %s\r\n", inFileName); + int nHash = ind; + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + uint32_t *hash = key; + int *pn = port; + // Test the correctness generated function for Interface Mapping + // or, Generate the function + const char *funcFileName = argv[3]; + if (argc==4) // generate function + { + if(strcmp(argv[1],"1")==0) { + bool gFinish = generateFunction1(argv[3], hash, pn, nHash); + } else if(strcmp(argv[1],"2")==0) { + bool gFinish = generateFunction2(argv[3], hash, pn, nHash); + } else if(strcmp(argv[1],"3")==0) { + bool gFinish = generateFunction3(argv[3], hash, pn, nHash); + } + } else if((argc==5) && strcmp(argv[4],"-t")==0) // verify function + { + if(strcmp(argv[1],"1")==0) { + TPerfectRouterTester1 myT; + bool tFinish = myT.Test(funcFileName, hash, pn, nHash); + myT.Close(); + } else if(strcmp(argv[1],"2")==0) { + TPerfectRouterTester2 myT; + bool tFinish = myT.Test(funcFileName, hash, pn, nHash); + myT.Close(); + } else if(strcmp(argv[1],"3")==0) { + TPerfectRouterTester3 myT; + bool tFinish = myT.Test(funcFileName, hash, pn, nHash); + myT.Close(); + } + } + // fprintf(stderr,"pageSize: %ld kB\r\n", (size_t)(sysconf( _SC_PAGESIZE)/1024)); + // Get statistics about the performance + // getrusage(RUSAGE_SELF, &end); + // fprintf(stderr,"Peak resident set size: %ld kB\n", end.ru_maxrss); + + // statm_t result = getCurrentRSS(); + // long pageKB = (long)(sysconf( _SC_PAGESIZE)/1024); + // fprintf(stderr,"resident set (VmRSS) size: %lu kB\r\n", result.resident * pageKB); + // fprintf(stderr,"virtual memory (VmSize) usage: %lu kB\r\n", result.size * pageKB); + // fprintf(stderr,"share memory (RssFile+RssShmem) usage: %lu kB\r\n", result.share * pageKB); + // fprintf(stderr,"code text usage: %lu kB\r\n", result.text * pageKB); + // fprintf(stderr,"data + stack usage: %lu kB\r\n", result.data * pageKB); + + return 0; +} +//------------------------------------------------------------------------------ diff --git a/RHF/router_mega/output.txt b/RHF/router_mega/output.txt new file mode 100755 index 0000000..b5e5ab1 --- /dev/null +++ b/RHF/router_mega/output.txt @@ -0,0 +1,17410 @@ +1024 +16384 +4 +159 +28 +6 +2 +1 +1 +39 +3 +2 +1 +20 +5 +7 +13 +1 +9 +19 +5 +31 +2 +9 +11 +1 +2 +4 +36 +1 +31 +25 +28 +3 +2 +3 +13 +1 +22 +5 +29 +7 +23 +12 +7 +35 +2 +21 +24 +15 +1 +1 +11 +22 +1 +1 +3 +17 +7 +2 +4 +2 +2 +2 +25 +14 +60 +5 +2 +1 +1 +1 +54 +1 +6 +45 +17 +3 +2 +1 +4 +13 +3 +4 +7 +5 +3 +13 +4 +15 +1 +8 +82 +5 +1 +1 +45 +22 +16 +2 +16 +3 +62 +17 +10 +80 +40 +16 +19 +8 +5 +36 +2 +2 +8 +13 +6 +1 +90 +1 +5 +16 +1 +1 +17 +1 +24 +2 +5 +47 +34 +9 +16 +4 +1 +1 +17 +7 +12 +1 +17 +15 +17 +3 +8 +29 +24 +9 +35 +11 +3 +2 +1 +35 +1 +3 +2 +29 +1 +1 +16 +59 +11 +1 +1 +16 +2 +3 +25 +2 +1 +42 +10 +1 +9 +6 +15 +22 +15 +63 +12 +7 +12 +10 +1 +1 +5 +66 +38 +1 +22 +2 +20 +13 +3 +8 +6 +12 +68 +8 +27 +13 +4 +53 +7 +15 +2 +41 +47 +2 +31 +6 +37 +66 +3 +2 +5 +3 +3 +5 +17 +76 +2 +8 +12 +2 +42 +22 +1 +15 +36 +15 +9 +27 +36 +4 +11 +28 +7 +6 +12 +5 +16 +16 +23 +10 +1 +17 +4 +21 +1 +9 +19 +11 +3 +16 +8 +6 +11 +2 +14 +38 +31 +2 +5 +30 +1 +3 +13 +36 +12 +5 +4 +26 +31 +13 +5 +6 +7 +5 +5 +6 +1 +1 +6 +4 +15 +5 +12 +2 +26 +1 +11 +91 +3 +38 +2 +1 +11 +17 +17 +2 +3 +32 +17 +1 +14 +1 +1 +21 +1 +15 +6 +1 +19 +6 +2 +9 +1 +20 +8 +4 +1 +4 +4 +6 +13 +29 +2 +30 +10 +2 +10 +6 +35 +23 +4 +2 +43 +7 +72 +14 +22 +6 +17 +3 +1 +9 +1 +12 +16 +8 +17 +12 +17 +36 +6 +11 +6 +3 +3 +1 +72 +2 +4 +5 +73 +12 +26 +6 +2 +5 +12 +14 +40 +15 +27 +3 +52 +7 +17 +6 +1 +34 +2 +2 +1 +23 +4 +4 +1 +31 +16 +6 +7 +9 +3 +18 +9 +19 +27 +1 +5 +26 +2 +11 +40 +2 +9 +7 +12 +2 +4 +22 +1 +8 +21 +6 +1 +2 +51 +45 +23 +2 +6 +13 +10 +6 +18 +2 +5 +15 +18 +4 +3 +3 +4 +52 +72 +6 +8 +2 +29 +4 +13 +5 +174 +8 +8 +1 +26 +47 +14 +1 +20 +4 +1 +39 +5 +38 +1 +2 +7 +5 +28 +33 +29 +6 +5 +21 +2 +4 +111 +41 +1 +1 +2 +7 +9 +5 +6 +16 +3 +2 +55 +7 +54 +23 +5 +6 +5 +4 +4 +33 +1 +8 +1 +161 +15 +1 +4 +2 +5 +1 +4 +7 +55 +4 +60 +3 +10 +16 +2 +1 +1 +10 +6 +14 +14 +1 +1 +1 +49 +54 +3 +4 +2 +5 +7 +24 +1 +3 +7 +5 +4 +12 +21 +1 +1 +9 +34 +40 +30 +1 +33 +75 +20 +3 +3 +3 +43 +8 +22 +1 +1 +37 +4 +6 +86 +19 +21 +41 +12 +7 +11 +1 +5 +5 +3 +4 +1 +18 +7 +16 +1 +36 +4 +25 +7 +4 +13 +7 +1 +14 +10 +1 +2 +3 +14 +30 +2 +4 +46 +3 +42 +1 +12 +1 +4 +14 +17 +6 +20 +1 +44 +11 +1 +81 +18 +6 +21 +3 +4 +7 +57 +3 +2 +45 +46 +5 +1 +25 +10 +6 +11 +4 +15 +9 +5 +14 +18 +8 +30 +56 +40 +10 +7 +18 +49 +8 +65 +5 +14 +1 +1 +25 +16 +9 +2 +26 +23 +50 +4 +110 +8 +20 +73 +2 +12 +20 +41 +1 +14 +3 +23 +32 +2 +22 +3 +66 +2 +3 +50 +14 +4 +35 +1 +19 +19 +6 +2 +31 +15 +16 +21 +5 +10 +56 +32 +70 +11 +16 +1 +11 +12 +18 +9 +18 +26 +27 +50 +10 +2 +6 +10 +12 +50 +3 +3 +1 +32 +30 +3 +9 +9 +3 +25 +14 +5 +16 +18 +6 +129 +21 +6 +12 +11 +49 +27 +24 +66 +2 +3 +5 +1 +4 +1 +2 +1 +47 +5 +42 +3 +11 +4 +79 +3 +2 +7 +56 +24 +1 +20 +5 +1 +73 +4 +16 +76 +4 +9 +1 +9 +1 +27 +9 +1 +23 +25 +1 +52 +14 +7 +2 +69 +8 +25 +11 +3 +18 +12 +8 +1 +2 +47 +15 +5 +1 +46 +26 +2 +2 +33 +42 +25 +36 +11 +11 +3 +3 +2 +5 +10 +16 +3 +45 +2 +4 +10 +2 +15 +1 +46 +62 +1 +7 +7 +1 +13 +3 +131 +9 +21 +36 +5 +2 +35 +2 +12 +14 +10 +17 +28 +43 +19 +5 +8 +1 +3 +47 +39 +8 +2 +75 +7 +21 +19 +1 +37 +1 +30 +11 +24 +13 +67 +81 +5 +26 +6 +10 +45 +2 +8 +31 +11 +26 +6 +19 +10 +7 +1 +1 +30 +7 +6 +14 +25 +1 +1 +33 +4 +1 +17 +65 +10 +6 +21 +5 +9 +5 +23 +1 +1 +25 +114 +13 +4 +11 +31 +16 +3 +6 +5 +21 +94 +1 +18 +13 +6 +1 +66 +15 +8 +9 +8 +3 +1 +27 +13 +5 +11 +51 +5 +1 +19 +4 +10 +8 +16 +22 +10 +42 +41 +67 +1 +12 +3 +14 +3 +3 +24 +1 +2 +4 +24 +16 +54 +2 +49 +2 +3 +2 +27 +9 +2 +4 +45 +45 +6 +14 +1 +21 +2 +11 +11 +4 +50 +97 +19 +52 +1 +6 +25 +1 +2 +14 +13 +29 +18 +3 +12 +13 +2 +1 +23 +2 +3 +2 +50 +17 +24 +33 +15 +2 +52 +11 +6 +1 +8 +164 +1 +4 +3 +50 +66 +4 +1 +48 +6 +9 +77 +8 +8 +1 +1 +6 +13 +128 +10 +8 +7 +4 +1 +31 +65 +1 +3 +3 +0 +0 +1 +1 +0 +4 +3 +4 +3 +4 +1 +4 +0 +1 +0 +2 +2 +1 +0 +2 +0 +0 +3 +3 +1 +3 +4 +0 +0 +3 +0 +0 +0 +0 +0 +1 +2 +0 +4 +0 +0 +1 +2 +0 +0 +0 +0 +2 +4 +0 +3 +1 +4 +0 +2 +2 +3 +2 +3 +0 +1 +2 +0 +3 +1 +0 +0 +3 +4 +3 +0 +2 +0 +0 +2 +0 +4 +1 +0 +0 +2 +2 +0 +0 +0 +0 +2 +0 +2 +3 +0 +2 +4 +2 +0 +0 +2 +2 +3 +4 +0 +2 +1 +2 +3 +1 +3 +0 +0 +1 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +3 +1 +0 +2 +0 +1 +0 +3 +4 +0 +2 +0 +3 +0 +1 +3 +0 +0 +2 +4 +0 +0 +0 +3 +3 +0 +0 +4 +1 +3 +3 +0 +0 +0 +1 +2 +0 +3 +1 +2 +4 +4 +1 +0 +0 +0 +1 +0 +0 +2 +0 +4 +4 +0 +2 +3 +1 +0 +3 +0 +0 +1 +0 +4 +0 +0 +0 +0 +0 +0 +0 +4 +1 +1 +3 +3 +0 +0 +0 +4 +0 +0 +0 +0 +0 +4 +0 +3 +0 +4 +1 +0 +0 +0 +0 +0 +0 +3 +0 +2 +0 +0 +0 +4 +0 +2 +0 +2 +3 +1 +2 +4 +0 +0 +2 +2 +2 +1 +3 +0 +0 +0 +0 +2 +0 +0 +0 +0 +1 +0 +2 +4 +2 +2 +3 +0 +1 +0 +0 +2 +4 +1 +3 +3 +0 +0 +3 +0 +0 +0 +0 +2 +1 +3 +0 +1 +0 +3 +0 +3 +0 +0 +3 +3 +4 +0 +4 +2 +3 +4 +0 +0 +0 +0 +3 +0 +1 +4 +1 +0 +1 +2 +0 +0 +0 +0 +4 +0 +0 +0 +1 +3 +0 +0 +4 +0 +0 +2 +1 +0 +0 +0 +3 +3 +4 +0 +3 +0 +2 +1 +3 +0 +0 +3 +1 +4 +3 +0 +1 +0 +3 +0 +2 +0 +0 +2 +3 +3 +0 +0 +0 +1 +0 +0 +0 +3 +0 +1 +0 +3 +0 +4 +4 +0 +1 +0 +1 +0 +0 +4 +0 +3 +0 +0 +1 +0 +0 +4 +0 +0 +4 +3 +1 +0 +1 +4 +1 +0 +0 +0 +3 +4 +0 +0 +0 +2 +2 +3 +4 +0 +1 +0 +4 +4 +2 +4 +2 +0 +0 +4 +4 +1 +3 +4 +0 +0 +3 +0 +2 +2 +0 +4 +1 +0 +0 +1 +0 +2 +0 +0 +0 +2 +0 +0 +3 +0 +0 +3 +1 +1 +0 +0 +1 +4 +4 +0 +0 +3 +0 +1 +4 +3 +4 +4 +0 +0 +2 +3 +0 +0 +4 +0 +1 +0 +1 +0 +2 +1 +0 +4 +1 +3 +0 +0 +0 +1 +2 +4 +0 +0 +2 +4 +2 +0 +3 +3 +0 +4 +0 +2 +0 +4 +4 +2 +4 +0 +0 +4 +0 +0 +2 +2 +0 +0 +0 +2 +1 +1 +3 +3 +1 +4 +2 +0 +2 +0 +0 +0 +3 +3 +2 +0 +0 +4 +0 +2 +0 +0 +1 +0 +1 +0 +3 +0 +0 +0 +1 +1 +0 +2 +4 +3 +3 +0 +0 +1 +0 +1 +2 +1 +0 +4 +0 +1 +3 +2 +2 +1 +0 +4 +0 +1 +0 +0 +3 +3 +1 +0 +0 +2 +2 +0 +3 +0 +2 +0 +1 +4 +0 +3 +3 +2 +0 +0 +2 +0 +0 +0 +4 +0 +1 +1 +1 +0 +0 +2 +0 +3 +4 +0 +1 +3 +0 +0 +3 +0 +0 +4 +0 +3 +0 +2 +0 +3 +3 +4 +3 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +0 +4 +3 +0 +3 +0 +1 +0 +0 +1 +2 +4 +0 +1 +0 +0 +0 +2 +1 +4 +2 +1 +0 +3 +3 +0 +1 +3 +2 +4 +0 +2 +4 +3 +3 +0 +4 +4 +0 +0 +3 +0 +0 +0 +0 +1 +0 +1 +1 +0 +0 +0 +0 +4 +1 +4 +3 +0 +0 +1 +0 +0 +1 +0 +0 +2 +2 +2 +1 +4 +0 +1 +0 +2 +2 +2 +0 +0 +0 +4 +0 +1 +0 +0 +4 +4 +0 +0 +2 +2 +4 +2 +1 +0 +0 +0 +0 +2 +0 +3 +1 +4 +0 +0 +0 +0 +0 +0 +3 +4 +0 +1 +1 +3 +0 +3 +1 +3 +3 +2 +0 +2 +0 +1 +0 +0 +0 +0 +0 +1 +2 +3 +0 +0 +3 +0 +3 +1 +4 +1 +3 +4 +0 +4 +4 +0 +4 +1 +2 +0 +1 +0 +0 +0 +2 +0 +1 +1 +0 +2 +4 +1 +3 +0 +3 +0 +2 +0 +2 +1 +2 +3 +0 +0 +4 +4 +4 +3 +0 +0 +1 +3 +0 +0 +1 +1 +0 +2 +0 +3 +4 +0 +0 +0 +3 +0 +3 +1 +0 +4 +0 +0 +0 +1 +2 +1 +1 +4 +1 +0 +2 +4 +3 +4 +0 +4 +2 +0 +3 +0 +2 +0 +0 +3 +3 +3 +1 +1 +2 +1 +4 +0 +4 +3 +1 +0 +4 +4 +4 +1 +0 +2 +3 +2 +1 +3 +0 +0 +0 +3 +0 +3 +2 +2 +3 +4 +0 +0 +0 +4 +3 +0 +0 +4 +0 +0 +3 +1 +4 +0 +1 +0 +0 +0 +0 +1 +4 +1 +0 +2 +1 +4 +2 +3 +4 +1 +3 +1 +0 +3 +0 +0 +0 +0 +0 +0 +0 +4 +4 +4 +2 +0 +3 +0 +4 +3 +0 +4 +3 +0 +2 +0 +4 +2 +0 +4 +1 +0 +0 +4 +1 +3 +3 +3 +0 +4 +3 +1 +0 +4 +0 +3 +2 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +4 +4 +3 +4 +3 +3 +4 +0 +2 +4 +1 +0 +0 +4 +0 +0 +4 +0 +0 +2 +0 +0 +3 +4 +1 +2 +4 +1 +1 +4 +4 +1 +1 +3 +2 +2 +1 +2 +3 +0 +3 +0 +2 +0 +0 +0 +4 +0 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +1 +0 +0 +0 +0 +3 +0 +1 +4 +0 +0 +3 +1 +0 +2 +1 +0 +0 +4 +1 +0 +3 +0 +3 +0 +0 +4 +0 +2 +1 +1 +2 +1 +0 +1 +0 +4 +4 +0 +4 +1 +4 +0 +1 +0 +0 +0 +1 +2 +0 +4 +3 +3 +0 +0 +3 +1 +0 +0 +3 +2 +4 +3 +0 +3 +2 +2 +0 +0 +2 +1 +0 +0 +0 +1 +0 +0 +2 +0 +0 +0 +0 +3 +2 +0 +0 +1 +4 +2 +1 +1 +2 +1 +1 +0 +2 +3 +1 +3 +3 +0 +1 +4 +0 +0 +0 +4 +0 +0 +0 +2 +3 +0 +1 +0 +3 +0 +0 +0 +0 +0 +0 +0 +2 +0 +1 +2 +0 +2 +0 +0 +0 +2 +0 +3 +0 +0 +0 +0 +3 +0 +0 +0 +2 +0 +0 +3 +0 +3 +0 +1 +0 +0 +0 +4 +2 +0 +4 +3 +2 +3 +3 +3 +1 +0 +4 +1 +4 +1 +3 +0 +0 +0 +0 +2 +4 +1 +0 +0 +4 +1 +0 +3 +2 +4 +1 +0 +1 +1 +3 +4 +4 +0 +3 +1 +1 +0 +0 +0 +0 +0 +0 +3 +0 +0 +0 +1 +3 +3 +0 +1 +0 +0 +1 +0 +4 +1 +0 +3 +0 +1 +4 +3 +0 +1 +0 +0 +0 +4 +2 +0 +0 +0 +3 +4 +0 +1 +4 +0 +3 +1 +0 +1 +2 +0 +0 +4 +0 +0 +0 +1 +2 +2 +1 +0 +3 +0 +4 +4 +4 +2 +0 +1 +4 +0 +1 +0 +0 +2 +0 +4 +0 +3 +3 +1 +3 +2 +4 +1 +0 +1 +0 +0 +0 +1 +0 +0 +2 +0 +0 +0 +2 +4 +2 +0 +4 +2 +3 +4 +1 +1 +0 +2 +3 +1 +0 +3 +4 +0 +3 +1 +3 +2 +1 +0 +4 +4 +0 +2 +2 +0 +4 +4 +0 +3 +4 +4 +0 +0 +4 +0 +3 +0 +0 +0 +3 +2 +3 +2 +1 +2 +4 +4 +0 +0 +0 +0 +0 +2 +0 +4 +0 +1 +3 +0 +0 +2 +0 +0 +0 +1 +0 +0 +1 +0 +1 +1 +3 +3 +4 +2 +0 +0 +4 +1 +4 +0 +0 +0 +4 +0 +0 +4 +2 +2 +0 +0 +4 +3 +0 +0 +1 +0 +1 +3 +3 +0 +4 +4 +4 +4 +2 +1 +0 +0 +0 +3 +4 +2 +1 +4 +1 +3 +0 +2 +3 +3 +4 +1 +2 +1 +0 +2 +1 +0 +0 +1 +4 +4 +0 +2 +4 +1 +0 +0 +3 +3 +3 +3 +0 +0 +0 +3 +2 +3 +0 +4 +0 +3 +2 +0 +0 +2 +1 +4 +0 +2 +3 +0 +4 +0 +4 +0 +2 +0 +0 +3 +0 +3 +4 +3 +2 +2 +0 +0 +4 +0 +0 +4 +1 +3 +0 +0 +0 +1 +0 +0 +0 +0 +1 +1 +0 +3 +1 +2 +0 +3 +1 +0 +3 +0 +1 +0 +0 +0 +4 +3 +0 +2 +0 +2 +2 +2 +0 +0 +4 +1 +3 +3 +0 +0 +0 +0 +0 +0 +3 +1 +0 +0 +0 +4 +0 +3 +4 +0 +2 +1 +4 +0 +1 +0 +4 +0 +0 +3 +2 +0 +0 +3 +0 +1 +2 +0 +2 +0 +0 +3 +2 +0 +0 +4 +3 +4 +0 +0 +0 +0 +1 +3 +3 +2 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +4 +1 +4 +0 +0 +3 +0 +1 +3 +1 +4 +0 +4 +0 +0 +0 +0 +0 +0 +2 +2 +0 +0 +3 +0 +0 +1 +3 +0 +2 +1 +0 +4 +0 +0 +0 +3 +0 +4 +2 +0 +0 +0 +4 +1 +2 +0 +3 +4 +1 +0 +2 +0 +0 +0 +0 +4 +0 +4 +1 +4 +4 +4 +3 +0 +0 +0 +0 +0 +0 +4 +3 +1 +0 +1 +0 +0 +2 +4 +0 +0 +3 +0 +2 +0 +2 +0 +2 +2 +2 +2 +2 +0 +0 +0 +0 +0 +2 +2 +3 +4 +2 +2 +4 +2 +2 +0 +4 +2 +0 +1 +3 +0 +2 +2 +0 +1 +0 +2 +0 +0 +1 +0 +0 +4 +1 +0 +0 +3 +0 +1 +0 +0 +4 +0 +2 +1 +0 +1 +0 +0 +2 +3 +2 +0 +0 +0 +1 +1 +3 +3 +1 +0 +1 +0 +0 +4 +2 +2 +0 +2 +0 +3 +1 +0 +0 +1 +0 +0 +3 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +4 +0 +0 +0 +2 +1 +3 +2 +0 +0 +0 +1 +1 +1 +3 +4 +0 +0 +0 +0 +4 +0 +0 +2 +0 +2 +0 +4 +4 +2 +3 +4 +0 +0 +0 +4 +2 +1 +1 +0 +0 +2 +1 +0 +0 +4 +2 +2 +1 +2 +2 +1 +4 +4 +2 +1 +0 +1 +0 +0 +3 +0 +3 +0 +2 +2 +3 +0 +0 +0 +1 +3 +2 +0 +0 +2 +0 +0 +4 +0 +0 +0 +2 +4 +3 +0 +0 +1 +2 +1 +0 +0 +1 +0 +2 +0 +1 +0 +0 +1 +4 +3 +3 +3 +1 +0 +0 +0 +2 +4 +1 +0 +1 +0 +1 +0 +2 +1 +4 +0 +3 +0 +0 +0 +1 +0 +3 +1 +4 +0 +0 +3 +0 +3 +4 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +0 +3 +2 +2 +3 +3 +0 +4 +0 +0 +3 +1 +0 +3 +0 +0 +0 +0 +0 +0 +1 +2 +3 +2 +0 +0 +4 +0 +0 +2 +0 +3 +1 +0 +4 +1 +0 +2 +0 +1 +3 +0 +0 +1 +1 +3 +2 +0 +4 +0 +4 +3 +3 +0 +3 +1 +0 +3 +2 +0 +0 +2 +2 +4 +2 +0 +2 +4 +4 +2 +0 +2 +4 +0 +2 +0 +1 +4 +1 +1 +3 +4 +0 +0 +0 +0 +4 +2 +0 +0 +2 +3 +0 +3 +0 +1 +0 +0 +4 +0 +4 +4 +3 +3 +0 +0 +4 +0 +3 +0 +4 +0 +0 +4 +1 +1 +2 +0 +1 +0 +0 +1 +0 +1 +4 +2 +4 +1 +0 +4 +0 +0 +0 +3 +3 +2 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +1 +1 +0 +0 +4 +4 +4 +4 +0 +2 +4 +2 +4 +2 +4 +0 +0 +2 +0 +1 +4 +2 +2 +0 +4 +0 +2 +1 +4 +2 +1 +1 +4 +2 +3 +1 +1 +4 +0 +2 +2 +2 +1 +0 +4 +0 +1 +0 +4 +1 +2 +0 +0 +0 +3 +4 +3 +4 +2 +4 +0 +3 +0 +0 +0 +1 +0 +3 +1 +2 +3 +0 +0 +1 +0 +4 +0 +4 +2 +0 +0 +4 +3 +0 +1 +0 +0 +0 +2 +3 +2 +1 +2 +0 +0 +2 +4 +1 +1 +0 +4 +0 +1 +1 +2 +0 +2 +0 +2 +0 +1 +0 +3 +4 +0 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +2 +4 +3 +1 +3 +0 +1 +2 +0 +0 +0 +0 +2 +0 +4 +0 +1 +0 +1 +4 +3 +4 +1 +1 +0 +0 +1 +0 +4 +0 +2 +0 +3 +0 +4 +2 +0 +0 +1 +0 +1 +4 +4 +0 +0 +2 +0 +0 +0 +1 +2 +2 +2 +1 +2 +0 +2 +1 +0 +3 +1 +4 +0 +4 +1 +3 +0 +1 +4 +4 +3 +3 +0 +0 +2 +3 +2 +3 +0 +2 +2 +0 +0 +0 +1 +0 +3 +0 +0 +2 +3 +2 +0 +2 +4 +0 +3 +2 +4 +3 +0 +1 +4 +3 +0 +0 +4 +4 +3 +0 +4 +0 +1 +4 +0 +0 +3 +0 +3 +0 +0 +0 +2 +0 +2 +2 +0 +0 +0 +0 +0 +3 +4 +1 +1 +1 +0 +2 +0 +0 +3 +3 +3 +0 +3 +0 +1 +0 +0 +3 +0 +4 +1 +0 +3 +3 +0 +0 +1 +2 +3 +0 +0 +0 +4 +0 +0 +2 +0 +0 +1 +0 +4 +0 +4 +0 +2 +4 +2 +0 +3 +2 +4 +4 +0 +2 +0 +0 +4 +2 +1 +0 +1 +2 +3 +2 +4 +1 +3 +0 +1 +0 +3 +1 +0 +0 +0 +3 +4 +0 +0 +3 +0 +0 +4 +0 +3 +1 +0 +3 +0 +0 +0 +2 +1 +1 +2 +0 +4 +3 +4 +0 +0 +0 +2 +4 +2 +3 +1 +0 +2 +3 +3 +2 +0 +1 +0 +0 +0 +4 +0 +0 +1 +3 +3 +0 +2 +0 +0 +1 +2 +1 +0 +0 +0 +0 +4 +4 +3 +0 +3 +0 +2 +0 +1 +0 +0 +0 +4 +2 +0 +0 +0 +0 +0 +3 +4 +4 +0 +4 +4 +1 +0 +3 +0 +2 +0 +0 +0 +0 +1 +0 +1 +0 +2 +3 +0 +3 +1 +3 +0 +3 +0 +3 +3 +0 +3 +0 +0 +0 +0 +0 +4 +1 +4 +3 +0 +0 +2 +3 +3 +0 +3 +2 +0 +3 +3 +0 +0 +0 +0 +3 +4 +0 +3 +0 +1 +0 +0 +3 +0 +1 +0 +1 +2 +0 +0 +0 +3 +0 +3 +4 +1 +3 +3 +2 +0 +0 +0 +2 +0 +0 +3 +3 +4 +3 +4 +4 +4 +0 +0 +3 +0 +0 +1 +4 +0 +3 +1 +1 +1 +0 +0 +1 +3 +4 +1 +1 +0 +3 +0 +0 +3 +1 +0 +1 +0 +0 +1 +2 +2 +0 +4 +2 +0 +1 +0 +1 +2 +1 +0 +4 +0 +3 +0 +0 +3 +0 +2 +0 +0 +3 +2 +3 +0 +1 +0 +1 +1 +0 +1 +0 +4 +4 +1 +1 +0 +2 +0 +0 +2 +3 +0 +3 +0 +0 +0 +1 +0 +0 +1 +0 +2 +0 +0 +2 +0 +3 +1 +2 +1 +0 +0 +1 +4 +0 +2 +4 +2 +0 +0 +2 +0 +4 +4 +0 +3 +0 +3 +2 +4 +3 +0 +0 +1 +4 +4 +3 +3 +1 +0 +0 +1 +0 +4 +0 +0 +4 +0 +4 +0 +3 +1 +0 +0 +3 +3 +0 +0 +1 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +0 +3 +0 +0 +1 +0 +4 +3 +1 +0 +3 +2 +3 +0 +0 +1 +0 +2 +2 +0 +1 +0 +4 +0 +4 +3 +0 +0 +3 +0 +4 +1 +0 +4 +2 +4 +0 +1 +0 +2 +0 +3 +4 +0 +0 +2 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +0 +0 +3 +0 +1 +1 +4 +0 +2 +1 +0 +0 +1 +4 +0 +0 +0 +2 +0 +1 +0 +3 +4 +4 +0 +0 +4 +2 +3 +0 +3 +1 +4 +0 +3 +0 +2 +0 +0 +3 +0 +0 +1 +2 +0 +2 +0 +1 +0 +0 +2 +4 +4 +2 +1 +0 +1 +4 +0 +1 +1 +0 +4 +3 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +0 +4 +3 +0 +2 +2 +0 +4 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +1 +0 +0 +1 +0 +0 +0 +1 +4 +0 +4 +3 +4 +0 +4 +2 +0 +2 +2 +4 +0 +3 +3 +0 +0 +0 +3 +1 +0 +1 +0 +3 +1 +0 +0 +1 +0 +0 +0 +3 +0 +4 +4 +0 +1 +0 +0 +2 +0 +4 +0 +1 +0 +0 +2 +3 +1 +2 +0 +4 +3 +0 +4 +0 +0 +4 +0 +1 +3 +4 +0 +0 +3 +0 +4 +2 +3 +1 +1 +3 +0 +0 +0 +4 +2 +4 +3 +3 +2 +4 +0 +2 +0 +3 +0 +4 +0 +0 +1 +3 +0 +3 +0 +2 +4 +2 +0 +0 +0 +4 +4 +4 +0 +0 +1 +1 +4 +0 +1 +3 +0 +3 +0 +0 +1 +2 +1 +0 +0 +1 +2 +2 +0 +3 +0 +2 +0 +2 +0 +0 +3 +1 +4 +2 +3 +4 +0 +0 +1 +1 +0 +1 +4 +0 +0 +4 +1 +1 +3 +0 +3 +4 +0 +3 +0 +4 +3 +0 +3 +3 +2 +4 +0 +0 +1 +3 +3 +4 +0 +0 +3 +4 +0 +1 +4 +0 +0 +1 +4 +0 +4 +3 +1 +1 +0 +3 +0 +0 +3 +0 +4 +2 +2 +1 +0 +0 +2 +0 +3 +2 +0 +4 +1 +0 +0 +4 +1 +3 +0 +4 +0 +4 +0 +3 +0 +3 +4 +3 +2 +3 +2 +0 +0 +1 +2 +4 +2 +0 +2 +0 +2 +0 +0 +0 +0 +1 +0 +0 +1 +3 +0 +0 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +2 +1 +0 +2 +1 +4 +3 +0 +0 +3 +0 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +0 +2 +0 +4 +3 +0 +3 +3 +0 +0 +4 +1 +0 +0 +0 +1 +1 +2 +0 +2 +0 +0 +4 +2 +4 +0 +3 +3 +0 +0 +2 +0 +2 +2 +0 +0 +2 +0 +4 +4 +0 +0 +4 +2 +2 +3 +0 +3 +4 +0 +2 +3 +4 +2 +0 +4 +3 +4 +0 +0 +0 +0 +1 +0 +4 +4 +0 +2 +0 +0 +1 +3 +1 +4 +0 +3 +3 +0 +1 +1 +0 +3 +4 +0 +4 +4 +3 +0 +2 +0 +0 +3 +0 +1 +1 +0 +0 +0 +2 +0 +0 +0 +0 +0 +3 +2 +2 +0 +1 +1 +3 +0 +0 +0 +4 +4 +0 +1 +0 +2 +0 +3 +0 +4 +0 +3 +0 +1 +0 +3 +2 +2 +0 +0 +0 +0 +0 +0 +2 +3 +1 +4 +0 +0 +4 +0 +0 +0 +4 +0 +3 +0 +0 +4 +0 +0 +2 +2 +0 +3 +1 +4 +4 +0 +1 +0 +0 +1 +2 +0 +1 +3 +3 +0 +1 +0 +0 +2 +1 +3 +0 +0 +0 +2 +1 +0 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +4 +0 +3 +4 +2 +3 +4 +0 +3 +0 +0 +0 +0 +0 +2 +4 +0 +3 +3 +3 +4 +0 +0 +0 +4 +4 +0 +0 +2 +3 +0 +0 +4 +1 +3 +2 +0 +0 +0 +0 +0 +0 +3 +4 +0 +0 +3 +0 +0 +2 +4 +3 +0 +2 +2 +3 +0 +2 +1 +0 +0 +0 +0 +1 +0 +1 +2 +4 +0 +1 +2 +3 +4 +0 +0 +0 +0 +0 +1 +3 +0 +2 +0 +0 +0 +0 +0 +3 +0 +2 +0 +0 +2 +4 +3 +0 +2 +0 +0 +0 +2 +0 +3 +3 +1 +0 +1 +0 +3 +3 +0 +1 +0 +3 +0 +3 +0 +1 +1 +3 +1 +1 +0 +4 +0 +3 +2 +3 +0 +0 +0 +1 +3 +1 +0 +3 +4 +0 +2 +0 +4 +4 +0 +3 +0 +4 +0 +2 +1 +0 +1 +0 +1 +0 +0 +2 +2 +0 +0 +0 +4 +0 +3 +0 +3 +0 +3 +2 +3 +0 +0 +2 +4 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +4 +1 +0 +4 +2 +0 +1 +0 +2 +0 +0 +0 +3 +3 +1 +4 +1 +0 +0 +4 +0 +0 +2 +0 +0 +2 +2 +0 +0 +0 +0 +0 +2 +4 +0 +0 +4 +1 +0 +4 +4 +0 +0 +2 +0 +3 +1 +0 +0 +0 +3 +3 +0 +0 +0 +4 +1 +3 +1 +0 +0 +4 +0 +0 +1 +4 +1 +2 +0 +3 +0 +0 +0 +2 +1 +1 +1 +0 +3 +1 +0 +0 +0 +0 +0 +0 +2 +0 +4 +0 +3 +0 +4 +0 +4 +3 +1 +1 +2 +0 +0 +1 +0 +0 +2 +0 +0 +2 +3 +0 +0 +0 +4 +0 +1 +0 +0 +1 +3 +0 +1 +0 +2 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +1 +2 +0 +3 +2 +0 +0 +1 +0 +0 +0 +0 +0 +0 +2 +0 +1 +4 +4 +1 +0 +2 +0 +4 +3 +0 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +1 +3 +0 +4 +3 +2 +0 +0 +3 +4 +0 +0 +2 +0 +2 +4 +3 +3 +3 +0 +0 +4 +4 +4 +1 +0 +0 +2 +2 +4 +2 +4 +0 +0 +0 +1 +2 +0 +0 +4 +0 +2 +1 +3 +1 +1 +4 +4 +3 +3 +2 +2 +2 +0 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +2 +0 +4 +3 +0 +3 +0 +3 +3 +2 +0 +1 +1 +0 +4 +0 +3 +1 +0 +0 +2 +4 +2 +3 +4 +2 +3 +0 +3 +2 +3 +4 +3 +2 +4 +3 +3 +3 +4 +0 +2 +4 +0 +2 +0 +2 +3 +0 +4 +4 +0 +1 +0 +3 +1 +0 +2 +1 +3 +3 +2 +4 +3 +0 +0 +0 +3 +2 +4 +0 +0 +4 +2 +2 +4 +0 +0 +4 +0 +4 +0 +0 +0 +0 +2 +1 +2 +0 +0 +0 +0 +0 +1 +0 +2 +0 +3 +0 +3 +3 +0 +0 +0 +4 +0 +0 +3 +2 +0 +0 +4 +0 +0 +0 +0 +0 +4 +4 +2 +4 +4 +0 +3 +0 +0 +0 +0 +4 +0 +1 +1 +0 +3 +0 +2 +3 +0 +1 +3 +0 +1 +0 +0 +3 +3 +0 +2 +4 +2 +2 +1 +2 +0 +0 +4 +4 +0 +2 +2 +3 +4 +1 +0 +0 +2 +0 +2 +0 +0 +0 +4 +3 +2 +4 +3 +3 +0 +2 +2 +0 +0 +4 +4 +0 +3 +0 +3 +2 +3 +2 +1 +2 +0 +1 +2 +3 +2 +0 +0 +3 +0 +1 +0 +0 +2 +0 +1 +0 +0 +0 +3 +4 +0 +0 +2 +0 +0 +1 +0 +3 +3 +4 +3 +0 +1 +1 +0 +0 +0 +0 +4 +0 +0 +4 +2 +3 +2 +0 +0 +0 +1 +0 +0 +2 +2 +0 +0 +4 +0 +4 +0 +1 +0 +3 +0 +3 +0 +3 +0 +4 +4 +0 +4 +1 +4 +3 +2 +4 +0 +3 +0 +2 +0 +3 +2 +2 +0 +0 +0 +1 +0 +1 +1 +0 +3 +0 +4 +0 +0 +2 +1 +2 +0 +0 +4 +2 +4 +0 +0 +1 +3 +1 +4 +2 +0 +0 +4 +2 +4 +4 +2 +0 +1 +3 +2 +0 +0 +0 +0 +3 +3 +4 +0 +2 +2 +0 +0 +3 +2 +4 +0 +0 +1 +2 +2 +0 +0 +4 +3 +2 +0 +2 +0 +1 +0 +0 +0 +3 +1 +0 +1 +4 +3 +1 +0 +1 +0 +3 +2 +0 +4 +4 +2 +2 +0 +0 +3 +0 +0 +1 +3 +3 +0 +0 +3 +0 +2 +4 +2 +3 +0 +4 +0 +2 +4 +2 +2 +0 +4 +0 +0 +4 +4 +0 +0 +3 +0 +1 +0 +4 +2 +0 +1 +2 +2 +0 +0 +4 +1 +0 +0 +2 +4 +4 +0 +0 +3 +0 +0 +0 +1 +0 +4 +0 +0 +4 +2 +4 +0 +1 +0 +0 +0 +2 +2 +0 +1 +4 +4 +0 +1 +0 +2 +3 +4 +3 +4 +0 +3 +0 +3 +3 +0 +4 +1 +1 +1 +4 +0 +3 +2 +2 +3 +0 +4 +0 +3 +3 +4 +0 +3 +0 +3 +1 +0 +1 +1 +1 +0 +1 +3 +0 +3 +0 +0 +0 +4 +2 +0 +0 +0 +4 +3 +2 +0 +1 +0 +0 +3 +1 +0 +0 +0 +2 +4 +4 +3 +3 +4 +1 +3 +0 +0 +2 +3 +0 +4 +4 +1 +4 +0 +1 +4 +3 +0 +4 +0 +3 +4 +0 +3 +3 +1 +0 +0 +1 +1 +0 +0 +1 +3 +0 +2 +0 +0 +0 +1 +0 +0 +0 +1 +3 +0 +0 +2 +3 +3 +2 +3 +0 +0 +4 +4 +4 +3 +2 +0 +3 +2 +0 +2 +0 +0 +0 +0 +0 +1 +2 +0 +0 +1 +0 +4 +2 +4 +0 +3 +0 +0 +1 +4 +1 +0 +0 +1 +4 +0 +0 +4 +0 +3 +1 +1 +3 +1 +0 +4 +1 +0 +0 +3 +1 +2 +0 +1 +0 +2 +0 +3 +3 +0 +0 +2 +3 +2 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +1 +3 +0 +4 +0 +0 +0 +0 +2 +2 +1 +1 +0 +0 +0 +0 +0 +1 +1 +1 +4 +0 +0 +4 +3 +0 +0 +0 +0 +3 +4 +3 +0 +1 +4 +1 +0 +0 +0 +0 +3 +0 +4 +2 +1 +4 +0 +0 +1 +2 +0 +2 +0 +0 +1 +1 +1 +0 +0 +4 +3 +4 +1 +0 +2 +1 +1 +1 +4 +0 +3 +0 +0 +0 +1 +0 +4 +1 +2 +3 +3 +0 +2 +0 +4 +4 +0 +0 +4 +1 +2 +0 +0 +2 +0 +0 +0 +3 +2 +0 +2 +0 +3 +0 +2 +0 +0 +1 +0 +3 +4 +2 +0 +0 +1 +0 +3 +0 +2 +1 +2 +3 +0 +1 +1 +4 +1 +0 +1 +0 +3 +1 +0 +2 +0 +2 +2 +3 +2 +2 +2 +0 +1 +2 +2 +0 +3 +4 +3 +1 +2 +0 +1 +4 +0 +1 +4 +1 +3 +2 +1 +4 +4 +0 +0 +2 +3 +2 +4 +0 +0 +4 +4 +1 +0 +0 +1 +0 +2 +1 +4 +0 +1 +1 +0 +0 +0 +0 +3 +1 +0 +3 +0 +0 +0 +0 +1 +0 +4 +0 +3 +1 +3 +3 +0 +0 +4 +4 +2 +3 +0 +0 +0 +1 +2 +1 +0 +0 +2 +0 +0 +0 +0 +0 +4 +4 +3 +0 +0 +4 +0 +0 +0 +0 +0 +2 +0 +3 +0 +1 +0 +0 +0 +2 +0 +3 +4 +2 +0 +0 +1 +0 +1 +1 +1 +0 +0 +0 +1 +0 +4 +0 +2 +3 +0 +4 +4 +4 +3 +1 +1 +1 +0 +0 +1 +0 +0 +1 +3 +4 +0 +1 +0 +0 +4 +1 +0 +4 +0 +0 +0 +0 +0 +2 +3 +0 +2 +2 +4 +0 +2 +0 +0 +0 +1 +0 +0 +0 +2 +4 +0 +0 +0 +0 +3 +3 +0 +2 +3 +0 +0 +0 +0 +4 +2 +3 +0 +0 +3 +0 +3 +3 +3 +3 +0 +0 +0 +3 +2 +0 +4 +0 +4 +3 +3 +0 +0 +0 +0 +1 +0 +1 +1 +3 +2 +0 +2 +0 +3 +4 +0 +4 +4 +2 +0 +4 +0 +4 +0 +3 +3 +0 +3 +0 +0 +2 +3 +0 +3 +0 +0 +2 +0 +4 +0 +3 +3 +1 +2 +2 +0 +0 +1 +2 +2 +0 +0 +3 +4 +3 +1 +1 +4 +0 +0 +3 +0 +0 +1 +3 +0 +2 +4 +0 +4 +0 +0 +0 +1 +0 +3 +2 +4 +0 +0 +0 +1 +3 +0 +0 +4 +3 +3 +4 +4 +1 +3 +3 +0 +2 +4 +4 +4 +0 +0 +0 +0 +0 +0 +2 +0 +2 +0 +1 +0 +0 +1 +0 +3 +4 +3 +1 +0 +0 +0 +2 +0 +1 +0 +0 +0 +0 +0 +0 +1 +0 +2 +0 +0 +1 +4 +1 +0 +0 +4 +0 +2 +0 +0 +0 +1 +2 +0 +0 +3 +0 +0 +1 +0 +2 +2 +1 +3 +0 +0 +0 +0 +3 +3 +0 +3 +3 +4 +0 +0 +4 +4 +1 +0 +0 +2 +0 +2 +3 +0 +0 +3 +2 +0 +0 +0 +0 +1 +3 +2 +4 +0 +2 +2 +0 +0 +2 +4 +0 +2 +0 +2 +0 +3 +2 +0 +4 +4 +4 +0 +3 +0 +2 +1 +0 +4 +1 +4 +4 +3 +1 +0 +4 +2 +0 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +4 +1 +0 +3 +0 +4 +4 +0 +0 +0 +1 +0 +3 +0 +2 +2 +2 +0 +0 +2 +0 +0 +4 +2 +0 +4 +0 +2 +3 +0 +3 +0 +4 +4 +1 +2 +0 +1 +0 +0 +3 +3 +4 +0 +0 +4 +4 +1 +2 +0 +3 +2 +4 +0 +0 +0 +2 +1 +3 +2 +4 +0 +0 +2 +0 +1 +0 +4 +2 +1 +1 +3 +2 +0 +2 +0 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +0 +0 +0 +4 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +2 +1 +0 +0 +1 +0 +0 +0 +0 +0 +4 +4 +0 +3 +4 +0 +3 +4 +1 +0 +2 +1 +4 +3 +0 +0 +0 +0 +0 +0 +0 +3 +2 +1 +0 +0 +2 +0 +0 +1 +2 +0 +0 +0 +0 +0 +2 +2 +3 +1 +0 +4 +0 +0 +0 +0 +3 +4 +3 +2 +2 +2 +3 +0 +0 +4 +1 +1 +0 +4 +0 +2 +1 +1 +4 +3 +0 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +0 +3 +0 +4 +1 +0 +0 +0 +0 +1 +1 +2 +3 +0 +0 +0 +4 +1 +0 +1 +0 +3 +0 +1 +2 +0 +2 +0 +0 +3 +1 +4 +1 +0 +1 +0 +0 +0 +4 +3 +3 +2 +1 +4 +1 +0 +0 +2 +3 +4 +0 +0 +0 +4 +4 +4 +0 +0 +0 +0 +3 +2 +2 +0 +1 +0 +0 +3 +0 +1 +1 +4 +0 +3 +4 +2 +2 +2 +4 +0 +3 +0 +4 +3 +3 +0 +0 +3 +0 +3 +1 +1 +0 +1 +1 +3 +2 +0 +0 +0 +0 +0 +1 +3 +0 +0 +3 +0 +0 +4 +0 +2 +4 +4 +0 +0 +0 +2 +4 +1 +2 +4 +2 +0 +4 +1 +2 +4 +2 +0 +0 +2 +2 +1 +0 +0 +0 +3 +0 +0 +0 +3 +1 +2 +1 +0 +0 +0 +2 +2 +0 +0 +3 +1 +1 +0 +0 +4 +0 +0 +2 +4 +1 +0 +0 +0 +0 +0 +0 +1 +4 +3 +4 +3 +3 +4 +0 +0 +1 +3 +4 +0 +2 +0 +1 +3 +0 +0 +4 +2 +0 +3 +1 +3 +4 +0 +1 +0 +3 +0 +1 +0 +0 +0 +0 +3 +1 +1 +2 +4 +0 +2 +1 +0 +0 +2 +1 +0 +0 +2 +4 +0 +3 +2 +4 +1 +0 +4 +0 +4 +0 +3 +3 +4 +3 +0 +0 +0 +3 +4 +2 +0 +0 +2 +0 +0 +2 +1 +0 +2 +0 +4 +0 +1 +0 +4 +0 +1 +0 +0 +1 +0 +0 +0 +0 +0 +3 +3 +4 +1 +2 +4 +3 +0 +2 +1 +3 +0 +4 +0 +2 +0 +1 +1 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +3 +0 +0 +0 +3 +0 +0 +2 +0 +4 +1 +3 +0 +1 +0 +3 +0 +1 +2 +4 +0 +0 +2 +0 +1 +3 +0 +0 +3 +0 +0 +0 +0 +1 +0 +0 +4 +0 +2 +0 +1 +0 +0 +2 +0 +3 +1 +4 +2 +3 +0 +2 +3 +0 +0 +3 +0 +2 +1 +2 +4 +2 +2 +1 +0 +4 +3 +2 +1 +2 +3 +3 +0 +3 +0 +0 +1 +4 +1 +0 +3 +0 +4 +1 +2 +1 +0 +3 +2 +2 +2 +2 +0 +0 +4 +4 +0 +1 +1 +0 +2 +1 +4 +3 +0 +3 +0 +4 +1 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +4 +2 +4 +0 +0 +0 +4 +0 +1 +0 +0 +0 +1 +0 +0 +4 +0 +1 +0 +3 +0 +1 +3 +0 +1 +4 +4 +2 +3 +0 +0 +3 +0 +1 +1 +3 +0 +0 +0 +1 +0 +3 +0 +4 +0 +4 +1 +0 +4 +0 +2 +3 +1 +3 +0 +0 +3 +0 +2 +0 +0 +2 +0 +0 +3 +3 +0 +3 +3 +0 +0 +0 +4 +2 +3 +1 +2 +0 +2 +3 +2 +3 +4 +0 +0 +2 +0 +2 +4 +0 +0 +3 +3 +1 +2 +1 +1 +4 +2 +0 +1 +0 +4 +4 +0 +0 +2 +0 +3 +2 +0 +0 +2 +4 +0 +0 +0 +0 +0 +4 +0 +4 +3 +4 +0 +0 +2 +0 +2 +0 +0 +1 +2 +3 +4 +1 +0 +0 +0 +0 +1 +0 +4 +0 +0 +0 +0 +0 +0 +2 +3 +0 +1 +0 +0 +0 +1 +4 +2 +2 +0 +3 +0 +3 +4 +3 +0 +2 +0 +4 +0 +0 +2 +2 +4 +0 +0 +0 +1 +2 +0 +0 +1 +1 +4 +0 +3 +2 +4 +4 +0 +4 +4 +0 +0 +0 +2 +0 +2 +0 +0 +3 +2 +0 +0 +2 +0 +3 +0 +1 +3 +4 +3 +0 +4 +0 +0 +2 +3 +0 +3 +0 +3 +0 +0 +0 +2 +4 +0 +1 +3 +2 +4 +0 +0 +3 +0 +0 +0 +4 +2 +0 +3 +1 +0 +0 +0 +0 +0 +1 +0 +2 +0 +3 +0 +0 +1 +0 +1 +1 +0 +2 +0 +0 +4 +1 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +3 +4 +2 +3 +2 +0 +4 +2 +1 +3 +0 +1 +0 +3 +0 +0 +4 +2 +1 +3 +4 +0 +0 +0 +0 +1 +1 +0 +1 +0 +0 +0 +0 +3 +0 +0 +2 +0 +0 +1 +0 +0 +0 +4 +3 +0 +0 +0 +0 +0 +2 +1 +2 +0 +0 +2 +0 +3 +2 +4 +2 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +4 +0 +1 +4 +4 +4 +3 +2 +0 +3 +1 +0 +2 +0 +0 +3 +1 +4 +2 +3 +1 +4 +1 +1 +0 +0 +0 +2 +0 +0 +0 +0 +2 +0 +1 +3 +1 +0 +4 +4 +0 +2 +0 +0 +0 +0 +2 +3 +2 +0 +1 +3 +0 +0 +0 +2 +2 +2 +0 +0 +0 +4 +0 +0 +1 +1 +1 +2 +0 +3 +0 +0 +0 +0 +4 +4 +0 +0 +0 +0 +2 +0 +2 +0 +2 +0 +0 +3 +0 +0 +0 +2 +0 +0 +0 +2 +3 +0 +0 +2 +0 +3 +2 +0 +0 +0 +0 +1 +0 +3 +2 +0 +0 +0 +3 +0 +4 +1 +0 +3 +4 +0 +2 +4 +1 +2 +0 +0 +3 +1 +2 +0 +0 +2 +0 +4 +0 +0 +0 +0 +0 +2 +1 +1 +0 +0 +3 +3 +1 +4 +0 +2 +0 +2 +0 +3 +1 +1 +3 +3 +2 +0 +4 +0 +0 +0 +0 +0 +1 +0 +0 +4 +0 +0 +3 +0 +0 +0 +2 +4 +1 +2 +2 +0 +0 +0 +1 +0 +2 +0 +2 +2 +3 +4 +0 +0 +2 +1 +0 +2 +2 +1 +0 +1 +3 +0 +0 +3 +0 +0 +0 +3 +0 +3 +0 +1 +0 +0 +1 +3 +0 +4 +4 +0 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +3 +0 +3 +0 +1 +2 +1 +0 +1 +2 +0 +3 +0 +0 +1 +0 +4 +1 +0 +1 +4 +4 +0 +0 +2 +1 +3 +3 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +0 +3 +3 +0 +2 +0 +0 +0 +0 +0 +4 +0 +0 +3 +3 +1 +0 +0 +2 +4 +4 +0 +4 +3 +0 +4 +2 +1 +0 +0 +0 +0 +0 +2 +0 +3 +0 +4 +0 +0 +0 +3 +0 +2 +3 +0 +0 +4 +1 +0 +1 +1 +2 +3 +3 +1 +4 +0 +4 +0 +1 +0 +3 +3 +2 +1 +4 +1 +0 +0 +0 +0 +3 +4 +3 +4 +0 +4 +0 +2 +2 +0 +4 +3 +0 +4 +0 +4 +1 +1 +4 +0 +4 +0 +3 +2 +4 +2 +1 +3 +4 +1 +0 +0 +2 +4 +0 +4 +2 +1 +4 +4 +4 +3 +3 +1 +0 +0 +0 +0 +4 +3 +3 +2 +0 +0 +4 +4 +0 +0 +0 +0 +0 +0 +1 +3 +1 +2 +0 +3 +0 +0 +0 +3 +1 +0 +3 +0 +0 +4 +0 +4 +4 +3 +2 +4 +3 +2 +4 +3 +3 +2 +4 +2 +1 +0 +2 +2 +0 +0 +0 +3 +3 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +3 +0 +0 +0 +4 +3 +3 +2 +4 +4 +2 +0 +0 +0 +0 +4 +3 +0 +0 +0 +0 +0 +4 +0 +0 +1 +0 +2 +0 +4 +0 +0 +4 +0 +1 +0 +0 +1 +4 +4 +1 +1 +1 +0 +4 +1 +0 +0 +2 +0 +0 +0 +4 +0 +2 +1 +0 +0 +0 +0 +0 +1 +2 +2 +4 +0 +0 +0 +1 +2 +4 +0 +0 +0 +2 +0 +4 +2 +0 +1 +0 +0 +1 +0 +1 +0 +4 +0 +3 +0 +0 +4 +3 +4 +4 +2 +0 +2 +0 +0 +3 +1 +2 +0 +4 +0 +0 +4 +3 +3 +3 +3 +3 +3 +4 +4 +4 +3 +0 +1 +0 +3 +0 +0 +0 +0 +1 +3 +0 +3 +2 +3 +1 +3 +4 +1 +4 +1 +1 +0 +3 +3 +1 +3 +0 +2 +0 +0 +1 +2 +1 +2 +0 +0 +4 +0 +0 +2 +2 +0 +0 +0 +4 +4 +2 +3 +4 +1 +2 +0 +0 +0 +2 +0 +3 +0 +3 +0 +0 +1 +0 +0 +3 +0 +0 +0 +3 +4 +0 +2 +4 +1 +3 +0 +0 +3 +0 +4 +4 +3 +3 +4 +4 +3 +0 +0 +2 +0 +0 +4 +2 +3 +0 +0 +2 +1 +3 +0 +0 +0 +2 +0 +0 +2 +0 +1 +2 +1 +1 +1 +1 +0 +0 +4 +0 +0 +0 +0 +0 +0 +3 +3 +3 +3 +0 +0 +0 +2 +0 +2 +0 +0 +4 +0 +0 +0 +1 +4 +4 +3 +0 +0 +2 +3 +4 +0 +0 +0 +2 +1 +0 +0 +4 +4 +2 +4 +0 +4 +4 +2 +2 +3 +0 +2 +0 +1 +1 +4 +4 +0 +2 +4 +3 +0 +0 +4 +0 +0 +2 +2 +4 +0 +0 +2 +3 +2 +4 +3 +1 +0 +2 +3 +1 +0 +0 +0 +1 +0 +0 +1 +0 +2 +0 +4 +0 +0 +4 +0 +2 +2 +1 +0 +2 +2 +2 +0 +3 +1 +0 +4 +2 +1 +2 +2 +0 +4 +0 +0 +0 +4 +4 +0 +4 +3 +0 +1 +0 +2 +1 +4 +4 +2 +1 +2 +3 +2 +0 +0 +1 +3 +0 +3 +1 +0 +4 +0 +1 +2 +0 +3 +2 +0 +0 +3 +4 +2 +4 +0 +2 +1 +1 +2 +0 +0 +0 +3 +2 +0 +0 +3 +2 +0 +3 +0 +2 +2 +0 +0 +0 +0 +4 +0 +3 +2 +0 +0 +0 +3 +0 +0 +0 +0 +2 +0 +0 +2 +4 +4 +1 +2 +0 +1 +0 +4 +2 +2 +2 +0 +2 +0 +1 +1 +0 +0 +0 +2 +0 +3 +2 +1 +1 +0 +0 +3 +1 +1 +2 +0 +3 +3 +0 +0 +4 +0 +2 +0 +3 +0 +0 +3 +0 +1 +2 +3 +1 +2 +1 +1 +0 +4 +4 +0 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +1 +0 +1 +1 +2 +4 +0 +2 +2 +0 +4 +0 +3 +2 +0 +0 +2 +0 +3 +0 +3 +3 +0 +4 +3 +0 +0 +0 +4 +2 +0 +4 +0 +0 +0 +4 +0 +1 +0 +0 +3 +1 +1 +4 +3 +4 +0 +0 +0 +4 +4 +4 +1 +1 +0 +0 +0 +2 +3 +1 +3 +0 +4 +2 +1 +3 +1 +0 +3 +0 +1 +4 +3 +2 +0 +0 +0 +3 +1 +0 +0 +0 +1 +0 +4 +1 +0 +0 +0 +0 +2 +0 +2 +0 +2 +4 +4 +0 +3 +4 +1 +1 +0 +2 +0 +2 +1 +0 +2 +0 +4 +0 +4 +4 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +3 +0 +0 +0 +0 +0 +0 +0 +3 +0 +4 +2 +0 +0 +4 +2 +0 +0 +0 +1 +1 +0 +1 +3 +2 +0 +0 +0 +1 +3 +3 +0 +4 +3 +1 +2 +1 +3 +0 +3 +0 +0 +4 +4 +1 +0 +0 +2 +0 +4 +4 +0 +0 +2 +0 +4 +0 +4 +0 +1 +3 +1 +0 +3 +1 +1 +3 +2 +0 +0 +0 +3 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +3 +0 +0 +1 +1 +0 +0 +0 +3 +3 +0 +1 +2 +0 +0 +0 +1 +3 +0 +0 +0 +0 +0 +3 +4 +4 +0 +2 +0 +0 +0 +3 +2 +0 +3 +3 +0 +0 +0 +0 +4 +1 +3 +3 +4 +3 +1 +1 +0 +0 +4 +3 +0 +1 +2 +1 +0 +4 +3 +1 +1 +1 +2 +2 +3 +0 +2 +2 +0 +1 +0 +0 +3 +4 +1 +1 +2 +0 +0 +2 +2 +2 +3 +2 +2 +3 +0 +1 +0 +0 +3 +1 +0 +0 +0 +3 +2 +0 +1 +3 +2 +2 +0 +0 +0 +0 +3 +4 +0 +3 +0 +1 +0 +1 +1 +0 +0 +1 +0 +0 +4 +3 +1 +0 +0 +2 +3 +1 +0 +0 +4 +4 +0 +2 +0 +1 +3 +4 +2 +0 +0 +0 +0 +0 +2 +0 +1 +3 +0 +0 +2 +2 +0 +0 +4 +0 +0 +0 +4 +4 +2 +0 +1 +1 +0 +0 +0 +4 +4 +0 +3 +0 +0 +0 +4 +2 +2 +1 +4 +3 +3 +3 +1 +0 +0 +4 +0 +4 +0 +4 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +0 +2 +0 +1 +0 +1 +0 +4 +4 +0 +1 +4 +0 +2 +4 +2 +0 +0 +0 +0 +0 +3 +3 +0 +2 +2 +0 +4 +1 +0 +0 +0 +0 +2 +0 +4 +1 +3 +0 +2 +0 +4 +1 +1 +3 +2 +1 +0 +2 +0 +4 +4 +0 +0 +4 +2 +2 +4 +0 +1 +2 +3 +4 +3 +0 +4 +2 +0 +0 +3 +3 +0 +4 +4 +2 +0 +0 +1 +0 +0 +4 +2 +0 +0 +4 +2 +4 +0 +0 +3 +0 +0 +0 +1 +4 +1 +0 +2 +0 +4 +1 +4 +2 +2 +1 +0 +0 +2 +3 +2 +1 +4 +3 +2 +0 +4 +2 +0 +4 +0 +4 +3 +2 +0 +1 +2 +0 +1 +0 +1 +4 +0 +0 +0 +2 +1 +0 +1 +0 +4 +2 +4 +1 +0 +0 +2 +4 +0 +0 +0 +1 +3 +3 +0 +0 +0 +0 +3 +0 +2 +3 +4 +1 +4 +2 +4 +4 +1 +0 +3 +0 +3 +1 +0 +1 +0 +2 +4 +0 +1 +3 +3 +0 +0 +3 +0 +1 +3 +0 +0 +0 +0 +2 +1 +0 +3 +0 +3 +3 +0 +2 +0 +2 +2 +1 +1 +4 +0 +0 +0 +0 +1 +3 +1 +4 +3 +3 +1 +0 +0 +1 +0 +1 +2 +0 +4 +0 +0 +4 +0 +0 +0 +2 +3 +2 +0 +3 +0 +0 +0 +3 +1 +0 +0 +2 +0 +4 +3 +0 +0 +0 +3 +2 +4 +3 +3 +2 +0 +0 +0 +0 +0 +4 +2 +4 +2 +0 +0 +4 +1 +3 +0 +0 +1 +0 +3 +4 +3 +3 +0 +4 +3 +2 +3 +1 +0 +0 +2 +2 +1 +0 +0 +2 +0 +0 +0 +0 +0 +3 +1 +1 +0 +0 +1 +0 +2 +0 +3 +4 +0 +2 +0 +0 +1 +0 +0 +0 +1 +2 +3 +3 +4 +4 +2 +3 +2 +0 +2 +0 +2 +1 +4 +0 +0 +3 +0 +4 +3 +0 +4 +0 +0 +4 +0 +3 +0 +2 +1 +2 +3 +0 +0 +0 +2 +3 +0 +0 +2 +2 +0 +0 +0 +0 +0 +3 +1 +3 +0 +4 +1 +0 +1 +0 +4 +3 +1 +0 +0 +2 +3 +0 +3 +2 +1 +0 +0 +0 +3 +0 +3 +0 +2 +0 +4 +0 +0 +4 +0 +0 +0 +0 +1 +0 +4 +2 +1 +1 +4 +0 +2 +0 +4 +1 +0 +4 +4 +0 +0 +0 +0 +3 +0 +0 +2 +4 +2 +2 +1 +0 +3 +4 +3 +4 +0 +0 +1 +0 +3 +0 +0 +3 +4 +1 +1 +4 +0 +2 +2 +0 +0 +0 +2 +0 +1 +0 +2 +0 +0 +1 +4 +0 +4 +3 +2 +0 +0 +4 +0 +3 +0 +2 +1 +3 +2 +0 +3 +1 +0 +0 +0 +3 +1 +0 +0 +3 +3 +4 +4 +0 +3 +0 +1 +3 +0 +2 +2 +0 +1 +0 +0 +0 +0 +0 +0 +3 +0 +4 +0 +0 +0 +4 +4 +0 +2 +0 +1 +4 +3 +4 +0 +0 +0 +4 +0 +4 +0 +0 +3 +0 +0 +2 +4 +4 +2 +1 +0 +4 +2 +3 +0 +0 +3 +0 +4 +0 +0 +4 +0 +2 +1 +0 +0 +2 +0 +0 +1 +2 +1 +1 +1 +0 +2 +0 +1 +2 +0 +0 +0 +2 +0 +3 +1 +0 +1 +1 +4 +0 +0 +0 +0 +3 +2 +0 +0 +0 +0 +2 +4 +0 +1 +2 +0 +3 +2 +0 +2 +2 +0 +2 +3 +1 +0 +0 +4 +0 +2 +4 +0 +1 +4 +0 +0 +0 +3 +0 +1 +0 +4 +0 +4 +4 +0 +1 +0 +4 +2 +0 +0 +1 +2 +1 +3 +4 +0 +2 +3 +3 +4 +0 +3 +0 +0 +1 +0 +1 +1 +4 +2 +2 +2 +1 +4 +0 +2 +0 +0 +0 +0 +2 +0 +4 +0 +2 +0 +0 +4 +0 +4 +0 +1 +2 +0 +2 +1 +4 +2 +3 +0 +0 +2 +0 +1 +0 +0 +0 +2 +3 +2 +0 +0 +0 +0 +3 +3 +0 +4 +0 +4 +0 +0 +1 +1 +3 +3 +0 +3 +3 +0 +0 +3 +2 +0 +3 +0 +0 +1 +0 +2 +0 +3 +4 +2 +2 +2 +2 +0 +4 +4 +0 +0 +3 +1 +2 +4 +4 +3 +4 +0 +0 +3 +0 +0 +0 +0 +0 +1 +2 +4 +3 +0 +4 +0 +4 +4 +1 +3 +0 +0 +0 +4 +2 +4 +1 +2 +0 +0 +0 +3 +1 +2 +0 +4 +0 +0 +2 +0 +0 +0 +0 +0 +0 +3 +1 +0 +0 +0 +0 +0 +3 +3 +0 +1 +2 +2 +3 +0 +3 +1 +2 +4 +2 +3 +4 +4 +2 +0 +1 +0 +0 +2 +0 +0 +1 +4 +2 +0 +1 +0 +4 +4 +3 +1 +0 +0 +2 +0 +1 +0 +0 +3 +4 +3 +0 +0 +0 +1 +3 +4 +2 +3 +3 +0 +4 +4 +2 +0 +2 +0 +0 +4 +3 +0 +4 +1 +2 +0 +0 +3 +2 +2 +1 +3 +3 +3 +4 +0 +3 +3 +4 +0 +2 +0 +0 +0 +4 +0 +0 +1 +0 +0 +0 +0 +2 +3 +0 +2 +0 +0 +0 +0 +4 +0 +0 +0 +4 +4 +0 +3 +3 +0 +2 +0 +0 +4 +0 +4 +0 +2 +0 +2 +4 +0 +1 +4 +1 +2 +0 +0 +4 +1 +0 +1 +4 +0 +0 +0 +3 +1 +3 +0 +0 +3 +0 +1 +0 +2 +0 +3 +0 +1 +4 +4 +0 +1 +0 +0 +0 +0 +0 +3 +2 +1 +0 +0 +2 +2 +0 +0 +0 +0 +2 +3 +0 +0 +2 +1 +0 +2 +0 +0 +3 +0 +0 +3 +2 +4 +0 +4 +1 +1 +4 +3 +0 +0 +3 +0 +4 +3 +0 +0 +1 +0 +2 +0 +3 +4 +4 +2 +0 +0 +0 +3 +0 +4 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +0 +1 +0 +0 +3 +1 +0 +4 +0 +0 +4 +0 +0 +0 +0 +0 +4 +0 +3 +2 +0 +0 +0 +0 +2 +0 +4 +0 +0 +0 +2 +3 +4 +0 +1 +4 +0 +0 +0 +0 +0 +3 +2 +2 +0 +0 +1 +3 +1 +2 +4 +4 +0 +0 +2 +1 +2 +2 +0 +3 +4 +2 +4 +4 +0 +0 +0 +4 +2 +0 +2 +4 +0 +0 +0 +0 +1 +2 +2 +0 +3 +3 +0 +4 +2 +0 +3 +0 +3 +0 +3 +4 +3 +1 +2 +2 +0 +2 +2 +0 +0 +0 +1 +1 +2 +0 +2 +1 +0 +1 +4 +4 +1 +1 +4 +0 +3 +3 +0 +0 +2 +2 +2 +4 +0 +4 +3 +3 +3 +3 +0 +0 +0 +4 +0 +2 +0 +2 +3 +0 +1 +0 +0 +0 +0 +0 +3 +0 +1 +2 +0 +0 +3 +3 +3 +0 +0 +3 +1 +2 +0 +0 +2 +0 +1 +0 +4 +0 +2 +3 +0 +4 +0 +4 +4 +3 +0 +0 +1 +0 +0 +4 +3 +0 +1 +4 +4 +4 +1 +0 +1 +0 +0 +4 +1 +1 +4 +3 +2 +0 +2 +0 +1 +2 +3 +4 +4 +1 +0 +1 +4 +3 +0 +4 +3 +0 +3 +0 +2 +0 +0 +4 +0 +0 +2 +3 +3 +3 +1 +4 +4 +2 +3 +3 +0 +0 +1 +2 +0 +0 +1 +1 +0 +4 +0 +2 +0 +4 +1 +3 +1 +1 +0 +0 +0 +0 +0 +0 +0 +1 +4 +0 +2 +1 +4 +0 +0 +3 +0 +1 +2 +1 +0 +4 +4 +0 +2 +0 +1 +2 +1 +2 +1 +2 +0 +1 +1 +4 +4 +0 +1 +1 +0 +2 +3 +0 +4 +2 +3 +1 +3 +1 +2 +1 +0 +2 +1 +2 +2 +2 +3 +1 +0 +0 +0 +3 +3 +0 +3 +0 +0 +3 +0 +0 +1 +0 +0 +4 +4 +4 +0 +2 +1 +0 +0 +2 +4 +3 +3 +2 +2 +0 +0 +4 +1 +1 +0 +1 +0 +2 +0 +0 +1 +0 +3 +3 +0 +0 +0 +1 +0 +2 +0 +0 +0 +0 +0 +0 +4 +4 +0 +3 +0 +0 +0 +1 +0 +3 +0 +0 +4 +0 +3 +0 +1 +3 +0 +1 +3 +1 +4 +2 +0 +3 +2 +1 +1 +0 +0 +0 +0 +2 +2 +0 +0 +4 +4 +1 +0 +0 +2 +0 +4 +0 +3 +4 +2 +1 +1 +4 +4 +0 +0 +0 +0 +4 +1 +3 +0 +0 +3 +3 +3 +3 +1 +4 +3 +0 +3 +0 +2 +2 +1 +3 +0 +0 +4 +0 +1 +1 +3 +0 +0 +1 +2 +4 +2 +1 +0 +0 +0 +0 +4 +0 +4 +2 +3 +0 +0 +2 +0 +3 +4 +4 +2 +0 +0 +1 +0 +2 +1 +4 +4 +1 +0 +4 +0 +0 +0 +0 +0 +2 +2 +2 +3 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +1 +3 +3 +2 +0 +0 +0 +1 +1 +1 +4 +0 +4 +4 +0 +3 +3 +4 +0 +0 +0 +1 +3 +2 +0 +0 +0 +2 +4 +0 +3 +0 +0 +0 +0 +0 +0 +1 +0 +4 +1 +3 +4 +2 +0 +0 +3 +1 +1 +0 +3 +2 +3 +0 +3 +1 +1 +4 +3 +0 +0 +0 +3 +4 +4 +3 +4 +4 +1 +1 +2 +3 +2 +2 +2 +0 +0 +0 +2 +3 +4 +3 +2 +1 +3 +2 +1 +3 +1 +0 +1 +0 +1 +3 +4 +2 +3 +3 +1 +0 +4 +0 +1 +1 +2 +4 +3 +4 +0 +1 +3 +3 +0 +4 +3 +3 +0 +2 +4 +2 +4 +0 +0 +0 +4 +4 +1 +1 +0 +3 +0 +0 +0 +3 +3 +0 +0 +3 +0 +0 +1 +0 +0 +0 +4 +0 +0 +0 +4 +4 +3 +0 +3 +0 +0 +0 +3 +3 +0 +0 +0 +4 +1 +2 +1 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +2 +0 +1 +3 +0 +0 +1 +0 +2 +4 +0 +0 +3 +1 +3 +0 +0 +3 +1 +0 +3 +4 +0 +4 +0 +0 +0 +3 +1 +2 +0 +0 +0 +0 +1 +1 +2 +1 +0 +0 +2 +4 +0 +4 +1 +4 +1 +2 +4 +2 +4 +0 +1 +0 +0 +0 +4 +0 +1 +0 +0 +1 +0 +0 +2 +3 +0 +0 +2 +0 +3 +4 +0 +1 +4 +0 +0 +0 +0 +0 +1 +0 +3 +0 +3 +0 +2 +4 +2 +0 +3 +0 +1 +2 +1 +3 +4 +1 +3 +0 +0 +0 +4 +0 +4 +4 +0 +3 +0 +3 +2 +3 +4 +0 +0 +0 +3 +0 +1 +4 +1 +1 +0 +0 +4 +0 +0 +0 +0 +2 +1 +0 +0 +0 +0 +1 +2 +0 +1 +1 +0 +0 +1 +2 +0 +4 +0 +1 +3 +0 +3 +4 +2 +0 +0 +1 +3 +4 +0 +0 +1 +0 +1 +2 +0 +0 +4 +0 +0 +1 +4 +4 +2 +3 +0 +0 +0 +2 +0 +3 +1 +0 +4 +1 +0 +0 +3 +1 +0 +0 +3 +1 +0 +0 +2 +3 +4 +4 +2 +1 +1 +0 +4 +2 +0 +0 +0 +4 +0 +4 +3 +4 +0 +0 +1 +2 +4 +1 +0 +1 +2 +0 +0 +0 +0 +1 +0 +2 +4 +0 +2 +0 +0 +4 +4 +2 +0 +0 +1 +0 +0 +4 +3 +0 +1 +0 +0 +0 +2 +4 +0 +3 +0 +0 +3 +1 +3 +3 +0 +0 +1 +0 +0 +0 +2 +3 +0 +0 +1 +0 +4 +3 +0 +0 +4 +1 +4 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +1 +1 +0 +1 +2 +4 +0 +0 +0 +0 +0 +0 +1 +0 +2 +1 +0 +0 +0 +3 +0 +3 +0 +0 +0 +0 +0 +4 +0 +3 +1 +0 +0 +4 +0 +1 +0 +4 +0 +4 +0 +0 +0 +0 +0 +3 +1 +0 +3 +0 +1 +0 +0 +2 +4 +0 +4 +2 +4 +4 +1 +3 +2 +3 +0 +4 +3 +1 +2 +3 +0 +1 +1 +3 +3 +1 +0 +0 +1 +4 +0 +2 +0 +0 +0 +0 +1 +4 +0 +0 +4 +4 +2 +4 +0 +0 +2 +0 +0 +0 +0 +3 +2 +2 +2 +0 +4 +2 +3 +1 +2 +0 +3 +3 +2 +0 +1 +0 +0 +0 +3 +2 +3 +0 +2 +3 +0 +0 +3 +0 +0 +4 +1 +0 +0 +3 +2 +0 +1 +1 +3 +4 +0 +1 +0 +0 +4 +0 +2 +0 +4 +0 +0 +1 +0 +2 +3 +2 +0 +0 +0 +1 +2 +1 +2 +0 +2 +3 +1 +4 +4 +1 +3 +3 +2 +3 +3 +0 +0 +3 +1 +1 +1 +0 +0 +4 +1 +4 +3 +1 +0 +0 +1 +0 +0 +0 +3 +0 +0 +4 +4 +0 +2 +3 +0 +4 +4 +2 +3 +0 +0 +0 +4 +4 +0 +0 +2 +0 +0 +0 +4 +2 +2 +0 +3 +4 +1 +2 +0 +4 +2 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +3 +3 +0 +2 +0 +2 +0 +2 +0 +0 +0 +0 +0 +1 +0 +1 +0 +4 +0 +2 +3 +1 +1 +4 +4 +0 +0 +0 +0 +2 +3 +0 +0 +2 +2 +0 +4 +0 +0 +2 +0 +2 +3 +1 +0 +4 +2 +4 +0 +1 +0 +1 +2 +4 +1 +1 +2 +0 +0 +0 +2 +0 +0 +1 +3 +0 +0 +4 +0 +0 +4 +0 +1 +0 +4 +1 +0 +0 +2 +2 +0 +2 +0 +0 +0 +2 +0 +0 +3 +2 +0 +0 +2 +4 +2 +0 +0 +1 +0 +3 +0 +2 +3 +0 +1 +0 +3 +4 +2 +0 +2 +0 +3 +0 +2 +4 +1 +0 +4 +3 +0 +0 +2 +0 +0 +0 +3 +2 +0 +1 +4 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +1 +4 +2 +4 +0 +1 +4 +0 +4 +0 +0 +0 +0 +0 +0 +4 +0 +0 +0 +4 +3 +0 +1 +0 +3 +0 +2 +3 +4 +3 +0 +3 +0 +2 +0 +0 +2 +0 +4 +2 +0 +0 +1 +3 +3 +1 +0 +0 +0 +0 +4 +0 +2 +3 +0 +0 +0 +2 +0 +0 +0 +3 +0 +1 +0 +0 +1 +0 +4 +0 +0 +3 +2 +0 +0 +0 +0 +2 +2 +1 +0 +0 +3 +1 +0 +0 +0 +4 +2 +0 +4 +0 +3 +2 +1 +0 +4 +1 +3 +1 +0 +0 +2 +0 +2 +0 +0 +2 +3 +3 +1 +1 +1 +0 +0 +2 +3 +1 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +3 +4 +4 +1 +4 +0 +2 +0 +4 +0 +0 +2 +2 +1 +2 +0 +3 +3 +0 +1 +0 +1 +2 +0 +4 +3 +0 +0 +2 +0 +0 +2 +1 +0 +0 +2 +0 +2 +1 +1 +0 +3 +0 +0 +0 +4 +0 +0 +0 +0 +3 +0 +0 +3 +0 +4 +0 +2 +2 +0 +0 +4 +1 +0 +4 +3 +0 +0 +1 +4 +3 +0 +2 +1 +0 +0 +1 +2 +0 +1 +1 +0 +2 +3 +0 +3 +4 +1 +3 +0 +0 +1 +0 +3 +4 +3 +0 +1 +3 +0 +3 +0 +0 +2 +0 +0 +3 +0 +4 +0 +0 +1 +2 +4 +4 +4 +0 +0 +1 +3 +2 +0 +1 +1 +2 +2 +4 +0 +0 +3 +0 +3 +0 +0 +3 +4 +1 +1 +0 +0 +2 +0 +0 +4 +2 +3 +0 +3 +2 +0 +2 +0 +1 +0 +1 +0 +0 +3 +1 +2 +3 +0 +0 +1 +2 +1 +0 +4 +0 +4 +0 +3 +2 +1 +4 +0 +3 +1 +2 +0 +0 +1 +0 +4 +0 +4 +1 +4 +4 +2 +2 +4 +3 +0 +2 +3 +3 +0 +1 +2 +4 +3 +0 +3 +0 +2 +4 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +3 +3 +1 +0 +0 +0 +0 +0 +1 +2 +0 +0 +4 +2 +2 +1 +4 +1 +0 +1 +2 +2 +1 +1 +3 +3 +4 +1 +1 +0 +4 +0 +0 +3 +0 +4 +3 +2 +0 +4 +4 +0 +3 +0 +0 +0 +1 +1 +0 +0 +4 +0 +0 +1 +0 +0 +0 +0 +1 +3 +0 +0 +0 +0 +0 +0 +1 +4 +4 +2 +4 +2 +0 +0 +0 +0 +2 +0 +0 +2 +0 +0 +2 +4 +1 +2 +2 +3 +3 +0 +1 +4 +4 +1 +3 +3 +1 +0 +2 +2 +4 +2 +0 +4 +0 +2 +2 +0 +0 +1 +1 +1 +2 +0 +3 +0 +0 +2 +0 +0 +0 +0 +1 +0 +1 +2 +1 +0 +0 +2 +4 +1 +0 +4 +1 +0 +0 +0 +0 +0 +1 +0 +2 +0 +0 +0 +4 +3 +1 +0 +0 +3 +4 +2 +2 +0 +2 +1 +0 +0 +0 +1 +2 +2 +2 +1 +2 +0 +4 +0 +0 +0 +0 +0 +4 +2 +0 +4 +3 +0 +0 +3 +0 +4 +2 +4 +0 +1 +0 +0 +0 +3 +2 +1 +0 +3 +4 +4 +0 +0 +0 +4 +4 +0 +0 +1 +0 +0 +2 +1 +1 +3 +1 +1 +0 +1 +0 +1 +1 +0 +2 +2 +0 +0 +0 +4 +0 +0 +0 +0 +4 +2 +0 +4 +0 +3 +0 +2 +0 +0 +3 +3 +4 +0 +0 +2 +0 +0 +1 +0 +1 +1 +4 +0 +0 +0 +0 +3 +0 +3 +4 +2 +3 +1 +4 +0 +2 +1 +0 +0 +1 +0 +1 +0 +2 +2 +2 +2 +3 +0 +3 +3 +0 +3 +0 +0 +2 +0 +0 +0 +3 +2 +2 +0 +0 +3 +0 +2 +0 +2 +2 +0 +1 +1 +3 +0 +2 +0 +4 +2 +1 +0 +0 +3 +3 +2 +0 +1 +1 +1 +0 +4 +4 +2 +3 +3 +0 +0 +3 +3 +0 +4 +4 +1 +1 +1 +2 +0 +1 +1 +0 +0 +0 +2 +0 +1 +2 +1 +0 +0 +2 +0 +0 +2 +3 +1 +3 +1 +4 +0 +4 +3 +3 +4 +4 +0 +2 +2 +0 +0 +3 +3 +0 +3 +2 +0 +3 +0 +3 +3 +4 +0 +0 +3 +4 +0 +3 +3 +4 +2 +1 +3 +3 +2 +0 +4 +1 +1 +0 +4 +3 +0 +0 +0 +0 +2 +4 +1 +1 +1 +4 +0 +0 +1 +1 +0 +4 +0 +3 +1 +2 +4 +4 +4 +2 +4 +4 +3 +0 +0 +3 +0 +0 +2 +0 +0 +0 +1 +0 +3 +0 +1 +1 +0 +3 +2 +0 +3 +0 +0 +2 +0 +3 +1 +3 +0 +0 +4 +0 +2 +3 +4 +0 +0 +2 +0 +4 +3 +1 +4 +0 +2 +1 +0 +4 +0 +1 +3 +0 +0 +0 +1 +0 +2 +0 +2 +0 +3 +0 +1 +0 +0 +4 +0 +2 +0 +0 +0 +0 +0 +3 +0 +3 +0 +2 +0 +0 +0 +0 +2 +4 +0 +0 +3 +4 +3 +0 +0 +2 +0 +1 +0 +2 +0 +3 +2 +2 +3 +3 +4 +0 +4 +0 +3 +2 +1 +0 +4 +0 +0 +1 +2 +0 +0 +3 +0 +0 +4 +1 +1 +0 +0 +3 +1 +0 +1 +1 +4 +0 +0 +0 +0 +4 +1 +0 +2 +0 +0 +0 +4 +0 +0 +4 +4 +0 +1 +0 +2 +2 +4 +0 +2 +3 +3 +1 +0 +0 +4 +0 +1 +0 +0 +0 +0 +0 +1 +3 +1 +4 +0 +0 +1 +0 +0 +2 +1 +0 +0 +3 +4 +1 +0 +0 +3 +0 +2 +3 +4 +4 +0 +2 +0 +3 +0 +0 +3 +2 +0 +3 +0 +1 +3 +4 +0 +1 +4 +0 +0 +3 +2 +4 +0 +3 +0 +4 +3 +1 +2 +1 +2 +0 +0 +2 +0 +4 +3 +0 +2 +4 +0 +4 +0 +2 +0 +2 +0 +0 +4 +4 +2 +0 +2 +3 +0 +0 +0 +1 +1 +2 +0 +0 +3 +0 +0 +4 +0 +0 +0 +3 +0 +2 +4 +4 +0 +0 +0 +0 +0 +0 +2 +4 +4 +4 +4 +0 +3 +3 +0 +3 +1 +4 +0 +3 +0 +4 +0 +0 +2 +0 +3 +0 +0 +2 +0 +0 +2 +0 +3 +4 +0 +4 +0 +0 +0 +3 +3 +4 +2 +0 +1 +2 +4 +1 +1 +3 +0 +0 +3 +2 +3 +3 +1 +4 +1 +2 +2 +1 +2 +4 +0 +0 +3 +4 +4 +4 +1 +0 +0 +3 +0 +0 +1 +0 +3 +0 +0 +0 +3 +3 +2 +4 +0 +0 +4 +0 +0 +0 +4 +3 +4 +4 +0 +4 +0 +0 +1 +0 +2 +0 +1 +1 +0 +4 +4 +0 +2 +0 +3 +0 +2 +2 +0 +0 +0 +0 +0 +4 +1 +0 +0 +0 +4 +0 +4 +0 +0 +0 +0 +0 +0 +0 +2 +3 +1 +0 +3 +3 +0 +0 +3 +4 +0 +2 +0 +3 +3 +0 +1 +1 +2 +4 +0 +0 +4 +0 +3 +0 +1 +3 +0 +1 +0 +0 +0 +0 +4 +1 +0 +0 +0 +4 +3 +1 +0 +0 +3 +2 +4 +1 +3 +3 +4 +0 +4 +0 +4 +0 +4 +0 +0 +4 +2 +0 +2 +2 +1 +2 +1 +3 +0 +4 +0 +4 +0 +1 +0 +4 +0 +0 +4 +2 +0 +1 +1 +0 +3 +4 +2 +3 +3 +0 +3 +1 +3 +0 +2 +0 +0 +2 +1 +0 +0 +3 +3 +0 +1 +2 +0 +0 +3 +3 +0 +2 +2 +0 +1 +0 +3 +0 +4 +0 +2 +0 +4 +2 +2 +0 +0 +3 +0 +1 +3 +0 +1 +0 +4 +3 +0 +0 +3 +0 +4 +1 +4 +0 +2 +1 +0 +0 +1 +1 +3 +0 +0 +1 +0 +3 +3 +4 +3 +0 +2 +0 +0 +4 +0 +0 +2 +0 +1 +2 +0 +0 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +0 +4 +0 +1 +2 +2 +0 +1 +0 +0 +0 +1 +1 +0 +0 +4 +0 +0 +3 +0 +4 +0 +2 +0 +0 +0 +2 +2 +2 +3 +3 +0 +0 +0 +1 +2 +1 +4 +0 +0 +0 +1 +2 +0 +0 +3 +0 +4 +1 +1 +3 +3 +4 +0 +0 +0 +1 +0 +4 +0 +2 +3 +1 +2 +2 +4 +0 +3 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +0 +0 +3 +0 +1 +3 +4 +1 +1 +4 +0 +3 +2 +0 +1 +0 +3 +0 +4 +3 +3 +2 +0 +2 +0 +4 +3 +0 +0 +3 +2 +3 +3 +2 +1 +0 +3 +2 +0 +1 +2 +1 +3 +2 +2 +0 +1 +0 +3 +0 +0 +0 +4 +2 +3 +0 +4 +0 +0 +3 +0 +0 +4 +2 +0 +3 +0 +0 +3 +1 +4 +3 +3 +3 +4 +3 +2 +3 +0 +2 +0 +3 +3 +0 +2 +3 +3 +4 +0 +2 +4 +0 +0 +0 +0 +2 +0 +0 +0 +1 +0 +3 +0 +1 +2 +0 +2 +1 +3 +4 +0 +0 +0 +0 +2 +0 +0 +0 +2 +0 +4 +0 +1 +0 +1 +0 +2 +4 +0 +1 +0 +1 +0 +4 +1 +0 +2 +0 +0 +2 +4 +2 +3 +2 +0 +0 +0 +1 +1 +0 +4 +0 +3 +4 +0 +2 +4 +0 +3 +0 +2 +0 +0 +0 +0 +0 +1 +0 +4 +0 +0 +0 +3 +0 +0 +1 +3 +2 +0 +2 +1 +2 +2 +3 +0 +0 +0 +4 +3 +3 +4 +4 +0 +4 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +1 +0 +0 +0 +4 +0 +2 +0 +3 +0 +4 +1 +4 +0 +0 +4 +3 +0 +0 +3 +1 +0 +4 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +3 +0 +2 +4 +0 +2 +0 +1 +3 +3 +0 +0 +4 +2 +3 +1 +1 +3 +3 +3 +1 +3 +3 +4 +2 +0 +2 +0 +4 +2 +2 +4 +4 +3 +0 +1 +3 +4 +0 +0 +1 +4 +1 +2 +0 +0 +2 +2 +0 +0 +4 +0 +0 +0 +1 +2 +1 +4 +0 +4 +1 +0 +0 +2 +0 +0 +4 +1 +3 +4 +0 +2 +1 +0 +0 +0 +3 +4 +0 +0 +0 +0 +1 +3 +0 +3 +4 +1 +0 +4 +3 +2 +0 +0 +3 +0 +0 +1 +0 +4 +2 +0 +2 +4 +0 +1 +0 +4 +3 +2 +0 +1 +0 +3 +3 +3 +0 +1 +0 +2 +0 +0 +1 +3 +3 +0 +4 +0 +3 +0 +3 +0 +4 +1 +1 +0 +3 +2 +0 +0 +4 +4 +3 +0 +2 +0 +0 +3 +0 +4 +0 +4 +0 +1 +3 +0 +3 +1 +2 +1 +2 +4 +3 +0 +2 +1 +0 +1 +0 +0 +0 +4 +0 +3 +0 +1 +0 +0 +0 +2 +0 +0 +4 +3 +4 +2 +1 +0 +1 +0 +4 +0 +4 +3 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +4 +0 +3 +1 +2 +1 +2 +0 +0 +4 +0 +0 +0 +2 +3 +0 +3 +0 +1 +0 +0 +2 +0 +0 +4 +3 +3 +0 +0 +2 +4 +0 +4 +0 +0 +0 +3 +1 +0 +1 +0 +0 +0 +0 +0 +0 +4 +3 +1 +3 +3 +2 +2 +0 +3 +0 +3 +0 +1 +2 +4 +0 +1 +4 +2 +0 +0 +4 +2 +2 +4 +4 +0 +2 +4 +0 +0 +0 +3 +3 +0 +3 +0 +0 +3 +0 +1 +2 +0 +1 +1 +0 +2 +3 +3 +3 +0 +1 +0 +1 +0 +3 +0 +4 +1 +2 +4 +0 +0 +3 +0 +0 +0 +0 +3 +0 +3 +3 +4 +2 +3 +0 +2 +0 +2 +2 +2 +0 +4 +0 +2 +0 +0 +0 +0 +4 +1 +1 +2 +0 +4 +0 +1 +0 +4 +3 +0 +0 +1 +0 +0 +0 +4 +0 +2 +2 +0 +2 +1 +0 +0 +4 +2 +0 +4 +4 +3 +0 +2 +4 +3 +0 +4 +1 +3 +0 +0 +1 +4 +1 +4 +0 +3 +0 +3 +3 +0 +4 +0 +3 +0 +0 +4 +2 +1 +4 +4 +0 +3 +2 +0 +4 +0 +4 +0 +2 +1 +0 +0 +2 +0 +0 +1 +2 +4 +1 +0 +0 +4 +0 +0 +0 +1 +0 +0 +0 +0 +1 +0 +0 +1 +4 +0 +0 +0 +0 +2 +2 +1 +0 +3 +3 +3 +0 +3 +2 +0 +0 +2 +3 +4 +0 +3 +0 +3 +1 +2 +1 +1 +0 +3 +4 +1 +0 +4 +4 +1 +4 +0 +2 +0 +0 +0 +3 +0 +0 +2 +3 +0 +2 +3 +4 +0 +4 +4 +0 +4 +0 +4 +2 +1 +3 +0 +0 +0 +4 +4 +0 +1 +4 +1 +0 +0 +4 +0 +4 +0 +0 +1 +0 +2 +0 +4 +0 +2 +1 +2 +0 +0 +3 +1 +0 +2 +0 +1 +0 +0 +0 +0 +4 +2 +1 +1 +0 +1 +4 +0 +0 +2 +3 +3 +0 +3 +2 +0 +0 +0 +4 +0 +0 +0 +4 +2 +2 +4 +4 +0 +2 +0 +0 +0 +3 +0 +4 +4 +0 +3 +1 +0 +4 +0 +0 +0 +3 +2 +3 +4 +3 +1 +3 +0 +0 +2 +2 +0 +0 +0 +4 +2 +3 +0 +4 +4 +4 +4 +1 +3 +2 +3 +3 +0 +2 +2 +2 +2 +4 +2 +0 +0 +0 +3 +0 +2 +2 +0 +4 +2 +0 +2 +3 +2 +4 +0 +4 +1 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +4 +0 +4 +0 +2 +0 +4 +3 +2 +0 +3 +0 +0 +0 +3 +2 +1 +4 +3 +1 +0 +0 +2 +3 +0 +1 +0 +1 +4 +3 +3 +0 +2 +0 +4 +0 +2 +0 +1 +4 +1 +3 +0 +2 +0 +0 +1 +3 +0 +2 +0 +0 +3 +1 +0 +2 +0 +4 +0 +0 +1 +0 +4 +4 +0 +0 +4 +3 +0 +0 +1 +0 +0 +3 +0 +1 +0 +0 +0 +0 +4 +1 +0 +0 +2 +0 +0 +3 +3 +0 +0 +2 +3 +4 +3 +1 +4 +3 +2 +1 +1 +2 +0 +3 +2 +1 +0 +0 +0 +4 +0 +1 +2 +0 +0 +1 +0 +0 +0 +1 +1 +4 +0 +0 +0 +0 +0 +1 +3 +0 +0 +0 +2 +0 +0 +3 +0 +0 +2 +4 +2 +3 +3 +0 +4 +0 +0 +2 +4 +0 +2 +3 +0 +0 +0 +4 +2 +0 +3 +0 +0 +2 +0 +4 +0 +1 +2 +2 +0 +2 +0 +0 +3 +0 +0 +4 +0 +1 +0 +0 +3 +0 +3 +0 +0 +3 +4 +0 +4 +1 +0 +3 +0 +0 +1 +1 +3 +4 +0 +0 +3 +1 +0 +2 +2 +0 +0 +0 +0 +2 +0 +0 +1 +0 +2 +4 +3 +1 +0 +0 +0 +3 +0 +1 +4 +0 +0 +4 +0 +0 +0 +0 +0 +0 +0 +4 +0 +0 +4 +0 +2 +2 +2 +1 +2 +0 +0 +3 +4 +1 +4 +2 +2 +4 +1 +4 +1 +2 +0 +0 +0 +0 +1 +2 +3 +4 +0 +2 +0 +0 +0 +3 +0 +3 +0 +0 +0 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +0 +0 +2 +0 +2 +0 +4 +0 +0 +0 +0 +4 +2 +1 +2 +0 +2 +0 +3 +0 +0 +0 +1 +4 +1 +2 +0 +1 +4 +0 +1 +4 +4 +0 +2 +0 +0 +0 +1 +0 +2 +0 +0 +0 +3 +1 +0 +2 +2 +4 +0 +4 +4 +2 +4 +0 +0 +0 +4 +1 +0 +0 +3 +2 +3 +1 +1 +2 +4 +3 +1 +4 +0 +0 +4 +3 +0 +0 +1 +0 +0 +1 +3 +0 +1 +3 +1 +4 +0 +3 +3 +0 +0 +1 +0 +4 +0 +0 +2 +2 +0 +3 +0 +0 +4 +0 +0 +4 +3 +3 +0 +4 +3 +2 +0 +1 +0 +0 +4 +2 +0 +0 +0 +0 +3 +3 +3 +4 +3 +2 +0 +0 +4 +2 +0 +2 +3 +1 +1 +0 +0 +3 +0 +2 +3 +1 +0 +0 +0 +0 +0 +2 +0 +1 +4 +0 +3 +3 +0 +1 +0 +2 +0 +0 +0 +0 +0 +4 +3 +1 +0 +0 +1 +3 +2 +0 +0 +4 +0 +4 +0 +1 +0 +2 +3 +0 +4 +0 +1 +0 +3 +0 +3 +4 +0 +0 +1 +2 +3 +4 +1 +4 +0 +1 +4 +3 +0 +0 +0 +4 +2 +2 +0 +4 +0 +0 +1 +3 +2 +1 +0 +2 +1 +0 +4 +1 +0 +1 +1 +3 +0 +3 +4 +1 +2 +0 +4 +1 +0 +0 +2 +4 +4 +0 +3 +1 +0 +4 +4 +2 +3 +1 +0 +0 +3 +0 +1 +0 +3 +1 +2 +3 +0 +4 +0 +3 +4 +4 +3 +1 +3 +1 +4 +3 +2 +0 +2 +4 +0 +2 +0 +3 +0 +4 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +4 +4 +0 +0 +3 +4 +0 +0 +3 +1 +2 +0 +4 +2 +0 +0 +0 +0 +4 +2 +0 +0 +1 +0 +2 +2 +2 +0 +1 +1 +0 +2 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +4 +4 +4 +0 +3 +0 +0 +1 +1 +0 +0 +0 +1 +4 +4 +0 +3 +1 +3 +1 +0 +0 +2 +4 +0 +4 +0 +2 +3 +1 +3 +3 +3 +0 +0 +4 +4 +1 +2 +0 +1 +0 +2 +2 +0 +1 +4 +2 +0 +0 +0 +0 +0 +4 +0 +1 +3 +4 +0 +3 +1 +2 +4 +0 +1 +3 +1 +2 +3 +0 +4 +3 +0 +2 +0 +0 +0 +1 +2 +2 +4 +0 +3 +0 +0 +4 +2 +3 +1 +3 +4 +0 +0 +0 +0 +4 +3 +0 +4 +0 +0 +4 +4 +0 +2 +0 +0 +0 +4 +3 +0 +0 +1 +0 +2 +4 +0 +2 +4 +2 +1 +0 +3 +4 +0 +0 +0 +0 +0 +2 +4 +3 +0 +3 +0 +4 +3 +0 +1 +0 +2 +2 +3 +2 +0 +2 +3 +0 +3 +0 +2 +2 +1 +1 +2 +0 +0 +2 +0 +1 +1 +3 +3 +0 +0 +1 +0 +1 +3 +3 +0 +0 +2 +0 +2 +4 +1 +4 +0 +1 +0 +1 +4 +0 +4 +1 +4 +2 +0 +0 +0 +1 +0 +0 +2 +0 +0 +4 +3 +0 +3 +4 +3 +4 +1 +4 +3 +2 +4 +4 +0 +0 +1 +0 +0 +0 +4 +0 +3 +3 +0 +0 +4 +0 +1 +1 +1 +0 +3 +3 +3 +1 +3 +1 +1 +0 +0 +0 +0 +0 +4 +4 +4 +0 +3 +4 +0 +3 +0 +0 +2 +1 +4 +0 +0 +0 +2 +4 +2 +2 +0 +0 +4 +3 +2 +0 +1 +4 +4 +4 +0 +2 +0 +2 +1 +0 +3 +0 +1 +3 +2 +1 +4 +0 +0 +0 +0 +3 +2 +0 +0 +2 +3 +0 +2 +1 +4 +2 +0 +0 +3 +3 +0 +0 +0 +1 +0 +4 +0 +2 +1 +0 +2 +1 +0 +4 +4 +2 +2 +0 +0 +0 +3 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +1 +0 +3 +0 +3 +2 +2 +0 +4 +4 +2 +0 +0 +0 +1 +1 +0 +2 +2 +0 +1 +0 +2 +2 +4 +0 +3 +0 +1 +0 +4 +3 +3 +1 +4 +0 +0 +0 +1 +0 +0 +0 +3 +0 +1 +4 +4 +0 +4 +0 +2 +0 +0 +0 +3 +0 +4 +3 +4 +0 +0 +2 +2 +2 +0 +0 +3 +0 +3 +4 +0 +0 +1 +0 +1 +4 +4 +0 +3 +0 +0 +4 +0 +2 +0 +4 +0 +0 +4 +3 +3 +0 +2 +0 +2 +0 +3 +1 +0 +0 +2 +3 +0 +2 +3 +0 +2 +4 +0 +0 +0 +2 +0 +2 +3 +3 +0 +3 +0 +1 +4 +0 +0 +1 +2 +3 +1 +0 +1 +2 +0 +2 +0 +1 +4 +0 +0 +0 +0 +4 +0 +0 +0 +4 +4 +0 +3 +0 +0 +1 +4 +4 +0 +0 +3 +3 +3 +4 +0 +0 +0 +2 +0 +0 +4 +1 +0 +4 +3 +1 +3 +2 +4 +1 +0 +4 +4 +0 +0 +1 +3 +1 +0 +2 +1 +3 +0 +0 +2 +4 +4 +4 +0 +1 +0 +1 +0 +0 +0 +1 +2 +1 +1 +1 +0 +1 +3 +0 +0 +2 +0 +2 +4 +4 +1 +1 +1 +0 +0 +4 +3 +1 +4 +0 +0 +1 +0 +1 +1 +2 +3 +0 +1 +0 +3 +0 +3 +4 +0 +2 +0 +3 +3 +2 +1 +0 +1 +0 +0 +3 +0 +1 +3 +2 +1 +4 +1 +0 +1 +0 +0 +4 +2 +0 +4 +0 +0 +2 +1 +0 +1 +0 +0 +0 +0 +0 +3 +4 +1 +1 +4 +2 +0 +3 +0 +0 +0 +1 +4 +0 +0 +0 +0 +0 +4 +3 +3 +0 +4 +2 +1 +4 +0 +2 +4 +0 +2 +4 +3 +2 +3 +0 +0 +3 +1 +0 +0 +4 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +3 +0 +0 +0 +2 +2 +1 +0 +4 +4 +0 +0 +2 +0 +0 +1 +1 +1 +0 +0 +2 +1 +0 +0 +0 +3 +0 +3 +0 +0 +3 +2 +1 +0 +3 +1 +0 +0 +0 +2 +2 +0 +4 +0 +3 +1 +0 +0 +0 +3 +0 +1 +4 +3 +0 +2 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +3 +2 +3 +1 +4 +0 +0 +0 +0 +4 +4 +2 +0 +1 +0 +2 +0 +2 +0 +0 +0 +0 +1 +4 +2 +1 +0 +0 +0 +1 +0 +3 +2 +4 +3 +3 +4 +0 +0 +0 +0 +2 +4 +1 +1 +2 +2 +1 +0 +3 +4 +0 +3 +3 +3 +0 +2 +0 +0 +4 +0 +0 +4 +1 +0 +0 +0 +0 +4 +3 +0 +0 +0 +0 +1 +4 +0 +0 +0 +0 +2 +0 +4 +0 +0 +1 +0 +0 +0 +4 +0 +0 +3 +4 +2 +4 +2 +3 +0 +0 +1 +0 +0 +0 +0 +3 +4 +2 +0 +2 +2 +4 +3 +0 +0 +0 +0 +0 +1 +1 +1 +0 +0 +2 +0 +2 +2 +0 +0 +2 +0 +4 +0 +0 +0 +0 +0 +2 +0 +0 +0 +3 +0 +1 +0 +0 +0 +3 +0 +0 +0 +4 +0 +3 +3 +2 +0 +1 +0 +0 +0 +1 +0 +1 +4 +3 +0 +1 +0 +4 +0 +4 +1 +1 +1 +4 +0 +2 +0 +4 +0 +0 +0 +4 +0 +2 +0 +1 +2 +1 +0 +0 +1 +1 +4 +3 +0 +0 +0 +2 +0 +1 +1 +2 +0 +0 +3 +4 +0 +2 +0 +2 +1 +0 +3 +0 +0 +3 +0 +0 +2 +1 +0 +4 +3 +0 +3 +0 +0 +2 +2 +0 +4 +0 +3 +0 +1 +0 +0 +2 +0 +0 +0 +3 +0 +0 +0 +4 +1 +0 +1 +0 +0 +0 +0 +2 +0 +0 +4 +4 +0 +4 +0 +0 +2 +1 +0 +0 +0 +0 +3 +1 +4 +1 +0 +0 +0 +1 +0 +3 +1 +0 +0 +2 +0 +1 +1 +1 +1 +0 +0 +3 +4 +0 +0 +1 +1 +0 +2 +2 +0 +2 +3 +3 +0 +0 +2 +1 +0 +2 +0 +4 +2 +0 +3 +2 +0 +0 +1 +2 +0 +3 +0 +2 +3 +4 +0 +3 +1 +0 +2 +2 +4 +4 +1 +0 +2 +3 +4 +4 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +3 +4 +0 +1 +3 +1 +0 +2 +2 +0 +0 +0 +0 +4 +1 +0 +0 +3 +0 +2 +3 +0 +0 +4 +0 +0 +0 +0 +2 +4 +0 +0 +4 +4 +0 +4 +3 +0 +2 +2 +2 +0 +4 +0 +4 +4 +3 +0 +3 +0 +0 +1 +2 +0 +4 +0 +4 +0 +4 +4 +1 +1 +0 +0 +1 +1 +0 +4 +4 +0 +0 +0 +0 +0 +2 +2 +0 +4 +0 +0 +0 +0 +1 +3 +2 +0 +0 +1 +1 +2 +0 +0 +0 +0 +0 +0 +2 +3 +0 +0 +3 +0 +0 +0 +1 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +3 +1 +2 +0 +0 +1 +3 +3 +1 +0 +3 +2 +0 +0 +0 +1 +3 +3 +0 +0 +4 +0 +0 +0 +0 +4 +1 +2 +2 +0 +0 +0 +3 +0 +3 +0 +0 +3 +3 +0 +0 +0 +0 +2 +3 +1 +3 +4 +2 +0 +4 +0 +0 +0 +3 +0 +4 +4 +4 +3 +0 +4 +0 +3 +0 +0 +2 +4 +4 +0 +0 +1 +0 +0 +3 +3 +1 +1 +0 +1 +2 +0 +3 +3 +4 +4 +1 +3 +0 +1 +3 +2 +0 +0 +0 +0 +0 +4 +4 +1 +1 +0 +0 +0 +1 +4 +4 +2 +0 +3 +0 +3 +0 +0 +0 +4 +1 +4 +2 +0 +2 +2 +0 +4 +0 +0 +0 +0 +4 +1 +4 +0 +0 +0 +0 +0 +2 +2 +3 +2 +0 +0 +0 +2 +0 +2 +0 +0 +2 +0 +4 +1 +0 +2 +2 +3 +4 +3 +0 +2 +2 +0 +4 +4 +0 +0 +3 +2 +2 +0 +0 +2 +0 +0 +1 +2 +4 +0 +2 +1 +0 +2 +2 +0 +4 +4 +3 +0 +2 +0 +0 +1 +0 +0 +4 +1 +0 +2 +0 +0 +1 +2 +0 +0 +1 +0 +3 +0 +0 +4 +0 +0 +4 +3 +3 +0 +0 +4 +4 +3 +0 +1 +0 +2 +0 +0 +0 +0 +1 +4 +4 +4 +3 +4 +4 +0 +0 +1 +0 +3 +2 +4 +0 +0 +0 +4 +1 +0 +2 +2 +0 +3 +0 +0 +2 +0 +3 +0 +1 +0 +2 +3 +0 +2 +0 +1 +1 +2 +0 +3 +1 +2 +1 +0 +0 +2 +3 +0 +3 +0 +0 +1 +0 +0 +0 +2 +1 +3 +0 +1 +0 +0 +3 +0 +4 +3 +3 +1 +3 +0 +0 +1 +4 +2 +1 +2 +1 +0 +1 +0 +1 +4 +0 +4 +2 +0 +1 +2 +4 +3 +0 +1 +4 +1 +4 +0 +2 +0 +1 +0 +0 +2 +0 +0 +4 +1 +3 +1 +3 +3 +3 +2 +0 +4 +2 +0 +4 +1 +4 +1 +0 +0 +0 +3 +1 +2 +4 +0 +3 +0 +2 +0 +0 +2 +2 +0 +0 +0 +0 +4 +4 +0 +2 +2 +0 +1 +2 +0 +4 +0 +2 +2 +1 +0 +4 +0 +1 +0 +2 +3 +4 +0 +1 +4 +4 +0 +4 +3 +0 +0 +1 +4 +0 +4 +3 +3 +4 +0 +2 +0 +1 +1 +3 +2 +2 +0 +3 +0 +0 +2 +0 +2 +1 +2 +0 +2 +0 +0 +4 +4 +0 +4 +4 +0 +4 +0 +0 +0 +0 +0 +4 +3 +2 +0 +2 +0 +2 +4 +4 +1 +0 +0 +0 +3 +1 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +1 +4 +1 +4 +0 +2 +0 +1 +3 +0 +3 +3 +1 +2 +0 +1 +0 +1 +2 +2 +2 +0 +0 +0 +3 +0 +0 +0 +4 +2 +4 +0 +1 +3 +3 +3 +2 +4 +0 +0 +2 +0 +0 +1 +0 +4 +4 +0 +0 +0 +1 +4 +0 +3 +1 +2 +0 +0 +0 +3 +3 +3 +1 +0 +2 +0 +4 +0 +1 +0 +0 +0 +0 +4 +0 +4 +4 +0 +3 +4 +0 +4 +0 +0 +2 +2 +3 +3 +2 +1 +3 +2 +4 +0 +0 +0 +4 +3 +3 +0 +0 +0 +0 +3 +4 +3 +1 +2 +0 +4 +0 +0 +3 +0 +0 +1 +0 +3 +4 +0 +0 +2 +3 +2 +0 +3 +0 +0 +0 +3 +1 +0 +3 +0 +2 +1 +2 +1 +0 +0 +4 +0 +0 +0 +1 +2 +3 +0 +4 +0 +3 +3 +0 +1 +0 +1 +0 +0 +0 +1 +3 +0 +0 +0 +4 +0 +2 +4 +3 +0 +0 +0 +4 +3 +1 +2 +0 +0 +0 +0 +4 +4 +3 +0 +3 +0 +4 +0 +0 +0 +2 +2 +1 +0 +0 +2 +1 +0 +1 +0 +1 +3 +4 +3 +0 +0 +2 +0 +0 +4 +3 +1 +1 +3 +4 +3 +1 +3 +1 +0 +1 +4 +0 +3 +0 +0 +0 +0 +4 +1 +4 +4 +0 +4 +2 +4 +4 +3 +3 +1 +1 +0 +2 +3 +4 +2 +0 +3 +2 +0 +4 +2 +3 +3 +0 +2 +0 +0 +3 +0 +2 +3 +3 +0 +0 +2 +2 +0 +1 +0 +0 +1 +0 +0 +0 +3 +0 +4 +0 +2 +3 +0 +0 +4 +0 +1 +0 +0 +1 +0 +1 +0 +0 +0 +3 +0 +0 +0 +1 +0 +0 +3 +2 +0 +0 +2 +0 +0 +4 +0 +0 +0 +4 +2 +3 +0 +0 +0 +2 +0 +2 +0 +0 +4 +0 +0 +0 +3 +0 +0 +0 +4 +4 +0 +1 +2 +4 +0 +0 +1 +0 +1 +0 +1 +2 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +2 +0 +1 +4 +2 +1 +0 +1 +0 +0 +0 +4 +3 +0 +0 +0 +3 +1 +1 +0 +0 +1 +4 +0 +0 +0 +2 +2 +3 +0 +3 +0 +2 +0 +0 +0 +1 +2 +0 +0 +0 +2 +0 +4 +0 +3 +3 +1 +0 +4 +1 +0 +3 +0 +4 +1 +0 +4 +2 +1 +4 +3 +2 +3 +1 +2 +3 +3 +3 +0 +0 +3 +1 +1 +3 +0 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +0 +4 +4 +0 +0 +0 +4 +0 +0 +0 +2 +0 +0 +2 +0 +3 +3 +0 +0 +0 +2 +0 +4 +3 +0 +4 +2 +3 +2 +1 +3 +0 +0 +0 +0 +4 +0 +0 +2 +3 +2 +1 +1 +0 +3 +3 +0 +0 +1 +3 +4 +0 +0 +3 +3 +0 +0 +3 +0 +1 +0 +4 +3 +3 +0 +4 +0 +2 +0 +0 +0 +1 +1 +3 +2 +4 +0 +4 +4 +0 +2 +0 +4 +1 +2 +1 +2 +0 +2 +1 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +1 +0 +3 +3 +0 +0 +4 +3 +2 +3 +0 +0 +2 +2 +0 +3 +0 +2 +0 +3 +4 +0 +0 +0 +0 +4 +3 +0 +2 +0 +3 +0 +3 +0 +1 +4 +2 +0 +1 +4 +1 +4 +3 +3 +0 +4 +3 +4 +2 +0 +0 +4 +1 +1 +3 +4 +2 +3 +0 +2 +3 +0 +0 +0 +2 +4 +3 +0 +2 +0 +1 +2 +0 +3 +0 +0 +0 +0 +0 +4 +0 +0 +0 +2 +0 +2 +2 +3 +0 +0 +0 +0 +1 +3 +0 +2 +2 +0 +0 +0 +2 +0 +0 +2 +2 +1 +2 +0 +4 +0 +0 +0 +1 +0 +4 +3 +1 +2 +0 +3 +0 +2 +0 +1 +2 +0 +0 +4 +0 +0 +0 +0 +3 +0 +0 +1 +0 +0 +0 +3 +0 +2 +4 +2 +2 +0 +0 +4 +3 +0 +0 +4 +3 +3 +0 +0 +0 +0 +4 +0 +3 +0 +4 +2 +2 +3 +1 +4 +4 +0 +1 +0 +0 +0 +0 +3 +2 +1 +2 +0 +4 +0 +0 +0 +1 +0 +3 +0 +0 +1 +0 +1 +0 +0 +0 +0 +0 +4 +0 +4 +0 +1 +0 +0 +0 +0 +4 +1 +1 +0 +0 +0 +0 +4 +0 +0 +0 +1 +1 +0 +1 +0 +4 +0 +0 +2 +0 +1 +1 +2 +0 +2 +1 +1 +0 +0 +3 +0 +4 +0 +2 +0 +3 +4 +4 +1 +1 +0 +4 +4 +1 +0 +2 +0 +2 +0 +0 +0 +0 +0 +0 +4 +0 +4 +4 +3 +3 +3 +4 +0 +3 +3 +4 +1 +4 +1 +1 +0 +1 +0 +0 +4 +4 +2 +3 +0 +3 +0 +0 +0 +3 +2 +0 +4 +4 +0 +4 +0 +1 +1 +0 +0 +0 +1 +2 +0 +0 +4 +0 +0 +2 +3 +0 +0 +1 +0 +3 +3 +1 +4 +0 +0 +3 +4 +3 +0 +0 +0 +0 +2 +2 +2 +1 +1 +0 +3 +1 +3 +0 +3 +4 +1 +0 +1 +3 +3 +2 +1 +0 +0 +0 +0 +4 +2 +0 +2 +2 +0 +0 +0 +1 +3 +1 +0 +0 +1 +0 +0 +0 +0 +0 +0 +2 +2 +0 +1 +0 +0 +3 +0 +0 +0 +0 +1 +0 +1 +3 +3 +2 +1 +0 +3 +2 +0 +4 +0 +1 +0 +1 +0 +0 +4 +0 +2 +3 +0 +0 +0 +1 +0 +3 +3 +3 +4 +4 +0 +3 +2 +1 +2 +1 +0 +0 +3 +0 +3 +0 +0 +1 +2 +2 +3 +0 +4 +0 +1 +3 +0 +2 +3 +0 +0 +1 +0 +2 +0 +0 +3 +1 +4 +2 +0 +1 +3 +0 +2 +1 +4 +1 +2 +4 +1 +1 +4 +0 +3 +0 +1 +0 +1 +0 +3 +3 +0 +0 +0 +0 +4 +4 +4 +3 +0 +3 +1 +1 +2 +0 +4 +0 +3 +2 +3 +0 +2 +0 +4 +2 +0 +1 +2 +0 +0 +4 +0 +0 +0 +0 +3 +4 +0 +0 +4 +2 +4 +0 +0 +4 +0 +0 +4 +2 +0 +1 +3 +0 +1 +0 +4 +3 +3 +1 +2 +4 +0 +2 +1 +0 +4 +3 +0 +0 +0 +4 +4 +0 +0 +0 +4 +0 +0 +0 +0 +0 +0 +0 +2 +4 +0 +2 +0 +0 +3 +0 +0 +0 +4 +0 +0 +3 +3 +4 +3 +1 +0 +4 +0 +0 +1 +3 +0 +0 +4 +0 +1 +0 +0 +1 +1 +4 +0 +3 +0 +3 +0 +0 +0 +0 +3 +0 +0 +0 +0 +2 +2 +0 +0 +1 +3 +4 +0 +4 +0 +4 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +3 +4 +2 +1 +3 +0 +2 +1 +0 +0 +0 +0 +0 +3 +2 +4 +1 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +3 +4 +0 +4 +2 +0 +0 +0 +1 +1 +2 +0 +0 +4 +2 +1 +0 +1 +1 +1 +0 +0 +0 +4 +0 +4 +1 +0 +1 +1 +0 +2 +0 +0 +4 +2 +0 +0 +0 +0 +4 +0 +1 +2 +0 +3 +2 +2 +0 +4 +4 +1 +2 +3 +0 +0 +0 +0 +3 +0 +0 +3 +4 +4 +0 +1 +0 +3 +4 +0 +1 +0 +4 +3 +2 +2 +0 +0 +1 +2 +0 +0 +2 +4 +2 +2 +4 +0 +4 +3 +0 +1 +0 +4 +0 +0 +1 +1 +2 +0 +0 +1 +3 +0 +4 +0 +3 +0 +3 +0 +1 +2 +0 +0 +1 +2 +0 +4 +0 +1 +0 +4 +0 +1 +0 +0 +3 +3 +0 +0 +0 +4 +0 +0 +4 +2 +1 +4 +0 +1 +2 +1 +1 +4 +0 +4 +0 +1 +2 +0 +0 +0 +0 +4 +3 +2 +4 +0 +0 +4 +1 +0 +4 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +0 +2 +0 +2 +0 +4 +0 +4 +0 +2 +2 +0 +1 +3 +2 +0 +2 +1 +0 +3 +0 +1 +2 +0 +2 +4 +1 +0 +0 +1 +1 +1 +1 +2 +0 +0 +1 +4 +3 +0 +3 +3 +4 +0 +0 +2 +0 +1 +3 +2 +0 +0 +4 +1 +4 +0 +2 +0 +3 +0 +1 +0 +4 +4 +0 +1 +0 +1 +2 +0 +0 +3 +0 +2 +2 +3 +3 +3 +0 +0 +1 +0 +0 +1 +2 +0 +0 +0 +1 +0 +0 +0 +2 +4 +1 +1 +3 +1 +3 +4 +0 +0 +4 +1 +4 +3 +1 +0 +0 +0 +4 +0 +4 +1 +4 +0 +0 +0 +3 +0 +1 +3 +0 +2 +0 +0 +0 +0 +4 +0 +4 +0 +3 +1 +0 +3 +2 +0 +1 +0 +0 +0 +0 +0 +0 +4 +0 +4 +3 +0 +1 +1 +0 +3 +4 +1 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +4 +0 +4 +2 +0 +0 +1 +3 +3 +2 +0 +1 +0 +0 +3 +0 +1 +4 +4 +2 +4 +0 +4 +2 +1 +4 +0 +0 +1 +0 +0 +0 +2 +4 +2 +0 +1 +2 +0 +2 +4 +3 +0 +0 +3 +1 +0 +0 +0 +0 +1 +1 +0 +0 +0 +4 +0 +4 +3 +4 +0 +2 +0 +1 +3 +0 +1 +4 +0 +0 +0 +2 +0 +2 +1 +3 +0 +0 +0 +0 +0 +4 +4 +1 +3 +0 +0 +0 +0 +2 +1 +0 +2 +0 +0 +0 +2 +1 +0 +0 +1 +2 +0 +3 +0 +3 +0 +1 +1 +0 +1 +0 +0 +1 +2 +0 +0 +2 +2 +3 +2 +2 +0 +4 +1 +3 +0 +0 +1 +0 +0 +2 +2 +0 +4 +2 +0 +1 +4 +0 +3 +2 +0 +2 +0 +3 +0 +1 +0 +0 +0 +0 +3 +0 +0 +3 +1 +2 +0 +2 +1 +0 +1 +0 +0 +0 +4 +4 +0 +0 +0 +3 +4 +0 +2 +0 +0 +0 +2 +0 +0 +0 +3 +3 +3 +0 +0 +3 +3 +0 +0 +0 +0 +0 +2 +2 +0 +2 +0 +1 +3 +0 +0 +4 +0 +0 +0 +3 +2 +2 +2 +0 +3 +2 +4 +0 +3 +0 +0 +0 +3 +1 +0 +0 +0 +1 +4 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +0 +2 +0 +3 +3 +0 +1 +2 +0 +0 +4 +4 +0 +2 +4 +1 +0 +2 +4 +0 +0 +2 +0 +0 +2 +0 +1 +2 +3 +0 +0 +1 +4 +1 +2 +4 +0 +0 +2 +4 +0 +0 +2 +2 +2 +4 +2 +2 +0 +4 +3 +4 +0 +0 +0 +1 +2 +0 +4 +2 +4 +2 +0 +2 +0 +0 +2 +1 +1 +0 +3 +0 +0 +0 +4 +0 +0 +0 +3 +0 +0 +4 +3 +0 +0 +2 +0 +0 +0 +2 +0 +1 +1 +0 +0 +2 +0 +0 +1 +2 +3 +0 +0 +0 +0 +4 +2 +1 +0 +0 +0 +4 +0 +1 +3 +0 +0 +3 +4 +3 +1 +3 +4 +0 +0 +0 +0 +4 +1 +0 +4 +0 +3 +4 +1 +4 +2 +1 +2 +3 +1 +0 +2 +1 +4 +0 +1 +4 +3 +1 +3 +0 +1 +4 +1 +0 +3 +1 +0 +0 +3 +2 +4 +2 +1 +1 +0 +1 +0 +3 +0 +3 +3 +3 +0 +0 +2 +4 +0 +0 +0 +0 +3 +0 +2 +4 +0 +0 +0 +2 +0 +1 +4 +0 +4 +3 +1 +2 +2 +0 +3 +1 +0 +1 +0 +4 +3 +3 +0 +0 +0 +3 +4 +4 +1 +0 +3 +4 +4 +0 +0 +0 +0 +0 +4 +0 +1 +0 +4 +0 +2 +0 +4 +0 +2 +4 +4 +0 +0 +0 +1 +3 +0 +3 +1 +1 +3 +3 +0 +3 +3 +3 +0 +2 +0 +1 +0 +0 +0 +0 +0 +0 +1 +0 +0 +3 +0 +1 +0 +2 +0 +0 +1 +0 +2 +0 +3 +0 +0 +0 diff --git a/RHF/test.sh b/RHF/test.sh new file mode 100755 index 0000000..90bcc97 --- /dev/null +++ b/RHF/test.sh @@ -0,0 +1,19 @@ +#!/bin/sh +#获取文件夹下所有文件 +# +folder="./Input_data/Data_10000/" +funcFolder="./routerFuncData/Function_10000/" + +softFolder=$(ls $folder) +for subFolder in ${softFolder} +do + # build the same dirs for funcFolder + # echo "subFolder: ${folder}${subFolder}" + sFile=$(ls ${folder}${subFolder}) + for inFIle in ${sFile} + do + # echo "inFIle: ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle}" + ./router_mega/Generate 1 ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle} -t + done +done + diff --git a/RHF_10000/Input_data/generate_test_data.py b/RHF_10000/Input_data/generate_test_data.py new file mode 100755 index 0000000..0530068 --- /dev/null +++ b/RHF_10000/Input_data/generate_test_data.py @@ -0,0 +1,71 @@ +import sys +import math +import os +import random +import numpy as np + +# You need to generate different input IP files +# In this file, the input is set to IPV4 address as a string +# eg: "x.x.x.x.x.x.x.x", each "x" is a number from str(0) to str(15) +# "." does not appear in the string +# Total number of possible IP addesses is: d1 = 16*16*16*16*16*16*16*16 +# The function rand_ip(8) casts this IPv4 string with 8 chars into an integer +# maximum possible integer of rand_ip(8) would be: (2^32 - 1) +max_ip_num = 16 +# Set n value first +n = 10000 # each set has n input keys +z = 8 ## the name of the file would be 0000_1_54_4.txt + +# set the total number of key set +max_key_set = 1000 +# set the total number of test files +max_itr = 1 + +# generate a random IP address with length = l +# the random number for each 4bits follows uniform distribution +# In hardware, the input IPs do not need to be cast between data types, +# since they are always binary data +def rand_ip(l): + tmp_ip = int(random.uniform(0,max_ip_num)) + for s in range(l-1): + tmp_ip = tmp_ip*16 + int(random.uniform(0,max_ip_num)) + return tmp_ip +# # numpy random +# def np_rand_ip(l): +# tmp_ip = numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# for s in range(l-1): +# tmp_ip = tmp_ip*16 + numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# return tmp_ip + +if __name__=='__main__': + print('begin') + ################################ + ## curent folder + for folder_name in range(max_key_set): + cur_dir = "./Data_%d/%d"%(n,folder_name) + if not os.path.exists(cur_dir): + os.makedirs(cur_dir) + ip_list = [] + i = 0 + while(i < n): + ##for i in range(n): + ## generate 1 random IP + # 4 xxx IP strings + tmp_ip = str(rand_ip(z)) + if (tmp_ip not in ip_list): + # tmp_ip = np_rand_ip(4) # numpy version + ip_list.append(tmp_ip) + i += 1 + print('size of ip set is: ', len(ip_list)) + print('writing to txt file for folder %d...'%(folder_name)) + # divide the ip list into z group + # shuffle -> divide -> output + for itr in range(max_itr): + random.shuffle(ip_list) + fin = open("%s/key_0000_1_%d_%d__%s.txt"%(cur_dir,n,z,str(itr).zfill(6)),'w') + s = '\n' + fin.write(s.join(ip_list)) + fin.close() + print('finish all folders.') + + diff --git a/RHF_10000/README.md b/RHF_10000/README.md new file mode 100755 index 0000000..00cb0cd --- /dev/null +++ b/RHF_10000/README.md @@ -0,0 +1,147 @@ +# RHF_10000 +Routing Hash Function(RHF) is used to hash from input addresses to output interface numbers. +Compared with other RTLP approaches, RHF-10000 is designed to support lookup for 32-bit address sets with size = 10000. + +The RHF_10000 design (RHF1) is implemented with respect to hardware constraints and different balance points in construction time, lookup latency and resource cost. + +# Implementation +## Compile program +``` +cd router_mega +cmake . +make +``` +# Step1: generate data set for experiment 0/1/2 +We design lookup experiments and verify the performance (mainly in space consumption) of RHF_10000 designs. + +Input addresses are generated 1000 times. For each address set, we do the following 3 experiment. +Experiment 0 and 1 are for distributions of mapping. +Experiment 2 is for different output interface count. + +## Experiment 0: Simulate different distributions of routing lookups. +-Dataset generation: +There may be various mappings from input address to Output interface numbers(IN). +We first fix the IN from 1-4, which means there are at most 4 INs (A,B,C,D) for the address set. +n_a addresses should be mapped to IN-A. +n_b addresses should be mapped to IN-B. +n_c addresses should be mapped to IN-C. +n_d addresses should be mapped to IN-D. +To save time, n_a, n_b, n_c and n_d is chosen as a multiple of 500 from 0 to 10000. +Therefore, the dataset generation is transferred to a 4-sum problem. +We don't care how A-D is assigned to IN 1-4 in real network applications because the difference doesn't affect the functionality and performance of RHF construction algorithm. Therefore, n_a >= n_b >= n_c >= n_d can be assumed to eliminate dataset duplication. + +By running: +`cd pn_data` +`python3 Config_exp0.py` +The Config_exp0.txt contains 108 cases of mapping. The format of each line in Config_exp0.txt represents: +{n_a, n_b, n_c, n_d}, respectively. +Since the input addresses are randomly generated, the mappings from any one group of addresses (with size n_a/n_b/n_c/n_d) to any one of the interface number (A/B/C/D) are symmetric. + +-Experiment: +For an address set, the algorithm finds the parameters that can reach minimum space consumption. The worse-case space consumption of 1000 address sets is reported for one experiment. +For 108 experiments, the paper analyze the distribution of the minimum space consumption according to the size of n_a, n_b, n_c and n_d. + +Firstly, change the name of "Config_exp0.txt" to "Config.txt". +By running: +``` +cd router_mega +./Generate 1 ../Input_data/Data_10000/ +``` + +Result format: +trial n_a n_b n_c n_d maxStorageCost avgStorageCost maxTime avgTime +0 2500 2500 2500 2500 44032 38963 0.005427 0.00391031 + +## Experiment 1: Interface number dataset of an emulated polar constellation +This data set shows the distribution of interface number (pn) in LEO backbone network with 10000 nodes. +The pn is then summarized as four numbers: n_a, n_b, n_c and n_d, representing the 4 forwarding directions. +n_a + n_b + n_c + n_d = 10000 + +Several assumptions are made: +1, 10000 nodes in total. Among the 10000 nodes, x nodes have 1-to-1 connection with x ground stations. +The rest (10000 - 2x) nodes are satellite nodes without ground connection. + +2, We assume each ISL in the constellation are always open. +The topology of the (10000 - x) satellite nodes are assumed as 2-D torus at the current stage. + +3, The polar constellation has r orbits. Each orbit has c satellites. +Parameters satisfy the following fomular: +10000 - x = r * c + +4, We name satellite as "s". The route resolving only refers to the destination address. +For routing lookup (RL) task, a satellite node only need to know the interface number (IN) for a given destination address. +There are (10000 - x) satellites in total. We start from s(0) to s(10000 - x - 1). +We treat the satellite s(temp) as the source of packet. For s(temp), there are 10000 destination satellites (including s(temp) itself). +The destination address iterate from s(0) to s(9999), which gives 10000 source-destination (s-d) pairs. + +5, We assume each s-d pair only has one route. This means the packet in the source satellite only has one output interface number (pn). +We choose the shortest path to determine the pn for each source satellite in the function: get_pn(). +The distance between any two neighboring satellites is assumed to be the same. +Since the topology is 2-d torus, the direction of going up vs bottom, left vs right is determined by the number of hops from source to destination. +Two scenarios are implemented for balanced and unbalanced distributions. + +get_pn1() (Since the generated pn data is unbalanced, it is not used in the experiment): +We assume the ISL between intra-orbit satellites is stable, which may infer broadband communication. +Therefore, the next hop pn of source satellite always prefer the top-bottom directions against left-right directions. +Besides, when multiple paths have the same distance, we assign priority as follows: +1st (highest priority): pn = 1 , to the top +2nd: pn = 3 , to the bottom +3rd: pn = 2 , to the right +4th: pn = 0 (including the case when source and destination nodes are the same satellite) , to the left + +get_pn2() (The generated pn data is used in the experiment): +The next hop of source satellite always prefer the direction with longer distance. +This tends to generate diagonal route for most pairs of s-d, and may bring more balanced loads for the constellation network. +For example, +source:(0,0), dest:(4,6),the next hop would be top +source:(8,8), dest:(2,4),the next hop would be left +When multiple paths have the same distance, we assign priority as follows: +1st (highest priority): pn = 1 , to the top +2nd: pn = 3 , to the bottom +3rd: pn = 2 , to the right +4th: pn = 0 (including the case when source and destination nodes are the same satellite) , to the left + +Same as experiment 0, +Since the input addresses are randomly generated, the mappings from any one group of addresses (with size n_a/n_b/n_c/n_d) to any one of the interface number (A/B/C/D) are symmetric. + +The command for experiment 1 is the same as experiment 0. +By running: +`cd pn_data` +`python3 Config_exp1.py` + +The c and x iterate from ranges that may apply to real constellation networks. +The max and min address count, max and min variance of a group of address count mapping to (A,B,C,D) is printed. + +In order to provide the data set for later experiment such as experiment 0, please use fixed c and x, and uncomment line 189, 220, 234. +The generated Config_exp1.txt contains (10000-x) cases of mapping. The format of each line in Config1.txt represents: +{n_a, n_b, n_c, n_d}, respectively. Please change the name of "Config_exp1.txt" to "Config.txt", accordingly. + +## Experiment 2: Simulate different sizes of output interface ports +-Dataset generation: +Do experiments for 10000-4, 10000-5, ... , 10000-10 lookup tasks. In each experiment, the number of output interface ports is equally divided and mapped with input addresses. For example, in 10000-4 experiment, n_a = n_b = n_c = n_d = 10000/4; in 10000-5 experiment, n_a = n_b = n_c = n_d = n_e = 10000/5 +The worse-case space consumption of 1000 address sets is reported for each experiment. + +By running: +``` +cd router_mega +./Generate 2 ../Input_data/Data_10000/ +``` +output_count maxStorageCost avgStorageCost maxTime avgTime +4 44032 38963 0.00691 0.00387679 + +## Step2: run RHF_10000 algorithm for experiment 0/2 + + +## Plot the result +For experiment 1, run: +`cd plot` +`python3 plot_experiment1.py` +`python3 sort_variance_experiment1.py` + +For experiment 2, run: +`cd plot` +`python3 plot_experiment2.py` + +# Citation +The current work is for IEEE TRANSACTIONS ON AEROSPACE AND ELECTRONIC SYSTEMS. +Any questions, please contact keran_zhang@outlook.com diff --git a/RHF_10000/generate.sh b/RHF_10000/generate.sh new file mode 100755 index 0000000..534b53d --- /dev/null +++ b/RHF_10000/generate.sh @@ -0,0 +1,29 @@ +#!/bin/sh +#获取文件夹下所有文件 +# +folder="./Input_data/Data_10000/" +funcFolder="./routerFuncData/Function_10000/" + +if [ ! -d "$funcFolder" ];then +mkdir ${funcFolder} +echo "build ${funcFolder} successfull." +else +echo "${funcFolder} already exists, overwrite all files in it..." +fi +echo "" +softFolder=$(ls $folder) +for subFolder in ${softFolder} +do + # build the same dirs for funcFolder + # echo "subFolder: ${folder}${subFolder}" + if [ ! -d "${funcFolder}${subFolder}" ];then + mkdir ${funcFolder}${subFolder} + fi + sFile=$(ls ${folder}${subFolder}) + for inFIle in ${sFile} + do + # echo "inFIle: ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle}" + ./router_mega/Generate 1 ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle} + done +done + diff --git a/RHF_10000/plot/Result_experiment1.txt b/RHF_10000/plot/Result_experiment1.txt new file mode 100755 index 0000000..9a8f1d4 --- /dev/null +++ b/RHF_10000/plot/Result_experiment1.txt @@ -0,0 +1,110 @@ +1000 experiments. StorageCost in bits, Time in seconds. +trial n_a n_b n_c n_d maxStorageCost avgStorageCost maxTime avgTime +0 2500 2500 2500 2500 44032 38963 0.008488 0.00387344 +1 3000 3000 3000 1000 44032 38958 0.005525 0.0033471 +2 3000 3000 2500 1500 55296 38984 0.006438 0.00356052 +3 3000 3000 2000 2000 44032 38958 0.00742 0.00363975 +4 3000 2500 2500 2000 44032 38968 0.006007 0.00379183 +5 3500 3500 3000 0 44032 28739 0.01881 0.0121343 +6 3500 3500 2500 500 44032 38927 0.01959 0.0036491 +7 3500 3500 2000 1000 44032 38962 0.016366 0.00315143 +8 3500 3500 1500 1500 44032 38963 0.004649 0.00323611 +9 3500 3000 3000 500 44032 38951 0.01835 0.00325412 +10 3500 3000 2500 1000 44032 38958 0.004497 0.00331568 +11 3500 3000 2000 1500 44032 38952 0.004977 0.00344995 +12 3500 2500 2500 1500 44032 38963 0.00591 0.003538 +13 3500 2500 2000 2000 44032 38963 0.007811 0.00362197 +14 4000 4000 2000 0 44032 28778 0.013249 0.00957661 +15 4000 4000 1500 500 44032 38604 0.016424 0.0059914 +16 4000 4000 1000 1000 44032 38831 0.014129 0.0047293 +17 4000 3500 2500 0 44032 28806 0.016067 0.0107338 +18 4000 3500 2000 500 44032 38893 0.015539 0.00428406 +19 4000 3500 1500 1000 44032 38961 0.015493 0.00318184 +20 4000 3000 3000 0 44032 28867 0.015626 0.0114573 +21 4000 3000 2500 500 44032 38937 0.016861 0.00348684 +22 4000 3000 2000 1000 44032 38982 0.018418 0.00310836 +23 4000 3000 1500 1500 44032 38967 0.016933 0.00315128 +24 4000 2500 2500 1000 44032 38971 0.017721 0.00315051 +25 4000 2500 2000 1500 55296 38989 0.006646 0.0032704 +26 4000 2000 2000 2000 44032 38978 0.004046 0.00336652 +27 4500 4500 1000 0 38912 28038 0.007971 0.00660167 +28 4500 4500 500 500 38912 32264 0.010356 0.00707608 +29 4500 4000 1500 0 44032 28591 0.014064 0.00805532 +30 4500 4000 1000 500 44032 37240 0.013351 0.00738324 +31 4500 3500 2000 0 44032 28768 0.012722 0.00921696 +32 4500 3500 1500 500 44032 38626 0.017275 0.00604067 +33 4500 3500 1000 1000 44032 38803 0.013796 0.0049355 +34 4500 3000 2500 0 44032 28829 0.015959 0.0100569 +35 4500 3000 2000 500 44032 38845 0.01539 0.00461985 +36 4500 3000 1500 1000 44032 38946 0.015191 0.00338451 +37 4500 2500 2500 500 68352 38909 0.015791 0.00437678 +38 4500 2500 2000 1000 76800 38989 0.016208 0.00308533 +39 4500 2500 1500 1500 76800 38992 0.017141 0.00309469 +40 4500 2000 2000 1500 71168 38994 0.015962 0.00309033 +41 5000 5000 0 0 38400 21305 0.019945 0.0122697 +42 5000 4500 500 0 38400 27820 0.006566 0.00489348 +43 5000 4000 1000 0 38912 28219 0.010271 0.00625635 +44 5000 4000 500 500 44032 32180 0.008296 0.0066525 +45 5000 3500 1500 0 44032 28514 0.009658 0.00756403 +46 5000 3500 1000 500 44032 36929 0.0102 0.00719422 +47 5000 3000 2000 0 44032 28694 0.011437 0.00847675 +48 5000 3000 1500 500 44032 38387 0.012777 0.00641448 +49 5000 3000 1000 1000 44032 38746 0.01205 0.00549992 +50 5000 2500 2500 0 44032 28792 0.02251 0.0089721 +51 5000 2500 2000 500 44032 38656 0.018395 0.00545419 +52 5000 2500 1500 1000 44032 38894 0.020157 0.00383953 +53 5000 2000 2000 1000 44032 38913 0.01668 0.00368963 +54 5000 2000 1500 1500 44032 38950 0.015177 0.0032706 +55 5500 4500 0 0 38400 21743 0.016146 0.0107387 +56 5500 4000 500 0 38400 27804 0.006127 0.00455191 +57 5500 3500 1000 0 38912 28158 0.006863 0.00570807 +58 5500 3500 500 500 38912 31644 0.007548 0.0061099 +59 5500 3000 1500 0 44032 28448 0.019779 0.00677951 +60 5500 3000 1000 500 44032 36169 0.01103 0.0067243 +61 5500 2500 2000 0 44032 28615 0.009844 0.00743325 +62 5500 2500 1500 500 44032 38006 0.012344 0.00659207 +63 5500 2500 1000 1000 55296 38518 0.011663 0.00591452 +64 5500 2000 2000 500 44032 38240 0.013766 0.00638829 +65 5500 2000 1500 1000 55296 38722 0.011271 0.00515596 +66 5500 1500 1500 1500 44032 38789 0.012287 0.0047751 +67 6000 4000 0 0 38400 22867 0.013299 0.00821315 +68 6000 3500 500 0 38400 27824 0.005183 0.00406772 +69 6000 3000 1000 0 38400 27984 0.007732 0.00514799 +70 6000 3000 500 500 38912 31094 0.007959 0.00548475 +71 6000 2500 1500 0 44032 28329 0.007077 0.00581258 +72 6000 2500 1000 500 44032 35233 0.009124 0.00591084 +73 6000 2000 2000 0 44032 28407 0.010302 0.0061863 +74 6000 2000 1500 500 44032 36633 0.012276 0.00607037 +75 6000 2000 1000 1000 44032 37929 0.011291 0.00584646 +76 6000 1500 1500 1000 44032 38366 0.011984 0.00567917 +77 6500 3500 0 0 44032 23627 0.011354 0.00621458 +78 6500 3000 500 0 44032 27794 0.004633 0.00351016 +79 6500 2500 1000 0 44032 27973 0.007145 0.00422703 +80 6500 2500 500 500 44032 30047 0.006598 0.00448109 +81 6500 2000 1500 0 44032 28185 0.005877 0.00470144 +82 6500 2000 1000 500 44032 33262 0.009426 0.00496005 +83 6500 1500 1500 500 44032 34191 0.008688 0.00517086 +84 6500 1500 1000 1000 44032 36145 0.007489 0.00515506 +85 7000 3000 0 0 44032 24141 0.00866 0.00462356 +86 7000 2500 500 0 44032 27750 0.00401 0.00293215 +87 7000 2000 1000 0 44032 27891 0.004106 0.00339487 +88 7000 2000 500 500 44032 29102 0.005206 0.00362273 +89 7000 1500 1500 0 44032 27845 0.004573 0.00363083 +90 7000 1500 1000 500 44032 30590 0.005665 0.00398954 +91 7000 1000 1000 1000 44032 32449 0.005882 0.0041292 +92 7500 2500 0 0 44032 23780 0.010205 0.0037286 +93 7500 2000 500 0 44032 27753 0.004197 0.00237736 +94 7500 1500 1000 0 44032 27733 0.005613 0.00264897 +95 7500 1500 500 500 44032 28404 0.007355 0.0028212 +96 7500 1000 1000 500 44032 29004 0.004344 0.0029863 +97 8000 2000 0 0 44032 22568 0.007297 0.00327052 +98 8000 1500 500 0 44032 27708 0.00356 0.00190179 +99 8000 1000 1000 0 44032 27735 0.002759 0.00200229 +100 8000 1000 500 500 44032 28011 0.003163 0.00212963 +101 8500 1500 0 0 44032 20675 0.003621 0.00259718 +102 8500 1000 500 0 44032 26948 0.004295 0.00179796 +103 8500 500 500 500 44032 27643 0.004833 0.00163705 +104 9000 1000 0 0 35584 19804 0.00479 0.0017373 +105 9000 500 500 0 35584 22185 0.002986 0.00187585 +106 9500 500 0 0 35584 16993 0.002408 0.00158649 +107 10000 0 0 0 11008 11008 0.001418 0.000771659 diff --git a/RHF_10000/plot/Result_experiment2.txt b/RHF_10000/plot/Result_experiment2.txt new file mode 100755 index 0000000..9db84d6 --- /dev/null +++ b/RHF_10000/plot/Result_experiment2.txt @@ -0,0 +1,19 @@ +1000 experiments. StorageCost in bits, Time in seconds. +output_count maxStorageCost avgStorageCost maxTime avgTime +4 44032 38963 0.005209 0.00386465 +5 76800 39048 0.006006 0.00522201 +6 44032 38993 0.011983 0.0069242 +7 55296 39128 0.012286 0.00882618 +8 44032 40729 0.015592 0.00908617 +9 71168 43603 0.015136 0.00614523 +10 71168 44065 0.016717 0.00576306 +11 88064 44076 0.007484 0.00600278 +12 71168 44059 0.009743 0.00626733 +13 71168 44070 0.010664 0.00650759 +14 71168 44070 0.009996 0.00667625 +15 71168 44070 0.011516 0.00689411 +16 71168 44070 0.010937 0.00707204 +17 71168 44081 0.011445 0.00722594 +18 71168 44070 0.010352 0.00734663 +19 71168 44070 0.010546 0.00747854 +20 71168 44059 0.009005 0.00763231 diff --git a/RHF_10000/plot/Sorted_result_experiment1.txt b/RHF_10000/plot/Sorted_result_experiment1.txt new file mode 100755 index 0000000..80f8bce --- /dev/null +++ b/RHF_10000/plot/Sorted_result_experiment1.txt @@ -0,0 +1,110 @@ +1000 experiments. StorageCost in bits, Time in seconds. +trial n_a n_b n_c n_d maxStorageCost avgStorageCost maxTime avgTime +0 2500 2500 2500 2500 44032 38963 0.008488 0.00387344 +4 3000 2500 2500 2000 44032 38968 0.006007 0.00379183 +3 3000 3000 2000 2000 44032 38958 0.00742 0.00363975 +2 3000 3000 2500 1500 55296 38984 0.006438 0.00356052 +13 3500 2500 2000 2000 44032 38963 0.007811 0.00362197 +12 3500 2500 2500 1500 44032 38963 0.00591 0.003538 +1 3000 3000 3000 1000 44032 38958 0.005525 0.0033471 +11 3500 3000 2000 1500 44032 38952 0.004977 0.00344995 +10 3500 3000 2500 1000 44032 38958 0.004497 0.00331568 +9 3500 3000 3000 500 44032 38951 0.01835 0.00325412 +26 4000 2000 2000 2000 44032 38978 0.004046 0.00336652 +25 4000 2500 2000 1500 55296 38989 0.006646 0.0032704 +24 4000 2500 2500 1000 44032 38971 0.017721 0.00315051 +6 3500 3500 2500 500 44032 38927 0.01959 0.0036491 +7 3500 3500 2000 1000 44032 38962 0.016366 0.00315143 +5 3500 3500 3000 0 44032 28739 0.01881 0.0121343 +21 4000 3000 2500 500 44032 38937 0.016861 0.00348684 +22 4000 3000 2000 1000 44032 38982 0.018418 0.00310836 +8 3500 3500 1500 1500 44032 38963 0.004649 0.00323611 +20 4000 3000 3000 0 44032 28867 0.015626 0.0114573 +23 4000 3000 1500 1500 44032 38967 0.016933 0.00315128 +17 4000 3500 2500 0 44032 28806 0.016067 0.0107338 +18 4000 3500 2000 500 44032 38893 0.015539 0.00428406 +37 4500 2500 2500 500 68352 38909 0.015791 0.00437678 +40 4500 2000 2000 1500 71168 38994 0.015962 0.00309033 +38 4500 2500 2000 1000 76800 38989 0.016208 0.00308533 +19 4000 3500 1500 1000 44032 38961 0.015493 0.00318184 +34 4500 3000 2500 0 44032 28829 0.015959 0.0100569 +35 4500 3000 2000 500 44032 38845 0.01539 0.00461985 +39 4500 2500 1500 1500 76800 38992 0.017141 0.00309469 +14 4000 4000 2000 0 44032 28778 0.013249 0.00957661 +36 4500 3000 1500 1000 44032 38946 0.015191 0.00338451 +31 4500 3500 2000 0 44032 28768 0.012722 0.00921696 +15 4000 4000 1500 500 44032 38604 0.016424 0.0059914 +32 4500 3500 1500 500 44032 38626 0.017275 0.00604067 +50 5000 2500 2500 0 44032 28792 0.02251 0.0089721 +51 5000 2500 2000 500 44032 38656 0.018395 0.00545419 +53 5000 2000 2000 1000 44032 38913 0.01668 0.00368963 +16 4000 4000 1000 1000 44032 38831 0.014129 0.0047293 +47 5000 3000 2000 0 44032 28694 0.011437 0.00847675 +54 5000 2000 1500 1500 44032 38950 0.015177 0.0032706 +52 5000 2500 1500 1000 44032 38894 0.020157 0.00383953 +33 4500 3500 1000 1000 44032 38803 0.013796 0.0049355 +29 4500 4000 1500 0 44032 28591 0.014064 0.00805532 +48 5000 3000 1500 500 44032 38387 0.012777 0.00641448 +45 5000 3500 1500 0 44032 28514 0.009658 0.00756403 +49 5000 3000 1000 1000 44032 38746 0.01205 0.00549992 +30 4500 4000 1000 500 44032 37240 0.013351 0.00738324 +61 5500 2500 2000 0 44032 28615 0.009844 0.00743325 +64 5500 2000 2000 500 44032 38240 0.013766 0.00638829 +46 5000 3500 1000 500 44032 36929 0.0102 0.00719422 +62 5500 2500 1500 500 44032 38006 0.012344 0.00659207 +65 5500 2000 1500 1000 55296 38722 0.011271 0.00515596 +59 5500 3000 1500 0 44032 28448 0.019779 0.00677951 +27 4500 4500 1000 0 38912 28038 0.007971 0.00660167 +66 5500 1500 1500 1500 44032 38789 0.012287 0.0047751 +43 5000 4000 1000 0 38912 28219 0.010271 0.00625635 +63 5500 2500 1000 1000 55296 38518 0.011663 0.00591452 +60 5500 3000 1000 500 44032 36169 0.01103 0.0067243 +28 4500 4500 500 500 38912 32264 0.010356 0.00707608 +57 5500 3500 1000 0 38912 28158 0.006863 0.00570807 +44 5000 4000 500 500 44032 32180 0.008296 0.0066525 +73 6000 2000 2000 0 44032 28407 0.010302 0.0061863 +71 6000 2500 1500 0 44032 28329 0.007077 0.00581258 +74 6000 2000 1500 500 44032 36633 0.012276 0.00607037 +76 6000 1500 1500 1000 44032 38366 0.011984 0.00567917 +58 5500 3500 500 500 38912 31644 0.007548 0.0061099 +42 5000 4500 500 0 38400 27820 0.006566 0.00489348 +72 6000 2500 1000 500 44032 35233 0.009124 0.00591084 +75 6000 2000 1000 1000 44032 37929 0.011291 0.00584646 +69 6000 3000 1000 0 38400 27984 0.007732 0.00514799 +56 5500 4000 500 0 38400 27804 0.006127 0.00455191 +70 6000 3000 500 500 38912 31094 0.007959 0.00548475 +81 6500 2000 1500 0 44032 28185 0.005877 0.00470144 +68 6000 3500 500 0 38400 27824 0.005183 0.00406772 +83 6500 1500 1500 500 44032 34191 0.008688 0.00517086 +79 6500 2500 1000 0 44032 27973 0.007145 0.00422703 +82 6500 2000 1000 500 44032 33262 0.009426 0.00496005 +41 5000 5000 0 0 38400 21305 0.019945 0.0122697 +84 6500 1500 1000 1000 44032 36145 0.007489 0.00515506 +55 5500 4500 0 0 38400 21743 0.016146 0.0107387 +80 6500 2500 500 500 44032 30047 0.006598 0.00448109 +78 6500 3000 500 0 44032 27794 0.004633 0.00351016 +67 6000 4000 0 0 38400 22867 0.013299 0.00821315 +89 7000 1500 1500 0 44032 27845 0.004573 0.00363083 +87 7000 2000 1000 0 44032 27891 0.004106 0.00339487 +77 6500 3500 0 0 44032 23627 0.011354 0.00621458 +90 7000 1500 1000 500 44032 30590 0.005665 0.00398954 +86 7000 2500 500 0 44032 27750 0.00401 0.00293215 +88 7000 2000 500 500 44032 29102 0.005206 0.00362273 +91 7000 1000 1000 1000 44032 32449 0.005882 0.0041292 +85 7000 3000 0 0 44032 24141 0.00866 0.00462356 +94 7500 1500 1000 0 44032 27733 0.005613 0.00264897 +93 7500 2000 500 0 44032 27753 0.004197 0.00237736 +96 7500 1000 1000 500 44032 29004 0.004344 0.0029863 +95 7500 1500 500 500 44032 28404 0.007355 0.0028212 +92 7500 2500 0 0 44032 23780 0.010205 0.0037286 +99 8000 1000 1000 0 44032 27735 0.002759 0.00200229 +98 8000 1500 500 0 44032 27708 0.00356 0.00190179 +100 8000 1000 500 500 44032 28011 0.003163 0.00212963 +97 8000 2000 0 0 44032 22568 0.007297 0.00327052 +102 8500 1000 500 0 44032 26948 0.004295 0.00179796 +101 8500 1500 0 0 44032 20675 0.003621 0.00259718 +103 8500 500 500 500 44032 27643 0.004833 0.00163705 +105 9000 500 500 0 35584 22185 0.002986 0.00187585 +104 9000 1000 0 0 35584 19804 0.00479 0.0017373 +106 9500 500 0 0 35584 16993 0.002408 0.00158649 +107 10000 0 0 0 11008 11008 0.001418 0.000771659 diff --git a/RHF_10000/plot/plot_experiment1.py b/RHF_10000/plot/plot_experiment1.py new file mode 100755 index 0000000..cf41c9c --- /dev/null +++ b/RHF_10000/plot/plot_experiment1.py @@ -0,0 +1,65 @@ +import matplotlib.pyplot as plt +import numpy as np +import xlrd +import math +import sys +import csv +import matplotlib.ticker as mtick + +def main(): + + # f_input = xlrd.open_workbook(r"./comparison.xlsx") + # time_sheet = f_input.sheet_by_name('Space') + num_dataset = 108 + + max_storage = np.zeros((2, num_dataset), dtype=np.float32) + avg_storage = np.zeros((2, num_dataset), dtype=np.float32) + max_time = np.zeros((2, num_dataset), dtype=np.float32) + avg_time = np.zeros((2, num_dataset), dtype=np.float32) + + # with open('Result_experiment1.txt', 'r') as f: + with open('Sorted_result_experiment1.txt', 'r') as f: + list1 = f.readlines() + line_n = 0 + for i in range(2, len(list1)): + temp_list = list1[i].split() + + max_storage[0][line_n] = float(temp_list[5])/1000 + avg_storage[0][line_n] = float(temp_list[6])/1000 + max_time[0][line_n] = float(temp_list[7])*1000 + avg_time[0][line_n] = float(temp_list[8])*1000 + + line_n += 1 + + + xlabel = [l for l in range(num_dataset)] + positions = np.arange(num_dataset) + + fig, ax1 = plt.subplots() + + # histogram of storage + ax1.bar(xlabel, max_storage[0][:], width=0.8, align='center', color='y', label=u"Max storage") + ax1.bar(xlabel, avg_storage[0][:], width=0.8, align='center', color='c', label=u"Avg storage") + ax1.set_xticks(positions) + ax1.set_xticklabels(xlabel,rotation=90,fontsize=9) + ax1.set_xlabel('Dataset sorted by variance',fontsize=24) + ax1.set_ylabel('Function Size (Kbit)',fontsize=24) + ax1.set_yticklabels(['0','10','20','30','40','50','60','70','80'], fontsize=18) + + # line chart of time + ax2 = ax1.twinx() + ax2.plot(xlabel,max_time[0][:],'ro-',ms=2,label='Max time') + ax2.plot(xlabel,avg_time[0][:],'ko-',ms=2,label='Avg time') + ax2.tick_params(labelsize=18) + ax2.set_ylabel('Construction Time (ms)',fontsize=24) + + # legend + handles1, labels1 = ax1.get_legend_handles_labels() + handles2, labels2 = ax2.get_legend_handles_labels() + plt.legend(handles1+handles2, labels1+labels2, loc='upper right', fontsize=18) + plt.show() + + # plt.show() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/RHF_10000/plot/plot_experiment2.py b/RHF_10000/plot/plot_experiment2.py new file mode 100755 index 0000000..65b066d --- /dev/null +++ b/RHF_10000/plot/plot_experiment2.py @@ -0,0 +1,74 @@ +import matplotlib.pyplot as plt +import numpy as np +import xlrd +import math +import sys +import csv +import matplotlib.ticker as mtick + +def main(): + plt.rcParams['font.family'] = 'Times New Roman' + + # f_input = xlrd.open_workbook(r"./comparison.xlsx") + # time_sheet = f_input.sheet_by_name('Space') + num_dataset = 17 + + max_storage = np.zeros((2, num_dataset), dtype=np.float32) + avg_storage = np.zeros((2, num_dataset), dtype=np.float32) + max_time = np.zeros((2, num_dataset), dtype=np.float32) + avg_time = np.zeros((2, num_dataset), dtype=np.float32) + + with open('Result_experiment2.txt', 'r') as f: + list1 = f.readlines() + line_n = 0 + for i in range(2, len(list1)): + temp_list = list1[i].split() + + max_storage[0][line_n] = float(temp_list[1])/1000 + avg_storage[0][line_n] = float(temp_list[2])/1000 + max_time[0][line_n] = float(temp_list[3])*1000 + avg_time[0][line_n] = float(temp_list[4])*1000 + + line_n += 1 + + xlabel = [l for l in range(4,num_dataset+4,1)] + positions = np.arange(num_dataset) + + fig, ax1 = plt.subplots() + + ax1.bar(xlabel, max_storage[0][:], width=0.8, align='center', color='y', label=u"Max storage") + ax1.bar(xlabel, avg_storage[0][:], width=0.8, align='center', color='c', label=u"Avg storage") + ax1.set_xticks(xlabel) + ax1.set_xticklabels(xlabel) + ax1.set_xlabel('Num of output interface',fontsize=24) + ax1.set_ylabel('Function Size (Kbit)',fontsize=24) + ax1.set_yticklabels(['0','20','40','60','80','100'], fontsize=20) + ax1.tick_params(labelsize=20) + + # max storage label + max_max_score = max(max_storage[0][:]) + ax1.set_ylim(0, int(max_max_score * 1.2)) + for x,y in zip(xlabel, max_storage[0][:]): + ax1.text(x, y + max_max_score * 0.04, y, ha='center', va='center', fontsize=11) + + # avg storage label + max_avg_score = max(avg_storage[0][:]) + # ax1.set_ylim(0, int(max_avg_score * 1.2)) + for x,y in zip(xlabel, avg_storage[0][:]): + ax1.text(x, y - max_avg_score * 0.08, y, ha='center', va='center', fontsize=11) + + # line chart of time + ax2 = ax1.twinx() + ax2.plot(xlabel,max_time[0][:],'ro-',ms=4,label='Max time') + ax2.plot(xlabel,avg_time[0][:],'ko-',ms=4,label='Avg time') + ax2.tick_params(labelsize=20) + ax2.set_ylabel('Construction Time (ms)',fontsize=24) + + # legend + handles1, labels1 = ax1.get_legend_handles_labels() + handles2, labels2 = ax2.get_legend_handles_labels() + plt.legend(handles1+handles2, labels1+labels2, loc='upper right', fontsize=15) + plt.show() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/RHF_10000/plot/sort_variance_experiment1.py b/RHF_10000/plot/sort_variance_experiment1.py new file mode 100755 index 0000000..0f7e5da --- /dev/null +++ b/RHF_10000/plot/sort_variance_experiment1.py @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import numpy as np +import xlrd +import math +import sys +import csv +import matplotlib.ticker as mtick + +def main(): + + # f_input = xlrd.open_workbook(r"./comparison.xlsx") + # time_sheet = f_input.sheet_by_name('Space') + num_dataset = 108 + + fo = open('Sorted_result_experiment1.txt', 'w') + + with open('Result_experiment1.txt', 'r') as f: + list1 = f.readlines() + fo.write(list1[0]) + fo.write(list1[1]) + line_n = 0 + variance_list = np.zeros((num_dataset), dtype=np.float32) + for i in range(2, len(list1)): + temp_list = list1[i].split() + temp_var = np.var([int(temp_list[0]),int(temp_list[1]),int(temp_list[2]),int(temp_list[3])]) + variance_list[i-2] = temp_var + line_n += 1 + print(line_n) + ind_list = np.argsort(variance_list) + for ind in ind_list: + fo.write(list1[ind+2]) + fo.close() + + # plt.show() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/RHF_10000/pn_data/Config_exp0.py b/RHF_10000/pn_data/Config_exp0.py new file mode 100755 index 0000000..5367100 --- /dev/null +++ b/RHF_10000/pn_data/Config_exp0.py @@ -0,0 +1,27 @@ +import sys +import os +import random +import numpy as np + +if __name__=='__main__': + f = open("Config_exp0.txt","w") + count = 0 + for a in range(2500,10001,500): + for b in range(a,-1,-500): + if (a+b) > 10000: + continue + for c in range(b,-1,-500): + if (a+b+c) > 10000: + continue + for d in range(c,-1,-500): + if (a+b+c+d) == 10000: + count += 1 + print(str(a)+" "+str(b)+" "+str(c)+" "+str(d)) + f.write(str(a)+" "+str(b)+" "+str(c)+" "+str(d)+"\n") + else: + continue + print("finish") + print(count) + f.close() + + diff --git a/RHF_10000/pn_data/Config_exp0.txt b/RHF_10000/pn_data/Config_exp0.txt new file mode 100755 index 0000000..7ef1e1c --- /dev/null +++ b/RHF_10000/pn_data/Config_exp0.txt @@ -0,0 +1,108 @@ +2500 2500 2500 2500 +3000 3000 3000 1000 +3000 3000 2500 1500 +3000 3000 2000 2000 +3000 2500 2500 2000 +3500 3500 3000 0 +3500 3500 2500 500 +3500 3500 2000 1000 +3500 3500 1500 1500 +3500 3000 3000 500 +3500 3000 2500 1000 +3500 3000 2000 1500 +3500 2500 2500 1500 +3500 2500 2000 2000 +4000 4000 2000 0 +4000 4000 1500 500 +4000 4000 1000 1000 +4000 3500 2500 0 +4000 3500 2000 500 +4000 3500 1500 1000 +4000 3000 3000 0 +4000 3000 2500 500 +4000 3000 2000 1000 +4000 3000 1500 1500 +4000 2500 2500 1000 +4000 2500 2000 1500 +4000 2000 2000 2000 +4500 4500 1000 0 +4500 4500 500 500 +4500 4000 1500 0 +4500 4000 1000 500 +4500 3500 2000 0 +4500 3500 1500 500 +4500 3500 1000 1000 +4500 3000 2500 0 +4500 3000 2000 500 +4500 3000 1500 1000 +4500 2500 2500 500 +4500 2500 2000 1000 +4500 2500 1500 1500 +4500 2000 2000 1500 +5000 5000 0 0 +5000 4500 500 0 +5000 4000 1000 0 +5000 4000 500 500 +5000 3500 1500 0 +5000 3500 1000 500 +5000 3000 2000 0 +5000 3000 1500 500 +5000 3000 1000 1000 +5000 2500 2500 0 +5000 2500 2000 500 +5000 2500 1500 1000 +5000 2000 2000 1000 +5000 2000 1500 1500 +5500 4500 0 0 +5500 4000 500 0 +5500 3500 1000 0 +5500 3500 500 500 +5500 3000 1500 0 +5500 3000 1000 500 +5500 2500 2000 0 +5500 2500 1500 500 +5500 2500 1000 1000 +5500 2000 2000 500 +5500 2000 1500 1000 +5500 1500 1500 1500 +6000 4000 0 0 +6000 3500 500 0 +6000 3000 1000 0 +6000 3000 500 500 +6000 2500 1500 0 +6000 2500 1000 500 +6000 2000 2000 0 +6000 2000 1500 500 +6000 2000 1000 1000 +6000 1500 1500 1000 +6500 3500 0 0 +6500 3000 500 0 +6500 2500 1000 0 +6500 2500 500 500 +6500 2000 1500 0 +6500 2000 1000 500 +6500 1500 1500 500 +6500 1500 1000 1000 +7000 3000 0 0 +7000 2500 500 0 +7000 2000 1000 0 +7000 2000 500 500 +7000 1500 1500 0 +7000 1500 1000 500 +7000 1000 1000 1000 +7500 2500 0 0 +7500 2000 500 0 +7500 1500 1000 0 +7500 1500 500 500 +7500 1000 1000 500 +8000 2000 0 0 +8000 1500 500 0 +8000 1000 1000 0 +8000 1000 500 500 +8500 1500 0 0 +8500 1000 500 0 +8500 500 500 500 +9000 1000 0 0 +9000 500 500 0 +9500 500 0 0 +10000 0 0 0 diff --git a/RHF_10000/pn_data/Config_exp1.py b/RHF_10000/pn_data/Config_exp1.py new file mode 100755 index 0000000..2d0b14a --- /dev/null +++ b/RHF_10000/pn_data/Config_exp1.py @@ -0,0 +1,242 @@ +import sys +import math +import os +import random +import numpy as np + +# The 5 assumptions for experiment1: +# 1, 10000 nodes in total. Among the 10000 nodes, x nodes have 1-to-1 connection with x ground stations. +# The rest (10000 - 2x) nodes are satellite nodes without ground connection. + +# 2, The topology of the (10000 - x) satellite nodes are assumed as 2-D torus at the current stage. + +# 3, The polar constellation has r orbits. Each orbit has c satellites. +# Parameters satisfy the following fomular: +# 10000 - x = r * c + +# 4, We name satellite as "s". +# There are (10000 - x) data sets in total. We start from s(0) to s(10000 - x - 1). +# For each data set, we pick the satellite s(temp) as the source of packet. +# The destination of packet iterate from s(0) to s(9999), which gives 10000 source-destination pairs. + +# 5, Each pair only has one path. This means the packet in the source satellite only has one output interface number (pn). +# We choose the shortest path to determine the pn for each source satellite. Two scenarios are implemented for balanced and unbalanced distributions. + +# The function get_pn1() calculates the pn value for each (source, destination) satellite pair +# The next hop of source satellite always prefer the direction with longer distance +# for example, +# source:(0,0), dest:(4,6),the next hop would be top +# source:(8,8), dest:(2,4),the next hop would be left +# When multiple paths have the same distance, we assign priority as follows: +# 1st (highest priority): pn = 1 , to the top +# 2nd: pn = 3 , to the bottom +# 3rd: pn = 2 , to the right +# 4th: pn = 0 (including the case when source and destination nodes are the same satellite) , to the left + +# the outcome of this file is to provide the distributions of the number of pn=0, pn=1, pn=2, pn=3 as: +# npn0 npn1 npn2 npn3 +# for example: +# 3500 2500 2500 1500 means: +# 3500 data paths go through interface 0, 2500 paths go through interface 1 +# 2500 data paths go through interface 2, 1500 paths go through interface 3 +# the result format is the same as experiment 0 + +def get_pn1(sx,sy,dx,dy): + pn = 0 + # for distance in the inner direction + x1 = abs(dx-sx) + y1 = abs(dy-sy) + # for distance in the outer direction + x2 = c-abs(dx-sx) + y2 = r-abs(dy-sy) + if(dy == sy): + # in the same row, only decide to go left(pn=0) or right(pn=2) + if(sx < dx): + if(x1 <= x2): + pn = 2 + else: + pn = 0 + elif(sx > dx): + if(x1 < x2): + pn = 0 + else: + pn = 2 + else: + pn = 0 # source and dest are the same satellite + elif(dx == sx): + # in the same column, only decide to go top(pn=1) or bottom(pn=3) + if(sy < dy): + if(y1 <= y2): + pn = 1 + else: + pn = 3 + elif(sy > dy): + if(y1 < y2): + pn = 3 + else: + pn = 1 + elif(min(x1, x2) < min(y1,y2)): + # only decide to go left(pn=0) or right(pn=2) + if(sx < dx): + if(x1 <= x2): + pn = 2 + else: + pn = 0 + elif(sx > dx): + if(x1 < x2): + pn = 0 + else: + pn = 2 + else: + # only decide to go top(pn=1) or bottom(pn=3) + if(sy < dy): + if(y1 <= y2): + pn = 1 + else: + pn = 3 + elif(sy > dy): + if(y1 < y2): + pn = 3 + else: + pn = 1 + else: + pn = 1 + return pn + +# get_pn2(): +# If the intra-orbit satellite has much bigger bandwidth than inter-orbit satellite. We can choose the following function: +# The next hop of source satellite always prefer the top-bottom directions against left-right directions, +# this give us an unbalanced pn distribution. +# When multiple paths have the same distance, we assign priority as follows: +# 1st (highest priority): pn = 1 , to the top +# 2nd: pn = 3 , to the bottom +# 3rd: pn = 2 , to the right +# 4th: pn = 0 (including the case when source and destination nodes are the same satellite) , to the left +# def get_pn2(sx,sy,dx,dy): +# pn = 0 +# x1 = abs(dx-sx) +# x2 = c-abs(dx-sx) +# y1 = abs(dy-sy) +# y2 = r-abs(dy-sy) +# # current dest satellite: (dx,dy), +# # calculate the shortest path from (sx,sy) to (dx,dy) +# # and determine the output interface number (pn) for the source satellite +# if(dy == sy): +# # in the same row, only decide to go left(pn=0) or right(pn=2) +# if(sx < dx): +# if(x1 <= x2): +# pn = 2 +# else: +# pn = 0 +# elif(sx > dx): +# if(x1 < x2): +# pn = 0 +# else: +# pn = 2 +# else: +# pn = 0 # source and dest are the same satellite +# else: +# # in different rows, first send to the neighbor in the same orbit +# # go top or go bottom +# if(sy < dy): +# if(y1 <= y2): +# pn = 1 +# else: +# pn = 3 +# elif(sy > dy): +# if(y1 < y2): +# pn = 3 +# else: +# pn = 1 +# return pn + +def calculate(sx,sy,c,r, x_list): + npn0 = 0 + npn1 = 0 + npn2 = 0 + npn3 = 0 + + for dx in range(0, c, 1): + for dy in range(0, r, 1): + pn = get_pn1(sx,sy,dx,dy) + if(pn == 0): + npn0 += 1 + if(pn == 1): + npn1 += 1 + if(pn == 2): + npn2 += 1 + if(pn == 3): + npn3 += 1 + # for the randomized x ground stations, determine their pn + for x in x_list: + dx_x = int(x/r) + dy_x = int(x%r) + pn = get_pn1(sx,sy,dx_x,dy_x) + if(pn == 0): + npn0 += 1 + if(pn == 1): + npn1 += 1 + if(pn == 2): + npn2 += 1 + if(pn == 3): + npn3 += 1 + + return npn0,npn1,npn2,npn3 + +n = 10000 # each set has n input addresses + +if __name__=='__main__': + # f = open("Config_exp1.txt","w") + + #for statistics + #[npn0, npn1, npn2, npn3] + max_var = 0 + min_var = sys.maxsize + max_npn = 0 + min_npn = n + # for the rest 10000 - x satellites, the number of orbits is c. + for c in range(90,190,10): + # we assume x increases from 100 to 1000, step = 100, this gives 10 cases. + for x in range(100, 1001, 100): # x can not be larger than n/2 + # each orbit has r satellites: r = (10000 - x) / 100 + r = int((n - x) / c) + # generate x random and unique numbers from 0 to (n - x - 1) + x_list = [] + i = 0 + while(i < x): + tmp_x = int(random.uniform(0, n-x)) + if (tmp_x not in x_list): + x_list.append(tmp_x) + i += 1 + + # for source satellite + # sx is the column number(orbit number), sy is the row number(satellite number in an orbit) + for sx in range(0, c, 1): + for sy in range(0, r, 1): + # the position of current source satellite is: (sx, sy) + # we calculate the 10000 pn for the current satellite, using dj + npn0,npn1,npn2,npn3 = calculate(sx, sy, c, r, x_list) + print(str(npn0)+" "+str(npn1)+" "+str(npn2)+" "+str(npn3)) + # f.write(str(npn0)+" "+str(npn1)+" "+str(npn2)+" "+str(npn3)+"\n") + # get global info for statistics + var = np.var([npn0,npn1,npn2,npn3]) + if(var>max_var): max_var = var + if(varmax_npn): max_npn = max_npn_cur + min_npn_cur = min(npn0,npn1,npn2,npn3) + if(min_npn_cur +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//------------------------------------------------------------------------------ +using namespace std; + +//------------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + int nHash = 10000; + int pnMax = 4; // each node has pnMax outcomes + // get number of lines: n + ifstream fin1("Config0.txt"); + char c; + int n = 0; + while (fin1.get(c)) + { + if (c == '\n') + n++; + } + cout << "line count:" << n << endl; + fin1.close(); + + int cInterval[n][pnMax]; + // fill the cInterval[][] + ifstream fin("Config0.txt"); + int lineN = 0; + string line; + while (getline(fin, line)) + { + if (line.size() == 0) + { + cout << lineN << endl; + break; + } + //cout << "line:" << line << endl; + istringstream sin(line); //create string input object + vector Waypoints; + string info; + while (getline(sin, info, ' ')) + { + //cout << "info:" << info << endl; + Waypoints.push_back(info); + } + + int sum = 0; + for (int itr=0; itr> x; + cInterval[lineN][itr] = x; + sum += x; + } + assert(sum == nHash); + // cout << lineN <<": " << cInterval[lineN][0] << " " << cInterval[lineN][1] + // << " " << cInterval[lineN][2] << " " << cInterval[lineN][3] << endl; + + lineN++; + } + fin.close(); + + // int nHash = 10000; + // string path = argv[2]; + int nTrial = n + 1; + + for (int t=0; t < nTrial; t++) + { + int port[nHash]; + int count = 0; + for (int itv=0; itv 0) + { + port[count++] = itv+1; + c--; + } + } + if(count != nHash) + { + fprintf(stderr,"port number not fully allocated. \r\n"); + } + } + + return 0; +} +//------------------------------------------------------------------------------ diff --git a/RHF_10000/routerFuncData/README.md b/RHF_10000/routerFuncData/README.md new file mode 100755 index 0000000..6e40b25 --- /dev/null +++ b/RHF_10000/routerFuncData/README.md @@ -0,0 +1 @@ +This folder contains generated RHF function parameters. diff --git a/RHF_10000/router_mega/Allocator.h b/RHF_10000/router_mega/Allocator.h new file mode 100755 index 0000000..26a51e7 --- /dev/null +++ b/RHF_10000/router_mega/Allocator.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- +#ifndef AllocatorH +#define AllocatorH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +enum TAllocConsts +{ +#ifdef __BORLANDC__ + acDefAlign = sizeof(int), +#else + acDefAlign = 32, +#endif +}; +//--------------------------------------------------------------------------- +class TAllocator +{ +public: + char *Malloc(size_t size,int align=acDefAlign); + char *Realloc(void *mem,size_t size,int align=acDefAlign,size_t oldSize=0); + void Free(void *mem); +}; +//--------------------------------------------------------------------------- +extern TAllocator defAllocator; +//--------------------------------------------------------------------------- +//#if !defined(WIN32) && !defined(_WIN32) +//#include +//#else +void *vmalloc(size_t sz); +void vfree(void *mem); +//#endif//WIN32 +//--------------------------------------------------------------------------- +void *vmallocReserve(size_t sz); +bool vmallocCommit(void* ptr,size_t sz); +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_10000/router_mega/AllocatorBase.cpp b/RHF_10000/router_mega/AllocatorBase.cpp new file mode 100755 index 0000000..12bf882 --- /dev/null +++ b/RHF_10000/router_mega/AllocatorBase.cpp @@ -0,0 +1,5 @@ +//---- -------------------------------------------------------------------------------------------------------- +#include "Allocator.h" +//---- -------------------------------------------------------------------------------------------------------- +TAllocator defAllocator; +//---- -------------------------------------------------------------------------------------------------------- diff --git a/RHF_10000/router_mega/AllocatorC.cpp b/RHF_10000/router_mega/AllocatorC.cpp new file mode 100755 index 0000000..a9743ef --- /dev/null +++ b/RHF_10000/router_mega/AllocatorC.cpp @@ -0,0 +1,44 @@ +//--------------------------------------------------------------------------- +#include "Allocator.h" +#include +#include +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +// If there is no suitable allocator, use the default C allocator. +//--------------------------------------------------------------------------- +char *TAllocator::Malloc(size_t size,int align) +{ + logEmbdMsg("Prepare alloc %d-byte memory of align %d.\r\n",(int)size,align); +// #ifndef __LSeRTOS__ +// assert(align<=(int)sizeof(int)); +// #endif // __LSeRTOS__ + return (char*)malloc(size); +} +//--------------------------------------------------------------------------- +char *TAllocator::Realloc(void *mem,size_t size,int align,size_t oldSize) +{ + logEmbdMsg("Realloc %d-byte memory of align %d.\r\n",(int)size,align); +#ifndef __LSeRTOS__ + if(align>(int)sizeof(void *)) + { + char *p = Malloc(size,align); + if(p==NULL) + return NULL; + //This is WRONG. We should query the actual size of mem. But we havn't that interface yet. + if(oldSize==0) + oldSize = size; + memcpy(p,mem,oldSize); + Free(mem); + return p; + } +#endif // __LSeRTOS__ + + return (char*)realloc(mem,size); +} +//--------------------------------------------------------------------------- +void TAllocator::Free(void *mem) +{ + free(mem); +} +//--------------------------------------------------------------------------- diff --git a/RHF_10000/router_mega/Array.h b/RHF_10000/router_mega/Array.h new file mode 100755 index 0000000..71a670e --- /dev/null +++ b/RHF_10000/router_mega/Array.h @@ -0,0 +1,320 @@ +#pragma once +#ifndef ArrayH +#define ArrayH +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +// #include "Mem/FastMem.h" +#include +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +#define __is_trivial(x) false +#endif// __BORLANDC__ +//#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#define DefCommArrMath(func,retType) \ + retType func(int64_t num=0) const \ + { \ + if(num<=0) \ + num = Number; \ + \ + return Arr##func(&ObjConst(0),num); \ + } +//--------------------------------------------------------------------------- +// Causion: only one-time allocated array's alignment is preserved! +// Any increasement with New() will break the alignment set by Alloc. +//--------------------------------------------------------------------------- +template +class TArraySafe:public TArrayPubBase +{ +protected: + virtual void CallConstructor(void *obj) const + { + new (obj) T; + } + + virtual void CallDestructor(void *obj) const + { + ((T *)obj)->~T(); + } + + virtual bool IsTrivialElem() const + { + return __is_trivial(T); + } + + virtual int GetTypeSize() const + { + return sizeof(T); + } + +public: + TArraySafe() + { + } + + TArraySafe(int64_t num) + { + Alloc(num); + // Number = num; // allocate number value + } + + virtual ~TArraySafe() + { + Close(); + } + + void Transfer(TArraySafe &o) + { + Close(); + img = o.img; + len = o.len; + Number = o.Number; + + o.ClearDataNoFree(); + } + + T &New(int64_t expandUnit=64) + { + return *(T*)TArrayPubBase::New(expandUnit); + } + + T &Obj(int64_t i) + { + assert(img); + assert(i>=0); + // assert(i=0); + // assert(i &operator=(TArraySafe &o) + { + Alloc(o.Number); + + for(int64_t i=0;i=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=pos;i--) + Obj(i+newNum) = Obj(i); + } + + return &Obj(pos); + } + + T *SlowDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(delNum>=1); + + int tail = Number-delNum; + + if(keepOrder==false) + { + for(int64_t i=0;i +class TArray:public TArraySafe +{ +public: + TArray() + { + } + + TArray(int64_t num) + :TArraySafe(num) + { + } + + void InitZero() + { + memset(this->img,0,sizeof(T)*this->len); + } + + void FastInit(T val) + { + MemSetType(this->img,val,sizeof(T)*this->len); + } + + void FastCopy(TArray &o,int64_t l=-1) + { + if( (l<0) || (l>o.Number) ) + l = o.Number; + + FastCopy(o(),l); + } + + void FastCopy(T *o,int64_t l) + { + this->Alloc(l); + memcpy(this->img,o,sizeof(T)*l); + TArraySafe::Number = l; + } + + T *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastInsert(pos,newNum,keepOrder); + } + + T *FastDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastDel(pos,delNum,keepOrder); + } + + void FastBInsert(T &obj,TSortCmp cmp,bool canRepeat=false) + { + TArrayPubBase::FastBInsert(&obj,cmp,canRepeat); + } +}; +//--------------------------------------------------------------------------- +typedef TArray TGrayArray; +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH + diff --git a/RHF_10000/router_mega/ArrayPre.cpp b/RHF_10000/router_mega/ArrayPre.cpp new file mode 100755 index 0000000..197aff3 --- /dev/null +++ b/RHF_10000/router_mega/ArrayPre.cpp @@ -0,0 +1,173 @@ +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +TArrayPubBase::~TArrayPubBase() +{ +} +//--------------------------------------------------------------------------- +void TArrayPubBase::Alloc(int64_t maxNum,int align, bool noConstructor) +{ + + logEmbdMsg("Prepare to alloc mem for array num=%d align=%d.\r\n",(int)maxNum,align); + Close(); + + logEmbdMsg("Array close ok.\r\n"); + + int typeSize = GetTypeSize(); + + logEmbdMsg("Get type size=%d ok.\r\n",typeSize); + + int64_t memSize = maxNum*typeSize; +#ifndef XrossCPP_In_64 + assert((memSize>>31)==0);//on 32-bit platforms, no memory alloc can larger than 2GB-1 +#endif // XrossCPP_In_64 + + logEmbdMsg("Ready to alloc %d-byte mem, defAllocator=%p.\r\n",(int)memSize,defAllocator); + // fprintf(stderr,"memSize is: %lu\n", memSize); + // fprintf(stderr,"align is: %d\n", align); + + img = defAllocator.Malloc((size_t)memSize,align); + logEmbdMsg("Alloc returned img=%p.\r\n",img); + + assert(img); + + len = maxNum; + + logEmbdMsg("Ready to call constructor.\r\n"); + + if( (noConstructor==false) && !IsTrivialElem() ) + { + logEmbdMsg("Now call constructor.\r\n"); + + for(int64_t i=0;i=0); + + if(newNum==len) + return; + + if(newNum==0) + { + Close(); + return; + } + + int typeSize = GetTypeSize(); + + if(newNumlen) + { + for(int64_t i=len;i=0) + { + if( (ret!=0) || canRepeat ) + memcpy(New(),key,typeSize); + + return; + } + + int64_t low = 0; + int64_t high = Number; + + while(low>1); + + ret = cmp(&key,img+mid*typeSize); + + if(ret==0) + { + if(canRepeat) + memcpy(FastInsert(mid,1,true),key,typeSize); + + return; + } + + if(ret<0) + high = mid; + else + low = mid+1; + } + + if(cmp(&key,img+low*typeSize)>0) + low ++; + + memcpy(FastInsert(low,1,true),key,typeSize); +} +//--------------------------------------------------------------------------- diff --git a/RHF_10000/router_mega/ArrayPre.h b/RHF_10000/router_mega/ArrayPre.h new file mode 100755 index 0000000..280f812 --- /dev/null +++ b/RHF_10000/router_mega/ArrayPre.h @@ -0,0 +1,289 @@ +#pragma once +#ifndef ArrayPreH +#define ArrayPreH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "SortBase.h" +#include "Allocator.h" +// #include "Mem/FastMem.h" +#include "Type64.h" +//--------------------------------------------------------------------------- +#ifndef NULL +#define NULL 0 +#endif //NULL +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TArrayPubBase +{ +protected: + char *img; + +public: + int64_t len; + int64_t Number; + +protected: + virtual void CallConstructor(void *obj) const = 0; + virtual void CallDestructor(void *obj) const = 0; + virtual bool IsTrivialElem() const = 0; + virtual int GetTypeSize() const = 0; + + void *New(int64_t expandUnit=64) + { + if(Number==len) + ChCapacity(len+expandUnit); + + void *p = img+(size_t)Number*GetTypeSize(); + + Number ++; + + return p; + } + + void *Search(const void *key,TSortCmp cmp,int64_t n=-1) const; + + void *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=0); + assert(pos<=Number); + assert(delNum>=1); + + int typeSize = GetTypeSize(); + int64_t tail = Number-delNum; + char *mPos = img+(size_t)pos*typeSize; + + if(keepOrder==false) + memcpy(mPos,img+(size_t)tail*typeSize,(size_t)delNum*typeSize); + else + memcpy(mPos,mPos+(size_t)delNum*typeSize,(size_t)(tail-pos)*typeSize); + + Number = tail; + + return mPos; + } + + void FastBInsert(void *key,TSortCmp cmp,bool canRepeat=true); + +public: + TArrayPubBase() + { + img = NULL; + len = 0; + Number = 0; + } + + virtual ~TArrayPubBase(); + + void Close(bool noConstructor=false); + + void ClearDataNoFree() + { + img = NULL; + len = 0; + Number = 0; + } + + void Alloc(int64_t maxNum,int align=32, bool noConstructor=false); + void AllocFill(int64_t maxNum,int align=32, bool noConstructor=false) + { + Alloc(maxNum,align,noConstructor); + Number = len; + } + void ChCapacity(int64_t newNum,int align=32); + + int64_t Size() const + { + return Number*GetTypeSize(); + } + + int64_t StorageSize() const + { + return len*GetTypeSize(); + } + + int64_t SpaceSize() const + { + return (len-Number)*GetTypeSize(); + } + + void *ObjAt(int64_t inx) const + { + assert(inx>=0); + assert(inx o.Move(TArray src) + void Move(TArrayPubBase &src) + { + Close(); + + img = src.img; + len = src.len; + Number = src.Number; + + src.img = NULL; + src.len = 0; + src.Number = 0; + } + + void Grow(int64_t nGrow) + { + if((Number+nGrow)>len) + ChCapacity(Number+nGrow); + + Number += nGrow; + } +}; +//--------------------------------------------------------------------------- +template +int64_t ArrLargest(T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i*tmp) + { + tmp = array+i; + index = i; + } + } + + return index; +} +//--------------------------------------------------------------------------- +template +int64_t ArrSmallest(const T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i +void ArrMinMax(const T *array,int64_t num,int64_t &minIndex,int64_t &maxIndex) +{ + T *tMin = array; + T *tMax = array; + + int64_t iMin=0, iMax=0; + + for(int64_t i=1;i*tMax) + { + *tMax = array+i; + iMax = i; + } + } + + minIndex = iMin; + maxIndex = iMax; +} +//--------------------------------------------------------------------------- +template +void ArrTotal(const T *array,int64_t num,T &ret) +{ + ret = array[0]; + + for(int64_t i=1;i +inline void ArrMean(const T *array,int64_t num,T &ret) +{ + T tmp; + + ArrTotal(array,num,tmp); + + ret = tmp/num; +} +//--------------------------------------------------------------------------- +//base e entropy +//--------------------------------------------------------------------------- +template +double ArrEntropyE(const T *array,int64_t num) +{ + T sum; + + ArrTotal(array,num,sum); + + double e = 0; + double m = 1.0/sum; + + for(int64_t i=0;i1e-30) + e -= t*log(t); + } + + return e; +} +//--------------------------------------------------------------------------- +template +inline double ArrEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)*1.4426950408889634073599246810019; //log2(e) +} +//--------------------------------------------------------------------------- +template +inline double ArrNormEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)/log(num); +} +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH diff --git a/RHF_10000/router_mega/Builder/PerfectRouterBuilder1.cpp b/RHF_10000/router_mega/Builder/PerfectRouterBuilder1.cpp new file mode 100755 index 0000000..263f34c --- /dev/null +++ b/RHF_10000/router_mega/Builder/PerfectRouterBuilder1.cpp @@ -0,0 +1,165 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include "PerfectRouterBuilder1.h" +#include "../IntUtils.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint32_t startPos; + int32_t nItem; + int index; +}; +//--------------------------------------------------------------------------- +int CmpSlot1(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectRouterBuilder1::Build(int *pn, uint32_t *hash,int nHash,int nBucket,int nSlot) +{ + if(nSlot==0) + return false; + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + throw "exception, nBucket is zero!"; + return false; + } + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + // bit-shift represents the mod operation + int bucketWidth = (int) (log(nBucket)/log(2)); + int shiftBucket = 32 - bucketWidth; + + int nSlotWidth = (int)(log(nSlot)/log(2)); + int shiftSlot = 32 - nSlotWidth; + + // update information for each slot + for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + slots[idx].nItem ++; + slots[idx].index = idx; + } + + // begin key - item mapping + slots[0].startPos = slots[0].nItem-1; + + for(int i=1;i sortedHash; + sortedHash.AllocFill(nHash); + TArray sortedPn; + sortedPn.AllocFill(nHash); + + for(int i=0;i> shiftSlot; // uint32_t idx = hash[i]%nSlot; + + sortedHash[slots[idx].startPos] = hash[i]; + sortedPn[slots[idx].startPos] = pn[i]; + slots[idx].startPos --; + } + // finish key - item mapping + + // sort slot using number of items, in descending order + slots.QSort(CmpSlot1); + + // initialize dArray, bucketArray and bucketItemStack + dArray.AllocFill(nSlot * 4); // 16bit x nSlot + dArray.InitZero(); + + bucketArray.AllocFill(nBucket * 4); // 32bit x number of buckets + bucketArray.InitZero(); + + bucketItemStack.AllocFill(slots[0].nItem * 4); // 32bit x item number of slots[0] + bucketItemStack.InitZero(); + + /* begin building */ + for(int i=0;i> 10; + // x_key = x_key ^ (x_key >> 1); + int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + int pnGT = sortedPn[startPos+j]; + + if (bucketArray[f] > 0) + { + if (bucketArray[f] == pnGT) + { + bucketItemStack[j] = nBucket; // mark as bad value + continue; + } else + { + int j1 = j; + while(j1>0) + { + j1--; + if (bucketItemStack[j1] < nBucket) + { + bucketArray[bucketItemStack[j1]] = 0; // not bad value, delete + } + } + fail = 1; + break; + } + } else + { + bucketArray[f] = pnGT; + bucketItemStack[j] = f; + } + } + if(fail==0) // current d is successfully found + { + dArray[index] = d; // int idx_d = sortedHash[]%nSlot; + break; + } + } + if(fail==1) // we can't find suitable d in [0,maxD-1], building failure + { + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return false; + } + } + /* end building */ + + // if success, update the r and m for nSlot and nBucket + // bucketArray, dArray already updated + r = nSlot; + m = nBucket; + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_10000/router_mega/Builder/PerfectRouterBuilder1.h b/RHF_10000/router_mega/Builder/PerfectRouterBuilder1.h new file mode 100755 index 0000000..201b8a0 --- /dev/null +++ b/RHF_10000/router_mega/Builder/PerfectRouterBuilder1.h @@ -0,0 +1,112 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterBuilder1H +#define PerfectRouterBuilder1H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//------------------------ not used for now ------------------------------ +// class TBitArray +// { +// public: +// uint32_t *arr; +// int64_t nBit; + +// TBitArray() +// { +// arr = NULL; +// nBit = 0; +// } + +// ~TBitArray() +// { +// Close(); +// } + +// void Close() +// { +// if(arr) +// { +// delete arr; +// nBit = 0; +// } +// } + +// void Alloc(int64_t _nBit) +// { +// Close(); + +// nBit = (_nBit+63)&~63ull; +// arr = new uint32_t[nBit>>6]; // change uint64_t to uint32_t +// ClearAll(); +// } + +// bool operator[](int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6]&(1ull<<(inx&63)))!=0; +// } + +// void SetBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] |= mask; +// } + +// void ClearBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] &= ~mask; +// } + +// void ClearAll() +// { +// assert(arr); +// memset(arr,0,(nBit>>3)); +// } +// };//--------------------------------------------------------------------------- +class TPerfectRouterBuilder1 +{ +public: + uint32_t r; + uint32_t m; + TArray dArray; + TArray bucketArray; + // TArray bucketStack; + TArray bucketItemStack; + + ~TPerfectRouterBuilder1() + { + Close(); + } + + void Close() + { + dArray.Close(); + bucketArray.Close(); + // bucketStack.Close(); + bucketItemStack.Close(); + r = (uint32_t) 0; + m = (uint32_t) 0; + } + + bool Build(int *pn,uint32_t *hash,int nHash,int nBucket=0,int nSlot=400); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectRouterBuilder1 &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_10000/router_mega/CMakeLists.txt b/RHF_10000/router_mega/CMakeLists.txt new file mode 100755 index 0000000..5228f8e --- /dev/null +++ b/RHF_10000/router_mega/CMakeLists.txt @@ -0,0 +1,16 @@ +# CMake 最低版本号要求 +cmake_minimum_required (VERSION 2.8) + +# 项目信息 +project (Generate) + +set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD_REQUIRED True) + +# 指定生成目标 +add_executable(Generate main.cpp Generator.cpp / +CTimer1.cpp / +Builder/PerfectRouterBuilder1.cpp / +Tester/PerfectRouterTester1.cpp / +Performance/Performance.cpp IntUtils.cpp ArrayPre.cpp AllocatorBase.cpp AllocatorC.cpp City64.cpp) + diff --git a/RHF_10000/router_mega/CTimer1.cpp b/RHF_10000/router_mega/CTimer1.cpp new file mode 100755 index 0000000..47664b8 --- /dev/null +++ b/RHF_10000/router_mega/CTimer1.cpp @@ -0,0 +1,178 @@ +#include +#include +#include +#include +#include +#include "CTimer1.h" +#include + +//------------------------------------------------------------------------------ +using namespace std; +struct rmInfo +{ + int nSlot; + int nBucket; + int storageCost; +}; +int CmpRM1(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((rmInfo*)d1)->storageCost - ((rmInfo*)d2)->storageCost ); //Reverse order +} +double CTimer1::getCTime(uint32_t *hash, int *pn,int nHash, uint64_t &maxStorageCost) +{ + /////////////////////////////////// + // we fix the nBucket and nSlot to compare construction time + // nSlot and nBucket "must be" powers of 2. + // start with minimum number slots + int nSlotStart = 256; + int nSlotEnd = 2048; + int nSlotStep = log(int(nSlotEnd/nSlotStart))/log(2) + 1; + // start with minimum number of buckets + int nBucketStart = 4096; + int nBucketEnd = 32768; // this number must be larger than 4 + int nBucketStep = log(int(nBucketEnd/nBucketStart))/log(2) + 1; + + // sort rmArray + TArray rmArray; + rmArray.AllocFill(nSlotStep*nBucketStep); + rmArray.InitZero(); + + int ind = 0; + int r = nSlotStart; + while(r <= nSlotEnd) + { + int m = nBucketStart; + while(m <= nBucketEnd) + { + rmArray[ind].nSlot = r; + rmArray[ind].nBucket = m; + rmArray[ind].storageCost = r*11 + m*2; + m = m * 2; + ind++; + } + r = r * 2; + } + // for (int i=0; i < ind; i++) + // { + // fprintf(stderr,"i: %d, rmArray: %d %d %d \r\n", i, \ + // rmArray[i].nSlot, rmArray[i].nBucket, rmArray[i].storageCost); + // } + // fprintf(stderr,"-----\n"); + rmArray.QSort(CmpRM1); + // for (int i=0; i < ind; i++) + // { + // fprintf(stderr,"i: %d, rmArray: %d %d %d \r\n", i, \ + // rmArray[i].nSlot, rmArray[i].nBucket, rmArray[i].storageCost); + // } + // getchar(); + + // int nBucketStart = 16384; + // int nBucketEnd = 16384; // this number must be larger than 4 + // // start with minimum number slots + // int nSlotStart = 1024; + // int nSlotEnd = 1024; + + int minCost = nSlotEnd*11 + nBucketEnd*2 + 1; + int bestBucketSize = nBucketEnd + 1; + int bestSlotSize = nSlotEnd + 1; + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + // time calculation + struct timeval gStart, gBegin, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + TPerfectRouterBuilder1 myB; + + for (int i=0; i < ind; i++) + { + int nSlot = rmArray[i].nSlot; + int nBucket = rmArray[i].nBucket; + int curCost = nSlot*11 + nBucket*2; + // if (curCost < minCost) + // { + gettimeofday(&gBegin,NULL); + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gBegin.tv_sec + (gEnd.tv_usec - gBegin.tv_usec)/1000000.0; + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"num of slots: %d \r\n", myB.r); + // fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + // fprintf(stderr,"bit memory cost = 11 bit x %d(nSlot) + 2 bit x %d(nBucket) = %d \r\n", myB.r, myB.m, minCost); + storageCost = minCost; + if(maxStorageCost < storageCost){ + // fprintf(stderr,"Current storage cost is: %d bit\n", storageCost); + // fprintf(stderr,"Current maxStorageCost cost is: %d bit\n", maxStorageCost); + // fprintf(stderr,"Current maxStorageCost cost is: %u bit\n", maxStorageCost); + maxStorageCost = storageCost; + } + rmArray.Close(); + myB.Close(); + return timeuse; + } + // } + } + + if (bestBucketSize == nBucketEnd+1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + myB.Close(); + rmArray.Close(); + return timeuse; +} + +double CTimer1::getFileTime(const char * filename, int *pn, uint64_t & maxStorageCost) +{ + uint32_t key[10000]; + int ind = 0; + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 11) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint32_t h = atoi(l.c_str()); + key[ind++] = h; // load the string hash value + } + int nHash = ind; + + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + fprintf(stderr,"nHash: %d\r\n", nHash); + fprintf(stderr,"nHash1: %d\r\n", nHash1); + fprintf(stderr,"check file %s.\r\n", filename); + return 0; + } + + uint32_t *hash = key; + double timeuse; + timeuse = getCTime(hash, pn, nHash, maxStorageCost); + + return timeuse; +} + +//------------------------------------------------------------------------------ diff --git a/RHF_10000/router_mega/CTimer1.h b/RHF_10000/router_mega/CTimer1.h new file mode 100755 index 0000000..dfb7cf2 --- /dev/null +++ b/RHF_10000/router_mega/CTimer1.h @@ -0,0 +1,35 @@ +#include +#include "Builder/PerfectRouterBuilder1.h" +#include "Array.h" + +//--------------------------------------------------------------------------- +#ifndef CTimer1H +#define CTimer1H +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//---------------------------------------------------------------------------、 +class CTimer1 +{ +public: + int storageCost; + + ~CTimer1() + { + Close(); + } + + void Close() + { + storageCost = 0; + } + + double getCTime(uint32_t *hash, int *pn, int nHash, uint64_t &maxStorageCost); + double getFileTime(const char * filename, int *pn, uint64_t &maxStorageCost); +}; + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_10000/router_mega/City64.cpp b/RHF_10000/router_mega/City64.cpp new file mode 100755 index 0000000..3ec6352 --- /dev/null +++ b/RHF_10000/router_mega/City64.cpp @@ -0,0 +1,259 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides CityHash64() and related functions. +// +// It's probably possible to create even faster hash functions by +// writing a program that systematically explores some of the space of +// possible hash functions, by using SIMD instructions, or by +// compromising on hash quality. +// +// Comment by LHZ 2017.5.19: +// This hash function has been tested by the following dataset: +// 1. 2G (items) Chinese word groups from 40G Chinese news text +// 2. 4M Chinese words from 40G Chinese news text +// 3. 1M Chinese words dictionary +// No conflict found yet. + +#include "City64.h" +#include "Type64.h" +#include + +#define Fetch64(x) (*(uint64_t*)(x)) +#define Fetch32(x) (*(uint32_t*)(x)) + +enum +{ +// Some primes between 2^63 and 2^64 for various uses. + k0 = 0xc3a5c85c97cb3127ULL, + k1 = 0xb492b66fbe98f273ULL, + k2 = 0x9ae16a3b2f90404fULL, + k3 = 0xc949d7c7509e6557ULL, +// for Hash128to64 + kMul = 0x9ddfea08eb382d69ULL, +}; +// Hash 128 input bits down to 64 bits of output. +// This is intended to be a reasonably good hash function. +inline uint64_t Hash128to64(uint64_t vL, uint64_t vH) { + // Murmur-inspired hashing. + uint64_t a = (vL ^ vH) * kMul; + a ^= (a >> 47); + uint64_t b = (vH ^ a) * kMul; + b ^= (b >> 47); + b *= kMul; + return b; +} + +// Bitwise right rotate. Normally this will compile to a single +// instruction, especially if the shift is a manifest constant. +inline uint64_t Rotate(uint64_t val, int shift) { + // Avoid shifting by 64: doing so yields an undefined result. + return shift == 0 ? val : ((val >> shift) | (val << (64 - shift))); +} + +// Equivalent to Rotate(), but requires the second arg to be non-zero. +// On x86-64, and probably others, it's possible for this to compile +// to a single instruction if both args are already in registers. +inline uint64_t RotateByAtLeast1(uint64_t val, int shift) { + return (val >> shift) | (val << (64 - shift)); +} + +inline uint64_t ShiftMix(uint64_t val) { + return val ^ (val >> 47); +} + +#define HashLen16 Hash128to64 + +inline uint64_t HashLen0to16(const char *s, size_t len) { + if (len > 8) { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + if (len >= 4) { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + if (len > 0) { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + return k2; +} +/* +inline uint64_t HashLen0to16(const char *s, size_t len) { + static uint8_t off[]={ + 3, + 2,2,2, + 1,1,1,1,1, + 0,0,0,0,0,0,0,0}; + + switch(off[len]) + { + case 0: + { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + case 1: + { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + case 2: + { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + case 3: + return k2; + } +} +*/ + +// This probably works well for 16-byte strings as well, but it may be overkill +// in that case. +inline uint64_t HashLen17to32(const char *s, size_t len) { + uint64_t a = Fetch64(s) * k1; + uint64_t b = Fetch64(s + 8); + uint64_t c = Fetch64(s + len - 8) * k2; + uint64_t d = Fetch64(s + len - 16) * k0; + return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d, + a + Rotate(b ^ k3, 20) - c + len); +} + +// Return a 16-byte hash for 48 bytes. Quick and dirty. +// Callers do best to use "random-looking" values for a and b. +inline void WeakHashLen32WithSeeds(TX128Data &out, + uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) { + a += w; + b = Rotate(b + a + z, 21); + uint64_t c = a; + a += x; + a += y; + b += Rotate(a, 44); + out.u64[0] = a+z; + out.u64[1] = b+c; +} + +// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. +inline void WeakHashLen32WithSeeds(TX128Data &out, + const char* s, uint64_t a, uint64_t b) { + WeakHashLen32WithSeeds(out,Fetch64(s), + Fetch64(s + 8), + Fetch64(s + 16), + Fetch64(s + 24), + a, + b); +} + +// Return an 8-byte hash for 33 to 64 bytes. +inline uint64_t HashLen33to64(const char *s, size_t len) { + uint64_t z = Fetch64(s + 24); + uint64_t a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0; + uint64_t b = Rotate(a + z, 52); + uint64_t c = Rotate(a, 37); + a += Fetch64(s + 8); + c += Rotate(a, 7); + a += Fetch64(s + 16); + uint64_t vf = a + z; + uint64_t vs = b + Rotate(a, 31) + c; + a = Fetch64(s + 16) + Fetch64(s + len - 32); + z = Fetch64(s + len - 8); + b = Rotate(a + z, 52); + c = Rotate(a, 37); + a += Fetch64(s + len - 24); + c += Rotate(a, 7); + a += Fetch64(s + len - 16); + uint64_t wf = a + z; + uint64_t ws = b + Rotate(a, 31) + c; + uint64_t r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0); + return ShiftMix(r * k0 + vs) * k2; +} + +uint64_t CityHash64(const char *s, size_t len) { + if (len <= 32) { + if (len <= 16) { + return HashLen0to16(s, len); + } else { + return HashLen17to32(s, len); + } + } else if (len <= 64) { + return HashLen33to64(s, len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + uint64_t x = Fetch64(s + len - 40); + uint64_t y = Fetch64(s + len - 16) + Fetch64(s + len - 56); + uint64_t z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); + TX128Data v,w; + + WeakHashLen32WithSeeds(v, s + len - 64, len, z); + WeakHashLen32WithSeeds(w, s + len - 32, y + k1, x); + x = x * k1 + Fetch64(s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + len = (len - 1) & ~static_cast(63); + do { + x = Rotate(x + y + v.u64[0] + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.u64[1] + Fetch64(s + 48), 42) * k1; + x ^= w.u64[1]; + y += v.u64[0] + Fetch64(s + 40); + z = Rotate(z + w.u64[0], 33) * k1; + WeakHashLen32WithSeeds(v, s, v.u64[1] * k1, x + w.u64[0]); + WeakHashLen32WithSeeds(w, s + 32, z + w.u64[1], y + Fetch64(s + 16)); + uint64_t tmp=z;z=x;x=tmp; + s += 64; + len -= 64; + } while (len != 0); + return HashLen16(HashLen16(v.u64[0], w.u64[0]) + ShiftMix(y) * k1 + z, + HashLen16(v.u64[1], w.u64[1]) + x); +} + + +uint64_t CityHash64WithSeeds(const char *s, size_t len, + uint64_t seed0, uint64_t seed1) { + return HashLen16(CityHash64(s, len) - seed0, seed1); +} + +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed) { + return CityHash64WithSeeds(s, len, k2, seed); +} + +uint64_t FastStrHash(const char *str,int len) +{ + if(len<0) + len = strlen(str); + + return CityHash64(str,len); +} + +uint64_t FastIntHash(uint64_t hash,uint64_t seed) +{ + return HashLen16(hash - k2, seed); +} diff --git a/RHF_10000/router_mega/City64.h b/RHF_10000/router_mega/City64.h new file mode 100755 index 0000000..a386595 --- /dev/null +++ b/RHF_10000/router_mega/City64.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides a few functions for hashing strings. On x86-64 +// hardware in 2011, CityHash64() is faster than other high-quality +// hash functions, such as Murmur. This is largely due to higher +// instruction-level parallelism. CityHash64() and CityHash128() also perform +// well on hash-quality tests. +// +// CityHash128() is optimized for relatively long strings and returns +// a 128-bit hash. For strings more than about 2000 bytes it can be +// faster than CityHash64(). +// +// Functions in the CityHash family are not suitable for cryptography. +// +// WARNING: This code has not been tested on big-endian platforms! +// It is known to work well on little-endian platforms that have a small penalty +// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs. +// +// By the way, for some hash functions, given strings a and b, the hash +// of a+b is easily derived from the hashes of a and b. This property +// doesn't hold for any hash functions in this file. + +#ifndef CITY_HASH_64_H_ +#define CITY_HASH_64_H_ + +#include +#include + +// Hash function for a byte array. +uint64_t CityHash64(const char *buf, size_t len); +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed); +uint64_t CityHash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t seed1); + +#endif // CITY_HASH_H_ diff --git a/RHF_10000/router_mega/FastStrHash.h b/RHF_10000/router_mega/FastStrHash.h new file mode 100755 index 0000000..8e59f44 --- /dev/null +++ b/RHF_10000/router_mega/FastStrHash.h @@ -0,0 +1,17 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef FastStrHashH +#define FastStrHashH +//---- -------------------------------------------------------------------------------------------------------- +#include +//#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +/*--------------------------------------------------------------------------- +A wrapper on Google's City64 hash function. +---------------------------------------------------------------------------*/ +uint64_t FastStrHash(const char *str,int len=-1); +uint64_t FastIntHash(uint64_t hash,uint64_t seed); +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_10000/router_mega/Generate b/RHF_10000/router_mega/Generate new file mode 100755 index 0000000..93eb82e Binary files /dev/null and b/RHF_10000/router_mega/Generate differ diff --git a/RHF_10000/router_mega/Generator.cpp b/RHF_10000/router_mega/Generator.cpp new file mode 100755 index 0000000..9a05d74 --- /dev/null +++ b/RHF_10000/router_mega/Generator.cpp @@ -0,0 +1,99 @@ + +#include +#include +#include "Array.h" +#include "Builder/PerfectRouterBuilder1.h" +//------------------------------------------------------------------------------ +using namespace std; + +bool generateFunction1(const char *funcFileName, uint32_t *hash, int *pn,int nHash) +{ + // // start with maximum number of buckets + // int bucketStart = 16384; + // int bucketEnd = 2048; // this number must be larger than 4 + // // start with minimum number slots + // int nSlotStart = 512; + // int nSlotEnd = 4096; + // start with maximum number of buckets + int bucketStart = 16384; + int bucketEnd = 16384; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 1024; + int nSlotEnd = 1024; + + int minCost = nSlotStart*11 + bucketStart*2 + 1; + int bestBucketSize = bucketStart-1; + int bestSlotSize = nSlotStart; + + int nBucket; + int nSlot = nSlotStart; + + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + TPerfectRouterBuilder1 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*11 + nBucket*2; + if (curCost < minCost) + { + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %d \r\n", nHash); + // fprintf(stderr,"num of slots: %d \r\n", myB.r); + // fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + // Now, current myB contains the best parameters, output to files + ofstream output; + string outFileName = funcFileName; + output.open(outFileName); + output << rBest << endl; + output << mBest << endl; + // output each d value in d[](dArrayBest) + for (int slot=0;slot + +//--------------------------------------------------------------------------- +#ifndef GeneratorH +#define GeneratorH +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +double generateFunction1(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +double generateFunction2(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +double generateFunction3(const char *funcFileName, uint32_t *hash, int *pn,int nHash); + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_10000/router_mega/IntUtils.cpp b/RHF_10000/router_mega/IntUtils.cpp new file mode 100755 index 0000000..9ba1eec --- /dev/null +++ b/RHF_10000/router_mega/IntUtils.cpp @@ -0,0 +1,184 @@ +//--------------------------------------------------------------------------- +#include "IntUtils.h" +#include +// #include "Sys/CpuUtils.h" +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2) +{ +#if defined(XrossCPP_In_64) + return ((__int128_t)val1 * val2) >> 64; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + return (m2>>32) + (uint64_t)v1H*v2H + (c>>31); +#endif +} +//--------------------------------------------------------------------------- +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low) +{ +#if defined(XrossCPP_In_64) + __int128_t tmp = (__int128_t)val1 * val2; + high = (uint64_t)(tmp>>64); + low = (uint64_t) tmp; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + high = (m2>>32) + (uint64_t)v1H*v2H + (c>>31); + low = mLL+(m1<<32); +#endif +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val) +{ + val--; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + val |= val >> 32; + return val+1; +} +//--------------------------------------------------------------------------- +// We havn't implement them yet +//--------------------------------------------------------------------------- +/* +#ifndef XrossCPP_In_64 +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +#endif // XrossCPP_In_64 +*/ +// //--------------------------------------------------------------------------- +// static bool RM_witness(uint64_t n, uint64_t a, uint64_t s, unsigned tMinus1) +// { +// uint64_t v = 1; + +// while (s > 0) +// { +// if ( (s&1) == 1 ) +// v = Mul64Mod(n,v,a); + +// a = Mul64Mod(n,a,a); +// s >>= 1; +// } + +// if (1 == v) +// return true; + +// uint64_t nM1 = n-1; + +// for (unsigned i = 0; v != nM1; i++) +// { +// if (i == tMinus1) +// return false; + +// v = Mul64Mod(n,v,v); +// } + +// return true; +// } +//--------------------------------------------------------------------------- +bool RM_PrimeTest(uint64_t p) +{ + uint64_t x = (uint64_t)sqrt(p); + uint64_t i = 3; + if(p==2)return true; + if(p%2 == 0)return false; + while(i>= t; + +// t--; // we use t-1 all the time + +// /* +// * Witness 2 is deterministic for all n < 2047. Witnesses 2, 7, 61 +// * are deterministic for all n < 4,759,123,141. +// */ + +// if (RM_witness(n, 2, s, t)==false) +// return false; + +// if (n < 2027) +// return true; + +// if (RM_witness(n, 7, s, t)==false) +// return false; + +// if(n<4759123141ull) +// return RM_witness(n, 61, s, t); + +// static const uint8_t witness64[] = { 3, 5, 11, 13, 17, 19, 23, 29, 31, 37 }; // 2 & 7 are tested already + +// for (unsigned i = 0; i < (sizeof(witness64)/sizeof(witness64[0])); i++) +// { +// if (!RM_witness(n, witness64[i], s, t)) +// return false; +// } + +// return true; +// } +//--------------------------------------------------------------------------- +uint64_t RoundUpPrime(uint64_t val) +{ + val |= 1; + + while( (RM_PrimeTest(val)==false) && (val>1) ) + val += 2; + + return (val<=1?0:val); +} +//--------------------------------------------------------------------------- diff --git a/RHF_10000/router_mega/IntUtils.h b/RHF_10000/router_mega/IntUtils.h new file mode 100755 index 0000000..68ad792 --- /dev/null +++ b/RHF_10000/router_mega/IntUtils.h @@ -0,0 +1,62 @@ +//--------------------------------------------------------------------------- +#ifndef IntUtilsH +#define IntUtilsH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "Type64.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2); +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low); +//--------------------------------------------------------------------------- +// Following functions can be optimized by asm +// mul1*mul2 -> 64-bit result%d +inline uint32_t /*__fastcall*/ MulMod(uint32_t m1,uint32_t m2,uint32_t d) +{ + return (uint32_t)(((uint64_t)m1*m2)%d); +} +// p1*p2 -> 64-bit result+c +inline uint64_t /*__fastcall*/ MulAdd(uint32_t m1,uint32_t m2,uint32_t c) +{ + return ((uint64_t)m1*m2)+c; +} +// m1*m2 -> 64-bit result +inline uint64_t /*__fastcall*/ Mul(uint32_t m1,uint32_t m2) +{ + return ((uint64_t)m1*m2); +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val); +uint64_t RoundUpPrime(uint64_t val); +/*--------------------------------------------------------------------------- +Rabin-Miller primality test for up to max uint64_t. +Causion: we think 0, 1, 2 are not prime. +Causion: only work on x64 platform. +---------------------------------------------------------------------------*/ +bool RM_PrimeTest(uint64_t n); +//--------------------------------------------------------------------------- +//High efficient mul and div funcs for x64 platform only +//#ifdef XrossCPP_In_X64 +#ifdef __cplusplus +extern "C" +{ +#endif//__cplusplus +//--------------------------------------------------------------------------- +/* (m1*m2) % modV */ +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2); +/* (m1*m2) / divV */ +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2); +/* (m1*m2) /% divV, return both */ +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2); +//--------------------------------------------------------------------------- +#ifdef __cplusplus +} +#endif//__cplusplus +//#endif //XrossCPP_In_X64 +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_10000/router_mega/Makefile b/RHF_10000/router_mega/Makefile new file mode 100755 index 0000000..cc4fd6b --- /dev/null +++ b/RHF_10000/router_mega/Makefile @@ -0,0 +1,658 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/keran2/Work/RHF/router_mega + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/keran2/Work/RHF/router_mega + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/RHF/router_mega/CMakeFiles /home/keran2/Work/RHF/router_mega/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/RHF/router_mega/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named Generate + +# Build rule for target. +Generate: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 Generate +.PHONY : Generate + +# fast build rule for target. +Generate/fast: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/build +.PHONY : Generate/fast + +AllocatorBase.o: AllocatorBase.cpp.o + +.PHONY : AllocatorBase.o + +# target to build an object file +AllocatorBase.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.o +.PHONY : AllocatorBase.cpp.o + +AllocatorBase.i: AllocatorBase.cpp.i + +.PHONY : AllocatorBase.i + +# target to preprocess a source file +AllocatorBase.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.i +.PHONY : AllocatorBase.cpp.i + +AllocatorBase.s: AllocatorBase.cpp.s + +.PHONY : AllocatorBase.s + +# target to generate assembly for a file +AllocatorBase.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.s +.PHONY : AllocatorBase.cpp.s + +AllocatorC.o: AllocatorC.cpp.o + +.PHONY : AllocatorC.o + +# target to build an object file +AllocatorC.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.o +.PHONY : AllocatorC.cpp.o + +AllocatorC.i: AllocatorC.cpp.i + +.PHONY : AllocatorC.i + +# target to preprocess a source file +AllocatorC.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.i +.PHONY : AllocatorC.cpp.i + +AllocatorC.s: AllocatorC.cpp.s + +.PHONY : AllocatorC.s + +# target to generate assembly for a file +AllocatorC.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.s +.PHONY : AllocatorC.cpp.s + +ArrayPre.o: ArrayPre.cpp.o + +.PHONY : ArrayPre.o + +# target to build an object file +ArrayPre.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.o +.PHONY : ArrayPre.cpp.o + +ArrayPre.i: ArrayPre.cpp.i + +.PHONY : ArrayPre.i + +# target to preprocess a source file +ArrayPre.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.i +.PHONY : ArrayPre.cpp.i + +ArrayPre.s: ArrayPre.cpp.s + +.PHONY : ArrayPre.s + +# target to generate assembly for a file +ArrayPre.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.s +.PHONY : ArrayPre.cpp.s + +Builder/PerfectRouterBuilder1.o: Builder/PerfectRouterBuilder1.cpp.o + +.PHONY : Builder/PerfectRouterBuilder1.o + +# target to build an object file +Builder/PerfectRouterBuilder1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.o +.PHONY : Builder/PerfectRouterBuilder1.cpp.o + +Builder/PerfectRouterBuilder1.i: Builder/PerfectRouterBuilder1.cpp.i + +.PHONY : Builder/PerfectRouterBuilder1.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.i +.PHONY : Builder/PerfectRouterBuilder1.cpp.i + +Builder/PerfectRouterBuilder1.s: Builder/PerfectRouterBuilder1.cpp.s + +.PHONY : Builder/PerfectRouterBuilder1.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.s +.PHONY : Builder/PerfectRouterBuilder1.cpp.s + +Builder/PerfectRouterBuilder2.o: Builder/PerfectRouterBuilder2.cpp.o + +.PHONY : Builder/PerfectRouterBuilder2.o + +# target to build an object file +Builder/PerfectRouterBuilder2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.o +.PHONY : Builder/PerfectRouterBuilder2.cpp.o + +Builder/PerfectRouterBuilder2.i: Builder/PerfectRouterBuilder2.cpp.i + +.PHONY : Builder/PerfectRouterBuilder2.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.i +.PHONY : Builder/PerfectRouterBuilder2.cpp.i + +Builder/PerfectRouterBuilder2.s: Builder/PerfectRouterBuilder2.cpp.s + +.PHONY : Builder/PerfectRouterBuilder2.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.s +.PHONY : Builder/PerfectRouterBuilder2.cpp.s + +Builder/PerfectRouterBuilder3.o: Builder/PerfectRouterBuilder3.cpp.o + +.PHONY : Builder/PerfectRouterBuilder3.o + +# target to build an object file +Builder/PerfectRouterBuilder3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.o +.PHONY : Builder/PerfectRouterBuilder3.cpp.o + +Builder/PerfectRouterBuilder3.i: Builder/PerfectRouterBuilder3.cpp.i + +.PHONY : Builder/PerfectRouterBuilder3.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.i +.PHONY : Builder/PerfectRouterBuilder3.cpp.i + +Builder/PerfectRouterBuilder3.s: Builder/PerfectRouterBuilder3.cpp.s + +.PHONY : Builder/PerfectRouterBuilder3.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.s +.PHONY : Builder/PerfectRouterBuilder3.cpp.s + +CTimer1.o: CTimer1.cpp.o + +.PHONY : CTimer1.o + +# target to build an object file +CTimer1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.o +.PHONY : CTimer1.cpp.o + +CTimer1.i: CTimer1.cpp.i + +.PHONY : CTimer1.i + +# target to preprocess a source file +CTimer1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.i +.PHONY : CTimer1.cpp.i + +CTimer1.s: CTimer1.cpp.s + +.PHONY : CTimer1.s + +# target to generate assembly for a file +CTimer1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.s +.PHONY : CTimer1.cpp.s + +CTimer2.o: CTimer2.cpp.o + +.PHONY : CTimer2.o + +# target to build an object file +CTimer2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.o +.PHONY : CTimer2.cpp.o + +CTimer2.i: CTimer2.cpp.i + +.PHONY : CTimer2.i + +# target to preprocess a source file +CTimer2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.i +.PHONY : CTimer2.cpp.i + +CTimer2.s: CTimer2.cpp.s + +.PHONY : CTimer2.s + +# target to generate assembly for a file +CTimer2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.s +.PHONY : CTimer2.cpp.s + +CTimer3.o: CTimer3.cpp.o + +.PHONY : CTimer3.o + +# target to build an object file +CTimer3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.o +.PHONY : CTimer3.cpp.o + +CTimer3.i: CTimer3.cpp.i + +.PHONY : CTimer3.i + +# target to preprocess a source file +CTimer3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.i +.PHONY : CTimer3.cpp.i + +CTimer3.s: CTimer3.cpp.s + +.PHONY : CTimer3.s + +# target to generate assembly for a file +CTimer3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.s +.PHONY : CTimer3.cpp.s + +City64.o: City64.cpp.o + +.PHONY : City64.o + +# target to build an object file +City64.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.o +.PHONY : City64.cpp.o + +City64.i: City64.cpp.i + +.PHONY : City64.i + +# target to preprocess a source file +City64.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.i +.PHONY : City64.cpp.i + +City64.s: City64.cpp.s + +.PHONY : City64.s + +# target to generate assembly for a file +City64.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.s +.PHONY : City64.cpp.s + +Generator.o: Generator.cpp.o + +.PHONY : Generator.o + +# target to build an object file +Generator.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.o +.PHONY : Generator.cpp.o + +Generator.i: Generator.cpp.i + +.PHONY : Generator.i + +# target to preprocess a source file +Generator.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.i +.PHONY : Generator.cpp.i + +Generator.s: Generator.cpp.s + +.PHONY : Generator.s + +# target to generate assembly for a file +Generator.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.s +.PHONY : Generator.cpp.s + +IntUtils.o: IntUtils.cpp.o + +.PHONY : IntUtils.o + +# target to build an object file +IntUtils.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.o +.PHONY : IntUtils.cpp.o + +IntUtils.i: IntUtils.cpp.i + +.PHONY : IntUtils.i + +# target to preprocess a source file +IntUtils.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.i +.PHONY : IntUtils.cpp.i + +IntUtils.s: IntUtils.cpp.s + +.PHONY : IntUtils.s + +# target to generate assembly for a file +IntUtils.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.s +.PHONY : IntUtils.cpp.s + +Performance/Performance.o: Performance/Performance.cpp.o + +.PHONY : Performance/Performance.o + +# target to build an object file +Performance/Performance.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.o +.PHONY : Performance/Performance.cpp.o + +Performance/Performance.i: Performance/Performance.cpp.i + +.PHONY : Performance/Performance.i + +# target to preprocess a source file +Performance/Performance.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.i +.PHONY : Performance/Performance.cpp.i + +Performance/Performance.s: Performance/Performance.cpp.s + +.PHONY : Performance/Performance.s + +# target to generate assembly for a file +Performance/Performance.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.s +.PHONY : Performance/Performance.cpp.s + +Tester/PerfectRouterTester1.o: Tester/PerfectRouterTester1.cpp.o + +.PHONY : Tester/PerfectRouterTester1.o + +# target to build an object file +Tester/PerfectRouterTester1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.o +.PHONY : Tester/PerfectRouterTester1.cpp.o + +Tester/PerfectRouterTester1.i: Tester/PerfectRouterTester1.cpp.i + +.PHONY : Tester/PerfectRouterTester1.i + +# target to preprocess a source file +Tester/PerfectRouterTester1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.i +.PHONY : Tester/PerfectRouterTester1.cpp.i + +Tester/PerfectRouterTester1.s: Tester/PerfectRouterTester1.cpp.s + +.PHONY : Tester/PerfectRouterTester1.s + +# target to generate assembly for a file +Tester/PerfectRouterTester1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.s +.PHONY : Tester/PerfectRouterTester1.cpp.s + +Tester/PerfectRouterTester2.o: Tester/PerfectRouterTester2.cpp.o + +.PHONY : Tester/PerfectRouterTester2.o + +# target to build an object file +Tester/PerfectRouterTester2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.o +.PHONY : Tester/PerfectRouterTester2.cpp.o + +Tester/PerfectRouterTester2.i: Tester/PerfectRouterTester2.cpp.i + +.PHONY : Tester/PerfectRouterTester2.i + +# target to preprocess a source file +Tester/PerfectRouterTester2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.i +.PHONY : Tester/PerfectRouterTester2.cpp.i + +Tester/PerfectRouterTester2.s: Tester/PerfectRouterTester2.cpp.s + +.PHONY : Tester/PerfectRouterTester2.s + +# target to generate assembly for a file +Tester/PerfectRouterTester2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.s +.PHONY : Tester/PerfectRouterTester2.cpp.s + +Tester/PerfectRouterTester3.o: Tester/PerfectRouterTester3.cpp.o + +.PHONY : Tester/PerfectRouterTester3.o + +# target to build an object file +Tester/PerfectRouterTester3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.o +.PHONY : Tester/PerfectRouterTester3.cpp.o + +Tester/PerfectRouterTester3.i: Tester/PerfectRouterTester3.cpp.i + +.PHONY : Tester/PerfectRouterTester3.i + +# target to preprocess a source file +Tester/PerfectRouterTester3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.i +.PHONY : Tester/PerfectRouterTester3.cpp.i + +Tester/PerfectRouterTester3.s: Tester/PerfectRouterTester3.cpp.s + +.PHONY : Tester/PerfectRouterTester3.s + +# target to generate assembly for a file +Tester/PerfectRouterTester3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.s +.PHONY : Tester/PerfectRouterTester3.cpp.s + +main.o: main.cpp.o + +.PHONY : main.o + +# target to build an object file +main.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i + +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s + +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... Generate" + @echo "... edit_cache" + @echo "... AllocatorBase.o" + @echo "... AllocatorBase.i" + @echo "... AllocatorBase.s" + @echo "... AllocatorC.o" + @echo "... AllocatorC.i" + @echo "... AllocatorC.s" + @echo "... ArrayPre.o" + @echo "... ArrayPre.i" + @echo "... ArrayPre.s" + @echo "... Builder/PerfectRouterBuilder1.o" + @echo "... Builder/PerfectRouterBuilder1.i" + @echo "... Builder/PerfectRouterBuilder1.s" + @echo "... Builder/PerfectRouterBuilder2.o" + @echo "... Builder/PerfectRouterBuilder2.i" + @echo "... Builder/PerfectRouterBuilder2.s" + @echo "... Builder/PerfectRouterBuilder3.o" + @echo "... Builder/PerfectRouterBuilder3.i" + @echo "... Builder/PerfectRouterBuilder3.s" + @echo "... CTimer1.o" + @echo "... CTimer1.i" + @echo "... CTimer1.s" + @echo "... CTimer2.o" + @echo "... CTimer2.i" + @echo "... CTimer2.s" + @echo "... CTimer3.o" + @echo "... CTimer3.i" + @echo "... CTimer3.s" + @echo "... City64.o" + @echo "... City64.i" + @echo "... City64.s" + @echo "... Generator.o" + @echo "... Generator.i" + @echo "... Generator.s" + @echo "... IntUtils.o" + @echo "... IntUtils.i" + @echo "... IntUtils.s" + @echo "... Performance/Performance.o" + @echo "... Performance/Performance.i" + @echo "... Performance/Performance.s" + @echo "... Tester/PerfectRouterTester1.o" + @echo "... Tester/PerfectRouterTester1.i" + @echo "... Tester/PerfectRouterTester1.s" + @echo "... Tester/PerfectRouterTester2.o" + @echo "... Tester/PerfectRouterTester2.i" + @echo "... Tester/PerfectRouterTester2.s" + @echo "... Tester/PerfectRouterTester3.o" + @echo "... Tester/PerfectRouterTester3.i" + @echo "... Tester/PerfectRouterTester3.s" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/RHF_10000/router_mega/Performance/Performance.cpp b/RHF_10000/router_mega/Performance/Performance.cpp new file mode 100755 index 0000000..7c170b8 --- /dev/null +++ b/RHF_10000/router_mega/Performance/Performance.cpp @@ -0,0 +1,21 @@ +// not use anymore + +//--------------------------------------------------------------------------- +#include "../IntUtils.h" +#include +#include +#include "Performance.h" +//--------------------------------------------------------------------------- +// Time calculation +float diffUserTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_utime.tv_sec - start->ru_utime.tv_sec) + + 1e-6*(end->ru_utime.tv_usec - start->ru_utime.tv_usec); +} + +float diffSystemTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_stime.tv_sec - start->ru_stime.tv_sec) + + 1e-6*(end->ru_stime.tv_usec - start->ru_stime.tv_usec); +} +//--------------------------------------------------------------------------- diff --git a/RHF_10000/router_mega/Performance/Performance.h b/RHF_10000/router_mega/Performance/Performance.h new file mode 100755 index 0000000..a8e4128 --- /dev/null +++ b/RHF_10000/router_mega/Performance/Performance.h @@ -0,0 +1,19 @@ +// not use anymore + +//--------------------------------------------------------------------------- +#ifndef PerformanceH +#define PerformanceH +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- + +float diffUserTime(struct rusage *start, struct rusage *end); + +float diffSystemTime(struct rusage *start, struct rusage *end); + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_10000/router_mega/SortBase.h b/RHF_10000/router_mega/SortBase.h new file mode 100755 index 0000000..7f2c4bf --- /dev/null +++ b/RHF_10000/router_mega/SortBase.h @@ -0,0 +1,20 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef sortBaseH +#define sortBaseH +//---- -------------------------------------------------------------------------------------------------------- +#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +//---- -------------------------------------------------------------------------------------------------------- +typedef int (*TSortCmp)(const void *r1,const void *r2); +//---- -------------------------------------------------------------------------------------------------------- +inline void XchgStorage(void *d1,void *d2,void *buff,int w) +{ + memcpy(buff,d1,w); + memcpy(d1,d2,w); + memcpy(d2,buff,w); +} +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_10000/router_mega/Tester/PerfectRouterTester1.cpp b/RHF_10000/router_mega/Tester/PerfectRouterTester1.cpp new file mode 100755 index 0000000..d2df645 --- /dev/null +++ b/RHF_10000/router_mega/Tester/PerfectRouterTester1.cpp @@ -0,0 +1,137 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +#include "PerfectRouterTester1.h" +#include "../Performance/Performance.h" +//--------------------------------------------------------------------------- +using namespace std; +//--------------------------------------------------------------------------- +// bool checkFunc(const int *pn, const uint32_t *hash, const int nHash, const int nSlot, const int nBucket, TArray TdArray, TArray TbucketArray) +// { +// int bucketWidth = (int) (log(nBucket)/log(2)); +// int shiftBucket = 32 - bucketWidth; + +// int nSlotWidth = (int)(log(nSlot)/log(2)); +// int shiftSlot = 32 - nSlotWidth; +// fprintf(stderr,"TdArray length: %d\r\n", TdArray.Number); +// fprintf(stderr,"TbucketArray Number: %d\r\n", TbucketArray.Number); + +// for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + +// // Step2: slot lookup +// fprintf(stderr,"hash[i]: %u\r\n", hash[i]); +// fprintf(stderr,"nSlot: %d\r\n", nSlot); +// fprintf(stderr,"shiftSlot: %d\r\n", shiftSlot); +// fprintf(stderr,"idx: %d\r\n", idx); +// int d = TdArray[idx]; + +// // Step3: universal shift hash and mod m +// uint32_t x_key = hash[i] >> 8; +// int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + +// // Step4: Interface number lookup +// fprintf(stderr,"f: %d\r\n", f); +// if (TbucketArray[f] != pn[i]) +// { +// return false; +// } +// } +// return true; +// } + +bool TPerfectRouterTester1::Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash) +{ + // get function paprameters from function.txt + ifstream fInput(funcFileName, ios::in); + string funcLine; + // load r(nSlot) and m(nBucket) + getline(fInput, funcLine); + int nSlot = atoi(funcLine.c_str()); + getline(fInput, funcLine); + int nBucket = atoi(funcLine.c_str()); + + // initialize the array for TdArray[] and TbucketArray[] + TdArray.AllocFill(24+nSlot*sizeof(int)); // 16bit x nSlot + TdArray.InitZero(); + + TbucketArray.AllocFill(24+nBucket*sizeof(int)); // 32bit x number of buckets + TbucketArray.InitZero(); + + // load slot values for TdArray[] + for (int dIdx=0;dIdx> shiftSlot; // int idx = hash[i]%nSlot; + + // Step2: slot lookup + int d = TdArray[idx]; + + // Step3: universal shift hash and mod m + uint32_t x_key = hash[i] >> 10; + int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + + // Step4: Interface number lookup + if (TbucketArray[f] != pn[i]) + { + fprintf(stderr,"############################################### \r\n"); + fprintf(stderr,"testing fail for %s \r\n", funcFileName); + fprintf(stderr,"############################################### \r\n"); + fInput.close(); + return false; + } + } + getrusage(RUSAGE_SELF, &tEnd); + + fprintf(stderr,"Testing success for %s \r\n", funcFileName); + float tu = diffUserTime(&tStart, &tEnd); + float ts = diffSystemTime(&tStart, &tEnd); + float tTotal = tu + ts; + fprintf(stderr,"Testing time for all keys:\n %.06f sec, %.06f user, %.06f system\n", + tTotal, tu, ts); + fInput.close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_10000/router_mega/Tester/PerfectRouterTester1.h b/RHF_10000/router_mega/Tester/PerfectRouterTester1.h new file mode 100755 index 0000000..f3c5474 --- /dev/null +++ b/RHF_10000/router_mega/Tester/PerfectRouterTester1.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterTester1H +#define PerfectRouterTester1H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TPerfectRouterTester1 +{ +public: + TArray TdArray; + TArray TbucketArray; + + ~TPerfectRouterTester1() + { + Close(); + } + + void Close() + { + TdArray.Close(); + TbucketArray.Close(); + } + + bool Test(const char *funcFileName, uint32_t *hash, int *pn,int nHash); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_10000/router_mega/Type64.h b/RHF_10000/router_mega/Type64.h new file mode 100755 index 0000000..a77e44c --- /dev/null +++ b/RHF_10000/router_mega/Type64.h @@ -0,0 +1,110 @@ +#pragma once +#ifndef Type64H +#define Type64H +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#undef XrossCPP_In_64 +#undef XrossCPP_In_32 +#undef XrossCPP_In_IA64 +#undef XrossCPP_In_PC +#undef XrossCPP_In_X64 +#undef XrossCPP_In_X86 +#undef XrossCPP_In_ARM +#undef XrossCPP_In_ARM_thumb +//--------------------------------------------------------------------------- +#ifdef __GNUC__ +# if defined (__amd64__) || defined (__amd64) || defined (__x86_64__) || defined (__x86_64) +# define XrossCPP_In_X64 +# define XrossCPP_In_64 +# define XrossCPP_In_PC +# elif defined (_IA64) || defined (__ia64__) || defined (__IA64__) +# define XrossCPP_In_IA64 +# define XrossCPP_In_64 +# elif defined (__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +# elif defined (__arm__) +# if defined (__thumb__) +# define XrossCPP_In_ARM_thumb +# endif +# define XrossCPP_In_ARM +# define XrossCPP_In_32 +# endif +#elif defined (__BORLANDC__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +#endif +//--------------------------------------------------------------------------- +#if !defined(WIN32) && !defined(_WIN32) +#define __fastcall +#endif +//--------------------------------------------------------------------------- +#ifdef XrossCPP_In_64 + typedef int64_t sint_t; + typedef uint64_t uint_t; +#elif !defined(__LSeRTOS__) + typedef int32_t sint_t; + typedef uint32_t uint_t; +#endif +//--------------------------------------------------------------------------- +union TX64Data +{ + int64_t i64; + uint64_t u64; + + int32_t i32[2]; + int16_t i16[4]; + int8_t i8[8]; + + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8[8]; + + double df; + float f[2]; +}; +//--------------------------------------------------------------------------- +#define x64Low32(x) ((TX64Data*)&x)->u32[0] +#define x64High32(x) ((TX64Data*)&x)->u32[1] +//--------------------------------------------------------------------------- +union TX128Data +{ + TX64Data x64[2]; + int64_t i64[2]; + uint64_t u64[2]; + + int32_t i32[4]; + int16_t i16[8]; + int8_t i8[16]; + + uint32_t u32[4]; + uint16_t u16[8]; + uint8_t u8[16]; + + double df[2]; + float f[4]; + + TX128Data() + { + } + + TX128Data(uint64_t vL,uint64_t vH) + { + u64[0] = vL; + u64[1] = vH; + } +}; +//--------------------------------------------------------------------------- +typedef TX128Data int128_t; +//--------------------------------------------------------------------------- +#define x128Low64(x) ((TX128Data*)&x)->u64[0] +#define x128High64(x) ((TX128Data*)&x)->u64[1] +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif // Type64H diff --git a/RHF_10000/router_mega/embdDbg.h b/RHF_10000/router_mega/embdDbg.h new file mode 100755 index 0000000..f56dc17 --- /dev/null +++ b/RHF_10000/router_mega/embdDbg.h @@ -0,0 +1,21 @@ +#ifndef embdDbgH +#define embdDbgH +//---- -------------------------------------------------------------------------------------------------------- +#ifdef __HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#include +#define logEmbdMsg(...) printf(__VA_ARGS__) +//---- -------------------------------------------------------------------------------------------------------- +#else//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +inline void logEmbdMsg(const char *msg,...) +{ +} +#else +#define logEmbdMsg(...) +#endif // __BORLANDC__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//embdDbgH diff --git a/RHF_10000/router_mega/input.txt b/RHF_10000/router_mega/input.txt new file mode 100755 index 0000000..c86699a --- /dev/null +++ b/RHF_10000/router_mega/input.txt @@ -0,0 +1,10000 @@ +2861498860 +538874397 +2884970994 +955125036 +3481923597 +4023014517 +452306420 +2686122881 +2102814866 +1543734688 +3816350532 +3841160498 +3963119138 +922404466 +2036972307 +1705535499 +984531147 +632377809 +2535208120 +2736938665 +361421618 +888021451 +1992422465 +2590943442 +3555072675 +3403805089 +3970239682 +2514706003 +224507947 +656608320 +167189887 +1332681492 +1132203992 +1633750777 +1156037352 +3435200593 +4040368592 +432439924 +374071162 +4201577549 +1157933667 +2989295453 +864861915 +820979215 +3103456509 +1859991325 +1402959268 +4087957561 +4045321966 +2622802380 +1624384166 +884304166 +3238063403 +630146915 +2032758741 +670596532 +2875077786 +2349706594 +3400556235 +4059982738 +1011286726 +155877544 +1849547541 +474396246 +2055384093 +2398313517 +4018505308 +4089257323 +2958070855 +404930470 +1972861984 +1172226557 +341216918 +3263985995 +479107136 +1902793150 +3577003933 +819904387 +1595971764 +3580048896 +4207832057 +569718531 +3708966298 +792660783 +3247168844 +396295014 +1517022243 +2356109383 +2454992254 +1547386168 +2805995800 +2342241127 +20956159 +2393103766 +1093647782 +683210020 +3025282122 +1401462953 +1763662743 +3019007060 +705675524 +713720628 +2353438368 +2152453594 +1535995727 +3982350732 +340973073 +1862095641 +601954692 +707444174 +4077523347 +4012254943 +4124376599 +4007992567 +3149874012 +3429401733 +511715420 +782894591 +108121287 +2742238679 +2095210051 +3888465285 +3686478589 +3042501967 +2611795099 +3689178407 +214446974 +905348299 +2562221915 +3332690586 +1196610940 +479648610 +2025309192 +3702630017 +467907765 +2769589970 +839207402 +2436394142 +550864269 +2485299361 +1854583884 +2161957192 +1549868016 +2012976305 +1363645615 +3708731137 +3615061692 +3305887671 +104509329 +3672175031 +3785540985 +840933115 +431829541 +2108144283 +452360500 +3421577449 +224584716 +2882750898 +2013814498 +3557381781 +3893239960 +2606213487 +218005990 +2716231195 +1529741484 +3362938915 +869272588 +1477508479 +335012619 +3695552234 +3662142345 +593662724 +3133248868 +1757562604 +2730112788 +2665745855 +1935849331 +3065059485 +3132663529 +160637473 +2852191501 +2259281226 +3122093023 +1423065112 +840313174 +1084848738 +2372516405 +1631588950 +2390501859 +3113256470 +158274172 +2744258407 +1483060065 +1574572356 +2122734092 +1793480239 +2791206438 +1586440491 +1680252034 +3780364752 +877994635 +4141036588 +3636777157 +2992332000 +2291713027 +2265412831 +287374844 +2989502565 +751315072 +1344989490 +1731514616 +710785496 +561739873 +946186246 +724686233 +171321127 +187102182 +2308631300 +1467350298 +2359752157 +2210486800 +2724302556 +20608655 +95998435 +2990834751 +1328926655 +305281877 +421064177 +1368277020 +481579873 +160728629 +2435826868 +2708092073 +3477062183 +373457772 +1999601034 +2294076468 +3464110692 +4066208093 +2221238487 +764015442 +1501195435 +1523639444 +2405310581 +2504945905 +124817474 +858296069 +1816989168 +2901210771 +2883422049 +1562560938 +1900767585 +2764349343 +3796776080 +1486077666 +4152125121 +2372893627 +3440346478 +201631315 +769714985 +161959460 +730651707 +4135192686 +3415556217 +191638116 +2440885109 +3292424674 +2996188285 +969461419 +731886424 +3268808255 +4265376307 +1666607886 +1705071509 +3603987272 +1168629020 +1222925423 +4084313321 +173183736 +272153629 +1652261711 +1787623946 +3629862089 +3086104155 +3682551638 +3629243410 +1422324671 +734621069 +3893604589 +3151997439 +3550727618 +808157710 +1410293331 +172307435 +1939548034 +3960418650 +1153845820 +415729283 +2431245861 +380710555 +2049413387 +2458302114 +1354376849 +1181655714 +4053947567 +2747282301 +3467065714 +1255601394 +3726361233 +95950334 +359814828 +2009902034 +1089312384 +3329189038 +965855681 +2396348254 +2191111536 +3747209514 +1151065923 +2701916919 +3693411499 +2371415881 +1075774902 +557918012 +2604367212 +411456522 +780577214 +1177865763 +1230174069 +2975243800 +1567452695 +4030842679 +1541530725 +2201098619 +478053286 +3027309824 +443141984 +285979863 +1425679865 +3620258195 +1857049676 +2109001185 +4276513905 +287430312 +1644689549 +1444017668 +1413654243 +1365549954 +1204528307 +1199909242 +1073682674 +3442599234 +3695226321 +324941820 +2525085279 +2103644112 +1818240248 +3467261808 +2272206828 +2609070241 +1741068080 +1843757665 +3201344131 +2288125025 +449361001 +3463626260 +2023936645 +375044275 +241526182 +4045085635 +2169405428 +4162003939 +1566312522 +532290727 +156182543 +2568140688 +829983565 +1002230389 +100086339 +2421712838 +2677924688 +4097769372 +162088659 +2645881788 +2073244664 +4194671044 +2720296960 +623807259 +2000282237 +3208660157 +3224797472 +3755330383 +3543029857 +1956783556 +1337805988 +3026338831 +4062220970 +3621336037 +1686770520 +720871481 +1341205444 +2709739213 +4241803513 +2878799494 +589767416 +3757143934 +1542688963 +1847088957 +18602377 +1095751679 +1066054743 +1684750792 +4251888205 +1507592 +4003254509 +3055125331 +3561299300 +713608019 +783278470 +1576218540 +1071645329 +2879074438 +3265100048 +3370406227 +1637389888 +992144303 +1015868120 +3574851303 +681641608 +4209778292 +3809503110 +3469943037 +455235296 +3652734833 +4118802426 +434412774 +2277702160 +1818585174 +3539793219 +81815933 +65812981 +1475005068 +2966249063 +1702397384 +2646776713 +1453456432 +1936272827 +47259463 +1698241541 +2074825154 +3606285284 +1470080018 +1156201480 +2635845455 +2601542336 +822907609 +2421872341 +720516660 +2920008974 +2328182178 +740261486 +4052502604 +4054220037 +2588984523 +3538456977 +1873202006 +510750048 +1384779413 +338483377 +1030299107 +1060129625 +119215487 +3535834833 +1954717854 +4285568603 +3008959896 +4103491755 +3126697012 +3682993299 +159551159 +1730263752 +1132014013 +1902492611 +515049073 +1699348221 +2488422623 +2258085426 +212640284 +226267206 +20198293 +2459089031 +1455334843 +834786184 +3723766151 +24554342 +2425812458 +1026292653 +165671521 +2397570825 +1178045891 +1121742092 +3204386904 +3781660079 +2429842068 +3446279536 +2741408015 +4040922895 +1965615400 +1294740389 +1483293762 +1375161572 +3974440823 +1830313797 +4008444201 +1499045525 +2603807905 +3565264716 +761994886 +691266022 +625535694 +913044001 +1021300787 +3065879913 +4183693518 +368998050 +4292835837 +3791756531 +1698953315 +2420027445 +3169058410 +2048530574 +2890105462 +1708882467 +2920368244 +2707243378 +1239532990 +3461637877 +383394373 +1610126110 +2431548813 +2798971708 +4146813199 +506167898 +2260684029 +1936068371 +4186787567 +670819011 +2217690504 +2794762805 +3085832243 +1807187948 +178131849 +3162456588 +1251272278 +1097205339 +799618520 +461617504 +3005296296 +1532227729 +169216511 +2146981758 +421925961 +4183938516 +3063288075 +3556191182 +393699137 +2909126728 +3990772323 +4145958993 +1835498182 +4089504240 +3499228769 +3667462487 +1128102210 +1760370517 +47445916 +476670373 +1698728409 +1223807353 +2794183289 +3905126523 +1419133429 +2467591556 +167516273 +2563027451 +933517683 +3007914077 +2277117106 +1489371275 +3708629116 +3494108544 +732676894 +94860146 +2194640 +2795351552 +505125274 +3946122466 +595140008 +178525270 +2617506228 +103852046 +674783066 +2966407390 +24882349 +1128678928 +4051776488 +3123998572 +2563620900 +759803487 +3789209629 +1927424049 +1148426212 +2854730839 +4000433447 +1384660526 +3866263009 +3786490733 +2480707368 +2404597598 +4158864309 +2928380465 +2134991870 +382462546 +1291542263 +1997254427 +3012764792 +3200033485 +3737494583 +909262089 +2728845249 +313605155 +963097095 +3970051450 +3142749820 +1352082327 +950070275 +2553976760 +4240474530 +1725716201 +4099969902 +1413547639 +2781714950 +1879767878 +3875509486 +343830844 +1082990743 +3604144458 +4132571379 +3295994138 +2499071941 +374334964 +739142110 +4230360157 +590507141 +4021308219 +322384693 +366056191 +3854621120 +3509950666 +195827923 +3931422197 +3160387895 +133509852 +3346221674 +3412434252 +1945877923 +755859655 +485820951 +203137531 +995491834 +3919829925 +1821630900 +1860950952 +1982910560 +4178401497 +3729070758 +1968884312 +4197502196 +3715427488 +1301102013 +323746002 +3133976451 +321640909 +577158467 +3406494346 +606846639 +3023350803 +2605659196 +2385807982 +3859244255 +253377429 +2574832959 +1462884053 +1470698334 +4084771893 +198892844 +1327147316 +3886070951 +721844026 +3679315144 +1971159977 +640567693 +851594053 +2721038696 +844320707 +941337992 +2510448049 +2743587853 +1376743705 +842493052 +1902179211 +3865956859 +3734685596 +2837395533 +2371588830 +216123923 +208207821 +1576115450 +2548805262 +3437032737 +2950702366 +1433673262 +3947092549 +50326333 +1815375469 +2976508734 +3460023431 +2235730418 +3546781275 +2814632528 +3926418951 +39640996 +917504983 +1400934613 +3382875894 +285669319 +900406426 +2425732403 +301524987 +3582694915 +1698732222 +1725128860 +51258096 +1200007219 +3560035338 +1283418742 +426532475 +3244268167 +2204879475 +2341270412 +2153609873 +4208843254 +3412320486 +829138263 +769324122 +3341381531 +2437395886 +2158768896 +4200889659 +2903139180 +2764275666 +126788711 +706274184 +2767085187 +60933692 +1867549611 +703684304 +3852788253 +1188647502 +1773658994 +1941080404 +4253084053 +2200499531 +1297383254 +3948792224 +1090712509 +3305372803 +4182658625 +1617125583 +3814193531 +1964939248 +517695365 +2362318840 +768809213 +181997101 +1620357699 +4056310849 +1346069424 +3202653651 +1219889741 +3054381742 +600821458 +1466672512 +4194164544 +84204832 +2353390456 +3071590004 +3880043794 +1721263387 +2735908975 +1500442932 +1449841867 +1829944341 +3860038257 +3495357222 +1096018415 +2431441148 +3114269500 +1676664899 +2374616105 +3181797335 +2640306614 +2963775677 +366503644 +3409936666 +2664863080 +1177988998 +1134768193 +1547863621 +1307422622 +4082453210 +3543163655 +3372846797 +3971788066 +4169558809 +3525385553 +1466510156 +2321279534 +2455498786 +913242281 +1409250134 +1403042371 +766609600 +3030032708 +1451123455 +371048214 +635383608 +1385213594 +2327487022 +4211545735 +255902173 +317147838 +3347857948 +1337169273 +438881430 +4274504189 +132654761 +3190439411 +1025959578 +2729299317 +18981104 +1198909533 +1371457620 +968839770 +664865150 +2623640658 +4205817293 +2523219693 +454669570 +516794725 +3928713918 +3999218376 +3890388253 +1605807398 +998088737 +3953892002 +713771330 +1373703685 +3667967238 +986586241 +3815958476 +4213188482 +1954289115 +1531082745 +1394927910 +1365124742 +2450910401 +846828689 +468214246 +1911227146 +1961901558 +1726378030 +3436024451 +2628331093 +2564993314 +3232776468 +4197915899 +349757923 +1170487041 +3656089561 +2089004530 +3115119736 +1047800390 +120020062 +4259904985 +429995885 +1317608882 +2741244043 +2404118039 +3481234705 +1020205007 +674992205 +179955800 +930602634 +697919489 +913381397 +919598230 +899071834 +2787632127 +1833856809 +2308308088 +1471125037 +585776583 +1727692059 +938241378 +2522572467 +399169426 +1213249267 +1757509479 +2794899641 +1966838383 +3467087944 +1245048906 +2086544466 +570485730 +2583881079 +2955411923 +3624320052 +3536550790 +3034571909 +3685008568 +3558036096 +2366847662 +2640840212 +662241601 +2987303660 +1110383205 +1042951961 +690629232 +1447556278 +4238330406 +520095259 +1175939805 +60991930 +4189082158 +3453714089 +2778140263 +3274092631 +181323960 +2924447234 +3123056012 +494399332 +3408752284 +3939493656 +3133052820 +890088190 +3267787593 +2596430830 +1492614394 +1644119101 +3064662003 +2667716853 +2732597650 +1267301810 +2551759466 +2994980660 +32761679 +1179516931 +3576117882 +528902197 +857965533 +3277352275 +3111343937 +749689384 +1567788842 +2880983467 +3317458108 +311147234 +1739223663 +2577464059 +2307444537 +2246829807 +1153008849 +754662338 +359978739 +1726566387 +1572970619 +709599364 +1539326056 +2285420239 +3122962013 +826618192 +1484407833 +619368944 +3854573295 +3508705601 +1268241324 +2023120175 +1002062107 +3128931441 +2654268325 +964849996 +1407509481 +3607924245 +4137919629 +3218555250 +2580728655 +827235384 +2736345881 +195067403 +1859936801 +2623083933 +766073308 +4044587891 +1635182782 +2989680794 +1456928712 +1691114215 +1742091784 +2417028011 +2840279795 +3530067180 +1391323052 +4181973078 +1107064023 +1407163119 +3036438357 +1125521087 +3944593953 +742283908 +106751215 +3552867429 +1085828402 +1091952161 +2224708511 +2019602064 +3417312650 +285596977 +3852141209 +2406133795 +1941654876 +1921991824 +1079069887 +1936091093 +1978331654 +3376578127 +2716927464 +2297202893 +781575543 +86124136 +2133799428 +3019149993 +391642995 +506677615 +992150011 +770792788 +2281473517 +908429396 +946264677 +2014043735 +2252581600 +3393484034 +558240634 +3499172762 +4278492569 +3761718535 +1516498934 +1694450183 +1780858952 +1637612173 +3340971155 +676128637 +3049019539 +3719177842 +3375893884 +1344006628 +629467643 +2323466110 +2873855128 +1310528682 +3899261782 +2872283478 +1372112510 +478490311 +2409576406 +2838886571 +2917631090 +2377817114 +230750763 +4055085750 +795772065 +3938774845 +2770567223 +581366596 +3665156476 +1782969178 +2204738342 +1902020852 +2636202331 +2072522424 +1513801768 +3948094253 +2660748457 +131480027 +2854553468 +500195920 +430753576 +2164689174 +830164837 +800692482 +74755066 +1831890927 +4124678994 +2389358384 +3736008793 +2568094159 +3595700913 +1451771895 +286328361 +1885714491 +3498555305 +564826886 +529628755 +667684273 +427603534 +3245623276 +3753123410 +3476656029 +2007908698 +2463635613 +3395006246 +2725040314 +1669910233 +2837757871 +1922940863 +2149463697 +492974454 +273966321 +3497615342 +2378189070 +2693297660 +2475629644 +1555256081 +3640589876 +2078041146 +508638381 +2389102400 +3626568372 +207530138 +3282182254 +4080586339 +439707068 +250824388 +3669269858 +3199526009 +2764736243 +1497946930 +2969487502 +2865908328 +2950314389 +2177225005 +2775888036 +332850159 +2576043449 +2165711186 +1398768880 +1015483592 +3104434462 +2385764104 +1754114777 +3588147611 +318029526 +1762058977 +3939251101 +1463913979 +3078554727 +4105505375 +545271439 +1972636637 +504415633 +2219247860 +2421592154 +4042814101 +373866293 +3333992300 +2494238567 +1543842661 +3366799066 +1847073255 +704054708 +3831723947 +2580995307 +1322088783 +323617968 +3280729611 +3183600334 +1475283670 +3927637399 +3581014902 +3843550340 +431473572 +457456128 +700833777 +385574602 +1837474429 +2837326369 +386813757 +2556231971 +899170961 +3583572203 +2152979017 +4290222143 +2906211788 +3152116227 +1336963826 +3485291855 +1597535123 +4187109493 +1962044331 +751552360 +3374145652 +4283999955 +1762763270 +1542247015 +69711498 +3102054702 +1032474548 +234402238 +837968121 +294264482 +39072260 +958692058 +3644299624 +2743548185 +1221058749 +2348614716 +2706880553 +2929007856 +1789471049 +889426239 +3657412989 +300498413 +1901805108 +1082640753 +2863529902 +1457172110 +3496419279 +773872058 +3776338499 +426438745 +990771802 +2354184024 +1230276209 +3434567398 +3965743926 +196863151 +2438955136 +2660876744 +735352192 +3164129610 +3067162900 +957389183 +48125450 +1327719972 +2382199641 +4209969291 +3625563813 +3845091037 +1056624912 +2443636803 +2858297232 +1530072205 +4041286361 +2797880629 +3044024216 +1205207979 +1134572702 +3468368186 +3305989570 +2720209894 +2387998165 +3562946726 +1964220636 +632146396 +1311870670 +1455312136 +3734264411 +347135336 +289125322 +917862914 +677616621 +1656413759 +1867067139 +1021886214 +290418567 +3358654003 +974870066 +1771624151 +1936768264 +1681148574 +1392179728 +694991531 +412681374 +3208720170 +1674191986 +793920783 +442257291 +3077480027 +592595554 +1346236242 +91834143 +3135271846 +3806435522 +676599181 +1702770096 +1642976367 +852988370 +2389294001 +1736182646 +3927551563 +4220731208 +303276051 +4003686820 +2791922237 +797963496 +1328084514 +1984890742 +500220549 +1150298022 +1487970127 +3882533283 +3226473063 +1502267748 +2243075174 +2710047164 +245621038 +4119325840 +2138480342 +967152904 +1467806931 +646713636 +1295519588 +4031822546 +2585297459 +3171657989 +1367501167 +1345301513 +3236275046 +2120469173 +1196498853 +2149088673 +135867443 +2146788804 +3123552570 +3749319826 +4246595259 +723687105 +3700591966 +3498903595 +2013746061 +1927707522 +3956992316 +1742193426 +4230011402 +2574970474 +399842302 +1953587718 +3129212705 +2132249848 +4248203405 +4292826254 +3383986907 +3411805510 +1626869441 +389707368 +4249792723 +1397183038 +172558790 +3643128575 +2075135417 +3708364232 +2962712911 +284977016 +758874341 +3181384809 +3142003163 +2708095947 +1420312684 +85657057 +2249658184 +950790855 +2698934228 +4244928433 +658790249 +2488895246 +2744762164 +2026680957 +1082474897 +1779487995 +1746704705 +2588083660 +2416190302 +266796250 +1576748988 +3716238619 +3515963939 +2254605920 +3765644674 +3710334982 +1654420468 +626615537 +591346655 +1039580119 +2399572940 +4033509163 +845058679 +1671124111 +4284167396 +227386726 +509090428 +316019088 +151818752 +3692524126 +2828222055 +1546564842 +639578196 +2827457348 +481454850 +672088225 +694481270 +370414097 +2105682549 +3661625913 +3847342326 +225556398 +4015661436 +935483918 +2777096363 +953569038 +692952710 +1868589813 +2740809723 +3816524582 +2341227715 +777715318 +3472478637 +2968135896 +464858102 +1349335792 +1255324974 +3684690477 +1176588050 +2998655245 +4280219389 +3328508307 +996399760 +687464530 +2206749705 +2454770637 +1572323447 +1457327950 +3441491867 +2347927127 +4231592261 +2131467975 +4225684533 +3750425911 +2902476692 +1831989553 +3264276515 +1294776675 +4218106465 +2899825003 +3325369119 +1794400428 +233989359 +2978117040 +1951415543 +2441875427 +211210340 +4136831823 +1805790624 +2851648022 +989280982 +296493985 +2956082364 +3893147438 +2595362419 +2791263424 +1307725008 +1300372767 +3557416253 +1222356451 +2438285535 +472224698 +2572821188 +1426798475 +4075417465 +1378228133 +3509889661 +395729018 +892330184 +469084799 +2891417560 +2593180647 +365853403 +2545947719 +1514108006 +1950604176 +362853718 +2394463714 +2312610337 +2778411609 +3081160125 +3880710807 +520383980 +3320436030 +2864663272 +3507676232 +3192807676 +1502749323 +1617949061 +103629321 +4255229602 +2605369924 +3856036167 +1822986851 +4187137153 +293950781 +3089133197 +3016598883 +3915299365 +3689149859 +1819038543 +1561748507 +2263051377 +4020936656 +2400140578 +4200906346 +1918434123 +3876146511 +4058735980 +3372388589 +1578154856 +93567378 +3076705024 +2702606871 +1830945437 +1840949190 +2933619734 +2401407845 +2801406319 +2855473825 +1332715583 +112513828 +3736337040 +149364486 +4159448866 +1119563663 +2066933528 +1623335156 +2968960492 +312995342 +397838019 +3180784070 +3755908336 +1418036807 +2718348544 +1960623951 +37206374 +3505849515 +517436664 +1543041191 +3092858927 +3273994492 +3627442259 +674957816 +527158251 +2286335328 +440022964 +1457400408 +2825757371 +1040997493 +472232280 +1042472923 +2475715739 +957284000 +3197319206 +863184160 +1572715831 +1489584472 +4164292632 +880255163 +1000280265 +2462713279 +3166090283 +1314200974 +4093569083 +3175701794 +3603168638 +3110473263 +1116057255 +3768529292 +1054268074 +2217481039 +3913419671 +2815295562 +1190173418 +2283240796 +2431165419 +2759516183 +4289525146 +1147520490 +1252927486 +1221212322 +653406020 +3150605799 +3559007670 +3545461180 +193988687 +2489186425 +781577866 +1753778781 +3548309472 +2853405758 +3251997616 +1089894177 +1556188061 +879134831 +4051196187 +4210602705 +2014194193 +2412680478 +3643503449 +2095751302 +3495770748 +3912667613 +2530277176 +73028723 +2834215390 +442830313 +1733095978 +672539568 +109474882 +1598433378 +1979873009 +372399337 +171589825 +143800277 +1696436794 +1094496170 +4188604537 +1519210011 +3767473797 +3956477365 +1440398144 +1665243006 +215549129 +1965218622 +1183007178 +2922674683 +2903177039 +2339952603 +65514937 +134626212 +1386214374 +4043221547 +2000203276 +3795126282 +834918496 +2281350778 +2556505544 +1332038270 +2362881647 +1836952613 +2290105776 +4287515446 +599438727 +1441397185 +1368295523 +1444423988 +2291074752 +791867980 +2120155066 +1422130535 +473406216 +1142906131 +2447992104 +3270148211 +459557915 +3516412013 +2322248997 +969543363 +2381908085 +3030302770 +3247269804 +1938580995 +1557254971 +955011420 +137874667 +2879242971 +3155192962 +2045965861 +1986236169 +3842186454 +3221957191 +1119476692 +3978466435 +3618317189 +1298034713 +2972114369 +3036109772 +2629993938 +1808628768 +611150766 +852793727 +2973388804 +750870595 +170592819 +1338677384 +4076498574 +663416254 +2976358658 +484522280 +1891785544 +2656828027 +3533790871 +1533244560 +1783163356 +3742534905 +4189262749 +1967212448 +3010741159 +4029896101 +1835177698 +2688260591 +3565149296 +870744808 +3831050717 +1782224164 +1419545891 +1966153032 +901272900 +721885063 +1753659274 +3962317387 +2909643850 +3414199013 +3218321831 +3873769691 +3084098496 +674678927 +2835747354 +3233797857 +3437936776 +1363083500 +3497919331 +3614212849 +1389873388 +4199593681 +3087287671 +4147323706 +1781304322 +3839762825 +1060073424 +2987823522 +311345438 +3319343575 +642320371 +960695869 +1673987029 +527645582 +724708596 +1822437314 +2746757863 +310026428 +242731315 +1141439252 +3330757546 +3372863919 +2414206019 +2557179005 +3442105709 +3058234476 +3618671496 +2464028187 +3413136724 +3585040364 +981973671 +681605477 +909482606 +3408733431 +2536238280 +946024162 +2136551926 +4260624982 +917109869 +3603957270 +527904031 +936489591 +1518291755 +1329066370 +3926969620 +1741428999 +1045355176 +3994414527 +1160246722 +2875626228 +4073031517 +3185095282 +3190677115 +3529472864 +2003694679 +2338355234 +1139528633 +1404501098 +3360037317 +1582678696 +593848262 +2562746181 +1630959120 +2798381383 +21646775 +4226554196 +1197578155 +1487316137 +2318905339 +1211167226 +1391332108 +2066319695 +2681058266 +672836252 +3150808612 +749932675 +3411600203 +468312977 +1029413994 +50297315 +3824741022 +1954383056 +629729752 +3534946017 +2199815881 +2750182672 +2284184503 +1930459109 +4032445559 +62306583 +1474506266 +2143021115 +2924197286 +3598119663 +678658524 +2416982296 +3157220312 +2217186359 +3778309733 +2733017442 +2294346764 +3294577448 +1749902 +2835015015 +1032711102 +3059340754 +2351107559 +2571691232 +2691571899 +2142911727 +339635115 +3125835356 +750501513 +710028181 +1707534387 +188714354 +1789144130 +151549963 +1432413777 +3036825005 +3083686641 +3254881206 +1292204534 +2238554521 +463081792 +3832880761 +1512978810 +539203088 +67000859 +2756728639 +3025945921 +2856857617 +1704000347 +3158605028 +3166161740 +493765647 +3823735910 +417250757 +2535929697 +471989927 +3611884883 +3858423873 +1838334979 +3121664112 +1876583492 +3866033791 +2273311398 +3862077705 +2514273721 +2991207184 +3147832083 +1202308417 +2533475622 +4056574215 +2267792339 +2958005671 +534620703 +2859075349 +4115637097 +3766028083 +3389781149 +134671464 +2165593104 +2501244495 +1409691989 +3483220637 +3280642810 +743455759 +4036213859 +1190014430 +2334177013 +1825385672 +2125910393 +940799902 +4068938959 +1015552402 +2082740943 +2877549196 +3336842407 +296176379 +3988195039 +3417846039 +3052834914 +1295453728 +130962559 +986481474 +3940683164 +1447308834 +41298016 +3562271611 +1266305527 +3353035270 +3591754680 +1641406940 +1047038086 +2520268377 +689749084 +3628861105 +3553997432 +3736240179 +947370165 +2568129072 +3655197422 +2315592422 +4145460845 +1308252883 +1946063060 +3679995534 +1002523047 +3873329281 +874132336 +2596652805 +2912891849 +2743775053 +3056322843 +4237547172 +733839003 +2879320001 +1910566918 +4254892225 +3716355158 +3390505835 +2570735155 +581958850 +70843317 +3433910911 +1976752741 +2309093151 +405730926 +3396023857 +1312243988 +3106841972 +3449826990 +3920812330 +520234304 +3475921910 +2872598573 +3513083299 +701347916 +3530415958 +2266499195 +2424988579 +630312587 +3543774457 +3523991566 +3966442971 +98181553 +3820458601 +3293750073 +1723570939 +624057197 +208083378 +587045363 +2317773293 +2998661943 +3314631106 +4140459897 +1338188110 +3659666344 +590191272 +2482823424 +462057698 +3378043801 +731703431 +1244422765 +1417422202 +1180727527 +60982333 +1344965787 +2532432293 +2846610129 +1368877924 +3833730753 +1575476484 +1238901986 +2665827595 +2964746862 +1778051998 +2121576146 +560610002 +3308733466 +3240748834 +3640543834 +3297574182 +4147269405 +4049079496 +3610900537 +885334178 +2116992622 +4239385266 +3680045629 +3757459339 +3435804232 +2637694217 +3269931150 +2625274759 +2547325881 +4264441239 +1863999079 +1125691408 +1462102002 +1017035904 +3342599437 +1822144406 +3983489958 +1387968977 +116156107 +2154643413 +614316305 +2218579964 +2230677057 +3903821086 +3781261360 +1506660879 +3154810299 +1416033544 +2748518408 +3221458728 +4131244365 +3002630685 +58669729 +3587873643 +1329783221 +1139410155 +353223439 +1754849463 +1365792432 +2455185353 +1179433101 +4211052724 +4047133358 +1185658048 +4218770503 +2048812076 +2220390174 +2583669162 +1691897391 +1572609274 +1061448207 +3891539324 +3008145042 +894159911 +2370911973 +3085552134 +4154059534 +3025268030 +399465207 +2528530396 +1156663267 +348543156 +480938579 +85319784 +2717929197 +2101292343 +1747302919 +943168085 +4025109980 +2047424011 +4122575975 +4067681913 +2073651131 +372903841 +228618065 +1449000298 +2409836863 +3563368015 +399640792 +3409613457 +3110123821 +876906717 +589792423 +1721944058 +3951645688 +2488082312 +2562303605 +3534546027 +4010033997 +2728601367 +1789824732 +2104652553 +917941643 +1853223280 +1058168999 +2359284370 +2514026075 +4290878288 +1134511712 +181306342 +916936239 +239178315 +3690428304 +3968534808 +3046454831 +2092174714 +893257431 +283896129 +4123607500 +276066638 +2169767133 +1056220567 +1545026584 +1674110607 +1616405861 +1816921786 +503021040 +3099578887 +1284870685 +862785339 +2944972527 +3962654488 +4049857009 +3180348326 +4274976559 +619512032 +3202746495 +1461523451 +3729197796 +546012281 +485446630 +3638805136 +1204589309 +1944418240 +3490430106 +1193253182 +315145223 +1767741965 +2871722934 +887096100 +155479919 +70586248 +523526472 +2505004179 +712725294 +2481248710 +2591340669 +353951777 +2397326412 +2693953107 +1035610361 +3098465550 +3653002013 +1272266821 +286887131 +2078528281 +1837081866 +3172380193 +3286700812 +1265188842 +257603744 +1526159050 +3239317408 +3035256811 +342481498 +3145421763 +2861131343 +1724757242 +1855314551 +437914567 +3626459803 +1224209626 +1454782822 +555766490 +617159147 +2402684327 +3888046285 +3860441283 +591065601 +3281721592 +882355477 +597719932 +2270863151 +2185106230 +2857285451 +2806462230 +290020219 +3647920076 +1353356359 +3659570038 +147917256 +240425574 +431572342 +4249747916 +4182175439 +2971308653 +4233704012 +1237742703 +3582323699 +1142510030 +3207347195 +2237589035 +2455770742 +3509976415 +3703776449 +1093644254 +2379183675 +2893736875 +139613105 +1958921963 +1003413787 +3591408245 +2644061402 +455299037 +3112939720 +1837282986 +2930665490 +2924339213 +881375428 +330915968 +3978315965 +2447092665 +1472760469 +1194017681 +176915125 +3793737551 +2688281496 +2625675273 +2006932892 +733289600 +3445581525 +753263046 +2760172836 +2124834590 +2780584626 +1719948960 +694910809 +3957177732 +2043602237 +3605504003 +2749138612 +1269766255 +2488353364 +3458446197 +796267265 +1850526686 +605135684 +1153556960 +919553465 +815629686 +3926566318 +1337401028 +3682118596 +3277383508 +907118819 +3458106813 +1538560792 +2642464088 +2760964834 +683718079 +1778772333 +667794807 +3581160937 +4249563928 +1983088290 +4017045972 +1435186269 +3676304887 +3436211187 +1593631568 +2332683154 +3181479195 +101877162 +108574531 +752333880 +1840421373 +2417524584 +3452898912 +2913694947 +1111621037 +1216660927 +2804498390 +686831085 +2651205199 +69377012 +3521019317 +4103615865 +3391685284 +2707870966 +2628603360 +3467429278 +546630790 +3162702746 +3660071557 +1253046394 +900670818 +2492415580 +3814318748 +300486535 +2294195364 +2019925105 +3924752794 +2579615807 +2495641659 +3955957104 +704995150 +1596897620 +3353717579 +3550753921 +2545703981 +141583252 +3417245029 +887242873 +2926913025 +1604091200 +3277652355 +2053137324 +2495677662 +765575392 +3231942150 +98130388 +1850881689 +500888882 +1265283363 +3167142483 +4016936965 +927756403 +1506313135 +1612690862 +4274304303 +1320414428 +1128871478 +1042051717 +2317166085 +1926820513 +1153250044 +476930940 +2269332122 +566320372 +2899451163 +4061322630 +2968171984 +727839765 +3953390712 +1561971005 +1484471403 +4209216530 +3652583660 +1345599669 +1373112849 +4129406447 +3586858993 +2013915842 +2618215324 +3543970282 +291473699 +1900271913 +579065028 +1445577148 +1734764636 +428689645 +2047704357 +3457282875 +3435323372 +615880312 +2120425937 +1537757191 +1230771292 +4123226458 +4069481615 +1750721099 +1362221706 +2946242187 +2945936260 +2426719228 +495687496 +1897491422 +1109070653 +3584388869 +2965019429 +709537929 +1825757391 +1847313522 +861976944 +4260205452 +3551543015 +1473060386 +1459268762 +2353092224 +2983993522 +3071605594 +483150959 +915942819 +4244239349 +3352357314 +2899033333 +2231930403 +4271016942 +1611584324 +1944185439 +2982619739 +52883924 +1230596604 +1226552059 +1793713260 +4087295303 +1624521400 +960809925 +3788478381 +55992491 +2092267855 +140175292 +2042532758 +409416631 +3633378798 +673305381 +2009686307 +3823405292 +1915097991 +3043890866 +1274903863 +186882025 +3134033686 +1338185984 +4202062181 +4026622659 +3920172125 +2892731542 +77176520 +2432998869 +4231668537 +1780069028 +2479641534 +2027541024 +2617465503 +574060272 +646195834 +2336699811 +3816221104 +3293511181 +1766247593 +2620169039 +818947700 +583180522 +2724420558 +3707638773 +1522602916 +3269237804 +1167894482 +147571080 +3520407319 +2394067188 +2647602816 +534805898 +1116600136 +1236482483 +2278400234 +2230700652 +2487434801 +3159188011 +4018616908 +876514618 +4213702225 +3994615892 +481621182 +2043787763 +1599792205 +2164161393 +1940582824 +2301482726 +1339368143 +601361432 +1812864019 +1119697930 +3429907372 +2986327790 +1193507648 +381560819 +2886478439 +3537628498 +3917602596 +2063848581 +1828728030 +728634271 +3847531094 +741838794 +2221933571 +778290714 +1624348815 +203740908 +2978019285 +2484073926 +3326513800 +1150132983 +2092331967 +1679183902 +1567379478 +2909093570 +2785099744 +2546706175 +4088620546 +993524613 +128397165 +1635228560 +2798190147 +1659701114 +4115611305 +251189273 +3158386685 +405185990 +4180132512 +182226180 +3739875880 +647812254 +3160427458 +4178741895 +1592892883 +2239872965 +1670530732 +4001899731 +2287923750 +1664877726 +1148707621 +2720141652 +3312088019 +3363899802 +3508474832 +2149736958 +563260003 +3735639813 +1786272085 +2872036885 +3876053494 +1378560060 +1115324571 +3862670091 +4133303638 +3458851552 +4024851211 +1114397209 +3593850164 +3788670887 +1960058894 +1931299631 +1291252227 +686514016 +2327192136 +1439651304 +2909853790 +10643866 +2983181704 +1815610277 +440517640 +60545619 +4039382759 +1180101444 +3939079178 +2424946546 +1171115789 +3204290741 +1011199030 +2883806370 +3598810992 +646234185 +398960552 +1589792095 +4014627745 +3020984507 +3791407166 +2803210157 +39958882 +3556956866 +3359296726 +1663791225 +816810821 +1022249451 +3070916455 +4024051876 +162501551 +34734252 +474668577 +1293795135 +1427868940 +1415072246 +4175104133 +239560076 +2832167198 +1536139959 +2484814431 +3580896917 +1086090823 +3777354849 +976007859 +3138896329 +3804532703 +1359489854 +120426470 +138445615 +3493817474 +1369434188 +2054877620 +4074876750 +3847055164 +3449485536 +1522782794 +1966260098 +1336310434 +3465317035 +752574712 +2505357953 +2351397846 +1972120527 +3642583779 +1804834314 +3511267820 +2166021766 +23469741 +867164904 +3579820213 +1811029422 +327306994 +3755735784 +2753769954 +1001260352 +3240659724 +1460629871 +4143243837 +2160439503 +1527985956 +283298003 +3272311076 +1721675441 +3355305663 +1287924298 +3872961587 +2761006046 +880508729 +3508830817 +2933594947 +4176829079 +1948115109 +4274571295 +911892657 +446475305 +4250377164 +953094396 +3024636279 +1664227828 +3587647852 +1702630044 +3653623612 +3365688915 +673863904 +3196822240 +2736567713 +807192783 +2159912913 +3550734795 +4232840834 +540111583 +2213396166 +3614801799 +3785683983 +2828730473 +1387202617 +3262961006 +1287147506 +4013859825 +4196462471 +2327301849 +895031256 +3389174449 +967326046 +3684776205 +1707904932 +4091656982 +2113041463 +791071974 +20524455 +3181807148 +3706926936 +2448238497 +122186702 +3480872764 +2226682749 +2580338112 +1535900716 +2946194043 +2637374773 +3367677639 +4164123644 +222131265 +4255360488 +4092117181 +3353416993 +1337575243 +2047468006 +978213222 +3000395650 +3264852132 +1935145696 +554022652 +3318096365 +3099825827 +2745109632 +917672276 +618501112 +3423980576 +3880725741 +1796989509 +456887690 +1805188258 +2480264640 +4133908519 +1439785858 +2200640015 +1560482324 +1857115954 +2941486269 +943192565 +977611551 +4011944304 +2724621788 +3035596865 +4253054498 +1023949920 +3720702667 +2463738988 +259383664 +3067653320 +2272881370 +1596905751 +3232025444 +2222532567 +3829657832 +2643897108 +3881632560 +3588385846 +2492619040 +209837514 +2856407056 +806133587 +1006587327 +3982386845 +204688831 +2922318100 +801078712 +615322702 +1631824259 +3453541462 +507823991 +1050166476 +3372328060 +3870076460 +3584572481 +2845104979 +2899344591 +1741721887 +3754497246 +3337405838 +2063569175 +689655092 +181941086 +2692155345 +76255394 +2486816583 +1124601577 +2669461928 +1575299584 +2655705049 +899260232 +262298307 +1659864988 +270036991 +498106967 +1392132870 +3206717511 +4184055560 +2474939575 +3620827204 +2646378619 +2039360512 +3341404992 +3694504978 +850847949 +3195409169 +330889071 +2947982617 +1503309245 +748665943 +3383064787 +355221882 +2959832928 +2886120753 +4156801622 +3054803892 +1354565557 +1993848820 +2986554767 +3710908426 +115746314 +3775564806 +2493901704 +3539813706 +564984584 +3686781124 +309129893 +1289661366 +476425821 +3050265499 +3737588309 +2271118851 +852939262 +2573154506 +104851298 +4134935230 +825496155 +3820429688 +2725572788 +3151600700 +546564169 +1339449251 +3154361067 +2987904365 +2414915741 +3663693521 +1237357550 +1005288831 +3136839510 +1912180507 +1460182527 +569176166 +2559345397 +3796315753 +2467340857 +1947574644 +3248469502 +3830271309 +2421458660 +1777602127 +1751629361 +1205845716 +3216084322 +4123837302 +3213884383 +2237029993 +3841895658 +2875481876 +1545087813 +2880852697 +1883396234 +1755740685 +4075980697 +2481044100 +3094604137 +2776451248 +1366398251 +4127686011 +1762134921 +3494504955 +766383201 +2095767921 +944336079 +471409333 +3928571481 +1401961671 +1634101824 +4283945533 +4113069598 +3053629239 +851194195 +1677644218 +508380865 +2080736750 +1845703116 +1796270707 +2761946734 +2040576374 +1998841212 +4184541584 +3312661055 +2493376214 +1527143736 +857099307 +3907800761 +1326819739 +2404798326 +1478011703 +2502823970 +1659582601 +733828613 +307786773 +1221265805 +1209292062 +3562020162 +2970490746 +2717032959 +2936701153 +2239423836 +2138685300 +2909155490 +810553898 +4086317833 +1595962063 +3146957314 +3658216126 +1788240451 +3459399211 +1994524283 +1892216884 +1793996774 +3080239129 +3057614559 +3507006822 +3059170399 +3109744897 +1024827327 +2429573319 +3986040741 +3394715785 +54275091 +676759287 +1948146886 +493931097 +268824119 +151374007 +1225012483 +2981230773 +3226269145 +4089725375 +2820032268 +2815687307 +2726923920 +840901154 +2901991780 +688939822 +2166583274 +3274168472 +907016245 +4273464335 +3174636318 +432492654 +1742744754 +1825058606 +3430316200 +3483785833 +876746456 +2405543541 +245974786 +2045033743 +3795717527 +1156486141 +3090338701 +2083422369 +3227238470 +2488118060 +3438919689 +3562850078 +3603323183 +3617964421 +1017912961 +2922592775 +1930586098 +404112881 +3605383791 +2606872575 +1712634854 +1706234765 +3117924093 +2423669569 +2639244868 +4023347841 +3862858485 +611178223 +1867119258 +723344588 +241772547 +2531543004 +13779570 +825509432 +3577117569 +2850742857 +2314478573 +3746115131 +2663336349 +2624455658 +180975663 +1863903983 +947828028 +1161167544 +2606043726 +2274422895 +414158687 +2803114840 +3546675072 +1045232530 +3809506644 +3350642821 +235333787 +500583158 +986450680 +3878193718 +2503031807 +3631329736 +2800533588 +3009594418 +1194183188 +2648649090 +3801099205 +69571050 +399525567 +1951482348 +4161500229 +3147454558 +2599700000 +2582216162 +757231428 +3141847097 +1160327239 +2571702188 +1227547821 +91172335 +2928764302 +3736124980 +1592532630 +2546327698 +673545665 +914402769 +857004667 +3767968153 +2497460102 +3042184258 +1499090141 +2796580079 +3361327927 +1052420484 +2746426563 +4215973645 +3916872195 +4061352545 +1168149261 +460843489 +966055360 +1275767801 +4103864957 +2964988396 +3270751176 +1404654274 +3935888563 +1389309141 +241845471 +3449851435 +1100207414 +1822062020 +3477666497 +2724267027 +1793664763 +3416314365 +3978867774 +2033421221 +775018110 +4099289150 +164485773 +4100728058 +1537716550 +1965446674 +2061296604 +4087238632 +660666581 +3579761655 +3536732081 +4255195113 +378839992 +4088364244 +3362441934 +3447479250 +2926245298 +745560828 +959079975 +775528905 +1993512800 +1976295932 +2423657970 +1737233652 +3940261730 +3346886576 +3266532455 +233357644 +150328546 +1453994008 +3825039007 +3524238979 +734673223 +3930047413 +1248842398 +526223791 +377992972 +169968448 +1256850754 +2241443254 +3515872227 +1423311720 +3372047105 +3368362433 +1329697068 +138928688 +1112781690 +608785942 +725584520 +2869191968 +3333185150 +4090064587 +1320454714 +790748931 +1390640781 +3208079453 +1814115617 +388438839 +3757016480 +740776804 +1899537292 +3663085476 +2682332645 +2802275954 +110249562 +1430736919 +1976821729 +2656439037 +854276829 +2376506050 +2824247488 +825599913 +1423935721 +1951094149 +571387878 +1199136424 +2786239153 +2551018171 +4058373402 +158446665 +735910731 +1167793266 +3161657477 +344567477 +2178795020 +2028434463 +3856664779 +2542974484 +3868131896 +414093236 +4079987224 +2675966445 +1794531615 +2685351840 +183924548 +1005024555 +4129401211 +1853620535 +58369304 +1833246080 +1749817563 +1000221397 +1893192527 +1711092049 +1449163490 +4189188271 +2024567187 +631056517 +2132837126 +1470316964 +1559793236 +2991162021 +3954559447 +1874228933 +2126654760 +3170592105 +3958813222 +1712811620 +1360247687 +747200754 +1475617887 +855817054 +1369310520 +2190342726 +47255060 +3026655751 +4174866675 +4126758652 +3934942247 +3961440490 +378738545 +545470005 +4200547346 +1687114821 +4282010611 +2224040946 +930363125 +4083710342 +4241863289 +1755930622 +3002277751 +82365682 +2279416820 +1561741121 +1638153987 +3148280623 +3421134864 +2444094859 +3237388010 +318586465 +3736030294 +2314569358 +1876060335 +2598802871 +2523816067 +1777313571 +2279733244 +796209402 +141807726 +776255092 +3897028332 +1472026714 +108444758 +2974524080 +1133291302 +1021770847 +2416651383 +399225468 +2491394697 +3532354931 +601008975 +647914911 +195285001 +2214134828 +3742747319 +3926783495 +1114709281 +1898035966 +2993063823 +1353007797 +2010192759 +978896501 +2196801141 +641307943 +808339861 +3884282080 +3058210286 +2251333130 +3813775720 +568292298 +2039178848 +2840915714 +2497173099 +2290352788 +4114962203 +2758743752 +2073588710 +1393098267 +2048692371 +339165315 +398369292 +3354771573 +1975251779 +2076968628 +1944151925 +3511406495 +550201120 +1294637265 +2747350555 +1009326648 +958349398 +1084644566 +1496021763 +699234380 +1719379073 +2017453108 +1579421331 +2654207520 +2126524394 +1720566410 +2294344593 +1883100246 +3929849536 +2102876183 +292725670 +666468319 +165807653 +3652736435 +531528742 +30059607 +3826666361 +230404814 +1948351349 +1938374805 +710633500 +1868990973 +1223389883 +623666020 +1164136379 +625415764 +3603579367 +3532576994 +2841436474 +3808935020 +2903739886 +425207026 +4268032040 +2395997940 +1358269113 +1665031312 +349386507 +1435084746 +828004328 +1551563080 +3381312740 +1265160770 +3662912000 +3187912684 +1704262985 +953811173 +2024349449 +2826854644 +1957661484 +2398250250 +233340394 +4193630341 +228888093 +2485809323 +1132111929 +1436540839 +935707174 +2999016495 +1095441160 +3747700707 +1327572326 +260247083 +2213613742 +3829451103 +4118793695 +3758171442 +2982848550 +4111131176 +1450883515 +2387725606 +3430893526 +1862142251 +1886356996 +2841082120 +3181734290 +1331201922 +1643433306 +163444346 +2727469679 +4268435796 +3563589463 +1217726467 +3221146314 +2527007768 +1443967687 +1690847010 +3598975533 +1008962022 +4262656698 +3619657446 +3317179852 +231329621 +4106132776 +431003563 +2336074294 +3072177494 +3039556024 +112797682 +3459957342 +1955564451 +3852953079 +3410024728 +2682783175 +2800235398 +581284247 +2647103025 +891027066 +1914753657 +193489677 +3205262842 +1105386412 +965199743 +2136738804 +4163537425 +4007274364 +3752597043 +936756635 +3163358090 +1607065984 +845896619 +4052437086 +3668872358 +2910213851 +1805080432 +2569118948 +540759015 +2703498241 +1653433675 +561483256 +3886314959 +981231253 +1282496843 +1294066162 +199773304 +1124297107 +2187428461 +809593888 +4259263599 +1185589396 +1325175628 +1538053772 +605424139 +3063273106 +4213087889 +1154825015 +687687759 +4168202984 +3192604220 +6430357 +3728472387 +2294956558 +436092569 +285007750 +2643795719 +553758856 +2276580974 +1502263387 +383546497 +4229270222 +3728598714 +2823330951 +2209987064 +1778680921 +1660655934 +1107378493 +1517612389 +4116725794 +1976824406 +2556207788 +1589084310 +4028955480 +3906759871 +2332709105 +2905948472 +983596950 +3348528031 +4150827293 +1835115947 +4283612338 +3283407027 +4243150330 +1883715861 +1089601111 +1496855821 +2445070420 +47353556 +4058287806 +1954329467 +354588538 +611980456 +2798608028 +3632702485 +641662657 +618678627 +2274869334 +1650127829 +3402835754 +1880213078 +2693629845 +3297798283 +2586677005 +1063736432 +2186259403 +4277976630 +1458179095 +1543570948 +2813495974 +1661790444 +1787603551 +3468649583 +2365870573 +3835392787 +1569675155 +2789177241 +2871070002 +44289815 +3561687666 +4264427417 +1032749718 +1791526668 +3499990157 +4252330402 +116860105 +2831869905 +2276032185 +2640868263 +2498966451 +348359156 +153164435 +2377519818 +3516998559 +2355989140 +1209571079 +619236673 +1832722434 +253081680 +2522731725 +1287165150 +4183820251 +3619952776 +2024115372 +4010932045 +135599415 +2530274303 +1819958081 +3692065474 +2247002978 +415893043 +337793862 +3988535114 +516569459 +2311337332 +3004913337 +167847139 +1933499459 +737033885 +3368303092 +2353580343 +1569196132 +260775848 +631822041 +1453048275 +2165934373 +1996319991 +1532049646 +785110424 +2948573273 +3358204485 +787336645 +3089579635 +1159905025 +322484591 +2552412826 +1264810194 +528242115 +2258112709 +3187537362 +638493119 +885887206 +2470269660 +1750183174 +279759863 +2434016297 +1801855468 +2885290784 +678398086 +659907727 +1285277461 +211327911 +3293665008 +2474586708 +3434105651 +21878545 +2547657136 +3367581145 +2501245488 +1677639530 +3646283698 +4258894230 +1169160915 +3239448939 +3918209672 +2058839824 +1489075292 +206899403 +3476443022 +2417069751 +1530875696 +3415348595 +3431061021 +1417336537 +3463501934 +1150279297 +3921771632 +1006458386 +1299124164 +464647532 +3009900045 +1364338045 +130128719 +1773693508 +369171718 +3829249103 +3984057682 +3688308300 +1104426736 +3300271980 +3715154442 +3387370149 +3999252464 +1409946283 +3815207087 +2142132933 +1500426618 +352959056 +960557162 +4150737919 +1449564852 +2807662641 +258268257 +3804736807 +2119860667 +2976857917 +939735643 +1122811283 +1193849915 +3605232626 +1952352741 +2539755181 +1845734527 +1238864299 +279727482 +542364957 +891483541 +1043956716 +650590695 +2437428391 +1454788582 +3418086715 +353962164 +525857861 +2902720074 +1843876395 +1080492233 +2164626154 +1303422828 +3805887842 +3293933440 +2093715154 +643488723 +1745734862 +2437429415 +1246254526 +2540997954 +2701102173 +1802045384 +1056369877 +1037814521 +1994221912 +3284018838 +256910653 +1799066194 +2608590616 +3827475671 +1225455284 +2743292286 +2034201651 +1133360988 +395487668 +3032056438 +474289207 +1940679172 +3622337070 +4008852317 +57936294 +2932630872 +1465851257 +1619090210 +3863854609 +583770373 +3331245604 +4205589379 +1568890202 +2722198259 +143788720 +4162474096 +2720419441 +4102842412 +1594515990 +1798396977 +2053005769 +3522437437 +3492571346 +1086528356 +173021874 +322111527 +2188596390 +1311995950 +492569398 +1014630112 +208859493 +3529214436 +1424817705 +4090092731 +3677173665 +191298450 +3026473167 +484662683 +764600937 +3028130136 +2792373700 +2928958260 +3946701091 +3491356166 +4071037473 +1432007865 +1122004236 +320774582 +2726704527 +308301120 +734265277 +3747284415 +2960075603 +970523047 +2774524778 +3526120441 +318821356 +4208002082 +1470873970 +4108535807 +411233948 +4140481695 +2807023922 +1998219664 +2575502840 +3026369128 +1374855628 +2262935509 +2659028748 +1704434554 +3996124259 +3607405669 +489510327 +3668807315 +485310392 +1757500630 +1327888884 +3299300568 +2247092148 +2347951171 +2781076687 +2429151958 +1106651524 +984271124 +3877603713 +629411457 +1324531036 +489305053 +1274985618 +1522476438 +2263654118 +3231789403 +1650238950 +225601962 +588667610 +2089377664 +3273346657 +2175232552 +1637196643 +1385250623 +3494190495 +969942485 +3867963234 +2519077395 +3888707853 +3259534670 +3431353456 +2617742908 +4121329013 +2046600736 +3602761641 +2629530955 +3738421205 +3921107208 +1506043752 +89372295 +4284343701 +1932265561 +1274044780 +577677243 +4082120258 +1323349162 +4206996756 +491024287 +1479857632 +332179084 +3358009817 +1638643918 +708703569 +3804792479 +1842472668 +2127766971 +2444911728 +3703514844 +1464902833 +723742853 +2406048626 +1381492237 +3920702747 +62682268 +3570222637 +3200983362 +1997437933 +2748983060 +2125594095 +734188255 +1807639286 +806397388 +4172500799 +2382733404 +2047115764 +2376265705 +3579919889 +2834589797 +1287785292 +1058238843 +3026624265 +170599851 +2177415497 +2089591548 +89983709 +94959992 +934653119 +2279988645 +3475771308 +1449668259 +549225208 +2169832108 +796272129 +2816557008 +3017116962 +1162012558 +1500459218 +2399059329 +615907262 +3254350469 +2276910954 +3825709050 +382298444 +1457402998 +1573213699 +2501387930 +657054009 +340863437 +3384302129 +185683612 +4252668756 +2162961454 +994469714 +3244906567 +415613965 +3255163410 +1057902240 +3973177532 +3016282204 +2810503857 +1099336678 +643985328 +3645763883 +1629343907 +3519080453 +3462318590 +2080218528 +2252799113 +1069935407 +3353846162 +4269297285 +2492484616 +2310553402 +3499937373 +2595944778 +3502816614 +2980600437 +399946912 +2469392546 +2655396851 +3718014020 +4241150977 +3750967049 +4238107176 +348907482 +1196090257 +231865515 +2121340242 +3486184058 +175715048 +2893847225 +2946302023 +4186229563 +2847229537 +4000848006 +449369495 +2438921321 +2898227859 +3063968661 +884045055 +1766034348 +995273506 +1027275999 +3341320275 +1271532241 +3735719240 +511704102 +4111484074 +3071136090 +1062543750 +3250248392 +1243207588 +3485006011 +805526109 +2918868241 +1842018183 +1524804061 +3602284655 +2334306425 +374711291 +2715478168 +4025326669 +2847643425 +2950429535 +727658534 +3364183463 +3540131568 +3462081513 +1838077517 +1850456626 +3996818909 +2064516899 +1917728193 +656423362 +3776278708 +3562745832 +248933355 +4282297794 +3776619682 +1283899283 +2060341308 +4178281200 +581921113 +131924089 +1187219057 +2094132971 +2133595040 +1818915636 +2056819865 +676565401 +3861140731 +105390854 +1249517253 +1006261388 +3530260674 +2186592614 +2068302487 +1865041360 +4178504455 +2997131432 +494804323 +3494719463 +3512032245 +2413839129 +1161887867 +1257093559 +69001272 +866357344 +2807458538 +3390170707 +1245165883 +3238880139 +1120975621 +3254029404 +3939757183 +2287021915 +2031941952 +654417580 +919147117 +3769751490 +1189715979 +1496559065 +2676906708 +1254354486 +891517969 +3504583503 +3606210672 +3609419705 +1007728947 +2885698645 +3238062356 +113666966 +83338145 +494857792 +992109589 +1001352429 +1487990778 +2046366192 +2447895756 +3076698831 +2548519482 +496866210 +2511202819 +3981026561 +3376590372 +86857896 +33450278 +675917229 +351390892 +2976589726 +1164711943 +1957275035 +3399121335 +1134381562 +3079990171 +1910259019 +579771312 +1337285621 +3668755409 +2007977799 +4277283238 +2867400959 +3132865559 +1204776323 +4277991819 +3704216435 +3678218513 +703944130 +2549557572 +2844283276 +832835251 +3010151465 +2187803273 +439369188 +1615869008 +132336587 +2405915614 +159181347 +1147998845 +891742232 +2038132952 +138040549 +607560226 +3780508446 +1941356205 +1053123190 +3169960918 +789669399 +2680332642 +2240055460 +593337223 +2530103278 +1974598163 +39712662 +937672441 +1929072716 +4170795187 +4037242626 +2732669872 +4002484920 +1579312526 +3125087293 +3186314822 +3375041308 +629346386 +2299131681 +2416199112 +2766153432 +2177343516 +2516507248 +3933501957 +377734948 +367840483 +1355216707 +3515895781 +1266230047 +1837464284 +3701383125 +151644088 +3896506290 +549601583 +3359028518 +3602935319 +3838277810 +4064412263 +3923499488 +2739507691 +2058046327 +163913310 +2173633815 +2341971955 +130536043 +3171580982 +371496966 +117463743 +1757419973 +1436322334 +2945372806 +2219109750 +4282059032 +3769791130 +3322951499 +3670197848 +1955517872 +2419522330 +1097047760 +3643977740 +2878413065 +1617623470 +1518216417 +4097167721 +1907451961 +2174777465 +612715155 +2068411776 +1572392671 +1389374598 +591030711 +2575605467 +1777803882 +1151256558 +529924297 +2790865965 +1975197719 +1759012785 +3816878200 +1577052675 +628582078 +4083575037 +554886972 +1926667008 +3521741423 +3877053695 +2049854812 +2695844126 +2803850944 +2071406279 +2013048948 +3182226498 +3897703189 +2710218964 +3904637666 +1199785882 +3258768852 +881543754 +3895948206 +3072085059 +411630154 +2883920407 +1374655385 +701952761 +3460595236 +2942225736 +3184633492 +1527177315 +781707594 +1610168205 +2187579510 +1251827552 +1796024704 +3986827763 +2216386708 +4100552356 +2341129090 +788834784 +1537127777 +3601799648 +2239920191 +1067457066 +1580427509 +79756789 +1622982463 +1838153936 +3694873781 +589172680 +3741401636 +918210766 +1201676276 +2662495203 +4049295052 +3689802762 +3891218971 +2369285927 +2589219029 +2820005386 +2875656029 +2160673057 +24000054 +2842787445 +2880195501 +2720777235 +1626472388 +485267693 +917479883 +2639633721 +1182047994 +1767884771 +3943534960 +4257975117 +2588453156 +3591040588 +1267857743 +1594345744 +3882519453 +4097804565 +421404231 +2107683143 +425044549 +525598606 +845178443 +3637910330 +2443325255 +2531547007 +1150692316 +688313505 +854617605 +2510052319 +848445191 +4131764262 +3205647133 +602734751 +1868645929 +2633755500 +2071937890 +4230215643 +9253297 +891793665 +576427548 +2624930681 +535437423 +1936162123 +1786466657 +2797162395 +1425358347 +1496394902 +4043725280 +300066888 +325515779 +780605905 +3724384721 +1601892696 +2904297014 +450222328 +2336984333 +2034730636 +385350378 +2264797559 +3406700747 +2786679515 +1458446789 +2148730415 +3212601636 +2480721930 +3136253128 +2950803516 +1658446624 +1558433421 +3280014121 +1769170472 +3311328763 +1768028748 +3018422801 +3177751193 +3997949987 +2378365002 +4101896776 +849945248 +1989028684 +1947163785 +847913355 +100093336 +3263710662 +3314423117 +175752480 +3300293205 +887377084 +253741758 +3206721478 +2409834760 +2793259205 +1381326887 +3545401453 +1492773640 +3825968488 +245475195 +2218644609 +3579481662 +3341503369 +150361874 +1459228808 +2679241297 +690653449 +435737045 +3962747981 +65770814 +3438935318 +300453530 +2147089463 +4142077334 +735151461 +656696534 +3375754717 +3595369459 +2559965423 +2154731038 +1553133357 +2762750016 +730096809 +3258593047 +2622552722 +3455918165 +2316075167 +287581097 +478538845 +1871209794 +3858788548 +3433237539 +1936543284 +4105782609 +938134531 +2650209641 +856696922 +477046137 +595661894 +2396434295 +3678730933 +2297267849 +2336478323 +2297139598 +1274968075 +3222018761 +1136942158 +2356786872 +3287781262 +2580891897 +346644794 +2063941337 +2662700467 +683650578 +1962440125 +2229564348 +3349121418 +435091876 +840485573 +4258486331 +2770840495 +1523603141 +2960528534 +3248947786 +550092275 +3912921828 +1963986484 +3669867833 +856113567 +477087908 +3649861611 +2506329285 +1277406468 +3422406930 +523361192 +1697120518 +2738097488 +2606769864 +137695141 +3294890726 +631772438 +2686659989 +4266465133 +1336848912 +3189301592 +292595718 +1344951727 +911425886 +1057116958 +482267610 +2553667575 +1659839959 +3520359094 +3088215602 +3083109370 +1068275552 +2758266155 +641831156 +3947625857 +3334007259 +1646367971 +1931842943 +1249404838 +574870652 +1333019709 +3481869825 +4200775280 +4271250924 +1664262908 +2154389883 +3986443822 +3142878643 +1441610366 +624984239 +602536285 +3438179642 +880027056 +2042857709 +1140931327 +4088410249 +23850948 +2079935663 +3366955732 +4116579647 +3671404780 +1049505973 +3111444019 +3089407658 +1234169506 +3574629997 +1372202544 +3971770400 +966210302 +993785461 +1958007560 +3626072553 +3384203886 +3330867375 +2030165545 +464677954 +2717713164 +3180779233 +914822877 +1682078534 +3341242411 +2590584257 +1731856628 +2944051524 +2607749889 +1850316647 +1857125386 +3477266218 +2097724808 +1762595157 +2710102171 +1585851918 +2516823581 +1597266602 +3547858735 +1286097839 +3844218151 +2854549031 +1771863494 +577024113 +4291140492 +2815500651 +3351167357 +565171898 +4003273925 +1130080893 +882284686 +1612958798 +1608318602 +1306795426 +3242059792 +130179064 +2772450371 +3563875947 +1681560625 +3321046334 +1573797546 +1441040001 +2082800096 +1149876992 +220831947 +4235041068 +3263921475 +1010577479 +1775648636 +4121603500 +3556349310 +3935895010 +3598096810 +1730637909 +4203800019 +2711578025 +575967838 +2418363113 +892361647 +3286163672 +3239236140 +3112646023 +404969539 +1387416713 +1966503119 +3912430807 +1453163197 +2039125598 +2117050729 +1283593048 +562488191 +590149329 +1245479908 +439114535 +2962636392 +2062723840 +2531373901 +1054775254 +3875201408 +3590061661 +3576282406 +1074547880 +1844848602 +1006090885 +1946314825 +4053238432 +2845818885 +2991503243 +960899522 +3428204880 +947979437 +770937941 +2846121288 +2297524112 +929989230 +348548903 +647118738 +900865774 +1251336894 +833210651 +2038496543 +2012634034 +3329435286 +2216047127 +858942655 +4028216392 +2855068852 +893305655 +1836642562 +3540764531 +506471641 +952458287 +2555313950 +2952883688 +586435152 +2642193165 +1937405005 +3420649149 +787686053 +1408746656 +4040601856 +3925001117 +1882265971 +349323309 +4147068211 +525924427 +903620262 +2673607875 +2724854936 +1152992292 +333673729 +2656483720 +2371203499 +2824597303 +3431731188 +3945085282 +2584690544 +4024957330 +872981023 +2080699668 +315002015 +2056544398 +2958314126 +3255717234 +3414112410 +1566472534 +697474747 +3798681867 +4070338786 +4053357760 +1873195758 +2008244683 +3662067012 +3923716878 +2082746945 +2050337216 +691461751 +932305351 +2368433737 +2787389461 +2657985806 +4035378252 +1224383078 +2169923354 +2818168385 +767627428 +130321209 +2005437938 +4138921365 +2455059787 +4089200620 +4027046377 +1185220818 +2576689164 +1473319152 +907721926 +3183777599 +1296139421 +98671595 +830061231 +4146591766 +510560119 +1794616846 +1922007307 +1978965229 +415361570 +1878868899 +2812058514 +1473550389 +909702452 +713290203 +335833463 +2096889573 +135003365 +3453819578 +2416975095 +1830940831 +3966596130 +1708580472 +136061856 +3932718833 +718590921 +1100340751 +654062291 +2101220003 +1974790868 +905171299 +4084603576 +3697523584 +3130831902 +3982014629 +2208849930 +3672315369 +1966621392 +487935599 +2768892209 +2240431049 +1890583171 +810837392 +1756908018 +1218086116 +4122737848 +1662774768 +3496726900 +2598916520 +927808956 +1269001439 +1929954059 +1526413926 +3075200702 +2452717051 +3442328435 +791187447 +621850592 +3934948835 +880659235 +3295469625 +1491248533 +2343613062 +3930159059 +969653437 +405622430 +1161453090 +3195437117 +663798156 +4164266705 +1798393898 +3761491289 +1265619637 +189625510 +475269326 +3009234539 +2170098418 +1275980005 +520530253 +3507120963 +935456854 +3025031072 +185025029 +591809817 +3343491820 +3220719415 +4059158410 +1011334579 +1231003062 +2134445901 +3254642584 +1191962849 +2317417929 +3535407621 +398169996 +2271145348 +2305008591 +3399853640 +595858878 +3597620309 +3747963020 +991449772 +512330298 +2905615893 +541788562 +2316528591 +3712175997 +1668264912 +2729201056 +841513999 +1617128581 +2710639368 +532645081 +2899867308 +1675815720 +4114838097 +2463004200 +2148077196 +2949141814 +2293925651 +594154854 +3708485132 +3409294965 +3695511114 +2035488763 +1513634233 +4046615385 +3622342502 +2675043127 +689236315 +2703195176 +4283073535 +2713015807 +191250567 +1477666714 +127178869 +2440286674 +2808849115 +1115580105 +3810377386 +3386044672 +2294636114 +483255793 +3759169502 +1656008257 +309323435 +2674945640 +3360787696 +1784423692 +501422200 +3025736043 +731020356 +1772676243 +1175816334 +727245809 +770391884 +573876373 +857847454 +2982653472 +1429440140 +2201679787 +3730525643 +536700475 +4145334724 +48771505 +3340417167 +4099830573 +958857246 +2251289559 +1813060961 +4132200375 +1249199860 +1120669515 +2513010015 +3959007433 +337860382 +3619297004 +2078406934 +4293027460 +3071349580 +4010280375 +503898996 +2671542878 +2140297962 +3131696409 +2972866258 +1275237612 +2601347399 +2694005693 +1521187928 +3484568315 +2910684460 +3507702140 +2598847027 +2738975448 +2757960766 +3310974482 +1535484096 +705373410 +1049733700 +989184954 +61060348 +2797687264 +392547146 +3188002665 +1623364721 +2166775961 +4212126388 +2195837218 +1733799713 +934170246 +934950936 +4001208537 +989072333 +1324503152 +405941817 +3963822912 +1076167863 +3854373162 +4237067789 +859673005 +1344015591 +1089043174 +1112149325 +621931598 +2288163518 +1970828627 +2367836018 +2649297164 +2102180681 +1604769237 +2117528291 +203539547 +575615003 +2543745269 +1915751919 +3841308677 +1291935899 +3170163709 +3820883648 +3483408410 +3906010760 +4038374606 +4129767217 +469365683 +3059250631 +338999412 +1468711634 +3415658357 +2674019779 +929176153 +1834663573 +2504644124 +3693474114 +658438337 +2962624967 +4030715259 +1698273259 +179543369 +3988707443 +4139845559 +2144958133 +1275856505 +1124923250 +482856845 +2493737622 +3837591564 +93557415 +1044265321 +2611056804 +15064051 +2434951573 +3362935165 +2079431651 +4189872877 +3885101754 +1422631042 +2670735775 +4200705529 +3653141840 +3377810567 +2563335046 +3318998883 +864595373 +3632521141 +3789650941 +2793114170 +2956165912 +2487446629 +1416973871 +1150296071 +2524065988 +1237907238 +1886638652 +3866144674 +3888713740 +894386581 +1617683464 +2592411 +1513808223 +1736222609 +1121077821 +718469993 +304048163 +869231666 +3972317940 +4138287829 +1483019385 +925105553 +383912399 +3322463284 +3729197148 +3104650608 +2908782832 +2934605117 +3242514653 +1329004398 +2418294429 +3158688974 +1197303719 +2408675635 +738026694 +4082815940 +3011981434 +3420435341 +432064619 +672457503 +2628384122 +4233461196 +2423806022 +2369840347 +4104669828 +2636540820 +497346805 +2927469842 +1052366076 +318817583 +1177944495 +689237361 +2682042411 +2229276317 +1613578233 +1924614074 +4106739492 +2091084652 +2092331271 +2913224719 +168428324 +2357263342 +3422115895 +2607496061 +3147042577 +934095551 +145035794 +859772029 +2625694116 +1229834055 +2390255214 +3011597964 +104963460 +1003219059 +881927680 +2245209344 +2961527999 +4041086898 +2077431062 +3143403809 +3680044939 +2246517347 +2279704033 +2954631272 +2194732960 +3543379667 +1162643960 +3731418634 +2622241917 +296187331 +1809401482 +2809037910 +83490358 +1858217959 +282548897 +3636258734 +3571960751 +4203965387 +528274621 +3712165566 +651207474 +3714635581 +1577538685 +1400777546 +2048632056 +2683680224 +571464905 +3309179557 +79666099 +3142802840 +3331425290 +896619580 +2365851259 +673532624 +877511892 +720250859 +1724838938 +3997003299 +2746970930 +2211634420 +2361646279 +1797251097 +2278449903 +3720233432 +3530134728 +4093044754 +2728500213 +4048806213 +3709203622 +2040062920 +381930837 +2299529538 +2128865771 +1592492301 +3009749409 +1457750084 +571132770 +2693083246 +2013231260 +3714498560 +464953906 +1349459366 +858600816 +696096440 +2008807875 +2987583724 +2537297081 +2388969680 +3529187101 +1386785012 +357580294 +3674938714 +1578131871 +3665480461 +3524120014 +1024979456 +2524370630 +3120078624 +184502714 +3878224599 +3055908752 +2247435689 +537504824 +2750190610 +1251897105 +1942822668 +350565330 +1457163877 +3134889676 +1336407957 +3441142268 +152522557 +3088177633 +858467730 +459763377 +3085947924 +1252155455 +1723497561 +913103063 +1234626560 +2294331055 +535563528 +902876111 +4082172307 +4038845661 +1820004721 +4284953194 +1533312352 +982450520 +1854435329 +549487898 +2693130425 +3491907154 +2004400782 +3350296433 +3958160802 +3253117091 +349103893 +3542718798 +3502617015 +141041758 +141799095 +3002942017 +1150919132 +1977754013 +111654600 +2945685510 +3778891727 +3078563533 +2051660871 +396829123 +196430701 +1751932029 +3583645169 +2686031124 +385761245 +2849420050 +656568602 +3312472415 +2046971767 +2251413451 +2272506301 +1103647428 +116219050 +374294936 +3869683014 +4135994621 +124031717 +387288184 +1262873913 +2729468640 +4156681656 +1649565184 +762658891 +2663567873 +2478580687 +1464411726 +1160935820 +2045468762 +1374342776 +3376809110 +3593864109 +1955102909 +2327149720 +390662748 +1600598903 +2882400385 +3176040286 +858308729 +18672801 +1395574858 +1100634171 +3389489837 +3319320030 +1316189783 +676216971 +4072604478 +2054136755 +1136927436 +290842516 +4286639772 +1200309649 +3065978823 +1031467618 +824309092 +3147976540 +3797580393 +3639538467 +2114241601 +2659272069 +1296946066 +3460904902 +175919893 +3416789940 +2481370920 +3122983483 +1204621525 +3219769560 +2989265309 +4035389369 +3183265172 +2606458035 +3736102623 +479835703 +3556454436 +2992076989 +3431023618 +2854245652 +1179211647 +3201376865 +2550640750 +3264095991 +3733475872 +3204493175 +3405496446 +2464499422 +2779423147 +74060002 +3234204377 +100702390 +3009986903 +1497561451 +2821672018 +3206920567 +581042866 +3764833032 +2286743733 +941115816 +421248397 +1904000469 +2350684838 +47477030 +1396502537 +716435473 +1434109981 +1675521123 +3776221307 +3069224790 +781822954 +3635602475 +2705340553 +2755293099 +3479765995 +2945686834 +2914933146 +524651912 +2645919654 +3170572201 +2498221693 +3626824599 +2912708361 +2424554219 +4001963417 +1236919624 +523949585 +195898784 +296780871 +425792094 +660828101 +703807211 +147381160 +3075073263 +3955897607 +895338069 +4247325493 +391228013 +246416619 +3734402006 +1807163628 +2055366548 +2890053397 +1325925186 +491497440 +3401141480 +718743508 +3992033828 +3638171362 +2084777333 +1404725987 +2164596684 +128173915 +2179495898 +2734114249 +2302874173 +2601881294 +4266300959 +3240459746 +2133359060 +1892190220 +1329873257 +2923613920 +1566152290 +4072741564 +3183115975 +1474936216 +1349197057 +4198799347 +2467396884 +2590642268 +3791533802 +1595935286 +255184872 +403772478 +2546814948 +484181795 +1950244862 +4234789605 +1131157061 +2426901753 +1821521908 +721463250 +2907076902 +2839650622 +555262840 +279700534 +3885044850 +2335489663 +1301933164 +2913222502 +531554497 +636685354 +4035405012 +3972797376 +1011285494 +226388886 +2260756705 +3684747658 +1149327496 +2255188808 +806745978 +3417751566 +1029876525 +1905359153 +333548365 +3781144604 +1062851850 +799991703 +3668925388 +3706193134 +3732627677 +1416306132 +255452023 +2733696998 +2917540045 +4221795939 +1405259783 +1310761112 +4088589390 +2327832942 +3439418546 +168373216 +2676437115 +3515356815 +4286244001 +2964044278 +3239534839 +2512366498 +4028616461 +1444402675 +1659262127 +728312508 +1744056746 +3895499534 +4178674268 +3507784757 +2007925811 +3564085609 +2562405976 +2993912585 +868824647 +1489881978 +3789813094 +1608935769 +3685737463 +1439475295 +3613203929 +177644277 +3891819318 +1315586475 +2902682147 +1080100360 +1575641188 +2882709374 +1300016074 +121814969 +3303738950 +2109637858 +2289453523 +557549741 +3230395678 +2337573720 +1906679805 +2627109496 +2331603173 +3835827713 +3074701200 +2398997384 +946104350 +3717332233 +1840146004 +1500125935 +2459926681 +1605680944 +3812264274 +1594207619 +2108806447 +975340799 +252600584 +712967480 +1900612252 +3477871533 +2403724612 +3029093907 +3063669052 +3417401902 +3632964791 +2749472820 +3947203876 +1299587653 +3724872946 +1699653916 +2302370527 +2939592507 +1141633219 +2759177202 +1036599797 +2856925484 +148682033 +2931421735 +2969086108 +2722419252 +883744333 +963484265 +2861402087 +1997976234 +2921575197 +2004127043 +83306711 +869078965 +1441684959 +2909480351 +2914307132 +821713555 +2816571323 +2233178877 +2838249514 +3498271939 +95749581 +3994159664 +2919169989 +1299115737 +255713330 +3125730252 +864390226 +1137818541 +2511557946 +4103625997 +873624455 +4172651489 +1466094926 +3348254321 +532827909 +581668196 +429551152 +3670022772 +3550527352 +666920983 +2668862259 +3844026082 +2574152349 +2825178606 +650749480 +1398489453 +2728501801 +1348983443 +1944286902 +282971941 +1508544916 +221370481 +1570820839 +341554239 +4257845782 +1128280778 +363567321 +3723356570 +2272630765 +1443557240 +2771163105 +4243468085 +2605698549 +1279967098 +1659641145 +1745178144 +2710071267 +1861159942 +1894647285 +4186478662 +2102001670 +506842409 +3579200791 +719316900 +1086323391 +293216066 +747509797 +2538342550 +3785184606 +730516389 +3854788274 +1542499626 +2874947170 +382509271 +1640202176 +3391620234 +2861715973 +2085480314 +1749823641 +3256695095 +2742533682 +640087641 +111084889 +152961903 +4135700579 +1640937371 +2752700969 +655479307 +3436581929 +2004772165 +771124812 +1593410233 +1495299531 +165122413 +20298560 +522007774 +3370555087 +337578245 +2985977919 +180231306 +3679565792 +1184276752 +462696065 +1546640587 +489183138 +3374754299 +585133177 +729555041 +3463326567 +3397566478 +2439950996 +465988396 +286439368 +602152676 +392322034 +3986175605 +3444905240 +834863455 +238586625 +2944535029 +2107816550 +2053054796 +2009377405 +2254132870 +3611099551 +1536388679 +2230947490 +2070444982 +1996422208 +315543082 +3684513943 +2462999354 +41858162 +1107908514 +3929572687 +1693869588 +484967879 +1129747240 +2927303129 +3759920508 +1526007968 +3352516882 +2128381140 +3179082674 +3101177106 +1407655263 +1683886129 +631149128 +1066078783 +3495737156 +704327144 +1920392141 +3767847133 +3350433455 +531512539 +4205601449 +4234243800 +784505716 +588381900 +3278698588 +750416718 +4247086052 +1332040368 +2558356578 +2888023581 +2355328495 +3619820326 +2645545850 +3419028931 +2056022879 +3292367168 +30662872 +411448512 +1001717975 +2159513957 +3680913186 +2164988300 +2499034413 +3676804712 +2669447257 +3528362527 +2495636313 +3640214579 +2812867293 +2575481548 +1627493244 +4183079529 +517155430 +239509252 +1052368697 +1130875679 +3777888046 +3748371646 +2987082293 +2804697514 +114094292 +3138082668 +3977383203 +1129320653 +4220464076 +3853852083 +2241435394 +2365354109 +1163167511 +2367770426 +1122173048 +2967912775 +2112563482 +2045460909 +506501023 +1749536332 +2818517916 +4116453605 +4040285586 +1526142943 +379590964 +1489272606 +3151538279 +2373624697 +4263911452 +54891012 +3720855813 +2462929773 +2944141759 +1053989631 +3112720102 +115587857 +950018837 +4208116316 +3415051725 +2204598748 +2080506005 +2409958989 +2647437697 +2888324936 +2992400773 +3060221925 +1068576226 +3377172190 +2362902872 +2976883897 +3891519035 +1570884661 +2744438013 +3507384579 +2325984945 +983118447 +4133418653 +1080048420 +29486424 +1146113079 +2760999731 +1731008859 +363323578 +406246129 +2561429708 +1699224558 +385034092 +1112601917 +351101763 +1380200004 +131880954 +2220597461 +3170871714 +1768459158 +4207228358 +3853633283 +1442528840 +3348757387 +216399614 +1071160795 +2271713000 +3509220831 +664666994 +3181054847 +2623311149 +4146123211 +1298594172 +2862787255 +3965889668 +2024747788 +3499583245 +334700360 +930969908 +1501129089 +1376104624 +4036483047 +1188127895 +2645058266 +2159857434 +1891541399 +3435361256 +886974405 +2606774233 +821203751 +1337048843 +4228921359 +3828540593 +3666563079 +3147982290 +2747196915 +235969178 +1512654471 +2247253528 +3004910733 +537047904 +1284160052 +453839274 +125983218 +3069485239 +3516027764 +3775387554 +1807471530 +995878972 +2113038138 +2951645359 +4045063974 +838621307 +3073049951 +325384071 +3156938914 +1733791967 +3711068358 +499899994 +2193642345 +2878657186 +3497235927 +921388204 +1276842544 +1650669765 +2815698338 +2015568132 +2169363790 +2207494414 +626234535 +3390661097 +3627384365 +2856969574 +2086463376 +671700941 +1444332958 +3395716568 +3083310143 +3555173304 +2880418596 +666378732 +217490159 +1984252846 +3307090273 +3646816439 +3349652492 +1758256389 +218952160 +2547721987 +4264940937 +500505482 +1511381814 +2265844968 +1404695264 +662037438 +2830753425 +2183144013 +2416171731 +239089 +2408993301 +4164085145 +3023807980 +2617161161 +1396418354 +23903724 +2557465761 +2959948022 +1202139767 +2288354242 +3717275946 +1531237897 +3717050484 +1798919815 +10453811 +3166742689 +3840197167 +508173281 +2371816529 +3907819242 +2686561690 +2833227397 +340708720 +3098008890 +754354495 +1737791930 +590581035 +880732413 +1217283368 +2504525922 +2990244313 +3638281530 +1495454918 +4007908465 +1380361231 +137038918 +1275548140 +1327117624 +1859935168 +2015356366 +3385792273 +803794504 +1830236439 +1014507384 +606233517 +749832081 +3510820556 +21013678 +2052712434 +2264670336 +1116268591 +3194915770 +1990714280 +2157551963 +4145178618 +160406550 +2050948661 +3456183617 +1179717328 +1359566892 +3671913293 +385235395 +580914903 +3428444128 +487197493 +397184427 +224080487 +248643906 +73474141 +2801387908 +923837979 +1744477066 +40295137 +1006871735 +3590287266 +2611067302 +3890354545 +1097165365 +2919776849 +492938146 +1877842715 +532355130 +2497748398 +825174820 +3400484565 +2443454323 +335717192 +4174701395 +1667663418 +1297144242 +4034911091 +3114663925 +3875953020 +3406826494 +4170542378 +3259376106 +1495817045 +681986754 +2402082840 +313625689 +3859095505 +3520587148 +1898287522 +4185053173 +2687317946 +4221456660 +1466878574 +4056347827 +1538035519 +4212021115 +1976719359 +1388694684 +3982937127 +529071658 +1763198779 +3938092633 +329152793 +3215384138 +3581317521 +2876713275 +2720016332 +260552591 +2367732503 +2889343241 +2962649310 +2243878420 +2758051345 +2898042504 +3953760581 +4094359656 +1946722482 +309177396 +3151944758 +3344123925 +1007843940 +227565023 +1249162708 +2273481299 +403651676 +3128271769 +221436924 +967537651 +3729264471 +4113960392 +3792869111 +3755536648 +217297177 +693537418 +4159929091 +1947993409 +142841376 +3178564834 +3908369097 +419896682 +4170608191 +2287665559 +1743133626 +66641149 +3497520716 +1577913420 +1417785518 +953494455 +3009907683 +2452620312 +910777280 +458478297 +3948162523 +2588747450 +1640424815 +195573730 +1541506813 +4158116662 +499597045 +1216367600 +1235880268 +3702648292 +123211833 +472470565 +160825984 +1827018719 +2083491238 +1518034867 +1302715601 +2285825824 +504376673 +2203565979 +3989683272 +3883934327 +1325770737 +2338171981 +4062966416 +812583977 +579193275 +3025980484 +1355239681 +3631829658 +3010395689 +1277305016 +989396865 +4130296320 +2344194833 +1881535515 +2253729246 +1572984857 +1962731392 +1849247801 +3169095141 +1640073185 +1719949274 +3472596611 +3255498585 +2614948729 +891649237 +3533805142 +1668750833 +146997259 +361521300 +1143110198 +506668448 +3586280221 +2167764137 +747575613 +1088314588 +3845503413 +431875899 +3561266038 +887439992 +35738395 +3494614507 +3652877444 +1548337394 +3730513197 +3112346635 +2613504478 +482085716 +1344823843 +1713974446 +3593850166 +549993909 +3737024227 +25985045 +3022396722 +1907543786 +346460543 +3177644821 +1947353596 +2506665786 +2450526091 +579220959 +2135433432 +3401645336 +3688866333 +2068178873 +2332153107 +3846872092 +1539441969 +3512442631 +714507038 +3686685415 +2029278077 +3820284361 +3298625370 +2099083491 +2908485358 +2165238415 +1253169593 +2529779911 +893273087 +4286822781 +2247596142 +3353550176 +1889333322 +2684233939 +2980698423 +965946207 +2280741219 +291345692 +1828876337 +898348271 +1430113884 +1816861405 +1955501397 +2748793905 +1672451639 +3064406516 +527443227 +1592007060 +2986847903 +3173611934 +1628952837 +982936281 +3005865441 +1514081602 +3930404586 +1168633772 +1926694073 +1643106987 +2906330488 +3514592598 +930525285 +2250007080 +4156461518 +2981792954 +926638533 +2569593161 +2752866206 +2486055074 +3022971174 +4201761617 +808876182 +2744522977 +558819861 +3705281150 +2377841877 +380024119 +2221633290 +959824527 +3064164387 +262910254 +2860694961 +1216652347 +603515618 +1603155781 +2192759489 +1687788593 +1432370136 +3377618138 +4244327881 +2430045185 +1758012738 +1661983556 +717602905 +155757706 +1624613476 +2819969279 +2925498968 +2329215801 +2753150104 +18368422 +1225234004 +1531669815 +2695793657 +2208467220 +3384229855 +493383887 +2944931249 +610108837 +3449045070 +2415338722 +730378507 +58146413 +713151698 +171548561 +2384294991 +1784588158 +344952671 +1595156862 +3512943303 +1263142545 +1487234313 +208308988 +2611286967 +2263826321 +1461404405 +3355048848 +3855288307 +3039496339 +1907807048 +3986340226 +1597144457 +3439389035 +2557620623 +1000667149 +2203034589 +659560676 +1960937087 +489427974 +2938813875 +3235880223 +1235054562 +2798347680 +500036966 +1953547268 +1458970961 +3211718673 +186035483 +1381165908 +1484160093 +1201816283 +2871350537 +157355940 +2738456099 +1334746043 +1209839783 +3520882396 +3896444127 +2734873611 +2994494616 +3310644043 +3714979892 +96561537 +1479543853 +2537865518 +3454652374 +1236210394 +1821093041 +2769915180 +2774635081 +4102350142 +3181768644 +3677396387 +1540787810 +3280997560 +3990245557 +3341986999 +1823040315 +43747362 +2557029908 +4177893061 +1418321397 +2610921694 +3504515723 +4002229345 +35195014 +1576113018 +3616469320 +2076918295 +22618575 +1850499835 +991523898 +1936186308 +1305497145 +1074743611 +1457730283 +2828790831 +3173781719 +386976119 +2527024950 +1986484886 +1835348583 +1600855865 +3919620390 +2436371997 +1026481977 +343816799 +2549795084 +2046833845 +2390732922 +973803486 +113382490 +2003038972 +2895949424 +620431151 +2409506185 +3092770647 +1035127443 +2772670250 +2834130534 +2638025922 +3309966895 +3699735418 +495224770 +507001101 +1132676279 +1181565256 +190724225 +321457424 +2224414004 +3942849238 +3077219038 +1299288571 +2873654541 +632384157 +1170936730 +1817638124 +832895356 +4196103826 +2442838050 +1065647439 +1760529669 +617138305 +720027422 +321584115 +2684225844 +4044870854 +3452691844 +1648977980 +659269104 +3576456117 +3376451309 +1626575974 +598598718 +2309761113 +3920481444 +3025131466 +2239291367 +502905054 +781496848 +120419232 +2950413194 +3979070382 +3305947242 +3272478287 +1894552671 +440133326 +1539580888 +1668424719 +802195636 +414564658 +2877638458 +40064875 +3969873291 +1735994386 +3652533802 +3797062581 +2786611167 +771817238 +1817514435 +348079630 +1493822763 +2063802892 +3899154048 +504657309 +1345724284 +3630820328 +1979836110 +1730048573 +2351773573 +4048118357 +940665252 +705429113 +1095974328 +2318146563 +1642343847 +1963555453 +3305638511 +1603342723 +1863339511 +1306856932 +431114555 +871194123 +315861685 +1107998110 +3239944661 +228108625 +2537984756 +231941070 +579240412 +1276071694 +3754463056 +413855047 +1138063437 +1858707615 +2571710371 +2881431562 +2399010881 +2534746832 +3353158906 +3059971187 +3668932381 +1994784429 +1880395777 +642182973 +535892469 +473249233 +3667302988 +606823587 +4001953640 +2746246903 +791682079 +321244103 +990499594 +3302129330 +857175635 +3162269444 +3099085573 +3355417583 +4266856989 +4076380971 +976587134 +13875701 +3465422130 +3487365904 +1916668216 +1698106993 +3987658088 +3800886711 +3898270924 +1668152428 +759902756 +38500267 +1329352634 +3558344006 +2408528227 +2030019924 +2709356463 +2570060188 +3065632212 +3550991866 +1055133468 +794643714 +3189033613 +1850578141 +543232603 +2531536920 +1670800555 +1370833977 +638676539 +3079857437 +3018320100 +1285946567 +3947934608 +2353554768 +1982229237 +859209163 +2113494441 +3242892618 +4221819686 +1586667642 +2794174222 +513884152 +637277095 +3293821722 +1978410147 +838259627 +1512869048 +3773974563 +3352481125 +3291251994 +737890149 +176196758 +1068457053 +80991262 +2061424389 +1083796489 +89744099 +542074160 +838140952 +1153469645 +2141484804 +440571006 +2699004560 +2820453938 +3481716873 +2327426246 +3138905005 +2609579082 +242055820 +4020840466 +4213252442 +2850554962 +3600085570 +1518928758 +3207254709 +955362020 +673262224 +3856125218 +585864117 +3913901438 +2822887807 +1458447516 +3124538217 +3818085787 +75691821 +3064254412 +3920403997 +284497933 +4089163437 +3740817311 +3975924235 +3904521080 +1568642359 +1436428435 +450284343 +632718713 +4059827473 +1605963839 +1413873979 +3434305825 +1029604545 +1378973229 +2804130682 +3790086184 +187162723 +3699275437 +1174132993 +2496946271 +665243596 +2014906435 +1567607193 +742625051 +743582739 +1095928154 +1091419874 +3102256886 +2697812355 +1120296753 +1974148979 +458594771 +4178283424 +941868245 +1407577250 +1941321475 +2338590934 +656039399 +978341962 +2827396440 +2149998604 +2377384569 +3164784125 +264087350 +2223721228 +939642335 +3744516721 +35727078 +2471454139 +1739018553 +2830999054 +2235871694 +3274813394 +1026921713 +1796939476 +1255586826 +3552170981 +3910220444 +1320410735 +1031448754 +206404787 +1009030109 +3202086692 +205886940 +528608119 +3087578803 +2463014388 +3586661888 +1149327337 +746388374 +1827434927 +4126030034 +2423361820 +1783260481 +1997576377 +2361088250 +1053678058 +3920263600 +812660058 +673798856 +3977369103 +3118334417 +2113388210 +518382108 +696293087 +2743747427 +2231755225 +1165759097 +3576579812 +2404024062 +1443719985 +3771755811 +4172022504 +2720914838 +372340268 +57071857 +630763047 +263066305 +2661725600 +160510393 +2135448292 +2806920896 +2197476939 +2864801668 +1820485381 +3868261945 +1660883187 +2671077744 +76640626 +4114139631 +4090839991 +4132640287 +2094075027 +88954570 +1338850666 +1460724443 +2247248471 +3381564867 +3255792861 +67213855 +1423013997 +1643154088 +1419393906 +1998922245 +4088229638 +1652556796 +755106968 +726043871 +77223714 +482771764 +4239430633 +4088369133 +2709199325 +3143666423 +3905721157 +32176221 +1232877010 +1712278130 +1567224761 +3667973753 +1788249585 +4078855602 +3619417574 +2100065394 +4292027049 +3341835089 +3543381009 +718071118 +1133860786 +1261964024 +3500106325 +1631865991 +287494383 +1153384850 +3809546444 +1219472756 +403628951 +392584103 +1870002443 +1189131201 +2090260511 +4240508428 +1375970864 +114150700 +3652182152 +1807933623 +4051276277 +3918935575 +2699753353 +4255311595 +2148684689 +1073490883 +731815518 +3602335217 +1391461885 +95024448 +1386730845 +3729953259 +2198902703 +1222429746 +1614548884 +4059647857 +2827390599 +3941964856 +647775422 +3051443337 +2168149575 +3485180939 +1701508669 +2274864299 +1248023704 +3491075110 +66399684 +1542420577 +4146840313 +2655652529 +956468454 +3830587408 +1073273231 +2359469923 +2612790532 +3498518631 +3931858329 +2281546021 +1942462873 +3697441301 +119263991 +3056277062 +2597081962 +1216560876 +3059458710 +2875728150 +202588449 +1878179243 +144609223 +186363964 +986472083 +3112720015 +2091182147 +2744462395 +231166311 +1098189721 +1334416098 +995202488 +820184628 +1279751318 +1017032701 +3797592561 +2261001351 +3958816107 +1975879472 +2305436702 +430538321 +1824432583 +4285924527 +2078016407 +618986233 +3942601742 +4196949753 +1945317691 +1295718627 +1197287571 +3365186168 +4115090915 +298486585 +2204665687 +3902925707 +1068152916 +1285585396 +1343057571 +2535604156 +2778575334 +2001410696 +461947886 +1941369449 +497311100 +1437954055 +374506549 +387574293 +2860931374 +711180482 +2643111328 +3764995851 +4133291748 +1307820557 +4045241749 +2388138519 +4214890970 +2102707402 +4211923569 +3480494043 +545271501 +2131610456 +2408741211 +6685723 +1122693306 +3633057924 +1454970004 +1207087185 +2766988777 +1741698704 +2903602860 +748601843 +1253606279 +4002070084 +43500948 +4207002745 +2188166465 +3003347921 +2721696049 +678533320 +1012713788 +1221953238 +1716345360 +4236857414 +2536863746 +1288534412 +651179493 +2671036949 +3238794161 +3938263373 +261428601 +3679469516 +889977346 +1096313438 +572489062 +3597260124 +2044200486 +3431209092 +3667390888 +890713873 +3158573635 +2425085803 +2654782011 +1149547427 +3074719654 +2954091292 +1520558319 +2897700141 +4075107972 +3984712904 +3492998691 +3584945153 +157059909 +3105715516 +2423774549 +3354982108 +972055604 +1607290044 +689097511 +2161235519 +3716589231 +1856791025 +277241991 +3198292035 +3749976705 +3477355501 +3254059476 +2850721284 +3588883923 +1052802696 +3042389521 +2536332254 +1610194125 +572347458 +3649401588 +3022774135 +4274160765 +1233870224 +2460629663 +2356733375 +2826928701 +864298512 +2110529792 +26087410 +3189182994 +1485495356 +1738997443 +719375970 +2852493262 +145688773 +3392373290 +1874726300 +1989338225 +1449266640 +140459625 +1967964236 +2163496078 +2260922878 +3371887181 +201572796 +966683881 +4004240145 +548812281 +523786466 +3827014781 +1696020677 +4254086247 +2395606084 +1316342703 +2090465861 +1313066711 +3117386894 +2687485633 +88031661 +4063726086 +1549502250 +1119968828 +2226659139 +3070649030 +1054116806 +3021607016 +2384841054 +4203023022 +199145142 +3251797998 +384244118 +3079232538 +3685776252 +1177201119 +4010732782 +3381782161 +1930326567 +4218622504 +2439876892 +3760204526 +768752021 +302838223 +4149607289 +4026955591 +1324704856 +1501619189 +3733336615 +4230853973 +3425119375 +561678861 +3999201550 +1140135343 +840509395 +3990020652 +3068944636 +2721743222 +3735067546 +2122726720 +2928243760 +2883323044 +330081647 +2505235370 +2048745453 +1391648394 +1865562206 +3256165458 +2203104838 +2730011154 +603436132 +3007357817 +1204617648 +412608262 +3217821653 +3317917593 +2481882446 +536245606 +4284878055 +767736354 +123452334 +491702126 +1007395197 +1011069285 +720144863 +212784053 +3125021341 +3546377315 +1178868756 +2993748216 +1500036122 +503170430 +2081421147 +1555871489 +2191563541 +388863252 +1304395075 +1541193067 +2840508260 +792815884 +1588193044 +4055272331 +1322491999 +2611429860 +733915131 +3718470383 +3968769673 +924051523 +1371441456 +276785750 +2270006690 +4285741645 +4119487197 +1595815221 +2248201894 +3811649936 +386675256 +3457431902 +3505759188 +98053617 +2848960688 +361223118 +581796503 +2455526949 +1275671174 +2554246301 +1778039118 +3009875956 +546011388 +2426401521 +3404788417 +2542031964 +4086191489 +1993135567 +430143264 +1018952251 +4290481898 +313984199 +4208395857 +4119948456 +2695154929 +4147857887 +3039994113 +4134573109 +164702563 +2485202271 +551203756 +891655868 +1136271593 +4045998175 +3087388288 +1746176017 +235855641 +3668719330 +3703153824 +2727288475 +2782328201 +2906220608 +2719244702 +2313263904 +4071034138 +2278031502 +2517343902 +3749716208 +1132393289 +46512500 +3630555378 +3687497954 +3225784855 +1167165635 +1491638449 +1873415248 +1322465299 +2057483350 +995792768 +499002956 +2806798114 +3338644162 +1815073086 +1051001570 +3284951703 +3604527400 +1682996945 +1828268417 +1108274971 +1649581844 +2159872829 +1608704430 +272920022 +1823493011 +2339231821 +3932770733 +2607064663 +1005502182 +2953206407 +959257110 +697314104 +1027657085 +662176647 +3452461270 +885211232 +2343636617 +2521884733 +3350975903 +3245129675 +2304049068 +904617921 +2334338698 +815645090 +3010044679 +959239210 +386800128 +1795782428 +4259087301 +2834660243 +582635565 +279257586 +4087164756 +1111526645 +1174963640 +1997448503 +3451860510 +2435266061 +657198260 +1262812094 +1714005226 +3520345061 +1940575363 +723454963 +1586688728 +3527236454 +969122353 +2937676343 +3153547039 +2515491421 +1413470218 +4050782944 +1740902892 +3720648105 +3107287350 +2413952014 +1348084707 +554841786 +42017340 +3353776772 +1258499069 +25964327 +724224339 +3865246716 +2501648133 +603637611 +4259993309 +1719753114 +2977999173 +2039970841 +470136194 +406728064 +1675130202 +1907605957 +3163192753 +2685409749 +2318993452 +3782182086 +3522990799 +3900922325 +3668611672 +4088200491 +4140002401 +3467904978 +4106520801 +1105545219 +1341510853 +1376555431 +1125175467 +969230045 +2130255174 +1346140080 +3357957790 +303096358 +1932688356 +1306419243 +1523027946 +1771103553 +3514470461 +479236528 +1061071730 +1086566311 +934298154 +2090475332 +1555388121 +2652289869 +200114477 +2936611051 +1465082961 +1627315631 +408440779 +2447219610 +3321432911 +2262519071 +1817530191 +2987722351 +810234055 +2307022554 +1773740942 +726322100 +2559994876 +2047566407 +3810734025 +722405820 +3256805969 +2975804943 +3418664909 +2870187008 +1641292263 +1268751284 +416804544 +993294680 +1269879104 +2131537056 +2997957661 +1551127881 +158997699 +2919313286 +769851064 +2236604595 +1469834680 +3286898471 +832837303 +904283770 +1007266790 +2989682849 +1642413432 +2563335637 +3099505417 +1117930543 +4269621952 +3317512601 +1595607172 +3274362544 +3661696127 +303444582 +3271652665 +2209713100 +1651646276 +1863087740 +3189636080 +1719648054 +2303490738 +3979018844 +3470065908 +1664129538 +1296348308 +961515059 +3448517081 +3547789628 +3101969569 +890249750 +3141265253 +3580575502 +979260776 +1684249844 +3021902992 +3247292980 +367670687 +4286469710 +3203766256 +3233850820 +1016090612 +3796709534 +3008019124 +3347466231 +3000607769 +1885025608 +1642736676 +2457434153 +423559931 +2757980018 +3898963679 +2656161255 +2062234482 +264488990 +1222237842 +1116494059 +3859525863 +3571183164 +474712723 +1013519750 +2121055489 +1047596584 +2478669552 +1784465788 +1109959648 +1517512032 +3520343392 +2817021861 +797525109 +464321255 +3110074068 +3796704633 +2910914879 +2643163744 +2732897840 +1570809933 +2642813812 +326011216 +3118676015 +85603845 +190554251 +3527182501 +2269322664 +2814046902 +3896548332 +2871444946 +665223191 +1138081332 +638307386 +3891779567 +2712644368 +4219189534 +2228666807 +1822602606 +1561837711 +2745405361 +2058761244 +747638751 +2295964179 +1704707267 +1695959529 +3469840680 +3273200600 +2930532520 +1430138581 +3531777910 +3647853276 +568536218 +3219163007 +3575109584 +2601547666 +2649477903 +1753728020 +2245866882 +389620450 +3991126150 +748400701 +3745621805 +2376010063 +63168280 +741214787 +2290875388 +1142300521 +2554347721 +3212719536 +1911930527 +1086443233 +486354983 +447712436 +3555701869 +915220479 +2062159572 +954004320 +2110934952 +2133425378 +86013173 +104529263 +3629989067 +1647240814 +536394018 +1100221418 +2196524826 +1222047729 +3376405225 +1585692487 +831925213 +2829053522 +3261206808 +256711986 +1554703650 +1264382986 +1563351278 +2231358679 +2544787192 +1302519723 +922405852 +4282050713 +716008080 +1672765103 +3246898635 +3201435528 +2541100882 +4160116323 +1777620878 +2894041440 +4518657 +1402285851 +2151107070 +2761647310 +1694402346 +2929112031 +1080931708 +2551808960 +2506397826 +2302909093 +2574776940 +2909706703 +2340693617 +3177914124 +2633961455 +4251735176 +3831770441 +2664871191 +2019456794 +3865961477 +512341036 +1414406874 +2836659989 +2344230887 +3234444826 +1839754738 +3666586150 +3894922229 +3357993695 +3791693383 +3266341883 +3928108616 +3700764 +3693673014 +3980973227 +300093387 +3970606027 +646535704 +3012267583 +4270877338 +551154779 +3907690012 +2411428804 +1114928378 +145577341 +3898255853 +1417185800 +3389946788 +357145387 +1132161886 +2062981208 +3361318147 +684601572 +907128630 +1711769941 +455901926 +3432194994 +4044992782 +21412635 +142617545 +4194590139 +3205299017 +1851038347 +998285231 +2599421785 +3133289994 +922658994 +3990669040 +4282068978 +1593007793 +4222391985 +3778200911 +1949731948 +2084073038 +548342824 +1167039618 +925496933 +3808730263 +4097819490 +859582689 +91662937 +3299429702 +2719867697 +3246069991 +2602921029 +1482204624 +354753144 +2114356418 +2764357171 +2277834570 +2571892748 +3581178337 +3190772566 +3920995077 +3819607045 +2544538508 +924010400 +3226254478 +1935936408 +4170425973 +3140283321 +86089535 +1687371054 +3056675746 +15749197 +2014549893 +681909291 +2807125111 +4215087032 +1169469377 +3359218063 +3995570901 +3897994399 +3464073405 +3859530597 +611901582 +2235613054 +3110476438 +3476151626 +728973716 +3577587482 +3300079175 +1315300938 +3305289524 +2310600617 +2635168465 +413514935 +1985958980 +4242194753 +2332292220 +2509751826 +107663188 +2075238323 +2296342812 +1715299226 +4120141298 +3701854833 +1273421034 +2498522228 +1585996375 +688925138 +2403652969 +1169307327 +1513181013 +593091938 +1113159458 +2854588702 +3951009993 +709654296 +488217526 +2342091114 +4060933144 +1595462419 +432914696 +244063615 +3498043078 +3890133189 +1639352175 +3161983716 +254913281 +243537107 +1450617465 +2475089377 +1503305090 +2420770754 +3088213837 +706014818 +2378486672 +1163749934 +3457788758 +403563352 +1206664553 +3732826076 +495768048 +3407503233 +4099483874 +3003213645 +1180211643 +3305967813 +4016799797 +2977120247 +3439172445 +2916821613 +3676907444 +3137967215 +2333812713 +1167237448 +2554022150 +3272116956 +728695877 +2537048518 +604975855 +1122207590 +1959835585 +2688522408 +319020534 +1869016376 +2520364565 +1769508128 +1931617916 +283270538 +1318650814 +323305912 +2624088869 +1127673825 +3174125874 +348421557 +989616646 +983447954 +3820933087 +3366480613 +3719414801 +1351441064 +3494735545 +3394343385 +1381923814 +2731181651 +1597604914 +4127390819 +1011808644 +4225460828 +2568040766 +1103592338 +2348409222 +493877571 +3652641400 +2340227043 +31589455 +4088912185 +1994253417 +366963886 +1410667377 +1912841378 +1644259964 +2904358882 +1423364125 +3546746591 +3205652103 +3086281816 +4119070113 +389993289 +1994059320 +1565748270 +2587238064 +3890216247 +2174262617 +700526129 +950247615 +3257207135 +187715505 +2883860989 +654318417 +1916626307 +3243155560 +2898449745 +1359582709 +2379901840 +4138898665 +3258932095 +2962458514 +2333989340 +1550701911 +2515363552 +3431732258 +570975880 +659726807 +1540621235 +4085120661 +1215570553 +614250768 +2274129721 +3762297794 +300408936 +935760425 +2387420303 +1879061790 +789135785 +2620801692 +1897744224 +1233560420 +4293937827 +3863422825 +889556538 +984762230 +1660774021 +246961605 +148898692 +75353862 +2775846389 +1614467902 +4213471216 +3787966156 +1143076552 +3105741455 +492635229 +78279706 +1723054671 +848088575 +2699204194 +4253599485 +3531677433 +3202071124 +3775183363 +101829091 +1430210969 +1134097213 +2738657562 +3373788991 +4235298509 +1739441099 +570829850 +4004242795 +199838422 +3633247063 +2534034021 +327457288 +2360648012 +1497582539 +2908707531 +2870036176 +2533538087 +1926696766 +3556435611 +2114985740 +1813280634 +693182873 +4120063613 +3993201887 +2381140586 +2815208387 +1678577401 +3895343737 +3185263781 +1312724037 +332942652 +2902364420 +3832715097 +626858484 +1817609147 +2777494239 +1903337418 +1267423945 +433250846 +3460267435 +1955823685 +3282902411 +2626465831 +1012921598 +1982593511 +1354115159 +2511041366 +3459615824 +3840479084 +2045485035 +2989404475 +3018066568 +1029401771 +46869989 +593984290 +2406366651 +1649272217 +752103925 +2542804474 +2596709735 +2148401611 +1427733637 +1468817772 +297613365 +2885509003 +4040904959 +1214360889 +555730374 +3343483310 +913747674 +3990909507 +3324530962 +1433596024 +3764718372 +1712034860 +3722061696 +2637893601 +2013431086 +4004494837 +3860121610 +3558245116 +4144785402 +3452614293 +3267073121 +590449518 +3048956163 +2919891890 +1872121021 +2518880008 +3611830248 +3698156881 +3398366646 +1280650543 +3381299957 +2966448616 +1526232011 +2707575701 +2862424146 +2907808426 +1278168644 +1260948974 +2180313519 +1545574722 +3818720766 +3126864476 +4026004049 +996185053 +391695759 +4046473609 +2381283128 +576116512 +2485755640 +1166044480 +1215600698 +98861443 +1930185283 +4273156780 +1271547370 +100946444 +2086757724 +3530579631 +1380405743 +127068075 +2060776468 +2591956639 +587940579 +560653262 +3160882714 +550483061 +4102928092 +1556846375 +1358658217 +2036041551 +3971100883 +2586632962 +3260478323 +3306008699 +4105877295 +678671427 +950224419 +3337746296 +1583209339 +3389796102 +2310119293 +943158217 +3131236744 +4162744324 +3076088216 +1039317016 +316948167 +3909308352 +2065325187 +846561747 +348457288 +1123284842 +2976484843 +680123906 +2859458447 +3769530701 +1437941488 +1853370124 +3577295503 +3852460794 +2291145207 +4226327685 +854136262 +2142371490 +1929225034 +332980441 +290923663 +3655429442 +609100276 +1258593835 +2422948925 +4118541687 +3450499965 +3873167760 +1427705654 +3418113155 +2509275638 +1778117924 +2918033938 +1117112809 +1314567503 +308009613 +170536045 +235641132 +2137049359 +2910150131 +4232940091 +3259396399 +1555680191 +3768199637 +73683976 +184560404 +2359263659 +4005992297 +1776654680 +3058581805 +2452402546 +3306643395 +145818801 +3853041741 +3119501846 +4183221914 +1748563038 +1081839534 +1564747391 +2235659606 +1924049210 +2734344895 +3387681961 +666045978 +106922768 +3207463249 +3254103179 +285409590 +199243554 +3313628298 +2421103579 +3190833396 +1085791489 +81005956 +773827889 +862017238 +64986087 +1865775623 +3846451262 +785309661 +1568250176 +1108267908 +2040999636 +1951736775 +2869997108 +2765644687 +3564226535 +2943254350 +2452251238 +1182395690 +3332544078 +3797415315 +2260775512 +2639078793 +1413777825 +3457595233 +753889790 +1413716907 +4032964755 +1048006416 +1565271178 +1619905889 +2241168849 +1198315922 +2857611169 +3755916042 +1724949528 +3272286083 +3928322836 +3109571125 +1636075120 +220234164 +688860373 +1024754059 +1622086307 +2682589429 +4015981128 +2568722610 +1052016364 +2271201587 +2006949452 +825825116 +3645863497 +3885014151 +3383638413 +1686683208 +3602643385 +3070882317 +3523516553 +822475119 +2577977576 +572555322 +206451510 +1459678024 +2114829743 +2621897991 +1099796082 +2231027344 +4080996668 +3655292261 +2226120052 +1572905438 +3021595037 +3541753830 +3010747041 +1663963608 +37757510 +4165548567 +1560001869 +803949350 +1378694442 +882090931 +1265223675 +652784888 +438586555 +1244477522 +3978005172 +1831567861 +3051274390 +502267113 +1816466285 +3187021320 +1343335589 +3947618478 +625012630 +517583311 +3106085262 +688566026 +2350352268 +3390657116 +2409373147 +629961949 +8886558 +1864175451 +615464218 +3483795322 +3527085664 +1101018600 +587458808 +116874854 +4213678657 +1546179650 +3012049036 +1815559072 +153209534 +3253917904 +1729871793 +3449859029 +3283332432 +177390239 +3532860442 +2951314177 +3235876711 +3847593100 +2789649297 +2082911325 +820884183 +396302470 +744559517 +2422178488 +2551216385 +3449431310 +4131325867 +2574489521 +553481123 +1772461904 +2823202728 +4167554889 +1156807069 +1170341136 +2421438308 +3964952720 +1687575624 +2008295267 +426677890 +1120026207 +908813129 +1846362616 +54046780 +1496542346 +1676873614 +438572891 +32610173 +2173634522 +2554999083 +2086572204 +2028683752 +468044055 +3889480198 +940217064 +2633994360 +2681313147 +3333375464 +2671600567 +156620654 +1479022794 +1378710085 +353641987 +2891251523 +1681188715 +1587307283 +2958722749 +4224579283 +1575669296 +514988098 +3036082750 +483922025 +1699248949 +3526102593 +2319732014 +405771195 +2958520902 +4148130739 +1392961631 +2245645632 +3313896062 +2442997175 +1956378475 +2527447648 +2499832737 +2316880467 +748147483 +541437170 +1866613861 +3827606678 +605053352 +3298429222 +1114036903 +2292674074 +3496833384 +2462574571 +627653782 +2654972727 +1364110099 +3965046257 +4250918339 +4256837596 +935418396 +3958545796 +2068153039 +2963953871 +3439717889 +1892281026 +1635632595 +3893030508 +3041473048 +1933515266 +1062482484 +3564626916 +3352976015 +1040117730 +2956317060 +1814412183 +2585522301 +2255561323 +1162882485 +2993329249 +2793419263 +3452966919 +328919105 +1954885212 +1694105838 +3701164224 +1687992118 +3336122236 +4078687910 +4176409195 +3065954556 +828186723 +501919780 +421973824 +1268860327 +4220996283 +675541680 +2804022984 +208772670 +1691605127 +3850767053 +869928997 +4293630758 +3710750316 +3882968574 +3642314298 +26068493 +893617 +2906616610 +3670065283 +2883425811 +3000571255 +38773332 +2859042416 +537658632 +2121869306 +3097563390 +756755712 +3900568271 +3064779954 +3503963953 +3358281327 +3519130633 +1075677913 +1184013843 +2571517359 +1681568829 +2058911862 +3076957747 +3474069852 +4148568659 +1559965065 +1240166184 +779809320 +1065863614 +1970846316 +1098115873 +1413471094 +3896081771 +2151500705 +3073459242 +3467751947 +2914231044 +3841534256 +2825693292 +49233561 +2519977699 +506383578 +55825026 +1555806263 +4119637578 +828725181 +635436646 +2112556265 +3175837002 +2754754982 +1869438428 +2932744018 +1346756735 +1827639253 +507001757 +1769794090 +3939858447 +4054219182 +3657001080 +3328782693 +2544054886 +3445347546 +1641621781 +2065158940 +1715630719 +1452894287 +617900520 +3796238798 +715822626 +2047507838 +3945292150 +418379627 +2439927918 +2018222494 +1280154243 +621693280 +3914923819 +1497386188 +4056545177 +2455464504 +1420964556 +2206323700 +3944257808 +3177315735 +994517881 +2174069467 +2720870928 +2452155011 +4153079789 +3057008460 +1874437087 +119655371 +2749131273 +2989760342 +1875116545 +2203466065 +3963653812 +2000408074 +3846075801 +1251367398 +4236836710 +2942664404 +124171670 +4244213651 +2180707473 +478970770 +328894772 +1406696466 +1608319893 +3087141632 +3718533764 +3986579081 +3313413643 +1513803973 +2076734743 +2574589148 +3432203270 +636014348 +4112804385 +1787481058 +3386438495 +1056530663 +1142103510 +2678038683 +3129841795 +3313495897 +1737703875 +3679602268 +3289197418 +507059657 +4155331789 +3635502122 +1984992541 +3490155484 +3365126823 +65441661 +426284004 +3733580638 +1361765873 +421444083 +3220312512 +3784350457 +1057067792 +559063689 +4008486557 +2405781304 +678990900 +2986431613 +420864881 +2409223444 +1788399344 +3723942554 +4245681938 +2927557257 +1958120000 +3402195570 +4293053636 +62694539 +243005694 +3447142467 +1809913658 +4276675102 +2209856137 +410364493 +3453718543 +3683518859 +2158200544 +3557336824 +693909692 +4036711593 +3636463778 +2220033316 +1537596761 +2400010537 +170832633 +660123427 +1574194523 +3047269085 +498901171 +1787697892 +1577423548 +4217807669 +805914932 +1998313203 +2444847242 +182949353 +824769156 +2954614439 +2079277564 +3111380286 +1019326346 +2733836448 +2337891929 +2631052965 +1865968084 +1471495900 +1323143394 +4148638366 +3943966090 +120843286 +607873130 +4114181129 +280714105 +3447748995 +1766272800 +3562964027 +1891181102 +3338663433 +2121899031 +1016779947 +992464055 +1410069349 +419756287 +993953785 +3858708060 +656815936 +3380303416 +34482750 +2239772603 +3555159540 +1848688107 +2997178695 +889178495 +3092136693 +2766742239 +2849975745 +41376166 +3418214835 +240341045 +3879918340 +2324624837 +3797339934 +901815099 +4213036359 +480642412 +256000688 +88631464 +3219031076 +1997004392 +3744437412 +2418612464 +1070292164 +3892150067 +3232320887 +3685993244 +1664570747 +4100894641 +1399429588 +2819490061 +3250836832 +3876378415 +447208723 +1123805522 +3340314468 +3669754326 +2891964484 +86726792 +917042954 +2802424031 +263484366 +1090661056 +3353143779 +3793114504 +3062310162 +2371480706 +387157664 +1884453537 +3596204867 +783842611 +1572524019 +2712497247 +3086814070 +1329519266 +2728267527 +2588723306 +2633970606 +2771854336 +3893622916 +1861386951 +1857548845 +1735370601 +3774694229 +4105490382 +2983318246 +3846440367 +3906378346 +3790258500 +3058294979 +2743232407 +3796460459 +1329670968 +558036066 +2995904535 +552095575 +421105496 +1300801564 +3553777525 +535440885 +131675115 +2351729596 +164499297 +821269494 +1126658472 +2156851181 +4041337734 +3008454788 +2202425537 +1478253109 +2264420978 +2826518118 +4281800759 +3708656885 +168680347 +3666135065 +1384479668 +3045541073 +293827752 +18755160 +3678209655 +8309771 +1051148036 +1615972515 +336547522 +2806526384 +1827493271 +416319814 +1007195160 +2907002940 +2815472371 +2925370590 +1521501532 +2123347620 +1209347056 +2770227228 +675167439 +2889175664 +3761258556 +1835612690 +1750006146 +2852024045 +2126767964 +1644064134 +414621226 +795552231 +123467492 +2480787260 +4154724416 +2558156595 +298360706 +871252985 +2087316233 +3169957086 +3145619917 +3391144555 +687896070 +3201917690 +2626256489 +2195558808 +3798158420 +1476012165 +2032566723 +1685654889 +3276928186 +1663578120 +2856758055 +450876383 +3220782130 +1233751029 +3899142102 +1215466183 +4129351493 +3503500157 +3263374164 +2591743025 +1292467631 +2775542496 +1870164820 +2885669738 +1567895397 +101379293 +3206883432 +3976036813 +3580871903 +1801323385 +4084674170 +1679612235 +110818972 +3916914234 +4212586027 +3547809697 +518587537 +921748809 +1049164984 +734779916 +2528453700 +2958872953 +1866443159 +2428060379 +2870989769 +546049989 +202279501 +797117606 +3861784438 +1574003147 +4249171507 +3112857088 +1684423569 +514702011 +2506487 +2739432870 +1939639428 +855838814 +1682247456 +425407380 +1180811761 +1080415432 +615719060 +517857226 +780217891 +2808562224 +3103042699 +412800308 +500796276 +4276413542 +4180392422 +4187580856 +3356279381 +1983179837 +1281098873 +3043489471 +3665838883 +32306238 +371138280 +3870122287 +4066614927 +3013408381 +1306851986 +1670654669 +2530967770 +4199756930 +2829773944 +793860439 +3399523266 +1996201228 +84356378 +1549066948 +2127747971 +4287712956 +1706203580 +81422143 +510765217 +456078660 +1172884950 +3381704832 +1831482468 +3047547522 +1473063401 +3280356908 +3171699393 +3330213002 +1957317535 +3236670852 +3468471137 +1577197874 +3929414539 +34011551 +2584656913 +1945700734 +4165159799 +3661162412 +3985990894 +653159003 +525771990 +2257018628 +3451713689 +1299868865 +1463402181 +2599921354 +4224671589 +2757188129 +2997706235 +473019452 +4075197625 +2563938751 +2639426885 +717332315 +3370478779 +3714218865 +500565206 +3711159256 +664258271 +2659029349 +1454351334 +2076437311 +2497279872 +3730819681 +3993664661 +3060820203 +2326382327 +176453594 +4043576358 +2383314407 +1168302285 +3083307711 +3607198708 +2417219852 +2245090728 +3116402723 +656635797 +770654614 +2276669898 +2802712775 +4137383058 +220001583 +3949406174 +1111848996 +3137641960 +2075937483 +1378518811 +1152421154 +1755385854 +4249606422 +3424345637 +1430377541 +4095233558 +1416530531 +3526084027 +162031461 +1874683636 +2857595291 +75289490 +1643707900 +3060286631 +3456547209 +1651891731 +958792170 +423102359 +2630526644 +4052805086 +146782352 +2725329996 +3948440685 +231440866 +882693352 +1498999482 +3487821068 +1051203497 +1858388839 +534682610 +1217117129 +1069119803 +258829614 +2092649195 +589365781 +284146840 +2250651385 +2189020020 +1121627329 +1243492144 +2879479936 +1768251559 +215473831 +343604735 +3547060882 +2697256223 +1727825672 +4089570552 +2283771350 +3626147775 +3662368200 +3455346667 +3663876995 +3164667483 +47232703 +1011395074 +188067148 +1969624808 +4224399205 +2500645876 +4168686710 +1950867452 +3832275590 +2827201890 +3889026072 +933734906 +2550421838 +2588852789 +1660367448 +1656859271 +3814992389 +2217020991 +1698911829 +893701738 +702061805 +1976915030 +1173880487 +2037617372 +3490237518 +645229793 +471362879 +391180536 +45792520 +3316811287 +656218986 +2634579842 +2480763258 +1843229857 +2836416081 +55680835 +2376267458 +4031665684 +1035974830 +503421778 +3670674522 +2128584897 +2472607085 +617470049 +2954380216 +3791929953 +3863441347 +2029161048 +34912193 +3532930034 +4255933260 +1524474519 +1456846584 +290374611 +2361938417 +2325430527 +2745805690 +1286474344 +2645905688 +3605928561 +3341337954 +2266332555 +2494236833 +2886697143 +1148219251 +1882203850 +1310306441 +3865991802 +1244898557 +2652717041 +183938628 +1026191639 +3904213070 +587201362 +3739011724 +1877245079 +1937536376 +2853719407 +2852696310 +795033414 +3933274673 +3304461737 +3836605412 +2769944515 +1645991135 +3902719851 +3154746500 +50868407 +2864645906 +2720685458 +2379574863 +1285273913 +1625023461 +2062479328 +2012574854 +774022303 +2529886796 +894650366 +3320354804 +32168014 +1674947082 +3872303801 +1619461880 +2154187290 +1465585512 +666604655 +1834580780 +1717899553 +3421789599 +217017104 +3689662524 +3054850227 +3603119695 +1211868770 +2694008590 +3571833659 +265083876 +1720200024 +3677511197 +3021978365 +3701756657 +3239651473 +294260635 +2381771655 +3787537850 +2261515650 +3742967017 +1059165413 +2462367003 +2372304608 +1026688560 +1280983184 +3953377589 +2268184215 +727581986 +1228998064 +3223606296 +1741603698 +2522876532 +2644723330 +3115490289 +1587067604 +604567524 +1102455212 +1900717306 +739996971 +484344570 +2637119921 +603099145 +3220337429 +869925004 +1540236502 +2866461632 +836924076 +3250666188 +1674099374 +98258413 +940838178 +1000967596 +1249907692 +2901627194 +322114319 +2058274886 +341959458 +4064946171 +3829050426 +2064898765 +1041395861 +3040787583 +592111588 +779786817 +1372794386 +2508780575 +1073896215 +2136657615 +122080316 +2255009774 +542108537 +1766458714 +3206096321 +3760867405 +1927467239 +2024503556 +3585047915 +32523224 +817728304 +2865366057 +2256901047 +625551656 +3707838231 +3689199951 +974759093 +3692651196 +3987028986 +2050846306 +774983967 +1404403536 +468803222 +2623304241 +86827951 +2442812196 +1425769192 +2020650723 +1609851916 +3420628632 +2609503301 +2695742516 +1641336730 +3037955365 +216740153 +3569264553 +4106175801 +2187652554 +3518672046 +624819386 +3995356556 +2938407341 +2525553033 +4226780745 +1707693478 +228284394 +588555993 +2020861182 +3513527466 +110198645 +4106398315 +3194503949 +2132595662 +3291667199 +1836218137 +3213682800 +3181458143 +1656193439 +2992479764 +3785627349 +1670095967 +3613450789 +3624709072 +3672993746 +3906581763 +733449440 +723727400 +4137089377 +2819845198 +3408112981 +517736066 +2351988689 +2150029035 +525401623 +3005401556 +4232003899 +3646561526 +2685852710 +3351100607 +1813592525 +813337108 +3244938501 +1927095688 +4058339668 +953304972 +17068881 +2790795306 +372799090 +1098681292 +1285067491 +3125192702 +2167533171 +1903690867 +365346454 +1970316206 +1060937690 +809320934 +93732366 +2685363011 +2566454073 +1412322312 +3581394359 +1378610753 +1087241222 +3527071001 +2064377062 +4230016194 +2492606524 +1263759721 +260745997 +3033730374 +3910324280 +495968906 +1577110475 +2724013849 +4027755276 +1962061579 +2244037683 +1711553483 +3716316005 +3373160971 +3572014839 +3964823674 +690205633 +86386128 +1761003034 +2303191404 +2294550480 +911598721 +1872619645 +652519622 +410363304 +4192988373 +1278109672 +3778472461 +2997170389 +1460749199 +3049333147 +1074046646 +1834197 +4081822672 +3204913148 +2393314101 +3041981888 +258868050 +225930035 +2372393459 +3052715 +525367785 +542482471 +2437965097 +3970345214 +2958663722 +2436762510 +1995035605 +578952871 +2804550389 +4226216718 +649975543 +24537894 +4114579607 +1626908866 +4051116824 +3207222945 +384599419 +452828943 +2284560732 +3667613826 +2878899769 +3405841836 +3955195262 +1440538163 +1989087786 +2063832255 +2460396254 +2927514288 +16393764 +936398144 +423333643 +79152013 +401752307 +4229977588 +4280006737 +4134316593 +638012716 +1312245617 +2716784038 +1043382896 +1694973730 +2265845953 +855153160 +955499406 +2100201308 +1717925440 +1975003084 +2150753951 +1353523075 +3082042153 +1633279453 +195178627 +555743674 +1644879090 +726940015 +3222933413 +2377698329 +317752903 +3682853792 +4152278751 +2722787625 +3192128027 +3985282311 +2335593078 +94854686 +2599524617 +1400254647 +952318966 +2809472656 +1160750384 +2732187268 +1778657700 +4238360042 +2949723658 +4125400839 +37063521 +664807451 +3844480644 +561932581 +844958396 +1146386194 +4031372154 +1290711298 +2571168702 +1840655054 +3927760729 +1186009917 +4196686190 +81271580 +2161061426 +2391918038 +37917762 +1482669440 +1381280970 +2992926049 +3962758965 +3653535759 +2648243031 +326373918 +3936217602 +1119722463 +2729572690 +3629375996 +3007010419 +3712553175 +111883003 +2905310633 +1722925636 +2097689812 +1987814624 +2177666103 +1791930626 +2106913079 +1699848236 +3358926613 +1525440903 +2430426939 +841021652 +1674035698 +1449898481 +1142885914 +3519154251 +1547866820 +2700363160 +3129430618 +207589714 +2730156735 +1441420905 +2979218555 +1105541536 +666087697 +1729978133 +2045666751 +2580384774 +4253801860 +2837736922 +268327616 +1227507604 +3317224580 +546503909 +987518999 +2839280669 +2377223433 +3607116722 +772305783 +2501850747 +4251281816 +2911388138 +2647036657 +1986127638 +155983432 +3699771428 +924425435 +1187601274 +576044981 +1702770185 +2201702105 +2963647522 +4100122789 +802434560 +2870193323 +3420978964 +1093556301 +1106216297 +4085591986 +2718690645 +3839272521 +275257894 +1254402028 +4043045274 +1428760728 +2002504859 +1865282348 +3433004354 +1328336383 +2530792398 +800818908 +3980669797 +3838166675 +2164687931 +286457881 +73538778 +1854667295 +4034274716 +3428446097 +2384568205 +2016490737 +3293551587 +1461801523 +905386605 +1064162352 +3509854969 +45218853 +3646378796 +3449712563 +3813929454 +2584212306 +2580229288 +1715189468 +3757295317 +1174341066 +3482150468 +3326896816 +214817257 +1243173389 +85637275 +4031677226 +464279235 +261520021 +588916057 +2809675203 +2636199919 +562987856 +1259962955 +2941330039 +352583081 +87932080 +2637892584 +2235900762 +791509149 +3545886983 +2435282081 +2540277476 +2350533209 +3059748429 +326377422 +2064233640 +1183200901 +4059295914 +2317616406 +1940274640 +3460749403 +1878674569 +982954037 +2000309220 +968966005 +2973567671 +2627979352 +2784452792 +527654190 +3745740953 +820728947 +3335608193 +733989556 +119054399 +1815492686 +2302849814 +3716176338 +488151596 +2045170354 +2756809784 +649452408 +2909953595 +2402993912 +2872668465 +1454770155 +601269344 +1207576455 +1785965567 +1549702859 +3060791232 +1055645718 +4075880119 +1056955441 +750161179 +670275466 +3060020730 +145744292 +3228229761 +1781815560 +3325286054 +280861153 +819143563 +2978636144 +1131173915 +2012131374 +4177638586 +3048441847 +316789848 +162651937 +1725214066 +3731992520 +2926418155 +4004167967 +2951604035 +1493351926 +285403702 +280866785 +622776690 +2816941914 +281143193 +3925905273 +242068980 +1827602810 +2064119673 +656897814 +1744063361 +3049614781 +2228133080 +3317682170 +147522037 +4286865575 +1029177678 +3842179430 +2086780490 +2057515767 +107036323 +1850864007 +3499519519 +2910420444 +2079052509 +872752585 +2805527551 +1093302558 +3480710628 +2662225695 +1583073368 +1921386545 +2702922186 +3154711048 +4191950843 +1765333009 +1766949543 +2859897529 +2258730055 +279635104 +1143272010 +1116555883 +1810420665 +598207074 +4203847135 +988956558 +994090688 +2367600310 +2204384394 +3076795666 +99043818 +3753071599 +449077234 +3241176583 +2375408000 +3516640787 +1003450559 +3624826054 +1244771795 +1134517922 +1110568293 +2760366126 +3090654099 +3732964854 +4128740095 +3280161234 +1477473101 +3105004358 +1781504743 +788953215 +3144425921 +1864998750 +977346976 +3729200064 +1279548784 +123044720 +1433638639 +2288300471 +1608053724 +1643595346 +302538304 +861789927 +2137369553 +2396673979 +4221526419 +379555766 +869365264 +432837339 +3472050915 +154674025 +3736316029 +342444950 +2450291925 +1902543511 +2383219436 +2416804812 +2917900838 +2714382024 +3659113199 +1343405740 +3187244027 +4046811924 +2721082265 +1144770207 +1288663311 +192232710 +2304888796 +4084244476 +2837755379 +1893374208 +1333071200 +2380660788 +3778809788 +3537582497 +1255091012 +4275429175 +3500918094 +2054063359 +1552459504 +1971712635 +3205890703 +2180844833 +3633899284 +3958483067 +3715614844 +2627272961 +2257518108 +4050762587 +222038706 +2329197015 +1871159873 +2269576253 +2993924957 +1940487426 +929673490 +3755977767 +3832854283 +3964888921 +3635993017 +1830203206 +3995372197 +1115937869 +1343193127 +2930409282 +1308286751 +2598761849 +453652296 +2858570393 +656089164 +1408514251 +1135660103 +736805891 +4058616821 +1863222848 +2915982888 +2248972607 +2270958981 +2235421711 +2228230089 +2642196119 +536631574 +4165905783 +1887377025 +909830203 +4278625781 +3459810952 +93837558 +3943188413 +1731154030 +3329098574 +1097630575 +1235067997 +3322764381 +4050340592 +430781656 +2726890051 +4190936143 +3219458924 +1069819656 +3278601380 +1838718903 +1054442605 +3423235093 +4191758551 +1006995462 +1100237261 +2999994965 +2353994596 +3799792828 +2502805841 +1376349759 +2635945477 +3107024587 +611185048 +3414157184 +1616574323 +1502123553 +2988396031 +771463002 +2455142441 +1004361206 +1032615199 +2467712489 +3790171037 +1671882599 +2460542425 +377353591 +187950191 +3367194083 +4203127898 +2447293922 +2310055325 +1412135662 +1634801938 +452489433 +2883213635 +1513339993 +1720081424 +4136086783 +3585417991 +328317943 +2273007396 +3418723856 +2655125327 +2046316022 +332688795 +317515761 +3784116120 +2995011669 +1092785611 +4116755553 +52518225 +504600204 +2997557872 +48990032 +3245304417 +713495558 +3347756791 +1222153199 +3594124429 +3296839291 +3202470045 +950236893 +3095371843 +2356970324 +2101833962 +3844946020 +1798154573 +1096769788 +2821769685 +3245425876 +1175970595 +207671419 +964903438 +3609311060 +4267091104 +1333630893 +2333180405 +2438938185 +3612165206 +2263012188 +768178690 +2498993157 +1450286941 +2200264798 +4264641287 +502085093 +3024493827 +697196334 +1370562038 +3712052136 +3346214691 +2419457038 +1615101073 +1661051938 +1736526149 +1213709633 +4144646183 +2993293397 +2550071824 +4085620723 +3320167501 +1728423775 +950226007 +2237530382 +50134116 +2239604805 +3810334975 +3045984272 +1079020632 +1306200598 +3533335549 +1502665288 +3235965884 +1136651567 +3399380997 +4105552205 +158604928 +1971722827 +1571052166 +3153820260 +3157221919 +18379379 +1266918239 +1151089391 +1977143951 +359622084 +4021084821 +918061950 +4076104308 +2892851811 +3924414309 +533797605 +2113555911 +1671942707 +449964910 +2532073357 +4179073025 +648127981 +1487171161 +248542441 +730859485 +941003934 +3092391910 +3184414568 +275441145 +2051113017 +2744368780 +1907071140 +2109876179 +234511306 +1736264083 +3548140219 +1273899527 +4268217196 +2021378163 +2632330822 +787395630 +2620691752 +2817198825 +2434452645 +1067028860 +3360442717 +3297840056 +439305996 +4147211852 +2903235443 +1701374147 +2667466375 +859473894 +2316626841 +736453485 +1644585020 +1982976740 +558633308 +2298588424 +510141549 +3568252836 +1511201303 +2850307307 +2638949452 +3341893561 +3638796834 +1790715083 +3131118784 +3195661187 +2601941456 +2469126131 +442587067 +2223254268 +3780123891 +1906425421 +323411870 +2783739155 +1294416119 +2487954086 +2158473206 +1753180387 +3062733042 +3393624395 +3633760422 +2202284861 +514136950 +600507479 +552503063 +3201116915 +1687446503 +1166709360 +1427392789 +1249308021 +3735156557 +1109861844 +2427095059 +2138232626 +3309059649 +4216175672 +1072860659 +325302908 +3809690463 +2354530248 +4034645712 +2427644950 +3008594209 +2522568941 +2566158289 +2395090236 +4222894352 +1757146280 +2135127268 +3007549953 +4064194070 +756549389 +1730433250 +129199388 +4050328696 +3144942283 +797747296 +3936123808 +2310451478 +2013035892 +4221983546 +1938897696 +1767966426 +748129255 +2409422531 +2179923799 +2389893340 +2723763559 +2299330078 +1394028942 +1350536413 +1815170592 +2814086583 +3936854976 +1344098076 +1361028778 +2402497023 +367425949 +1395963243 +2203850229 +645987606 +867117062 +980652979 +299945665 +737221108 +1029483530 +3273043719 +3207348536 +1381668376 +878067666 +2434590097 +3062321211 +2993906210 +2829992177 +2744346612 +2155474596 +342552282 +2193060660 +2234198432 +3951108425 +526740835 +876345668 +3813179243 +470157867 +840974941 +581228776 +3145990871 +75673665 +3056828225 +1227670822 +3563934850 +4076768190 +370607915 +3345246600 +3612615697 +4103151527 +1122340424 +2580941900 +3597888950 +2688101827 +4204367988 +1328479955 +936653208 +4044330368 +1582799062 +847800392 +2901732221 +1494866940 +121790524 +1198211324 +3340662352 +82971621 +2326048025 +1910343825 +1101465652 +2623589887 +1598028989 +3108596263 +4061538657 +4148262192 +2089571320 +1878267777 +968449070 +1579011945 +2594880826 +1227429319 +1003400311 +567049260 +2340850418 +2772387579 +1244011204 +2580877435 +303969607 +746700661 +623918672 +1894515645 +2435667998 +4276379783 +943873709 +2306366821 +1111409740 +2689747756 +3637181669 +2301558307 +915058040 +2836817706 +3089466052 +2784015183 +148210839 +533542693 +1327770750 +844341923 +1847673909 +2993629076 +3575010593 +1646871484 +1393406630 +4201559672 +4281494443 +3440095830 +4075257615 +2846285570 +329397681 +3169116718 +1285563445 +3263469974 +2364035402 +3969706508 +174197931 +2352453073 +1212305052 +2786914155 +148856790 +1542273851 +4256851842 +2368517997 +4150387975 +1854556131 +1889717457 +641025297 +720525978 +879426841 +3496702501 +1474842209 +314799157 +555366782 +1473148962 +1588745970 +3638307538 +526743794 +3182690827 +2844303348 +606677160 +2747421735 +4077165140 +2397509764 +2317991948 +3884830254 +360514055 +254287459 +1176338918 +3468215394 +2988555824 +2845403510 +425993695 +1502221577 +341728381 +543810389 +2541259236 +258359233 +3934215849 +911354382 +3556473929 +3874431060 +2106386799 +2444976788 +2524049321 +1056610707 +3472401263 +4210263971 +3460738597 +2482123570 +2608149438 +3175031456 +1721782685 +2716985038 +2995828555 +2725839450 +2223594524 +3845078897 +2376855950 +1053795996 +1540781832 +3149940619 +2596616071 +1153370150 +3573985153 +1215360342 +3910545234 +2046891610 +668354220 +226991937 +3379807772 +3945977183 +3000284149 +2199830372 +3000453618 +2262863696 +3120778859 +2261540245 +3370067416 +2247424712 +1261487012 +3153664849 +729402233 +1973322576 +1146744915 +3662403529 +575923875 +3642953901 +238029916 +2973805704 +3984350269 +484499534 +4068215609 +1656561307 +3896496210 +265403194 +1432274269 +634086724 +2007303682 +3189944393 +2307626287 +1968357421 +556020988 +3688242484 +1323979567 +2166867774 +2874206063 +1066722466 +456738888 +3119227910 +884375220 +204482646 +2274864235 +2829858318 +4032855716 +4150346382 +1402273300 +1465642068 +1617270708 +2374205215 +4219360741 +745286611 +3430930443 +4122441979 +1282444598 +3212767537 +3220589904 +1735812846 +712168114 +4024275027 +1175545639 +2333907516 +2344923673 +22063183 +1378781112 +3662504125 +586152780 +3020884033 +1078368754 +1853096601 +930354344 +4263823286 +2051403186 +590686265 +3090505471 +2968663180 +3161550345 +1700058587 +3003811300 +4055894108 +547583729 +474971655 \ No newline at end of file diff --git a/RHF_10000/router_mega/input_old.txt b/RHF_10000/router_mega/input_old.txt new file mode 100755 index 0000000..eee2d25 --- /dev/null +++ b/RHF_10000/router_mega/input_old.txt @@ -0,0 +1,10000 @@ +778811513 +1063237924 +3685135375 +4094692148 +738302150 +1708982478 +776078598 +681695007 +3371734728 +964116898 +24841534 +2541479794 +301514700 +556914513 +3688838751 +1057352269 +1558330715 +3087432192 +3027886038 +2585682343 +1537439719 +2853228254 +2077676637 +1346244092 +342880177 +2357129890 +3244027396 +2062771998 +3615838673 +2102161970 +3315026194 +3250334772 +4214040227 +3912203814 +4276800463 +925122657 +3588628974 +2387094105 +3137002209 +542909226 +180217230 +4221952878 +3466088066 +2495602076 +3831440895 +2668103963 +682340288 +1547091897 +192632519 +1255724976 +3361516963 +2387906820 +697598441 +122083473 +2841744000 +3941997463 +1014524645 +3072299353 +3440793128 +712913258 +3830556860 +891389339 +309715734 +100968533 +3393197076 +870123673 +3786778704 +1824262562 +868165922 +910573621 +2689084153 +1354284708 +1493878062 +32548274 +1185232325 +919077567 +422683006 +369242120 +4026828026 +239778016 +1789045434 +1130971854 +4215301270 +1266627442 +688081274 +2267737841 +120935679 +1270335868 +3544459091 +1701053597 +730202924 +18038067 +1877056753 +1892172318 +3537318847 +360177770 +1045295465 +1821934158 +2301026881 +2552393277 +930790783 +2041609025 +1150402656 +2484856340 +1204112845 +4063113763 +2442718541 +2724783230 +2185906739 +1791103043 +1995116521 +3141166147 +2000500087 +230051770 +3005983766 +1585582 +1593384806 +301718160 +4146286786 +3015946570 +209185739 +2401515731 +2289112551 +2873583264 +1623402501 +4227888539 +803203689 +385518795 +1954175922 +1814180704 +3147514146 +124873210 +4262326043 +4170534338 +1624342186 +2272343046 +3257113525 +3570620451 +481243255 +104261775 +1076929803 +3503679013 +19587503 +2064758204 +2763535046 +2813389998 +1716226809 +884059282 +2836896248 +2791323761 +3510181597 +363275417 +1344567441 +3337143513 +2425163555 +578556237 +2686947647 +197809951 +2137518203 +3168083452 +3414918912 +2996039931 +1670942023 +2242871316 +1810382283 +598127230 +1996543753 +4213496887 +3106656999 +3700540845 +1405932927 +3377327048 +1292115009 +2792396852 +1672273361 +2938323297 +3258320856 +1269674575 +2369332346 +423228144 +3765449180 +619792269 +2553898755 +2524267855 +2383177549 +3070283759 +1374333345 +2161452502 +1524939201 +2042251106 +4145798847 +963977339 +2156108251 +2576866911 +3296137191 +93221342 +3074735520 +1040698855 +256826547 +1731030274 +2022760082 +683379771 +3842977484 +1251865141 +1524655029 +3568984389 +4078958757 +3004538966 +2957707453 +3054460281 +2244717010 +32047771 +4018829294 +3443240386 +2279648438 +164786819 +2964610919 +1937767774 +619333454 +2859815388 +959230412 +1998489083 +1675267566 +1002763601 +2177182112 +1155306276 +600526106 +2391027078 +1157573051 +3771268201 +1760348344 +635235190 +349645816 +3031529691 +3159454237 +1141993085 +1642567973 +961824789 +1274176708 +3878828273 +4256283075 +3229229250 +1598915771 +3427299457 +657015335 +2983607232 +1590090265 +4211133504 +1707455017 +3096744580 +2880536434 +134264932 +2881990586 +3622309328 +2504536436 +1014358437 +1666429482 +632327569 +1504944942 +3817571902 +2934108500 +2371803987 +2810572883 +2930050889 +3335946013 +1924993106 +2896756703 +3934282541 +1653366529 +1909472852 +3056707061 +1216217881 +743365674 +3007709281 +2390457306 +2843897752 +4036408238 +1599686282 +3740852171 +126140730 +2006098449 +11729886 +2401626114 +82609913 +23383632 +1499742265 +2635376812 +430154059 +420428413 +1662355072 +2671360785 +3696009889 +1525067710 +643816705 +86336115 +2021568045 +1324295439 +1444451475 +181535900 +1234588294 +2654449851 +1375923253 +2092295209 +3365472778 +4020161127 +1441142598 +1685174156 +2920580644 +574144978 +2534913071 +4229161126 +2680406960 +670748237 +2795288017 +870353681 +760693127 +1073271141 +3351010044 +3007588268 +3262594031 +2884703015 +4072444359 +2420317867 +3689955548 +1467022419 +582014527 +3315306221 +3729115658 +143730671 +2825803357 +738315915 +1058274789 +2179751961 +1989006167 +2833210456 +2024298278 +4224782315 +6773064 +3918241994 +1678728942 +4167275815 +3017095254 +1752072126 +3527904919 +3888009173 +4200082843 +2675003215 +3629377676 +1687331437 +2347411119 +2111916503 +73507813 +340018646 +755661608 +4289530080 +2020813813 +3388031012 +3685045159 +11011475 +1170135569 +2302318178 +4026158878 +1022734833 +969079369 +1810729043 +946066116 +2201819007 +2240504015 +3800402167 +1537031059 +2807367013 +1876603392 +3756133793 +226153656 +2483486703 +2979947547 +1973813960 +1792340693 +4267999819 +306673659 +2916594205 +1090397113 +3380554972 +958115313 +68523283 +551222100 +567812117 +2149047017 +221923873 +1769081419 +700782776 +1103224199 +1543768192 +3629949919 +3789728135 +1197843908 +3427455912 +3575918648 +782831265 +205252792 +2226236639 +2391382458 +836352060 +3280259725 +81579478 +3951670184 +3050403929 +2369607578 +374345845 +2011448608 +2498455407 +1996134649 +2736511863 +1544119586 +41564901 +2948426426 +2450519609 +1802897585 +3466493203 +707797537 +2457492590 +584833594 +3069736931 +1612949799 +2161754281 +2300787951 +3170510216 +4133606507 +2888910753 +648235639 +2679269429 +289973491 +3622724707 +2816859572 +2165438566 +2782521230 +971896230 +1306563968 +2399336415 +2256020907 +2472932898 +2183480251 +3552466575 +3668477327 +1143121586 +2031528394 +1433955404 +1087110368 +560494488 +889565425 +3581589292 +3746104938 +3992451066 +4131703377 +284614152 +2753059618 +1808491798 +3026975411 +1024725646 +1438055547 +355062003 +2019083275 +1058617444 +2916240756 +726937652 +65389804 +2525404621 +4147362910 +1414975217 +3653577139 +305685881 +1281231655 +3981756106 +351657690 +4133925010 +1540326267 +1296682247 +1047532107 +2493424202 +4187550423 +627614373 +543232494 +1105528938 +1216726660 +3331003467 +608692398 +1546330078 +1436687679 +1933926741 +2450297232 +2223524580 +531655060 +2695158487 +3108006631 +723069206 +2610455401 +890629264 +3745225969 +4010966074 +2344964623 +1763243330 +2568109355 +2322558121 +3986983777 +3104280171 +3999660989 +3548979993 +3113165660 +346568856 +1015686825 +2328532572 +2031820560 +864706438 +532129347 +3088687602 +510314921 +3948728163 +506049452 +2961270106 +3453931268 +1940191707 +1527926240 +3397220158 +2383992219 +2077878324 +2660344132 +3751034531 +1570907325 +2013939312 +2698759280 +230294330 +1863049049 +192192415 +2885485784 +681354027 +647214709 +1563191236 +2228251913 +1648300813 +1393235514 +2223492809 +3699307415 +2907644556 +277329445 +2790563727 +162869772 +2686210925 +1869131197 +3470449651 +1927414161 +3497875176 +2288010610 +1815616598 +3706389119 +4014780503 +242612919 +510683292 +4191858551 +3963296248 +1265227870 +2208450911 +384590148 +2446567534 +3503445391 +1163998526 +619219105 +3384228418 +4288235276 +2887839453 +910652810 +350430772 +2006753656 +2028156921 +4245135334 +3338193267 +2576232252 +3023285489 +183626243 +745702531 +447331047 +2498542693 +700740092 +512428417 +3074974333 +2198928927 +2233388922 +1485323738 +1879848043 +539023381 +415227053 +1974138452 +3451788049 +370919743 +1610339435 +1074700976 +617043533 +1431605783 +2240867090 +2316923929 +1397325598 +694554429 +3376690286 +2538507913 +3908010725 +2480414065 +1332234689 +1188252366 +3155921484 +2185210809 +2549410973 +199958116 +1219210638 +2881150671 +3054008503 +2122111538 +3511205995 +4099015256 +4054786773 +3619422785 +2803527382 +4218221783 +1553080280 +3527481981 +3132529363 +3445084157 +150803614 +3867797883 +3158888046 +1138912882 +2565784244 +2274327483 +1875454524 +2391516075 +1878120720 +3573510224 +1194188475 +3467866870 +2361049644 +4267858805 +983187173 +406803811 +2492102906 +3037399513 +3052091214 +2385839143 +1991659102 +1022043902 +576163274 +3353405946 +2701434698 +3439613567 +1606792364 +2649347904 +1844529818 +1376597253 +2496587295 +3397211131 +1403282301 +3180249553 +841744593 +4150573941 +2291441011 +2962825922 +1691798755 +958691591 +3444834198 +3855597097 +796274374 +2131724222 +273985945 +604018992 +139431150 +2007941777 +132526955 +572524896 +3642002613 +2841292446 +2270222699 +1700107010 +3033025137 +3395448850 +2338015304 +3800673249 +3296899170 +3389796198 +2705935636 +3941948125 +2824563903 +1041746506 +2764737690 +629141203 +3827534448 +2496733690 +3771048792 +257259403 +1813264289 +2275915180 +340629151 +2339356455 +4226674305 +1747309313 +414977315 +1318122749 +809220958 +3661247488 +2297755550 +2829807063 +3849006616 +3532921134 +520302185 +4001439606 +879836358 +3255461740 +296852079 +2394869172 +2808132424 +3365797897 +3018589274 +3751495381 +854930494 +1063681300 +2770235442 +1202470662 +2760577726 +3867768820 +932185951 +3392823612 +3216536790 +2981922952 +4226608942 +2934318280 +666274893 +3222712841 +1614369461 +2621772923 +3569815847 +419205255 +3855260115 +3338647910 +990950484 +161514121 +1445856577 +744241940 +3399122899 +1612973984 +3223353285 +1110560041 +3947710130 +1709676154 +1521101811 +981856788 +3292491788 +1724414982 +2841423095 +2768566625 +1868586477 +412283004 +2672471809 +854005554 +2372342975 +3114830882 +3647618780 +405621806 +2952356295 +951172191 +1693550456 +2729249486 +1370615184 +3695068035 +1429206996 +3485455464 +2216333379 +2091665446 +1578877703 +2020468572 +3507063398 +3544093078 +1070057120 +3057098986 +1084984567 +3491795254 +2010344777 +600326297 +1820110080 +155569993 +3162266615 +4121221077 +137394337 +2886101556 +3610340617 +3526658786 +1900013772 +1681922230 +1761400503 +846559695 +2884100689 +103590516 +2797483721 +1919482316 +1489379609 +3624821625 +2410565015 +3801266944 +4179230254 +3791578769 +2943855026 +2949745983 +2111163097 +2563689530 +2818974594 +1888759349 +1620482232 +1172190041 +624172372 +3151871902 +512806332 +2572714684 +2194045185 +555979778 +1305895878 +2062360696 +3171652120 +3175444147 +3010728610 +3601528967 +298322987 +2533906327 +572376593 +1940835291 +4217433080 +219022893 +2540360366 +4229203981 +1409090471 +1456676784 +2249288963 +3063628987 +3945468532 +3657455174 +2060004989 +2256245176 +2914185363 +3301584331 +2216223905 +3476358587 +1031420155 +267418024 +3732624299 +2416406002 +3962018319 +3788881180 +2082945394 +2737812934 +1561465813 +3584860367 +4043238120 +1978104890 +1470211338 +1448218089 +2297756385 +222870515 +2639648518 +1703406592 +2073037564 +594667303 +4287769442 +891588757 +3430863258 +1313749268 +2688535526 +1270903865 +3926353657 +559589907 +305861846 +221132382 +4233458869 +3603006477 +1764198503 +1110497532 +3600196245 +989374976 +3117932566 +274084344 +4152316239 +3068372426 +1188645879 +2709182773 +1778763483 +2572048654 +3578256769 +494918715 +1735044960 +2732063306 +206839077 +1980605336 +772904786 +2030425664 +3359182816 +2399223650 +3284739359 +3190063897 +3328834493 +572840543 +3592797520 +2823929486 +1381023599 +2410071285 +205209676 +1900334632 +3525296981 +2476558880 +2461276927 +2767124784 +1303557591 +1338332168 +954693741 +2520019259 +2141903239 +388769453 +2479620301 +4215832411 +961791517 +3730769197 +916858728 +2429577885 +2860676729 +622542404 +1048633215 +3911683274 +1731586924 +3877739898 +523703347 +3659465004 +3481930364 +2671000029 +3110634016 +2539145405 +2048326813 +2203811558 +376741547 +1726267754 +377057678 +2170317930 +1407906002 +1427085152 +684832823 +287147675 +3465453952 +3502135169 +3141733444 +3821566519 +2808140822 +1043826826 +3308512117 +748880208 +2154067931 +1331778236 +1416054923 +1483567973 +3744337007 +2924861474 +4060106740 +2180859127 +1015350366 +2365152769 +3072055231 +502151159 +2354480356 +3408220401 +2421596078 +2903569442 +3781462862 +225807864 +453352935 +1780740007 +196351086 +3574078103 +2727276400 +2811181071 +3758279354 +3057754178 +1431431741 +249842208 +133650047 +1830095298 +2919137286 +2086863249 +1094784438 +1867701270 +2214059545 +72383588 +3677472615 +3976225192 +243507670 +1801965784 +3021488371 +3616342325 +2082680587 +3426477864 +1569242205 +920984506 +3708202614 +276646862 +3172817765 +122882490 +53433808 +1373824730 +2577965487 +2945445854 +3508159640 +2321321106 +1556506744 +3056881906 +3561258991 +2795111127 +2353881462 +1615765259 +381629487 +3844467169 +2429227880 +3787380300 +3333677126 +1460446346 +1370231931 +366782699 +3631190007 +3038848903 +2293508970 +2951631458 +3985410053 +426502099 +3990398870 +1506336571 +2160390817 +3813838055 +3642202369 +3276525856 +143972327 +3730341912 +2414272691 +1480316249 +4246258246 +185718600 +3753810076 +4213405490 +608195011 +2125431726 +1912725976 +3101512367 +204337747 +1246877984 +823001596 +1335457742 +884532131 +1875830461 +959062794 +3790967107 +1726687393 +3247188586 +1388347946 +491153925 +515723688 +592890272 +2765285025 +479985818 +3005618678 +3781344133 +2103464528 +3956614645 +2279720050 +2326107064 +279820843 +3269989243 +4078941939 +3378881313 +1093378729 +53576666 +2611338969 +774057771 +2096786781 +1117847958 +1311749970 +3207620796 +776180534 +1905150276 +3667834481 +2643068852 +551221159 +3268829671 +1875773110 +1582970252 +4024581210 +2809901705 +855324854 +363213217 +2090744016 +270537780 +100275919 +2652563406 +3815184701 +2706427688 +1978149537 +457036652 +1154561904 +1437809806 +3156833241 +227115851 +3254685499 +2683686231 +2365276760 +4104858930 +2887522465 +3242225314 +3772243877 +3423145623 +314914184 +4133021167 +1206039608 +3841777476 +3712756265 +1681754749 +2429633805 +3829925204 +1963688389 +2219327996 +2186620173 +1604242449 +597348420 +2892369266 +2890100616 +1939199126 +2370896505 +1143852599 +1987282544 +661600347 +3772781023 +4188872507 +2803346586 +4230179551 +515885799 +1768432791 +2829563133 +1233262434 +3624819848 +3244021897 +3984786420 +1573942958 +539896483 +71615499 +3012598306 +3694697599 +2089604667 +1460603390 +868564416 +3440558005 +3773543263 +217372474 +2582866198 +433516556 +562061660 +3975414344 +2500136917 +988124743 +164941843 +805584351 +2005838247 +3479625772 +2389454457 +3936709520 +3478116389 +3406437909 +3368754613 +222930557 +1551906670 +3335941549 +1902094223 +3786455292 +1737106492 +3190639082 +3696667049 +2345980722 +3875543188 +965574844 +2759616268 +1783802242 +2754948705 +2265223909 +2971124385 +1184481461 +190005186 +1320608656 +1998190226 +2608399986 +2701864409 +946040083 +2017386745 +3240520514 +648562207 +1020621283 +3040956648 +1158822216 +1542338554 +2228922387 +986387683 +2546616515 +1310197048 +1411891182 +2245373629 +2529841618 +3836998476 +1658060776 +3266231642 +708423423 +2969152989 +1377439373 +3639587212 +1709865561 +3006092337 +1604109441 +103724329 +2763736200 +1435945146 +1999211774 +2627927691 +2659343649 +1040588929 +3329127176 +1935917500 +2386222378 +4039708592 +683881218 +3533551341 +1154740507 +187589798 +876350236 +466210116 +145199074 +2324250370 +1756399988 +1569658253 +3162331237 +1386831495 +3206987642 +1718183576 +2390292180 +3634847260 +2828622129 +1103547007 +2336519566 +2146873702 +4130200851 +2062322324 +4293802201 +2664945351 +2472554067 +1199873990 +2467004858 +2811235483 +3554691316 +4088839366 +335856067 +4208997331 +287362468 +2253755913 +279637036 +3738679120 +4178497930 +370985761 +1620269758 +942238710 +1450947312 +3545549931 +3986533624 +2016474366 +3122239119 +524191516 +9002602 +3686217844 +443843460 +1221631358 +4292900957 +3881717333 +3868320366 +1298359435 +2016092359 +2716474860 +2955416645 +3036814695 +1287793323 +2478700576 +1942716384 +1043485235 +4290980762 +241835435 +1138037975 +1783083675 +2819404252 +3049200562 +987940466 +4290379338 +3566641376 +3596366743 +1691043774 +1574928679 +1241045866 +258203182 +525670711 +1733757981 +1946104481 +702791414 +964985353 +2790709632 +1365343755 +284756906 +3200174484 +1896307750 +894843547 +1383248660 +271317162 +1913891208 +1068542233 +1331868263 +1243290473 +3307448564 +4244641898 +1966079218 +1507554021 +174850129 +2822872155 +50482525 +2280740401 +31759324 +3402838475 +2776898886 +981066811 +1001309863 +4226605442 +3866444648 +1702267992 +1495239609 +3733925706 +827519437 +2237244860 +3781251739 +1844506449 +3909476694 +3284065372 +1341851916 +4075085866 +720858485 +3255315153 +1807284125 +2348033122 +222327499 +3597605731 +771234247 +3686445802 +446237896 +3749448365 +3618355783 +2944473295 +1805350788 +3497865368 +2886446646 +1601675715 +49723276 +1606848440 +2396345192 +1750552231 +2891812432 +3163267331 +1307591001 +252682830 +444145401 +3536811651 +3427012290 +3537164770 +389953580 +3673368955 +2024076663 +3754701362 +3649205416 +1167908420 +1467102813 +1381660205 +3071617106 +3937978790 +2599467044 +2914935995 +3931381065 +1656477972 +2756278064 +3504386564 +4089717941 +2325843187 +3700343931 +45784896 +3617344896 +3877575341 +702021475 +887460739 +1313248149 +3014046749 +3004599481 +890880173 +345302975 +2671435022 +1448811742 +995958250 +23233856 +3165011153 +1777259669 +3957577372 +473588333 +3545677811 +1368304500 +2162342347 +401228293 +1402456615 +3007681504 +1174159706 +1338080363 +1096559404 +53431832 +3874211069 +364470294 +2969614896 +3554467399 +1655955500 +275326227 +4279781070 +1476858683 +3254696613 +1140428275 +1435479616 +166335556 +2622679062 +802094909 +1226819114 +4222716075 +2736404757 +246801058 +1888992915 +2376109303 +578778270 +3348697287 +305912057 +1870396388 +1100188582 +444162667 +4179461176 +582675837 +1489481350 +3681560580 +219640879 +1260276003 +1609176812 +2457968635 +3681700742 +1108708763 +2062343522 +2332468689 +2013973328 +2440267245 +1880042125 +2479144458 +3851060896 +4202201329 +2804051959 +3097160476 +1493260751 +844932776 +1328827490 +3062465959 +1034664499 +526914341 +1975260406 +558977446 +1081168291 +653726756 +744886885 +2706768682 +3995355546 +1615610309 +859714395 +1050226271 +462519671 +3153669617 +1599641338 +296982529 +2785489362 +3952593461 +4187899589 +2390980325 +746501720 +3891526435 +618113810 +3663715591 +4146466405 +844933655 +236954220 +3530692069 +2009332414 +3028569467 +726989284 +1618804725 +1469974902 +4247147233 +3486835849 +823406253 +89655308 +605184997 +2016919074 +1076532984 +3120162974 +2805094505 +3058997108 +4073471404 +1002559333 +68670525 +2411294403 +2446056988 +3208512060 +3169605631 +1246780580 +309560915 +1357956638 +1568319318 +2111107704 +3641984454 +2920352574 +3611185399 +1460324282 +3589204372 +1312834059 +2042809951 +424617434 +4003096491 +875447613 +2176953375 +3216384845 +713833830 +128366005 +473214943 +4287469375 +303301402 +1207768122 +1544796248 +2568392976 +609894704 +2097765646 +500338280 +1011116093 +923371999 +3564994512 +2302347346 +3654078486 +594204172 +1411819550 +2237974516 +2040283025 +1614821896 +3678486867 +2903306524 +1039104095 +3059680981 +650879304 +2941173928 +3790080720 +3742536194 +1834142188 +2427036758 +2220214543 +2321379205 +147020004 +2880208688 +2956307561 +2854753046 +2374969057 +4131528681 +2053847711 +1267236020 +3979052556 +2294384328 +3707192197 +403356914 +1526103939 +1480890261 +3654301200 +161063190 +2591365535 +3499691771 +1032422393 +1791015440 +1540140882 +1456601438 +1718298025 +3966000187 +47096785 +3246169377 +3945301419 +3603330203 +1904733512 +2922604824 +2707857194 +2449599371 +1550427606 +2752566317 +1022073250 +2876390225 +2446183464 +3971958864 +2283656337 +2668257879 +3153190275 +1027990220 +388404622 +3383994013 +140865061 +3046947016 +3050359425 +1621937696 +2050320315 +1278917208 +4260548424 +1959450215 +3379585733 +840349688 +2161584341 +2846862040 +3169977041 +4284652845 +235263861 +3966265912 +2651415946 +1270956370 +4236812429 +1810719399 +1006305617 +3207897174 +3169224617 +3063878239 +1189515107 +2936265649 +3670266418 +3262502959 +1734117983 +3842389524 +3377967075 +3830586663 +2574927399 +4005320525 +4095565242 +1731308565 +1832857748 +1725932342 +2868637101 +3396725430 +2039366520 +3949716122 +3406698571 +545447507 +3707182165 +475758429 +948031129 +1960822995 +1986825278 +2191142566 +757136206 +521210428 +2341152158 +2125266076 +3086180432 +2912503620 +2408579864 +705641314 +4210448724 +3004785421 +1676677820 +3298009135 +4103511991 +3372997368 +1037337903 +741665724 +1081282844 +2753260321 +3311516655 +2743140387 +3870201205 +781429605 +34551850 +1313394142 +4188942942 +592029569 +3934559585 +3412826062 +1565866088 +2788594585 +3861864443 +948671901 +888821971 +3858185888 +3419051160 +4200344241 +1673791162 +520202599 +89184195 +2565960821 +3100415134 +3042959777 +451176194 +267971558 +2857071992 +1292628033 +1831645679 +4006337195 +483394981 +344799064 +2514786318 +4069521437 +72707309 +1247438754 +1642727646 +1771252348 +2076594854 +937276002 +1562442364 +2231285456 +3583538319 +316602599 +864267328 +3443019746 +1438143924 +1658871137 +909189605 +1408523034 +2269118058 +2829847284 +1291254668 +2307773284 +875903277 +892462635 +3980283864 +2604251259 +2046759221 +1191842891 +2404304305 +2687925062 +2353278085 +3666460920 +527197832 +1395867018 +1101383026 +969178579 +3481879696 +2458334152 +1360443017 +275955178 +4006349292 +2272068689 +1097703873 +1242044275 +2186789847 +803988605 +2475616877 +2931144012 +3172762609 +3584126299 +4094757986 +3225667484 +3615066192 +2355951703 +1030993332 +1973398994 +3918266638 +1450907483 +1506499030 +3726397253 +2214186027 +1764079917 +2875558261 +4033557720 +2849089949 +1107905933 +786527819 +160089831 +578036469 +3826089804 +1806995083 +3068746321 +1316776561 +1580303750 +2346643145 +3148370371 +1811036366 +2113025622 +2585737219 +2346380700 +441364662 +496832132 +3197805516 +2332623409 +3704851418 +1301045766 +4098495421 +1423227316 +3368295243 +3550023993 +1820102656 +4162882225 +3226392410 +2590579479 +2856639332 +3733132827 +4035546381 +3242347560 +3714311877 +4181227575 +191566137 +868051402 +1953218376 +3112220559 +272091119 +307558045 +2274260927 +3886184361 +3506822230 +3560578354 +1745431567 +3036361947 +3263659024 +2561958138 +1373979315 +419451214 +1966513205 +1950309709 +4004630215 +2502850551 +50332894 +3744363271 +3270331002 +1909788651 +2298512630 +4138759596 +1405504574 +1622332567 +3160699401 +1264799611 +1199923336 +2485596312 +2587114688 +4116905342 +1363350667 +452791472 +3507531479 +1161276589 +425459941 +2701754973 +3887732691 +2989720413 +535182909 +3190986415 +3892600076 +3728573138 +3874392303 +1804818703 +1380064754 +2630753079 +305197562 +2976538301 +1463159063 +3947703083 +1210343433 +2329624060 +248879169 +2738955977 +1643606618 +1450166572 +2841410274 +3085165001 +1093728027 +2094864623 +1010410624 +2012609397 +3564480875 +1730977937 +3856612948 +1252809417 +1087699862 +2589222858 +2003804608 +1014791141 +2590039774 +3006620510 +3635828860 +3014512046 +857528380 +3289573786 +2998894695 +2105881353 +248543458 +4130222167 +1069047682 +494204099 +1266192304 +1639634815 +613081384 +3399483049 +3507004009 +2884928435 +1973449501 +3324102210 +1662696447 +1009687318 +1822876173 +681627 +2211598846 +3924266000 +2128121253 +3675395879 +1762869492 +2373187384 +2991456777 +2898189041 +4015061365 +541844495 +3650212568 +1166065726 +1223027427 +757808419 +316885862 +118448594 +2578431574 +2605336946 +2692585251 +1069937984 +2893681182 +55899522 +842227075 +2491338887 +3718298326 +3912246679 +4082287674 +2145599198 +1948584060 +3816822785 +3560394185 +2660719257 +151429112 +1553055436 +3572158706 +1856686434 +492573259 +4115666409 +2283558525 +4065030629 +521919243 +525781399 +932029644 +64926338 +342110371 +3870094031 +2896651483 +1220614363 +2220057381 +2720211920 +3952604616 +2987707172 +3815736324 +2341996241 +1741167778 +692112630 +1773962257 +4151214724 +2089050352 +441249049 +4277094769 +2596328076 +4007864336 +2249488718 +721059004 +1433625585 +1928815360 +2141568176 +4155164844 +2765711731 +2764939420 +1608239911 +54198067 +3821317399 +3583298005 +1799748186 +3542351415 +1597305209 +173937408 +3987470252 +3157301676 +2785669017 +1077146827 +1741986836 +2699319696 +1684997344 +1420528368 +3857273274 +680631761 +3664170241 +1081978728 +95848940 +4159378333 +1846366656 +3684644216 +2916471035 +1863594157 +1705009111 +1302543317 +1222447947 +1230589967 +2544670596 +2553871258 +3358451777 +1899172158 +2598788225 +3085481584 +2450622847 +2298853226 +2880469259 +1261814099 +461832425 +1475905473 +1986163123 +2544136074 +3314099210 +2847247451 +3341938740 +2062397282 +2131176255 +1249469415 +1783205294 +3641090191 +882715020 +1420390892 +810641627 +2511253556 +1235867264 +2556991360 +3329876123 +4200271419 +2146472011 +2803890062 +1993782637 +1506602407 +287184466 +2257302319 +479813069 +3488451688 +141746695 +3292410142 +2118820296 +3135275320 +2565695542 +326282699 +2017454189 +3994076959 +2853847578 +2340099350 +3624408566 +2963504674 +1342814842 +100534661 +364985624 +3149318050 +4277860397 +3104385548 +945077053 +2971224444 +1270768207 +3951941458 +2853066178 +2383680851 +2853762361 +2629703130 +3411970079 +2649049065 +4097482853 +1829255860 +3866519007 +4210347225 +4174827596 +2233294901 +1222757534 +3453322046 +289122064 +172576852 +36594091 +4109917761 +1295052900 +3072291647 +1449493328 +154011128 +3298387892 +3274556598 +3320824802 +10737369 +3415461801 +2039494887 +2237079554 +1932871910 +3040408012 +2858714003 +1506673542 +109200606 +3638690992 +1359908132 +3052399868 +985961152 +2231586576 +2971100703 +3278687756 +1852872374 +153090975 +2300974661 +3806658882 +2009452807 +1452816366 +2592534223 +4282304853 +3056911368 +2069358482 +346571663 +524688985 +3699247183 +1252373335 +1431475388 +3420591758 +3340951257 +1665972785 +3591950725 +1968923694 +3797286561 +3845110989 +1111034497 +1082580120 +657400774 +1180240401 +4253263650 +819596598 +208942214 +1207483538 +118921550 +3796447180 +203552072 +2804237380 +2795674871 +2246586174 +305447625 +1170912332 +3897605636 +3037067529 +3193288730 +1684363568 +1559242041 +4153591442 +2500661331 +3409099271 +3251538921 +2604140617 +104305663 +2865538040 +703626179 +680884900 +3416765395 +1548601006 +277333709 +1018560630 +681466004 +3161103875 +2849623614 +427451283 +327994402 +3681564665 +790374616 +648002061 +2292046077 +2676161034 +3258173586 +3290338785 +799145151 +1188158511 +3037103758 +3877559298 +3664076581 +1907180383 +2765098727 +452653304 +1734734020 +33358819 +3037315631 +3700215667 +1679491511 +1564575743 +3881108504 +4287732308 +676255484 +82309000 +2949313316 +2161759799 +1943882663 +3446726007 +1568604542 +2772010068 +2753445706 +2445205758 +1758714839 +1927958515 +2437389236 +333242671 +4195176758 +3003672155 +2500506563 +1929193880 +3268308806 +2559199071 +2573040258 +433214791 +1033368540 +3243928949 +67555307 +1850990275 +385381264 +3594488345 +727437580 +1506768616 +2037101019 +4046754456 +3900185315 +1718815054 +2737924656 +3861548422 +1320045067 +485871260 +2067236316 +550346878 +669210104 +1370731304 +1233071993 +1075159790 +2751328505 +442730808 +1418466029 +284990818 +1700751072 +262302870 +1977185296 +4060018736 +4198606146 +295869732 +2157974675 +1665278659 +1277867899 +3690011785 +65329723 +3108820879 +905624128 +3034577811 +2310720076 +315985637 +1236230939 +967334082 +3315545921 +4084333530 +4020869882 +3402264068 +1830787321 +1315213838 +1140054279 +48195888 +797236325 +3749660757 +3528937278 +1742717301 +1536145267 +3435164017 +3938473369 +1302966766 +3920031835 +3500814523 +1400714039 +171714496 +82058641 +4108819020 +1715819143 +3798922915 +3482843783 +1924460613 +2561814944 +810802980 +1263955903 +661937397 +3574893796 +1359530952 +2848739373 +460310082 +3706194873 +710717533 +3328895650 +1506141162 +1979873207 +2060242378 +462133289 +1777833110 +1277103609 +3589565174 +1756109906 +3256104886 +3434714280 +3301985511 +1858665990 +3301640308 +774161168 +904252622 +2410446061 +1550935706 +1359694489 +3831971256 +278336206 +1285685805 +2739601311 +3735425201 +3100909096 +3483484684 +2452868847 +102461272 +3808318974 +109959724 +2038422516 +1179084288 +1735081703 +2659437846 +2390698394 +2132053996 +4224459905 +3239945681 +3959892374 +2953509719 +2675864630 +2975595431 +1264991952 +3251607805 +800472573 +3297482074 +2998851090 +2762465280 +4167876078 +1757159994 +3985758123 +1217117112 +722544836 +1017859254 +4133529935 +2542092420 +901465735 +197768578 +1557816262 +3854176169 +1097012631 +2521840571 +2350634398 +2431832251 +4293865816 +294749209 +2786760549 +2727362545 +615905568 +1221182844 +1475012471 +855811087 +4207377477 +3792290137 +2982240316 +2336164100 +48161586 +4248782395 +2821938119 +305824345 +1665858596 +705157120 +1694182675 +3879981750 +2725970635 +3317320693 +667356638 +1317132175 +1958205867 +3613247819 +4011755679 +2468397140 +240091716 +544534602 +809582542 +2849798049 +1419064716 +3982227068 +1906195289 +1138863879 +1158720442 +3452399205 +642182185 +649256370 +2304563821 +4177566540 +480628367 +2968350860 +2491790659 +677876906 +2635777556 +3943791002 +1994362364 +86262019 +1216813333 +3430429015 +3267072865 +2909997938 +2201445665 +3067379612 +2077296731 +2471447919 +1690186390 +959014927 +4212807365 +2133642604 +3554603995 +3307799063 +3089545274 +1944278622 +1639239019 +506931761 +2400204268 +1632591221 +4129564289 +1391163249 +86431545 +2530841827 +3567099397 +1107960883 +1170021920 +4031336597 +2573349675 +2628181637 +1378548318 +3670352236 +2715312139 +1867156574 +3420585470 +3539421085 +3704792621 +2175153388 +442412631 +1248713619 +3588352605 +4213040999 +3391274057 +3773618582 +3871512271 +299581896 +2552034429 +3122320947 +2747736160 +2145162619 +646058579 +3816717020 +1150079056 +2319076847 +1778767535 +2183133983 +51929980 +3890198668 +3519505196 +1584300366 +781855291 +1095936723 +298984256 +1716813487 +3182683224 +3343612914 +1524749993 +4036726232 +3990074634 +1798831712 +908011121 +287507484 +1597152083 +494960856 +2048740130 +1725194988 +3073256275 +694047295 +3066535539 +4116869712 +2938057179 +1633268824 +3926082665 +137525817 +1490219079 +2278388743 +791976205 +3069385968 +737218729 +2587097498 +2361124073 +1174571919 +302248182 +1234469635 +2557139926 +1201247443 +2787962745 +919061122 +1386350868 +4214294567 +2103715438 +2666024349 +960348132 +519596022 +1058628888 +3644575319 +1571431400 +3264987977 +1539098852 +726968473 +609774029 +1433912899 +3147161873 +2910057471 +264199859 +4054893310 +2613200627 +4201843838 +1267956256 +735695641 +4191655721 +934270467 +4140870675 +3341370036 +192925632 +1483260511 +3904477639 +3385173091 +4203994564 +160214813 +1172117757 +533300857 +2530536155 +3545359615 +3457113676 +3099940972 +3543637012 +1101442815 +1016457826 +2268306961 +3206204511 +2133109964 +2473475866 +1554617865 +1989872058 +206989013 +3040556353 +1619780992 +2848759445 +3870076929 +1267834968 +3196875219 +3982638382 +2510677862 +1445526417 +1587110185 +1962975124 +1507846119 +2273645059 +3063037528 +2516458088 +1559506331 +965774651 +128513876 +246051818 +4005463546 +780665289 +2447955534 +1472850621 +3218125748 +2436093102 +1823437338 +1976884000 +3571700050 +2686986264 +3553512847 +640676110 +1584886061 +4116268763 +2920545861 +2579442243 +2980770906 +3708805869 +2057104820 +4127719638 +3757530654 +816636382 +193348080 +337666550 +330270645 +2325494100 +2547522873 +2842976881 +3895060558 +2323702411 +1959876176 +4231023352 +2541080545 +2343860287 +2389308709 +2525603995 +904331257 +4089130329 +3908736735 +787636561 +4213391914 +3447112258 +4170871188 +1928519818 +2146531810 +1120789644 +2342752372 +38052119 +800212363 +1502267488 +4282249057 +2235629224 +1141701538 +3757529763 +310184418 +2812774180 +73792644 +1108171483 +1789750631 +2330216681 +4029472767 +2349036324 +690855663 +3927725852 +3374643589 +1294859019 +152697120 +110683560 +1538472970 +724364904 +4059186445 +3915443666 +1901968465 +3403735562 +4091865357 +3328179296 +502367929 +3994898429 +1841942899 +3928766393 +3800370125 +3612889686 +4286925152 +2030587663 +3076950998 +2775317770 +3397811437 +1448423227 +1320848193 +218334748 +2085251098 +1586156705 +3425761372 +899471964 +3238099692 +285838681 +757957444 +1567610568 +716911824 +1625768841 +1780989069 +2287591745 +1678854336 +2540639770 +4042696942 +3186200269 +3498857221 +2828688666 +2950547993 +68396871 +312551665 +100324 +4271538400 +2994540440 +917271533 +1058548232 +114284593 +1139574359 +3145193846 +3455516031 +899155824 +1630571943 +2180184910 +1533860609 +64593723 +2882141659 +4133423643 +3581106218 +1782284273 +681692883 +3581661944 +135884901 +1294821231 +2634534762 +1033767630 +57197309 +2938006596 +420398152 +978196329 +1261864793 +2214912903 +14064853 +357273529 +1715149661 +1084836420 +3567653057 +1980676662 +4238023937 +1155083221 +3493489066 +2715076275 +1789259460 +2993648484 +3324814973 +3816766364 +1618490347 +4043838493 +1332872921 +3006804379 +2351718287 +2999972756 +3110593463 +3541048609 +1859009272 +1996781533 +422381195 +154487946 +3798537245 +3007054038 +3390589478 +3258174461 +3987087626 +10157928 +4076392521 +2083063640 +3280849298 +2589785335 +666396975 +688269817 +1001210686 +2258449405 +1378109824 +135679069 +525538644 +1057184524 +3316228037 +1281967106 +2381216368 +2440442242 +4023696080 +1155357449 +1610275911 +3997983540 +1679591931 +3523618221 +990978654 +2910081258 +893612356 +2270633763 +2185375766 +3135608597 +695091554 +462791031 +1898815988 +2042156125 +1045786848 +3628278501 +1873041682 +1212206088 +2377815585 +533423621 +3681306320 +1980309136 +1630387881 +1278724922 +4244026289 +2793210173 +3961434064 +692381657 +492336289 +1116813470 +245390318 +1225572000 +684718165 +3102340469 +76678671 +3302497002 +772950309 +2781375365 +2607084348 +3275099575 +865660768 +298216863 +1898110510 +2639156447 +1635164058 +2389725293 +1480503409 +1639966806 +924860624 +657443257 +3122991514 +3156066364 +2547463771 +1848077594 +2253447164 +18795538 +3513052840 +1016313000 +4160188930 +2550156521 +1578498927 +2859490850 +2987529643 +4145522430 +3055172815 +3071633503 +392401133 +3297084886 +4219526834 +1720355809 +2806856492 +3276171296 +2928083227 +4246881146 +2295769999 +1537659344 +4252042533 +2014150551 +2574699 +4164537865 +1735685736 +1212655339 +169403734 +3592390911 +735526154 +3071154720 +116129218 +3728746115 +899710995 +3641957934 +221596297 +1608044186 +3598288211 +3749690398 +1715793851 +3970471065 +866781183 +366756151 +1759783167 +719017209 +709262837 +3782591348 +284679996 +1304998977 +370065306 +4080630850 +3236277460 +2847588948 +3804629116 +3451392775 +2703597770 +3845563995 +399572548 +3881966168 +4267996604 +3347231991 +3743985813 +3384279176 +388178694 +4056405304 +3027103713 +2069215473 +662918945 +3808818337 +3446122995 +3079281841 +107410102 +2367369011 +262232788 +1375149939 +60428633 +3861845950 +2152376962 +2744894587 +2338926380 +3682717513 +1419335689 +946844558 +3661409212 +2454258347 +23652321 +181901667 +3972386019 +458732346 +801326422 +3517414487 +3773765287 +1247743045 +3761451350 +874175027 +2588747636 +3084502310 +3137827561 +1289654719 +371211303 +3805257914 +2650736360 +1199758454 +2794925679 +1759023627 +4291175927 +4192373067 +3061223835 +2730031742 +1322260676 +3366419686 +1876209681 +3161596855 +2327387253 +1235761429 +873520321 +2036957540 +2626904824 +3730714375 +846144149 +1310055263 +3039818603 +201500069 +994915838 +622722391 +3126090078 +1126386818 +1019946663 +3038719144 +4125456350 +3964903286 +3909805333 +590008506 +3603946824 +1023098525 +3480063426 +1905962813 +324545705 +4242755422 +975640662 +1939487526 +1136512978 +2769794253 +2457124066 +2223812304 +293510038 +3746910824 +615570632 +3043441239 +3856622725 +3337475143 +1045388002 +3332499830 +3894311370 +432114424 +1629055184 +2171362423 +1610522166 +2225134772 +3979440134 +692242947 +2158889258 +272545546 +2652229803 +956412310 +20296591 +3561974213 +458542507 +2504468766 +1609281005 +1327949003 +132382344 +2059343508 +865514247 +3538984440 +1788827678 +768553672 +4201337400 +3215091347 +3192723901 +3464985486 +2378524730 +1183286253 +1936206216 +1677349458 +3541079912 +3338651812 +3437792122 +3274021848 +3032153338 +4237517405 +3642905590 +3767401435 +3412700309 +696990869 +1606428386 +3848000113 +1060571127 +427649896 +3057201970 +2099900397 +354962871 +956093047 +3167994352 +467108945 +242014417 +2591307849 +970147845 +1711554177 +2927532747 +3311240480 +233823844 +1490405275 +3091089244 +1177046766 +140127572 +390881463 +1563820324 +1668726467 +3038906396 +1339834079 +38756055 +2895003853 +3017860594 +2550225482 +3138155558 +456981431 +2666131776 +2004169841 +2915369396 +1064854979 +2107853225 +2751635533 +4007133480 +3152902300 +4089607097 +4059385692 +2388703341 +2268092547 +4000025189 +915299000 +172507675 +535504676 +1048876211 +2789253566 +2445558095 +568982716 +805214628 +145927037 +3442814866 +2464837072 +876627990 +876711790 +1779187840 +971481749 +3480603585 +835677863 +2407894173 +2424266220 +3805725123 +3506823155 +95520013 +4144296011 +4149406982 +1314774452 +2030397498 +4114163365 +1578371985 +3873690626 +753146936 +2460219386 +3647192245 +4152243527 +2171574105 +2583602045 +2475961736 +1300617001 +2567426573 +1256987014 +654739786 +2438708745 +4122182622 +2573455067 +4008577158 +683245356 +3423476535 +1454869903 +4292657578 +2646463476 +1515300342 +2977377239 +3519358888 +2234845992 +669671045 +219551405 +3769137522 +855659236 +927306551 +4097146616 +3712320027 +2770352858 +646105471 +1396736932 +3888673238 +3898814608 +3817389876 +843764647 +2080808246 +4231223259 +3379545386 +730383754 +1838604017 +2511401449 +36137904 +3971620417 +637367410 +3725059043 +4159147939 +4087967528 +352118195 +2011011094 +499462091 +3693348893 +3350599522 +2211172521 +363177596 +3715591520 +1158356693 +84205290 +2109280674 +4255290381 +2294218509 +2125304438 +3518846616 +3864464022 +3645523342 +1791032545 +2936881886 +2357709987 +632617441 +2579301931 +3065854881 +3525153831 +1470312976 +2528284210 +2109673680 +3730776369 +2265504624 +2197826190 +818613023 +3529089755 +4211593295 +2331984755 +3689954530 +2953827894 +2216976157 +379862339 +1497571640 +3220262400 +2682518452 +1427315383 +4062427419 +4060654711 +938722785 +932179417 +4223803353 +2181345329 +637285217 +725885086 +2754922976 +2380192144 +1703131031 +3612715602 +1558780109 +3434423085 +732411436 +1698301248 +3183274698 +3019231010 +1109178120 +3762232002 +2254243665 +1408870630 +2754798830 +3210487469 +3850936031 +1555755613 +3068674980 +1597594097 +125744005 +3322524553 +2984631851 +2237032090 +484866710 +1339670276 +2479616643 +3727386267 +1897614562 +2725604450 +4220747551 +724694769 +2489946658 +3864046581 +2173952570 +452495098 +2705965901 +522286402 +2162096080 +1961194555 +2249786016 +882312451 +1749316854 +3572445598 +1152474633 +1711928688 +3550901497 +1529714918 +458450378 +3148070282 +2247732624 +428594761 +1655542756 +2321376557 +1738830577 +4213730399 +2841909133 +2396171524 +3330810263 +3742994873 +4115885510 +2663624715 +773993883 +3988851122 +3249284269 +1730071722 +3811691317 +2721857887 +913244339 +850238829 +271607029 +443451295 +3917995426 +1678905139 +3410160262 +557380185 +1705448930 +3791914730 +1747599707 +2647773092 +258153484 +1947166323 +3837406536 +2346411552 +2799897692 +816619890 +3146808934 +3774836105 +3513552036 +4262301109 +3487413729 +2266651422 +1354866187 +3674025806 +2351187194 +1596393321 +3508090876 +1792717098 +3169867420 +3665286717 +3054539346 +3589380370 +1520608557 +1694037275 +3354652398 +2570079167 +914015430 +1128471678 +1868118795 +1011770085 +2512988922 +4065158727 +1079709898 +576536311 +1772865737 +3808607493 +1580368362 +1922469615 +2097078465 +4114613481 +3922466335 +2461278756 +1781951611 +3898529045 +859638586 +2001842142 +3553384410 +1297934536 +588370892 +4102922740 +3616228103 +1144188500 +3179179082 +2730784216 +4226474911 +3958423843 +3113426039 +2253783688 +230903799 +2117235617 +85671711 +1184001762 +2606095659 +1210912196 +3029720449 +2850497999 +3068285163 +3446726017 +526008134 +863383306 +1200291461 +26565348 +3356124154 +408471192 +291403094 +2175350380 +3700479163 +1542383195 +4167281378 +3736569408 +4122285434 +2635509658 +795076805 +664976254 +1837289464 +1645153610 +1261618058 +1877760457 +177675804 +4135760900 +1715571218 +2303279841 +1984818231 +2841254870 +1107173415 +36001402 +2595170931 +520799140 +2253645260 +4282205805 +227204355 +3078478215 +535277384 +3441673476 +1955171462 +1840039662 +1330821699 +1367045897 +2232944899 +2586248380 +848616007 +324281571 +4161952755 +415977128 +3828115507 +1460955585 +2454605375 +1362912143 +4251220562 +325809929 +2409283233 +3680913929 +1818638540 +663882289 +1668961360 +4174115227 +2766416591 +784622354 +3180417591 +4218982982 +3983834505 +3269974801 +444200171 +2185080009 +3791094323 +1033572923 +2738093960 +2817222031 +3237598307 +4144977219 +1732629925 +142256877 +1001583544 +3152745534 +635892363 +167856937 +3361981969 +1482487028 +1958050978 +1065331877 +1176024459 +3980484983 +851802843 +3403848289 +1417481339 +1514354961 +2432299837 +1728673987 +3077164644 +2081397140 +3162950391 +1662424666 +3598801205 +1737244006 +2354895735 +2078385437 +2293711400 +337391481 +3186289910 +610664566 +1735854572 +2440900633 +2100660927 +771187835 +3893273431 +1689996949 +1221840967 +587475042 +1105346822 +3411038446 +2778726311 +3207972698 +2517280837 +862482174 +444968719 +3878995916 +1992142092 +2596500329 +1996689856 +348678078 +3620621991 +2343485059 +3766424494 +3074872325 +134894453 +2667901508 +3271347740 +3060800733 +781116290 +858707231 +3048040057 +4275992127 +2698914881 +715664411 +3941737127 +2918078775 +2706897130 +3394162639 +3933019412 +1014919462 +1152966377 +1580902791 +305700054 +2850343285 +3129374471 +2960710019 +4163955107 +514107213 +3111201879 +841948619 +2200189733 +3099796692 +3487994384 +3118039730 +3807782030 +3158944909 +921734905 +213184410 +2069418313 +1269638018 +3549833390 +1098442913 +3571146690 +3841348005 +3013196428 +3954893146 +852903583 +947196392 +556179377 +3789385621 +1244184147 +2793942289 +3042281707 +2731008489 +3753067776 +403240420 +3452081862 +1539040053 +3532097793 +3437259620 +3831491016 +1545110615 +765744147 +1895632127 +2888907107 +3920675289 +3322448830 +2694595544 +1173788879 +175166250 +2821191239 +4102932259 +1678215201 +3337041854 +3487943562 +572263605 +1767509508 +3597646150 +1928478931 +1508361503 +619704792 +1186871186 +624069524 +2486168375 +2423795671 +344275692 +1739363666 +534898174 +3631092436 +1159224489 +30593155 +1684516730 +2063526531 +38524401 +2899747241 +2627909029 +2164936070 +3462930510 +3568123678 +3239492890 +2355642212 +2663998116 +827186071 +4173684842 +1169377211 +85361770 +2354414908 +2979306472 +1411076615 +1310765090 +207515965 +3128424705 +431468783 +2295960275 +864250972 +3186744563 +1569070696 +2787245114 +2474758353 +4223680517 +3257660154 +2050418644 +1971526599 +384333398 +3513988425 +3799697132 +2711864333 +2964515377 +3011062932 +264330771 +1818152349 +1632946799 +299698423 +572198572 +312285161 +3219821908 +1797603804 +714786470 +2943482701 +1223489690 +3923730002 +757100827 +662021419 +504381960 +3692708929 +681307766 +3189144310 +930503831 +368026549 +3867510991 +1320891777 +4078934193 +3402798464 +4080584628 +4031830415 +1201924586 +738660615 +1915678703 +541472717 +117991749 +784798261 +2716312514 +2913044904 +2219229797 +2957815540 +2721569189 +1896875807 +1419316209 +1838203255 +101456285 +3520061602 +309754281 +3959774275 +2168820224 +931530538 +3911882990 +4244435754 +142734797 +2776288401 +2198240298 +238333983 +3370096338 +3210143253 +1776246384 +1698866473 +4181474795 +3278667869 +2205264524 +331688175 +4127363199 +2530695711 +395458647 +1844962223 +3446124319 +1651570259 +4016355469 +1877377352 +425813622 +709315460 +1343809251 +1991860581 +3435049590 +256631425 +3435660028 +1295202772 +1722154275 +2589690876 +346183066 +607862700 +2808661518 +4286256687 +3233180005 +1354625206 +3663105928 +3978086523 +2059232008 +3336762050 +2498525930 +3913430710 +3183157967 +1053888679 +2962764947 +3049258653 +1113624749 +3511264073 +3405268963 +3814493178 +1703017297 +2119908538 +3461200283 +3074948568 +3328858153 +4240115991 +378521091 +3646210481 +1692330771 +2415930643 +687957540 +2618506767 +2656886717 +2920650294 +3867847250 +3622307349 +403349408 +2499447282 +2442492521 +1221616724 +3323440659 +3479897113 +34649248 +1466631365 +463303666 +1739261723 +693230977 +985347775 +1952777620 +3086702423 +468108863 +2636053475 +3130821608 +779336416 +3173623636 +2472237534 +1739147908 +3687019095 +3527150042 +1494700463 +3178458253 +2801222012 +2454110390 +2839717403 +1102028296 +3735309026 +2497979646 +63820576 +2741310506 +1096389060 +692991188 +2546195316 +2570673524 +4003067514 +1630357707 +2204287662 +1320989492 +2337015555 +1073767250 +3771743859 +3339760058 +1617437311 +2885553955 +3129654827 +1762508798 +3696257785 +1627280815 +4243230696 +2829962916 +3404596283 +3736473541 +2074424329 +4146461143 +2734355121 +4274159302 +2102216882 +3298173887 +1335849302 +3544194517 +1690392061 +980854589 +259360492 +66477433 +1811488023 +1226390107 +1692510210 +3261836380 +363769830 +3135199972 +100055430 +1962759202 +1103587504 +559468264 +2107871149 +927789529 +444563795 +260104391 +4181850156 +2389247047 +3216347176 +2984698749 +1528067135 +3283965590 +1617805347 +2339379904 +3061726345 +2881130400 +722188549 +1962298420 +3946984638 +2781429857 +2319331619 +4050783585 +878670942 +3626727300 +2074591441 +2377203483 +756127103 +4208852016 +503521391 +1682864996 +4206916085 +2702129810 +2147646394 +1336156508 +3182721268 +2706928488 +1786744665 +4283579494 +3956059635 +2043484888 +1571318201 +3170377531 +2251989723 +2106070424 +2786005639 +3799705634 +506816940 +328583271 +992468734 +2582438552 +3056611 +3991913846 +1914714869 +2009224044 +4027983593 +3273224376 +3646928309 +3175163557 +3207097808 +822823411 +706308071 +172795527 +3244757236 +307995918 +622474186 +2158805782 +1953259898 +2608418909 +998891915 +3166923558 +1788835997 +4163610164 +3864131845 +1645472902 +625257234 +1888692642 +2488554946 +1602645412 +2797412005 +4090795862 +340375790 +2665590742 +4110648504 +3869396850 +2753892773 +525248707 +698161852 +3553761076 +2261156614 +1079192541 +3267250233 +2886180938 +1686473520 +265540119 +2913571966 +1019810476 +3461909546 +3551790422 +17321689 +1313738733 +1427461746 +1133910550 +500962802 +1378600811 +505229958 +3218060946 +1756237059 +681267856 +3828131827 +885279682 +2731387363 +4051168106 +1532596017 +3213243156 +3977135224 +1473552780 +1741000713 +3362896462 +1702997637 +2853068883 +3082063841 +2818636689 +2288415591 +1670201639 +449233450 +434201185 +3437943132 +989808428 +3834380803 +4112874873 +4120343998 +967332983 +2338046384 +1215931780 +3281429921 +2365435060 +3586665023 +712660773 +937833055 +4232678571 +2670321166 +1301225785 +60551272 +503764927 +3854733643 +1528540062 +1502293179 +1007517788 +2933865957 +3564759715 +2770755492 +3945507118 +3369306016 +3241904974 +1512887688 +2816494953 +3326476 +792035793 +1867854628 +1316234807 +2087029811 +2513968403 +406899359 +343532096 +1520202783 +4073615880 +30269998 +1496026206 +1389067294 +996567952 +4092325377 +1243111399 +3381623885 +2591260058 +1601368403 +3344013986 +1366619404 +1810734582 +2456881482 +2891431513 +3738374423 +1789350323 +4093710770 +1381543110 +3567169646 +3352780699 +2878170015 +2609134546 +1172051856 +2106924473 +3376735623 +3622883371 +1146868095 +1331309109 +3913812117 +847497927 +1567941802 +3346245326 +3651853610 +2077247523 +710713434 +699785371 +3898137385 +3291409895 +2134528090 +1382654708 +2851841003 +2936109746 +1853163921 +3749103683 +3177268895 +2559454670 +3687369748 +2988961616 +814177939 +2141491560 +1136066322 +3304982762 +651027890 +2925303025 +2838960400 +3772820843 +3412421810 +2621379117 +697233830 +568830757 +3486177856 +2752823379 +1116645087 +2747060764 +271018595 +1175857531 +2587893568 +2173309441 +1133032195 +1039102075 +2652579117 +2447602990 +4181249545 +702760834 +3265564470 +3331181027 +2108596890 +3761017409 +4139515811 +809946129 +2246972259 +696905195 +1872256528 +2657343727 +217352588 +2778283789 +3832555375 +3564418552 +2867887182 +1093389718 +2547784494 +3277308739 +2872037510 +3409835435 +1684928240 +4031773307 +281272137 +3031155756 +1158147065 +2174856092 +1595779326 +3984938906 +1127283475 +1346375699 +582606257 +4167534639 +2762633295 +1552069320 +2663992228 +3502692642 +3065283303 +3444942960 +1984294084 +881778952 +717723916 +1872668995 +332658517 +4009286806 +3380852301 +3604126699 +2671967170 +4253042082 +3688183888 +288257248 +288529477 +736094790 +2325985632 +119779202 +1922377141 +2412006071 +3105370238 +88589478 +2184363924 +1633907367 +3514701589 +2077103965 +4169590145 +3470346995 +4140506753 +950731651 +3171289408 +22597875 +1237049894 +2093583140 +2599559453 +749121511 +3037957435 +2116037254 +409627304 +2639924917 +3416860960 +3987562357 +2277618669 +797520023 +3857322309 +635188213 +1713630461 +3015233417 +3888074618 +3537255462 +2811714790 +727466979 +1448310458 +267456581 +62313241 +1596165161 +2689365340 +3990987862 +3055284544 +2781985022 +400065902 +584376750 +1877863938 +1181614013 +813838246 +2734277859 +3881571112 +3239787570 +803950060 +359775428 +2355909938 +3510134830 +984699712 +1590587719 +4100767246 +1126050589 +1696947619 +3030111298 +3890001436 +2583036552 +4066858375 +1324730671 +3420289456 +2845557480 +1206123599 +778144218 +2714051039 +3679724249 +2995009381 +2410390881 +560597184 +3360068778 +299608150 +1788111185 +2388207471 +4028053920 +3666753550 +2187275460 +299771603 +2704947793 +3444435455 +393631831 +397920821 +538112111 +454130018 +228913473 +1931239356 +1127539883 +3418114479 +3547833440 +1420997996 +1094291778 +2366763202 +760984801 +948237479 +2671237963 +4055631026 +254788673 +3963827753 +113637006 +3936954028 +807635013 +215253544 +2484109981 +3113044378 +4139283585 +1822489907 +2130574711 +3342367026 +1867838110 +1452102297 +1889067628 +1874376841 +555964447 +1953319833 +30231579 +4144642831 +892451142 +2363041293 +2353638903 +811384272 +1490707522 +1844667740 +2646816610 +15456221 +3684071784 +1183236091 +2615311154 +3727175002 +3826013175 +1714659929 +3800429974 +2826906120 +1470708545 +2742203268 +3544523320 +25022474 +1077206782 +2362939249 +1962813686 +2719900355 +1710461286 +70617010 +3751203366 +3474388819 +3929278306 +190486863 +3607768820 +56586034 +4023941073 +316367320 +2981104018 +3653036075 +3409120583 +4079901893 +3475755374 +646248615 +1535774140 +750483809 +806213542 +2540135368 +2781630360 +1192602262 +25930740 +4034240655 +785989218 +3369044596 +2469343248 +3068430966 +3241721216 +3492318249 +1941608930 +2521757486 +3900759040 +3917899741 +1885942295 +3211067784 +517299883 +217277587 +3432352980 +3084360896 +1099829388 +3906814956 +1025034751 +3635923432 +1442486989 +3082277868 +426048926 +2385313053 +2997228573 +1654318151 +757170958 +3783053583 +937718621 +827011114 +740290508 +271446082 +3681142836 +2906909984 +1058727485 +2372497098 +3801108750 +1141531116 +3608437244 +2719616105 +2103398551 +314985408 +3714157556 +1079971091 +195878905 +1287178673 +2026590775 +2944897196 +2590688 +2107718528 +2512693325 +3978233901 +1316468361 +700763417 +3802658636 +1029205336 +3629518198 +2435103449 +1225177095 +341499023 +58414935 +707266658 +2842437467 +3501353190 +3368302646 +1926739548 +3587772681 +3165683088 +1307281469 +208268187 +2632047631 +3500676920 +2011447215 +2401237940 +2675967714 +906605930 +3737647842 +829718805 +2190416849 +3152855857 +1688745313 +1360598559 +1367948872 +2141982655 +1358499970 +570807805 +1997194924 +443597235 +630741193 +1270499162 +2021746958 +2711155636 +732012281 +2627550473 +1869284135 +579563955 +4004616136 +3858708917 +3318950534 +232883734 +369994456 +1239918746 +3679205916 +3475738899 +2626006828 +2395573335 +2131477957 +2210544244 +187307053 +923581557 +4258592812 +1690320689 +2527951380 +1243646324 +3056405614 +1885423367 +1581579975 +2442996698 +2250946206 +3415147246 +3800323715 +4026299382 +1785270150 +2384627156 +2730852433 +3164876517 +3047957256 +4222849871 +371111311 +277717066 +1609955773 +3955147777 +2012677828 +2916924073 +3261652559 +3077745383 +563697439 +2295132613 +3549969317 +2609154510 +2726896649 +1285145843 +3308414581 +2298261478 +2876927320 +3733240692 +835518909 +1112498786 +3833309630 +860896958 +539923793 +655556106 +1520145903 +577218032 +1297519093 +3707739658 +1176625417 +3097816109 +2868171997 +4284083471 +3883537215 +3829871606 +3416032022 +669669505 +602259027 +2997533663 +2379821999 +3593649914 +2984756943 +3295007956 +2227272293 +2210223731 +572358874 +2551944509 +1794664291 +1686701792 +2822718182 +2193570414 +1067669245 +3911664471 +561297268 +4119477204 +3577943608 +2828068434 +1758506283 +1337091899 +1339473484 +4100188433 +2211852199 +4161762346 +580630157 +86854939 +1955303706 +3852254123 +111098316 +3299130517 +3607561279 +3648393271 +1316686027 +677932328 +2156733600 +3655302731 +869554235 +1263972666 +595388499 +2542548537 +1344704354 +1032283213 +767495645 +2804697417 +540780067 +2643410639 +3944550966 +2296010030 +351594264 +2815002476 +2758501059 +2806304291 +1826821485 +2343809259 +3460754733 +3145768109 +3960301556 +4226081480 +3237743590 +2404793849 +4267041522 +3643328747 +64521869 +1438443536 +3614359774 +3800110573 +1236085441 +2841437052 +44512265 +1985920545 +2798316919 +2440259138 +3016543507 +631371469 +3809287385 +1500615390 +2404711822 +1147390550 +737965400 +2205971326 +1512098396 +1317583810 +3273572724 +3809135837 +4210856979 +3529339498 +4189396771 +429543748 +2122439245 +2751606535 +1332359295 +2802610791 +2588278433 +1010089025 +634860075 +2717185385 +3882864166 +1751695371 +1149004772 +11992011 +411822984 +4209465871 +1345626121 +2347395658 +3237101479 +2032709883 +3914458269 +2516067469 +1360983660 +260080249 +2360620844 +3279160740 +2485830462 +3534816180 +2694989312 +1890051183 +1616172452 +2176033030 +3321933866 +2533696228 +4264018408 +3344820903 +3623757532 +2886098849 +874310355 +3823229275 +1652203502 +1656156589 +2434541162 +991172077 +1567777821 +632943244 +27147383 +535264340 +2170034156 +3870215836 +3571003510 +3943616086 +4026800975 +862462653 +4294624160 +1048551020 +8318971 +2799631345 +4033121383 +249776911 +4185344706 +3563928614 +4201501747 +2996251292 +3367812329 +3326905897 +1624165077 +1437165123 +2705952138 +4262957767 +1436008715 +2434653528 +1061051190 +938652743 +2266985220 +580682735 +2353027131 +376598261 +1776150550 +399191036 +472329071 +2332264466 +2201185473 +3890135391 +423531920 +3736297891 +3407578755 +1314429545 +2388899488 +3268110307 +1607223305 +1603486505 +2056745785 +314486434 +2588566711 +1656717214 +711187511 +1026594829 +2892621429 +3780457231 +2446106115 +3440747737 +3808836909 +886464786 +1350675731 +123273061 +3170063217 +2014550101 +4145396290 +1771049474 +122149521 +274113951 +4161634903 +2285600256 +1843075185 +1222478560 +2344401965 +3690415963 +1416615693 +2107243711 +2202329526 +1865413358 +1409166258 +3473701151 +3013942643 +874781237 +1065766193 +532945017 +240791373 +2157182688 +1060940217 +508595268 +700958480 +374567650 +400564456 +1286018011 +329831986 +4126489576 +1718906076 +2270874335 +837917606 +832618917 +2274310832 +3556031011 +977188775 +725901180 +2933748491 +802402855 +2261959429 +2519463561 +1566236273 +3106630142 +1684418180 +2276846147 +1629333204 +2640415435 +12713719 +838012252 +2482502326 +48833275 +1984429505 +3343994079 +2558556624 +3939839458 +3074290271 +837638359 +2186469426 +1357735247 +1460254068 +2189814712 +3808419719 +2012287073 +2405389042 +4088687755 +3982123000 +2245874452 +1234381598 +4201661377 +3389151305 +2334139366 +2634651900 +2059286508 +1420803221 +3861952235 +1260349354 +1463741215 +3750733011 +111288712 +1405331091 +57641330 +1468072056 +3996369271 +4004541666 +1769755979 +1180135265 +413669601 +2778764979 +3301208693 +1014393805 +3864427148 +3416678521 +1852613421 +488168680 +2444788984 +1498280832 +174275114 +2679191822 +621120473 +1392453342 +1709785324 +3737148741 +229781842 +1852606324 +3524629353 +30987184 +2705756765 +2508873219 +3941392335 +3284891120 +1558316051 +3023145729 +2598815293 +2341426895 +378595350 +2496408794 +3589344411 +3826282394 +2076892336 +3261050065 +1954601300 +1595753950 +1154925787 +3030347765 +779498388 +2132602385 +614977064 +705534277 +2953010506 +2620662696 +3221911911 +4239103060 +2743101528 +148619729 +1350780530 +1110922989 +3909114239 +2163855716 +1996013020 +1250104406 +2803496622 +946498437 +366797245 +1461586356 +3247633109 +2631549012 +788215142 +2778061071 +2144285498 +3769533361 +1991928359 +3644505171 +1116680769 +2807008429 +1424981237 +873358435 +3486246516 +2972491891 +121238938 +1876151625 +2876245705 +1644241793 +2702328351 +2703333427 +898852683 +346605928 +1213389120 +1292839516 +2369977660 +3103968989 +2359132437 +1872042659 +1784086356 +2226667360 +3732049109 +3419927844 +2993212312 +284776589 +4108200497 +2585181384 +3678315590 +2403124189 +2597015492 +3382494040 +2237238938 +2306473338 +2639541002 +823999533 +415780169 +3355564115 +2556321148 +3251223299 +2819621591 +3288381665 +3474018650 +3774356960 +2393878713 +3225419818 +3351573188 +3300698378 +3823315237 +3196912580 +3072058753 +1170435355 +2955304046 +460082555 +2857033288 +2464912104 +3100949535 +551723785 +26639195 +4290539230 +3691626071 +1719943115 +3925107542 +3226188055 +3840790445 +4170817712 +420232139 +301056619 +3257703844 +829537484 +2976476925 +351403071 +3756778812 +1336941596 +648381928 +3965835449 +3148983286 +3376247769 +742731604 +3917278794 +1501242965 +3543618985 +438672550 +1718601589 +3896744113 +1440769510 +3851334342 +3308084039 +2025980085 +1394722753 +1276466688 +4057695608 +1204649814 +1893280316 +4084476055 +3179635210 +1937453685 +799316885 +76113341 +3944990045 +2072874771 +1851937361 +2435682937 +3879195398 +1739115397 +759622605 +3618712049 +4223584634 +3093596315 +3015838837 +1407622427 +3539326893 +2188276217 +3708519367 +3741876604 +849730858 +1767409589 +4084622489 +2348473885 +2149525023 +2715098505 +2108923461 +574884110 +403054 +1835076740 +2718420487 +3798956101 +3002484852 +4270113829 +1519217108 +1182214720 +4202960297 +4211161672 +1684744495 +2787944414 +1101780907 +1307693187 +1333361279 +1038920302 +2820549766 +433443851 +3096795213 +369022175 +2440478724 +1780915009 +3406100931 +681709934 +3011796951 +4067059452 +3532312705 +3990014403 +1087273897 +1508294145 +3109858015 +2662206711 +117982344 +1537425861 +581367772 +201406187 +3628547686 +1793695510 +458699616 +652139163 +81318337 +1174637431 +2884913091 +2172012643 +2550656183 +713668683 +3448284645 +1901901990 +3916140154 +3187021418 +2457660501 +303736427 +1415156058 +2068056840 +1442483282 +1220555286 +2636380705 +11760685 +4156745798 +557934027 +2497247655 +3567729091 +4142613184 +569038453 +4250033845 +1548090693 +1477185350 +2562504433 +2963875728 +3036006502 +1630113742 +760239684 +2514124399 +423582821 +594760057 +944298821 +1051145167 +1145497376 +3478648909 +535114724 +2032797268 +1988560261 +1879100592 +1015906449 +3762163430 +1898690951 +2723943714 +4278571987 +71873501 +1768740687 +451263350 +1514527116 +3233337628 +1732349161 +3631857813 +1872477969 +1101950439 +3417250888 +350980188 +36350493 +2160271997 +2863951735 +3443187110 +3059211241 +3299994288 +1162083387 +2198229070 +1202353714 +2212336023 +1755039248 +4163680071 +3426807178 +4011053067 +2635285650 +3239716981 +3561251101 +2366635374 +2410018439 +1168874403 +2813206424 +3582122583 +3851402805 +3856558808 +1356557305 +931675409 +3943358293 +990644962 +2286554260 +461048328 +1530072896 +2373132061 +1528457768 +1556967227 +1705494031 +3361156370 +2207080730 +3220596596 +4099026328 +1572435817 +181348544 +3916383901 +107195889 +1430199582 +424176916 +3979547858 +484525210 +217315626 +381481200 +3132133074 +3968428188 +3847324843 +127047306 +805387222 +3291868011 +2672501480 +241188081 +2531637719 +4213638174 +66050257 +2904906746 +89337478 +2980389102 +878803755 +2172448929 +4121512328 +2683591285 +1025674583 +2456951840 +1110067214 +2990211884 +130982237 +3308774060 +586998063 +1034009971 +655640026 +326565745 +2993928568 +880977465 +373330691 +2268642636 +2495935236 +2568363462 +4023084902 +3351108039 +4138200052 +275318660 +1876065917 +4133957824 +759457830 +4020908873 +1935579567 +2031790128 +2017604324 +463238299 +2497191054 +1129033957 +2686953944 +961548319 +2992376105 +2727445645 +2698272232 +3765395267 +1833289839 +1221934835 +1079719113 +520559496 +3280503901 +2466665840 +867258505 +183777483 +1967278477 +1342101682 +3685806180 +3169259951 +3174108910 +861537624 +2088101160 +221291421 +2619461948 +683023935 +3479266868 +2851449545 +394215565 +1999799571 +3481528722 +3196837961 +1085951635 +3957738890 +205600107 +1534955263 +3992943105 +2271478780 +824736298 +3666805134 +491117910 +741376810 +2159784068 +548801491 +4139669354 +2347061342 +596360044 +3388004554 +1173812951 +1204568784 +1863006430 +2002028900 +666979166 +1565963937 +3952013108 +3276911018 +3171692455 +2059386606 +1027031528 +4241001457 +2893860820 +4006785918 +692361463 +208006737 +1068997917 +3735990836 +163487092 +2591677116 +2629781402 +96554468 +3758411608 +2161392402 +1036967338 +974850811 +3154466810 +2672415303 +469313063 +206783466 +1839329682 +407484930 +1273071899 +2871948764 +2477603119 +1338417920 +3731275749 +1372332854 +2764115047 +626695256 +2443762275 +1425980958 +3663936456 +566893660 +962610943 +1864451186 +3338410595 +4213430871 +166883724 +205465860 +3091561362 +4133714937 +3624467405 +517333544 +79730626 +2794286785 +2267662213 +1304941859 +1328866020 +1717043216 +3439567266 +1526757529 +773596808 +1190422469 +3244929405 +3201889080 +2782140197 +3677802305 +176536505 +1678989751 +2325942233 +2523130369 +2567335774 +3284026454 +1152167658 +607413397 +2154752906 +701028817 +2031607803 +2743339927 +1865403467 +3693827214 +3665498571 +1471423687 +1981220074 +2237708340 +3861703214 +4099976157 +1137654133 +929625725 +647849376 +1710422657 +3231426777 +1890575831 +4012856308 +3703617338 +3922991757 +1635672218 +1187399578 +364738103 +1369785308 +3675815736 +2384449422 +1399830589 +1250373066 +4236170819 +3569191084 +2492251831 +1528303041 +959504744 +4291541191 +3328739030 +1385939171 +3302413947 +1146216939 +2358521037 +2463690188 +3502868731 +30485376 +1430742455 +3024039536 +216313557 +1461757662 +493860314 +974335480 +1088896775 +1554343052 +1510917933 +88379433 +2156078733 +2661628742 +1865126178 +2655215360 +1460557151 +3217015061 +3926016669 +2253707980 +1411149570 +3714368384 +2396376667 +2904637894 +3868912623 +3718498299 +1296075109 +363437177 +1787097928 +1012955954 +3149837713 +3429466282 +1521406011 +3585897689 +2943072512 +4288318684 +67274473 +2017635894 +3072202382 +4202099609 +1629388537 +582038331 +3407004279 +4276638416 +3975793212 +3561119669 +2018433884 +2139632283 +2693701564 +3510927582 +330001708 +1878860163 +4136801221 +26623706 +3150753808 +2624641609 +2271504217 +24438696 +3976531001 +2845977630 +2040120531 +744404766 +3630391287 +1536934359 +408143093 +2321999048 +4009104842 +1398549256 +1417781765 +4035811405 +4273169187 +2516093672 +3329186776 +2699727255 +4029230906 +4233442604 +2304196863 +303056347 +4189005717 +2266376594 +2409949178 +3349207928 +1696301941 +3429512685 +339892132 +2209738 +62108758 +2258747418 +3332991656 +4090678497 +1621232756 +4252918857 +42011194 +853089329 +4178662212 +4086312084 +2861834397 +1681933849 +3163742729 +2191880791 +4170707433 +2736556377 +542017952 +3440928266 +4221062731 +4068507968 +1790987014 +4056849326 +479172204 +1124128162 +3842157704 +2323496897 +967617865 +3505442907 +934615153 +828619364 +1969512003 +352226066 +2765994587 +1747662128 +714198024 +25239576 +4045609146 +4004866134 +3422311538 +1308905507 +4119141273 +2934090822 +2198307845 +2574708820 +2221533799 +3390890580 +851537312 +3543184338 +1465629492 +17908406 +3276527939 +3276828744 +3493647346 +1069358112 +3307055502 +2017648930 +10457825 +1711998839 +1187323665 +4084383201 +247750883 +2500272918 +1261896402 +1950557525 +176970727 +1387814049 +3839202133 +2334446980 +936857021 +3534172341 +2571606499 +249901951 +4232678130 +1427847332 +1305584777 +4225862846 +451059154 +3958158280 +3591750489 +849290691 +2514090407 +1427315404 +2703121468 +472016707 +1424274347 +2752239996 +2703362555 +2902370430 +2804763555 +1251992092 +2822178516 +2648226358 +950487772 +1874958362 +3530613938 +645937155 +1237100331 +4002433864 +3564466840 +2481059693 +2538190270 +810992202 +347413590 +3370823394 +1211205103 +1206349961 +3299671279 +685538428 +3568732384 +3686790577 +699513099 +3580643368 +73630694 +2381865874 +141886784 +805138367 +1191216868 +2673386236 +2014867525 +33051800 +1568374813 +3361849718 +861528071 +1801998437 +4050328359 +2896319688 +3665969727 +3405468366 +3858869436 +920784801 +2122241156 +1072926364 +2980261265 +429562122 +1345413266 +1287981706 +720717823 +222144288 +3510652159 +1231406855 +4198238947 +2887135323 +1506846161 +1287389156 +220567206 +4070858560 +1618802764 +1454035774 +3032155443 +2045980460 +1572056008 +587349206 +3363458813 +3369940376 +4133163152 +142300618 +1425095548 +183387298 +3427414669 +1088913041 +1527910220 +2878244062 +2653616572 +3885120539 +3063038432 +585717385 +3609392079 +2039717178 +3745383226 +2850437490 +992439795 +2941876700 +3034189065 +698345372 +2044578814 +4028130121 +2214072740 +3152661048 +961784359 +3214513481 +1428017460 +1393323684 +2245677057 +4026341977 +12224882 +528044180 +3216915862 +828087042 +230581205 +713582553 +3422168291 +738237229 +3063733189 +961214995 +1796593429 +2134709685 +3571434687 +2999451183 +2435882636 +4004120908 +1515362810 +375521426 +992667718 +1225682409 +504719173 +2828144522 +828269836 +78087301 +3468047910 +3228342463 +381678958 +320665676 +2030715566 +2001120295 +2498374122 +3540761087 +3324087287 +1267947849 +642157893 +586276471 +3427527438 +3468131894 +3590477529 +397708590 +4269699649 +4055525555 +793110441 +3301630427 +3851517726 +332869135 +3484001661 +2692944386 +2064006802 +1605470559 +4000357812 +60012344 +3255816561 +2739770564 +77291021 +1731285427 +3750062232 +2134305854 +173115341 +525459789 +2428228813 +2480777954 +886051417 +3684422356 +1589671925 +3311871808 +2713895171 +1972831944 +3030834661 +895474710 +228371438 +3706300877 +3092907596 +592731379 +3436344512 +204047373 +1100821781 +1952916849 +4142047603 +2455232689 +2444648242 +1429119375 +932539953 +3056189382 +4180132021 +3295914078 +2871758024 +2390057383 +1733819261 +1860847873 +2182913330 +2809948132 +3133712476 +3091439636 +3399474032 +61395015 +2807545293 +2653132656 +114547004 +2587918625 +1435903640 +1653590642 +903863965 +2221021242 +4202130243 +217911720 +1408998485 +4080211050 +789931160 +3796990800 +2411254947 +960238785 +3958458902 +148222763 +3693925546 +4058413777 +4151484070 +3890489278 +3432519631 +266722861 +3468895161 +428378139 +1600206844 +3936888952 +4103100424 +3650132775 +3315185174 +260127671 +1975608357 +416719259 +1792153393 +1259041471 +1332730553 +541300111 +1644910940 +843601482 +1834165926 +1936969591 +885038259 +2621041169 +541157262 +225028448 +519397549 +1025414087 +2558776515 +4282220846 +3038750409 +1153865380 +577420596 +3073443845 +3551845354 +1730971376 +3154305075 +3428030193 +2204918000 +1915233793 +2659287403 +1863157623 +3014600873 +149901391 +3897658999 +941642478 +1378494323 +3499446793 +2129760150 +842915957 +931062318 +4242984508 +2639244852 +2027580658 +3362955878 +3335698313 +1507406159 +2712281935 +1962817041 +2195316310 +1171288067 +3038887124 +3166690773 +2636041332 +3772532099 +2907616538 +1875784085 +643404769 +1046756321 +3436823771 +1387571444 +761300907 +2724660944 +2686594858 +908010875 +2878024547 +1407180869 +2689678935 +574526324 +1555916961 +3005366358 +4207317917 +2346836453 +4077192312 +2112298250 +2435282545 +3201976620 +148399575 +3179195762 +2273303406 +2725772047 +1540364277 +3533979917 +1111434174 +3659897915 +3743819363 +2535922915 +1240192426 +3438311623 +727387054 +2553268584 +2826099494 +1580758397 +1840995720 +1091817873 +2974367752 +2026795900 +967502851 +784083290 +1781201487 +2735362831 +985125741 +881850294 +1752300752 +2182682301 +2092695568 +3703575222 +1073413097 +2418402375 +239600548 +3692360246 +2980955049 +3917513594 +3278974819 +2280964684 +1335719767 +3116838368 +2710645010 +1389350601 +1267910605 +2071413019 +1065827231 +3990642861 +1988836921 +2619408974 +347008440 +1178906119 +2732274355 +2024293927 +3190425616 +799178782 +3376055349 +3675237935 +733734085 +790652935 +2689741927 +642257746 +3122739454 +3434072167 +427537226 +1033670232 +1665449072 +1405795741 +2498612955 +2453061187 +2248088039 +2252863689 +1319945191 +2126341108 +2487011379 +2134054886 +3467066788 +3403160199 +2153324560 +1891356935 +1420335705 +1967161563 +119179838 +200459836 +2496111769 +780690135 +3814266233 +2579017409 +2882393692 +2532903437 +146465037 +3411210531 +2486522286 +1928812469 +3128921869 +3051317752 +1883793361 +1115800497 +1953433277 +738570621 +3052385780 +1588697712 +206768368 +1976033836 +1468136626 +3928555474 +528445315 +2121247226 +1655584184 +3249415289 +1815099766 +4249282043 +2467975508 +3630348332 +2023134996 +304453104 +804796502 +306346341 +2956257336 +3671427084 +272453733 +636182650 +395286328 +4156208602 +887837538 +2882877550 +3360676089 +103170751 +3476187367 +3967542417 +1062446392 +2735547855 +1706144317 +120367478 +2032732985 +3793979782 +1235059099 +114510815 +3536042876 +3480974053 +3549766309 +3061780958 +651819686 +1951754482 +68704921 +2117512530 +4044115467 +384467087 +1862323167 +1001829673 +888584137 +586377664 +3297766921 +3384730110 +3799132537 +2185481043 +2170140904 +2285801891 +3023714283 +2377703059 +1591927547 +3397333662 +3921250752 +4087768973 +3077425105 +1321727233 +2688835846 +61679875 +1798157285 +3909260680 +289153992 +3338595119 +1844703594 +1950970286 +1097904318 +3106920218 +4089397606 +1175484102 +4075468977 +2955205570 +1867495677 +3160823812 +1906402316 +1237890829 +24390745 +2144190278 +1416736241 +726794034 +1578241165 +120594920 +227968066 +848611305 +3684440078 +1620571811 +1283307013 +1464285667 +2970810865 +2925035417 +3378962992 +2268693073 +4014595296 +1556887234 +1056107217 +908509215 +1352289343 +2489230146 +1937383935 +1692332669 +3644140315 +3096305732 +607530485 +900132808 +3152176535 +493452401 +3071405491 +1829016615 +3772639900 +4178800624 +2336731081 +1192757206 +1284808945 +3414738828 +3507309724 +1704178409 +3021876869 +275018012 +3971259576 +3315432935 +3020928524 +2130657272 +2408029043 +3071455141 +3260916720 +1238488000 +3096002468 +177674259 +2735863934 +3416842520 +262362884 +1479573582 +2482367017 +3844489337 +3579552714 +531331993 +2592019831 +3303442733 +1285659179 +276351199 +2553921423 +4254416693 +4235621524 +2493017133 +2173036824 +1517412301 +3740441531 +3387672975 +3871233533 +2893984453 +4282653403 +669605093 +3102504325 +2214965753 +3547555361 +1254778019 +1811829809 +949663435 +2402521844 +1715143009 +1730843408 +2671677729 +3314264945 +1260458624 +3268904884 +1660431719 +3646078153 +1171601796 +2224609615 +3550475622 +2321498491 +826918925 +620276685 +2738374684 +1468138776 +1619595041 +1464213407 +1837482532 +739979674 +3798851365 +1910846710 +2783494460 +3500978742 +428824684 +3075008464 +1442964813 +2823294026 +948792938 +3034977912 +2793383897 +2910047699 +3798095939 +835183398 +3283142257 +3941542110 +2418670646 +1074207065 +1536642434 +194021006 +61981449 +281296196 +1686130660 +3715466488 +411538539 +1538076668 +1176451177 +2529566732 +313108045 +104466553 +2176018761 +107926549 +1378492980 +1170984216 +261290226 +1284429397 +947603353 +649695875 +942266352 +3419118451 +2492403717 +2749743890 +160728147 +2361399606 +2125888038 +455296937 +845263652 +174465973 +1234017800 +1321432320 +4266832494 +1629108357 +2675441550 +2379506206 +1894334269 +1216028965 +1748036431 +1176167725 +4152666404 +4065279347 +3810838865 +3522978520 +2332034620 +1826198270 +3778443012 +1849453283 +3551981013 +1659346119 +4105698186 +2882663989 +2864429091 +2463971033 +1187563978 +1942259106 +1001446270 +427068890 +819559857 +3943406000 +1637198932 +2283185646 +1527692143 +1982842453 +366250430 +2903157248 +3032152079 +540474849 +222181477 +155551923 +3917261205 +1717817580 +3883903834 +1266711892 +489309603 +757740141 +2566809733 +3738405725 +1752835110 +86737671 +3317505541 +2044012217 +2057345636 +1941128422 +2848158735 +148152098 +2379428003 +450040227 +2687786644 +1518321143 +3961743609 +2439533451 +1199215647 +2873204222 +2549673597 +4268295760 +1655191608 +1345531891 +1720302694 +754298977 +547072190 +4256897740 +1390775696 +919716682 +1354527683 +1661957149 +580204383 +1104911072 +2941624089 +3794686187 +3981940406 +2446149177 +1918981124 +4176822145 +4126863258 +3447948742 +411356433 +1830219076 +4196330833 +3069169743 +3834882482 +2634031462 +4167469251 +2006687966 +446302994 +2602616628 +3955815744 +345615324 +852385344 +1281921102 +651354444 +431713449 +3526127097 +428654054 +2588604137 +1176804536 +682126905 +79451667 +4206376189 +3722757387 +2766757703 +1832239507 +2708568329 +2408275494 +1061303601 +2762333882 +2157093838 +2084871488 +578891519 +3559803334 +2405340198 +1712666034 +4202915333 +1778565140 +2056795201 +3712745452 +1873435136 +2564697293 +1497661996 +1651691175 +2287013582 +1375986588 +3269206676 +2934496605 +1959335696 +3890972328 +2631040786 +4213540898 +1123526 +3710291108 +3714521461 +2516321962 +4015817636 +2953659268 +546870473 +35157516 +1317115887 +2576590919 +3069768180 +3664014203 +1537967839 +827734506 +3331846421 +1701677523 +1624439680 +3731818359 +4160654774 +819627636 +2733389515 +2959450445 +2115455082 +2089489207 +2314487495 +883998342 +3822153453 +256130494 +1429201942 +853081377 +1359548900 +2997086994 +3625083428 +639603461 +3327077813 +1011712237 +4106949805 +3738721812 +1332942453 +1682545478 +585705389 +2286805447 +2455082425 +483456302 +4159218117 +1265799043 +423409136 +1020639151 +2270718267 +2996577883 +30133665 +1080523377 +870650999 +813052370 +919483306 +4227430090 +1394654538 +3991411684 +885917442 +2532406314 +3691070130 +471384460 +2526587732 +4129388919 +3829514091 +353923880 +3591821946 +3944766701 +4209888911 +696293201 +771583967 +729729341 +1556125300 +344511441 +3848518077 +1246362159 +4160059119 +1269749442 +3652433317 +2570113089 +4091470022 +2120761531 +4055187549 +86445919 +3418185927 +4049745543 +643760810 +610415970 +1620719125 +961519350 +2308399434 +714363222 +2539591858 +2441622115 +3264439468 +2004630596 +44012329 +962421530 +159427067 +2619741753 +2870456227 +2735263193 +88690149 +808802577 +3895791055 +23421554 +4093011877 +3432646420 +3054895037 +1071787866 +455730138 +255992060 +1276417573 +3100882509 +1038024937 +2839555592 +655378824 +2704576581 +2123209192 +1041838118 +4258116460 +3648299117 +3664855140 +3702086441 +3871016128 +693916810 +1246179945 +1001457809 +768345406 +2046593644 +229420089 +793188594 +571685214 +4005839032 +737276034 +1603775092 +1355955217 +2304498775 +2592905770 +328273844 +3826273428 +3715816375 +2703112480 +42037841 +2819120801 +1838363193 +1835946911 +818587824 +1218189601 +2343269141 +4102278307 +87388052 +3427175345 +3500474260 +380893524 +3955472353 +443836203 +3066742129 +3095692390 +3948174608 +4074909665 +3356247683 +2631415352 +1668242463 +590882665 +1377331737 +687839528 +4004221326 +3177612329 +4044276508 +1822871759 +3268271842 +2525782224 +2442902479 +1602488068 +214645542 +675451485 +878853775 +3178532003 +3132201601 +3679673913 +192270933 +3941160986 +2132309213 +2895611996 +505683218 +2687148684 +2810345197 +544891610 +790950578 +1322742689 +488699247 +2921247313 +2557401554 +653765816 +363111865 +1111224711 +744158949 +191945893 +3481280394 +1234853781 +5034834 +1336471548 +2801764047 +2051263022 +3108554351 +556209370 +2250753874 +2416640089 +4123586379 +2621482221 +1194951628 +2194974432 +514011356 +2635953786 +3805744118 +436198278 +1346088444 +159832462 +1161661327 +2041454327 +50940874 +2433258657 +3618889846 +138380691 +4113638585 +294547739 +4132592056 +1608316736 +2827650332 +863759627 +3092032744 +724312943 +3326735026 +852303748 +3382316963 +3971815651 +1332138044 +2363723867 +2859501826 +2638337248 +3029541912 +1893946723 +3571683892 +339202083 +3711023076 +2625877258 +1854976730 +933177061 +3122076153 +2603750980 +2729921122 +4037756155 +3943405002 +1332087827 +4122772092 +1908912014 +3294695062 +2045937756 +1101123342 +1837849916 +1671787557 +4268133763 +2680405699 +851852191 +245861003 +2225934840 +276282347 +3369056641 +186014305 +3948666103 +2107202480 +160605671 +4124260152 +1081673319 +113165711 +189844463 +702113205 +1677502396 +3571501399 +3186883901 +1439836319 +693929926 +4016135200 +1048544529 +500940277 +1243611051 +166530982 +948517310 +3808825541 +3151647835 +2056697037 +1223744257 +2696766511 +3894618902 +298261241 +755739977 +4142768637 +2886019975 +2085877313 +3234128154 +2735843125 +1374947742 +2439224768 +769325088 +1472452414 +4012947543 +3199673745 +3750307555 +2021226496 +606652236 +1654530948 +3413643749 +539067185 +1595251978 +643889839 +3512618157 +1161216925 +2227749157 +1088714253 +1381201867 +276896601 +3659944895 +1004866958 +3462673144 +3020949438 +2644283637 +407057497 +2255527690 +1937475712 +2561280282 +2768745262 +3231677538 +2347737797 +2895695836 +1763865205 +3558301192 +3655912512 +1164645964 +832026897 +650354934 +738023214 +2730850501 +3038018017 +1666925741 +1398001964 +1122791645 +1183365344 +2299766879 +1151622492 +1404194043 +640204787 +2778458095 +3419188544 +3712657295 +403983769 +2195619591 +3178954781 +2624596698 +2937603555 +3418545188 +823892322 +1824594336 +624434618 +3604287698 +2365395973 +361844252 +956506564 +1456185765 +550821411 +2406641082 +723944293 +3379397896 +1972715576 +2668265852 +3893275887 +3980499483 +4273050607 +1106627184 +1970622123 +3141674187 +2970367544 +1679555963 +639782317 +681222619 +4248580881 +619245573 +1725296638 +3590901940 +751131644 +2332353712 +1064694426 +2662748511 +724759262 +2893552143 +403598619 +823452605 +1333560458 +4042807972 +3978671103 +2733302040 +4272658681 +1062072208 +3080493445 +286591255 +4211789465 +3758605687 +109616711 +2055515111 +1496869262 +2988147911 +320262909 +1550747666 +322187027 +3157314827 +3078526441 +881679706 +604533624 +1243210717 +1279621473 +3158207857 +2606430357 +4059406231 +4150652401 +3133902618 +911095967 +2046402753 +1017754454 +2357192974 +402309390 +1920107449 +438470775 +904557180 +1052581536 +1051992797 +1830682990 +2425481323 +1566478241 +4137832421 +942545707 +3147101195 +3134764259 +1809623613 +3943451706 +1059802951 +4115221613 +1197261304 +949010088 +2592384710 +2999414601 +2022299612 +3422368456 +2502244353 +2758659750 +1432653259 +1033505791 +1847538313 +1949782325 +3402904183 +3549712414 +2209795858 +2372114266 +2365051385 +1048086437 +3732705309 +3254615597 +7251743 +2901002300 +4123371450 +2457131727 +1943516283 +2159964564 +1450548701 +2562603535 +410800373 +815936907 +3842489888 +2366463240 +2391371770 +3211382451 +3816038264 +2881562721 +491812265 +4206510464 +4259501154 +891955609 +4258580613 +3548541235 +2830087063 +4113174998 +1081632035 +383559621 +897787203 +25414831 +431086276 +3673071212 +3076629404 +2436023212 +3433709155 +1413382441 +4199364315 +4182931060 +3623859977 +365590674 +3808496540 +2266104718 +2881231001 +2697123188 +1295743377 +74780360 +2420704961 +1122474641 +2208726402 +3552382019 +1951152727 +4100891943 +3292464599 +3037003850 +2828037812 +3868077493 +96575514 +2073476766 +2205287369 +179878744 +439282470 +533518348 +2790525737 +3785704594 +2019854506 +3617120681 +947529964 +1771853535 +1111704074 +1787865707 +2734494110 +3269435387 +1261366062 +365014305 +2231374882 +3966202924 +1562376000 +4233918131 +2017314725 +419663712 +1437476329 +1516013722 +1293920737 +2325595276 +2619358006 +3324881193 +3677720286 +1065837365 +1138613603 +743617797 +3138086884 +2209565628 +2839988552 +2972769717 +3331263991 +3248995178 +3570667487 +2186266075 +2710850189 +307316433 +457945400 +2767409363 +2613110897 +2790269499 +82176554 +3283053595 +3256663627 +2586463272 +1857103732 +1087785411 +2023932868 +2572360345 +364428931 +3919709547 +1324919032 +3263947105 +2957220038 +971145531 +912025279 +2787868748 +659648337 +4190368482 +3032958390 +3071348395 +2849342078 +454892596 +637069025 +2913223163 +725216588 +3932502912 +3951808089 +3500835786 +2489114591 +2623075813 +3033833061 +137917399 +2026700121 +2014478772 +677375760 +3006529210 +2399269550 +65804542 +2647966733 +569933445 +2173830992 +3956366857 +1314168419 +1999843512 +3182335237 +1303224641 +2035440609 +3945682512 +2625030999 +4246529974 +445843990 +8198449 +888730408 +2114690531 +3207314851 +1751766817 +1485568354 +1628779909 +2034806765 +282349137 +561124129 +1327169739 +2269008161 +122092741 +2811027098 +1788730495 +2924801249 +1538354500 +4189765745 +2821480338 +3279158273 +642819952 +112368117 +1578494787 +344034356 +2936357242 +3864839024 +3380678879 +634871649 +1142666525 +628390737 +1141424793 +765763989 +2826726181 +2621806924 +694582857 +1893550649 +1933076078 +3442106214 +1447695418 +3591533566 +3943576284 +3499259690 +4214055991 +115286095 +2520395884 +3109983115 +3996322209 +31026978 +2135750522 +178054523 +1641897040 +3873952949 +3113278458 +3990508134 +2668394565 +2219000759 +3882368681 +2917430324 +3726466546 +2106369348 +1333900900 +1336750748 +2979493097 +3805253549 +2102103081 +1395830415 +4263223852 +232993068 +4149326453 +4114911568 +840142979 +196716632 +2780430677 +22111305 +851610237 +4138767325 +3293482137 +2821355305 +2933024771 +1625702823 +1086987284 +2606194473 +2391546977 +3858052957 +1050684900 +1646225236 +3470943947 +3909253649 +2878138320 +2330839778 +2697832125 +4098527336 +370699065 +3428362127 +2995811473 +251291219 +2680714853 +1768278888 +1394154888 +735447760 +2061484489 +537767856 +1167420056 +3924214310 +3124407285 +1827394370 +307095210 +3943200274 +1879161169 +728554018 +1827770708 +1362897930 +1808097212 +3512153509 +3834764794 +1363143988 +1673408731 +1170564239 +3680755924 +297488542 +135686317 +2068173212 +4285378651 +3110874371 +3818443202 +851088443 +2427875415 +259256351 +3038001084 +14207041 +2780085191 +1127609769 +1704464752 +1192477560 +2638327284 +4154594737 +3792809899 +1232057727 +2576757559 +2328174768 +886034223 +2632371122 +904539496 +477915549 +682355128 +616239882 +456690517 +87297952 +3568918311 +956028819 +3378697691 +1064517300 +732128049 +2290650275 +1830252770 +3694949201 +1947960420 +627507 +2868422856 +2268265428 +2197522784 +1803956195 +966705863 +3481713186 +3953057202 +3341727663 +1014216277 +3946137141 +1474235184 +2313900424 +4213828863 +3036712376 +3483334803 +500101465 +3585765261 +1953547059 +4115017564 +1504601287 +1235524177 +2190711373 +349363682 +58474828 +76568506 +2775347963 +238593615 +2964565428 +2212814740 +2016803050 +3571421317 +2620199224 +427760785 +2917296023 +2057637068 +4272181832 +3841366014 +406732892 +3726728354 +1610226424 +1259129174 +981499560 +3714719207 +1411200861 +3740814925 +260628946 +2469229858 +2709167145 +3618885489 +502161725 +187375548 +824803770 +1483722002 +4212965296 +556559766 +4277022696 +1265249471 +3058299124 +11522025 +376856761 +653738304 +1640153730 +3948817570 +106859380 +2326649958 +1079418577 +257513973 +2073508997 +2502151551 +1494743737 +3143307008 +2324359584 +427949562 +4133979748 +86841259 +2149216359 +3956461321 +359116687 +3959102627 +3239422301 +3048173673 +2493648071 +550972959 +129846297 +3624437749 +2027304806 +4161859008 +1143949618 +1769747881 +1031982095 +2785341835 +90865931 +568311333 +2118266382 +919523412 +330289393 +461647237 +2032541083 +1111862287 +537858522 +1738876388 +2872917483 +4966733 +2120497033 +3035343671 +2837398086 +2070193165 +79975048 +3357071622 +4004352476 +3234428262 +1437119506 +3200821430 +2201226817 +534062494 +1062643343 +2566234904 +1117291602 +2064271265 +3956988108 +2400923202 +1730682318 +3130618301 +2879972445 +1303557224 +555110885 +3425481486 +2160751533 +57185378 +1490783683 +3417487160 +960828564 +3502965959 +2968266594 +3988007655 +3472455460 +1695381209 +1199686243 +1661634358 +687009676 +3525284697 +1010535776 +2990215493 +1578821965 +654638169 +1184346389 +831516016 +1044144161 +3295606139 +2823917711 +2277257375 +1747666566 +1965561985 +984016622 +1227847321 +3799984556 +1401055781 +4028859580 +3854983279 +3568613722 +740568593 +1336643291 +2536847094 +3057019600 +1753558496 +2189110940 +1856927700 +1078797340 +2039105901 +2098401331 +1065689101 +1129210032 +1165603961 +3312902950 +257645604 +3661604390 +2564247261 +1574849237 +1419457753 +979420444 +2713314482 +2599364676 +3919630525 +3395908717 +3388582837 +1547569302 +569400893 +3975452407 +652382147 +2948522323 +1571079540 +1430320174 +1237185075 +3324389388 +2140142695 +1696378110 +1033825761 +1584801858 +3548518286 +848535614 +422361537 +540283634 +4047421719 +3699651108 +1283262102 +2515700902 +1504813060 +1047628206 +3135716444 +354389004 +1719533358 +485749072 +3193394253 +2522148587 +814851187 +475188116 +3456143784 +784308641 +1454572136 +2206295561 +2582931286 +3582502706 +2081031986 +1353002028 +1954910564 +174887008 +1826938325 +3542686830 +3338905570 +3331980178 +1001487085 +3672297220 +693510382 +1085555291 +1179618513 +3388836609 +1583591624 +1298540050 +3071310489 +3251145565 +3585996475 +3747992368 +2403320267 +4159525382 +3366327417 +3948709626 +3495304735 +1440054019 +2567670212 +3474804187 +1920046304 +2778785887 +3623544253 +3086267699 +1466025989 +511192721 +4042403881 +1740996913 +2775692812 +243910278 +3932430417 +456028279 +669684702 +3103591881 +3972883927 +3979045037 +2029483153 +2541579542 +2463014173 +3199475108 +1221574448 +2293236063 +3297101820 +3419023831 +1966212922 +2895050039 +3375279992 +3847855233 +4215401336 +1038229631 +3088562976 +3158190815 +38627986 +3195840103 +1124721008 +2543807271 +1377957809 +3551053832 +1249493177 +861854950 +3145111742 +2187623294 +3113148841 +2481203011 +1920440890 +2052414526 +2538384065 +2614425226 +3907545073 +3278120243 +230499582 +2830525878 +3890171170 +1580142047 +1365753257 +586608421 +3521691348 +674682802 +78334441 +4131969635 +3781527431 +4197093247 +1001910330 +2899619297 +2061313288 +437512285 +1667502525 +3539914739 +1905295680 +2007738300 +2159919388 +2194204617 +1271756796 +2731974240 +279960852 +1346398873 +3894516232 +4020086717 +995538847 +2174817357 +2574300665 +1250390630 +2854055030 +1160380890 +4270934618 +3957450589 +1715291259 +3118062742 +942207907 +2944212361 +1818444132 +1793532962 +1868188463 +796725577 +1977113024 +1495535719 +2762654481 +1633775501 +3966963591 +3519334456 +3762808651 +1313870810 +2857862643 +4215528004 +1343869488 +2240622175 +3864816215 +471328752 +2961326125 +3929884868 +3602835188 +1475811002 +3376353819 +14551495 +555338804 +1402759037 +920212353 +2709854088 +2955161868 +3218209025 +3798210781 +1632987166 +2470334477 +1968737803 +1082016283 +973097546 +3904132793 +638317718 +2231273382 +3660955166 +1553244833 +2865860036 +3311351298 +373803340 +2444817473 +2560110605 +1606023378 +4053274272 +3141061426 +1114205549 +4190427725 +1141303323 +1617210200 +2187498758 +2234769138 +2045586289 +3917101340 +4223041177 +3071636693 +1916078496 +2728365386 +3073123341 +192222592 +1163044467 +1276609401 +2486231917 +2581498629 +3211092220 +1881582485 +1809120517 +1506327702 +663666776 +810748310 +747896229 +635697672 +2503388486 +4111357621 +2376584548 +3261067765 +2621572286 +2382682997 +2825703135 +2987928556 +4152146825 +4215519439 +2913417111 +702269456 +3469565028 +3538162315 +2583439491 +1993122706 +2358153527 +3109483807 +3273744846 +742047884 +4204709771 +2875190641 +2772695303 +3258941821 +773574164 +3507702345 +3773622811 +488450899 +1417205252 +3819846469 +1048890222 +3110229089 +1059121213 +3164168437 +1923096487 +2488111972 +2532621703 +545165541 +2280322163 +2527919609 +581535122 +1656243594 +3438825455 +3623024080 +3603759079 +553536063 +1360658972 +2266979897 +1842536836 +2441527400 +2584777872 +3889924797 +2454274321 +1909626278 +3502201176 +1011944564 +2005140742 +3056546718 +1532224040 +2705477577 +2722238027 +2797585035 +91277745 +1177985959 +3129439203 +3775913675 +3955581289 +3895104496 +644819948 +2839607495 +1591702848 +533975839 +2998801015 +3191910656 +2525129377 +892866140 +1289584669 +180637227 +2277496728 +1070744964 +4168527060 +3748376247 +455153379 +1669872953 +1807047211 +3822441596 +34602338 +3517383201 +2999137847 +844937650 +2274423993 +2536848332 +1288331786 +1473236006 +3677818765 +233522712 +3219744272 +3349049480 +973116022 +3022554976 +1029632706 +2603273293 +3250923407 +192367100 +1585989170 +3160237393 +2534899970 +3365821323 +1766930047 +2570594104 +1093120084 +4068185501 +4016853893 +930827465 +2763445361 +2020852400 +1219629210 +2849503366 +3786744098 +3669899282 +4250738127 +4106805442 +3266797034 +3572614198 +1908669965 +3559666220 +2201771320 +117239886 +2931278044 +3805096014 +130702233 +121682733 +4133232521 +2096192303 +1257617016 +2218406981 +3616780115 +3287362939 +329570115 +1483084483 +1807959366 +1573789133 +3674538420 +673047576 +892087890 +406118830 +216933075 +3726248076 +1128102871 +3065090837 +580152723 +139751156 +1843514301 +823147773 +1697619504 +103716126 +3840149569 +4056367216 +1053454658 +3842266633 +242187453 +3883127726 +2528169343 +90175313 +1047911116 +2261561727 +2837339686 +1514452447 +3931898976 +2632537105 +3516925736 +3600746384 +1518675507 +3388305056 +4167955691 +4241530023 +2089352669 +4174072305 +1036648898 +1705172752 +3890037526 +1299221389 +1078057559 +561292002 +2725230489 +3670499752 +3157132692 +1198023555 +1948398153 +440330376 +1813304857 +1914641801 +2428939257 +509225851 +2984335490 +1845437197 +2982832673 +4258948911 +1325361040 +2334043480 +2142212424 +2701631692 +2351162315 +1225483177 +1212968412 +1164502127 +2061391997 +3104379087 +2032239633 +1523317519 +3806945524 +1288332366 +3834704085 +750743289 +680155249 +2826978674 +2900180608 +1516232726 +21608327 +2674949571 +807102749 +4264323409 +2043896680 +4285407354 +2885086253 +2233151700 +3117493252 +2829901993 +364402583 +2295291566 +3843326471 +439518148 +740460441 +4220095096 +3292751417 +803127036 +2390926221 +3509791318 +1150060511 +1372861703 +2227013762 +1252127808 +3912401516 +1861510608 +2674727706 +751933186 +1727348366 +3279690800 +2663171835 +2114048065 +1110463857 +880388812 +316017955 +4096080188 +2883124903 +1764641573 +667166311 +127970148 +2583033758 +890669286 +1437813933 +4217145002 +3121764298 +1735005006 +1667670075 +1621647327 +3082681277 +2730597185 +4108564300 +2917409655 +4144355895 +1083493848 +869295626 +1650780896 +2460991285 +3783207791 +1380457101 +1722961877 +1490346991 +3475913011 +954553833 +1934172245 +1116881440 +2274856860 +3613549791 +3981375862 +3739845791 +4230352887 +3198615882 +2517971389 +1023673523 +4228696435 +2834320420 +199002503 +3132406078 +737846556 +2532001086 +742367403 +3061344349 +2783838502 +1036252826 +668577834 +201619975 +3975640730 +4251836727 +2535319495 +1123597689 +1185558880 +1066680294 +1648789517 +630483075 +2677013069 +1679082605 +1758638582 +1201702725 +1630583948 +3160143025 +3679244768 +4105970769 +2405073664 +4219078030 +4170606146 +560466872 +4164661322 +2481183022 +1855014004 +2382914325 +2580139681 +2938404297 +341224329 +998147048 +2728601245 +3863237289 +1040290322 +2463953671 +2301117105 +279264763 +905349829 +2483597707 +671313970 +2199289224 +3537551704 +3290408152 +1832507197 +2135893976 +3526258178 +82165406 +4228721514 +29122496 +3100417180 +1437811140 +3408207732 +3295197549 +1939906747 +3558321612 +771646127 +2357260784 +3617640287 +2931313177 +2795494888 +1475409812 +2270297037 +373238097 +145104198 +1203449238 +3147945685 +1287422970 +1708864971 +3810557898 +3824874262 +358485834 +484627583 +1817136936 +2320518268 +2353105598 +2435112714 +1898580108 +3110158713 +3070727809 +1741604120 +3148335737 +632635807 +3716044032 +1355092873 +2209626681 +3343351259 +3309567489 +1794624322 +2153376046 +1292275448 +2005876782 +2306320691 +2784073952 +150560755 +1746679278 +1415520119 +4232385111 +1234410751 +1027994325 +3193852994 +3512998795 +2899607158 +573703198 +4270532226 +1478169991 +3369978151 +3064172272 +1354241469 +468456273 +3722328746 +1349187311 +1169880966 +43411398 +541882703 +504248883 +2776787366 +637890010 +3238985962 +3254113452 +777408357 +3936225732 +2149491253 +613286409 +593490162 +3250367716 +645078780 +3665023976 +2671292421 +4139920409 +1010386665 +1545640421 +240768646 +2147360438 +314118952 +2939335800 +231293007 +2451017202 +743737993 +2475695906 +3105384417 +3000175106 +793378528 +2334604573 +2085445033 +99483760 +3514360729 +3194767500 +3161559887 +209329820 +919948349 +1848864455 +3400785438 +405668389 +226804376 +3000187426 +2891504067 +3175465444 +3537012738 +2676856186 +760847874 +1712267558 +1746315012 +4005464293 +4293802191 +3540962696 +1180422881 +3657904196 +3594133682 +3953496676 +1669999873 +77369717 +2107719787 +3907527567 +4047382516 +2920893943 +1938849395 +1531105812 +2949210071 +3010388930 +1941473765 +1172464846 +321667517 +1009684340 +2947010391 +3828451376 +1914358863 +4202913050 +552743572 +2680534739 +806125083 +3638245651 +3323754880 +2274296243 +4002194679 +1987003484 +1787712180 +4204018035 +2268578178 +3073670346 +1883931273 +1002385416 +3982049098 +1127540999 +717472303 +1032332801 +198454634 +1837969909 +2149498356 +3857245402 +3673960861 +3855257644 +242163199 +62290772 +2239708349 +3270896179 +1671631658 +2535761498 +1314902854 +3985978870 +852497043 +1754923538 +3546575893 +2411653554 +3540642652 +2915407795 +1432771915 +984882135 +979698464 +3665711494 +3676632206 +1842527588 +391349251 +3794716484 +298482301 +2417502643 +560803584 +3792650301 +2685077004 +2377811223 +3237932437 +1495574946 +3699540283 +2438149291 +2424706863 +3638658353 +1824397128 +3312042895 +3176731469 +1863565847 +1182137677 +3125816748 +1082122131 +3184720564 +1702942447 +1736721248 +1786047117 +811102657 +45272591 +4242097113 +3147986842 +2810655042 +1350521188 +2805899446 +610616862 +2269842159 +3139143315 +3130431806 +2197970925 +1259326172 +3512272612 +1072708648 +3294408806 +3539201476 +1165384573 +369571060 +2818198859 +1612857273 +3886959570 +777832482 +589063105 +4247125072 +3198088565 +1139303397 +1765880470 +3782887815 +2527708144 +3736260674 +3962306046 +3795917941 +3802264824 +2248122671 +3911880659 +2575883393 +3676866659 +1942751699 +2515053386 +3190779923 +2293493190 +1726695284 +1848189624 +3981844492 +3727045854 +3573786379 +1205708913 +1352515479 +2484621019 +1701943601 +3042628333 +3756913890 +3754244896 +1748970673 +2197594500 +4016865674 +30648917 +4178336172 +814383984 +4021658367 +3244807855 +821048037 +2429115881 +1630677 +2883694327 +1576837560 +3312570387 +2232918640 +3202515940 +2852776265 +3243860354 +2960618591 +1272212522 +386149039 +1696272380 +737170071 +3077642563 +3153935123 +2424612444 +3426471013 +3874152499 +2529563586 +1908205192 +1895792526 +3968983807 +4181675842 +3173318695 +3891222097 +3511780041 +3774885167 +1231000516 +268867381 +3430843525 +1607114329 +1152411842 +78872116 +1615172996 +568102712 +3852036678 +2906091875 +2487751274 +1458134676 +921788241 +893691332 +4093462991 +2629300973 +2255251926 +1736095068 +4049894137 +3549415321 +227474446 +3723953367 +554121293 +2768425672 +2941802615 +754005926 +3208292543 +820661713 +1638636594 +2877326654 +3773513951 +3804856539 +3974142790 +97437780 +3297479383 +4124576685 +1153254233 +2783873585 +1844735116 +1245509183 +2323235929 +106141933 +2222765144 +1635864909 +3916062122 +3336139553 +2673725081 +3849900294 +4243935165 +1233105603 +601968535 +3300172697 +3655340651 +1120988159 +2379107162 +1217249828 +1904413614 +787848120 +2181219751 +1335881685 +1406108637 +1292851273 +3524091113 +3908648789 +912628047 +3656817000 +421616813 +1587683698 +226606498 +1303162415 +2336387639 +414746058 +3906109461 +2873763573 +3220461520 +3361278613 +1341822081 +2037590094 +1158979678 +3788174236 +1677812733 +1793275460 +11513390 +2255597121 +3599462653 +2667101606 +3948010174 +897149933 +2747444033 +1439579621 +1419865035 +550393454 +3653617360 +277627245 +1166550819 +1973491000 +1202322695 +142794836 +1071364915 +1948505279 +2555012474 +3263116841 +3475325755 +31485500 +4067848109 +2347710852 +3261656895 +3030749337 +3767578525 +676730830 +2286086919 +484219005 +756931786 +2199532277 +2801465280 +2730220613 +1790285377 +3659068847 +2996635398 +2403867722 +522435194 +2316722272 +2101553477 +1965151143 +2228829069 +157728167 +2755788580 +2653394299 +1567850574 +2263727674 +795961373 +1320201478 +830340576 +2358857202 +2820085529 +1215440120 +2706308359 +2997217038 +1342588616 +414358041 +1176209934 +2762091374 +664750965 +1571365059 +851968097 +3840137192 +2220717735 +844829939 +2510032654 +1523891002 +1458199703 +3703065183 +3410406664 +3768489927 +2573454198 +4063668688 +1651207092 +1823567233 +1947583429 +2783918849 +458104066 +1459927173 +2245957955 +3264630060 +1487407047 +1506087954 +2110635965 +4103080592 +1869932125 +3575090973 +799989423 +3698547977 +832528613 +2867171463 +888021838 +721429830 +2054881707 +3502563533 +2095968609 +749406934 +1721408477 +2821041966 +115970313 +107143994 +767875364 +2658898470 +3459815862 +642742119 +1465686492 +3107415597 +3760711885 +3255644132 +3005079269 +2815874886 +1435646202 +482021522 +1881561319 +192572615 +3642845822 +3829667776 +1745087220 +4048912059 +1124604254 +1842583491 +1001791989 +826768309 +3466039674 +1464129994 +527375475 +901055550 +1149649866 +2321401144 +3755048837 +3462129823 +4069525988 +2106685820 +1545334581 +535464594 +3308539909 +722564964 +614722912 +3680203555 +3707706706 +435304012 +2413600856 +368431186 +3512204806 +1886559157 +2432899868 +563322935 +3075115590 +183384060 +426572827 +803818859 +3039329339 +3504330494 +2000780022 +2789655050 +40260938 +1802440166 +2953065887 +810937877 +1219815957 +729425635 +4214054197 +250849959 +3332845357 +241647959 +990067371 +844342662 +2325057594 +646551864 +2754321913 +1350646705 +3848953796 +3255756824 +2293588539 +1315602968 +4293362602 +1010821015 +1413511860 +3342927606 +4245149978 +177973272 +3716087031 +646732513 +3134659418 +3731750657 +110239033 +1895046372 +3343268524 +322461707 +2909156252 +3943185415 +438966344 +454621581 +360318118 +2117814934 +3793241905 +1354768585 +1335328350 +362173598 +2753064895 +3896534733 +354716536 +2434220261 +1014408654 +2481419199 +1931437026 +1650384808 +3256944447 +2263577200 +2640421592 +2877764687 +3167973437 +379622190 +1644056211 +557090343 +2389744095 +330584955 +1392005969 +1775180708 +1518169383 +3909400964 +1038181507 +1179345120 +827866398 +2541914063 +1804567473 +3077949744 +3317711383 +2795913579 +292052429 +3276851815 +2099733707 +3479892307 +2354108868 +2936575537 +3263296872 +3839119323 +3542097937 +3357084214 +2998219139 +4288311723 +2976737709 +3672286984 +1888838763 +2611686645 +2018700648 +1312750005 +985349720 +1021167204 +2444080756 +3817670201 +160452112 +3825566107 +996298136 +1064492627 +2744516097 +492942930 +1233879253 +274534957 +4018317915 +3992163477 +2674868744 +60260087 +1471234432 +1753065244 +1712371127 +3944049981 +2202160274 +93148526 +2991262027 +2537150703 +3939311388 +2547416547 +3400901005 +1837952134 +1475361329 +276760840 +2834311945 +4273971852 +2963896838 +1032781578 +2679477920 +1631961839 +1774754839 +2298558375 +3711001931 +2704592232 +1968149586 +933945870 +2410503612 +642742352 +842872998 +1081593216 +359616533 +2985353885 +4119707080 +3102159912 +3538303479 +2027335645 +3705801980 +3589776716 +1736637618 +1508759852 +3964638258 +760173274 +1819862992 +428117135 +4009334080 +1314275854 +433755871 +771729011 +953467825 +320921020 +461122149 +3152728836 +1732278072 +1424297115 +2121765153 +3845517433 +655658050 +1922445038 +1741818379 +658772038 +2484964372 +3062772230 +2959213709 +863831380 +2674064850 +2739100444 +497238521 +647325075 +1507128668 +2163397022 +155514468 +39998512 +4241888673 +2314420490 +3204845808 +3234320347 +656988874 +4239379393 +2327513971 +1506864761 +1087226519 +2816236003 +1430208384 +2830207360 +2623168185 +2739750532 +3309914686 +3031190171 +2121738596 +3723928359 +3580703826 +2061078820 +1869837261 +3107333026 +3866569471 +2145977940 +3830459788 +749702072 +1999419607 +1976157905 +3350382542 +2218094216 +3696025040 +268624846 +3345496717 +1427276974 +3678534722 +50161221 +4073974376 +1095145658 +3511786899 +1737413872 +3825719949 +2641594474 +4232536063 +1826546834 +1308612763 +3428528776 +1421794699 +2622003254 +1929247528 +402163804 +1428596032 +3421094313 +2537226306 +300616022 +4092375773 +1030019295 +2402643031 +3574662640 +1009559920 +2386636536 +1248345367 +2830937543 +1432172777 +4119938779 +629372488 +2615090427 +3167546757 +2009394699 +1033623051 +2126048518 +2432148759 +414459683 +2311344848 +321615538 +2614034375 +2265803041 +821049197 +2495833769 +4027737508 +3357052485 +1929438975 +84042293 +2012711441 +3757965808 +1285542084 +2179749595 +3399873284 +1041964885 +1072688326 +1471301955 +3661757383 +3673517948 +1469551272 +111814458 +1193322423 +4294129911 +1722053043 +3389456910 +3034623242 +313685491 +3498835391 +2725795163 +792852118 +1165990085 +477953420 +969934732 +978126462 +2872351117 +650934675 +1103907536 +475777613 +1505581549 +497158132 +3590869676 +4235372960 +2557725244 +2338373128 +945347843 +3930977220 +41070193 +439000825 +3874657293 +2524530374 +1772001048 +3039426648 +1362710736 +815839122 +1435126051 +2971989262 +928184841 +2052590414 +1069888576 +3845273864 +1697527880 +3007747575 +2829980650 +3678147787 +747439057 +2150784953 +1864013843 +3139457259 +3626109310 +1648704635 +902497634 +131052180 +19538588 +4066790377 +1975612807 +310624641 +3771810310 +140254235 +3430576182 +1195291631 +783677963 +1322455698 +452551357 +4143456547 +2969205842 +3086432128 +2231505721 +3429192351 +1405783623 +3055309397 +1076705841 +2355568530 +4029609084 +4199284192 +1846012869 +2913978022 +2674068331 +4173563046 +3394945449 +3994866650 +4050555568 +1478360964 +686562872 +3382425147 +2796264598 +3855328401 +3180659750 +2489087350 +649216031 +1765932086 +2568550456 +1896304672 +469604984 +2938620288 +951642020 +2687931526 +3308188406 +632853436 +622722437 +932661297 +3136340365 +3875505837 +4177334263 +1477319509 +3537839986 +4127841284 +14703365 +1780700061 +2869269986 +4249813649 +2346768584 +1497843649 +1760139418 +2671399241 +1217296879 +2889879227 +1632548423 +205192667 +1612556576 +3636769341 +3159255368 +1036683124 +1045653521 +1466630807 +3966436154 +2559333245 +2967067738 +2715751022 +2153907312 +4188459978 +3874760149 +1069885184 +2467805962 +2459969269 +1421737635 +2891280023 +1522991069 +1984680560 +3860693213 +2516797564 +3641682582 +2716837137 +1604891797 +4131627134 +3501277906 +4234390954 +86650570 +2550528758 +1442962772 +748952443 +4073879385 +1946403965 +3755905514 +345903119 +4059069503 +1012504148 +3733105834 +1689107990 +889997706 +503173829 +1569409817 +2107544919 +2582998581 +1008536342 +1045692649 +3346797164 +3537310219 +3535546479 +323203622 +3364306637 +1221241982 +3842498086 +108490471 +336356236 +851760096 +4188074570 +1225538520 +556910391 +138588392 +2346397872 +3841745359 +4123797156 +2362076708 +906732144 +936777559 +2894361693 +192754320 +1711268461 +1307154606 +2168618277 +994638931 +802805192 +1296205379 +214412975 +1227517035 +1135502033 +107252367 +1451578797 +4184772990 +2053665319 +2075940582 +170040113 +2418063894 +3986874895 +4016588945 +4102306616 +1377065531 +3165388235 +1798950222 +1369764025 +1373427611 +1208744820 +3616050928 +4258307005 +2073006940 +1906344534 +3069371985 +2473476849 +1566493255 +2928485521 +4168363623 +1522903800 +569908344 +1394418387 +3306445201 +2764912099 +1198849298 +2591086437 +1229294953 +3593237304 +3158068266 +545060772 +3630110382 +4046647412 +684687430 +3210415432 +3667391863 +2809327761 +319310372 +2255820478 +4019094602 +1434913739 +176726805 +3742896851 +1209122351 +423482621 +2283621941 +1697214908 +3982098841 +3119631351 +1214760809 +3670223782 +3572267424 +3960534795 +1988839256 +1385931971 +2282704582 +2374358825 +3065639610 +432131062 +3811823590 +3128266903 +2580982438 +2729361015 +375465320 +2555715066 +1137356754 +686570593 +3897256818 +2622951346 +2632233258 +128690079 +4203391975 +2146405201 +1548107179 +2729830230 +3354459722 +2193794789 +982807096 +3667061550 +1864245005 +2790608796 +3079972515 +652632964 +3593000533 +2577500895 +3087171535 +3166555356 +1958028182 +2434123269 +989337448 +291591490 +671807319 +2675566760 +3480770367 +3813308525 +2308083457 +648604816 +2698830246 +225707511 +96980645 +3456204247 +1483386727 +3074735899 +2602970674 +1154362357 +2765066180 +379652979 +3734491417 +268634966 +162117467 +782125888 +127885344 +1938597353 +4081886656 +1704433350 +1930452096 +2307910644 +1260456313 +234352000 +2709210556 +249364111 +3894968516 +2524918380 +3428335561 +2096546394 +2420689378 +886380180 +1392937966 +837642190 +1913611157 +1842634191 +972866535 +1174752698 +1618834792 +1783188248 +1186876694 +2656066126 +1105658971 +456654574 +3242906387 +1771708709 +3196415747 +3442840467 +1399912378 +905721945 +2771280787 +2672431696 +73573641 +4076068229 +1577051681 +940525325 +3442145465 +2056010480 +2995680464 +2308226944 +3414431549 +350983020 +380717290 +1896814877 +4203320568 +2140176585 +1093356680 +2317777436 +4217480917 +2926940732 +1131371703 +2543577757 +3312084486 +4026135506 +3181297767 +1400838689 +4199780720 +2127605342 +190581734 +3367983425 +2520457529 +827112341 +3311442840 +3647325222 +3086339083 +2526101688 +3544280103 +43098543 +1062164878 +1299274590 +346684094 +3620422820 +2427990251 +2058925026 +1831738821 +2160068965 +259341914 +2851651099 +3967241974 +2859814399 +4287416308 +3045031609 +796193656 +1521709496 +2203498461 +3038900931 +1495027375 +4288107146 +60168310 +4150045696 +1544410816 +527940897 +1697578619 +3869568837 +1096179468 +1417666233 +1620656711 +3193924938 +3435315846 +3178075257 +1357013790 +1236597904 +1019090016 +3650314098 +1994560435 +1178550642 +3897822831 +2081107576 +2668258198 +2723384316 +3410787297 +2471812090 +2208256286 +1188411410 +2958541194 +2250672850 +2729583582 +4271347217 +3357053193 +256251708 +1380689704 +2341841341 +2457891776 +484294031 +2891033717 +1764612950 +655951011 +411593760 +996949864 +199452963 +2379941764 +566099460 +2904287949 +180849287 +2786050480 +3949342853 +1947289715 +1162436939 +2594822735 +409153181 +2522048043 +1881499536 +3665783612 +1737304298 +2448528685 +4021116354 +2155714296 +3927005866 +2916813710 +641039166 +857947414 +3024613418 +547768614 +1630265725 +1053090128 +1536291133 +2948248263 +4544826 +480337307 +1823910283 +1436396079 +217151838 +2121472296 +514837070 +2531584073 +4127487337 +3920452823 +1321403993 +2623122114 +3699773365 +3583787828 +1194683458 +977468293 +1866683686 +723288596 +1076232422 +1928452230 +1738877256 +1620628753 +1611163489 +1659260626 +2916449807 +9607824 +1423322338 +3742439235 +619101443 +1381116109 +2402661641 +3291662392 +2262992977 +112522387 +1016552684 +2687041852 +16590652 +2479017913 +1698009570 +543003626 +3206932020 +2362965247 +197064949 +2683077597 +2843268821 +966670814 +3794566136 +2550237309 +3050642072 +3018017116 +1233394953 +85857325 +3503558327 +1124696296 +1425364397 +3129668566 +445835523 +634736838 +3705742433 +2258483110 +2813719074 +2746139666 +2746176509 +1236691129 +690529152 +2651081556 +3986923223 +2901033691 +246402282 +3293496782 +2533979990 +1002994705 +2760990227 +1566386166 +2159026112 +2089336265 +1220646875 +971187813 +3806949624 +146856580 +2714506187 +1619115712 +704303694 +4129845994 +4067516017 +1656597150 +235952856 +450828891 +909393563 +4190593805 +2975093709 +4029669235 +935397164 +3020319922 +2682221411 +2655730248 +4191665392 +3155385789 +144024820 +2680222599 +1861701557 +993545297 +3433606395 +1279384155 +3439500931 +2796860889 +4113059215 +3477854778 +1400148242 +1716607618 +1517382925 +1255787279 +682998979 +3190693246 +925873818 +851640528 +3779948754 +550897061 +2592785710 +3524580474 +2757152653 +3251452261 +2044590017 +1277277575 +2389524713 +3346744905 +384309164 +1807042051 +2052941519 +814108979 +2489360199 +3693513898 +4008360493 +983475868 +2283863441 +4119853686 +4091468853 +1785727230 +3733867029 +4215646218 +3591826185 +949754527 +3040695745 +3317046560 +1040226994 +420435368 +3046239126 +3605111368 +585997752 +2367624150 +1063432639 +506371613 +3537832756 +4109431542 +3045185865 +2494519092 +333807286 +2021397217 +1048494684 +3536829388 +5925694 +4001805999 +2657099112 +2391973310 +1220198782 +187854061 +1809644595 +4256039763 +3521929975 +3099979282 +3123954121 +1362950112 +4028018381 +756356850 +3228431838 +3589514660 +441226538 +3872128730 +2416574708 +1798533263 +1919924008 +3914669025 +2514913950 +2275205238 +797402889 +4207995118 +326466310 +2528164685 +2657206680 +1301116937 +516401801 +3120409631 +1439123768 +2446200769 +1202412782 +2532719467 +4078760919 +3030418481 +4209133810 +1525724471 +66929599 +2015272900 +3039420031 +2483306352 +4163510888 +533565591 +1574786985 +44175917 +488165013 +2113986102 +2533711108 +3652224958 +3704307714 +2534601485 +2185303970 +3833779119 +2052939920 +3096064009 +1090978723 +3491773841 +3651980967 +3220865993 +1843923513 +2601736268 +3331580048 +994602956 +819692871 +1941912763 +867949714 +1554943970 +2598552386 +1784919730 +2574113993 +3864496522 +3493553794 +358627478 +2620106464 +2280057081 +3431019389 +8681985 +1075138026 +3716336177 +1626816162 +2086710847 +3711073953 +2048728761 +2262766454 +983687106 +57843311 +156212852 +2788450450 +585411433 +3306924119 +4000948681 +4160734368 +3185371862 +619438071 +1091996534 +909994702 +1941284518 +4040651466 +4275502885 +1421634123 +2709291097 +3979033949 +1453545950 +2078133916 +2421700549 +2983592477 +912240990 +32501539 +1919323061 +2430823579 +1583494737 +456395793 +1112894738 +4073066779 +1317674801 +848631027 +81163773 +201493910 +2743921984 +47644241 +415794744 +3895019014 +655125800 +1104117392 +4047321166 +1691817026 +1256060507 +2057841357 +182195390 +2145453882 +2376399530 +3799121114 +1687349411 +4239527539 +312702550 +3699924345 +980640622 +3455654763 +362355377 +2639366037 +3867751773 +2690670739 +3352077513 +1021525852 +4010280386 +2699635849 +2016225971 +734476414 +4119586636 +461617616 +2662184298 +875960735 +98116498 +4260837713 +2896406263 +1412127820 +592731846 +74205883 +4216389857 +3684945793 +293881971 +3797147805 +4098220832 +3543167619 +422337481 +860410884 +1000806237 +3667146701 +2688478547 +2149318143 +1256478717 +1765437153 +2853032876 +553743688 +2263713523 +2797882505 +1611784785 +4008107453 +3357908480 +2066366343 +3666395546 +3003557890 +3419181997 +627263719 +3251928923 +2914460490 +1838044466 +1116220002 +3141537749 +268606457 +1378182521 +2301708546 +2692270655 +1112358384 +3288637192 +287284081 +418175848 +2783272652 +1832994196 +4019155722 +3447520291 +3725411851 +185961690 +1616723639 +2281390114 +24723624 +202332214 +3487628343 +3896666185 +2414645761 +2559902909 +898800082 +1731131451 +1309131274 +2796908053 +135301914 +4201114689 +4202423305 +3014286823 +800458814 +2457426475 +1074075292 +375662802 +3254488826 +3206371271 +591814155 +3915941409 +166632850 +4211442599 +1688025836 +3118913086 +2832167515 +3317167602 +2797704316 +2201511188 +2761599312 +973935537 +2539446465 +1540421784 +2961358757 +3926128478 +3720311229 +1110323772 +1701005300 +2288746317 +51754297 +634794087 +3836834840 +257438877 +468247098 +2140849186 +591376344 +152410514 +2563294784 +3187361892 +681216511 +3789138972 +470364536 +3785126022 +1809489669 +1740557599 +88675917 +3483745176 +723379522 +3500073841 +3901622860 +1626328462 +1066909070 +1276380429 +245734004 +522623178 +3976666732 +3611578357 +4144186790 +3863106468 +3679250388 +1419673021 +2523788070 +1361838109 +3763303753 +1533853442 +1916240136 +657136291 +1572562483 +75177333 +3314855337 +3687198868 +756423119 +979072315 +3062681149 +2660208801 +2396764954 +1616591993 +1862900712 +1798792955 +2563429484 +691009202 +2690536081 +2605519353 +1451829335 +1337755668 +4122939591 +423600858 +2368200938 +1770159874 +630655247 +2919806484 +1686323224 +3764830808 +3666452744 +3754766404 +2368679209 +2381190276 +3244441465 +293822737 +1148866304 +3169843732 +72898389 +1873971794 +260318628 +4186972197 +4143384819 +539963134 +3802555726 +3238273819 +1230088268 +272362039 +3068300620 +1453458732 +4180178797 +64540786 +3007517937 +2905918988 +1589032690 +1779490414 +1053176264 +3634412787 +2852197021 +4252339805 +1974706770 +173750364 +442094662 +1787112918 +1554414530 +3987022170 +2316005475 +1001713270 +2351059849 +3128924877 +3353757427 +2360637748 +2952423703 +513292762 +2231010615 +1944671525 +4090007580 +2486535858 +974107844 +1354115708 +2222288417 +2346483033 +1508234101 +557036436 +2877530492 +2809062250 +4141665649 +1246119530 +2619957350 +2693893332 +3564235791 +4115443541 +404342050 +693464453 +1769572708 +728437813 +585807213 +4110041715 +1573959724 +575205405 +3595140224 +3521035952 +1408794797 +1733675737 +1822501973 +2770382496 +4109408653 +960674086 +72933496 +280970587 +1066333672 +709471984 +1496904716 +1748639696 +4293714565 +1038612537 +1446748786 +1274966880 +1149113484 +2142501232 +3610667607 +202256502 +2963987093 +499228278 +1268635386 +2617768678 +3327973261 +1268937836 +4290463523 +1954777581 +4083562623 +3842190942 +532863772 +4050091422 +377022836 +2927281276 +695676359 +3259924869 +4000308167 +3134350526 +1944471538 +1573382886 +342634845 +2809585505 +572027065 +2036890627 +1279988514 +1732192917 +1398390554 +988172833 +2071762561 +3720778444 +1004642434 +4274768958 +1921826994 +3884146192 +3213320865 +4254172836 +2852170291 +1689348646 +634185703 +2864233247 +3666616638 +1955965287 +3647438155 +1235538333 +1298366500 +4057864 +599332391 +2695947983 +2543248388 +3691810639 +2458923978 +3150501918 +1717061788 +4048224861 +2328195480 +2534436250 +1549205792 +4010004281 +1497055831 +1008640225 +2866438780 +165089977 +1137128194 +3731172953 +3231695590 +3184401575 +1359377703 +2244328339 +1302197120 +3259820326 +2636049985 +1489007233 +4220317654 +3686252922 +3356397961 +1947919652 +1238954762 +4182275442 +4263806246 +2982927003 +4210689153 +1810767444 +122020046 +4172832613 +206741283 +4260511768 +3577150024 +166581813 +1219377852 +1829779835 +4263240209 +4069026901 +4233581059 +3060594888 +429656485 +3681931268 +3894652311 +3546080434 +4268732684 +1190665490 +1165952672 +3919735250 +3550581189 +768384218 +2082176439 +3673914692 +1732789241 +869979440 +1968958465 +2643608487 +2577804135 +1534059921 +4017664130 +1079152925 +960236142 +2225597659 +798114930 +1839760720 +971003057 +2788920785 +395697651 +2440244884 +3082714497 +2779571075 +3268858467 +2532290032 +301154006 +4175568237 +1241102357 +775563276 +1490174146 +2702156777 +3653082642 +831274288 +105980315 +345881168 +26235453 +2564688774 +3751988942 +3416802831 +2486450451 +102682152 +2856455936 +288831755 +2322664205 +622945223 +654303825 +1531064776 +3988351586 +1121695785 +3479880689 +1946053934 +1749303636 +1943850349 +1427293593 +3081375949 +1587870746 +3102073336 +1786034024 +714693431 +1172534455 +479302607 +1483021974 +1699228912 +172505982 +2886039316 +4072154283 +758399873 +3205946373 +2512439691 +2405715873 +2820064598 +162133001 +3739900635 +2645851237 +1649313846 +2510058622 +2328652997 +1488088457 +3369703476 +3494767680 +3381476904 +4055302653 +1604234824 +2655233587 +522086614 +4036375811 +29402942 +1737194505 +1543069873 +932465208 +82375551 +2931286844 +4150201357 +1696333980 +3892714892 +1246739162 +1191378500 +2886582209 +3730095293 +4152307202 +2891250669 +1111780501 +681123710 +2122885843 +2702662468 +3066329673 +1790305884 +39801420 +3535277523 +1401872800 +720450550 +2541254183 +3118309828 +2737702438 +2678971228 +3073480779 +695233935 +225536466 +3242034192 +3348531610 +2160931698 +1345377208 +2422668467 +341814941 +285754034 +2058724763 +4207222214 +659540072 +3826032203 +1708910605 +3875108972 +1881686668 +1824463384 +1643022017 +186199390 +1446862923 +731133117 +1725762681 +367521914 +495998514 +1150820911 +4080466267 +1816093426 +389718925 +3775236958 +442252791 +840520303 +2843344613 +4222843729 +3366449401 +2142402737 +2240895204 +250610674 +2130563415 +2899313971 +2693238329 +663575081 +3098514941 +388418518 +2328306820 +1471835105 +3044599854 +377714408 +880987740 +2703334856 +3646918425 +4196054536 +1049612092 +867486951 +530868554 +3174854197 +2389700125 +455242512 +3662454679 +2691007714 +2100192620 +797302076 +1445609229 +1527074721 +3531527925 +2921108405 +597487302 +1061767068 +3555471078 +2094703631 +1936268646 +1645611122 +1435652967 +1384130335 +4066478464 +3467504269 +2875542555 +19650294 +3289781908 +3306026504 +1936990085 +2746195468 +4103362556 +4187925416 +91282968 +2232225910 +2218205635 +2602675329 +3880613183 +3733526634 +4015464775 +2940103964 +3633449805 +2222100003 +1310934219 +3385403625 +770480866 +2816772122 +2119019982 +1160922696 +1429347785 +1513635899 +1024866089 +147068340 +3742431667 +2993386300 +2652673274 +2771105597 +3760404279 +2323505008 +2113703013 +3781841393 +2631981897 +2133388362 +2792358112 +881109110 +1401152779 +484719121 +1310413364 +811593585 +1447438491 +834888786 +373214476 +165970625 +2185208742 +2958577917 +2671089987 +3250880403 +1115436396 +624856979 +2165577655 +2592119612 +775227040 +740832145 +3673169441 +2584938655 +2246126392 +55545992 +2385320892 +780808140 +497821964 +3705382535 +1484365356 +927887451 +1632352584 +2961244003 +2124390162 +4148267467 +3237430772 +367790344 +2999893878 +3244496621 +2044692506 +2319623025 +3441750759 +241244872 +2211020188 +3784523176 +1853820916 +3660205298 +2185773305 +1774497013 +4276182338 +3159111009 +578229621 +2366239960 +918562559 +2072523050 +299171320 +820254181 +2921970716 +2053245979 +1427216469 +2998044702 +919479073 +408316139 +278268733 +3252080692 +2200669628 +2416843468 +414557415 +1761558718 +94898634 +1513890548 +3574207097 +1478460888 +336147789 +3640363661 +2492395346 +1153414810 +1381044458 +3962133256 +3464413806 +2636622271 +3001876335 +655113965 +1346386461 +4039013819 +2072355938 +5256070 +1386514033 +307330504 +4267282814 +1097093402 +1693308967 +1579045984 +2666125903 +3670369723 +207554654 +462579107 +2950520985 \ No newline at end of file diff --git a/RHF_10000/router_mega/main.cpp b/RHF_10000/router_mega/main.cpp new file mode 100755 index 0000000..13bd16c --- /dev/null +++ b/RHF_10000/router_mega/main.cpp @@ -0,0 +1,396 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Generator.h" +#include "CTimer1.h" +// #include "Performance/Performance.h" + +//------------------------------------------------------------------------------ +using namespace std; +vector filePath; + +// Resource memory calculation +// typedef struct { +// unsigned long size,resident,share,text,lib,data,dt; +// } statm_t; +int listdir(string path) { + struct dirent *entry; + DIR *dp; + + dp = opendir(path.c_str()); + if (dp == NULL) { + perror("opendir: Path does not exist or could not be read."); + return -1; + } + + while ((entry = readdir(dp))) + { + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + else if (entry->d_type == 8) + { + string filePathName = (path + entry->d_name); + // fprintf(stderr,"%s\n", filePathName); + filePath.push_back(filePathName); + } + else if (entry->d_type == 10) + continue; + else if (entry->d_type == 4) // this is a folder, not a file + { + listdir(path + entry->d_name + "/"); + } + } + + closedir(dp); + return 0; +} +// statm_t getCurrentRSS() +// { +// statm_t result; +// FILE* fp = NULL; +// if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL ) +// { +// fprintf(stderr,"can not open /proc/self/statm \r\n"); +// return result; +// } +// if(7 != fscanf(fp,"%ld %ld %ld %ld %ld %ld %ld", +// &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt)) +// { +// fprintf(stderr,"wrong information in /proc/self/statm \r\n"); +// return result; +// } +// fclose( fp ); +// return result; // in pages +// } + + +//------------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + // struct rusage start, end, gStart, gEnd; + // getrusage(RUSAGE_SELF, &start); + // make sure two args + if( (argc<3) || (argc>3) ) + { + fprintf(stderr,"%d", argc); + fprintf(stderr,"Check command:\r\n"); + fprintf(stderr,"Please specify the experiment n = 1/2\r\n"); + + // fprintf(stderr,"Report construction time: ./Generate n FolderPath\r\n"); + // fprintf(stderr," terminal print time information.\r\n"); + // experiment 1, 10000-4, different distributions + // fprintf(stderr,"experiment 1, 10000-4, different distributions"); + // fprintf(stderr,"Generate function: ./Generate 1 ../Config.txt input.txt function.txt\r\n"); + // fprintf(stderr," function.txt will be generated.\r\n"); + + // fprintf(stderr,"Test generated function: ./Generate 1 ../Config.txt input.txt function.txt -t\r\n"); + // fprintf(stderr," function.txt will be tested based on input.txt\r\n"); + // // experiment 2, 10000-4, 10000-5, ... , + // fprintf(stderr,"experiment 2, specify p = 4/5/.../10 for 10000-4, 10000-5, ..., 10000-10 task."); + // fprintf(stderr,"Generate function: ./Generate 2 p input.txt function.txt\r\n"); + // fprintf(stderr," function.txt will be generated.\r\n"); + + // fprintf(stderr,"Test generated function: ./Generate 2 p input.txt function.txt -t\r\n"); + // fprintf(stderr," function.txt will be tested based on input.txt\r\n"); + + // experiment 1, 10000-4 + fprintf(stderr,"experiment 1, 10000-4, different distributions"); + fprintf(stderr,"Generate function: ./Generate 1 FolderPath\r\n"); + // experiment 2, 10000-4, 10000-5, ... , + fprintf(stderr,"experiment 2, iterate 10000-4, 10000-5, ..., 10000-10 tasks."); + fprintf(stderr,"Generate function: ./Generate 2 FolderPath\r\n"); + + return 1; + } + + //////////////////////////////////////////////////////////////////////// + // Add more checking logic for bad input args + //////////////////////////////////////////////////////////////////////// + + int nHash = 10000; + string path = argv[2]; + listdir(path); + int fileNum = filePath.size(); + + // Check experiment and allocate the port[] with port numbers accordingly + if (strcmp(argv[1],"1")==0) + { + // experiment 1: for 108 input distributions + int pnMax = 4; // each node has pnMax outcomes + // get number of lines: n + ifstream fin1("../pn_data/Config.txt"); + char c; + int n = 0; + while (fin1.get(c)) + { + if (c == '\n') + n++; + } + cout << "line count:" << n << endl; + fin1.close(); + + int cInterval[n][pnMax]; + // fill the cInterval[][] + ifstream fin("../pn_data/Config.txt"); + int lineN = 0; + string line; + while (getline(fin, line)) + { + if (line.size() == 0) + { + cout << lineN << endl; + break; + } + //cout << "line:" << line << endl; + istringstream sin(line); //create string input object + vector Waypoints; + string info; + while (getline(sin, info, ' ')) + { + //cout << "info:" << info << endl; + Waypoints.push_back(info); + } + + int sum = 0; + for (int itr=0; itr> x; + cInterval[lineN][itr] = x; + sum += x; + } + assert(sum == nHash); + // cout << lineN <<": " << cInterval[lineN][0] << " " << cInterval[lineN][1] + // << " " << cInterval[lineN][2] << " " << cInterval[lineN][3] << endl; + lineN++; + } + fin.close(); + + // int nHash = 10000; + // string path = argv[2]; + int nTrial = n + 1; + + ofstream output; + string outFileName = "../plot/Result_experiment1.txt"; + output.open(outFileName); + output << fileNum << " experiments. StorageCost in bits, Time in seconds." << endl; + output << "trial n_a n_b n_c n_d maxStorageCost avgStorageCost maxTime avgTime" << endl; + + for (int t=0; t < nTrial; t++) + { + int port[nHash]; + int count = 0; + for (int itv=0; itv<4; itv++) + { + int c = cInterval[t][itv]; + while(c > 0) + { + port[count++] = itv+1; + c--; + } + } + if(count != nHash) + { + fprintf(stderr,"port number not fully allocated. \r\n"); + } + ///////////////////////////////////////////////////////////////// + // Iterate 1000 input IP sets, and search a best RHF for each IP set. + // summarize the space consumption. + fprintf(stderr,"Current trial t: %d \n", t); + string path = argv[2]; + listdir(path); + double accTime = 0.0; + double maxTime = 0.0; + long accStorageCost = 0; + uint64_t maxStorageCost = 0; + + int *pn = port; + CTimer1 Timer; + // 1000 experiments, each returns a minimum storage cost, get the global worst case + for (int i=0;i maxTime){ + maxTime = curTime; + } + accStorageCost += Timer.storageCost; + } + // After each trial, initialize the storageCost + Timer.Close(); + // output the max-storage cost out of 1000 exeriments for current trial. + // fprintf(stderr,"fileNum is: %d\n", fileNum); + fprintf(stderr,"Total storage cost for all key sets is: %d bit\n", (int)accStorageCost); + fprintf(stderr,"Maximum storage cost for all key sets is: %d bit\n", (int)(maxStorageCost)); + fprintf(stderr,"avg storage cost for one key set is: %f bit\n", (double)(accStorageCost/fileNum)); + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"\n"); + output << t << " " << cInterval[t][0] << " " << cInterval[t][1] << " " << cInterval[t][2] << \ + " " << cInterval[t][3] << " " << int(maxStorageCost) << " " << float(accStorageCost/fileNum) << \ + " " << float(maxTime) << " " << float(accTime/fileNum) << endl; + ///////////////////////////////////////////////////////////////// + } + } else if (strcmp(argv[1],"2")==0) + { + // experiment 2, different sizes of output interface + ofstream output; + string outFileName = "../plot/Result_experiment2.txt"; + output.open(outFileName); + output << fileNum << " experiments. StorageCost in bits, Time in seconds." << endl; + output << "output_count maxStorageCost avgStorageCost maxTime avgTime" << endl; + // output << nBucket << endl; + // output << nPerSlot << endl; + // // output each d value in d[](dArrayBest) + // for (int slot=0;slot 0) + { + port[count++] = i; + c--; + } + } + // rest IPs are allocated with IN = nPort + while (count < nHash) { + port[count++] = nPort; + } + ///////////////////////////////////////////////////////////////// + // Iterate 1000 input IP sets, and search a best RHF for each IP set. + // summarize the space consumption. + fprintf(stderr,"Current trial nPort: %d \n", nPort); + string path = argv[2]; + listdir(path); + double accTime = 0.0; + double maxTime = 0.0; + long accStorageCost = 0; + uint64_t maxStorageCost = 0; + + int *pn = port; + CTimer1 Timer; + // 1000 experiments, each returns a minimum storage cost, get the global worst case + for (int i=0;i maxTime){ + maxTime = curTime; + } + accStorageCost += Timer.storageCost; + } + // After each trial, initialize the storageCost + Timer.Close(); + // output the max-storage cost out of 1000 exeriments for current trial. + + // fprintf(stderr,"fileNum is: %d\n", fileNum); + fprintf(stderr,"Total storage cost for all key sets is: %d bit\n", (int)accStorageCost); + fprintf(stderr,"Maximum storage cost for all key sets is: %d bit\n", (int)(maxStorageCost)); + fprintf(stderr,"avg storage cost for one key set is: %f bit\n", (double)(accStorageCost/fileNum)); + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"\n"); + output << nPort << " " << int(maxStorageCost) << " " << float(accStorageCost/fileNum)\ + << " " << float(maxTime) << " " << float(accTime/fileNum) << endl; + ///////////////////////////////////////////////////////////////// + } + } else + { + // wrong experiment number! + fprintf(stderr,"Please specify the experiment n = 1/2\r\n"); + return 1; + } + + // if (argc==3) // compare construction time + // { + // string path = argv[???]; + // listdir(path); + + // int fileNum = filePath.size(); + // double accTime = 0.0; + // double maxTime = 0.0; + // uint64_t maxStorageCost = 0; + // for (int i=0;i maxTime){ + // maxTime = curTime; + // } + // } + // fprintf(stderr,"Maximum storage cost is: %d bit\n", maxStorageCost); + // fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + // fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + // fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + // return 0; + // } + + // fprintf(stderr,"pageSize: %ld kB\r\n", (size_t)(sysconf( _SC_PAGESIZE)/1024)); + // Get statistics about the performance + // getrusage(RUSAGE_SELF, &end); + // fprintf(stderr,"Peak resident set size: %ld kB\n", end.ru_maxrss); + + // statm_t result = getCurrentRSS(); + // long pageKB = (long)(sysconf( _SC_PAGESIZE)/1024); + // fprintf(stderr,"resident set (VmRSS) size: %lu kB\r\n", result.resident * pageKB); + // fprintf(stderr,"virtual memory (VmSize) usage: %lu kB\r\n", result.size * pageKB); + // fprintf(stderr,"share memory (RssFile+RssShmem) usage: %lu kB\r\n", result.share * pageKB); + // fprintf(stderr,"code text usage: %lu kB\r\n", result.text * pageKB); + // fprintf(stderr,"data + stack usage: %lu kB\r\n", result.data * pageKB); + + return 0; +} +//------------------------------------------------------------------------------ diff --git a/RHF_10000/router_mega/output.txt b/RHF_10000/router_mega/output.txt new file mode 100755 index 0000000..b5e5ab1 --- /dev/null +++ b/RHF_10000/router_mega/output.txt @@ -0,0 +1,17410 @@ +1024 +16384 +4 +159 +28 +6 +2 +1 +1 +39 +3 +2 +1 +20 +5 +7 +13 +1 +9 +19 +5 +31 +2 +9 +11 +1 +2 +4 +36 +1 +31 +25 +28 +3 +2 +3 +13 +1 +22 +5 +29 +7 +23 +12 +7 +35 +2 +21 +24 +15 +1 +1 +11 +22 +1 +1 +3 +17 +7 +2 +4 +2 +2 +2 +25 +14 +60 +5 +2 +1 +1 +1 +54 +1 +6 +45 +17 +3 +2 +1 +4 +13 +3 +4 +7 +5 +3 +13 +4 +15 +1 +8 +82 +5 +1 +1 +45 +22 +16 +2 +16 +3 +62 +17 +10 +80 +40 +16 +19 +8 +5 +36 +2 +2 +8 +13 +6 +1 +90 +1 +5 +16 +1 +1 +17 +1 +24 +2 +5 +47 +34 +9 +16 +4 +1 +1 +17 +7 +12 +1 +17 +15 +17 +3 +8 +29 +24 +9 +35 +11 +3 +2 +1 +35 +1 +3 +2 +29 +1 +1 +16 +59 +11 +1 +1 +16 +2 +3 +25 +2 +1 +42 +10 +1 +9 +6 +15 +22 +15 +63 +12 +7 +12 +10 +1 +1 +5 +66 +38 +1 +22 +2 +20 +13 +3 +8 +6 +12 +68 +8 +27 +13 +4 +53 +7 +15 +2 +41 +47 +2 +31 +6 +37 +66 +3 +2 +5 +3 +3 +5 +17 +76 +2 +8 +12 +2 +42 +22 +1 +15 +36 +15 +9 +27 +36 +4 +11 +28 +7 +6 +12 +5 +16 +16 +23 +10 +1 +17 +4 +21 +1 +9 +19 +11 +3 +16 +8 +6 +11 +2 +14 +38 +31 +2 +5 +30 +1 +3 +13 +36 +12 +5 +4 +26 +31 +13 +5 +6 +7 +5 +5 +6 +1 +1 +6 +4 +15 +5 +12 +2 +26 +1 +11 +91 +3 +38 +2 +1 +11 +17 +17 +2 +3 +32 +17 +1 +14 +1 +1 +21 +1 +15 +6 +1 +19 +6 +2 +9 +1 +20 +8 +4 +1 +4 +4 +6 +13 +29 +2 +30 +10 +2 +10 +6 +35 +23 +4 +2 +43 +7 +72 +14 +22 +6 +17 +3 +1 +9 +1 +12 +16 +8 +17 +12 +17 +36 +6 +11 +6 +3 +3 +1 +72 +2 +4 +5 +73 +12 +26 +6 +2 +5 +12 +14 +40 +15 +27 +3 +52 +7 +17 +6 +1 +34 +2 +2 +1 +23 +4 +4 +1 +31 +16 +6 +7 +9 +3 +18 +9 +19 +27 +1 +5 +26 +2 +11 +40 +2 +9 +7 +12 +2 +4 +22 +1 +8 +21 +6 +1 +2 +51 +45 +23 +2 +6 +13 +10 +6 +18 +2 +5 +15 +18 +4 +3 +3 +4 +52 +72 +6 +8 +2 +29 +4 +13 +5 +174 +8 +8 +1 +26 +47 +14 +1 +20 +4 +1 +39 +5 +38 +1 +2 +7 +5 +28 +33 +29 +6 +5 +21 +2 +4 +111 +41 +1 +1 +2 +7 +9 +5 +6 +16 +3 +2 +55 +7 +54 +23 +5 +6 +5 +4 +4 +33 +1 +8 +1 +161 +15 +1 +4 +2 +5 +1 +4 +7 +55 +4 +60 +3 +10 +16 +2 +1 +1 +10 +6 +14 +14 +1 +1 +1 +49 +54 +3 +4 +2 +5 +7 +24 +1 +3 +7 +5 +4 +12 +21 +1 +1 +9 +34 +40 +30 +1 +33 +75 +20 +3 +3 +3 +43 +8 +22 +1 +1 +37 +4 +6 +86 +19 +21 +41 +12 +7 +11 +1 +5 +5 +3 +4 +1 +18 +7 +16 +1 +36 +4 +25 +7 +4 +13 +7 +1 +14 +10 +1 +2 +3 +14 +30 +2 +4 +46 +3 +42 +1 +12 +1 +4 +14 +17 +6 +20 +1 +44 +11 +1 +81 +18 +6 +21 +3 +4 +7 +57 +3 +2 +45 +46 +5 +1 +25 +10 +6 +11 +4 +15 +9 +5 +14 +18 +8 +30 +56 +40 +10 +7 +18 +49 +8 +65 +5 +14 +1 +1 +25 +16 +9 +2 +26 +23 +50 +4 +110 +8 +20 +73 +2 +12 +20 +41 +1 +14 +3 +23 +32 +2 +22 +3 +66 +2 +3 +50 +14 +4 +35 +1 +19 +19 +6 +2 +31 +15 +16 +21 +5 +10 +56 +32 +70 +11 +16 +1 +11 +12 +18 +9 +18 +26 +27 +50 +10 +2 +6 +10 +12 +50 +3 +3 +1 +32 +30 +3 +9 +9 +3 +25 +14 +5 +16 +18 +6 +129 +21 +6 +12 +11 +49 +27 +24 +66 +2 +3 +5 +1 +4 +1 +2 +1 +47 +5 +42 +3 +11 +4 +79 +3 +2 +7 +56 +24 +1 +20 +5 +1 +73 +4 +16 +76 +4 +9 +1 +9 +1 +27 +9 +1 +23 +25 +1 +52 +14 +7 +2 +69 +8 +25 +11 +3 +18 +12 +8 +1 +2 +47 +15 +5 +1 +46 +26 +2 +2 +33 +42 +25 +36 +11 +11 +3 +3 +2 +5 +10 +16 +3 +45 +2 +4 +10 +2 +15 +1 +46 +62 +1 +7 +7 +1 +13 +3 +131 +9 +21 +36 +5 +2 +35 +2 +12 +14 +10 +17 +28 +43 +19 +5 +8 +1 +3 +47 +39 +8 +2 +75 +7 +21 +19 +1 +37 +1 +30 +11 +24 +13 +67 +81 +5 +26 +6 +10 +45 +2 +8 +31 +11 +26 +6 +19 +10 +7 +1 +1 +30 +7 +6 +14 +25 +1 +1 +33 +4 +1 +17 +65 +10 +6 +21 +5 +9 +5 +23 +1 +1 +25 +114 +13 +4 +11 +31 +16 +3 +6 +5 +21 +94 +1 +18 +13 +6 +1 +66 +15 +8 +9 +8 +3 +1 +27 +13 +5 +11 +51 +5 +1 +19 +4 +10 +8 +16 +22 +10 +42 +41 +67 +1 +12 +3 +14 +3 +3 +24 +1 +2 +4 +24 +16 +54 +2 +49 +2 +3 +2 +27 +9 +2 +4 +45 +45 +6 +14 +1 +21 +2 +11 +11 +4 +50 +97 +19 +52 +1 +6 +25 +1 +2 +14 +13 +29 +18 +3 +12 +13 +2 +1 +23 +2 +3 +2 +50 +17 +24 +33 +15 +2 +52 +11 +6 +1 +8 +164 +1 +4 +3 +50 +66 +4 +1 +48 +6 +9 +77 +8 +8 +1 +1 +6 +13 +128 +10 +8 +7 +4 +1 +31 +65 +1 +3 +3 +0 +0 +1 +1 +0 +4 +3 +4 +3 +4 +1 +4 +0 +1 +0 +2 +2 +1 +0 +2 +0 +0 +3 +3 +1 +3 +4 +0 +0 +3 +0 +0 +0 +0 +0 +1 +2 +0 +4 +0 +0 +1 +2 +0 +0 +0 +0 +2 +4 +0 +3 +1 +4 +0 +2 +2 +3 +2 +3 +0 +1 +2 +0 +3 +1 +0 +0 +3 +4 +3 +0 +2 +0 +0 +2 +0 +4 +1 +0 +0 +2 +2 +0 +0 +0 +0 +2 +0 +2 +3 +0 +2 +4 +2 +0 +0 +2 +2 +3 +4 +0 +2 +1 +2 +3 +1 +3 +0 +0 +1 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +3 +1 +0 +2 +0 +1 +0 +3 +4 +0 +2 +0 +3 +0 +1 +3 +0 +0 +2 +4 +0 +0 +0 +3 +3 +0 +0 +4 +1 +3 +3 +0 +0 +0 +1 +2 +0 +3 +1 +2 +4 +4 +1 +0 +0 +0 +1 +0 +0 +2 +0 +4 +4 +0 +2 +3 +1 +0 +3 +0 +0 +1 +0 +4 +0 +0 +0 +0 +0 +0 +0 +4 +1 +1 +3 +3 +0 +0 +0 +4 +0 +0 +0 +0 +0 +4 +0 +3 +0 +4 +1 +0 +0 +0 +0 +0 +0 +3 +0 +2 +0 +0 +0 +4 +0 +2 +0 +2 +3 +1 +2 +4 +0 +0 +2 +2 +2 +1 +3 +0 +0 +0 +0 +2 +0 +0 +0 +0 +1 +0 +2 +4 +2 +2 +3 +0 +1 +0 +0 +2 +4 +1 +3 +3 +0 +0 +3 +0 +0 +0 +0 +2 +1 +3 +0 +1 +0 +3 +0 +3 +0 +0 +3 +3 +4 +0 +4 +2 +3 +4 +0 +0 +0 +0 +3 +0 +1 +4 +1 +0 +1 +2 +0 +0 +0 +0 +4 +0 +0 +0 +1 +3 +0 +0 +4 +0 +0 +2 +1 +0 +0 +0 +3 +3 +4 +0 +3 +0 +2 +1 +3 +0 +0 +3 +1 +4 +3 +0 +1 +0 +3 +0 +2 +0 +0 +2 +3 +3 +0 +0 +0 +1 +0 +0 +0 +3 +0 +1 +0 +3 +0 +4 +4 +0 +1 +0 +1 +0 +0 +4 +0 +3 +0 +0 +1 +0 +0 +4 +0 +0 +4 +3 +1 +0 +1 +4 +1 +0 +0 +0 +3 +4 +0 +0 +0 +2 +2 +3 +4 +0 +1 +0 +4 +4 +2 +4 +2 +0 +0 +4 +4 +1 +3 +4 +0 +0 +3 +0 +2 +2 +0 +4 +1 +0 +0 +1 +0 +2 +0 +0 +0 +2 +0 +0 +3 +0 +0 +3 +1 +1 +0 +0 +1 +4 +4 +0 +0 +3 +0 +1 +4 +3 +4 +4 +0 +0 +2 +3 +0 +0 +4 +0 +1 +0 +1 +0 +2 +1 +0 +4 +1 +3 +0 +0 +0 +1 +2 +4 +0 +0 +2 +4 +2 +0 +3 +3 +0 +4 +0 +2 +0 +4 +4 +2 +4 +0 +0 +4 +0 +0 +2 +2 +0 +0 +0 +2 +1 +1 +3 +3 +1 +4 +2 +0 +2 +0 +0 +0 +3 +3 +2 +0 +0 +4 +0 +2 +0 +0 +1 +0 +1 +0 +3 +0 +0 +0 +1 +1 +0 +2 +4 +3 +3 +0 +0 +1 +0 +1 +2 +1 +0 +4 +0 +1 +3 +2 +2 +1 +0 +4 +0 +1 +0 +0 +3 +3 +1 +0 +0 +2 +2 +0 +3 +0 +2 +0 +1 +4 +0 +3 +3 +2 +0 +0 +2 +0 +0 +0 +4 +0 +1 +1 +1 +0 +0 +2 +0 +3 +4 +0 +1 +3 +0 +0 +3 +0 +0 +4 +0 +3 +0 +2 +0 +3 +3 +4 +3 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +0 +4 +3 +0 +3 +0 +1 +0 +0 +1 +2 +4 +0 +1 +0 +0 +0 +2 +1 +4 +2 +1 +0 +3 +3 +0 +1 +3 +2 +4 +0 +2 +4 +3 +3 +0 +4 +4 +0 +0 +3 +0 +0 +0 +0 +1 +0 +1 +1 +0 +0 +0 +0 +4 +1 +4 +3 +0 +0 +1 +0 +0 +1 +0 +0 +2 +2 +2 +1 +4 +0 +1 +0 +2 +2 +2 +0 +0 +0 +4 +0 +1 +0 +0 +4 +4 +0 +0 +2 +2 +4 +2 +1 +0 +0 +0 +0 +2 +0 +3 +1 +4 +0 +0 +0 +0 +0 +0 +3 +4 +0 +1 +1 +3 +0 +3 +1 +3 +3 +2 +0 +2 +0 +1 +0 +0 +0 +0 +0 +1 +2 +3 +0 +0 +3 +0 +3 +1 +4 +1 +3 +4 +0 +4 +4 +0 +4 +1 +2 +0 +1 +0 +0 +0 +2 +0 +1 +1 +0 +2 +4 +1 +3 +0 +3 +0 +2 +0 +2 +1 +2 +3 +0 +0 +4 +4 +4 +3 +0 +0 +1 +3 +0 +0 +1 +1 +0 +2 +0 +3 +4 +0 +0 +0 +3 +0 +3 +1 +0 +4 +0 +0 +0 +1 +2 +1 +1 +4 +1 +0 +2 +4 +3 +4 +0 +4 +2 +0 +3 +0 +2 +0 +0 +3 +3 +3 +1 +1 +2 +1 +4 +0 +4 +3 +1 +0 +4 +4 +4 +1 +0 +2 +3 +2 +1 +3 +0 +0 +0 +3 +0 +3 +2 +2 +3 +4 +0 +0 +0 +4 +3 +0 +0 +4 +0 +0 +3 +1 +4 +0 +1 +0 +0 +0 +0 +1 +4 +1 +0 +2 +1 +4 +2 +3 +4 +1 +3 +1 +0 +3 +0 +0 +0 +0 +0 +0 +0 +4 +4 +4 +2 +0 +3 +0 +4 +3 +0 +4 +3 +0 +2 +0 +4 +2 +0 +4 +1 +0 +0 +4 +1 +3 +3 +3 +0 +4 +3 +1 +0 +4 +0 +3 +2 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +4 +4 +3 +4 +3 +3 +4 +0 +2 +4 +1 +0 +0 +4 +0 +0 +4 +0 +0 +2 +0 +0 +3 +4 +1 +2 +4 +1 +1 +4 +4 +1 +1 +3 +2 +2 +1 +2 +3 +0 +3 +0 +2 +0 +0 +0 +4 +0 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +1 +0 +0 +0 +0 +3 +0 +1 +4 +0 +0 +3 +1 +0 +2 +1 +0 +0 +4 +1 +0 +3 +0 +3 +0 +0 +4 +0 +2 +1 +1 +2 +1 +0 +1 +0 +4 +4 +0 +4 +1 +4 +0 +1 +0 +0 +0 +1 +2 +0 +4 +3 +3 +0 +0 +3 +1 +0 +0 +3 +2 +4 +3 +0 +3 +2 +2 +0 +0 +2 +1 +0 +0 +0 +1 +0 +0 +2 +0 +0 +0 +0 +3 +2 +0 +0 +1 +4 +2 +1 +1 +2 +1 +1 +0 +2 +3 +1 +3 +3 +0 +1 +4 +0 +0 +0 +4 +0 +0 +0 +2 +3 +0 +1 +0 +3 +0 +0 +0 +0 +0 +0 +0 +2 +0 +1 +2 +0 +2 +0 +0 +0 +2 +0 +3 +0 +0 +0 +0 +3 +0 +0 +0 +2 +0 +0 +3 +0 +3 +0 +1 +0 +0 +0 +4 +2 +0 +4 +3 +2 +3 +3 +3 +1 +0 +4 +1 +4 +1 +3 +0 +0 +0 +0 +2 +4 +1 +0 +0 +4 +1 +0 +3 +2 +4 +1 +0 +1 +1 +3 +4 +4 +0 +3 +1 +1 +0 +0 +0 +0 +0 +0 +3 +0 +0 +0 +1 +3 +3 +0 +1 +0 +0 +1 +0 +4 +1 +0 +3 +0 +1 +4 +3 +0 +1 +0 +0 +0 +4 +2 +0 +0 +0 +3 +4 +0 +1 +4 +0 +3 +1 +0 +1 +2 +0 +0 +4 +0 +0 +0 +1 +2 +2 +1 +0 +3 +0 +4 +4 +4 +2 +0 +1 +4 +0 +1 +0 +0 +2 +0 +4 +0 +3 +3 +1 +3 +2 +4 +1 +0 +1 +0 +0 +0 +1 +0 +0 +2 +0 +0 +0 +2 +4 +2 +0 +4 +2 +3 +4 +1 +1 +0 +2 +3 +1 +0 +3 +4 +0 +3 +1 +3 +2 +1 +0 +4 +4 +0 +2 +2 +0 +4 +4 +0 +3 +4 +4 +0 +0 +4 +0 +3 +0 +0 +0 +3 +2 +3 +2 +1 +2 +4 +4 +0 +0 +0 +0 +0 +2 +0 +4 +0 +1 +3 +0 +0 +2 +0 +0 +0 +1 +0 +0 +1 +0 +1 +1 +3 +3 +4 +2 +0 +0 +4 +1 +4 +0 +0 +0 +4 +0 +0 +4 +2 +2 +0 +0 +4 +3 +0 +0 +1 +0 +1 +3 +3 +0 +4 +4 +4 +4 +2 +1 +0 +0 +0 +3 +4 +2 +1 +4 +1 +3 +0 +2 +3 +3 +4 +1 +2 +1 +0 +2 +1 +0 +0 +1 +4 +4 +0 +2 +4 +1 +0 +0 +3 +3 +3 +3 +0 +0 +0 +3 +2 +3 +0 +4 +0 +3 +2 +0 +0 +2 +1 +4 +0 +2 +3 +0 +4 +0 +4 +0 +2 +0 +0 +3 +0 +3 +4 +3 +2 +2 +0 +0 +4 +0 +0 +4 +1 +3 +0 +0 +0 +1 +0 +0 +0 +0 +1 +1 +0 +3 +1 +2 +0 +3 +1 +0 +3 +0 +1 +0 +0 +0 +4 +3 +0 +2 +0 +2 +2 +2 +0 +0 +4 +1 +3 +3 +0 +0 +0 +0 +0 +0 +3 +1 +0 +0 +0 +4 +0 +3 +4 +0 +2 +1 +4 +0 +1 +0 +4 +0 +0 +3 +2 +0 +0 +3 +0 +1 +2 +0 +2 +0 +0 +3 +2 +0 +0 +4 +3 +4 +0 +0 +0 +0 +1 +3 +3 +2 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +4 +1 +4 +0 +0 +3 +0 +1 +3 +1 +4 +0 +4 +0 +0 +0 +0 +0 +0 +2 +2 +0 +0 +3 +0 +0 +1 +3 +0 +2 +1 +0 +4 +0 +0 +0 +3 +0 +4 +2 +0 +0 +0 +4 +1 +2 +0 +3 +4 +1 +0 +2 +0 +0 +0 +0 +4 +0 +4 +1 +4 +4 +4 +3 +0 +0 +0 +0 +0 +0 +4 +3 +1 +0 +1 +0 +0 +2 +4 +0 +0 +3 +0 +2 +0 +2 +0 +2 +2 +2 +2 +2 +0 +0 +0 +0 +0 +2 +2 +3 +4 +2 +2 +4 +2 +2 +0 +4 +2 +0 +1 +3 +0 +2 +2 +0 +1 +0 +2 +0 +0 +1 +0 +0 +4 +1 +0 +0 +3 +0 +1 +0 +0 +4 +0 +2 +1 +0 +1 +0 +0 +2 +3 +2 +0 +0 +0 +1 +1 +3 +3 +1 +0 +1 +0 +0 +4 +2 +2 +0 +2 +0 +3 +1 +0 +0 +1 +0 +0 +3 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +4 +0 +0 +0 +2 +1 +3 +2 +0 +0 +0 +1 +1 +1 +3 +4 +0 +0 +0 +0 +4 +0 +0 +2 +0 +2 +0 +4 +4 +2 +3 +4 +0 +0 +0 +4 +2 +1 +1 +0 +0 +2 +1 +0 +0 +4 +2 +2 +1 +2 +2 +1 +4 +4 +2 +1 +0 +1 +0 +0 +3 +0 +3 +0 +2 +2 +3 +0 +0 +0 +1 +3 +2 +0 +0 +2 +0 +0 +4 +0 +0 +0 +2 +4 +3 +0 +0 +1 +2 +1 +0 +0 +1 +0 +2 +0 +1 +0 +0 +1 +4 +3 +3 +3 +1 +0 +0 +0 +2 +4 +1 +0 +1 +0 +1 +0 +2 +1 +4 +0 +3 +0 +0 +0 +1 +0 +3 +1 +4 +0 +0 +3 +0 +3 +4 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +0 +3 +2 +2 +3 +3 +0 +4 +0 +0 +3 +1 +0 +3 +0 +0 +0 +0 +0 +0 +1 +2 +3 +2 +0 +0 +4 +0 +0 +2 +0 +3 +1 +0 +4 +1 +0 +2 +0 +1 +3 +0 +0 +1 +1 +3 +2 +0 +4 +0 +4 +3 +3 +0 +3 +1 +0 +3 +2 +0 +0 +2 +2 +4 +2 +0 +2 +4 +4 +2 +0 +2 +4 +0 +2 +0 +1 +4 +1 +1 +3 +4 +0 +0 +0 +0 +4 +2 +0 +0 +2 +3 +0 +3 +0 +1 +0 +0 +4 +0 +4 +4 +3 +3 +0 +0 +4 +0 +3 +0 +4 +0 +0 +4 +1 +1 +2 +0 +1 +0 +0 +1 +0 +1 +4 +2 +4 +1 +0 +4 +0 +0 +0 +3 +3 +2 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +1 +1 +0 +0 +4 +4 +4 +4 +0 +2 +4 +2 +4 +2 +4 +0 +0 +2 +0 +1 +4 +2 +2 +0 +4 +0 +2 +1 +4 +2 +1 +1 +4 +2 +3 +1 +1 +4 +0 +2 +2 +2 +1 +0 +4 +0 +1 +0 +4 +1 +2 +0 +0 +0 +3 +4 +3 +4 +2 +4 +0 +3 +0 +0 +0 +1 +0 +3 +1 +2 +3 +0 +0 +1 +0 +4 +0 +4 +2 +0 +0 +4 +3 +0 +1 +0 +0 +0 +2 +3 +2 +1 +2 +0 +0 +2 +4 +1 +1 +0 +4 +0 +1 +1 +2 +0 +2 +0 +2 +0 +1 +0 +3 +4 +0 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +2 +4 +3 +1 +3 +0 +1 +2 +0 +0 +0 +0 +2 +0 +4 +0 +1 +0 +1 +4 +3 +4 +1 +1 +0 +0 +1 +0 +4 +0 +2 +0 +3 +0 +4 +2 +0 +0 +1 +0 +1 +4 +4 +0 +0 +2 +0 +0 +0 +1 +2 +2 +2 +1 +2 +0 +2 +1 +0 +3 +1 +4 +0 +4 +1 +3 +0 +1 +4 +4 +3 +3 +0 +0 +2 +3 +2 +3 +0 +2 +2 +0 +0 +0 +1 +0 +3 +0 +0 +2 +3 +2 +0 +2 +4 +0 +3 +2 +4 +3 +0 +1 +4 +3 +0 +0 +4 +4 +3 +0 +4 +0 +1 +4 +0 +0 +3 +0 +3 +0 +0 +0 +2 +0 +2 +2 +0 +0 +0 +0 +0 +3 +4 +1 +1 +1 +0 +2 +0 +0 +3 +3 +3 +0 +3 +0 +1 +0 +0 +3 +0 +4 +1 +0 +3 +3 +0 +0 +1 +2 +3 +0 +0 +0 +4 +0 +0 +2 +0 +0 +1 +0 +4 +0 +4 +0 +2 +4 +2 +0 +3 +2 +4 +4 +0 +2 +0 +0 +4 +2 +1 +0 +1 +2 +3 +2 +4 +1 +3 +0 +1 +0 +3 +1 +0 +0 +0 +3 +4 +0 +0 +3 +0 +0 +4 +0 +3 +1 +0 +3 +0 +0 +0 +2 +1 +1 +2 +0 +4 +3 +4 +0 +0 +0 +2 +4 +2 +3 +1 +0 +2 +3 +3 +2 +0 +1 +0 +0 +0 +4 +0 +0 +1 +3 +3 +0 +2 +0 +0 +1 +2 +1 +0 +0 +0 +0 +4 +4 +3 +0 +3 +0 +2 +0 +1 +0 +0 +0 +4 +2 +0 +0 +0 +0 +0 +3 +4 +4 +0 +4 +4 +1 +0 +3 +0 +2 +0 +0 +0 +0 +1 +0 +1 +0 +2 +3 +0 +3 +1 +3 +0 +3 +0 +3 +3 +0 +3 +0 +0 +0 +0 +0 +4 +1 +4 +3 +0 +0 +2 +3 +3 +0 +3 +2 +0 +3 +3 +0 +0 +0 +0 +3 +4 +0 +3 +0 +1 +0 +0 +3 +0 +1 +0 +1 +2 +0 +0 +0 +3 +0 +3 +4 +1 +3 +3 +2 +0 +0 +0 +2 +0 +0 +3 +3 +4 +3 +4 +4 +4 +0 +0 +3 +0 +0 +1 +4 +0 +3 +1 +1 +1 +0 +0 +1 +3 +4 +1 +1 +0 +3 +0 +0 +3 +1 +0 +1 +0 +0 +1 +2 +2 +0 +4 +2 +0 +1 +0 +1 +2 +1 +0 +4 +0 +3 +0 +0 +3 +0 +2 +0 +0 +3 +2 +3 +0 +1 +0 +1 +1 +0 +1 +0 +4 +4 +1 +1 +0 +2 +0 +0 +2 +3 +0 +3 +0 +0 +0 +1 +0 +0 +1 +0 +2 +0 +0 +2 +0 +3 +1 +2 +1 +0 +0 +1 +4 +0 +2 +4 +2 +0 +0 +2 +0 +4 +4 +0 +3 +0 +3 +2 +4 +3 +0 +0 +1 +4 +4 +3 +3 +1 +0 +0 +1 +0 +4 +0 +0 +4 +0 +4 +0 +3 +1 +0 +0 +3 +3 +0 +0 +1 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +0 +3 +0 +0 +1 +0 +4 +3 +1 +0 +3 +2 +3 +0 +0 +1 +0 +2 +2 +0 +1 +0 +4 +0 +4 +3 +0 +0 +3 +0 +4 +1 +0 +4 +2 +4 +0 +1 +0 +2 +0 +3 +4 +0 +0 +2 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +0 +0 +3 +0 +1 +1 +4 +0 +2 +1 +0 +0 +1 +4 +0 +0 +0 +2 +0 +1 +0 +3 +4 +4 +0 +0 +4 +2 +3 +0 +3 +1 +4 +0 +3 +0 +2 +0 +0 +3 +0 +0 +1 +2 +0 +2 +0 +1 +0 +0 +2 +4 +4 +2 +1 +0 +1 +4 +0 +1 +1 +0 +4 +3 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +0 +4 +3 +0 +2 +2 +0 +4 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +1 +0 +0 +1 +0 +0 +0 +1 +4 +0 +4 +3 +4 +0 +4 +2 +0 +2 +2 +4 +0 +3 +3 +0 +0 +0 +3 +1 +0 +1 +0 +3 +1 +0 +0 +1 +0 +0 +0 +3 +0 +4 +4 +0 +1 +0 +0 +2 +0 +4 +0 +1 +0 +0 +2 +3 +1 +2 +0 +4 +3 +0 +4 +0 +0 +4 +0 +1 +3 +4 +0 +0 +3 +0 +4 +2 +3 +1 +1 +3 +0 +0 +0 +4 +2 +4 +3 +3 +2 +4 +0 +2 +0 +3 +0 +4 +0 +0 +1 +3 +0 +3 +0 +2 +4 +2 +0 +0 +0 +4 +4 +4 +0 +0 +1 +1 +4 +0 +1 +3 +0 +3 +0 +0 +1 +2 +1 +0 +0 +1 +2 +2 +0 +3 +0 +2 +0 +2 +0 +0 +3 +1 +4 +2 +3 +4 +0 +0 +1 +1 +0 +1 +4 +0 +0 +4 +1 +1 +3 +0 +3 +4 +0 +3 +0 +4 +3 +0 +3 +3 +2 +4 +0 +0 +1 +3 +3 +4 +0 +0 +3 +4 +0 +1 +4 +0 +0 +1 +4 +0 +4 +3 +1 +1 +0 +3 +0 +0 +3 +0 +4 +2 +2 +1 +0 +0 +2 +0 +3 +2 +0 +4 +1 +0 +0 +4 +1 +3 +0 +4 +0 +4 +0 +3 +0 +3 +4 +3 +2 +3 +2 +0 +0 +1 +2 +4 +2 +0 +2 +0 +2 +0 +0 +0 +0 +1 +0 +0 +1 +3 +0 +0 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +2 +1 +0 +2 +1 +4 +3 +0 +0 +3 +0 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +0 +2 +0 +4 +3 +0 +3 +3 +0 +0 +4 +1 +0 +0 +0 +1 +1 +2 +0 +2 +0 +0 +4 +2 +4 +0 +3 +3 +0 +0 +2 +0 +2 +2 +0 +0 +2 +0 +4 +4 +0 +0 +4 +2 +2 +3 +0 +3 +4 +0 +2 +3 +4 +2 +0 +4 +3 +4 +0 +0 +0 +0 +1 +0 +4 +4 +0 +2 +0 +0 +1 +3 +1 +4 +0 +3 +3 +0 +1 +1 +0 +3 +4 +0 +4 +4 +3 +0 +2 +0 +0 +3 +0 +1 +1 +0 +0 +0 +2 +0 +0 +0 +0 +0 +3 +2 +2 +0 +1 +1 +3 +0 +0 +0 +4 +4 +0 +1 +0 +2 +0 +3 +0 +4 +0 +3 +0 +1 +0 +3 +2 +2 +0 +0 +0 +0 +0 +0 +2 +3 +1 +4 +0 +0 +4 +0 +0 +0 +4 +0 +3 +0 +0 +4 +0 +0 +2 +2 +0 +3 +1 +4 +4 +0 +1 +0 +0 +1 +2 +0 +1 +3 +3 +0 +1 +0 +0 +2 +1 +3 +0 +0 +0 +2 +1 +0 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +4 +0 +3 +4 +2 +3 +4 +0 +3 +0 +0 +0 +0 +0 +2 +4 +0 +3 +3 +3 +4 +0 +0 +0 +4 +4 +0 +0 +2 +3 +0 +0 +4 +1 +3 +2 +0 +0 +0 +0 +0 +0 +3 +4 +0 +0 +3 +0 +0 +2 +4 +3 +0 +2 +2 +3 +0 +2 +1 +0 +0 +0 +0 +1 +0 +1 +2 +4 +0 +1 +2 +3 +4 +0 +0 +0 +0 +0 +1 +3 +0 +2 +0 +0 +0 +0 +0 +3 +0 +2 +0 +0 +2 +4 +3 +0 +2 +0 +0 +0 +2 +0 +3 +3 +1 +0 +1 +0 +3 +3 +0 +1 +0 +3 +0 +3 +0 +1 +1 +3 +1 +1 +0 +4 +0 +3 +2 +3 +0 +0 +0 +1 +3 +1 +0 +3 +4 +0 +2 +0 +4 +4 +0 +3 +0 +4 +0 +2 +1 +0 +1 +0 +1 +0 +0 +2 +2 +0 +0 +0 +4 +0 +3 +0 +3 +0 +3 +2 +3 +0 +0 +2 +4 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +4 +1 +0 +4 +2 +0 +1 +0 +2 +0 +0 +0 +3 +3 +1 +4 +1 +0 +0 +4 +0 +0 +2 +0 +0 +2 +2 +0 +0 +0 +0 +0 +2 +4 +0 +0 +4 +1 +0 +4 +4 +0 +0 +2 +0 +3 +1 +0 +0 +0 +3 +3 +0 +0 +0 +4 +1 +3 +1 +0 +0 +4 +0 +0 +1 +4 +1 +2 +0 +3 +0 +0 +0 +2 +1 +1 +1 +0 +3 +1 +0 +0 +0 +0 +0 +0 +2 +0 +4 +0 +3 +0 +4 +0 +4 +3 +1 +1 +2 +0 +0 +1 +0 +0 +2 +0 +0 +2 +3 +0 +0 +0 +4 +0 +1 +0 +0 +1 +3 +0 +1 +0 +2 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +1 +2 +0 +3 +2 +0 +0 +1 +0 +0 +0 +0 +0 +0 +2 +0 +1 +4 +4 +1 +0 +2 +0 +4 +3 +0 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +1 +3 +0 +4 +3 +2 +0 +0 +3 +4 +0 +0 +2 +0 +2 +4 +3 +3 +3 +0 +0 +4 +4 +4 +1 +0 +0 +2 +2 +4 +2 +4 +0 +0 +0 +1 +2 +0 +0 +4 +0 +2 +1 +3 +1 +1 +4 +4 +3 +3 +2 +2 +2 +0 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +2 +0 +4 +3 +0 +3 +0 +3 +3 +2 +0 +1 +1 +0 +4 +0 +3 +1 +0 +0 +2 +4 +2 +3 +4 +2 +3 +0 +3 +2 +3 +4 +3 +2 +4 +3 +3 +3 +4 +0 +2 +4 +0 +2 +0 +2 +3 +0 +4 +4 +0 +1 +0 +3 +1 +0 +2 +1 +3 +3 +2 +4 +3 +0 +0 +0 +3 +2 +4 +0 +0 +4 +2 +2 +4 +0 +0 +4 +0 +4 +0 +0 +0 +0 +2 +1 +2 +0 +0 +0 +0 +0 +1 +0 +2 +0 +3 +0 +3 +3 +0 +0 +0 +4 +0 +0 +3 +2 +0 +0 +4 +0 +0 +0 +0 +0 +4 +4 +2 +4 +4 +0 +3 +0 +0 +0 +0 +4 +0 +1 +1 +0 +3 +0 +2 +3 +0 +1 +3 +0 +1 +0 +0 +3 +3 +0 +2 +4 +2 +2 +1 +2 +0 +0 +4 +4 +0 +2 +2 +3 +4 +1 +0 +0 +2 +0 +2 +0 +0 +0 +4 +3 +2 +4 +3 +3 +0 +2 +2 +0 +0 +4 +4 +0 +3 +0 +3 +2 +3 +2 +1 +2 +0 +1 +2 +3 +2 +0 +0 +3 +0 +1 +0 +0 +2 +0 +1 +0 +0 +0 +3 +4 +0 +0 +2 +0 +0 +1 +0 +3 +3 +4 +3 +0 +1 +1 +0 +0 +0 +0 +4 +0 +0 +4 +2 +3 +2 +0 +0 +0 +1 +0 +0 +2 +2 +0 +0 +4 +0 +4 +0 +1 +0 +3 +0 +3 +0 +3 +0 +4 +4 +0 +4 +1 +4 +3 +2 +4 +0 +3 +0 +2 +0 +3 +2 +2 +0 +0 +0 +1 +0 +1 +1 +0 +3 +0 +4 +0 +0 +2 +1 +2 +0 +0 +4 +2 +4 +0 +0 +1 +3 +1 +4 +2 +0 +0 +4 +2 +4 +4 +2 +0 +1 +3 +2 +0 +0 +0 +0 +3 +3 +4 +0 +2 +2 +0 +0 +3 +2 +4 +0 +0 +1 +2 +2 +0 +0 +4 +3 +2 +0 +2 +0 +1 +0 +0 +0 +3 +1 +0 +1 +4 +3 +1 +0 +1 +0 +3 +2 +0 +4 +4 +2 +2 +0 +0 +3 +0 +0 +1 +3 +3 +0 +0 +3 +0 +2 +4 +2 +3 +0 +4 +0 +2 +4 +2 +2 +0 +4 +0 +0 +4 +4 +0 +0 +3 +0 +1 +0 +4 +2 +0 +1 +2 +2 +0 +0 +4 +1 +0 +0 +2 +4 +4 +0 +0 +3 +0 +0 +0 +1 +0 +4 +0 +0 +4 +2 +4 +0 +1 +0 +0 +0 +2 +2 +0 +1 +4 +4 +0 +1 +0 +2 +3 +4 +3 +4 +0 +3 +0 +3 +3 +0 +4 +1 +1 +1 +4 +0 +3 +2 +2 +3 +0 +4 +0 +3 +3 +4 +0 +3 +0 +3 +1 +0 +1 +1 +1 +0 +1 +3 +0 +3 +0 +0 +0 +4 +2 +0 +0 +0 +4 +3 +2 +0 +1 +0 +0 +3 +1 +0 +0 +0 +2 +4 +4 +3 +3 +4 +1 +3 +0 +0 +2 +3 +0 +4 +4 +1 +4 +0 +1 +4 +3 +0 +4 +0 +3 +4 +0 +3 +3 +1 +0 +0 +1 +1 +0 +0 +1 +3 +0 +2 +0 +0 +0 +1 +0 +0 +0 +1 +3 +0 +0 +2 +3 +3 +2 +3 +0 +0 +4 +4 +4 +3 +2 +0 +3 +2 +0 +2 +0 +0 +0 +0 +0 +1 +2 +0 +0 +1 +0 +4 +2 +4 +0 +3 +0 +0 +1 +4 +1 +0 +0 +1 +4 +0 +0 +4 +0 +3 +1 +1 +3 +1 +0 +4 +1 +0 +0 +3 +1 +2 +0 +1 +0 +2 +0 +3 +3 +0 +0 +2 +3 +2 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +1 +3 +0 +4 +0 +0 +0 +0 +2 +2 +1 +1 +0 +0 +0 +0 +0 +1 +1 +1 +4 +0 +0 +4 +3 +0 +0 +0 +0 +3 +4 +3 +0 +1 +4 +1 +0 +0 +0 +0 +3 +0 +4 +2 +1 +4 +0 +0 +1 +2 +0 +2 +0 +0 +1 +1 +1 +0 +0 +4 +3 +4 +1 +0 +2 +1 +1 +1 +4 +0 +3 +0 +0 +0 +1 +0 +4 +1 +2 +3 +3 +0 +2 +0 +4 +4 +0 +0 +4 +1 +2 +0 +0 +2 +0 +0 +0 +3 +2 +0 +2 +0 +3 +0 +2 +0 +0 +1 +0 +3 +4 +2 +0 +0 +1 +0 +3 +0 +2 +1 +2 +3 +0 +1 +1 +4 +1 +0 +1 +0 +3 +1 +0 +2 +0 +2 +2 +3 +2 +2 +2 +0 +1 +2 +2 +0 +3 +4 +3 +1 +2 +0 +1 +4 +0 +1 +4 +1 +3 +2 +1 +4 +4 +0 +0 +2 +3 +2 +4 +0 +0 +4 +4 +1 +0 +0 +1 +0 +2 +1 +4 +0 +1 +1 +0 +0 +0 +0 +3 +1 +0 +3 +0 +0 +0 +0 +1 +0 +4 +0 +3 +1 +3 +3 +0 +0 +4 +4 +2 +3 +0 +0 +0 +1 +2 +1 +0 +0 +2 +0 +0 +0 +0 +0 +4 +4 +3 +0 +0 +4 +0 +0 +0 +0 +0 +2 +0 +3 +0 +1 +0 +0 +0 +2 +0 +3 +4 +2 +0 +0 +1 +0 +1 +1 +1 +0 +0 +0 +1 +0 +4 +0 +2 +3 +0 +4 +4 +4 +3 +1 +1 +1 +0 +0 +1 +0 +0 +1 +3 +4 +0 +1 +0 +0 +4 +1 +0 +4 +0 +0 +0 +0 +0 +2 +3 +0 +2 +2 +4 +0 +2 +0 +0 +0 +1 +0 +0 +0 +2 +4 +0 +0 +0 +0 +3 +3 +0 +2 +3 +0 +0 +0 +0 +4 +2 +3 +0 +0 +3 +0 +3 +3 +3 +3 +0 +0 +0 +3 +2 +0 +4 +0 +4 +3 +3 +0 +0 +0 +0 +1 +0 +1 +1 +3 +2 +0 +2 +0 +3 +4 +0 +4 +4 +2 +0 +4 +0 +4 +0 +3 +3 +0 +3 +0 +0 +2 +3 +0 +3 +0 +0 +2 +0 +4 +0 +3 +3 +1 +2 +2 +0 +0 +1 +2 +2 +0 +0 +3 +4 +3 +1 +1 +4 +0 +0 +3 +0 +0 +1 +3 +0 +2 +4 +0 +4 +0 +0 +0 +1 +0 +3 +2 +4 +0 +0 +0 +1 +3 +0 +0 +4 +3 +3 +4 +4 +1 +3 +3 +0 +2 +4 +4 +4 +0 +0 +0 +0 +0 +0 +2 +0 +2 +0 +1 +0 +0 +1 +0 +3 +4 +3 +1 +0 +0 +0 +2 +0 +1 +0 +0 +0 +0 +0 +0 +1 +0 +2 +0 +0 +1 +4 +1 +0 +0 +4 +0 +2 +0 +0 +0 +1 +2 +0 +0 +3 +0 +0 +1 +0 +2 +2 +1 +3 +0 +0 +0 +0 +3 +3 +0 +3 +3 +4 +0 +0 +4 +4 +1 +0 +0 +2 +0 +2 +3 +0 +0 +3 +2 +0 +0 +0 +0 +1 +3 +2 +4 +0 +2 +2 +0 +0 +2 +4 +0 +2 +0 +2 +0 +3 +2 +0 +4 +4 +4 +0 +3 +0 +2 +1 +0 +4 +1 +4 +4 +3 +1 +0 +4 +2 +0 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +4 +1 +0 +3 +0 +4 +4 +0 +0 +0 +1 +0 +3 +0 +2 +2 +2 +0 +0 +2 +0 +0 +4 +2 +0 +4 +0 +2 +3 +0 +3 +0 +4 +4 +1 +2 +0 +1 +0 +0 +3 +3 +4 +0 +0 +4 +4 +1 +2 +0 +3 +2 +4 +0 +0 +0 +2 +1 +3 +2 +4 +0 +0 +2 +0 +1 +0 +4 +2 +1 +1 +3 +2 +0 +2 +0 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +0 +0 +0 +4 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +2 +1 +0 +0 +1 +0 +0 +0 +0 +0 +4 +4 +0 +3 +4 +0 +3 +4 +1 +0 +2 +1 +4 +3 +0 +0 +0 +0 +0 +0 +0 +3 +2 +1 +0 +0 +2 +0 +0 +1 +2 +0 +0 +0 +0 +0 +2 +2 +3 +1 +0 +4 +0 +0 +0 +0 +3 +4 +3 +2 +2 +2 +3 +0 +0 +4 +1 +1 +0 +4 +0 +2 +1 +1 +4 +3 +0 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +0 +3 +0 +4 +1 +0 +0 +0 +0 +1 +1 +2 +3 +0 +0 +0 +4 +1 +0 +1 +0 +3 +0 +1 +2 +0 +2 +0 +0 +3 +1 +4 +1 +0 +1 +0 +0 +0 +4 +3 +3 +2 +1 +4 +1 +0 +0 +2 +3 +4 +0 +0 +0 +4 +4 +4 +0 +0 +0 +0 +3 +2 +2 +0 +1 +0 +0 +3 +0 +1 +1 +4 +0 +3 +4 +2 +2 +2 +4 +0 +3 +0 +4 +3 +3 +0 +0 +3 +0 +3 +1 +1 +0 +1 +1 +3 +2 +0 +0 +0 +0 +0 +1 +3 +0 +0 +3 +0 +0 +4 +0 +2 +4 +4 +0 +0 +0 +2 +4 +1 +2 +4 +2 +0 +4 +1 +2 +4 +2 +0 +0 +2 +2 +1 +0 +0 +0 +3 +0 +0 +0 +3 +1 +2 +1 +0 +0 +0 +2 +2 +0 +0 +3 +1 +1 +0 +0 +4 +0 +0 +2 +4 +1 +0 +0 +0 +0 +0 +0 +1 +4 +3 +4 +3 +3 +4 +0 +0 +1 +3 +4 +0 +2 +0 +1 +3 +0 +0 +4 +2 +0 +3 +1 +3 +4 +0 +1 +0 +3 +0 +1 +0 +0 +0 +0 +3 +1 +1 +2 +4 +0 +2 +1 +0 +0 +2 +1 +0 +0 +2 +4 +0 +3 +2 +4 +1 +0 +4 +0 +4 +0 +3 +3 +4 +3 +0 +0 +0 +3 +4 +2 +0 +0 +2 +0 +0 +2 +1 +0 +2 +0 +4 +0 +1 +0 +4 +0 +1 +0 +0 +1 +0 +0 +0 +0 +0 +3 +3 +4 +1 +2 +4 +3 +0 +2 +1 +3 +0 +4 +0 +2 +0 +1 +1 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +3 +0 +0 +0 +3 +0 +0 +2 +0 +4 +1 +3 +0 +1 +0 +3 +0 +1 +2 +4 +0 +0 +2 +0 +1 +3 +0 +0 +3 +0 +0 +0 +0 +1 +0 +0 +4 +0 +2 +0 +1 +0 +0 +2 +0 +3 +1 +4 +2 +3 +0 +2 +3 +0 +0 +3 +0 +2 +1 +2 +4 +2 +2 +1 +0 +4 +3 +2 +1 +2 +3 +3 +0 +3 +0 +0 +1 +4 +1 +0 +3 +0 +4 +1 +2 +1 +0 +3 +2 +2 +2 +2 +0 +0 +4 +4 +0 +1 +1 +0 +2 +1 +4 +3 +0 +3 +0 +4 +1 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +4 +2 +4 +0 +0 +0 +4 +0 +1 +0 +0 +0 +1 +0 +0 +4 +0 +1 +0 +3 +0 +1 +3 +0 +1 +4 +4 +2 +3 +0 +0 +3 +0 +1 +1 +3 +0 +0 +0 +1 +0 +3 +0 +4 +0 +4 +1 +0 +4 +0 +2 +3 +1 +3 +0 +0 +3 +0 +2 +0 +0 +2 +0 +0 +3 +3 +0 +3 +3 +0 +0 +0 +4 +2 +3 +1 +2 +0 +2 +3 +2 +3 +4 +0 +0 +2 +0 +2 +4 +0 +0 +3 +3 +1 +2 +1 +1 +4 +2 +0 +1 +0 +4 +4 +0 +0 +2 +0 +3 +2 +0 +0 +2 +4 +0 +0 +0 +0 +0 +4 +0 +4 +3 +4 +0 +0 +2 +0 +2 +0 +0 +1 +2 +3 +4 +1 +0 +0 +0 +0 +1 +0 +4 +0 +0 +0 +0 +0 +0 +2 +3 +0 +1 +0 +0 +0 +1 +4 +2 +2 +0 +3 +0 +3 +4 +3 +0 +2 +0 +4 +0 +0 +2 +2 +4 +0 +0 +0 +1 +2 +0 +0 +1 +1 +4 +0 +3 +2 +4 +4 +0 +4 +4 +0 +0 +0 +2 +0 +2 +0 +0 +3 +2 +0 +0 +2 +0 +3 +0 +1 +3 +4 +3 +0 +4 +0 +0 +2 +3 +0 +3 +0 +3 +0 +0 +0 +2 +4 +0 +1 +3 +2 +4 +0 +0 +3 +0 +0 +0 +4 +2 +0 +3 +1 +0 +0 +0 +0 +0 +1 +0 +2 +0 +3 +0 +0 +1 +0 +1 +1 +0 +2 +0 +0 +4 +1 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +3 +4 +2 +3 +2 +0 +4 +2 +1 +3 +0 +1 +0 +3 +0 +0 +4 +2 +1 +3 +4 +0 +0 +0 +0 +1 +1 +0 +1 +0 +0 +0 +0 +3 +0 +0 +2 +0 +0 +1 +0 +0 +0 +4 +3 +0 +0 +0 +0 +0 +2 +1 +2 +0 +0 +2 +0 +3 +2 +4 +2 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +4 +0 +1 +4 +4 +4 +3 +2 +0 +3 +1 +0 +2 +0 +0 +3 +1 +4 +2 +3 +1 +4 +1 +1 +0 +0 +0 +2 +0 +0 +0 +0 +2 +0 +1 +3 +1 +0 +4 +4 +0 +2 +0 +0 +0 +0 +2 +3 +2 +0 +1 +3 +0 +0 +0 +2 +2 +2 +0 +0 +0 +4 +0 +0 +1 +1 +1 +2 +0 +3 +0 +0 +0 +0 +4 +4 +0 +0 +0 +0 +2 +0 +2 +0 +2 +0 +0 +3 +0 +0 +0 +2 +0 +0 +0 +2 +3 +0 +0 +2 +0 +3 +2 +0 +0 +0 +0 +1 +0 +3 +2 +0 +0 +0 +3 +0 +4 +1 +0 +3 +4 +0 +2 +4 +1 +2 +0 +0 +3 +1 +2 +0 +0 +2 +0 +4 +0 +0 +0 +0 +0 +2 +1 +1 +0 +0 +3 +3 +1 +4 +0 +2 +0 +2 +0 +3 +1 +1 +3 +3 +2 +0 +4 +0 +0 +0 +0 +0 +1 +0 +0 +4 +0 +0 +3 +0 +0 +0 +2 +4 +1 +2 +2 +0 +0 +0 +1 +0 +2 +0 +2 +2 +3 +4 +0 +0 +2 +1 +0 +2 +2 +1 +0 +1 +3 +0 +0 +3 +0 +0 +0 +3 +0 +3 +0 +1 +0 +0 +1 +3 +0 +4 +4 +0 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +3 +0 +3 +0 +1 +2 +1 +0 +1 +2 +0 +3 +0 +0 +1 +0 +4 +1 +0 +1 +4 +4 +0 +0 +2 +1 +3 +3 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +0 +3 +3 +0 +2 +0 +0 +0 +0 +0 +4 +0 +0 +3 +3 +1 +0 +0 +2 +4 +4 +0 +4 +3 +0 +4 +2 +1 +0 +0 +0 +0 +0 +2 +0 +3 +0 +4 +0 +0 +0 +3 +0 +2 +3 +0 +0 +4 +1 +0 +1 +1 +2 +3 +3 +1 +4 +0 +4 +0 +1 +0 +3 +3 +2 +1 +4 +1 +0 +0 +0 +0 +3 +4 +3 +4 +0 +4 +0 +2 +2 +0 +4 +3 +0 +4 +0 +4 +1 +1 +4 +0 +4 +0 +3 +2 +4 +2 +1 +3 +4 +1 +0 +0 +2 +4 +0 +4 +2 +1 +4 +4 +4 +3 +3 +1 +0 +0 +0 +0 +4 +3 +3 +2 +0 +0 +4 +4 +0 +0 +0 +0 +0 +0 +1 +3 +1 +2 +0 +3 +0 +0 +0 +3 +1 +0 +3 +0 +0 +4 +0 +4 +4 +3 +2 +4 +3 +2 +4 +3 +3 +2 +4 +2 +1 +0 +2 +2 +0 +0 +0 +3 +3 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +3 +0 +0 +0 +4 +3 +3 +2 +4 +4 +2 +0 +0 +0 +0 +4 +3 +0 +0 +0 +0 +0 +4 +0 +0 +1 +0 +2 +0 +4 +0 +0 +4 +0 +1 +0 +0 +1 +4 +4 +1 +1 +1 +0 +4 +1 +0 +0 +2 +0 +0 +0 +4 +0 +2 +1 +0 +0 +0 +0 +0 +1 +2 +2 +4 +0 +0 +0 +1 +2 +4 +0 +0 +0 +2 +0 +4 +2 +0 +1 +0 +0 +1 +0 +1 +0 +4 +0 +3 +0 +0 +4 +3 +4 +4 +2 +0 +2 +0 +0 +3 +1 +2 +0 +4 +0 +0 +4 +3 +3 +3 +3 +3 +3 +4 +4 +4 +3 +0 +1 +0 +3 +0 +0 +0 +0 +1 +3 +0 +3 +2 +3 +1 +3 +4 +1 +4 +1 +1 +0 +3 +3 +1 +3 +0 +2 +0 +0 +1 +2 +1 +2 +0 +0 +4 +0 +0 +2 +2 +0 +0 +0 +4 +4 +2 +3 +4 +1 +2 +0 +0 +0 +2 +0 +3 +0 +3 +0 +0 +1 +0 +0 +3 +0 +0 +0 +3 +4 +0 +2 +4 +1 +3 +0 +0 +3 +0 +4 +4 +3 +3 +4 +4 +3 +0 +0 +2 +0 +0 +4 +2 +3 +0 +0 +2 +1 +3 +0 +0 +0 +2 +0 +0 +2 +0 +1 +2 +1 +1 +1 +1 +0 +0 +4 +0 +0 +0 +0 +0 +0 +3 +3 +3 +3 +0 +0 +0 +2 +0 +2 +0 +0 +4 +0 +0 +0 +1 +4 +4 +3 +0 +0 +2 +3 +4 +0 +0 +0 +2 +1 +0 +0 +4 +4 +2 +4 +0 +4 +4 +2 +2 +3 +0 +2 +0 +1 +1 +4 +4 +0 +2 +4 +3 +0 +0 +4 +0 +0 +2 +2 +4 +0 +0 +2 +3 +2 +4 +3 +1 +0 +2 +3 +1 +0 +0 +0 +1 +0 +0 +1 +0 +2 +0 +4 +0 +0 +4 +0 +2 +2 +1 +0 +2 +2 +2 +0 +3 +1 +0 +4 +2 +1 +2 +2 +0 +4 +0 +0 +0 +4 +4 +0 +4 +3 +0 +1 +0 +2 +1 +4 +4 +2 +1 +2 +3 +2 +0 +0 +1 +3 +0 +3 +1 +0 +4 +0 +1 +2 +0 +3 +2 +0 +0 +3 +4 +2 +4 +0 +2 +1 +1 +2 +0 +0 +0 +3 +2 +0 +0 +3 +2 +0 +3 +0 +2 +2 +0 +0 +0 +0 +4 +0 +3 +2 +0 +0 +0 +3 +0 +0 +0 +0 +2 +0 +0 +2 +4 +4 +1 +2 +0 +1 +0 +4 +2 +2 +2 +0 +2 +0 +1 +1 +0 +0 +0 +2 +0 +3 +2 +1 +1 +0 +0 +3 +1 +1 +2 +0 +3 +3 +0 +0 +4 +0 +2 +0 +3 +0 +0 +3 +0 +1 +2 +3 +1 +2 +1 +1 +0 +4 +4 +0 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +1 +0 +1 +1 +2 +4 +0 +2 +2 +0 +4 +0 +3 +2 +0 +0 +2 +0 +3 +0 +3 +3 +0 +4 +3 +0 +0 +0 +4 +2 +0 +4 +0 +0 +0 +4 +0 +1 +0 +0 +3 +1 +1 +4 +3 +4 +0 +0 +0 +4 +4 +4 +1 +1 +0 +0 +0 +2 +3 +1 +3 +0 +4 +2 +1 +3 +1 +0 +3 +0 +1 +4 +3 +2 +0 +0 +0 +3 +1 +0 +0 +0 +1 +0 +4 +1 +0 +0 +0 +0 +2 +0 +2 +0 +2 +4 +4 +0 +3 +4 +1 +1 +0 +2 +0 +2 +1 +0 +2 +0 +4 +0 +4 +4 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +3 +0 +0 +0 +0 +0 +0 +0 +3 +0 +4 +2 +0 +0 +4 +2 +0 +0 +0 +1 +1 +0 +1 +3 +2 +0 +0 +0 +1 +3 +3 +0 +4 +3 +1 +2 +1 +3 +0 +3 +0 +0 +4 +4 +1 +0 +0 +2 +0 +4 +4 +0 +0 +2 +0 +4 +0 +4 +0 +1 +3 +1 +0 +3 +1 +1 +3 +2 +0 +0 +0 +3 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +3 +0 +0 +1 +1 +0 +0 +0 +3 +3 +0 +1 +2 +0 +0 +0 +1 +3 +0 +0 +0 +0 +0 +3 +4 +4 +0 +2 +0 +0 +0 +3 +2 +0 +3 +3 +0 +0 +0 +0 +4 +1 +3 +3 +4 +3 +1 +1 +0 +0 +4 +3 +0 +1 +2 +1 +0 +4 +3 +1 +1 +1 +2 +2 +3 +0 +2 +2 +0 +1 +0 +0 +3 +4 +1 +1 +2 +0 +0 +2 +2 +2 +3 +2 +2 +3 +0 +1 +0 +0 +3 +1 +0 +0 +0 +3 +2 +0 +1 +3 +2 +2 +0 +0 +0 +0 +3 +4 +0 +3 +0 +1 +0 +1 +1 +0 +0 +1 +0 +0 +4 +3 +1 +0 +0 +2 +3 +1 +0 +0 +4 +4 +0 +2 +0 +1 +3 +4 +2 +0 +0 +0 +0 +0 +2 +0 +1 +3 +0 +0 +2 +2 +0 +0 +4 +0 +0 +0 +4 +4 +2 +0 +1 +1 +0 +0 +0 +4 +4 +0 +3 +0 +0 +0 +4 +2 +2 +1 +4 +3 +3 +3 +1 +0 +0 +4 +0 +4 +0 +4 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +0 +2 +0 +1 +0 +1 +0 +4 +4 +0 +1 +4 +0 +2 +4 +2 +0 +0 +0 +0 +0 +3 +3 +0 +2 +2 +0 +4 +1 +0 +0 +0 +0 +2 +0 +4 +1 +3 +0 +2 +0 +4 +1 +1 +3 +2 +1 +0 +2 +0 +4 +4 +0 +0 +4 +2 +2 +4 +0 +1 +2 +3 +4 +3 +0 +4 +2 +0 +0 +3 +3 +0 +4 +4 +2 +0 +0 +1 +0 +0 +4 +2 +0 +0 +4 +2 +4 +0 +0 +3 +0 +0 +0 +1 +4 +1 +0 +2 +0 +4 +1 +4 +2 +2 +1 +0 +0 +2 +3 +2 +1 +4 +3 +2 +0 +4 +2 +0 +4 +0 +4 +3 +2 +0 +1 +2 +0 +1 +0 +1 +4 +0 +0 +0 +2 +1 +0 +1 +0 +4 +2 +4 +1 +0 +0 +2 +4 +0 +0 +0 +1 +3 +3 +0 +0 +0 +0 +3 +0 +2 +3 +4 +1 +4 +2 +4 +4 +1 +0 +3 +0 +3 +1 +0 +1 +0 +2 +4 +0 +1 +3 +3 +0 +0 +3 +0 +1 +3 +0 +0 +0 +0 +2 +1 +0 +3 +0 +3 +3 +0 +2 +0 +2 +2 +1 +1 +4 +0 +0 +0 +0 +1 +3 +1 +4 +3 +3 +1 +0 +0 +1 +0 +1 +2 +0 +4 +0 +0 +4 +0 +0 +0 +2 +3 +2 +0 +3 +0 +0 +0 +3 +1 +0 +0 +2 +0 +4 +3 +0 +0 +0 +3 +2 +4 +3 +3 +2 +0 +0 +0 +0 +0 +4 +2 +4 +2 +0 +0 +4 +1 +3 +0 +0 +1 +0 +3 +4 +3 +3 +0 +4 +3 +2 +3 +1 +0 +0 +2 +2 +1 +0 +0 +2 +0 +0 +0 +0 +0 +3 +1 +1 +0 +0 +1 +0 +2 +0 +3 +4 +0 +2 +0 +0 +1 +0 +0 +0 +1 +2 +3 +3 +4 +4 +2 +3 +2 +0 +2 +0 +2 +1 +4 +0 +0 +3 +0 +4 +3 +0 +4 +0 +0 +4 +0 +3 +0 +2 +1 +2 +3 +0 +0 +0 +2 +3 +0 +0 +2 +2 +0 +0 +0 +0 +0 +3 +1 +3 +0 +4 +1 +0 +1 +0 +4 +3 +1 +0 +0 +2 +3 +0 +3 +2 +1 +0 +0 +0 +3 +0 +3 +0 +2 +0 +4 +0 +0 +4 +0 +0 +0 +0 +1 +0 +4 +2 +1 +1 +4 +0 +2 +0 +4 +1 +0 +4 +4 +0 +0 +0 +0 +3 +0 +0 +2 +4 +2 +2 +1 +0 +3 +4 +3 +4 +0 +0 +1 +0 +3 +0 +0 +3 +4 +1 +1 +4 +0 +2 +2 +0 +0 +0 +2 +0 +1 +0 +2 +0 +0 +1 +4 +0 +4 +3 +2 +0 +0 +4 +0 +3 +0 +2 +1 +3 +2 +0 +3 +1 +0 +0 +0 +3 +1 +0 +0 +3 +3 +4 +4 +0 +3 +0 +1 +3 +0 +2 +2 +0 +1 +0 +0 +0 +0 +0 +0 +3 +0 +4 +0 +0 +0 +4 +4 +0 +2 +0 +1 +4 +3 +4 +0 +0 +0 +4 +0 +4 +0 +0 +3 +0 +0 +2 +4 +4 +2 +1 +0 +4 +2 +3 +0 +0 +3 +0 +4 +0 +0 +4 +0 +2 +1 +0 +0 +2 +0 +0 +1 +2 +1 +1 +1 +0 +2 +0 +1 +2 +0 +0 +0 +2 +0 +3 +1 +0 +1 +1 +4 +0 +0 +0 +0 +3 +2 +0 +0 +0 +0 +2 +4 +0 +1 +2 +0 +3 +2 +0 +2 +2 +0 +2 +3 +1 +0 +0 +4 +0 +2 +4 +0 +1 +4 +0 +0 +0 +3 +0 +1 +0 +4 +0 +4 +4 +0 +1 +0 +4 +2 +0 +0 +1 +2 +1 +3 +4 +0 +2 +3 +3 +4 +0 +3 +0 +0 +1 +0 +1 +1 +4 +2 +2 +2 +1 +4 +0 +2 +0 +0 +0 +0 +2 +0 +4 +0 +2 +0 +0 +4 +0 +4 +0 +1 +2 +0 +2 +1 +4 +2 +3 +0 +0 +2 +0 +1 +0 +0 +0 +2 +3 +2 +0 +0 +0 +0 +3 +3 +0 +4 +0 +4 +0 +0 +1 +1 +3 +3 +0 +3 +3 +0 +0 +3 +2 +0 +3 +0 +0 +1 +0 +2 +0 +3 +4 +2 +2 +2 +2 +0 +4 +4 +0 +0 +3 +1 +2 +4 +4 +3 +4 +0 +0 +3 +0 +0 +0 +0 +0 +1 +2 +4 +3 +0 +4 +0 +4 +4 +1 +3 +0 +0 +0 +4 +2 +4 +1 +2 +0 +0 +0 +3 +1 +2 +0 +4 +0 +0 +2 +0 +0 +0 +0 +0 +0 +3 +1 +0 +0 +0 +0 +0 +3 +3 +0 +1 +2 +2 +3 +0 +3 +1 +2 +4 +2 +3 +4 +4 +2 +0 +1 +0 +0 +2 +0 +0 +1 +4 +2 +0 +1 +0 +4 +4 +3 +1 +0 +0 +2 +0 +1 +0 +0 +3 +4 +3 +0 +0 +0 +1 +3 +4 +2 +3 +3 +0 +4 +4 +2 +0 +2 +0 +0 +4 +3 +0 +4 +1 +2 +0 +0 +3 +2 +2 +1 +3 +3 +3 +4 +0 +3 +3 +4 +0 +2 +0 +0 +0 +4 +0 +0 +1 +0 +0 +0 +0 +2 +3 +0 +2 +0 +0 +0 +0 +4 +0 +0 +0 +4 +4 +0 +3 +3 +0 +2 +0 +0 +4 +0 +4 +0 +2 +0 +2 +4 +0 +1 +4 +1 +2 +0 +0 +4 +1 +0 +1 +4 +0 +0 +0 +3 +1 +3 +0 +0 +3 +0 +1 +0 +2 +0 +3 +0 +1 +4 +4 +0 +1 +0 +0 +0 +0 +0 +3 +2 +1 +0 +0 +2 +2 +0 +0 +0 +0 +2 +3 +0 +0 +2 +1 +0 +2 +0 +0 +3 +0 +0 +3 +2 +4 +0 +4 +1 +1 +4 +3 +0 +0 +3 +0 +4 +3 +0 +0 +1 +0 +2 +0 +3 +4 +4 +2 +0 +0 +0 +3 +0 +4 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +0 +1 +0 +0 +3 +1 +0 +4 +0 +0 +4 +0 +0 +0 +0 +0 +4 +0 +3 +2 +0 +0 +0 +0 +2 +0 +4 +0 +0 +0 +2 +3 +4 +0 +1 +4 +0 +0 +0 +0 +0 +3 +2 +2 +0 +0 +1 +3 +1 +2 +4 +4 +0 +0 +2 +1 +2 +2 +0 +3 +4 +2 +4 +4 +0 +0 +0 +4 +2 +0 +2 +4 +0 +0 +0 +0 +1 +2 +2 +0 +3 +3 +0 +4 +2 +0 +3 +0 +3 +0 +3 +4 +3 +1 +2 +2 +0 +2 +2 +0 +0 +0 +1 +1 +2 +0 +2 +1 +0 +1 +4 +4 +1 +1 +4 +0 +3 +3 +0 +0 +2 +2 +2 +4 +0 +4 +3 +3 +3 +3 +0 +0 +0 +4 +0 +2 +0 +2 +3 +0 +1 +0 +0 +0 +0 +0 +3 +0 +1 +2 +0 +0 +3 +3 +3 +0 +0 +3 +1 +2 +0 +0 +2 +0 +1 +0 +4 +0 +2 +3 +0 +4 +0 +4 +4 +3 +0 +0 +1 +0 +0 +4 +3 +0 +1 +4 +4 +4 +1 +0 +1 +0 +0 +4 +1 +1 +4 +3 +2 +0 +2 +0 +1 +2 +3 +4 +4 +1 +0 +1 +4 +3 +0 +4 +3 +0 +3 +0 +2 +0 +0 +4 +0 +0 +2 +3 +3 +3 +1 +4 +4 +2 +3 +3 +0 +0 +1 +2 +0 +0 +1 +1 +0 +4 +0 +2 +0 +4 +1 +3 +1 +1 +0 +0 +0 +0 +0 +0 +0 +1 +4 +0 +2 +1 +4 +0 +0 +3 +0 +1 +2 +1 +0 +4 +4 +0 +2 +0 +1 +2 +1 +2 +1 +2 +0 +1 +1 +4 +4 +0 +1 +1 +0 +2 +3 +0 +4 +2 +3 +1 +3 +1 +2 +1 +0 +2 +1 +2 +2 +2 +3 +1 +0 +0 +0 +3 +3 +0 +3 +0 +0 +3 +0 +0 +1 +0 +0 +4 +4 +4 +0 +2 +1 +0 +0 +2 +4 +3 +3 +2 +2 +0 +0 +4 +1 +1 +0 +1 +0 +2 +0 +0 +1 +0 +3 +3 +0 +0 +0 +1 +0 +2 +0 +0 +0 +0 +0 +0 +4 +4 +0 +3 +0 +0 +0 +1 +0 +3 +0 +0 +4 +0 +3 +0 +1 +3 +0 +1 +3 +1 +4 +2 +0 +3 +2 +1 +1 +0 +0 +0 +0 +2 +2 +0 +0 +4 +4 +1 +0 +0 +2 +0 +4 +0 +3 +4 +2 +1 +1 +4 +4 +0 +0 +0 +0 +4 +1 +3 +0 +0 +3 +3 +3 +3 +1 +4 +3 +0 +3 +0 +2 +2 +1 +3 +0 +0 +4 +0 +1 +1 +3 +0 +0 +1 +2 +4 +2 +1 +0 +0 +0 +0 +4 +0 +4 +2 +3 +0 +0 +2 +0 +3 +4 +4 +2 +0 +0 +1 +0 +2 +1 +4 +4 +1 +0 +4 +0 +0 +0 +0 +0 +2 +2 +2 +3 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +1 +3 +3 +2 +0 +0 +0 +1 +1 +1 +4 +0 +4 +4 +0 +3 +3 +4 +0 +0 +0 +1 +3 +2 +0 +0 +0 +2 +4 +0 +3 +0 +0 +0 +0 +0 +0 +1 +0 +4 +1 +3 +4 +2 +0 +0 +3 +1 +1 +0 +3 +2 +3 +0 +3 +1 +1 +4 +3 +0 +0 +0 +3 +4 +4 +3 +4 +4 +1 +1 +2 +3 +2 +2 +2 +0 +0 +0 +2 +3 +4 +3 +2 +1 +3 +2 +1 +3 +1 +0 +1 +0 +1 +3 +4 +2 +3 +3 +1 +0 +4 +0 +1 +1 +2 +4 +3 +4 +0 +1 +3 +3 +0 +4 +3 +3 +0 +2 +4 +2 +4 +0 +0 +0 +4 +4 +1 +1 +0 +3 +0 +0 +0 +3 +3 +0 +0 +3 +0 +0 +1 +0 +0 +0 +4 +0 +0 +0 +4 +4 +3 +0 +3 +0 +0 +0 +3 +3 +0 +0 +0 +4 +1 +2 +1 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +2 +0 +1 +3 +0 +0 +1 +0 +2 +4 +0 +0 +3 +1 +3 +0 +0 +3 +1 +0 +3 +4 +0 +4 +0 +0 +0 +3 +1 +2 +0 +0 +0 +0 +1 +1 +2 +1 +0 +0 +2 +4 +0 +4 +1 +4 +1 +2 +4 +2 +4 +0 +1 +0 +0 +0 +4 +0 +1 +0 +0 +1 +0 +0 +2 +3 +0 +0 +2 +0 +3 +4 +0 +1 +4 +0 +0 +0 +0 +0 +1 +0 +3 +0 +3 +0 +2 +4 +2 +0 +3 +0 +1 +2 +1 +3 +4 +1 +3 +0 +0 +0 +4 +0 +4 +4 +0 +3 +0 +3 +2 +3 +4 +0 +0 +0 +3 +0 +1 +4 +1 +1 +0 +0 +4 +0 +0 +0 +0 +2 +1 +0 +0 +0 +0 +1 +2 +0 +1 +1 +0 +0 +1 +2 +0 +4 +0 +1 +3 +0 +3 +4 +2 +0 +0 +1 +3 +4 +0 +0 +1 +0 +1 +2 +0 +0 +4 +0 +0 +1 +4 +4 +2 +3 +0 +0 +0 +2 +0 +3 +1 +0 +4 +1 +0 +0 +3 +1 +0 +0 +3 +1 +0 +0 +2 +3 +4 +4 +2 +1 +1 +0 +4 +2 +0 +0 +0 +4 +0 +4 +3 +4 +0 +0 +1 +2 +4 +1 +0 +1 +2 +0 +0 +0 +0 +1 +0 +2 +4 +0 +2 +0 +0 +4 +4 +2 +0 +0 +1 +0 +0 +4 +3 +0 +1 +0 +0 +0 +2 +4 +0 +3 +0 +0 +3 +1 +3 +3 +0 +0 +1 +0 +0 +0 +2 +3 +0 +0 +1 +0 +4 +3 +0 +0 +4 +1 +4 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +1 +1 +0 +1 +2 +4 +0 +0 +0 +0 +0 +0 +1 +0 +2 +1 +0 +0 +0 +3 +0 +3 +0 +0 +0 +0 +0 +4 +0 +3 +1 +0 +0 +4 +0 +1 +0 +4 +0 +4 +0 +0 +0 +0 +0 +3 +1 +0 +3 +0 +1 +0 +0 +2 +4 +0 +4 +2 +4 +4 +1 +3 +2 +3 +0 +4 +3 +1 +2 +3 +0 +1 +1 +3 +3 +1 +0 +0 +1 +4 +0 +2 +0 +0 +0 +0 +1 +4 +0 +0 +4 +4 +2 +4 +0 +0 +2 +0 +0 +0 +0 +3 +2 +2 +2 +0 +4 +2 +3 +1 +2 +0 +3 +3 +2 +0 +1 +0 +0 +0 +3 +2 +3 +0 +2 +3 +0 +0 +3 +0 +0 +4 +1 +0 +0 +3 +2 +0 +1 +1 +3 +4 +0 +1 +0 +0 +4 +0 +2 +0 +4 +0 +0 +1 +0 +2 +3 +2 +0 +0 +0 +1 +2 +1 +2 +0 +2 +3 +1 +4 +4 +1 +3 +3 +2 +3 +3 +0 +0 +3 +1 +1 +1 +0 +0 +4 +1 +4 +3 +1 +0 +0 +1 +0 +0 +0 +3 +0 +0 +4 +4 +0 +2 +3 +0 +4 +4 +2 +3 +0 +0 +0 +4 +4 +0 +0 +2 +0 +0 +0 +4 +2 +2 +0 +3 +4 +1 +2 +0 +4 +2 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +3 +3 +0 +2 +0 +2 +0 +2 +0 +0 +0 +0 +0 +1 +0 +1 +0 +4 +0 +2 +3 +1 +1 +4 +4 +0 +0 +0 +0 +2 +3 +0 +0 +2 +2 +0 +4 +0 +0 +2 +0 +2 +3 +1 +0 +4 +2 +4 +0 +1 +0 +1 +2 +4 +1 +1 +2 +0 +0 +0 +2 +0 +0 +1 +3 +0 +0 +4 +0 +0 +4 +0 +1 +0 +4 +1 +0 +0 +2 +2 +0 +2 +0 +0 +0 +2 +0 +0 +3 +2 +0 +0 +2 +4 +2 +0 +0 +1 +0 +3 +0 +2 +3 +0 +1 +0 +3 +4 +2 +0 +2 +0 +3 +0 +2 +4 +1 +0 +4 +3 +0 +0 +2 +0 +0 +0 +3 +2 +0 +1 +4 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +1 +4 +2 +4 +0 +1 +4 +0 +4 +0 +0 +0 +0 +0 +0 +4 +0 +0 +0 +4 +3 +0 +1 +0 +3 +0 +2 +3 +4 +3 +0 +3 +0 +2 +0 +0 +2 +0 +4 +2 +0 +0 +1 +3 +3 +1 +0 +0 +0 +0 +4 +0 +2 +3 +0 +0 +0 +2 +0 +0 +0 +3 +0 +1 +0 +0 +1 +0 +4 +0 +0 +3 +2 +0 +0 +0 +0 +2 +2 +1 +0 +0 +3 +1 +0 +0 +0 +4 +2 +0 +4 +0 +3 +2 +1 +0 +4 +1 +3 +1 +0 +0 +2 +0 +2 +0 +0 +2 +3 +3 +1 +1 +1 +0 +0 +2 +3 +1 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +3 +4 +4 +1 +4 +0 +2 +0 +4 +0 +0 +2 +2 +1 +2 +0 +3 +3 +0 +1 +0 +1 +2 +0 +4 +3 +0 +0 +2 +0 +0 +2 +1 +0 +0 +2 +0 +2 +1 +1 +0 +3 +0 +0 +0 +4 +0 +0 +0 +0 +3 +0 +0 +3 +0 +4 +0 +2 +2 +0 +0 +4 +1 +0 +4 +3 +0 +0 +1 +4 +3 +0 +2 +1 +0 +0 +1 +2 +0 +1 +1 +0 +2 +3 +0 +3 +4 +1 +3 +0 +0 +1 +0 +3 +4 +3 +0 +1 +3 +0 +3 +0 +0 +2 +0 +0 +3 +0 +4 +0 +0 +1 +2 +4 +4 +4 +0 +0 +1 +3 +2 +0 +1 +1 +2 +2 +4 +0 +0 +3 +0 +3 +0 +0 +3 +4 +1 +1 +0 +0 +2 +0 +0 +4 +2 +3 +0 +3 +2 +0 +2 +0 +1 +0 +1 +0 +0 +3 +1 +2 +3 +0 +0 +1 +2 +1 +0 +4 +0 +4 +0 +3 +2 +1 +4 +0 +3 +1 +2 +0 +0 +1 +0 +4 +0 +4 +1 +4 +4 +2 +2 +4 +3 +0 +2 +3 +3 +0 +1 +2 +4 +3 +0 +3 +0 +2 +4 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +3 +3 +1 +0 +0 +0 +0 +0 +1 +2 +0 +0 +4 +2 +2 +1 +4 +1 +0 +1 +2 +2 +1 +1 +3 +3 +4 +1 +1 +0 +4 +0 +0 +3 +0 +4 +3 +2 +0 +4 +4 +0 +3 +0 +0 +0 +1 +1 +0 +0 +4 +0 +0 +1 +0 +0 +0 +0 +1 +3 +0 +0 +0 +0 +0 +0 +1 +4 +4 +2 +4 +2 +0 +0 +0 +0 +2 +0 +0 +2 +0 +0 +2 +4 +1 +2 +2 +3 +3 +0 +1 +4 +4 +1 +3 +3 +1 +0 +2 +2 +4 +2 +0 +4 +0 +2 +2 +0 +0 +1 +1 +1 +2 +0 +3 +0 +0 +2 +0 +0 +0 +0 +1 +0 +1 +2 +1 +0 +0 +2 +4 +1 +0 +4 +1 +0 +0 +0 +0 +0 +1 +0 +2 +0 +0 +0 +4 +3 +1 +0 +0 +3 +4 +2 +2 +0 +2 +1 +0 +0 +0 +1 +2 +2 +2 +1 +2 +0 +4 +0 +0 +0 +0 +0 +4 +2 +0 +4 +3 +0 +0 +3 +0 +4 +2 +4 +0 +1 +0 +0 +0 +3 +2 +1 +0 +3 +4 +4 +0 +0 +0 +4 +4 +0 +0 +1 +0 +0 +2 +1 +1 +3 +1 +1 +0 +1 +0 +1 +1 +0 +2 +2 +0 +0 +0 +4 +0 +0 +0 +0 +4 +2 +0 +4 +0 +3 +0 +2 +0 +0 +3 +3 +4 +0 +0 +2 +0 +0 +1 +0 +1 +1 +4 +0 +0 +0 +0 +3 +0 +3 +4 +2 +3 +1 +4 +0 +2 +1 +0 +0 +1 +0 +1 +0 +2 +2 +2 +2 +3 +0 +3 +3 +0 +3 +0 +0 +2 +0 +0 +0 +3 +2 +2 +0 +0 +3 +0 +2 +0 +2 +2 +0 +1 +1 +3 +0 +2 +0 +4 +2 +1 +0 +0 +3 +3 +2 +0 +1 +1 +1 +0 +4 +4 +2 +3 +3 +0 +0 +3 +3 +0 +4 +4 +1 +1 +1 +2 +0 +1 +1 +0 +0 +0 +2 +0 +1 +2 +1 +0 +0 +2 +0 +0 +2 +3 +1 +3 +1 +4 +0 +4 +3 +3 +4 +4 +0 +2 +2 +0 +0 +3 +3 +0 +3 +2 +0 +3 +0 +3 +3 +4 +0 +0 +3 +4 +0 +3 +3 +4 +2 +1 +3 +3 +2 +0 +4 +1 +1 +0 +4 +3 +0 +0 +0 +0 +2 +4 +1 +1 +1 +4 +0 +0 +1 +1 +0 +4 +0 +3 +1 +2 +4 +4 +4 +2 +4 +4 +3 +0 +0 +3 +0 +0 +2 +0 +0 +0 +1 +0 +3 +0 +1 +1 +0 +3 +2 +0 +3 +0 +0 +2 +0 +3 +1 +3 +0 +0 +4 +0 +2 +3 +4 +0 +0 +2 +0 +4 +3 +1 +4 +0 +2 +1 +0 +4 +0 +1 +3 +0 +0 +0 +1 +0 +2 +0 +2 +0 +3 +0 +1 +0 +0 +4 +0 +2 +0 +0 +0 +0 +0 +3 +0 +3 +0 +2 +0 +0 +0 +0 +2 +4 +0 +0 +3 +4 +3 +0 +0 +2 +0 +1 +0 +2 +0 +3 +2 +2 +3 +3 +4 +0 +4 +0 +3 +2 +1 +0 +4 +0 +0 +1 +2 +0 +0 +3 +0 +0 +4 +1 +1 +0 +0 +3 +1 +0 +1 +1 +4 +0 +0 +0 +0 +4 +1 +0 +2 +0 +0 +0 +4 +0 +0 +4 +4 +0 +1 +0 +2 +2 +4 +0 +2 +3 +3 +1 +0 +0 +4 +0 +1 +0 +0 +0 +0 +0 +1 +3 +1 +4 +0 +0 +1 +0 +0 +2 +1 +0 +0 +3 +4 +1 +0 +0 +3 +0 +2 +3 +4 +4 +0 +2 +0 +3 +0 +0 +3 +2 +0 +3 +0 +1 +3 +4 +0 +1 +4 +0 +0 +3 +2 +4 +0 +3 +0 +4 +3 +1 +2 +1 +2 +0 +0 +2 +0 +4 +3 +0 +2 +4 +0 +4 +0 +2 +0 +2 +0 +0 +4 +4 +2 +0 +2 +3 +0 +0 +0 +1 +1 +2 +0 +0 +3 +0 +0 +4 +0 +0 +0 +3 +0 +2 +4 +4 +0 +0 +0 +0 +0 +0 +2 +4 +4 +4 +4 +0 +3 +3 +0 +3 +1 +4 +0 +3 +0 +4 +0 +0 +2 +0 +3 +0 +0 +2 +0 +0 +2 +0 +3 +4 +0 +4 +0 +0 +0 +3 +3 +4 +2 +0 +1 +2 +4 +1 +1 +3 +0 +0 +3 +2 +3 +3 +1 +4 +1 +2 +2 +1 +2 +4 +0 +0 +3 +4 +4 +4 +1 +0 +0 +3 +0 +0 +1 +0 +3 +0 +0 +0 +3 +3 +2 +4 +0 +0 +4 +0 +0 +0 +4 +3 +4 +4 +0 +4 +0 +0 +1 +0 +2 +0 +1 +1 +0 +4 +4 +0 +2 +0 +3 +0 +2 +2 +0 +0 +0 +0 +0 +4 +1 +0 +0 +0 +4 +0 +4 +0 +0 +0 +0 +0 +0 +0 +2 +3 +1 +0 +3 +3 +0 +0 +3 +4 +0 +2 +0 +3 +3 +0 +1 +1 +2 +4 +0 +0 +4 +0 +3 +0 +1 +3 +0 +1 +0 +0 +0 +0 +4 +1 +0 +0 +0 +4 +3 +1 +0 +0 +3 +2 +4 +1 +3 +3 +4 +0 +4 +0 +4 +0 +4 +0 +0 +4 +2 +0 +2 +2 +1 +2 +1 +3 +0 +4 +0 +4 +0 +1 +0 +4 +0 +0 +4 +2 +0 +1 +1 +0 +3 +4 +2 +3 +3 +0 +3 +1 +3 +0 +2 +0 +0 +2 +1 +0 +0 +3 +3 +0 +1 +2 +0 +0 +3 +3 +0 +2 +2 +0 +1 +0 +3 +0 +4 +0 +2 +0 +4 +2 +2 +0 +0 +3 +0 +1 +3 +0 +1 +0 +4 +3 +0 +0 +3 +0 +4 +1 +4 +0 +2 +1 +0 +0 +1 +1 +3 +0 +0 +1 +0 +3 +3 +4 +3 +0 +2 +0 +0 +4 +0 +0 +2 +0 +1 +2 +0 +0 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +0 +4 +0 +1 +2 +2 +0 +1 +0 +0 +0 +1 +1 +0 +0 +4 +0 +0 +3 +0 +4 +0 +2 +0 +0 +0 +2 +2 +2 +3 +3 +0 +0 +0 +1 +2 +1 +4 +0 +0 +0 +1 +2 +0 +0 +3 +0 +4 +1 +1 +3 +3 +4 +0 +0 +0 +1 +0 +4 +0 +2 +3 +1 +2 +2 +4 +0 +3 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +0 +0 +3 +0 +1 +3 +4 +1 +1 +4 +0 +3 +2 +0 +1 +0 +3 +0 +4 +3 +3 +2 +0 +2 +0 +4 +3 +0 +0 +3 +2 +3 +3 +2 +1 +0 +3 +2 +0 +1 +2 +1 +3 +2 +2 +0 +1 +0 +3 +0 +0 +0 +4 +2 +3 +0 +4 +0 +0 +3 +0 +0 +4 +2 +0 +3 +0 +0 +3 +1 +4 +3 +3 +3 +4 +3 +2 +3 +0 +2 +0 +3 +3 +0 +2 +3 +3 +4 +0 +2 +4 +0 +0 +0 +0 +2 +0 +0 +0 +1 +0 +3 +0 +1 +2 +0 +2 +1 +3 +4 +0 +0 +0 +0 +2 +0 +0 +0 +2 +0 +4 +0 +1 +0 +1 +0 +2 +4 +0 +1 +0 +1 +0 +4 +1 +0 +2 +0 +0 +2 +4 +2 +3 +2 +0 +0 +0 +1 +1 +0 +4 +0 +3 +4 +0 +2 +4 +0 +3 +0 +2 +0 +0 +0 +0 +0 +1 +0 +4 +0 +0 +0 +3 +0 +0 +1 +3 +2 +0 +2 +1 +2 +2 +3 +0 +0 +0 +4 +3 +3 +4 +4 +0 +4 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +1 +0 +0 +0 +4 +0 +2 +0 +3 +0 +4 +1 +4 +0 +0 +4 +3 +0 +0 +3 +1 +0 +4 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +3 +0 +2 +4 +0 +2 +0 +1 +3 +3 +0 +0 +4 +2 +3 +1 +1 +3 +3 +3 +1 +3 +3 +4 +2 +0 +2 +0 +4 +2 +2 +4 +4 +3 +0 +1 +3 +4 +0 +0 +1 +4 +1 +2 +0 +0 +2 +2 +0 +0 +4 +0 +0 +0 +1 +2 +1 +4 +0 +4 +1 +0 +0 +2 +0 +0 +4 +1 +3 +4 +0 +2 +1 +0 +0 +0 +3 +4 +0 +0 +0 +0 +1 +3 +0 +3 +4 +1 +0 +4 +3 +2 +0 +0 +3 +0 +0 +1 +0 +4 +2 +0 +2 +4 +0 +1 +0 +4 +3 +2 +0 +1 +0 +3 +3 +3 +0 +1 +0 +2 +0 +0 +1 +3 +3 +0 +4 +0 +3 +0 +3 +0 +4 +1 +1 +0 +3 +2 +0 +0 +4 +4 +3 +0 +2 +0 +0 +3 +0 +4 +0 +4 +0 +1 +3 +0 +3 +1 +2 +1 +2 +4 +3 +0 +2 +1 +0 +1 +0 +0 +0 +4 +0 +3 +0 +1 +0 +0 +0 +2 +0 +0 +4 +3 +4 +2 +1 +0 +1 +0 +4 +0 +4 +3 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +4 +0 +3 +1 +2 +1 +2 +0 +0 +4 +0 +0 +0 +2 +3 +0 +3 +0 +1 +0 +0 +2 +0 +0 +4 +3 +3 +0 +0 +2 +4 +0 +4 +0 +0 +0 +3 +1 +0 +1 +0 +0 +0 +0 +0 +0 +4 +3 +1 +3 +3 +2 +2 +0 +3 +0 +3 +0 +1 +2 +4 +0 +1 +4 +2 +0 +0 +4 +2 +2 +4 +4 +0 +2 +4 +0 +0 +0 +3 +3 +0 +3 +0 +0 +3 +0 +1 +2 +0 +1 +1 +0 +2 +3 +3 +3 +0 +1 +0 +1 +0 +3 +0 +4 +1 +2 +4 +0 +0 +3 +0 +0 +0 +0 +3 +0 +3 +3 +4 +2 +3 +0 +2 +0 +2 +2 +2 +0 +4 +0 +2 +0 +0 +0 +0 +4 +1 +1 +2 +0 +4 +0 +1 +0 +4 +3 +0 +0 +1 +0 +0 +0 +4 +0 +2 +2 +0 +2 +1 +0 +0 +4 +2 +0 +4 +4 +3 +0 +2 +4 +3 +0 +4 +1 +3 +0 +0 +1 +4 +1 +4 +0 +3 +0 +3 +3 +0 +4 +0 +3 +0 +0 +4 +2 +1 +4 +4 +0 +3 +2 +0 +4 +0 +4 +0 +2 +1 +0 +0 +2 +0 +0 +1 +2 +4 +1 +0 +0 +4 +0 +0 +0 +1 +0 +0 +0 +0 +1 +0 +0 +1 +4 +0 +0 +0 +0 +2 +2 +1 +0 +3 +3 +3 +0 +3 +2 +0 +0 +2 +3 +4 +0 +3 +0 +3 +1 +2 +1 +1 +0 +3 +4 +1 +0 +4 +4 +1 +4 +0 +2 +0 +0 +0 +3 +0 +0 +2 +3 +0 +2 +3 +4 +0 +4 +4 +0 +4 +0 +4 +2 +1 +3 +0 +0 +0 +4 +4 +0 +1 +4 +1 +0 +0 +4 +0 +4 +0 +0 +1 +0 +2 +0 +4 +0 +2 +1 +2 +0 +0 +3 +1 +0 +2 +0 +1 +0 +0 +0 +0 +4 +2 +1 +1 +0 +1 +4 +0 +0 +2 +3 +3 +0 +3 +2 +0 +0 +0 +4 +0 +0 +0 +4 +2 +2 +4 +4 +0 +2 +0 +0 +0 +3 +0 +4 +4 +0 +3 +1 +0 +4 +0 +0 +0 +3 +2 +3 +4 +3 +1 +3 +0 +0 +2 +2 +0 +0 +0 +4 +2 +3 +0 +4 +4 +4 +4 +1 +3 +2 +3 +3 +0 +2 +2 +2 +2 +4 +2 +0 +0 +0 +3 +0 +2 +2 +0 +4 +2 +0 +2 +3 +2 +4 +0 +4 +1 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +4 +0 +4 +0 +2 +0 +4 +3 +2 +0 +3 +0 +0 +0 +3 +2 +1 +4 +3 +1 +0 +0 +2 +3 +0 +1 +0 +1 +4 +3 +3 +0 +2 +0 +4 +0 +2 +0 +1 +4 +1 +3 +0 +2 +0 +0 +1 +3 +0 +2 +0 +0 +3 +1 +0 +2 +0 +4 +0 +0 +1 +0 +4 +4 +0 +0 +4 +3 +0 +0 +1 +0 +0 +3 +0 +1 +0 +0 +0 +0 +4 +1 +0 +0 +2 +0 +0 +3 +3 +0 +0 +2 +3 +4 +3 +1 +4 +3 +2 +1 +1 +2 +0 +3 +2 +1 +0 +0 +0 +4 +0 +1 +2 +0 +0 +1 +0 +0 +0 +1 +1 +4 +0 +0 +0 +0 +0 +1 +3 +0 +0 +0 +2 +0 +0 +3 +0 +0 +2 +4 +2 +3 +3 +0 +4 +0 +0 +2 +4 +0 +2 +3 +0 +0 +0 +4 +2 +0 +3 +0 +0 +2 +0 +4 +0 +1 +2 +2 +0 +2 +0 +0 +3 +0 +0 +4 +0 +1 +0 +0 +3 +0 +3 +0 +0 +3 +4 +0 +4 +1 +0 +3 +0 +0 +1 +1 +3 +4 +0 +0 +3 +1 +0 +2 +2 +0 +0 +0 +0 +2 +0 +0 +1 +0 +2 +4 +3 +1 +0 +0 +0 +3 +0 +1 +4 +0 +0 +4 +0 +0 +0 +0 +0 +0 +0 +4 +0 +0 +4 +0 +2 +2 +2 +1 +2 +0 +0 +3 +4 +1 +4 +2 +2 +4 +1 +4 +1 +2 +0 +0 +0 +0 +1 +2 +3 +4 +0 +2 +0 +0 +0 +3 +0 +3 +0 +0 +0 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +0 +0 +2 +0 +2 +0 +4 +0 +0 +0 +0 +4 +2 +1 +2 +0 +2 +0 +3 +0 +0 +0 +1 +4 +1 +2 +0 +1 +4 +0 +1 +4 +4 +0 +2 +0 +0 +0 +1 +0 +2 +0 +0 +0 +3 +1 +0 +2 +2 +4 +0 +4 +4 +2 +4 +0 +0 +0 +4 +1 +0 +0 +3 +2 +3 +1 +1 +2 +4 +3 +1 +4 +0 +0 +4 +3 +0 +0 +1 +0 +0 +1 +3 +0 +1 +3 +1 +4 +0 +3 +3 +0 +0 +1 +0 +4 +0 +0 +2 +2 +0 +3 +0 +0 +4 +0 +0 +4 +3 +3 +0 +4 +3 +2 +0 +1 +0 +0 +4 +2 +0 +0 +0 +0 +3 +3 +3 +4 +3 +2 +0 +0 +4 +2 +0 +2 +3 +1 +1 +0 +0 +3 +0 +2 +3 +1 +0 +0 +0 +0 +0 +2 +0 +1 +4 +0 +3 +3 +0 +1 +0 +2 +0 +0 +0 +0 +0 +4 +3 +1 +0 +0 +1 +3 +2 +0 +0 +4 +0 +4 +0 +1 +0 +2 +3 +0 +4 +0 +1 +0 +3 +0 +3 +4 +0 +0 +1 +2 +3 +4 +1 +4 +0 +1 +4 +3 +0 +0 +0 +4 +2 +2 +0 +4 +0 +0 +1 +3 +2 +1 +0 +2 +1 +0 +4 +1 +0 +1 +1 +3 +0 +3 +4 +1 +2 +0 +4 +1 +0 +0 +2 +4 +4 +0 +3 +1 +0 +4 +4 +2 +3 +1 +0 +0 +3 +0 +1 +0 +3 +1 +2 +3 +0 +4 +0 +3 +4 +4 +3 +1 +3 +1 +4 +3 +2 +0 +2 +4 +0 +2 +0 +3 +0 +4 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +4 +4 +0 +0 +3 +4 +0 +0 +3 +1 +2 +0 +4 +2 +0 +0 +0 +0 +4 +2 +0 +0 +1 +0 +2 +2 +2 +0 +1 +1 +0 +2 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +4 +4 +4 +0 +3 +0 +0 +1 +1 +0 +0 +0 +1 +4 +4 +0 +3 +1 +3 +1 +0 +0 +2 +4 +0 +4 +0 +2 +3 +1 +3 +3 +3 +0 +0 +4 +4 +1 +2 +0 +1 +0 +2 +2 +0 +1 +4 +2 +0 +0 +0 +0 +0 +4 +0 +1 +3 +4 +0 +3 +1 +2 +4 +0 +1 +3 +1 +2 +3 +0 +4 +3 +0 +2 +0 +0 +0 +1 +2 +2 +4 +0 +3 +0 +0 +4 +2 +3 +1 +3 +4 +0 +0 +0 +0 +4 +3 +0 +4 +0 +0 +4 +4 +0 +2 +0 +0 +0 +4 +3 +0 +0 +1 +0 +2 +4 +0 +2 +4 +2 +1 +0 +3 +4 +0 +0 +0 +0 +0 +2 +4 +3 +0 +3 +0 +4 +3 +0 +1 +0 +2 +2 +3 +2 +0 +2 +3 +0 +3 +0 +2 +2 +1 +1 +2 +0 +0 +2 +0 +1 +1 +3 +3 +0 +0 +1 +0 +1 +3 +3 +0 +0 +2 +0 +2 +4 +1 +4 +0 +1 +0 +1 +4 +0 +4 +1 +4 +2 +0 +0 +0 +1 +0 +0 +2 +0 +0 +4 +3 +0 +3 +4 +3 +4 +1 +4 +3 +2 +4 +4 +0 +0 +1 +0 +0 +0 +4 +0 +3 +3 +0 +0 +4 +0 +1 +1 +1 +0 +3 +3 +3 +1 +3 +1 +1 +0 +0 +0 +0 +0 +4 +4 +4 +0 +3 +4 +0 +3 +0 +0 +2 +1 +4 +0 +0 +0 +2 +4 +2 +2 +0 +0 +4 +3 +2 +0 +1 +4 +4 +4 +0 +2 +0 +2 +1 +0 +3 +0 +1 +3 +2 +1 +4 +0 +0 +0 +0 +3 +2 +0 +0 +2 +3 +0 +2 +1 +4 +2 +0 +0 +3 +3 +0 +0 +0 +1 +0 +4 +0 +2 +1 +0 +2 +1 +0 +4 +4 +2 +2 +0 +0 +0 +3 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +1 +0 +3 +0 +3 +2 +2 +0 +4 +4 +2 +0 +0 +0 +1 +1 +0 +2 +2 +0 +1 +0 +2 +2 +4 +0 +3 +0 +1 +0 +4 +3 +3 +1 +4 +0 +0 +0 +1 +0 +0 +0 +3 +0 +1 +4 +4 +0 +4 +0 +2 +0 +0 +0 +3 +0 +4 +3 +4 +0 +0 +2 +2 +2 +0 +0 +3 +0 +3 +4 +0 +0 +1 +0 +1 +4 +4 +0 +3 +0 +0 +4 +0 +2 +0 +4 +0 +0 +4 +3 +3 +0 +2 +0 +2 +0 +3 +1 +0 +0 +2 +3 +0 +2 +3 +0 +2 +4 +0 +0 +0 +2 +0 +2 +3 +3 +0 +3 +0 +1 +4 +0 +0 +1 +2 +3 +1 +0 +1 +2 +0 +2 +0 +1 +4 +0 +0 +0 +0 +4 +0 +0 +0 +4 +4 +0 +3 +0 +0 +1 +4 +4 +0 +0 +3 +3 +3 +4 +0 +0 +0 +2 +0 +0 +4 +1 +0 +4 +3 +1 +3 +2 +4 +1 +0 +4 +4 +0 +0 +1 +3 +1 +0 +2 +1 +3 +0 +0 +2 +4 +4 +4 +0 +1 +0 +1 +0 +0 +0 +1 +2 +1 +1 +1 +0 +1 +3 +0 +0 +2 +0 +2 +4 +4 +1 +1 +1 +0 +0 +4 +3 +1 +4 +0 +0 +1 +0 +1 +1 +2 +3 +0 +1 +0 +3 +0 +3 +4 +0 +2 +0 +3 +3 +2 +1 +0 +1 +0 +0 +3 +0 +1 +3 +2 +1 +4 +1 +0 +1 +0 +0 +4 +2 +0 +4 +0 +0 +2 +1 +0 +1 +0 +0 +0 +0 +0 +3 +4 +1 +1 +4 +2 +0 +3 +0 +0 +0 +1 +4 +0 +0 +0 +0 +0 +4 +3 +3 +0 +4 +2 +1 +4 +0 +2 +4 +0 +2 +4 +3 +2 +3 +0 +0 +3 +1 +0 +0 +4 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +3 +0 +0 +0 +2 +2 +1 +0 +4 +4 +0 +0 +2 +0 +0 +1 +1 +1 +0 +0 +2 +1 +0 +0 +0 +3 +0 +3 +0 +0 +3 +2 +1 +0 +3 +1 +0 +0 +0 +2 +2 +0 +4 +0 +3 +1 +0 +0 +0 +3 +0 +1 +4 +3 +0 +2 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +3 +2 +3 +1 +4 +0 +0 +0 +0 +4 +4 +2 +0 +1 +0 +2 +0 +2 +0 +0 +0 +0 +1 +4 +2 +1 +0 +0 +0 +1 +0 +3 +2 +4 +3 +3 +4 +0 +0 +0 +0 +2 +4 +1 +1 +2 +2 +1 +0 +3 +4 +0 +3 +3 +3 +0 +2 +0 +0 +4 +0 +0 +4 +1 +0 +0 +0 +0 +4 +3 +0 +0 +0 +0 +1 +4 +0 +0 +0 +0 +2 +0 +4 +0 +0 +1 +0 +0 +0 +4 +0 +0 +3 +4 +2 +4 +2 +3 +0 +0 +1 +0 +0 +0 +0 +3 +4 +2 +0 +2 +2 +4 +3 +0 +0 +0 +0 +0 +1 +1 +1 +0 +0 +2 +0 +2 +2 +0 +0 +2 +0 +4 +0 +0 +0 +0 +0 +2 +0 +0 +0 +3 +0 +1 +0 +0 +0 +3 +0 +0 +0 +4 +0 +3 +3 +2 +0 +1 +0 +0 +0 +1 +0 +1 +4 +3 +0 +1 +0 +4 +0 +4 +1 +1 +1 +4 +0 +2 +0 +4 +0 +0 +0 +4 +0 +2 +0 +1 +2 +1 +0 +0 +1 +1 +4 +3 +0 +0 +0 +2 +0 +1 +1 +2 +0 +0 +3 +4 +0 +2 +0 +2 +1 +0 +3 +0 +0 +3 +0 +0 +2 +1 +0 +4 +3 +0 +3 +0 +0 +2 +2 +0 +4 +0 +3 +0 +1 +0 +0 +2 +0 +0 +0 +3 +0 +0 +0 +4 +1 +0 +1 +0 +0 +0 +0 +2 +0 +0 +4 +4 +0 +4 +0 +0 +2 +1 +0 +0 +0 +0 +3 +1 +4 +1 +0 +0 +0 +1 +0 +3 +1 +0 +0 +2 +0 +1 +1 +1 +1 +0 +0 +3 +4 +0 +0 +1 +1 +0 +2 +2 +0 +2 +3 +3 +0 +0 +2 +1 +0 +2 +0 +4 +2 +0 +3 +2 +0 +0 +1 +2 +0 +3 +0 +2 +3 +4 +0 +3 +1 +0 +2 +2 +4 +4 +1 +0 +2 +3 +4 +4 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +3 +4 +0 +1 +3 +1 +0 +2 +2 +0 +0 +0 +0 +4 +1 +0 +0 +3 +0 +2 +3 +0 +0 +4 +0 +0 +0 +0 +2 +4 +0 +0 +4 +4 +0 +4 +3 +0 +2 +2 +2 +0 +4 +0 +4 +4 +3 +0 +3 +0 +0 +1 +2 +0 +4 +0 +4 +0 +4 +4 +1 +1 +0 +0 +1 +1 +0 +4 +4 +0 +0 +0 +0 +0 +2 +2 +0 +4 +0 +0 +0 +0 +1 +3 +2 +0 +0 +1 +1 +2 +0 +0 +0 +0 +0 +0 +2 +3 +0 +0 +3 +0 +0 +0 +1 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +3 +1 +2 +0 +0 +1 +3 +3 +1 +0 +3 +2 +0 +0 +0 +1 +3 +3 +0 +0 +4 +0 +0 +0 +0 +4 +1 +2 +2 +0 +0 +0 +3 +0 +3 +0 +0 +3 +3 +0 +0 +0 +0 +2 +3 +1 +3 +4 +2 +0 +4 +0 +0 +0 +3 +0 +4 +4 +4 +3 +0 +4 +0 +3 +0 +0 +2 +4 +4 +0 +0 +1 +0 +0 +3 +3 +1 +1 +0 +1 +2 +0 +3 +3 +4 +4 +1 +3 +0 +1 +3 +2 +0 +0 +0 +0 +0 +4 +4 +1 +1 +0 +0 +0 +1 +4 +4 +2 +0 +3 +0 +3 +0 +0 +0 +4 +1 +4 +2 +0 +2 +2 +0 +4 +0 +0 +0 +0 +4 +1 +4 +0 +0 +0 +0 +0 +2 +2 +3 +2 +0 +0 +0 +2 +0 +2 +0 +0 +2 +0 +4 +1 +0 +2 +2 +3 +4 +3 +0 +2 +2 +0 +4 +4 +0 +0 +3 +2 +2 +0 +0 +2 +0 +0 +1 +2 +4 +0 +2 +1 +0 +2 +2 +0 +4 +4 +3 +0 +2 +0 +0 +1 +0 +0 +4 +1 +0 +2 +0 +0 +1 +2 +0 +0 +1 +0 +3 +0 +0 +4 +0 +0 +4 +3 +3 +0 +0 +4 +4 +3 +0 +1 +0 +2 +0 +0 +0 +0 +1 +4 +4 +4 +3 +4 +4 +0 +0 +1 +0 +3 +2 +4 +0 +0 +0 +4 +1 +0 +2 +2 +0 +3 +0 +0 +2 +0 +3 +0 +1 +0 +2 +3 +0 +2 +0 +1 +1 +2 +0 +3 +1 +2 +1 +0 +0 +2 +3 +0 +3 +0 +0 +1 +0 +0 +0 +2 +1 +3 +0 +1 +0 +0 +3 +0 +4 +3 +3 +1 +3 +0 +0 +1 +4 +2 +1 +2 +1 +0 +1 +0 +1 +4 +0 +4 +2 +0 +1 +2 +4 +3 +0 +1 +4 +1 +4 +0 +2 +0 +1 +0 +0 +2 +0 +0 +4 +1 +3 +1 +3 +3 +3 +2 +0 +4 +2 +0 +4 +1 +4 +1 +0 +0 +0 +3 +1 +2 +4 +0 +3 +0 +2 +0 +0 +2 +2 +0 +0 +0 +0 +4 +4 +0 +2 +2 +0 +1 +2 +0 +4 +0 +2 +2 +1 +0 +4 +0 +1 +0 +2 +3 +4 +0 +1 +4 +4 +0 +4 +3 +0 +0 +1 +4 +0 +4 +3 +3 +4 +0 +2 +0 +1 +1 +3 +2 +2 +0 +3 +0 +0 +2 +0 +2 +1 +2 +0 +2 +0 +0 +4 +4 +0 +4 +4 +0 +4 +0 +0 +0 +0 +0 +4 +3 +2 +0 +2 +0 +2 +4 +4 +1 +0 +0 +0 +3 +1 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +1 +4 +1 +4 +0 +2 +0 +1 +3 +0 +3 +3 +1 +2 +0 +1 +0 +1 +2 +2 +2 +0 +0 +0 +3 +0 +0 +0 +4 +2 +4 +0 +1 +3 +3 +3 +2 +4 +0 +0 +2 +0 +0 +1 +0 +4 +4 +0 +0 +0 +1 +4 +0 +3 +1 +2 +0 +0 +0 +3 +3 +3 +1 +0 +2 +0 +4 +0 +1 +0 +0 +0 +0 +4 +0 +4 +4 +0 +3 +4 +0 +4 +0 +0 +2 +2 +3 +3 +2 +1 +3 +2 +4 +0 +0 +0 +4 +3 +3 +0 +0 +0 +0 +3 +4 +3 +1 +2 +0 +4 +0 +0 +3 +0 +0 +1 +0 +3 +4 +0 +0 +2 +3 +2 +0 +3 +0 +0 +0 +3 +1 +0 +3 +0 +2 +1 +2 +1 +0 +0 +4 +0 +0 +0 +1 +2 +3 +0 +4 +0 +3 +3 +0 +1 +0 +1 +0 +0 +0 +1 +3 +0 +0 +0 +4 +0 +2 +4 +3 +0 +0 +0 +4 +3 +1 +2 +0 +0 +0 +0 +4 +4 +3 +0 +3 +0 +4 +0 +0 +0 +2 +2 +1 +0 +0 +2 +1 +0 +1 +0 +1 +3 +4 +3 +0 +0 +2 +0 +0 +4 +3 +1 +1 +3 +4 +3 +1 +3 +1 +0 +1 +4 +0 +3 +0 +0 +0 +0 +4 +1 +4 +4 +0 +4 +2 +4 +4 +3 +3 +1 +1 +0 +2 +3 +4 +2 +0 +3 +2 +0 +4 +2 +3 +3 +0 +2 +0 +0 +3 +0 +2 +3 +3 +0 +0 +2 +2 +0 +1 +0 +0 +1 +0 +0 +0 +3 +0 +4 +0 +2 +3 +0 +0 +4 +0 +1 +0 +0 +1 +0 +1 +0 +0 +0 +3 +0 +0 +0 +1 +0 +0 +3 +2 +0 +0 +2 +0 +0 +4 +0 +0 +0 +4 +2 +3 +0 +0 +0 +2 +0 +2 +0 +0 +4 +0 +0 +0 +3 +0 +0 +0 +4 +4 +0 +1 +2 +4 +0 +0 +1 +0 +1 +0 +1 +2 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +2 +0 +1 +4 +2 +1 +0 +1 +0 +0 +0 +4 +3 +0 +0 +0 +3 +1 +1 +0 +0 +1 +4 +0 +0 +0 +2 +2 +3 +0 +3 +0 +2 +0 +0 +0 +1 +2 +0 +0 +0 +2 +0 +4 +0 +3 +3 +1 +0 +4 +1 +0 +3 +0 +4 +1 +0 +4 +2 +1 +4 +3 +2 +3 +1 +2 +3 +3 +3 +0 +0 +3 +1 +1 +3 +0 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +0 +4 +4 +0 +0 +0 +4 +0 +0 +0 +2 +0 +0 +2 +0 +3 +3 +0 +0 +0 +2 +0 +4 +3 +0 +4 +2 +3 +2 +1 +3 +0 +0 +0 +0 +4 +0 +0 +2 +3 +2 +1 +1 +0 +3 +3 +0 +0 +1 +3 +4 +0 +0 +3 +3 +0 +0 +3 +0 +1 +0 +4 +3 +3 +0 +4 +0 +2 +0 +0 +0 +1 +1 +3 +2 +4 +0 +4 +4 +0 +2 +0 +4 +1 +2 +1 +2 +0 +2 +1 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +1 +0 +3 +3 +0 +0 +4 +3 +2 +3 +0 +0 +2 +2 +0 +3 +0 +2 +0 +3 +4 +0 +0 +0 +0 +4 +3 +0 +2 +0 +3 +0 +3 +0 +1 +4 +2 +0 +1 +4 +1 +4 +3 +3 +0 +4 +3 +4 +2 +0 +0 +4 +1 +1 +3 +4 +2 +3 +0 +2 +3 +0 +0 +0 +2 +4 +3 +0 +2 +0 +1 +2 +0 +3 +0 +0 +0 +0 +0 +4 +0 +0 +0 +2 +0 +2 +2 +3 +0 +0 +0 +0 +1 +3 +0 +2 +2 +0 +0 +0 +2 +0 +0 +2 +2 +1 +2 +0 +4 +0 +0 +0 +1 +0 +4 +3 +1 +2 +0 +3 +0 +2 +0 +1 +2 +0 +0 +4 +0 +0 +0 +0 +3 +0 +0 +1 +0 +0 +0 +3 +0 +2 +4 +2 +2 +0 +0 +4 +3 +0 +0 +4 +3 +3 +0 +0 +0 +0 +4 +0 +3 +0 +4 +2 +2 +3 +1 +4 +4 +0 +1 +0 +0 +0 +0 +3 +2 +1 +2 +0 +4 +0 +0 +0 +1 +0 +3 +0 +0 +1 +0 +1 +0 +0 +0 +0 +0 +4 +0 +4 +0 +1 +0 +0 +0 +0 +4 +1 +1 +0 +0 +0 +0 +4 +0 +0 +0 +1 +1 +0 +1 +0 +4 +0 +0 +2 +0 +1 +1 +2 +0 +2 +1 +1 +0 +0 +3 +0 +4 +0 +2 +0 +3 +4 +4 +1 +1 +0 +4 +4 +1 +0 +2 +0 +2 +0 +0 +0 +0 +0 +0 +4 +0 +4 +4 +3 +3 +3 +4 +0 +3 +3 +4 +1 +4 +1 +1 +0 +1 +0 +0 +4 +4 +2 +3 +0 +3 +0 +0 +0 +3 +2 +0 +4 +4 +0 +4 +0 +1 +1 +0 +0 +0 +1 +2 +0 +0 +4 +0 +0 +2 +3 +0 +0 +1 +0 +3 +3 +1 +4 +0 +0 +3 +4 +3 +0 +0 +0 +0 +2 +2 +2 +1 +1 +0 +3 +1 +3 +0 +3 +4 +1 +0 +1 +3 +3 +2 +1 +0 +0 +0 +0 +4 +2 +0 +2 +2 +0 +0 +0 +1 +3 +1 +0 +0 +1 +0 +0 +0 +0 +0 +0 +2 +2 +0 +1 +0 +0 +3 +0 +0 +0 +0 +1 +0 +1 +3 +3 +2 +1 +0 +3 +2 +0 +4 +0 +1 +0 +1 +0 +0 +4 +0 +2 +3 +0 +0 +0 +1 +0 +3 +3 +3 +4 +4 +0 +3 +2 +1 +2 +1 +0 +0 +3 +0 +3 +0 +0 +1 +2 +2 +3 +0 +4 +0 +1 +3 +0 +2 +3 +0 +0 +1 +0 +2 +0 +0 +3 +1 +4 +2 +0 +1 +3 +0 +2 +1 +4 +1 +2 +4 +1 +1 +4 +0 +3 +0 +1 +0 +1 +0 +3 +3 +0 +0 +0 +0 +4 +4 +4 +3 +0 +3 +1 +1 +2 +0 +4 +0 +3 +2 +3 +0 +2 +0 +4 +2 +0 +1 +2 +0 +0 +4 +0 +0 +0 +0 +3 +4 +0 +0 +4 +2 +4 +0 +0 +4 +0 +0 +4 +2 +0 +1 +3 +0 +1 +0 +4 +3 +3 +1 +2 +4 +0 +2 +1 +0 +4 +3 +0 +0 +0 +4 +4 +0 +0 +0 +4 +0 +0 +0 +0 +0 +0 +0 +2 +4 +0 +2 +0 +0 +3 +0 +0 +0 +4 +0 +0 +3 +3 +4 +3 +1 +0 +4 +0 +0 +1 +3 +0 +0 +4 +0 +1 +0 +0 +1 +1 +4 +0 +3 +0 +3 +0 +0 +0 +0 +3 +0 +0 +0 +0 +2 +2 +0 +0 +1 +3 +4 +0 +4 +0 +4 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +3 +4 +2 +1 +3 +0 +2 +1 +0 +0 +0 +0 +0 +3 +2 +4 +1 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +3 +4 +0 +4 +2 +0 +0 +0 +1 +1 +2 +0 +0 +4 +2 +1 +0 +1 +1 +1 +0 +0 +0 +4 +0 +4 +1 +0 +1 +1 +0 +2 +0 +0 +4 +2 +0 +0 +0 +0 +4 +0 +1 +2 +0 +3 +2 +2 +0 +4 +4 +1 +2 +3 +0 +0 +0 +0 +3 +0 +0 +3 +4 +4 +0 +1 +0 +3 +4 +0 +1 +0 +4 +3 +2 +2 +0 +0 +1 +2 +0 +0 +2 +4 +2 +2 +4 +0 +4 +3 +0 +1 +0 +4 +0 +0 +1 +1 +2 +0 +0 +1 +3 +0 +4 +0 +3 +0 +3 +0 +1 +2 +0 +0 +1 +2 +0 +4 +0 +1 +0 +4 +0 +1 +0 +0 +3 +3 +0 +0 +0 +4 +0 +0 +4 +2 +1 +4 +0 +1 +2 +1 +1 +4 +0 +4 +0 +1 +2 +0 +0 +0 +0 +4 +3 +2 +4 +0 +0 +4 +1 +0 +4 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +0 +2 +0 +2 +0 +4 +0 +4 +0 +2 +2 +0 +1 +3 +2 +0 +2 +1 +0 +3 +0 +1 +2 +0 +2 +4 +1 +0 +0 +1 +1 +1 +1 +2 +0 +0 +1 +4 +3 +0 +3 +3 +4 +0 +0 +2 +0 +1 +3 +2 +0 +0 +4 +1 +4 +0 +2 +0 +3 +0 +1 +0 +4 +4 +0 +1 +0 +1 +2 +0 +0 +3 +0 +2 +2 +3 +3 +3 +0 +0 +1 +0 +0 +1 +2 +0 +0 +0 +1 +0 +0 +0 +2 +4 +1 +1 +3 +1 +3 +4 +0 +0 +4 +1 +4 +3 +1 +0 +0 +0 +4 +0 +4 +1 +4 +0 +0 +0 +3 +0 +1 +3 +0 +2 +0 +0 +0 +0 +4 +0 +4 +0 +3 +1 +0 +3 +2 +0 +1 +0 +0 +0 +0 +0 +0 +4 +0 +4 +3 +0 +1 +1 +0 +3 +4 +1 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +4 +0 +4 +2 +0 +0 +1 +3 +3 +2 +0 +1 +0 +0 +3 +0 +1 +4 +4 +2 +4 +0 +4 +2 +1 +4 +0 +0 +1 +0 +0 +0 +2 +4 +2 +0 +1 +2 +0 +2 +4 +3 +0 +0 +3 +1 +0 +0 +0 +0 +1 +1 +0 +0 +0 +4 +0 +4 +3 +4 +0 +2 +0 +1 +3 +0 +1 +4 +0 +0 +0 +2 +0 +2 +1 +3 +0 +0 +0 +0 +0 +4 +4 +1 +3 +0 +0 +0 +0 +2 +1 +0 +2 +0 +0 +0 +2 +1 +0 +0 +1 +2 +0 +3 +0 +3 +0 +1 +1 +0 +1 +0 +0 +1 +2 +0 +0 +2 +2 +3 +2 +2 +0 +4 +1 +3 +0 +0 +1 +0 +0 +2 +2 +0 +4 +2 +0 +1 +4 +0 +3 +2 +0 +2 +0 +3 +0 +1 +0 +0 +0 +0 +3 +0 +0 +3 +1 +2 +0 +2 +1 +0 +1 +0 +0 +0 +4 +4 +0 +0 +0 +3 +4 +0 +2 +0 +0 +0 +2 +0 +0 +0 +3 +3 +3 +0 +0 +3 +3 +0 +0 +0 +0 +0 +2 +2 +0 +2 +0 +1 +3 +0 +0 +4 +0 +0 +0 +3 +2 +2 +2 +0 +3 +2 +4 +0 +3 +0 +0 +0 +3 +1 +0 +0 +0 +1 +4 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +0 +2 +0 +3 +3 +0 +1 +2 +0 +0 +4 +4 +0 +2 +4 +1 +0 +2 +4 +0 +0 +2 +0 +0 +2 +0 +1 +2 +3 +0 +0 +1 +4 +1 +2 +4 +0 +0 +2 +4 +0 +0 +2 +2 +2 +4 +2 +2 +0 +4 +3 +4 +0 +0 +0 +1 +2 +0 +4 +2 +4 +2 +0 +2 +0 +0 +2 +1 +1 +0 +3 +0 +0 +0 +4 +0 +0 +0 +3 +0 +0 +4 +3 +0 +0 +2 +0 +0 +0 +2 +0 +1 +1 +0 +0 +2 +0 +0 +1 +2 +3 +0 +0 +0 +0 +4 +2 +1 +0 +0 +0 +4 +0 +1 +3 +0 +0 +3 +4 +3 +1 +3 +4 +0 +0 +0 +0 +4 +1 +0 +4 +0 +3 +4 +1 +4 +2 +1 +2 +3 +1 +0 +2 +1 +4 +0 +1 +4 +3 +1 +3 +0 +1 +4 +1 +0 +3 +1 +0 +0 +3 +2 +4 +2 +1 +1 +0 +1 +0 +3 +0 +3 +3 +3 +0 +0 +2 +4 +0 +0 +0 +0 +3 +0 +2 +4 +0 +0 +0 +2 +0 +1 +4 +0 +4 +3 +1 +2 +2 +0 +3 +1 +0 +1 +0 +4 +3 +3 +0 +0 +0 +3 +4 +4 +1 +0 +3 +4 +4 +0 +0 +0 +0 +0 +4 +0 +1 +0 +4 +0 +2 +0 +4 +0 +2 +4 +4 +0 +0 +0 +1 +3 +0 +3 +1 +1 +3 +3 +0 +3 +3 +3 +0 +2 +0 +1 +0 +0 +0 +0 +0 +0 +1 +0 +0 +3 +0 +1 +0 +2 +0 +0 +1 +0 +2 +0 +3 +0 +0 +0 diff --git a/RHF_10000/test.sh b/RHF_10000/test.sh new file mode 100755 index 0000000..90bcc97 --- /dev/null +++ b/RHF_10000/test.sh @@ -0,0 +1,19 @@ +#!/bin/sh +#获取文件夹下所有文件 +# +folder="./Input_data/Data_10000/" +funcFolder="./routerFuncData/Function_10000/" + +softFolder=$(ls $folder) +for subFolder in ${softFolder} +do + # build the same dirs for funcFolder + # echo "subFolder: ${folder}${subFolder}" + sFile=$(ls ${folder}${subFolder}) + for inFIle in ${sFile} + do + # echo "inFIle: ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle}" + ./router_mega/Generate 1 ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle} -t + done +done + diff --git a/RHF_64/Input_data/generate_test_data.py b/RHF_64/Input_data/generate_test_data.py new file mode 100755 index 0000000..b30cd27 --- /dev/null +++ b/RHF_64/Input_data/generate_test_data.py @@ -0,0 +1,71 @@ +import sys +import math +import os +import random +import numpy as np + +# You need to generate different input IP files +# In this file, the input is set to IPV6 address as a string +# eg: "x.x.x.x.x.x.x.x", each "x" is a number from str(0) to str(15) +# "." does not appear in the string +# Total number of possible IP addesses is: d1 = 16*16*16*16*16*16*16*16 +# The function rand_ip(8) casts this IPv6 string with 8 chars into an integer +# maximum possible integer of rand_ip(8) would be: (2^32 - 1) +max_ip_num = 16 +# Set n value first +n = 10000 # each set has n input keys +z = 16 ## the name of the file would be 0000_1_54_4.txt + +# set the total number of key set +max_key_set = 1000 +# set the total number of test files +max_itr = 1 + +# generate a random IP address with length = l +# the random number for each 4bits follows uniform distribution +# In hardware, the input IPs do not need to be cast between data types, +# since they are always binary data +def rand_ip(l): + tmp_ip = int(random.uniform(0,max_ip_num)) + for s in range(l-1): + tmp_ip = tmp_ip*16 + int(random.uniform(0,max_ip_num)) + return tmp_ip +# # numpy random +# def np_rand_ip(l): +# tmp_ip = numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# for s in range(l-1): +# tmp_ip = tmp_ip*16 + numpy.random.uniform(0,high=max_ip_num,dtype='uint32') +# return tmp_ip + +if __name__=='__main__': + print('begin') + ################################ + ## curent folder + for folder_name in range(max_key_set): + cur_dir = "./Data_%d/%d"%(n,folder_name) + if not os.path.exists(cur_dir): + os.makedirs(cur_dir) + ip_list = [] + i = 0 + while(i < n): + ##for i in range(n): + ## generate 1 random IP + # 4 xxx IP strings + tmp_ip = str(rand_ip(z)) + if (tmp_ip not in ip_list): + # tmp_ip = np_rand_ip(4) # numpy version + ip_list.append(tmp_ip) + i += 1 + print('size of ip set is: ', len(ip_list)) + print('writing to txt file for folder %d...'%(folder_name)) + # divide the ip list into z group + # shuffle -> divide -> output + for itr in range(max_itr): + random.shuffle(ip_list) + fin = open("%s/key_0000_1_%d_%d__%s.txt"%(cur_dir,n,z,str(itr).zfill(6)),'w') + s = '\n' + fin.write(s.join(ip_list)) + fin.close() + print('finish all folders.') + + diff --git a/RHF_64/README.md b/RHF_64/README.md new file mode 100755 index 0000000..6f4c1d1 --- /dev/null +++ b/RHF_64/README.md @@ -0,0 +1,62 @@ +# RHF_64 +Routing Hash Function(RHF) is used to hash from 64-bit input IPs to output interface numbers. +The algorithm is used as the reference by HLS. +The construction result is not used by the original paper. + +# Implementation +## Compile program +``` +cd router_mega +cmake .. +make +``` + +## Used for single input file, commands in the router_mega folder +Specify the number of router(n = 1) first. +Only CTimer1 is working, which provides the RHF1 strategy for 64-bit input. +CTimer2 and CTimer3 are not working for now. + +To report construction time: + +`./Generate n FolderPath` + +For example, FOLDER_PATH="../Input_data/Data_10000" +To generate function: Specify an input file (input.txt) first, function.txt will be generated with parameters of RHF. + +`./Generate n input.txt function.txt` + +Test generated function: + +`./Generate n input.txt function.txt -t` + +The program use input.txt as test case, and check whether the generated RHF can map correctly. + +## Used for folder with multiple input files, commands in the RHF folder +Generate all function files in routerFuncData/ folder. By default, n is set to 1. + +`sh generate.sh` + +Test all function files for files in Input_data/, n is set to 1. + +`sh test.sh` + +# RTLP Results for RHF1 (10000 64 bit input IPs) +RHF algorithms are calculated as foolow: + +1, For construction time, 1000 experiments are conducted. The max time and average time are calculated. + +2, For storage cost, the source code of algorithms is analyzed and storage is estimated considering data structures used in construction steps. + +3, For function space, The storage is estimated with consideration of D[] and I[]. + +Method |AVG time(ms) |MAX time(ms) |Storage(Kb) |Function Space(Kb) +-------------|------------------|:-------------:|:-------------:|:---------: + + +The 64-bit RHF is designed only for hardware implementation on FPGA at the current stage. +The construction time of RHF1-64 is 3.36 ms. +More comparisons remains as a research direction in the future. + +# Citation +The current work is for IEEE TRANSACTIONS ON AEROSPACE AND ELECTRONIC SYSTEMS. +Any questions, please contact keran_zhang@outlook.com diff --git a/RHF_64/generate.sh b/RHF_64/generate.sh new file mode 100755 index 0000000..534b53d --- /dev/null +++ b/RHF_64/generate.sh @@ -0,0 +1,29 @@ +#!/bin/sh +#获取文件夹下所有文件 +# +folder="./Input_data/Data_10000/" +funcFolder="./routerFuncData/Function_10000/" + +if [ ! -d "$funcFolder" ];then +mkdir ${funcFolder} +echo "build ${funcFolder} successfull." +else +echo "${funcFolder} already exists, overwrite all files in it..." +fi +echo "" +softFolder=$(ls $folder) +for subFolder in ${softFolder} +do + # build the same dirs for funcFolder + # echo "subFolder: ${folder}${subFolder}" + if [ ! -d "${funcFolder}${subFolder}" ];then + mkdir ${funcFolder}${subFolder} + fi + sFile=$(ls ${folder}${subFolder}) + for inFIle in ${sFile} + do + # echo "inFIle: ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle}" + ./router_mega/Generate 1 ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle} + done +done + diff --git a/RHF_64/routerFuncData/README.md b/RHF_64/routerFuncData/README.md new file mode 100755 index 0000000..6e40b25 --- /dev/null +++ b/RHF_64/routerFuncData/README.md @@ -0,0 +1 @@ +This folder contains generated RHF function parameters. diff --git a/RHF_64/router_mega/Allocator.h b/RHF_64/router_mega/Allocator.h new file mode 100755 index 0000000..26a51e7 --- /dev/null +++ b/RHF_64/router_mega/Allocator.h @@ -0,0 +1,40 @@ +//--------------------------------------------------------------------------- +#ifndef AllocatorH +#define AllocatorH +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +enum TAllocConsts +{ +#ifdef __BORLANDC__ + acDefAlign = sizeof(int), +#else + acDefAlign = 32, +#endif +}; +//--------------------------------------------------------------------------- +class TAllocator +{ +public: + char *Malloc(size_t size,int align=acDefAlign); + char *Realloc(void *mem,size_t size,int align=acDefAlign,size_t oldSize=0); + void Free(void *mem); +}; +//--------------------------------------------------------------------------- +extern TAllocator defAllocator; +//--------------------------------------------------------------------------- +//#if !defined(WIN32) && !defined(_WIN32) +//#include +//#else +void *vmalloc(size_t sz); +void vfree(void *mem); +//#endif//WIN32 +//--------------------------------------------------------------------------- +void *vmallocReserve(size_t sz); +bool vmallocCommit(void* ptr,size_t sz); +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/AllocatorBase.cpp b/RHF_64/router_mega/AllocatorBase.cpp new file mode 100755 index 0000000..12bf882 --- /dev/null +++ b/RHF_64/router_mega/AllocatorBase.cpp @@ -0,0 +1,5 @@ +//---- -------------------------------------------------------------------------------------------------------- +#include "Allocator.h" +//---- -------------------------------------------------------------------------------------------------------- +TAllocator defAllocator; +//---- -------------------------------------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/AllocatorC.cpp b/RHF_64/router_mega/AllocatorC.cpp new file mode 100755 index 0000000..a9743ef --- /dev/null +++ b/RHF_64/router_mega/AllocatorC.cpp @@ -0,0 +1,44 @@ +//--------------------------------------------------------------------------- +#include "Allocator.h" +#include +#include +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +// If there is no suitable allocator, use the default C allocator. +//--------------------------------------------------------------------------- +char *TAllocator::Malloc(size_t size,int align) +{ + logEmbdMsg("Prepare alloc %d-byte memory of align %d.\r\n",(int)size,align); +// #ifndef __LSeRTOS__ +// assert(align<=(int)sizeof(int)); +// #endif // __LSeRTOS__ + return (char*)malloc(size); +} +//--------------------------------------------------------------------------- +char *TAllocator::Realloc(void *mem,size_t size,int align,size_t oldSize) +{ + logEmbdMsg("Realloc %d-byte memory of align %d.\r\n",(int)size,align); +#ifndef __LSeRTOS__ + if(align>(int)sizeof(void *)) + { + char *p = Malloc(size,align); + if(p==NULL) + return NULL; + //This is WRONG. We should query the actual size of mem. But we havn't that interface yet. + if(oldSize==0) + oldSize = size; + memcpy(p,mem,oldSize); + Free(mem); + return p; + } +#endif // __LSeRTOS__ + + return (char*)realloc(mem,size); +} +//--------------------------------------------------------------------------- +void TAllocator::Free(void *mem) +{ + free(mem); +} +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Array.h b/RHF_64/router_mega/Array.h new file mode 100755 index 0000000..71a670e --- /dev/null +++ b/RHF_64/router_mega/Array.h @@ -0,0 +1,320 @@ +#pragma once +#ifndef ArrayH +#define ArrayH +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +// #include "Mem/FastMem.h" +#include +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +#define __is_trivial(x) false +#endif// __BORLANDC__ +//#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#define DefCommArrMath(func,retType) \ + retType func(int64_t num=0) const \ + { \ + if(num<=0) \ + num = Number; \ + \ + return Arr##func(&ObjConst(0),num); \ + } +//--------------------------------------------------------------------------- +// Causion: only one-time allocated array's alignment is preserved! +// Any increasement with New() will break the alignment set by Alloc. +//--------------------------------------------------------------------------- +template +class TArraySafe:public TArrayPubBase +{ +protected: + virtual void CallConstructor(void *obj) const + { + new (obj) T; + } + + virtual void CallDestructor(void *obj) const + { + ((T *)obj)->~T(); + } + + virtual bool IsTrivialElem() const + { + return __is_trivial(T); + } + + virtual int GetTypeSize() const + { + return sizeof(T); + } + +public: + TArraySafe() + { + } + + TArraySafe(int64_t num) + { + Alloc(num); + // Number = num; // allocate number value + } + + virtual ~TArraySafe() + { + Close(); + } + + void Transfer(TArraySafe &o) + { + Close(); + img = o.img; + len = o.len; + Number = o.Number; + + o.ClearDataNoFree(); + } + + T &New(int64_t expandUnit=64) + { + return *(T*)TArrayPubBase::New(expandUnit); + } + + T &Obj(int64_t i) + { + assert(img); + assert(i>=0); + // assert(i=0); + // assert(i &operator=(TArraySafe &o) + { + Alloc(o.Number); + + for(int64_t i=0;i=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=pos;i--) + Obj(i+newNum) = Obj(i); + } + + return &Obj(pos); + } + + T *SlowDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(delNum>=1); + + int tail = Number-delNum; + + if(keepOrder==false) + { + for(int64_t i=0;i +class TArray:public TArraySafe +{ +public: + TArray() + { + } + + TArray(int64_t num) + :TArraySafe(num) + { + } + + void InitZero() + { + memset(this->img,0,sizeof(T)*this->len); + } + + void FastInit(T val) + { + MemSetType(this->img,val,sizeof(T)*this->len); + } + + void FastCopy(TArray &o,int64_t l=-1) + { + if( (l<0) || (l>o.Number) ) + l = o.Number; + + FastCopy(o(),l); + } + + void FastCopy(T *o,int64_t l) + { + this->Alloc(l); + memcpy(this->img,o,sizeof(T)*l); + TArraySafe::Number = l; + } + + T *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastInsert(pos,newNum,keepOrder); + } + + T *FastDel(int64_t pos,int64_t delNum=1,bool keepOrder=false) + { + return (T*)TArrayPubBase::FastDel(pos,delNum,keepOrder); + } + + void FastBInsert(T &obj,TSortCmp cmp,bool canRepeat=false) + { + TArrayPubBase::FastBInsert(&obj,cmp,canRepeat); + } +}; +//--------------------------------------------------------------------------- +typedef TArray TGrayArray; +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH + diff --git a/RHF_64/router_mega/ArrayPre.cpp b/RHF_64/router_mega/ArrayPre.cpp new file mode 100755 index 0000000..197aff3 --- /dev/null +++ b/RHF_64/router_mega/ArrayPre.cpp @@ -0,0 +1,173 @@ +//--------------------------------------------------------------------------- +#include +#include "ArrayPre.h" +#include +#include "embdDbg.h" +//--------------------------------------------------------------------------- +TArrayPubBase::~TArrayPubBase() +{ +} +//--------------------------------------------------------------------------- +void TArrayPubBase::Alloc(int64_t maxNum,int align, bool noConstructor) +{ + + logEmbdMsg("Prepare to alloc mem for array num=%d align=%d.\r\n",(int)maxNum,align); + Close(); + + logEmbdMsg("Array close ok.\r\n"); + + int typeSize = GetTypeSize(); + + logEmbdMsg("Get type size=%d ok.\r\n",typeSize); + + int64_t memSize = maxNum*typeSize; +#ifndef XrossCPP_In_64 + assert((memSize>>31)==0);//on 32-bit platforms, no memory alloc can larger than 2GB-1 +#endif // XrossCPP_In_64 + + logEmbdMsg("Ready to alloc %d-byte mem, defAllocator=%p.\r\n",(int)memSize,defAllocator); + // fprintf(stderr,"memSize is: %lu\n", memSize); + // fprintf(stderr,"align is: %d\n", align); + + img = defAllocator.Malloc((size_t)memSize,align); + logEmbdMsg("Alloc returned img=%p.\r\n",img); + + assert(img); + + len = maxNum; + + logEmbdMsg("Ready to call constructor.\r\n"); + + if( (noConstructor==false) && !IsTrivialElem() ) + { + logEmbdMsg("Now call constructor.\r\n"); + + for(int64_t i=0;i=0); + + if(newNum==len) + return; + + if(newNum==0) + { + Close(); + return; + } + + int typeSize = GetTypeSize(); + + if(newNumlen) + { + for(int64_t i=len;i=0) + { + if( (ret!=0) || canRepeat ) + memcpy(New(),key,typeSize); + + return; + } + + int64_t low = 0; + int64_t high = Number; + + while(low>1); + + ret = cmp(&key,img+mid*typeSize); + + if(ret==0) + { + if(canRepeat) + memcpy(FastInsert(mid,1,true),key,typeSize); + + return; + } + + if(ret<0) + high = mid; + else + low = mid+1; + } + + if(cmp(&key,img+low*typeSize)>0) + low ++; + + memcpy(FastInsert(low,1,true),key,typeSize); +} +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/ArrayPre.h b/RHF_64/router_mega/ArrayPre.h new file mode 100755 index 0000000..280f812 --- /dev/null +++ b/RHF_64/router_mega/ArrayPre.h @@ -0,0 +1,289 @@ +#pragma once +#ifndef ArrayPreH +#define ArrayPreH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "SortBase.h" +#include "Allocator.h" +// #include "Mem/FastMem.h" +#include "Type64.h" +//--------------------------------------------------------------------------- +#ifndef NULL +#define NULL 0 +#endif //NULL +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TArrayPubBase +{ +protected: + char *img; + +public: + int64_t len; + int64_t Number; + +protected: + virtual void CallConstructor(void *obj) const = 0; + virtual void CallDestructor(void *obj) const = 0; + virtual bool IsTrivialElem() const = 0; + virtual int GetTypeSize() const = 0; + + void *New(int64_t expandUnit=64) + { + if(Number==len) + ChCapacity(len+expandUnit); + + void *p = img+(size_t)Number*GetTypeSize(); + + Number ++; + + return p; + } + + void *Search(const void *key,TSortCmp cmp,int64_t n=-1) const; + + void *FastInsert(int64_t pos,int64_t newNum=1,bool keepOrder=false) + { + assert(pos>=0); + assert(pos<=Number); + assert(newNum>=1); + + if( (len-Number)=0); + assert(pos<=Number); + assert(delNum>=1); + + int typeSize = GetTypeSize(); + int64_t tail = Number-delNum; + char *mPos = img+(size_t)pos*typeSize; + + if(keepOrder==false) + memcpy(mPos,img+(size_t)tail*typeSize,(size_t)delNum*typeSize); + else + memcpy(mPos,mPos+(size_t)delNum*typeSize,(size_t)(tail-pos)*typeSize); + + Number = tail; + + return mPos; + } + + void FastBInsert(void *key,TSortCmp cmp,bool canRepeat=true); + +public: + TArrayPubBase() + { + img = NULL; + len = 0; + Number = 0; + } + + virtual ~TArrayPubBase(); + + void Close(bool noConstructor=false); + + void ClearDataNoFree() + { + img = NULL; + len = 0; + Number = 0; + } + + void Alloc(int64_t maxNum,int align=32, bool noConstructor=false); + void AllocFill(int64_t maxNum,int align=32, bool noConstructor=false) + { + Alloc(maxNum,align,noConstructor); + Number = len; + } + void ChCapacity(int64_t newNum,int align=32); + + int64_t Size() const + { + return Number*GetTypeSize(); + } + + int64_t StorageSize() const + { + return len*GetTypeSize(); + } + + int64_t SpaceSize() const + { + return (len-Number)*GetTypeSize(); + } + + void *ObjAt(int64_t inx) const + { + assert(inx>=0); + assert(inx o.Move(TArray src) + void Move(TArrayPubBase &src) + { + Close(); + + img = src.img; + len = src.len; + Number = src.Number; + + src.img = NULL; + src.len = 0; + src.Number = 0; + } + + void Grow(int64_t nGrow) + { + if((Number+nGrow)>len) + ChCapacity(Number+nGrow); + + Number += nGrow; + } +}; +//--------------------------------------------------------------------------- +template +int64_t ArrLargest(T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i*tmp) + { + tmp = array+i; + index = i; + } + } + + return index; +} +//--------------------------------------------------------------------------- +template +int64_t ArrSmallest(const T *array,int64_t num) +{ + T *tmp; + tmp = array; + int64_t index = 0; + + for(int64_t i=1;i +void ArrMinMax(const T *array,int64_t num,int64_t &minIndex,int64_t &maxIndex) +{ + T *tMin = array; + T *tMax = array; + + int64_t iMin=0, iMax=0; + + for(int64_t i=1;i*tMax) + { + *tMax = array+i; + iMax = i; + } + } + + minIndex = iMin; + maxIndex = iMax; +} +//--------------------------------------------------------------------------- +template +void ArrTotal(const T *array,int64_t num,T &ret) +{ + ret = array[0]; + + for(int64_t i=1;i +inline void ArrMean(const T *array,int64_t num,T &ret) +{ + T tmp; + + ArrTotal(array,num,tmp); + + ret = tmp/num; +} +//--------------------------------------------------------------------------- +//base e entropy +//--------------------------------------------------------------------------- +template +double ArrEntropyE(const T *array,int64_t num) +{ + T sum; + + ArrTotal(array,num,sum); + + double e = 0; + double m = 1.0/sum; + + for(int64_t i=0;i1e-30) + e -= t*log(t); + } + + return e; +} +//--------------------------------------------------------------------------- +template +inline double ArrEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)*1.4426950408889634073599246810019; //log2(e) +} +//--------------------------------------------------------------------------- +template +inline double ArrNormEntropy(const T *array,int64_t num) +{ + return ArrEntropyE(array,num)/log(num); +} +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //ArrayH diff --git a/RHF_64/router_mega/Builder/PerfectRouterBuilder1.cpp b/RHF_64/router_mega/Builder/PerfectRouterBuilder1.cpp new file mode 100755 index 0000000..ef77cab --- /dev/null +++ b/RHF_64/router_mega/Builder/PerfectRouterBuilder1.cpp @@ -0,0 +1,180 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include "PerfectRouterBuilder1.h" +#include "../IntUtils.h" +#include "../City64.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint32_t startPos; + int32_t nItem; + int index; +}; +//--------------------------------------------------------------------------- +int CmpSlot1(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectRouterBuilder1::Build(int *pn, uint64_t *hash,int nHash,int nBucket,int nSlot) +{ + if(nSlot==0) + return false; + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + throw "exception, nBucket is zero!"; + return false; + } + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + // bit-shift represents the mod operation + int bucketWidth = (int) (log(nBucket)/log(2)); + int shiftBucket = 64 - bucketWidth; + + int nSlotWidth = (int)(log(nSlot)/log(2)); + int shiftSlot = 64 - nSlotWidth; + + // update information for each slot + for(int i=0;i> shiftSlot); // int idx = hash[i]%nSlot; + + slots[idx].nItem ++; + slots[idx].index = idx; + } + + + // begin key - item mapping + slots[0].startPos = slots[0].nItem-1; + + for(int i=1;i sortedHash; + sortedHash.AllocFill(nHash); + TArray sortedPn; + sortedPn.AllocFill(nHash); + + for(int i=0;i> shiftSlot; // uint32_t idx = hash[i]%nSlot; + + sortedHash[slots[idx].startPos] = hash[i]; + sortedPn[slots[idx].startPos] = pn[i]; + slots[idx].startPos --; + } + // finish key - item mapping + + // sort slot using number of items, in descending order + slots.QSort(CmpSlot1); + + // initialize dArray, bucketArray and bucketItemStack + dArray.AllocFill(nSlot * 4); // 16bit x nSlot + dArray.InitZero(); + + bucketArray.AllocFill(nBucket * 4); // 32bit x number of buckets + bucketArray.InitZero(); + + bucketItemStack.AllocFill(slots[0].nItem * 4); // 32bit x item number of slots[0] + bucketItemStack.InitZero(); + + /* begin building */ + for(int i=0;i> 12; + // Single multiplication approach (not efficient for FPGA DSP block) + // int f = ( ((x_key * (uint64_t)d) >> 16) << shiftBucket >> shiftBucket); + + // x_key has values in lower 54 bits + // dsp48E max multiplier input width: 24 bits + // for lower 24 bits: 64 - 24 = 40 + // for higher 30 bits: 54 - 30 = 24 + uint64_t add1A = (x_key >> 50); + uint64_t add1B = (x_key >> 36); + uint64_t add2C = (x_key >> 24); + uint64_t add2D = (x_key >> 12); + + int f = ((add1A + add1B * (uint64_t)d) ^ (add2C + add2D * (uint64_t)d)) << shiftBucket >> shiftBucket; + + // int f = ( (((x_key << 39 >> 39) * (uint64_t)d + (x_key >> 24)) >> 15) << shiftBucket >> shiftBucket); + int pnGT = sortedPn[startPos+j]; + + if (bucketArray[f] > 0) + { + if (bucketArray[f] == pnGT) + { + bucketItemStack[j] = nBucket; // mark as bad value + continue; + } else + { + int j1 = j; + while(j1>0) + { + j1--; + if (bucketItemStack[j1] < nBucket) + { + bucketArray[bucketItemStack[j1]] = 0; // not bad value, delete + } + } + fail = 1; + break; + } + } else + { + bucketArray[f] = pnGT; + bucketItemStack[j] = f; + } + } + if(fail==0) // current d is successfully found + { + dArray[index] = d; // int idx_d = sortedHash[]%nSlot; + break; + } + } + if(fail==1) // we can't find suitable d in [0,maxD-1], building failure + { + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return false; + } + } + /* end building */ + + // if success, update the r and m for nSlot and nBucket + // bucketArray, dArray already updated + r = nSlot; + m = nBucket; + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Builder/PerfectRouterBuilder1.h b/RHF_64/router_mega/Builder/PerfectRouterBuilder1.h new file mode 100755 index 0000000..d5e8ac1 --- /dev/null +++ b/RHF_64/router_mega/Builder/PerfectRouterBuilder1.h @@ -0,0 +1,112 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterBuilder1H +#define PerfectRouterBuilder1H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//------------------------ not used for now ------------------------------ +// class TBitArray +// { +// public: +// uint32_t *arr; +// int64_t nBit; + +// TBitArray() +// { +// arr = NULL; +// nBit = 0; +// } + +// ~TBitArray() +// { +// Close(); +// } + +// void Close() +// { +// if(arr) +// { +// delete arr; +// nBit = 0; +// } +// } + +// void Alloc(int64_t _nBit) +// { +// Close(); + +// nBit = (_nBit+63)&~63ull; +// arr = new uint32_t[nBit>>6]; // change uint64_t to uint32_t +// ClearAll(); +// } + +// bool operator[](int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6]&(1ull<<(inx&63)))!=0; +// } + +// void SetBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] |= mask; +// } + +// void ClearBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] &= ~mask; +// } + +// void ClearAll() +// { +// assert(arr); +// memset(arr,0,(nBit>>3)); +// } +// };//--------------------------------------------------------------------------- +class TPerfectRouterBuilder1 +{ +public: + uint32_t r; + uint32_t m; + TArray dArray; + TArray bucketArray; + // TArray bucketStack; + TArray bucketItemStack; + + ~TPerfectRouterBuilder1() + { + Close(); + } + + void Close() + { + dArray.Close(); + bucketArray.Close(); + // bucketStack.Close(); + bucketItemStack.Close(); + r = (uint32_t) 0; + m = (uint32_t) 0; + } + + bool Build(int *pn,uint64_t *hash,int nHash,int nBucket=0,int nSlot=400); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectRouterBuilder1 &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Builder/PerfectRouterBuilder2.cpp b/RHF_64/router_mega/Builder/PerfectRouterBuilder2.cpp new file mode 100755 index 0000000..48f8b6c --- /dev/null +++ b/RHF_64/router_mega/Builder/PerfectRouterBuilder2.cpp @@ -0,0 +1,185 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include "PerfectRouterBuilder2.h" +#include "../IntUtils.h" +#include "../City64.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint32_t startPos; + int32_t nItem; + int index; +}; +//--------------------------------------------------------------------------- +int CmpSlot2(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectRouterBuilder2::Build(int *pn, uint64_t *hash,int nHash,int nBucket,int nSlot) +// bool TPerfectRouterBuilder2::Build(int *pn, uint32_t *hash,int nHash,int nBucket,int nSlot, int sl0, int sl1, int s0, int s1) +{ + if(nSlot==0) + return false; + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + throw "exception, nBucket is zero!"; + return false; + } + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + // bit-shift represents the mod operation + int bucketWidth = (int) (log(nBucket)/log(2)); + int shiftBucket = 64 - bucketWidth; + + int nSlotWidth = (int)(log(nSlot)/log(2)); + int shiftSlot = 64 - nSlotWidth; + + // update information for each slot + for(int i=0;i> sl0) ^ (hash[i] << sl1) ^ hash[i]) << shiftSlot >> shiftSlot); + int idx = (hash[i] << shiftSlot) >> shiftSlot; // int idx = hash[i]%nSlot; + slots[idx].nItem ++; + slots[idx].index = idx; + } + + // begin key - item mapping + slots[0].startPos = slots[0].nItem-1; + + for(int i=1;i sortedHash; + sortedHash.AllocFill(nHash); + TArray sortedPn; + sortedPn.AllocFill(nHash); + + for(int i=0;i> sl0) ^ (hash[i] << sl1) ^ hash[i]) << shiftSlot >> shiftSlot); + int idx = (hash[i] << shiftSlot) >> shiftSlot; // uint32_t idx = hash[i]%nSlot; + + sortedHash[slots[idx].startPos] = hash[i]; + sortedPn[slots[idx].startPos] = pn[i]; + slots[idx].startPos --; + } + // finish key - item mapping + + // sort slot using number of items, in descending order + slots.QSort(CmpSlot2); + + // initialize dArray, bucketArray and bucketItemStack + dArray.AllocFill(nSlot * 4); // 16bit x nSlot + dArray.InitZero(); + + bucketArray.AllocFill(nBucket * 4); // 32bit x number of buckets + bucketArray.InitZero(); + + bucketItemStack.AllocFill(slots[0].nItem * 4); // 32bit x item number of slots[0] + bucketItemStack.InitZero(); + + /* begin building */ + for(int i=0;i> 16; // low 11 bits to index Slot table + // uint64_t d1 = (uint64_t) (d + d << 12 + ((uint64_t)d) << 24 + ((uint64_t)d) << 36); + uint64_t d1 = (uint64_t) d; + int f = ( ((x_key + d1) >> 8) << shiftBucket >> shiftBucket); + + // below all fail + // int f = ( (((x_key << 39 >> 39) * (uint64_t)d ^ (x_key >> 25)) >> 14) << shiftBucket >> shiftBucket); + // uint64_t x_key1 = sortedHash[startPos+j]; + // x_key1 = x_key1 ^ (uint64_t)d; + // x_key1 ^= (x_key1 >> 16); + // x_key1 ^= (x_key1 >> 16); + // x_key1 ^= (x_key1 >> 16); + // int f = x_key1 << 48 >> 48; + // int f = FastIntHash(x_key,d) << shiftBucket >> shiftBucket; + + int pnGT = sortedPn[startPos+j]; + + if (bucketArray[f] > 0) + { + if (bucketArray[f] == pnGT) + { + bucketItemStack[j] = nBucket; // mark as bad value + continue; + } else + { + int j1 = j; + while(j1>0) + { + j1--; + if (bucketItemStack[j1] < nBucket) + { + bucketArray[bucketItemStack[j1]] = 0; // not bad value, delete + } + } + fail = 1; + break; + } + } else + { + // if (sortedHash[startPos+j] == (uint32_t)179551886) + // { + // // int idx_d = sortedHash[startPos+j]%nSlot; + // int idx_d = ((sortedHash[startPos+j] << shiftSlot) >> shiftSlot); + // } + bucketArray[f] = pnGT; + bucketItemStack[j] = f; + } + } + if(fail==0) // current d is successfully found + { + dArray[index] = d; // int idx_d = sortedHash[]%nSlot; + break; + } + } + if(fail==1) // we can't find suitable d in [0,maxD-1], building failure + { + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return false; + } + } + /* end building */ + + // if success, update the r and m for nSlot and nBucket + // bucketArray, dArray already updated + r = nSlot; + m = nBucket; + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Builder/PerfectRouterBuilder2.h b/RHF_64/router_mega/Builder/PerfectRouterBuilder2.h new file mode 100755 index 0000000..8653891 --- /dev/null +++ b/RHF_64/router_mega/Builder/PerfectRouterBuilder2.h @@ -0,0 +1,112 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterBuilder2H +#define PerfectRouterBuilder2H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//------------------------ not used for now ------------------------------ +// class TBitArray +// { +// public: +// uint32_t *arr; +// int64_t nBit; + +// TBitArray() +// { +// arr = NULL; +// nBit = 0; +// } + +// ~TBitArray() +// { +// Close(); +// } + +// void Close() +// { +// if(arr) +// { +// delete arr; +// nBit = 0; +// } +// } + +// void Alloc(int64_t _nBit) +// { +// Close(); + +// nBit = (_nBit+63)&~63ull; +// arr = new uint32_t[nBit>>6]; // change uint64_t to uint32_t +// ClearAll(); +// } + +// bool operator[](int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6]&(1ull<<(inx&63)))!=0; +// } + +// void SetBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] |= mask; +// } + +// void ClearBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] &= ~mask; +// } + +// void ClearAll() +// { +// assert(arr); +// memset(arr,0,(nBit>>3)); +// } +// };//--------------------------------------------------------------------------- +class TPerfectRouterBuilder2 +{ +public: + uint32_t r; + uint32_t m; + TArray dArray; + TArray bucketArray; + // TArray bucketStack; + TArray bucketItemStack; + + ~TPerfectRouterBuilder2() + { + Close(); + } + + void Close() + { + dArray.Close(); + bucketArray.Close(); + // bucketStack.Close(); + bucketItemStack.Close(); + r = (uint32_t) 0; + m = (uint32_t) 0; + } + + bool Build(int *pn,uint64_t *hash,int nHash,int nBucket=0,int nSlot=400); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectRouterBuilder2 &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Builder/PerfectRouterBuilder3.cpp b/RHF_64/router_mega/Builder/PerfectRouterBuilder3.cpp new file mode 100755 index 0000000..0f8a851 --- /dev/null +++ b/RHF_64/router_mega/Builder/PerfectRouterBuilder3.cpp @@ -0,0 +1,178 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include "PerfectRouterBuilder3.h" +#include "../IntUtils.h" +//--------------------------------------------------------------------------- +struct TSlotInfo +{ + uint32_t startPos; + int32_t nItem; + int index; +}; +//--------------------------------------------------------------------------- +int CmpSlot3(const void *d1,const void *d2) +{ + // We assume nItem is much less than INT_MAX + return (int)( ((TSlotInfo*)d2)->nItem - ((TSlotInfo*)d1)->nItem ); //Reverse order +} +//--------------------------------------------------------------------------- +bool TPerfectRouterBuilder3::Build(int *pn, uint64_t *hash,int nHash,int nBucket,int nSlot) +{ + if(nSlot==0) + return false; + + if(nBucket==0){ + fprintf(stderr,"nBucket: %d, too small to round up prime. \r\n", nBucket); + throw "exception, nBucket is zero!"; + return false; + } + TArray slots; + slots.AllocFill(nSlot); + slots.InitZero(); + // bit-shift represents the mod operation + int bucketWidth = (int) (log(nBucket)/log(2)); + int shiftBucket = 64 - bucketWidth; + + int nSlotWidth = (int)(log(nSlot)/log(2)); + int shiftSlot = 64 - nSlotWidth; + + // update information for each slot + for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + slots[idx].nItem ++; + slots[idx].index = idx; + } + + // begin key - item mapping + slots[0].startPos = slots[0].nItem-1; + + for(int i=1;i sortedHash; + sortedHash.AllocFill(nHash); + TArray sortedPn; + sortedPn.AllocFill(nHash); + + for(int i=0;i> shiftSlot; // uint32_t idx = hash[i]%nSlot; + + sortedHash[slots[idx].startPos] = hash[i]; + sortedPn[slots[idx].startPos] = pn[i]; + slots[idx].startPos --; + } + // finish key - item mapping + + // sort slot using number of items, in descending order + slots.QSort(CmpSlot3); + + // initialize dArray, bucketArray and bucketItemStack + dArray.AllocFill(nSlot * 4); // 16bit x nSlot + dArray.InitZero(); + + bucketArray.AllocFill(nBucket * 4); // 32bit x number of buckets + bucketArray.InitZero(); + + bucketItemStack.AllocFill(slots[0].nItem * 4); // 32bit x item number of slots[0] + bucketItemStack.InitZero(); + + /* begin building */ + for(int i=0;i> 10; + // Single multiplication approach (not efficient for FPGA DSP block) + // int f = ( ((x_key * (uint64_t)d) >> 16) << shiftBucket >> shiftBucket); + + // x_key has values in lower 56 bits, x_key[63:56] = 00000000 + // dsp48E max multiplier input width: 25 bits + // for lower 25 bits (64 - 25 = 39): x_key << 39 >> 39 + // for higher (56 - 25 = 31) bits: x_key >> 25 + uint64_t add1A = (x_key >> 50); + uint64_t add1B = (x_key >> 36); + uint64_t add2C = (x_key >> 23); + uint64_t add2D = (x_key >> 10); + + int f = ((add1A + add1B * (uint64_t)d) ^ (add2C + add2D * (uint64_t)d)) << shiftBucket >> shiftBucket; + // int f = ( (((x_key << 39 >> 39) * (uint64_t)d + (x_key >> 25)) >> 13) << shiftBucket >> shiftBucket); + + int pnGT = sortedPn[startPos+j]; + + if (bucketArray[f] > 0) + { + if (bucketArray[f] == pnGT) + { + bucketItemStack[j] = nBucket; // mark as bad value + continue; + } else + { + int j1 = j; + while(j1>0) + { + j1--; + if (bucketItemStack[j1] < nBucket) + { + bucketArray[bucketItemStack[j1]] = 0; // not bad value, delete + } + } + fail = 1; + break; + } + } else + { + bucketArray[f] = pnGT; + bucketItemStack[j] = f; + } + } + if(fail==0) // current d is successfully found + { + dArray[index] = d; // int idx_d = sortedHash[]%nSlot; + break; + } + } + if(fail==1) // we can't find suitable d in [0,maxD-1], building failure + { + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return false; + } + } + /* end building */ + + // if success, update the r and m for nSlot and nBucket + // bucketArray, dArray already updated + r = nSlot; + m = nBucket; + sortedHash.Close(); + sortedPn.Close(); + slots.Close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Builder/PerfectRouterBuilder3.h b/RHF_64/router_mega/Builder/PerfectRouterBuilder3.h new file mode 100755 index 0000000..989fcc4 --- /dev/null +++ b/RHF_64/router_mega/Builder/PerfectRouterBuilder3.h @@ -0,0 +1,112 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterBuilder3H +#define PerfectRouterBuilder3H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//------------------------ not used for now ------------------------------ +// class TBitArray +// { +// public: +// uint32_t *arr; +// int64_t nBit; + +// TBitArray() +// { +// arr = NULL; +// nBit = 0; +// } + +// ~TBitArray() +// { +// Close(); +// } + +// void Close() +// { +// if(arr) +// { +// delete arr; +// nBit = 0; +// } +// } + +// void Alloc(int64_t _nBit) +// { +// Close(); + +// nBit = (_nBit+63)&~63ull; +// arr = new uint32_t[nBit>>6]; // change uint64_t to uint32_t +// ClearAll(); +// } + +// bool operator[](int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6]&(1ull<<(inx&63)))!=0; +// } + +// void SetBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] |= mask; +// } + +// void ClearBit(int64_t inx) +// { +// assert(inx>=0); +// assert(inx>6); +// int64_t mask = (1ull<<(inx&63)); + +// arr[ip] &= ~mask; +// } + +// void ClearAll() +// { +// assert(arr); +// memset(arr,0,(nBit>>3)); +// } +// };//--------------------------------------------------------------------------- +class TPerfectRouterBuilder3 +{ +public: + uint32_t r; + uint32_t m; + TArray dArray; + TArray bucketArray; + // TArray bucketStack; + TArray bucketItemStack; + + ~TPerfectRouterBuilder3() + { + Close(); + } + + void Close() + { + dArray.Close(); + bucketArray.Close(); + // bucketStack.Close(); + bucketItemStack.Close(); + r = (uint32_t) 0; + m = (uint32_t) 0; + } + + bool Build(int *pn,uint64_t *hash,int nHash,int nBucket=0,int nSlot=400); + bool Write(const char *fileName); + + void CopyIfBetter(TPerfectRouterBuilder3 &o); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/CMakeLists.txt b/RHF_64/router_mega/CMakeLists.txt new file mode 100755 index 0000000..d77ba73 --- /dev/null +++ b/RHF_64/router_mega/CMakeLists.txt @@ -0,0 +1,16 @@ +# CMake 最低版本号要求 +cmake_minimum_required (VERSION 2.8) + +# 项目信息 +project (Generate) + +set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD_REQUIRED True) + +# 指定生成目标 +add_executable(Generate main.cpp Generator.cpp / +CTimer1.cpp CTimer2.cpp CTimer3.cpp / +Builder/PerfectRouterBuilder1.cpp Builder/PerfectRouterBuilder2.cpp Builder/PerfectRouterBuilder3.cpp / +Tester/PerfectRouterTester1.cpp Tester/PerfectRouterTester2.cpp Tester/PerfectRouterTester3.cpp / +Performance/Performance.cpp IntUtils.cpp ArrayPre.cpp AllocatorBase.cpp AllocatorC.cpp City64.cpp) + diff --git a/RHF_64/router_mega/CTimer1.cpp b/RHF_64/router_mega/CTimer1.cpp new file mode 100755 index 0000000..2552151 --- /dev/null +++ b/RHF_64/router_mega/CTimer1.cpp @@ -0,0 +1,145 @@ +#include +#include +#include +#include +#include +#include "CTimer1.h" + +//------------------------------------------------------------------------------ +using namespace std; + +double CTimer1::getCTime(uint64_t *hash, int *pn,int nHash, uint64_t &maxStorageCost) +{ + /////////////////////////////////// + // we fix the nBucket and nSlot to compare construction time + // start with maximum number of buckets + int bucketStart = 16384; + int bucketEnd = 16384; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 4096; + int nSlotEnd = 4096; + + int slotWidth = 8; + int minCost = nSlotEnd*slotWidth + bucketStart*2 + 1; + int bestBucketSize = bucketStart-1; + int bestSlotSize = nSlotStart; + + int nBucket; + int nSlot = nSlotStart; + + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + // time calculation + struct timeval gStart, gBegin, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + TPerfectRouterBuilder1 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*slotWidth + nBucket*2; + // avoid some unuseful builds + if (curCost < minCost) + { + gettimeofday(&gBegin,NULL); + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gBegin.tv_sec + (gEnd.tv_usec - gBegin.tv_usec)/1000000.0; + fprintf(stderr,"success!!! \r\n"); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + fprintf(stderr,"bit memory cost = %d bit x nSlot + 2 bit x nBucket = %d \r\n", slotWidth, minCost); + uint64_t storageCost = (uint64_t) minCost; + if(maxStorageCost < storageCost){ + maxStorageCost = storageCost; + } + return timeuse; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + // nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + myB.Close(); + return timeuse; +} + +double CTimer1::getFileTime(const char * filename, uint64_t & maxStorageCost) +{ + uint64_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 20) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint64_t h = strtoull(l.c_str(), NULL, 10); + key[ind++] = h; // load the string hash value + } + int nHash = ind; + + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + fprintf(stderr,"nHash: %d\r\n", nHash); + fprintf(stderr,"nHash1: %d\r\n", nHash1); + fprintf(stderr,"check file %s.\r\n", filename); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + uint64_t *hash = key; + int *pn = port; + double timeuse; + // fprintf(stderr,"cur file is: %s.\r\n", filename); + timeuse = getCTime(hash, pn, nHash, maxStorageCost); + + return timeuse; +} + +//------------------------------------------------------------------------------ diff --git a/RHF_64/router_mega/CTimer1.h b/RHF_64/router_mega/CTimer1.h new file mode 100755 index 0000000..a183fb0 --- /dev/null +++ b/RHF_64/router_mega/CTimer1.h @@ -0,0 +1,32 @@ +#include +#include "Builder/PerfectRouterBuilder1.h" + +//--------------------------------------------------------------------------- +#ifndef CTimer1H +#define CTimer1H +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//---------------------------------------------------------------------------、 +class CTimer1 +{ +public: + + ~CTimer1() + { + Close(); + } + + void Close() + { + } + + double getCTime(uint64_t *hash, int *pn, int nHash, uint64_t &maxStorageCost); + double getFileTime(const char * filename, uint64_t &maxStorageCost); +}; + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_64/router_mega/CTimer2.cpp b/RHF_64/router_mega/CTimer2.cpp new file mode 100755 index 0000000..c33ead8 --- /dev/null +++ b/RHF_64/router_mega/CTimer2.cpp @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include "CTimer2.h" + +//------------------------------------------------------------------------------ +using namespace std; + +double CTimer2::getCTime(uint64_t *hash, int *pn,int nHash, uint64_t &maxStorageCost) +{ + /////////////////////////////////// + // we fix the nBucket and nSlot to compare construction time + // start with maximum number of buckets + int bucketStart = 65536; + int bucketEnd = 65536; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 2048; + int nSlotEnd = 2048; + + int slotWidth = 12; + int minCost = nSlotEnd* slotWidth + bucketStart*2 + 1; + int bestBucketSize = bucketStart+1; + int bestSlotSize = nSlotStart; + + // number of buckets + int nBucket; + int nSlot = nSlotStart; + + TArray dArrayBest; + TArray bucketArrayBest; + + // time calculation + struct timeval gStart, gBegin, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + TPerfectRouterBuilder2 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + // number of slots + int curCost = nSlot* slotWidth + nBucket*2; + if (curCost < minCost) + { + gettimeofday(&gBegin,NULL); + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gBegin.tv_sec + (gEnd.tv_usec - gBegin.tv_usec)/1000000.0; + fprintf(stderr,"success!!! \r\n"); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + fprintf(stderr,"bit memory cost = %d bit x nSlot + 2 bit x nBucket = %d \r\n", slotWidth, minCost); + uint64_t storageCost = (uint64_t) minCost; + if(maxStorageCost < storageCost){ + maxStorageCost = storageCost; + } + + return timeuse; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart+1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + myB.Close(); + return timeuse; +} + +double CTimer2::getFileTime(const char * filename, uint64_t &maxStorageCost) +{ + uint64_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 20) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint64_t h = strtoull(l.c_str(), NULL, 10); + key[ind++] = h; // load the string hash value + } + int nHash = ind; + + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + fprintf(stderr,"nHash: %d\r\n", nHash); + fprintf(stderr,"nHash1: %d\r\n", nHash1); + fprintf(stderr,"check file %s.\r\n", filename); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + uint64_t *hash = key; + int *pn = port; + double timeuse; + timeuse = getCTime(hash, pn, nHash, maxStorageCost); + + return timeuse; +} + +//------------------------------------------------------------------------------ diff --git a/RHF_64/router_mega/CTimer2.h b/RHF_64/router_mega/CTimer2.h new file mode 100755 index 0000000..63bb6c5 --- /dev/null +++ b/RHF_64/router_mega/CTimer2.h @@ -0,0 +1,32 @@ +#include +#include "Builder/PerfectRouterBuilder2.h" + +//--------------------------------------------------------------------------- +#ifndef CTimer2H +#define CTimer2H +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//---------------------------------------------------------------------------、 +class CTimer2 +{ +public: + + ~CTimer2() + { + Close(); + } + + void Close() + { + } + + double getCTime(uint64_t *hash, int *pn,int nHash, uint64_t &maxStorageCost); + double getFileTime(const char * filename, uint64_t &maxStorageCost); +}; + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_64/router_mega/CTimer3.cpp b/RHF_64/router_mega/CTimer3.cpp new file mode 100755 index 0000000..d7d45e6 --- /dev/null +++ b/RHF_64/router_mega/CTimer3.cpp @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#include +#include "CTimer3.h" + +//------------------------------------------------------------------------------ +using namespace std; + +double CTimer3::getCTime(uint64_t *hash, int *pn,int nHash, uint64_t &maxStorageCost) +{ + /////////////////////////////////// + // we fix the nBucket and nSlot to compare construction time + // start with maximum number of buckets + int bucketStart = 32768; + int bucketEnd = 32768; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 1024; + int nSlotEnd = 1024; + + int slotWidth = 8; + int minCost = nSlotEnd*slotWidth + bucketStart*2 + 1; + int bestBucketSize = bucketStart-1; + int bestSlotSize = nSlotStart; + + int nBucket; + int nSlot = nSlotStart; + + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + // time calculation + struct timeval gStart, gBegin, gEnd; + double timeuse = -1; + gettimeofday(&gStart,NULL); + + TPerfectRouterBuilder3 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*slotWidth + nBucket*2; + // avoid some unuseful builds + if (curCost < minCost) + { + gettimeofday(&gBegin,NULL); + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + gettimeofday(&gEnd,NULL); + timeuse = gEnd.tv_sec - gBegin.tv_sec + (gEnd.tv_usec - gBegin.tv_usec)/1000000.0; + fprintf(stderr,"success!!! \r\n"); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + fprintf(stderr,"bit memory cost = %d bit x nSlot + 2 bit x nBucket = %d \r\n", slotWidth, minCost); + uint64_t storageCost = (uint64_t) minCost; + if(maxStorageCost < storageCost){ + maxStorageCost = storageCost; + } + return timeuse; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + // nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + myB.Close(); + return timeuse; +} + +double CTimer3::getFileTime(const char * filename, uint64_t & maxStorageCost) +{ + uint64_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(filename, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", filename); + return 0; + } + else if (len > 20) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + uint64_t h = strtoull(l.c_str(), NULL, 10); + key[ind++] = h; // load the string hash value + } + int nHash = ind; + + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + fprintf(stderr,"nHash: %d\r\n", nHash); + fprintf(stderr,"nHash1: %d\r\n", nHash1); + fprintf(stderr,"check file %s.\r\n", filename); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + uint64_t *hash = key; + int *pn = port; + double timeuse; + timeuse = getCTime(hash, pn, nHash, maxStorageCost); + + return timeuse; +} + +//------------------------------------------------------------------------------ diff --git a/RHF_64/router_mega/CTimer3.h b/RHF_64/router_mega/CTimer3.h new file mode 100755 index 0000000..5684978 --- /dev/null +++ b/RHF_64/router_mega/CTimer3.h @@ -0,0 +1,32 @@ +#include +#include "Builder/PerfectRouterBuilder3.h" + +//--------------------------------------------------------------------------- +#ifndef CTimer3H +#define CTimer3H +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//---------------------------------------------------------------------------、 +class CTimer3 +{ +public: + + ~CTimer3() + { + Close(); + } + + void Close() + { + } + + double getCTime(uint64_t *hash, int *pn, int nHash, uint64_t &maxStorageCost); + double getFileTime(const char * filename, uint64_t &maxStorageCost); +}; + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_64/router_mega/City64.cpp b/RHF_64/router_mega/City64.cpp new file mode 100755 index 0000000..3ec6352 --- /dev/null +++ b/RHF_64/router_mega/City64.cpp @@ -0,0 +1,259 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides CityHash64() and related functions. +// +// It's probably possible to create even faster hash functions by +// writing a program that systematically explores some of the space of +// possible hash functions, by using SIMD instructions, or by +// compromising on hash quality. +// +// Comment by LHZ 2017.5.19: +// This hash function has been tested by the following dataset: +// 1. 2G (items) Chinese word groups from 40G Chinese news text +// 2. 4M Chinese words from 40G Chinese news text +// 3. 1M Chinese words dictionary +// No conflict found yet. + +#include "City64.h" +#include "Type64.h" +#include + +#define Fetch64(x) (*(uint64_t*)(x)) +#define Fetch32(x) (*(uint32_t*)(x)) + +enum +{ +// Some primes between 2^63 and 2^64 for various uses. + k0 = 0xc3a5c85c97cb3127ULL, + k1 = 0xb492b66fbe98f273ULL, + k2 = 0x9ae16a3b2f90404fULL, + k3 = 0xc949d7c7509e6557ULL, +// for Hash128to64 + kMul = 0x9ddfea08eb382d69ULL, +}; +// Hash 128 input bits down to 64 bits of output. +// This is intended to be a reasonably good hash function. +inline uint64_t Hash128to64(uint64_t vL, uint64_t vH) { + // Murmur-inspired hashing. + uint64_t a = (vL ^ vH) * kMul; + a ^= (a >> 47); + uint64_t b = (vH ^ a) * kMul; + b ^= (b >> 47); + b *= kMul; + return b; +} + +// Bitwise right rotate. Normally this will compile to a single +// instruction, especially if the shift is a manifest constant. +inline uint64_t Rotate(uint64_t val, int shift) { + // Avoid shifting by 64: doing so yields an undefined result. + return shift == 0 ? val : ((val >> shift) | (val << (64 - shift))); +} + +// Equivalent to Rotate(), but requires the second arg to be non-zero. +// On x86-64, and probably others, it's possible for this to compile +// to a single instruction if both args are already in registers. +inline uint64_t RotateByAtLeast1(uint64_t val, int shift) { + return (val >> shift) | (val << (64 - shift)); +} + +inline uint64_t ShiftMix(uint64_t val) { + return val ^ (val >> 47); +} + +#define HashLen16 Hash128to64 + +inline uint64_t HashLen0to16(const char *s, size_t len) { + if (len > 8) { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + if (len >= 4) { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + if (len > 0) { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + return k2; +} +/* +inline uint64_t HashLen0to16(const char *s, size_t len) { + static uint8_t off[]={ + 3, + 2,2,2, + 1,1,1,1,1, + 0,0,0,0,0,0,0,0}; + + switch(off[len]) + { + case 0: + { + uint64_t a = Fetch64(s); + uint64_t b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + case 1: + { + uint64_t a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + case 2: + { + uint32_t y = static_cast(s[0]) + (static_cast(s[len >> 1]) << 8); + uint32_t z = len + (static_cast(s[len - 1]) << 2); + + return ShiftMix(y * k2 ^ z * k3) * k2; + } + case 3: + return k2; + } +} +*/ + +// This probably works well for 16-byte strings as well, but it may be overkill +// in that case. +inline uint64_t HashLen17to32(const char *s, size_t len) { + uint64_t a = Fetch64(s) * k1; + uint64_t b = Fetch64(s + 8); + uint64_t c = Fetch64(s + len - 8) * k2; + uint64_t d = Fetch64(s + len - 16) * k0; + return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d, + a + Rotate(b ^ k3, 20) - c + len); +} + +// Return a 16-byte hash for 48 bytes. Quick and dirty. +// Callers do best to use "random-looking" values for a and b. +inline void WeakHashLen32WithSeeds(TX128Data &out, + uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) { + a += w; + b = Rotate(b + a + z, 21); + uint64_t c = a; + a += x; + a += y; + b += Rotate(a, 44); + out.u64[0] = a+z; + out.u64[1] = b+c; +} + +// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. +inline void WeakHashLen32WithSeeds(TX128Data &out, + const char* s, uint64_t a, uint64_t b) { + WeakHashLen32WithSeeds(out,Fetch64(s), + Fetch64(s + 8), + Fetch64(s + 16), + Fetch64(s + 24), + a, + b); +} + +// Return an 8-byte hash for 33 to 64 bytes. +inline uint64_t HashLen33to64(const char *s, size_t len) { + uint64_t z = Fetch64(s + 24); + uint64_t a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0; + uint64_t b = Rotate(a + z, 52); + uint64_t c = Rotate(a, 37); + a += Fetch64(s + 8); + c += Rotate(a, 7); + a += Fetch64(s + 16); + uint64_t vf = a + z; + uint64_t vs = b + Rotate(a, 31) + c; + a = Fetch64(s + 16) + Fetch64(s + len - 32); + z = Fetch64(s + len - 8); + b = Rotate(a + z, 52); + c = Rotate(a, 37); + a += Fetch64(s + len - 24); + c += Rotate(a, 7); + a += Fetch64(s + len - 16); + uint64_t wf = a + z; + uint64_t ws = b + Rotate(a, 31) + c; + uint64_t r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0); + return ShiftMix(r * k0 + vs) * k2; +} + +uint64_t CityHash64(const char *s, size_t len) { + if (len <= 32) { + if (len <= 16) { + return HashLen0to16(s, len); + } else { + return HashLen17to32(s, len); + } + } else if (len <= 64) { + return HashLen33to64(s, len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + uint64_t x = Fetch64(s + len - 40); + uint64_t y = Fetch64(s + len - 16) + Fetch64(s + len - 56); + uint64_t z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); + TX128Data v,w; + + WeakHashLen32WithSeeds(v, s + len - 64, len, z); + WeakHashLen32WithSeeds(w, s + len - 32, y + k1, x); + x = x * k1 + Fetch64(s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + len = (len - 1) & ~static_cast(63); + do { + x = Rotate(x + y + v.u64[0] + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.u64[1] + Fetch64(s + 48), 42) * k1; + x ^= w.u64[1]; + y += v.u64[0] + Fetch64(s + 40); + z = Rotate(z + w.u64[0], 33) * k1; + WeakHashLen32WithSeeds(v, s, v.u64[1] * k1, x + w.u64[0]); + WeakHashLen32WithSeeds(w, s + 32, z + w.u64[1], y + Fetch64(s + 16)); + uint64_t tmp=z;z=x;x=tmp; + s += 64; + len -= 64; + } while (len != 0); + return HashLen16(HashLen16(v.u64[0], w.u64[0]) + ShiftMix(y) * k1 + z, + HashLen16(v.u64[1], w.u64[1]) + x); +} + + +uint64_t CityHash64WithSeeds(const char *s, size_t len, + uint64_t seed0, uint64_t seed1) { + return HashLen16(CityHash64(s, len) - seed0, seed1); +} + +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed) { + return CityHash64WithSeeds(s, len, k2, seed); +} + +uint64_t FastStrHash(const char *str,int len) +{ + if(len<0) + len = strlen(str); + + return CityHash64(str,len); +} + +uint64_t FastIntHash(uint64_t hash,uint64_t seed) +{ + return HashLen16(hash - k2, seed); +} diff --git a/RHF_64/router_mega/City64.h b/RHF_64/router_mega/City64.h new file mode 100755 index 0000000..d33da75 --- /dev/null +++ b/RHF_64/router_mega/City64.h @@ -0,0 +1,54 @@ +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides a few functions for hashing strings. On x86-64 +// hardware in 2011, CityHash64() is faster than other high-quality +// hash functions, such as Murmur. This is largely due to higher +// instruction-level parallelism. CityHash64() and CityHash128() also perform +// well on hash-quality tests. +// +// CityHash128() is optimized for relatively long strings and returns +// a 128-bit hash. For strings more than about 2000 bytes it can be +// faster than CityHash64(). +// +// Functions in the CityHash family are not suitable for cryptography. +// +// WARNING: This code has not been tested on big-endian platforms! +// It is known to work well on little-endian platforms that have a small penalty +// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs. +// +// By the way, for some hash functions, given strings a and b, the hash +// of a+b is easily derived from the hashes of a and b. This property +// doesn't hold for any hash functions in this file. + +#ifndef CITY_HASH_64_H_ +#define CITY_HASH_64_H_ + +#include +#include + +// Hash function for a byte array. +uint64_t CityHash64(const char *buf, size_t len); +uint64_t CityHash64WithSeed(const char *s, size_t len, uint64_t seed); +uint64_t CityHash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t seed1); +uint64_t FastIntHash(uint64_t hash, uint64_t seed); +#endif // CITY_HASH_H_ diff --git a/RHF_64/router_mega/FastStrHash.h b/RHF_64/router_mega/FastStrHash.h new file mode 100755 index 0000000..8e59f44 --- /dev/null +++ b/RHF_64/router_mega/FastStrHash.h @@ -0,0 +1,17 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef FastStrHashH +#define FastStrHashH +//---- -------------------------------------------------------------------------------------------------------- +#include +//#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +/*--------------------------------------------------------------------------- +A wrapper on Google's City64 hash function. +---------------------------------------------------------------------------*/ +uint64_t FastStrHash(const char *str,int len=-1); +uint64_t FastIntHash(uint64_t hash,uint64_t seed); +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Generate b/RHF_64/router_mega/Generate new file mode 100755 index 0000000..93eb82e Binary files /dev/null and b/RHF_64/router_mega/Generate differ diff --git a/RHF_64/router_mega/Generator.cpp b/RHF_64/router_mega/Generator.cpp new file mode 100755 index 0000000..559eb6e --- /dev/null +++ b/RHF_64/router_mega/Generator.cpp @@ -0,0 +1,298 @@ + +#include +#include +#include "Array.h" +#include "Builder/PerfectRouterBuilder1.h" +#include "Builder/PerfectRouterBuilder2.h" +#include "Builder/PerfectRouterBuilder3.h" +//------------------------------------------------------------------------------ +using namespace std; + +bool generateFunction1(const char *funcFileName, uint64_t *hash, int *pn,int nHash) +{ + // // start with maximum number of buckets + // int bucketStart = 16384; + // int bucketEnd = 2048; // this number must be larger than 4 + // // start with minimum number slots + // int nSlotStart = 512; + // int nSlotEnd = 4096; + // start with maximum number of buckets + int bucketStart = 16384; + int bucketEnd = 16384; // this number must be larger than 4 + // start with minimum number slots + int nSlotStart = 4096; + int nSlotEnd = 4096; + + int slotWidth = 8; + int minCost = nSlotStart*slotWidth + bucketStart*2 + 1; + int bestBucketSize = bucketStart-1; + int bestSlotSize = nSlotStart; + + int nBucket; + int nSlot = nSlotStart; + + uint32_t rBest; + uint32_t mBest; + TArray dArrayBest; + TArray bucketArrayBest; + + TPerfectRouterBuilder1 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*slotWidth + nBucket*2; + if (curCost < minCost) + { + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %d \r\n", nHash); + // fprintf(stderr,"num of slots: %d \r\n", myB.r); + // fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + // Now, current myB contains the best parameters, output to files + ofstream output; + string outFileName = funcFileName; + output.open(outFileName); + output << rBest << endl; + output << mBest << endl; + // output each d value in d[](dArrayBest) + for (int slot=0;slot dArrayBest; + TArray bucketArrayBest; + + TPerfectRouterBuilder2 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + fprintf(stderr,"nslots: %d \r\n", nSlot); + fprintf(stderr,"nbuckets: %d \r\n", nBucket); + // number of slots + int curCost = nSlot* slotWidth + nBucket*2; + if (curCost < minCost) + { + bool success_s = false; + if (success_s) + { + break; + } + + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %d \r\n", nHash); + fprintf(stderr,"num of slots: %d \r\n", myB.r); + fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + success_s = true; + break; + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart+1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + // Now, current myB contains the best parameters, output to files + ofstream output; + string outFileName = funcFileName; + output.open(outFileName); + output << rBest << endl; + output << mBest << endl; + // output each d value in d[](dArrayBest) + for (int slot=0;slot dArrayBest; + TArray bucketArrayBest; + + TPerfectRouterBuilder1 myB; + while (nSlot <= nSlotEnd) + { + nBucket = bucketStart; + while(nBucket >= bucketEnd) + { + // fprintf(stderr,"nslots: %d \r\n", nSlot); + // fprintf(stderr,"nbuckets: %d \r\n", nBucket); + int curCost = nSlot*slotWidth + nBucket*2; + if (curCost < minCost) + { + // build the current router function with r, m + bool success = myB.Build(pn, hash, nHash, nBucket, nSlot); + if (success) { + minCost = curCost; + bestBucketSize = nBucket; + bestSlotSize = nSlot; + // fprintf(stderr,"success!!! \r\n"); + // fprintf(stderr,"nHashPerSlot: %d \r\n", nHashPerSlot); + // fprintf(stderr,"num of hash keys, nHash: %d \r\n", nHash); + // fprintf(stderr,"num of slots: %d \r\n", myB.r); + // fprintf(stderr,"num of buckets, nBucket: %d \r\n", myB.m); + rBest = myB.r; // same as bestSlotSize + mBest = myB.m; // same as bestBucketSize + dArrayBest.Close(); + dArrayBest.FastCopy(myB.dArray); + bucketArrayBest.Close(); + bucketArrayBest.FastCopy(myB.bucketArray); + } + } + nBucket = (int) nBucket / 2; + } + nSlot = (int) nSlot * 2; + } + if (bestBucketSize == bucketStart-1) + { + fprintf(stderr,"!!!!! failure for current key set file, please check the Generator !!!!!\r\n"); + } + // Now, current myB contains the best parameters, output to files + ofstream output; + string outFileName = funcFileName; + output.open(outFileName); + output << rBest << endl; + output << mBest << endl; + // output each d value in d[](dArrayBest) + for (int slot=0;slot + +//--------------------------------------------------------------------------- +#ifndef GeneratorH +#define GeneratorH +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +double generateFunction1(const char *funcFileName, uint64_t *hash, int *pn,int nHash); +double generateFunction2(const char *funcFileName, uint64_t *hash, int *pn,int nHash); +double generateFunction3(const char *funcFileName, uint64_t *hash, int *pn,int nHash); + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_64/router_mega/IntUtils.cpp b/RHF_64/router_mega/IntUtils.cpp new file mode 100755 index 0000000..9ba1eec --- /dev/null +++ b/RHF_64/router_mega/IntUtils.cpp @@ -0,0 +1,184 @@ +//--------------------------------------------------------------------------- +#include "IntUtils.h" +#include +// #include "Sys/CpuUtils.h" +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2) +{ +#if defined(XrossCPP_In_64) + return ((__int128_t)val1 * val2) >> 64; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + return (m2>>32) + (uint64_t)v1H*v2H + (c>>31); +#endif +} +//--------------------------------------------------------------------------- +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low) +{ +#if defined(XrossCPP_In_64) + __int128_t tmp = (__int128_t)val1 * val2; + high = (uint64_t)(tmp>>64); + low = (uint64_t) tmp; +#else + uint32_t v1L = (uint32_t)(val1&0xfffffffful); + uint32_t v1H = (uint32_t)((val1>>32)&0xfffffffful); + uint32_t v2L = (uint32_t)(val2&0xfffffffful); + uint32_t v2H = (uint32_t)((val2>>32)&0xfffffffful); + + uint64_t mLL = (uint64_t)v1L*v2L; + + uint64_t mHL = (uint64_t)v1H*v2L; + uint64_t mLH = (uint64_t)v1L*v2H; + + uint64_t m1 = mHL+mLH; + uint64_t m2 = m1 +(mLL>>32); + + uint64_t c = ( (mHL&mLH) | ((mHL^mLH)&~m2) ) & (1ull<<63); + + high = (m2>>32) + (uint64_t)v1H*v2H + (c>>31); + low = mLL+(m1<<32); +#endif +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val) +{ + val--; + val |= val >> 1; + val |= val >> 2; + val |= val >> 4; + val |= val >> 8; + val |= val >> 16; + val |= val >> 32; + return val+1; +} +//--------------------------------------------------------------------------- +// We havn't implement them yet +//--------------------------------------------------------------------------- +/* +#ifndef XrossCPP_In_64 +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2) +{ + assert(0); +} +#endif // XrossCPP_In_64 +*/ +// //--------------------------------------------------------------------------- +// static bool RM_witness(uint64_t n, uint64_t a, uint64_t s, unsigned tMinus1) +// { +// uint64_t v = 1; + +// while (s > 0) +// { +// if ( (s&1) == 1 ) +// v = Mul64Mod(n,v,a); + +// a = Mul64Mod(n,a,a); +// s >>= 1; +// } + +// if (1 == v) +// return true; + +// uint64_t nM1 = n-1; + +// for (unsigned i = 0; v != nM1; i++) +// { +// if (i == tMinus1) +// return false; + +// v = Mul64Mod(n,v,v); +// } + +// return true; +// } +//--------------------------------------------------------------------------- +bool RM_PrimeTest(uint64_t p) +{ + uint64_t x = (uint64_t)sqrt(p); + uint64_t i = 3; + if(p==2)return true; + if(p%2 == 0)return false; + while(i>= t; + +// t--; // we use t-1 all the time + +// /* +// * Witness 2 is deterministic for all n < 2047. Witnesses 2, 7, 61 +// * are deterministic for all n < 4,759,123,141. +// */ + +// if (RM_witness(n, 2, s, t)==false) +// return false; + +// if (n < 2027) +// return true; + +// if (RM_witness(n, 7, s, t)==false) +// return false; + +// if(n<4759123141ull) +// return RM_witness(n, 61, s, t); + +// static const uint8_t witness64[] = { 3, 5, 11, 13, 17, 19, 23, 29, 31, 37 }; // 2 & 7 are tested already + +// for (unsigned i = 0; i < (sizeof(witness64)/sizeof(witness64[0])); i++) +// { +// if (!RM_witness(n, witness64[i], s, t)) +// return false; +// } + +// return true; +// } +//--------------------------------------------------------------------------- +uint64_t RoundUpPrime(uint64_t val) +{ + val |= 1; + + while( (RM_PrimeTest(val)==false) && (val>1) ) + val += 2; + + return (val<=1?0:val); +} +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/IntUtils.h b/RHF_64/router_mega/IntUtils.h new file mode 100755 index 0000000..68ad792 --- /dev/null +++ b/RHF_64/router_mega/IntUtils.h @@ -0,0 +1,62 @@ +//--------------------------------------------------------------------------- +#ifndef IntUtilsH +#define IntUtilsH +//--------------------------------------------------------------------------- +#include +#include +#include +#include "Type64.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +uint64_t MulHigh(uint64_t val1,uint64_t val2); +void Mul64(uint64_t val1,uint64_t val2,uint64_t &high,uint64_t &low); +//--------------------------------------------------------------------------- +// Following functions can be optimized by asm +// mul1*mul2 -> 64-bit result%d +inline uint32_t /*__fastcall*/ MulMod(uint32_t m1,uint32_t m2,uint32_t d) +{ + return (uint32_t)(((uint64_t)m1*m2)%d); +} +// p1*p2 -> 64-bit result+c +inline uint64_t /*__fastcall*/ MulAdd(uint32_t m1,uint32_t m2,uint32_t c) +{ + return ((uint64_t)m1*m2)+c; +} +// m1*m2 -> 64-bit result +inline uint64_t /*__fastcall*/ Mul(uint32_t m1,uint32_t m2) +{ + return ((uint64_t)m1*m2); +} +//--------------------------------------------------------------------------- +uint64_t RoundUpPow2(uint64_t val); +uint64_t RoundUpPrime(uint64_t val); +/*--------------------------------------------------------------------------- +Rabin-Miller primality test for up to max uint64_t. +Causion: we think 0, 1, 2 are not prime. +Causion: only work on x64 platform. +---------------------------------------------------------------------------*/ +bool RM_PrimeTest(uint64_t n); +//--------------------------------------------------------------------------- +//High efficient mul and div funcs for x64 platform only +//#ifdef XrossCPP_In_X64 +#ifdef __cplusplus +extern "C" +{ +#endif//__cplusplus +//--------------------------------------------------------------------------- +/* (m1*m2) % modV */ +uint64_t Mul64Mod(uint64_t modV,uint64_t m1,uint64_t m2); +/* (m1*m2) / divV */ +uint64_t Mul64Div(uint64_t divV,uint64_t m1,uint64_t m2); +/* (m1*m2) /% divV, return both */ +TX128Data Mul64DivFull(uint64_t divV,uint64_t m1,uint64_t m2); +//--------------------------------------------------------------------------- +#ifdef __cplusplus +} +#endif//__cplusplus +//#endif //XrossCPP_In_X64 +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Makefile b/RHF_64/router_mega/Makefile new file mode 100755 index 0000000..cc4fd6b --- /dev/null +++ b/RHF_64/router_mega/Makefile @@ -0,0 +1,658 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/keran2/Work/RHF/router_mega + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/keran2/Work/RHF/router_mega + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/RHF/router_mega/CMakeFiles /home/keran2/Work/RHF/router_mega/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/keran2/Work/RHF/router_mega/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named Generate + +# Build rule for target. +Generate: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 Generate +.PHONY : Generate + +# fast build rule for target. +Generate/fast: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/build +.PHONY : Generate/fast + +AllocatorBase.o: AllocatorBase.cpp.o + +.PHONY : AllocatorBase.o + +# target to build an object file +AllocatorBase.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.o +.PHONY : AllocatorBase.cpp.o + +AllocatorBase.i: AllocatorBase.cpp.i + +.PHONY : AllocatorBase.i + +# target to preprocess a source file +AllocatorBase.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.i +.PHONY : AllocatorBase.cpp.i + +AllocatorBase.s: AllocatorBase.cpp.s + +.PHONY : AllocatorBase.s + +# target to generate assembly for a file +AllocatorBase.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorBase.cpp.s +.PHONY : AllocatorBase.cpp.s + +AllocatorC.o: AllocatorC.cpp.o + +.PHONY : AllocatorC.o + +# target to build an object file +AllocatorC.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.o +.PHONY : AllocatorC.cpp.o + +AllocatorC.i: AllocatorC.cpp.i + +.PHONY : AllocatorC.i + +# target to preprocess a source file +AllocatorC.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.i +.PHONY : AllocatorC.cpp.i + +AllocatorC.s: AllocatorC.cpp.s + +.PHONY : AllocatorC.s + +# target to generate assembly for a file +AllocatorC.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/AllocatorC.cpp.s +.PHONY : AllocatorC.cpp.s + +ArrayPre.o: ArrayPre.cpp.o + +.PHONY : ArrayPre.o + +# target to build an object file +ArrayPre.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.o +.PHONY : ArrayPre.cpp.o + +ArrayPre.i: ArrayPre.cpp.i + +.PHONY : ArrayPre.i + +# target to preprocess a source file +ArrayPre.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.i +.PHONY : ArrayPre.cpp.i + +ArrayPre.s: ArrayPre.cpp.s + +.PHONY : ArrayPre.s + +# target to generate assembly for a file +ArrayPre.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/ArrayPre.cpp.s +.PHONY : ArrayPre.cpp.s + +Builder/PerfectRouterBuilder1.o: Builder/PerfectRouterBuilder1.cpp.o + +.PHONY : Builder/PerfectRouterBuilder1.o + +# target to build an object file +Builder/PerfectRouterBuilder1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.o +.PHONY : Builder/PerfectRouterBuilder1.cpp.o + +Builder/PerfectRouterBuilder1.i: Builder/PerfectRouterBuilder1.cpp.i + +.PHONY : Builder/PerfectRouterBuilder1.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.i +.PHONY : Builder/PerfectRouterBuilder1.cpp.i + +Builder/PerfectRouterBuilder1.s: Builder/PerfectRouterBuilder1.cpp.s + +.PHONY : Builder/PerfectRouterBuilder1.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder1.cpp.s +.PHONY : Builder/PerfectRouterBuilder1.cpp.s + +Builder/PerfectRouterBuilder2.o: Builder/PerfectRouterBuilder2.cpp.o + +.PHONY : Builder/PerfectRouterBuilder2.o + +# target to build an object file +Builder/PerfectRouterBuilder2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.o +.PHONY : Builder/PerfectRouterBuilder2.cpp.o + +Builder/PerfectRouterBuilder2.i: Builder/PerfectRouterBuilder2.cpp.i + +.PHONY : Builder/PerfectRouterBuilder2.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.i +.PHONY : Builder/PerfectRouterBuilder2.cpp.i + +Builder/PerfectRouterBuilder2.s: Builder/PerfectRouterBuilder2.cpp.s + +.PHONY : Builder/PerfectRouterBuilder2.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder2.cpp.s +.PHONY : Builder/PerfectRouterBuilder2.cpp.s + +Builder/PerfectRouterBuilder3.o: Builder/PerfectRouterBuilder3.cpp.o + +.PHONY : Builder/PerfectRouterBuilder3.o + +# target to build an object file +Builder/PerfectRouterBuilder3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.o +.PHONY : Builder/PerfectRouterBuilder3.cpp.o + +Builder/PerfectRouterBuilder3.i: Builder/PerfectRouterBuilder3.cpp.i + +.PHONY : Builder/PerfectRouterBuilder3.i + +# target to preprocess a source file +Builder/PerfectRouterBuilder3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.i +.PHONY : Builder/PerfectRouterBuilder3.cpp.i + +Builder/PerfectRouterBuilder3.s: Builder/PerfectRouterBuilder3.cpp.s + +.PHONY : Builder/PerfectRouterBuilder3.s + +# target to generate assembly for a file +Builder/PerfectRouterBuilder3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Builder/PerfectRouterBuilder3.cpp.s +.PHONY : Builder/PerfectRouterBuilder3.cpp.s + +CTimer1.o: CTimer1.cpp.o + +.PHONY : CTimer1.o + +# target to build an object file +CTimer1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.o +.PHONY : CTimer1.cpp.o + +CTimer1.i: CTimer1.cpp.i + +.PHONY : CTimer1.i + +# target to preprocess a source file +CTimer1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.i +.PHONY : CTimer1.cpp.i + +CTimer1.s: CTimer1.cpp.s + +.PHONY : CTimer1.s + +# target to generate assembly for a file +CTimer1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer1.cpp.s +.PHONY : CTimer1.cpp.s + +CTimer2.o: CTimer2.cpp.o + +.PHONY : CTimer2.o + +# target to build an object file +CTimer2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.o +.PHONY : CTimer2.cpp.o + +CTimer2.i: CTimer2.cpp.i + +.PHONY : CTimer2.i + +# target to preprocess a source file +CTimer2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.i +.PHONY : CTimer2.cpp.i + +CTimer2.s: CTimer2.cpp.s + +.PHONY : CTimer2.s + +# target to generate assembly for a file +CTimer2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer2.cpp.s +.PHONY : CTimer2.cpp.s + +CTimer3.o: CTimer3.cpp.o + +.PHONY : CTimer3.o + +# target to build an object file +CTimer3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.o +.PHONY : CTimer3.cpp.o + +CTimer3.i: CTimer3.cpp.i + +.PHONY : CTimer3.i + +# target to preprocess a source file +CTimer3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.i +.PHONY : CTimer3.cpp.i + +CTimer3.s: CTimer3.cpp.s + +.PHONY : CTimer3.s + +# target to generate assembly for a file +CTimer3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/CTimer3.cpp.s +.PHONY : CTimer3.cpp.s + +City64.o: City64.cpp.o + +.PHONY : City64.o + +# target to build an object file +City64.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.o +.PHONY : City64.cpp.o + +City64.i: City64.cpp.i + +.PHONY : City64.i + +# target to preprocess a source file +City64.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.i +.PHONY : City64.cpp.i + +City64.s: City64.cpp.s + +.PHONY : City64.s + +# target to generate assembly for a file +City64.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/City64.cpp.s +.PHONY : City64.cpp.s + +Generator.o: Generator.cpp.o + +.PHONY : Generator.o + +# target to build an object file +Generator.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.o +.PHONY : Generator.cpp.o + +Generator.i: Generator.cpp.i + +.PHONY : Generator.i + +# target to preprocess a source file +Generator.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.i +.PHONY : Generator.cpp.i + +Generator.s: Generator.cpp.s + +.PHONY : Generator.s + +# target to generate assembly for a file +Generator.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Generator.cpp.s +.PHONY : Generator.cpp.s + +IntUtils.o: IntUtils.cpp.o + +.PHONY : IntUtils.o + +# target to build an object file +IntUtils.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.o +.PHONY : IntUtils.cpp.o + +IntUtils.i: IntUtils.cpp.i + +.PHONY : IntUtils.i + +# target to preprocess a source file +IntUtils.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.i +.PHONY : IntUtils.cpp.i + +IntUtils.s: IntUtils.cpp.s + +.PHONY : IntUtils.s + +# target to generate assembly for a file +IntUtils.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/IntUtils.cpp.s +.PHONY : IntUtils.cpp.s + +Performance/Performance.o: Performance/Performance.cpp.o + +.PHONY : Performance/Performance.o + +# target to build an object file +Performance/Performance.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.o +.PHONY : Performance/Performance.cpp.o + +Performance/Performance.i: Performance/Performance.cpp.i + +.PHONY : Performance/Performance.i + +# target to preprocess a source file +Performance/Performance.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.i +.PHONY : Performance/Performance.cpp.i + +Performance/Performance.s: Performance/Performance.cpp.s + +.PHONY : Performance/Performance.s + +# target to generate assembly for a file +Performance/Performance.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Performance/Performance.cpp.s +.PHONY : Performance/Performance.cpp.s + +Tester/PerfectRouterTester1.o: Tester/PerfectRouterTester1.cpp.o + +.PHONY : Tester/PerfectRouterTester1.o + +# target to build an object file +Tester/PerfectRouterTester1.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.o +.PHONY : Tester/PerfectRouterTester1.cpp.o + +Tester/PerfectRouterTester1.i: Tester/PerfectRouterTester1.cpp.i + +.PHONY : Tester/PerfectRouterTester1.i + +# target to preprocess a source file +Tester/PerfectRouterTester1.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.i +.PHONY : Tester/PerfectRouterTester1.cpp.i + +Tester/PerfectRouterTester1.s: Tester/PerfectRouterTester1.cpp.s + +.PHONY : Tester/PerfectRouterTester1.s + +# target to generate assembly for a file +Tester/PerfectRouterTester1.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester1.cpp.s +.PHONY : Tester/PerfectRouterTester1.cpp.s + +Tester/PerfectRouterTester2.o: Tester/PerfectRouterTester2.cpp.o + +.PHONY : Tester/PerfectRouterTester2.o + +# target to build an object file +Tester/PerfectRouterTester2.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.o +.PHONY : Tester/PerfectRouterTester2.cpp.o + +Tester/PerfectRouterTester2.i: Tester/PerfectRouterTester2.cpp.i + +.PHONY : Tester/PerfectRouterTester2.i + +# target to preprocess a source file +Tester/PerfectRouterTester2.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.i +.PHONY : Tester/PerfectRouterTester2.cpp.i + +Tester/PerfectRouterTester2.s: Tester/PerfectRouterTester2.cpp.s + +.PHONY : Tester/PerfectRouterTester2.s + +# target to generate assembly for a file +Tester/PerfectRouterTester2.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester2.cpp.s +.PHONY : Tester/PerfectRouterTester2.cpp.s + +Tester/PerfectRouterTester3.o: Tester/PerfectRouterTester3.cpp.o + +.PHONY : Tester/PerfectRouterTester3.o + +# target to build an object file +Tester/PerfectRouterTester3.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.o +.PHONY : Tester/PerfectRouterTester3.cpp.o + +Tester/PerfectRouterTester3.i: Tester/PerfectRouterTester3.cpp.i + +.PHONY : Tester/PerfectRouterTester3.i + +# target to preprocess a source file +Tester/PerfectRouterTester3.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.i +.PHONY : Tester/PerfectRouterTester3.cpp.i + +Tester/PerfectRouterTester3.s: Tester/PerfectRouterTester3.cpp.s + +.PHONY : Tester/PerfectRouterTester3.s + +# target to generate assembly for a file +Tester/PerfectRouterTester3.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/Tester/PerfectRouterTester3.cpp.s +.PHONY : Tester/PerfectRouterTester3.cpp.s + +main.o: main.cpp.o + +.PHONY : main.o + +# target to build an object file +main.cpp.o: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i + +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s + +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + $(MAKE) -f CMakeFiles/Generate.dir/build.make CMakeFiles/Generate.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... Generate" + @echo "... edit_cache" + @echo "... AllocatorBase.o" + @echo "... AllocatorBase.i" + @echo "... AllocatorBase.s" + @echo "... AllocatorC.o" + @echo "... AllocatorC.i" + @echo "... AllocatorC.s" + @echo "... ArrayPre.o" + @echo "... ArrayPre.i" + @echo "... ArrayPre.s" + @echo "... Builder/PerfectRouterBuilder1.o" + @echo "... Builder/PerfectRouterBuilder1.i" + @echo "... Builder/PerfectRouterBuilder1.s" + @echo "... Builder/PerfectRouterBuilder2.o" + @echo "... Builder/PerfectRouterBuilder2.i" + @echo "... Builder/PerfectRouterBuilder2.s" + @echo "... Builder/PerfectRouterBuilder3.o" + @echo "... Builder/PerfectRouterBuilder3.i" + @echo "... Builder/PerfectRouterBuilder3.s" + @echo "... CTimer1.o" + @echo "... CTimer1.i" + @echo "... CTimer1.s" + @echo "... CTimer2.o" + @echo "... CTimer2.i" + @echo "... CTimer2.s" + @echo "... CTimer3.o" + @echo "... CTimer3.i" + @echo "... CTimer3.s" + @echo "... City64.o" + @echo "... City64.i" + @echo "... City64.s" + @echo "... Generator.o" + @echo "... Generator.i" + @echo "... Generator.s" + @echo "... IntUtils.o" + @echo "... IntUtils.i" + @echo "... IntUtils.s" + @echo "... Performance/Performance.o" + @echo "... Performance/Performance.i" + @echo "... Performance/Performance.s" + @echo "... Tester/PerfectRouterTester1.o" + @echo "... Tester/PerfectRouterTester1.i" + @echo "... Tester/PerfectRouterTester1.s" + @echo "... Tester/PerfectRouterTester2.o" + @echo "... Tester/PerfectRouterTester2.i" + @echo "... Tester/PerfectRouterTester2.s" + @echo "... Tester/PerfectRouterTester3.o" + @echo "... Tester/PerfectRouterTester3.i" + @echo "... Tester/PerfectRouterTester3.s" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/RHF_64/router_mega/Performance/Performance.cpp b/RHF_64/router_mega/Performance/Performance.cpp new file mode 100755 index 0000000..7c170b8 --- /dev/null +++ b/RHF_64/router_mega/Performance/Performance.cpp @@ -0,0 +1,21 @@ +// not use anymore + +//--------------------------------------------------------------------------- +#include "../IntUtils.h" +#include +#include +#include "Performance.h" +//--------------------------------------------------------------------------- +// Time calculation +float diffUserTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_utime.tv_sec - start->ru_utime.tv_sec) + + 1e-6*(end->ru_utime.tv_usec - start->ru_utime.tv_usec); +} + +float diffSystemTime(struct rusage *start, struct rusage *end) +{ + return (end->ru_stime.tv_sec - start->ru_stime.tv_sec) + + 1e-6*(end->ru_stime.tv_usec - start->ru_stime.tv_usec); +} +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Performance/Performance.h b/RHF_64/router_mega/Performance/Performance.h new file mode 100755 index 0000000..a8e4128 --- /dev/null +++ b/RHF_64/router_mega/Performance/Performance.h @@ -0,0 +1,19 @@ +// not use anymore + +//--------------------------------------------------------------------------- +#ifndef PerformanceH +#define PerformanceH +//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- + +float diffUserTime(struct rusage *start, struct rusage *end); + +float diffSystemTime(struct rusage *start, struct rusage *end); + + +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif diff --git a/RHF_64/router_mega/SortBase.h b/RHF_64/router_mega/SortBase.h new file mode 100755 index 0000000..7f2c4bf --- /dev/null +++ b/RHF_64/router_mega/SortBase.h @@ -0,0 +1,20 @@ +//---- -------------------------------------------------------------------------------------------------------- +#ifndef sortBaseH +#define sortBaseH +//---- -------------------------------------------------------------------------------------------------------- +#include +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(push,1) +//---- -------------------------------------------------------------------------------------------------------- +typedef int (*TSortCmp)(const void *r1,const void *r2); +//---- -------------------------------------------------------------------------------------------------------- +inline void XchgStorage(void *d1,void *d2,void *buff,int w) +{ + memcpy(buff,d1,w); + memcpy(d1,d2,w); + memcpy(d2,buff,w); +} +//---- -------------------------------------------------------------------------------------------------------- +#pragma pack(pop) +//---- -------------------------------------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Tester/PerfectRouterTester1.cpp b/RHF_64/router_mega/Tester/PerfectRouterTester1.cpp new file mode 100755 index 0000000..f35db1f --- /dev/null +++ b/RHF_64/router_mega/Tester/PerfectRouterTester1.cpp @@ -0,0 +1,146 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +#include "PerfectRouterTester1.h" +#include "../Performance/Performance.h" +//--------------------------------------------------------------------------- +using namespace std; +//--------------------------------------------------------------------------- +// bool checkFunc(const int *pn, const uint32_t *hash, const int nHash, const int nSlot, const int nBucket, TArray TdArray, TArray TbucketArray) +// { +// int bucketWidth = (int) (log(nBucket)/log(2)); +// int shiftBucket = 32 - bucketWidth; + +// int nSlotWidth = (int)(log(nSlot)/log(2)); +// int shiftSlot = 32 - nSlotWidth; +// fprintf(stderr,"TdArray length: %d\r\n", TdArray.Number); +// fprintf(stderr,"TbucketArray Number: %d\r\n", TbucketArray.Number); + +// for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + +// // Step2: slot lookup +// fprintf(stderr,"hash[i]: %u\r\n", hash[i]); +// fprintf(stderr,"nSlot: %d\r\n", nSlot); +// fprintf(stderr,"shiftSlot: %d\r\n", shiftSlot); +// fprintf(stderr,"idx: %d\r\n", idx); +// int d = TdArray[idx]; + +// // Step3: universal shift hash and mod m +// uint32_t x_key = hash[i] >> 8; +// int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + +// // Step4: Interface number lookup +// fprintf(stderr,"f: %d\r\n", f); +// if (TbucketArray[f] != pn[i]) +// { +// return false; +// } +// } +// return true; +// } + +bool TPerfectRouterTester1::Test(const char *funcFileName, uint64_t *hash, int *pn,int nHash) +{ + // get function paprameters from function.txt + ifstream fInput(funcFileName, ios::in); + string funcLine; + // load r(nSlot) and m(nBucket) + getline(fInput, funcLine); + int nSlot = atoi(funcLine.c_str()); + getline(fInput, funcLine); + int nBucket = atoi(funcLine.c_str()); + + // initialize the array for TdArray[] and TbucketArray[] + TdArray.AllocFill(24+nSlot*sizeof(int)); // 16bit x nSlot + TdArray.InitZero(); + + TbucketArray.AllocFill(24+nBucket*sizeof(int)); // 32bit x number of buckets + TbucketArray.InitZero(); + + // load slot values for TdArray[] + for (int dIdx=0;dIdx> shiftSlot; // int idx = hash[i]%nSlot; + + // Step2: slot lookup + int d = TdArray[idx]; + + // Step3: universal shift hash and mod m + uint64_t x_key = hash[i] >> 12; + + uint64_t add1A = (x_key >> 50); + uint64_t add1B = (x_key >> 36); + uint64_t add2C = (x_key >> 24); + uint64_t add2D = (x_key >> 12); + + int f = ((add1A + add1B * (uint64_t)d) ^ (add2C + add2D * (uint64_t)d)) << shiftBucket >> shiftBucket; + + // int f = ( (((x_key << 39 >> 39) * (uint64_t)d + (x_key >> 25)) >> 15) << shiftBucket >> shiftBucket); + // int f = ( ((x_key * (uint64_t)d) >> 16) << shiftBucket >> shiftBucket); + + // Step4: Interface number lookup + if (TbucketArray[f] != pn[i]) + { + fprintf(stderr,"############################################### \r\n"); + fprintf(stderr,"testing fail for %s \r\n", funcFileName); + fprintf(stderr,"############################################### \r\n"); + fInput.close(); + return false; + } + } + getrusage(RUSAGE_SELF, &tEnd); + + fprintf(stderr,"Testing success for %s \r\n", funcFileName); + float tu = diffUserTime(&tStart, &tEnd); + float ts = diffSystemTime(&tStart, &tEnd); + float tTotal = tu + ts; + fprintf(stderr,"Testing time for all keys:\n %.06f sec, %.06f user, %.06f system\n", + tTotal, tu, ts); + fInput.close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Tester/PerfectRouterTester1.h b/RHF_64/router_mega/Tester/PerfectRouterTester1.h new file mode 100755 index 0000000..56ddfca --- /dev/null +++ b/RHF_64/router_mega/Tester/PerfectRouterTester1.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterTester1H +#define PerfectRouterTester1H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TPerfectRouterTester1 +{ +public: + TArray TdArray; + TArray TbucketArray; + + ~TPerfectRouterTester1() + { + Close(); + } + + void Close() + { + TdArray.Close(); + TbucketArray.Close(); + } + + bool Test(const char *funcFileName, uint64_t *hash, int *pn,int nHash); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Tester/PerfectRouterTester2.cpp b/RHF_64/router_mega/Tester/PerfectRouterTester2.cpp new file mode 100755 index 0000000..aa0ed31 --- /dev/null +++ b/RHF_64/router_mega/Tester/PerfectRouterTester2.cpp @@ -0,0 +1,138 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +#include "PerfectRouterTester2.h" +#include "../Performance/Performance.h" +//--------------------------------------------------------------------------- +using namespace std; +//--------------------------------------------------------------------------- +// bool checkFunc(const int *pn, const uint32_t *hash, const int nHash, const int nSlot, const int nBucket, TArray TdArray, TArray TbucketArray) +// { +// int bucketWidth = (int) (log(nBucket)/log(2)); +// int shiftBucket = 32 - bucketWidth; + +// int nSlotWidth = (int)(log(nSlot)/log(2)); +// int shiftSlot = 32 - nSlotWidth; +// fprintf(stderr,"TdArray length: %d\r\n", TdArray.Number); +// fprintf(stderr,"TbucketArray Number: %d\r\n", TbucketArray.Number); + +// for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + +// // Step2: slot lookup +// fprintf(stderr,"hash[i]: %u\r\n", hash[i]); +// fprintf(stderr,"nSlot: %d\r\n", nSlot); +// fprintf(stderr,"shiftSlot: %d\r\n", shiftSlot); +// fprintf(stderr,"idx: %d\r\n", idx); +// int d = TdArray[idx]; + +// // Step3: universal shift hash and mod m +// uint32_t x_key = hash[i] >> 8; +// int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + +// // Step4: Interface number lookup +// fprintf(stderr,"f: %d\r\n", f); +// if (TbucketArray[f] != pn[i]) +// { +// return false; +// } +// } +// return true; +// } + +bool TPerfectRouterTester2::Test(const char *funcFileName, uint64_t *hash, int *pn,int nHash) +{ + // get function paprameters from function.txt + ifstream fInput(funcFileName, ios::in); + string funcLine; + // load r(nSlot) and m(nBucket) + getline(fInput, funcLine); + int nSlot = atoi(funcLine.c_str()); + getline(fInput, funcLine); + int nBucket = atoi(funcLine.c_str()); + + // initialize the array for TdArray[] and TbucketArray[] + TdArray.AllocFill(24+nSlot*sizeof(int)); // 16bit x nSlot + TdArray.InitZero(); + + TbucketArray.AllocFill(24+nBucket*sizeof(int)); // 32bit x number of buckets + TbucketArray.InitZero(); + + // load slot values for TdArray[] + for (int dIdx=0;dIdx> sl0) ^ (hash[i] << sl1) ^ hash[i]) << shiftSlot >> shiftSlot); + int idx = (hash[i] << shiftSlot) >> shiftSlot; // int idx = hash[i]%nSlot; + + // Step2: slot lookup + int d = TdArray[idx]; + + // Step3: universal shift hash and mod m + // uint64_t x_key = hash[i] >> 13; + uint64_t x_key = sortedHash[startPos+j] >> 16; // 64 - 16 = 48 + int f = ( ((x_key + (uint64_t)d) >> 8) << shiftBucket >> shiftBucket); + // Step4: Interface number lookup + if (TbucketArray[f] != pn[i]) + { + fprintf(stderr,"############################################### \r\n"); + fprintf(stderr,"testing fail for %s \r\n", funcFileName); + fprintf(stderr,"############################################### \r\n"); + fInput.close(); + return false; + } + } + getrusage(RUSAGE_SELF, &tEnd); + + fprintf(stderr,"Testing success for %s \r\n", funcFileName); + float tu = diffUserTime(&tStart, &tEnd); + float ts = diffSystemTime(&tStart, &tEnd); + float tTotal = tu + ts; + fprintf(stderr,"Testing time for all keys:\n %.06f sec, %.06f user, %.06f system\n", + tTotal, tu, ts); + fInput.close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Tester/PerfectRouterTester2.h b/RHF_64/router_mega/Tester/PerfectRouterTester2.h new file mode 100755 index 0000000..fd499fb --- /dev/null +++ b/RHF_64/router_mega/Tester/PerfectRouterTester2.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterTester2H +#define PerfectRouterTester2H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TPerfectRouterTester2 +{ +public: + TArray TdArray; + TArray TbucketArray; + + ~TPerfectRouterTester2() + { + Close(); + } + + void Close() + { + TdArray.Close(); + TbucketArray.Close(); + } + + bool Test(const char *funcFileName, uint64_t *hash, int *pn,int nHash); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Tester/PerfectRouterTester3.cpp b/RHF_64/router_mega/Tester/PerfectRouterTester3.cpp new file mode 100755 index 0000000..b46f0de --- /dev/null +++ b/RHF_64/router_mega/Tester/PerfectRouterTester3.cpp @@ -0,0 +1,146 @@ +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +#include "PerfectRouterTester3.h" +#include "../Performance/Performance.h" +//--------------------------------------------------------------------------- +using namespace std; +//--------------------------------------------------------------------------- +// bool checkFunc(const int *pn, const uint32_t *hash, const int nHash, const int nSlot, const int nBucket, TArray TdArray, TArray TbucketArray) +// { +// int bucketWidth = (int) (log(nBucket)/log(2)); +// int shiftBucket = 32 - bucketWidth; + +// int nSlotWidth = (int)(log(nSlot)/log(2)); +// int shiftSlot = 32 - nSlotWidth; +// fprintf(stderr,"TdArray length: %d\r\n", TdArray.Number); +// fprintf(stderr,"TbucketArray Number: %d\r\n", TbucketArray.Number); + +// for(int i=0;i> shiftSlot; // int idx = hash[i]%nSlot; + +// // Step2: slot lookup +// fprintf(stderr,"hash[i]: %u\r\n", hash[i]); +// fprintf(stderr,"nSlot: %d\r\n", nSlot); +// fprintf(stderr,"shiftSlot: %d\r\n", shiftSlot); +// fprintf(stderr,"idx: %d\r\n", idx); +// int d = TdArray[idx]; + +// // Step3: universal shift hash and mod m +// uint32_t x_key = hash[i] >> 8; +// int f = ( ((x_key * (uint32_t)d) >> 8) << shiftBucket >> shiftBucket); + +// // Step4: Interface number lookup +// fprintf(stderr,"f: %d\r\n", f); +// if (TbucketArray[f] != pn[i]) +// { +// return false; +// } +// } +// return true; +// } + +bool TPerfectRouterTester3::Test(const char *funcFileName, uint64_t *hash, int *pn,int nHash) +{ + // get function paprameters from function.txt + ifstream fInput(funcFileName, ios::in); + string funcLine; + // load r(nSlot) and m(nBucket) + getline(fInput, funcLine); + int nSlot = atoi(funcLine.c_str()); + getline(fInput, funcLine); + int nBucket = atoi(funcLine.c_str()); + + // initialize the array for TdArray[] and TbucketArray[] + TdArray.AllocFill(24+nSlot*sizeof(int)); // 16bit x nSlot + TdArray.InitZero(); + + TbucketArray.AllocFill(24+nBucket*sizeof(int)); // 32bit x number of buckets + TbucketArray.InitZero(); + + // load slot values for TdArray[] + for (int dIdx=0;dIdx> shiftSlot; // int idx = hash[i]%nSlot; + + // Step2: slot lookup + int d = TdArray[idx]; + + // Step3: universal shift hash and mod m + uint64_t x_key = hash[i] >> 10; + + uint64_t add1A = (x_key >> 50); + uint64_t add1B = (x_key >> 36); + uint64_t add2C = (x_key >> 23); + uint64_t add2D = (x_key >> 10); + + int f = ((add1A + add1B * (uint64_t)d) ^ (add2C + add2D * (uint64_t)d)) << shiftBucket >> shiftBucket; + + // int f = ( (((x_key << 39 >> 39) * (uint64_t)d + (x_key >> 25)) >> 13) << shiftBucket >> shiftBucket); + + // Step4: Interface number lookup + if (TbucketArray[f] != pn[i]) + { + fprintf(stderr,"############################################### \r\n"); + fprintf(stderr,"testing fail for %s \r\n", funcFileName); + fprintf(stderr,"############################################### \r\n"); + fInput.close(); + return false; + } + } + getrusage(RUSAGE_SELF, &tEnd); + + fprintf(stderr,"Testing success for %s \r\n", funcFileName); + float tu = diffUserTime(&tStart, &tEnd); + float ts = diffSystemTime(&tStart, &tEnd); + float tTotal = tu + ts; + fprintf(stderr,"Testing time for all keys:\n %.06f sec, %.06f user, %.06f system\n", + tTotal, tu, ts); + fInput.close(); + return true; +} + +//--------------------------------------------------------------------------- diff --git a/RHF_64/router_mega/Tester/PerfectRouterTester3.h b/RHF_64/router_mega/Tester/PerfectRouterTester3.h new file mode 100755 index 0000000..b552ca2 --- /dev/null +++ b/RHF_64/router_mega/Tester/PerfectRouterTester3.h @@ -0,0 +1,33 @@ +//--------------------------------------------------------------------------- +#ifndef PerfectRouterTester3H +#define PerfectRouterTester3H +//--------------------------------------------------------------------------- +#include +#include +#include +#include "../Array.h" +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +class TPerfectRouterTester3 +{ +public: + TArray TdArray; + TArray TbucketArray; + + ~TPerfectRouterTester3() + { + Close(); + } + + void Close() + { + TdArray.Close(); + TbucketArray.Close(); + } + + bool Test(const char *funcFileName, uint64_t *hash, int *pn,int nHash); +}; +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif //Exclusive Include diff --git a/RHF_64/router_mega/Type64.h b/RHF_64/router_mega/Type64.h new file mode 100755 index 0000000..a77e44c --- /dev/null +++ b/RHF_64/router_mega/Type64.h @@ -0,0 +1,110 @@ +#pragma once +#ifndef Type64H +#define Type64H +//--------------------------------------------------------------------------- +#include +//--------------------------------------------------------------------------- +#pragma pack(push,1) +//--------------------------------------------------------------------------- +#undef XrossCPP_In_64 +#undef XrossCPP_In_32 +#undef XrossCPP_In_IA64 +#undef XrossCPP_In_PC +#undef XrossCPP_In_X64 +#undef XrossCPP_In_X86 +#undef XrossCPP_In_ARM +#undef XrossCPP_In_ARM_thumb +//--------------------------------------------------------------------------- +#ifdef __GNUC__ +# if defined (__amd64__) || defined (__amd64) || defined (__x86_64__) || defined (__x86_64) +# define XrossCPP_In_X64 +# define XrossCPP_In_64 +# define XrossCPP_In_PC +# elif defined (_IA64) || defined (__ia64__) || defined (__IA64__) +# define XrossCPP_In_IA64 +# define XrossCPP_In_64 +# elif defined (__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +# elif defined (__arm__) +# if defined (__thumb__) +# define XrossCPP_In_ARM_thumb +# endif +# define XrossCPP_In_ARM +# define XrossCPP_In_32 +# endif +#elif defined (__BORLANDC__) +# define XrossCPP_In_X86 +# define XrossCPP_In_32 +# define XrossCPP_In_PC +#endif +//--------------------------------------------------------------------------- +#if !defined(WIN32) && !defined(_WIN32) +#define __fastcall +#endif +//--------------------------------------------------------------------------- +#ifdef XrossCPP_In_64 + typedef int64_t sint_t; + typedef uint64_t uint_t; +#elif !defined(__LSeRTOS__) + typedef int32_t sint_t; + typedef uint32_t uint_t; +#endif +//--------------------------------------------------------------------------- +union TX64Data +{ + int64_t i64; + uint64_t u64; + + int32_t i32[2]; + int16_t i16[4]; + int8_t i8[8]; + + uint32_t u32[2]; + uint16_t u16[4]; + uint8_t u8[8]; + + double df; + float f[2]; +}; +//--------------------------------------------------------------------------- +#define x64Low32(x) ((TX64Data*)&x)->u32[0] +#define x64High32(x) ((TX64Data*)&x)->u32[1] +//--------------------------------------------------------------------------- +union TX128Data +{ + TX64Data x64[2]; + int64_t i64[2]; + uint64_t u64[2]; + + int32_t i32[4]; + int16_t i16[8]; + int8_t i8[16]; + + uint32_t u32[4]; + uint16_t u16[8]; + uint8_t u8[16]; + + double df[2]; + float f[4]; + + TX128Data() + { + } + + TX128Data(uint64_t vL,uint64_t vH) + { + u64[0] = vL; + u64[1] = vH; + } +}; +//--------------------------------------------------------------------------- +typedef TX128Data int128_t; +//--------------------------------------------------------------------------- +#define x128Low64(x) ((TX128Data*)&x)->u64[0] +#define x128High64(x) ((TX128Data*)&x)->u64[1] +//--------------------------------------------------------------------------- +#pragma pack(pop) +//--------------------------------------------------------------------------- +#endif // Type64H diff --git a/RHF_64/router_mega/embdDbg.h b/RHF_64/router_mega/embdDbg.h new file mode 100755 index 0000000..f56dc17 --- /dev/null +++ b/RHF_64/router_mega/embdDbg.h @@ -0,0 +1,21 @@ +#ifndef embdDbgH +#define embdDbgH +//---- -------------------------------------------------------------------------------------------------------- +#ifdef __HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#include +#define logEmbdMsg(...) printf(__VA_ARGS__) +//---- -------------------------------------------------------------------------------------------------------- +#else//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#if defined(__BORLANDC__) || defined(__LSeRTOS__) +inline void logEmbdMsg(const char *msg,...) +{ +} +#else +#define logEmbdMsg(...) +#endif // __BORLANDC__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//__HAVE_Embd_Dbg__ +//---- -------------------------------------------------------------------------------------------------------- +#endif//embdDbgH diff --git a/RHF_64/router_mega/input.txt b/RHF_64/router_mega/input.txt new file mode 100755 index 0000000..c86699a --- /dev/null +++ b/RHF_64/router_mega/input.txt @@ -0,0 +1,10000 @@ +2861498860 +538874397 +2884970994 +955125036 +3481923597 +4023014517 +452306420 +2686122881 +2102814866 +1543734688 +3816350532 +3841160498 +3963119138 +922404466 +2036972307 +1705535499 +984531147 +632377809 +2535208120 +2736938665 +361421618 +888021451 +1992422465 +2590943442 +3555072675 +3403805089 +3970239682 +2514706003 +224507947 +656608320 +167189887 +1332681492 +1132203992 +1633750777 +1156037352 +3435200593 +4040368592 +432439924 +374071162 +4201577549 +1157933667 +2989295453 +864861915 +820979215 +3103456509 +1859991325 +1402959268 +4087957561 +4045321966 +2622802380 +1624384166 +884304166 +3238063403 +630146915 +2032758741 +670596532 +2875077786 +2349706594 +3400556235 +4059982738 +1011286726 +155877544 +1849547541 +474396246 +2055384093 +2398313517 +4018505308 +4089257323 +2958070855 +404930470 +1972861984 +1172226557 +341216918 +3263985995 +479107136 +1902793150 +3577003933 +819904387 +1595971764 +3580048896 +4207832057 +569718531 +3708966298 +792660783 +3247168844 +396295014 +1517022243 +2356109383 +2454992254 +1547386168 +2805995800 +2342241127 +20956159 +2393103766 +1093647782 +683210020 +3025282122 +1401462953 +1763662743 +3019007060 +705675524 +713720628 +2353438368 +2152453594 +1535995727 +3982350732 +340973073 +1862095641 +601954692 +707444174 +4077523347 +4012254943 +4124376599 +4007992567 +3149874012 +3429401733 +511715420 +782894591 +108121287 +2742238679 +2095210051 +3888465285 +3686478589 +3042501967 +2611795099 +3689178407 +214446974 +905348299 +2562221915 +3332690586 +1196610940 +479648610 +2025309192 +3702630017 +467907765 +2769589970 +839207402 +2436394142 +550864269 +2485299361 +1854583884 +2161957192 +1549868016 +2012976305 +1363645615 +3708731137 +3615061692 +3305887671 +104509329 +3672175031 +3785540985 +840933115 +431829541 +2108144283 +452360500 +3421577449 +224584716 +2882750898 +2013814498 +3557381781 +3893239960 +2606213487 +218005990 +2716231195 +1529741484 +3362938915 +869272588 +1477508479 +335012619 +3695552234 +3662142345 +593662724 +3133248868 +1757562604 +2730112788 +2665745855 +1935849331 +3065059485 +3132663529 +160637473 +2852191501 +2259281226 +3122093023 +1423065112 +840313174 +1084848738 +2372516405 +1631588950 +2390501859 +3113256470 +158274172 +2744258407 +1483060065 +1574572356 +2122734092 +1793480239 +2791206438 +1586440491 +1680252034 +3780364752 +877994635 +4141036588 +3636777157 +2992332000 +2291713027 +2265412831 +287374844 +2989502565 +751315072 +1344989490 +1731514616 +710785496 +561739873 +946186246 +724686233 +171321127 +187102182 +2308631300 +1467350298 +2359752157 +2210486800 +2724302556 +20608655 +95998435 +2990834751 +1328926655 +305281877 +421064177 +1368277020 +481579873 +160728629 +2435826868 +2708092073 +3477062183 +373457772 +1999601034 +2294076468 +3464110692 +4066208093 +2221238487 +764015442 +1501195435 +1523639444 +2405310581 +2504945905 +124817474 +858296069 +1816989168 +2901210771 +2883422049 +1562560938 +1900767585 +2764349343 +3796776080 +1486077666 +4152125121 +2372893627 +3440346478 +201631315 +769714985 +161959460 +730651707 +4135192686 +3415556217 +191638116 +2440885109 +3292424674 +2996188285 +969461419 +731886424 +3268808255 +4265376307 +1666607886 +1705071509 +3603987272 +1168629020 +1222925423 +4084313321 +173183736 +272153629 +1652261711 +1787623946 +3629862089 +3086104155 +3682551638 +3629243410 +1422324671 +734621069 +3893604589 +3151997439 +3550727618 +808157710 +1410293331 +172307435 +1939548034 +3960418650 +1153845820 +415729283 +2431245861 +380710555 +2049413387 +2458302114 +1354376849 +1181655714 +4053947567 +2747282301 +3467065714 +1255601394 +3726361233 +95950334 +359814828 +2009902034 +1089312384 +3329189038 +965855681 +2396348254 +2191111536 +3747209514 +1151065923 +2701916919 +3693411499 +2371415881 +1075774902 +557918012 +2604367212 +411456522 +780577214 +1177865763 +1230174069 +2975243800 +1567452695 +4030842679 +1541530725 +2201098619 +478053286 +3027309824 +443141984 +285979863 +1425679865 +3620258195 +1857049676 +2109001185 +4276513905 +287430312 +1644689549 +1444017668 +1413654243 +1365549954 +1204528307 +1199909242 +1073682674 +3442599234 +3695226321 +324941820 +2525085279 +2103644112 +1818240248 +3467261808 +2272206828 +2609070241 +1741068080 +1843757665 +3201344131 +2288125025 +449361001 +3463626260 +2023936645 +375044275 +241526182 +4045085635 +2169405428 +4162003939 +1566312522 +532290727 +156182543 +2568140688 +829983565 +1002230389 +100086339 +2421712838 +2677924688 +4097769372 +162088659 +2645881788 +2073244664 +4194671044 +2720296960 +623807259 +2000282237 +3208660157 +3224797472 +3755330383 +3543029857 +1956783556 +1337805988 +3026338831 +4062220970 +3621336037 +1686770520 +720871481 +1341205444 +2709739213 +4241803513 +2878799494 +589767416 +3757143934 +1542688963 +1847088957 +18602377 +1095751679 +1066054743 +1684750792 +4251888205 +1507592 +4003254509 +3055125331 +3561299300 +713608019 +783278470 +1576218540 +1071645329 +2879074438 +3265100048 +3370406227 +1637389888 +992144303 +1015868120 +3574851303 +681641608 +4209778292 +3809503110 +3469943037 +455235296 +3652734833 +4118802426 +434412774 +2277702160 +1818585174 +3539793219 +81815933 +65812981 +1475005068 +2966249063 +1702397384 +2646776713 +1453456432 +1936272827 +47259463 +1698241541 +2074825154 +3606285284 +1470080018 +1156201480 +2635845455 +2601542336 +822907609 +2421872341 +720516660 +2920008974 +2328182178 +740261486 +4052502604 +4054220037 +2588984523 +3538456977 +1873202006 +510750048 +1384779413 +338483377 +1030299107 +1060129625 +119215487 +3535834833 +1954717854 +4285568603 +3008959896 +4103491755 +3126697012 +3682993299 +159551159 +1730263752 +1132014013 +1902492611 +515049073 +1699348221 +2488422623 +2258085426 +212640284 +226267206 +20198293 +2459089031 +1455334843 +834786184 +3723766151 +24554342 +2425812458 +1026292653 +165671521 +2397570825 +1178045891 +1121742092 +3204386904 +3781660079 +2429842068 +3446279536 +2741408015 +4040922895 +1965615400 +1294740389 +1483293762 +1375161572 +3974440823 +1830313797 +4008444201 +1499045525 +2603807905 +3565264716 +761994886 +691266022 +625535694 +913044001 +1021300787 +3065879913 +4183693518 +368998050 +4292835837 +3791756531 +1698953315 +2420027445 +3169058410 +2048530574 +2890105462 +1708882467 +2920368244 +2707243378 +1239532990 +3461637877 +383394373 +1610126110 +2431548813 +2798971708 +4146813199 +506167898 +2260684029 +1936068371 +4186787567 +670819011 +2217690504 +2794762805 +3085832243 +1807187948 +178131849 +3162456588 +1251272278 +1097205339 +799618520 +461617504 +3005296296 +1532227729 +169216511 +2146981758 +421925961 +4183938516 +3063288075 +3556191182 +393699137 +2909126728 +3990772323 +4145958993 +1835498182 +4089504240 +3499228769 +3667462487 +1128102210 +1760370517 +47445916 +476670373 +1698728409 +1223807353 +2794183289 +3905126523 +1419133429 +2467591556 +167516273 +2563027451 +933517683 +3007914077 +2277117106 +1489371275 +3708629116 +3494108544 +732676894 +94860146 +2194640 +2795351552 +505125274 +3946122466 +595140008 +178525270 +2617506228 +103852046 +674783066 +2966407390 +24882349 +1128678928 +4051776488 +3123998572 +2563620900 +759803487 +3789209629 +1927424049 +1148426212 +2854730839 +4000433447 +1384660526 +3866263009 +3786490733 +2480707368 +2404597598 +4158864309 +2928380465 +2134991870 +382462546 +1291542263 +1997254427 +3012764792 +3200033485 +3737494583 +909262089 +2728845249 +313605155 +963097095 +3970051450 +3142749820 +1352082327 +950070275 +2553976760 +4240474530 +1725716201 +4099969902 +1413547639 +2781714950 +1879767878 +3875509486 +343830844 +1082990743 +3604144458 +4132571379 +3295994138 +2499071941 +374334964 +739142110 +4230360157 +590507141 +4021308219 +322384693 +366056191 +3854621120 +3509950666 +195827923 +3931422197 +3160387895 +133509852 +3346221674 +3412434252 +1945877923 +755859655 +485820951 +203137531 +995491834 +3919829925 +1821630900 +1860950952 +1982910560 +4178401497 +3729070758 +1968884312 +4197502196 +3715427488 +1301102013 +323746002 +3133976451 +321640909 +577158467 +3406494346 +606846639 +3023350803 +2605659196 +2385807982 +3859244255 +253377429 +2574832959 +1462884053 +1470698334 +4084771893 +198892844 +1327147316 +3886070951 +721844026 +3679315144 +1971159977 +640567693 +851594053 +2721038696 +844320707 +941337992 +2510448049 +2743587853 +1376743705 +842493052 +1902179211 +3865956859 +3734685596 +2837395533 +2371588830 +216123923 +208207821 +1576115450 +2548805262 +3437032737 +2950702366 +1433673262 +3947092549 +50326333 +1815375469 +2976508734 +3460023431 +2235730418 +3546781275 +2814632528 +3926418951 +39640996 +917504983 +1400934613 +3382875894 +285669319 +900406426 +2425732403 +301524987 +3582694915 +1698732222 +1725128860 +51258096 +1200007219 +3560035338 +1283418742 +426532475 +3244268167 +2204879475 +2341270412 +2153609873 +4208843254 +3412320486 +829138263 +769324122 +3341381531 +2437395886 +2158768896 +4200889659 +2903139180 +2764275666 +126788711 +706274184 +2767085187 +60933692 +1867549611 +703684304 +3852788253 +1188647502 +1773658994 +1941080404 +4253084053 +2200499531 +1297383254 +3948792224 +1090712509 +3305372803 +4182658625 +1617125583 +3814193531 +1964939248 +517695365 +2362318840 +768809213 +181997101 +1620357699 +4056310849 +1346069424 +3202653651 +1219889741 +3054381742 +600821458 +1466672512 +4194164544 +84204832 +2353390456 +3071590004 +3880043794 +1721263387 +2735908975 +1500442932 +1449841867 +1829944341 +3860038257 +3495357222 +1096018415 +2431441148 +3114269500 +1676664899 +2374616105 +3181797335 +2640306614 +2963775677 +366503644 +3409936666 +2664863080 +1177988998 +1134768193 +1547863621 +1307422622 +4082453210 +3543163655 +3372846797 +3971788066 +4169558809 +3525385553 +1466510156 +2321279534 +2455498786 +913242281 +1409250134 +1403042371 +766609600 +3030032708 +1451123455 +371048214 +635383608 +1385213594 +2327487022 +4211545735 +255902173 +317147838 +3347857948 +1337169273 +438881430 +4274504189 +132654761 +3190439411 +1025959578 +2729299317 +18981104 +1198909533 +1371457620 +968839770 +664865150 +2623640658 +4205817293 +2523219693 +454669570 +516794725 +3928713918 +3999218376 +3890388253 +1605807398 +998088737 +3953892002 +713771330 +1373703685 +3667967238 +986586241 +3815958476 +4213188482 +1954289115 +1531082745 +1394927910 +1365124742 +2450910401 +846828689 +468214246 +1911227146 +1961901558 +1726378030 +3436024451 +2628331093 +2564993314 +3232776468 +4197915899 +349757923 +1170487041 +3656089561 +2089004530 +3115119736 +1047800390 +120020062 +4259904985 +429995885 +1317608882 +2741244043 +2404118039 +3481234705 +1020205007 +674992205 +179955800 +930602634 +697919489 +913381397 +919598230 +899071834 +2787632127 +1833856809 +2308308088 +1471125037 +585776583 +1727692059 +938241378 +2522572467 +399169426 +1213249267 +1757509479 +2794899641 +1966838383 +3467087944 +1245048906 +2086544466 +570485730 +2583881079 +2955411923 +3624320052 +3536550790 +3034571909 +3685008568 +3558036096 +2366847662 +2640840212 +662241601 +2987303660 +1110383205 +1042951961 +690629232 +1447556278 +4238330406 +520095259 +1175939805 +60991930 +4189082158 +3453714089 +2778140263 +3274092631 +181323960 +2924447234 +3123056012 +494399332 +3408752284 +3939493656 +3133052820 +890088190 +3267787593 +2596430830 +1492614394 +1644119101 +3064662003 +2667716853 +2732597650 +1267301810 +2551759466 +2994980660 +32761679 +1179516931 +3576117882 +528902197 +857965533 +3277352275 +3111343937 +749689384 +1567788842 +2880983467 +3317458108 +311147234 +1739223663 +2577464059 +2307444537 +2246829807 +1153008849 +754662338 +359978739 +1726566387 +1572970619 +709599364 +1539326056 +2285420239 +3122962013 +826618192 +1484407833 +619368944 +3854573295 +3508705601 +1268241324 +2023120175 +1002062107 +3128931441 +2654268325 +964849996 +1407509481 +3607924245 +4137919629 +3218555250 +2580728655 +827235384 +2736345881 +195067403 +1859936801 +2623083933 +766073308 +4044587891 +1635182782 +2989680794 +1456928712 +1691114215 +1742091784 +2417028011 +2840279795 +3530067180 +1391323052 +4181973078 +1107064023 +1407163119 +3036438357 +1125521087 +3944593953 +742283908 +106751215 +3552867429 +1085828402 +1091952161 +2224708511 +2019602064 +3417312650 +285596977 +3852141209 +2406133795 +1941654876 +1921991824 +1079069887 +1936091093 +1978331654 +3376578127 +2716927464 +2297202893 +781575543 +86124136 +2133799428 +3019149993 +391642995 +506677615 +992150011 +770792788 +2281473517 +908429396 +946264677 +2014043735 +2252581600 +3393484034 +558240634 +3499172762 +4278492569 +3761718535 +1516498934 +1694450183 +1780858952 +1637612173 +3340971155 +676128637 +3049019539 +3719177842 +3375893884 +1344006628 +629467643 +2323466110 +2873855128 +1310528682 +3899261782 +2872283478 +1372112510 +478490311 +2409576406 +2838886571 +2917631090 +2377817114 +230750763 +4055085750 +795772065 +3938774845 +2770567223 +581366596 +3665156476 +1782969178 +2204738342 +1902020852 +2636202331 +2072522424 +1513801768 +3948094253 +2660748457 +131480027 +2854553468 +500195920 +430753576 +2164689174 +830164837 +800692482 +74755066 +1831890927 +4124678994 +2389358384 +3736008793 +2568094159 +3595700913 +1451771895 +286328361 +1885714491 +3498555305 +564826886 +529628755 +667684273 +427603534 +3245623276 +3753123410 +3476656029 +2007908698 +2463635613 +3395006246 +2725040314 +1669910233 +2837757871 +1922940863 +2149463697 +492974454 +273966321 +3497615342 +2378189070 +2693297660 +2475629644 +1555256081 +3640589876 +2078041146 +508638381 +2389102400 +3626568372 +207530138 +3282182254 +4080586339 +439707068 +250824388 +3669269858 +3199526009 +2764736243 +1497946930 +2969487502 +2865908328 +2950314389 +2177225005 +2775888036 +332850159 +2576043449 +2165711186 +1398768880 +1015483592 +3104434462 +2385764104 +1754114777 +3588147611 +318029526 +1762058977 +3939251101 +1463913979 +3078554727 +4105505375 +545271439 +1972636637 +504415633 +2219247860 +2421592154 +4042814101 +373866293 +3333992300 +2494238567 +1543842661 +3366799066 +1847073255 +704054708 +3831723947 +2580995307 +1322088783 +323617968 +3280729611 +3183600334 +1475283670 +3927637399 +3581014902 +3843550340 +431473572 +457456128 +700833777 +385574602 +1837474429 +2837326369 +386813757 +2556231971 +899170961 +3583572203 +2152979017 +4290222143 +2906211788 +3152116227 +1336963826 +3485291855 +1597535123 +4187109493 +1962044331 +751552360 +3374145652 +4283999955 +1762763270 +1542247015 +69711498 +3102054702 +1032474548 +234402238 +837968121 +294264482 +39072260 +958692058 +3644299624 +2743548185 +1221058749 +2348614716 +2706880553 +2929007856 +1789471049 +889426239 +3657412989 +300498413 +1901805108 +1082640753 +2863529902 +1457172110 +3496419279 +773872058 +3776338499 +426438745 +990771802 +2354184024 +1230276209 +3434567398 +3965743926 +196863151 +2438955136 +2660876744 +735352192 +3164129610 +3067162900 +957389183 +48125450 +1327719972 +2382199641 +4209969291 +3625563813 +3845091037 +1056624912 +2443636803 +2858297232 +1530072205 +4041286361 +2797880629 +3044024216 +1205207979 +1134572702 +3468368186 +3305989570 +2720209894 +2387998165 +3562946726 +1964220636 +632146396 +1311870670 +1455312136 +3734264411 +347135336 +289125322 +917862914 +677616621 +1656413759 +1867067139 +1021886214 +290418567 +3358654003 +974870066 +1771624151 +1936768264 +1681148574 +1392179728 +694991531 +412681374 +3208720170 +1674191986 +793920783 +442257291 +3077480027 +592595554 +1346236242 +91834143 +3135271846 +3806435522 +676599181 +1702770096 +1642976367 +852988370 +2389294001 +1736182646 +3927551563 +4220731208 +303276051 +4003686820 +2791922237 +797963496 +1328084514 +1984890742 +500220549 +1150298022 +1487970127 +3882533283 +3226473063 +1502267748 +2243075174 +2710047164 +245621038 +4119325840 +2138480342 +967152904 +1467806931 +646713636 +1295519588 +4031822546 +2585297459 +3171657989 +1367501167 +1345301513 +3236275046 +2120469173 +1196498853 +2149088673 +135867443 +2146788804 +3123552570 +3749319826 +4246595259 +723687105 +3700591966 +3498903595 +2013746061 +1927707522 +3956992316 +1742193426 +4230011402 +2574970474 +399842302 +1953587718 +3129212705 +2132249848 +4248203405 +4292826254 +3383986907 +3411805510 +1626869441 +389707368 +4249792723 +1397183038 +172558790 +3643128575 +2075135417 +3708364232 +2962712911 +284977016 +758874341 +3181384809 +3142003163 +2708095947 +1420312684 +85657057 +2249658184 +950790855 +2698934228 +4244928433 +658790249 +2488895246 +2744762164 +2026680957 +1082474897 +1779487995 +1746704705 +2588083660 +2416190302 +266796250 +1576748988 +3716238619 +3515963939 +2254605920 +3765644674 +3710334982 +1654420468 +626615537 +591346655 +1039580119 +2399572940 +4033509163 +845058679 +1671124111 +4284167396 +227386726 +509090428 +316019088 +151818752 +3692524126 +2828222055 +1546564842 +639578196 +2827457348 +481454850 +672088225 +694481270 +370414097 +2105682549 +3661625913 +3847342326 +225556398 +4015661436 +935483918 +2777096363 +953569038 +692952710 +1868589813 +2740809723 +3816524582 +2341227715 +777715318 +3472478637 +2968135896 +464858102 +1349335792 +1255324974 +3684690477 +1176588050 +2998655245 +4280219389 +3328508307 +996399760 +687464530 +2206749705 +2454770637 +1572323447 +1457327950 +3441491867 +2347927127 +4231592261 +2131467975 +4225684533 +3750425911 +2902476692 +1831989553 +3264276515 +1294776675 +4218106465 +2899825003 +3325369119 +1794400428 +233989359 +2978117040 +1951415543 +2441875427 +211210340 +4136831823 +1805790624 +2851648022 +989280982 +296493985 +2956082364 +3893147438 +2595362419 +2791263424 +1307725008 +1300372767 +3557416253 +1222356451 +2438285535 +472224698 +2572821188 +1426798475 +4075417465 +1378228133 +3509889661 +395729018 +892330184 +469084799 +2891417560 +2593180647 +365853403 +2545947719 +1514108006 +1950604176 +362853718 +2394463714 +2312610337 +2778411609 +3081160125 +3880710807 +520383980 +3320436030 +2864663272 +3507676232 +3192807676 +1502749323 +1617949061 +103629321 +4255229602 +2605369924 +3856036167 +1822986851 +4187137153 +293950781 +3089133197 +3016598883 +3915299365 +3689149859 +1819038543 +1561748507 +2263051377 +4020936656 +2400140578 +4200906346 +1918434123 +3876146511 +4058735980 +3372388589 +1578154856 +93567378 +3076705024 +2702606871 +1830945437 +1840949190 +2933619734 +2401407845 +2801406319 +2855473825 +1332715583 +112513828 +3736337040 +149364486 +4159448866 +1119563663 +2066933528 +1623335156 +2968960492 +312995342 +397838019 +3180784070 +3755908336 +1418036807 +2718348544 +1960623951 +37206374 +3505849515 +517436664 +1543041191 +3092858927 +3273994492 +3627442259 +674957816 +527158251 +2286335328 +440022964 +1457400408 +2825757371 +1040997493 +472232280 +1042472923 +2475715739 +957284000 +3197319206 +863184160 +1572715831 +1489584472 +4164292632 +880255163 +1000280265 +2462713279 +3166090283 +1314200974 +4093569083 +3175701794 +3603168638 +3110473263 +1116057255 +3768529292 +1054268074 +2217481039 +3913419671 +2815295562 +1190173418 +2283240796 +2431165419 +2759516183 +4289525146 +1147520490 +1252927486 +1221212322 +653406020 +3150605799 +3559007670 +3545461180 +193988687 +2489186425 +781577866 +1753778781 +3548309472 +2853405758 +3251997616 +1089894177 +1556188061 +879134831 +4051196187 +4210602705 +2014194193 +2412680478 +3643503449 +2095751302 +3495770748 +3912667613 +2530277176 +73028723 +2834215390 +442830313 +1733095978 +672539568 +109474882 +1598433378 +1979873009 +372399337 +171589825 +143800277 +1696436794 +1094496170 +4188604537 +1519210011 +3767473797 +3956477365 +1440398144 +1665243006 +215549129 +1965218622 +1183007178 +2922674683 +2903177039 +2339952603 +65514937 +134626212 +1386214374 +4043221547 +2000203276 +3795126282 +834918496 +2281350778 +2556505544 +1332038270 +2362881647 +1836952613 +2290105776 +4287515446 +599438727 +1441397185 +1368295523 +1444423988 +2291074752 +791867980 +2120155066 +1422130535 +473406216 +1142906131 +2447992104 +3270148211 +459557915 +3516412013 +2322248997 +969543363 +2381908085 +3030302770 +3247269804 +1938580995 +1557254971 +955011420 +137874667 +2879242971 +3155192962 +2045965861 +1986236169 +3842186454 +3221957191 +1119476692 +3978466435 +3618317189 +1298034713 +2972114369 +3036109772 +2629993938 +1808628768 +611150766 +852793727 +2973388804 +750870595 +170592819 +1338677384 +4076498574 +663416254 +2976358658 +484522280 +1891785544 +2656828027 +3533790871 +1533244560 +1783163356 +3742534905 +4189262749 +1967212448 +3010741159 +4029896101 +1835177698 +2688260591 +3565149296 +870744808 +3831050717 +1782224164 +1419545891 +1966153032 +901272900 +721885063 +1753659274 +3962317387 +2909643850 +3414199013 +3218321831 +3873769691 +3084098496 +674678927 +2835747354 +3233797857 +3437936776 +1363083500 +3497919331 +3614212849 +1389873388 +4199593681 +3087287671 +4147323706 +1781304322 +3839762825 +1060073424 +2987823522 +311345438 +3319343575 +642320371 +960695869 +1673987029 +527645582 +724708596 +1822437314 +2746757863 +310026428 +242731315 +1141439252 +3330757546 +3372863919 +2414206019 +2557179005 +3442105709 +3058234476 +3618671496 +2464028187 +3413136724 +3585040364 +981973671 +681605477 +909482606 +3408733431 +2536238280 +946024162 +2136551926 +4260624982 +917109869 +3603957270 +527904031 +936489591 +1518291755 +1329066370 +3926969620 +1741428999 +1045355176 +3994414527 +1160246722 +2875626228 +4073031517 +3185095282 +3190677115 +3529472864 +2003694679 +2338355234 +1139528633 +1404501098 +3360037317 +1582678696 +593848262 +2562746181 +1630959120 +2798381383 +21646775 +4226554196 +1197578155 +1487316137 +2318905339 +1211167226 +1391332108 +2066319695 +2681058266 +672836252 +3150808612 +749932675 +3411600203 +468312977 +1029413994 +50297315 +3824741022 +1954383056 +629729752 +3534946017 +2199815881 +2750182672 +2284184503 +1930459109 +4032445559 +62306583 +1474506266 +2143021115 +2924197286 +3598119663 +678658524 +2416982296 +3157220312 +2217186359 +3778309733 +2733017442 +2294346764 +3294577448 +1749902 +2835015015 +1032711102 +3059340754 +2351107559 +2571691232 +2691571899 +2142911727 +339635115 +3125835356 +750501513 +710028181 +1707534387 +188714354 +1789144130 +151549963 +1432413777 +3036825005 +3083686641 +3254881206 +1292204534 +2238554521 +463081792 +3832880761 +1512978810 +539203088 +67000859 +2756728639 +3025945921 +2856857617 +1704000347 +3158605028 +3166161740 +493765647 +3823735910 +417250757 +2535929697 +471989927 +3611884883 +3858423873 +1838334979 +3121664112 +1876583492 +3866033791 +2273311398 +3862077705 +2514273721 +2991207184 +3147832083 +1202308417 +2533475622 +4056574215 +2267792339 +2958005671 +534620703 +2859075349 +4115637097 +3766028083 +3389781149 +134671464 +2165593104 +2501244495 +1409691989 +3483220637 +3280642810 +743455759 +4036213859 +1190014430 +2334177013 +1825385672 +2125910393 +940799902 +4068938959 +1015552402 +2082740943 +2877549196 +3336842407 +296176379 +3988195039 +3417846039 +3052834914 +1295453728 +130962559 +986481474 +3940683164 +1447308834 +41298016 +3562271611 +1266305527 +3353035270 +3591754680 +1641406940 +1047038086 +2520268377 +689749084 +3628861105 +3553997432 +3736240179 +947370165 +2568129072 +3655197422 +2315592422 +4145460845 +1308252883 +1946063060 +3679995534 +1002523047 +3873329281 +874132336 +2596652805 +2912891849 +2743775053 +3056322843 +4237547172 +733839003 +2879320001 +1910566918 +4254892225 +3716355158 +3390505835 +2570735155 +581958850 +70843317 +3433910911 +1976752741 +2309093151 +405730926 +3396023857 +1312243988 +3106841972 +3449826990 +3920812330 +520234304 +3475921910 +2872598573 +3513083299 +701347916 +3530415958 +2266499195 +2424988579 +630312587 +3543774457 +3523991566 +3966442971 +98181553 +3820458601 +3293750073 +1723570939 +624057197 +208083378 +587045363 +2317773293 +2998661943 +3314631106 +4140459897 +1338188110 +3659666344 +590191272 +2482823424 +462057698 +3378043801 +731703431 +1244422765 +1417422202 +1180727527 +60982333 +1344965787 +2532432293 +2846610129 +1368877924 +3833730753 +1575476484 +1238901986 +2665827595 +2964746862 +1778051998 +2121576146 +560610002 +3308733466 +3240748834 +3640543834 +3297574182 +4147269405 +4049079496 +3610900537 +885334178 +2116992622 +4239385266 +3680045629 +3757459339 +3435804232 +2637694217 +3269931150 +2625274759 +2547325881 +4264441239 +1863999079 +1125691408 +1462102002 +1017035904 +3342599437 +1822144406 +3983489958 +1387968977 +116156107 +2154643413 +614316305 +2218579964 +2230677057 +3903821086 +3781261360 +1506660879 +3154810299 +1416033544 +2748518408 +3221458728 +4131244365 +3002630685 +58669729 +3587873643 +1329783221 +1139410155 +353223439 +1754849463 +1365792432 +2455185353 +1179433101 +4211052724 +4047133358 +1185658048 +4218770503 +2048812076 +2220390174 +2583669162 +1691897391 +1572609274 +1061448207 +3891539324 +3008145042 +894159911 +2370911973 +3085552134 +4154059534 +3025268030 +399465207 +2528530396 +1156663267 +348543156 +480938579 +85319784 +2717929197 +2101292343 +1747302919 +943168085 +4025109980 +2047424011 +4122575975 +4067681913 +2073651131 +372903841 +228618065 +1449000298 +2409836863 +3563368015 +399640792 +3409613457 +3110123821 +876906717 +589792423 +1721944058 +3951645688 +2488082312 +2562303605 +3534546027 +4010033997 +2728601367 +1789824732 +2104652553 +917941643 +1853223280 +1058168999 +2359284370 +2514026075 +4290878288 +1134511712 +181306342 +916936239 +239178315 +3690428304 +3968534808 +3046454831 +2092174714 +893257431 +283896129 +4123607500 +276066638 +2169767133 +1056220567 +1545026584 +1674110607 +1616405861 +1816921786 +503021040 +3099578887 +1284870685 +862785339 +2944972527 +3962654488 +4049857009 +3180348326 +4274976559 +619512032 +3202746495 +1461523451 +3729197796 +546012281 +485446630 +3638805136 +1204589309 +1944418240 +3490430106 +1193253182 +315145223 +1767741965 +2871722934 +887096100 +155479919 +70586248 +523526472 +2505004179 +712725294 +2481248710 +2591340669 +353951777 +2397326412 +2693953107 +1035610361 +3098465550 +3653002013 +1272266821 +286887131 +2078528281 +1837081866 +3172380193 +3286700812 +1265188842 +257603744 +1526159050 +3239317408 +3035256811 +342481498 +3145421763 +2861131343 +1724757242 +1855314551 +437914567 +3626459803 +1224209626 +1454782822 +555766490 +617159147 +2402684327 +3888046285 +3860441283 +591065601 +3281721592 +882355477 +597719932 +2270863151 +2185106230 +2857285451 +2806462230 +290020219 +3647920076 +1353356359 +3659570038 +147917256 +240425574 +431572342 +4249747916 +4182175439 +2971308653 +4233704012 +1237742703 +3582323699 +1142510030 +3207347195 +2237589035 +2455770742 +3509976415 +3703776449 +1093644254 +2379183675 +2893736875 +139613105 +1958921963 +1003413787 +3591408245 +2644061402 +455299037 +3112939720 +1837282986 +2930665490 +2924339213 +881375428 +330915968 +3978315965 +2447092665 +1472760469 +1194017681 +176915125 +3793737551 +2688281496 +2625675273 +2006932892 +733289600 +3445581525 +753263046 +2760172836 +2124834590 +2780584626 +1719948960 +694910809 +3957177732 +2043602237 +3605504003 +2749138612 +1269766255 +2488353364 +3458446197 +796267265 +1850526686 +605135684 +1153556960 +919553465 +815629686 +3926566318 +1337401028 +3682118596 +3277383508 +907118819 +3458106813 +1538560792 +2642464088 +2760964834 +683718079 +1778772333 +667794807 +3581160937 +4249563928 +1983088290 +4017045972 +1435186269 +3676304887 +3436211187 +1593631568 +2332683154 +3181479195 +101877162 +108574531 +752333880 +1840421373 +2417524584 +3452898912 +2913694947 +1111621037 +1216660927 +2804498390 +686831085 +2651205199 +69377012 +3521019317 +4103615865 +3391685284 +2707870966 +2628603360 +3467429278 +546630790 +3162702746 +3660071557 +1253046394 +900670818 +2492415580 +3814318748 +300486535 +2294195364 +2019925105 +3924752794 +2579615807 +2495641659 +3955957104 +704995150 +1596897620 +3353717579 +3550753921 +2545703981 +141583252 +3417245029 +887242873 +2926913025 +1604091200 +3277652355 +2053137324 +2495677662 +765575392 +3231942150 +98130388 +1850881689 +500888882 +1265283363 +3167142483 +4016936965 +927756403 +1506313135 +1612690862 +4274304303 +1320414428 +1128871478 +1042051717 +2317166085 +1926820513 +1153250044 +476930940 +2269332122 +566320372 +2899451163 +4061322630 +2968171984 +727839765 +3953390712 +1561971005 +1484471403 +4209216530 +3652583660 +1345599669 +1373112849 +4129406447 +3586858993 +2013915842 +2618215324 +3543970282 +291473699 +1900271913 +579065028 +1445577148 +1734764636 +428689645 +2047704357 +3457282875 +3435323372 +615880312 +2120425937 +1537757191 +1230771292 +4123226458 +4069481615 +1750721099 +1362221706 +2946242187 +2945936260 +2426719228 +495687496 +1897491422 +1109070653 +3584388869 +2965019429 +709537929 +1825757391 +1847313522 +861976944 +4260205452 +3551543015 +1473060386 +1459268762 +2353092224 +2983993522 +3071605594 +483150959 +915942819 +4244239349 +3352357314 +2899033333 +2231930403 +4271016942 +1611584324 +1944185439 +2982619739 +52883924 +1230596604 +1226552059 +1793713260 +4087295303 +1624521400 +960809925 +3788478381 +55992491 +2092267855 +140175292 +2042532758 +409416631 +3633378798 +673305381 +2009686307 +3823405292 +1915097991 +3043890866 +1274903863 +186882025 +3134033686 +1338185984 +4202062181 +4026622659 +3920172125 +2892731542 +77176520 +2432998869 +4231668537 +1780069028 +2479641534 +2027541024 +2617465503 +574060272 +646195834 +2336699811 +3816221104 +3293511181 +1766247593 +2620169039 +818947700 +583180522 +2724420558 +3707638773 +1522602916 +3269237804 +1167894482 +147571080 +3520407319 +2394067188 +2647602816 +534805898 +1116600136 +1236482483 +2278400234 +2230700652 +2487434801 +3159188011 +4018616908 +876514618 +4213702225 +3994615892 +481621182 +2043787763 +1599792205 +2164161393 +1940582824 +2301482726 +1339368143 +601361432 +1812864019 +1119697930 +3429907372 +2986327790 +1193507648 +381560819 +2886478439 +3537628498 +3917602596 +2063848581 +1828728030 +728634271 +3847531094 +741838794 +2221933571 +778290714 +1624348815 +203740908 +2978019285 +2484073926 +3326513800 +1150132983 +2092331967 +1679183902 +1567379478 +2909093570 +2785099744 +2546706175 +4088620546 +993524613 +128397165 +1635228560 +2798190147 +1659701114 +4115611305 +251189273 +3158386685 +405185990 +4180132512 +182226180 +3739875880 +647812254 +3160427458 +4178741895 +1592892883 +2239872965 +1670530732 +4001899731 +2287923750 +1664877726 +1148707621 +2720141652 +3312088019 +3363899802 +3508474832 +2149736958 +563260003 +3735639813 +1786272085 +2872036885 +3876053494 +1378560060 +1115324571 +3862670091 +4133303638 +3458851552 +4024851211 +1114397209 +3593850164 +3788670887 +1960058894 +1931299631 +1291252227 +686514016 +2327192136 +1439651304 +2909853790 +10643866 +2983181704 +1815610277 +440517640 +60545619 +4039382759 +1180101444 +3939079178 +2424946546 +1171115789 +3204290741 +1011199030 +2883806370 +3598810992 +646234185 +398960552 +1589792095 +4014627745 +3020984507 +3791407166 +2803210157 +39958882 +3556956866 +3359296726 +1663791225 +816810821 +1022249451 +3070916455 +4024051876 +162501551 +34734252 +474668577 +1293795135 +1427868940 +1415072246 +4175104133 +239560076 +2832167198 +1536139959 +2484814431 +3580896917 +1086090823 +3777354849 +976007859 +3138896329 +3804532703 +1359489854 +120426470 +138445615 +3493817474 +1369434188 +2054877620 +4074876750 +3847055164 +3449485536 +1522782794 +1966260098 +1336310434 +3465317035 +752574712 +2505357953 +2351397846 +1972120527 +3642583779 +1804834314 +3511267820 +2166021766 +23469741 +867164904 +3579820213 +1811029422 +327306994 +3755735784 +2753769954 +1001260352 +3240659724 +1460629871 +4143243837 +2160439503 +1527985956 +283298003 +3272311076 +1721675441 +3355305663 +1287924298 +3872961587 +2761006046 +880508729 +3508830817 +2933594947 +4176829079 +1948115109 +4274571295 +911892657 +446475305 +4250377164 +953094396 +3024636279 +1664227828 +3587647852 +1702630044 +3653623612 +3365688915 +673863904 +3196822240 +2736567713 +807192783 +2159912913 +3550734795 +4232840834 +540111583 +2213396166 +3614801799 +3785683983 +2828730473 +1387202617 +3262961006 +1287147506 +4013859825 +4196462471 +2327301849 +895031256 +3389174449 +967326046 +3684776205 +1707904932 +4091656982 +2113041463 +791071974 +20524455 +3181807148 +3706926936 +2448238497 +122186702 +3480872764 +2226682749 +2580338112 +1535900716 +2946194043 +2637374773 +3367677639 +4164123644 +222131265 +4255360488 +4092117181 +3353416993 +1337575243 +2047468006 +978213222 +3000395650 +3264852132 +1935145696 +554022652 +3318096365 +3099825827 +2745109632 +917672276 +618501112 +3423980576 +3880725741 +1796989509 +456887690 +1805188258 +2480264640 +4133908519 +1439785858 +2200640015 +1560482324 +1857115954 +2941486269 +943192565 +977611551 +4011944304 +2724621788 +3035596865 +4253054498 +1023949920 +3720702667 +2463738988 +259383664 +3067653320 +2272881370 +1596905751 +3232025444 +2222532567 +3829657832 +2643897108 +3881632560 +3588385846 +2492619040 +209837514 +2856407056 +806133587 +1006587327 +3982386845 +204688831 +2922318100 +801078712 +615322702 +1631824259 +3453541462 +507823991 +1050166476 +3372328060 +3870076460 +3584572481 +2845104979 +2899344591 +1741721887 +3754497246 +3337405838 +2063569175 +689655092 +181941086 +2692155345 +76255394 +2486816583 +1124601577 +2669461928 +1575299584 +2655705049 +899260232 +262298307 +1659864988 +270036991 +498106967 +1392132870 +3206717511 +4184055560 +2474939575 +3620827204 +2646378619 +2039360512 +3341404992 +3694504978 +850847949 +3195409169 +330889071 +2947982617 +1503309245 +748665943 +3383064787 +355221882 +2959832928 +2886120753 +4156801622 +3054803892 +1354565557 +1993848820 +2986554767 +3710908426 +115746314 +3775564806 +2493901704 +3539813706 +564984584 +3686781124 +309129893 +1289661366 +476425821 +3050265499 +3737588309 +2271118851 +852939262 +2573154506 +104851298 +4134935230 +825496155 +3820429688 +2725572788 +3151600700 +546564169 +1339449251 +3154361067 +2987904365 +2414915741 +3663693521 +1237357550 +1005288831 +3136839510 +1912180507 +1460182527 +569176166 +2559345397 +3796315753 +2467340857 +1947574644 +3248469502 +3830271309 +2421458660 +1777602127 +1751629361 +1205845716 +3216084322 +4123837302 +3213884383 +2237029993 +3841895658 +2875481876 +1545087813 +2880852697 +1883396234 +1755740685 +4075980697 +2481044100 +3094604137 +2776451248 +1366398251 +4127686011 +1762134921 +3494504955 +766383201 +2095767921 +944336079 +471409333 +3928571481 +1401961671 +1634101824 +4283945533 +4113069598 +3053629239 +851194195 +1677644218 +508380865 +2080736750 +1845703116 +1796270707 +2761946734 +2040576374 +1998841212 +4184541584 +3312661055 +2493376214 +1527143736 +857099307 +3907800761 +1326819739 +2404798326 +1478011703 +2502823970 +1659582601 +733828613 +307786773 +1221265805 +1209292062 +3562020162 +2970490746 +2717032959 +2936701153 +2239423836 +2138685300 +2909155490 +810553898 +4086317833 +1595962063 +3146957314 +3658216126 +1788240451 +3459399211 +1994524283 +1892216884 +1793996774 +3080239129 +3057614559 +3507006822 +3059170399 +3109744897 +1024827327 +2429573319 +3986040741 +3394715785 +54275091 +676759287 +1948146886 +493931097 +268824119 +151374007 +1225012483 +2981230773 +3226269145 +4089725375 +2820032268 +2815687307 +2726923920 +840901154 +2901991780 +688939822 +2166583274 +3274168472 +907016245 +4273464335 +3174636318 +432492654 +1742744754 +1825058606 +3430316200 +3483785833 +876746456 +2405543541 +245974786 +2045033743 +3795717527 +1156486141 +3090338701 +2083422369 +3227238470 +2488118060 +3438919689 +3562850078 +3603323183 +3617964421 +1017912961 +2922592775 +1930586098 +404112881 +3605383791 +2606872575 +1712634854 +1706234765 +3117924093 +2423669569 +2639244868 +4023347841 +3862858485 +611178223 +1867119258 +723344588 +241772547 +2531543004 +13779570 +825509432 +3577117569 +2850742857 +2314478573 +3746115131 +2663336349 +2624455658 +180975663 +1863903983 +947828028 +1161167544 +2606043726 +2274422895 +414158687 +2803114840 +3546675072 +1045232530 +3809506644 +3350642821 +235333787 +500583158 +986450680 +3878193718 +2503031807 +3631329736 +2800533588 +3009594418 +1194183188 +2648649090 +3801099205 +69571050 +399525567 +1951482348 +4161500229 +3147454558 +2599700000 +2582216162 +757231428 +3141847097 +1160327239 +2571702188 +1227547821 +91172335 +2928764302 +3736124980 +1592532630 +2546327698 +673545665 +914402769 +857004667 +3767968153 +2497460102 +3042184258 +1499090141 +2796580079 +3361327927 +1052420484 +2746426563 +4215973645 +3916872195 +4061352545 +1168149261 +460843489 +966055360 +1275767801 +4103864957 +2964988396 +3270751176 +1404654274 +3935888563 +1389309141 +241845471 +3449851435 +1100207414 +1822062020 +3477666497 +2724267027 +1793664763 +3416314365 +3978867774 +2033421221 +775018110 +4099289150 +164485773 +4100728058 +1537716550 +1965446674 +2061296604 +4087238632 +660666581 +3579761655 +3536732081 +4255195113 +378839992 +4088364244 +3362441934 +3447479250 +2926245298 +745560828 +959079975 +775528905 +1993512800 +1976295932 +2423657970 +1737233652 +3940261730 +3346886576 +3266532455 +233357644 +150328546 +1453994008 +3825039007 +3524238979 +734673223 +3930047413 +1248842398 +526223791 +377992972 +169968448 +1256850754 +2241443254 +3515872227 +1423311720 +3372047105 +3368362433 +1329697068 +138928688 +1112781690 +608785942 +725584520 +2869191968 +3333185150 +4090064587 +1320454714 +790748931 +1390640781 +3208079453 +1814115617 +388438839 +3757016480 +740776804 +1899537292 +3663085476 +2682332645 +2802275954 +110249562 +1430736919 +1976821729 +2656439037 +854276829 +2376506050 +2824247488 +825599913 +1423935721 +1951094149 +571387878 +1199136424 +2786239153 +2551018171 +4058373402 +158446665 +735910731 +1167793266 +3161657477 +344567477 +2178795020 +2028434463 +3856664779 +2542974484 +3868131896 +414093236 +4079987224 +2675966445 +1794531615 +2685351840 +183924548 +1005024555 +4129401211 +1853620535 +58369304 +1833246080 +1749817563 +1000221397 +1893192527 +1711092049 +1449163490 +4189188271 +2024567187 +631056517 +2132837126 +1470316964 +1559793236 +2991162021 +3954559447 +1874228933 +2126654760 +3170592105 +3958813222 +1712811620 +1360247687 +747200754 +1475617887 +855817054 +1369310520 +2190342726 +47255060 +3026655751 +4174866675 +4126758652 +3934942247 +3961440490 +378738545 +545470005 +4200547346 +1687114821 +4282010611 +2224040946 +930363125 +4083710342 +4241863289 +1755930622 +3002277751 +82365682 +2279416820 +1561741121 +1638153987 +3148280623 +3421134864 +2444094859 +3237388010 +318586465 +3736030294 +2314569358 +1876060335 +2598802871 +2523816067 +1777313571 +2279733244 +796209402 +141807726 +776255092 +3897028332 +1472026714 +108444758 +2974524080 +1133291302 +1021770847 +2416651383 +399225468 +2491394697 +3532354931 +601008975 +647914911 +195285001 +2214134828 +3742747319 +3926783495 +1114709281 +1898035966 +2993063823 +1353007797 +2010192759 +978896501 +2196801141 +641307943 +808339861 +3884282080 +3058210286 +2251333130 +3813775720 +568292298 +2039178848 +2840915714 +2497173099 +2290352788 +4114962203 +2758743752 +2073588710 +1393098267 +2048692371 +339165315 +398369292 +3354771573 +1975251779 +2076968628 +1944151925 +3511406495 +550201120 +1294637265 +2747350555 +1009326648 +958349398 +1084644566 +1496021763 +699234380 +1719379073 +2017453108 +1579421331 +2654207520 +2126524394 +1720566410 +2294344593 +1883100246 +3929849536 +2102876183 +292725670 +666468319 +165807653 +3652736435 +531528742 +30059607 +3826666361 +230404814 +1948351349 +1938374805 +710633500 +1868990973 +1223389883 +623666020 +1164136379 +625415764 +3603579367 +3532576994 +2841436474 +3808935020 +2903739886 +425207026 +4268032040 +2395997940 +1358269113 +1665031312 +349386507 +1435084746 +828004328 +1551563080 +3381312740 +1265160770 +3662912000 +3187912684 +1704262985 +953811173 +2024349449 +2826854644 +1957661484 +2398250250 +233340394 +4193630341 +228888093 +2485809323 +1132111929 +1436540839 +935707174 +2999016495 +1095441160 +3747700707 +1327572326 +260247083 +2213613742 +3829451103 +4118793695 +3758171442 +2982848550 +4111131176 +1450883515 +2387725606 +3430893526 +1862142251 +1886356996 +2841082120 +3181734290 +1331201922 +1643433306 +163444346 +2727469679 +4268435796 +3563589463 +1217726467 +3221146314 +2527007768 +1443967687 +1690847010 +3598975533 +1008962022 +4262656698 +3619657446 +3317179852 +231329621 +4106132776 +431003563 +2336074294 +3072177494 +3039556024 +112797682 +3459957342 +1955564451 +3852953079 +3410024728 +2682783175 +2800235398 +581284247 +2647103025 +891027066 +1914753657 +193489677 +3205262842 +1105386412 +965199743 +2136738804 +4163537425 +4007274364 +3752597043 +936756635 +3163358090 +1607065984 +845896619 +4052437086 +3668872358 +2910213851 +1805080432 +2569118948 +540759015 +2703498241 +1653433675 +561483256 +3886314959 +981231253 +1282496843 +1294066162 +199773304 +1124297107 +2187428461 +809593888 +4259263599 +1185589396 +1325175628 +1538053772 +605424139 +3063273106 +4213087889 +1154825015 +687687759 +4168202984 +3192604220 +6430357 +3728472387 +2294956558 +436092569 +285007750 +2643795719 +553758856 +2276580974 +1502263387 +383546497 +4229270222 +3728598714 +2823330951 +2209987064 +1778680921 +1660655934 +1107378493 +1517612389 +4116725794 +1976824406 +2556207788 +1589084310 +4028955480 +3906759871 +2332709105 +2905948472 +983596950 +3348528031 +4150827293 +1835115947 +4283612338 +3283407027 +4243150330 +1883715861 +1089601111 +1496855821 +2445070420 +47353556 +4058287806 +1954329467 +354588538 +611980456 +2798608028 +3632702485 +641662657 +618678627 +2274869334 +1650127829 +3402835754 +1880213078 +2693629845 +3297798283 +2586677005 +1063736432 +2186259403 +4277976630 +1458179095 +1543570948 +2813495974 +1661790444 +1787603551 +3468649583 +2365870573 +3835392787 +1569675155 +2789177241 +2871070002 +44289815 +3561687666 +4264427417 +1032749718 +1791526668 +3499990157 +4252330402 +116860105 +2831869905 +2276032185 +2640868263 +2498966451 +348359156 +153164435 +2377519818 +3516998559 +2355989140 +1209571079 +619236673 +1832722434 +253081680 +2522731725 +1287165150 +4183820251 +3619952776 +2024115372 +4010932045 +135599415 +2530274303 +1819958081 +3692065474 +2247002978 +415893043 +337793862 +3988535114 +516569459 +2311337332 +3004913337 +167847139 +1933499459 +737033885 +3368303092 +2353580343 +1569196132 +260775848 +631822041 +1453048275 +2165934373 +1996319991 +1532049646 +785110424 +2948573273 +3358204485 +787336645 +3089579635 +1159905025 +322484591 +2552412826 +1264810194 +528242115 +2258112709 +3187537362 +638493119 +885887206 +2470269660 +1750183174 +279759863 +2434016297 +1801855468 +2885290784 +678398086 +659907727 +1285277461 +211327911 +3293665008 +2474586708 +3434105651 +21878545 +2547657136 +3367581145 +2501245488 +1677639530 +3646283698 +4258894230 +1169160915 +3239448939 +3918209672 +2058839824 +1489075292 +206899403 +3476443022 +2417069751 +1530875696 +3415348595 +3431061021 +1417336537 +3463501934 +1150279297 +3921771632 +1006458386 +1299124164 +464647532 +3009900045 +1364338045 +130128719 +1773693508 +369171718 +3829249103 +3984057682 +3688308300 +1104426736 +3300271980 +3715154442 +3387370149 +3999252464 +1409946283 +3815207087 +2142132933 +1500426618 +352959056 +960557162 +4150737919 +1449564852 +2807662641 +258268257 +3804736807 +2119860667 +2976857917 +939735643 +1122811283 +1193849915 +3605232626 +1952352741 +2539755181 +1845734527 +1238864299 +279727482 +542364957 +891483541 +1043956716 +650590695 +2437428391 +1454788582 +3418086715 +353962164 +525857861 +2902720074 +1843876395 +1080492233 +2164626154 +1303422828 +3805887842 +3293933440 +2093715154 +643488723 +1745734862 +2437429415 +1246254526 +2540997954 +2701102173 +1802045384 +1056369877 +1037814521 +1994221912 +3284018838 +256910653 +1799066194 +2608590616 +3827475671 +1225455284 +2743292286 +2034201651 +1133360988 +395487668 +3032056438 +474289207 +1940679172 +3622337070 +4008852317 +57936294 +2932630872 +1465851257 +1619090210 +3863854609 +583770373 +3331245604 +4205589379 +1568890202 +2722198259 +143788720 +4162474096 +2720419441 +4102842412 +1594515990 +1798396977 +2053005769 +3522437437 +3492571346 +1086528356 +173021874 +322111527 +2188596390 +1311995950 +492569398 +1014630112 +208859493 +3529214436 +1424817705 +4090092731 +3677173665 +191298450 +3026473167 +484662683 +764600937 +3028130136 +2792373700 +2928958260 +3946701091 +3491356166 +4071037473 +1432007865 +1122004236 +320774582 +2726704527 +308301120 +734265277 +3747284415 +2960075603 +970523047 +2774524778 +3526120441 +318821356 +4208002082 +1470873970 +4108535807 +411233948 +4140481695 +2807023922 +1998219664 +2575502840 +3026369128 +1374855628 +2262935509 +2659028748 +1704434554 +3996124259 +3607405669 +489510327 +3668807315 +485310392 +1757500630 +1327888884 +3299300568 +2247092148 +2347951171 +2781076687 +2429151958 +1106651524 +984271124 +3877603713 +629411457 +1324531036 +489305053 +1274985618 +1522476438 +2263654118 +3231789403 +1650238950 +225601962 +588667610 +2089377664 +3273346657 +2175232552 +1637196643 +1385250623 +3494190495 +969942485 +3867963234 +2519077395 +3888707853 +3259534670 +3431353456 +2617742908 +4121329013 +2046600736 +3602761641 +2629530955 +3738421205 +3921107208 +1506043752 +89372295 +4284343701 +1932265561 +1274044780 +577677243 +4082120258 +1323349162 +4206996756 +491024287 +1479857632 +332179084 +3358009817 +1638643918 +708703569 +3804792479 +1842472668 +2127766971 +2444911728 +3703514844 +1464902833 +723742853 +2406048626 +1381492237 +3920702747 +62682268 +3570222637 +3200983362 +1997437933 +2748983060 +2125594095 +734188255 +1807639286 +806397388 +4172500799 +2382733404 +2047115764 +2376265705 +3579919889 +2834589797 +1287785292 +1058238843 +3026624265 +170599851 +2177415497 +2089591548 +89983709 +94959992 +934653119 +2279988645 +3475771308 +1449668259 +549225208 +2169832108 +796272129 +2816557008 +3017116962 +1162012558 +1500459218 +2399059329 +615907262 +3254350469 +2276910954 +3825709050 +382298444 +1457402998 +1573213699 +2501387930 +657054009 +340863437 +3384302129 +185683612 +4252668756 +2162961454 +994469714 +3244906567 +415613965 +3255163410 +1057902240 +3973177532 +3016282204 +2810503857 +1099336678 +643985328 +3645763883 +1629343907 +3519080453 +3462318590 +2080218528 +2252799113 +1069935407 +3353846162 +4269297285 +2492484616 +2310553402 +3499937373 +2595944778 +3502816614 +2980600437 +399946912 +2469392546 +2655396851 +3718014020 +4241150977 +3750967049 +4238107176 +348907482 +1196090257 +231865515 +2121340242 +3486184058 +175715048 +2893847225 +2946302023 +4186229563 +2847229537 +4000848006 +449369495 +2438921321 +2898227859 +3063968661 +884045055 +1766034348 +995273506 +1027275999 +3341320275 +1271532241 +3735719240 +511704102 +4111484074 +3071136090 +1062543750 +3250248392 +1243207588 +3485006011 +805526109 +2918868241 +1842018183 +1524804061 +3602284655 +2334306425 +374711291 +2715478168 +4025326669 +2847643425 +2950429535 +727658534 +3364183463 +3540131568 +3462081513 +1838077517 +1850456626 +3996818909 +2064516899 +1917728193 +656423362 +3776278708 +3562745832 +248933355 +4282297794 +3776619682 +1283899283 +2060341308 +4178281200 +581921113 +131924089 +1187219057 +2094132971 +2133595040 +1818915636 +2056819865 +676565401 +3861140731 +105390854 +1249517253 +1006261388 +3530260674 +2186592614 +2068302487 +1865041360 +4178504455 +2997131432 +494804323 +3494719463 +3512032245 +2413839129 +1161887867 +1257093559 +69001272 +866357344 +2807458538 +3390170707 +1245165883 +3238880139 +1120975621 +3254029404 +3939757183 +2287021915 +2031941952 +654417580 +919147117 +3769751490 +1189715979 +1496559065 +2676906708 +1254354486 +891517969 +3504583503 +3606210672 +3609419705 +1007728947 +2885698645 +3238062356 +113666966 +83338145 +494857792 +992109589 +1001352429 +1487990778 +2046366192 +2447895756 +3076698831 +2548519482 +496866210 +2511202819 +3981026561 +3376590372 +86857896 +33450278 +675917229 +351390892 +2976589726 +1164711943 +1957275035 +3399121335 +1134381562 +3079990171 +1910259019 +579771312 +1337285621 +3668755409 +2007977799 +4277283238 +2867400959 +3132865559 +1204776323 +4277991819 +3704216435 +3678218513 +703944130 +2549557572 +2844283276 +832835251 +3010151465 +2187803273 +439369188 +1615869008 +132336587 +2405915614 +159181347 +1147998845 +891742232 +2038132952 +138040549 +607560226 +3780508446 +1941356205 +1053123190 +3169960918 +789669399 +2680332642 +2240055460 +593337223 +2530103278 +1974598163 +39712662 +937672441 +1929072716 +4170795187 +4037242626 +2732669872 +4002484920 +1579312526 +3125087293 +3186314822 +3375041308 +629346386 +2299131681 +2416199112 +2766153432 +2177343516 +2516507248 +3933501957 +377734948 +367840483 +1355216707 +3515895781 +1266230047 +1837464284 +3701383125 +151644088 +3896506290 +549601583 +3359028518 +3602935319 +3838277810 +4064412263 +3923499488 +2739507691 +2058046327 +163913310 +2173633815 +2341971955 +130536043 +3171580982 +371496966 +117463743 +1757419973 +1436322334 +2945372806 +2219109750 +4282059032 +3769791130 +3322951499 +3670197848 +1955517872 +2419522330 +1097047760 +3643977740 +2878413065 +1617623470 +1518216417 +4097167721 +1907451961 +2174777465 +612715155 +2068411776 +1572392671 +1389374598 +591030711 +2575605467 +1777803882 +1151256558 +529924297 +2790865965 +1975197719 +1759012785 +3816878200 +1577052675 +628582078 +4083575037 +554886972 +1926667008 +3521741423 +3877053695 +2049854812 +2695844126 +2803850944 +2071406279 +2013048948 +3182226498 +3897703189 +2710218964 +3904637666 +1199785882 +3258768852 +881543754 +3895948206 +3072085059 +411630154 +2883920407 +1374655385 +701952761 +3460595236 +2942225736 +3184633492 +1527177315 +781707594 +1610168205 +2187579510 +1251827552 +1796024704 +3986827763 +2216386708 +4100552356 +2341129090 +788834784 +1537127777 +3601799648 +2239920191 +1067457066 +1580427509 +79756789 +1622982463 +1838153936 +3694873781 +589172680 +3741401636 +918210766 +1201676276 +2662495203 +4049295052 +3689802762 +3891218971 +2369285927 +2589219029 +2820005386 +2875656029 +2160673057 +24000054 +2842787445 +2880195501 +2720777235 +1626472388 +485267693 +917479883 +2639633721 +1182047994 +1767884771 +3943534960 +4257975117 +2588453156 +3591040588 +1267857743 +1594345744 +3882519453 +4097804565 +421404231 +2107683143 +425044549 +525598606 +845178443 +3637910330 +2443325255 +2531547007 +1150692316 +688313505 +854617605 +2510052319 +848445191 +4131764262 +3205647133 +602734751 +1868645929 +2633755500 +2071937890 +4230215643 +9253297 +891793665 +576427548 +2624930681 +535437423 +1936162123 +1786466657 +2797162395 +1425358347 +1496394902 +4043725280 +300066888 +325515779 +780605905 +3724384721 +1601892696 +2904297014 +450222328 +2336984333 +2034730636 +385350378 +2264797559 +3406700747 +2786679515 +1458446789 +2148730415 +3212601636 +2480721930 +3136253128 +2950803516 +1658446624 +1558433421 +3280014121 +1769170472 +3311328763 +1768028748 +3018422801 +3177751193 +3997949987 +2378365002 +4101896776 +849945248 +1989028684 +1947163785 +847913355 +100093336 +3263710662 +3314423117 +175752480 +3300293205 +887377084 +253741758 +3206721478 +2409834760 +2793259205 +1381326887 +3545401453 +1492773640 +3825968488 +245475195 +2218644609 +3579481662 +3341503369 +150361874 +1459228808 +2679241297 +690653449 +435737045 +3962747981 +65770814 +3438935318 +300453530 +2147089463 +4142077334 +735151461 +656696534 +3375754717 +3595369459 +2559965423 +2154731038 +1553133357 +2762750016 +730096809 +3258593047 +2622552722 +3455918165 +2316075167 +287581097 +478538845 +1871209794 +3858788548 +3433237539 +1936543284 +4105782609 +938134531 +2650209641 +856696922 +477046137 +595661894 +2396434295 +3678730933 +2297267849 +2336478323 +2297139598 +1274968075 +3222018761 +1136942158 +2356786872 +3287781262 +2580891897 +346644794 +2063941337 +2662700467 +683650578 +1962440125 +2229564348 +3349121418 +435091876 +840485573 +4258486331 +2770840495 +1523603141 +2960528534 +3248947786 +550092275 +3912921828 +1963986484 +3669867833 +856113567 +477087908 +3649861611 +2506329285 +1277406468 +3422406930 +523361192 +1697120518 +2738097488 +2606769864 +137695141 +3294890726 +631772438 +2686659989 +4266465133 +1336848912 +3189301592 +292595718 +1344951727 +911425886 +1057116958 +482267610 +2553667575 +1659839959 +3520359094 +3088215602 +3083109370 +1068275552 +2758266155 +641831156 +3947625857 +3334007259 +1646367971 +1931842943 +1249404838 +574870652 +1333019709 +3481869825 +4200775280 +4271250924 +1664262908 +2154389883 +3986443822 +3142878643 +1441610366 +624984239 +602536285 +3438179642 +880027056 +2042857709 +1140931327 +4088410249 +23850948 +2079935663 +3366955732 +4116579647 +3671404780 +1049505973 +3111444019 +3089407658 +1234169506 +3574629997 +1372202544 +3971770400 +966210302 +993785461 +1958007560 +3626072553 +3384203886 +3330867375 +2030165545 +464677954 +2717713164 +3180779233 +914822877 +1682078534 +3341242411 +2590584257 +1731856628 +2944051524 +2607749889 +1850316647 +1857125386 +3477266218 +2097724808 +1762595157 +2710102171 +1585851918 +2516823581 +1597266602 +3547858735 +1286097839 +3844218151 +2854549031 +1771863494 +577024113 +4291140492 +2815500651 +3351167357 +565171898 +4003273925 +1130080893 +882284686 +1612958798 +1608318602 +1306795426 +3242059792 +130179064 +2772450371 +3563875947 +1681560625 +3321046334 +1573797546 +1441040001 +2082800096 +1149876992 +220831947 +4235041068 +3263921475 +1010577479 +1775648636 +4121603500 +3556349310 +3935895010 +3598096810 +1730637909 +4203800019 +2711578025 +575967838 +2418363113 +892361647 +3286163672 +3239236140 +3112646023 +404969539 +1387416713 +1966503119 +3912430807 +1453163197 +2039125598 +2117050729 +1283593048 +562488191 +590149329 +1245479908 +439114535 +2962636392 +2062723840 +2531373901 +1054775254 +3875201408 +3590061661 +3576282406 +1074547880 +1844848602 +1006090885 +1946314825 +4053238432 +2845818885 +2991503243 +960899522 +3428204880 +947979437 +770937941 +2846121288 +2297524112 +929989230 +348548903 +647118738 +900865774 +1251336894 +833210651 +2038496543 +2012634034 +3329435286 +2216047127 +858942655 +4028216392 +2855068852 +893305655 +1836642562 +3540764531 +506471641 +952458287 +2555313950 +2952883688 +586435152 +2642193165 +1937405005 +3420649149 +787686053 +1408746656 +4040601856 +3925001117 +1882265971 +349323309 +4147068211 +525924427 +903620262 +2673607875 +2724854936 +1152992292 +333673729 +2656483720 +2371203499 +2824597303 +3431731188 +3945085282 +2584690544 +4024957330 +872981023 +2080699668 +315002015 +2056544398 +2958314126 +3255717234 +3414112410 +1566472534 +697474747 +3798681867 +4070338786 +4053357760 +1873195758 +2008244683 +3662067012 +3923716878 +2082746945 +2050337216 +691461751 +932305351 +2368433737 +2787389461 +2657985806 +4035378252 +1224383078 +2169923354 +2818168385 +767627428 +130321209 +2005437938 +4138921365 +2455059787 +4089200620 +4027046377 +1185220818 +2576689164 +1473319152 +907721926 +3183777599 +1296139421 +98671595 +830061231 +4146591766 +510560119 +1794616846 +1922007307 +1978965229 +415361570 +1878868899 +2812058514 +1473550389 +909702452 +713290203 +335833463 +2096889573 +135003365 +3453819578 +2416975095 +1830940831 +3966596130 +1708580472 +136061856 +3932718833 +718590921 +1100340751 +654062291 +2101220003 +1974790868 +905171299 +4084603576 +3697523584 +3130831902 +3982014629 +2208849930 +3672315369 +1966621392 +487935599 +2768892209 +2240431049 +1890583171 +810837392 +1756908018 +1218086116 +4122737848 +1662774768 +3496726900 +2598916520 +927808956 +1269001439 +1929954059 +1526413926 +3075200702 +2452717051 +3442328435 +791187447 +621850592 +3934948835 +880659235 +3295469625 +1491248533 +2343613062 +3930159059 +969653437 +405622430 +1161453090 +3195437117 +663798156 +4164266705 +1798393898 +3761491289 +1265619637 +189625510 +475269326 +3009234539 +2170098418 +1275980005 +520530253 +3507120963 +935456854 +3025031072 +185025029 +591809817 +3343491820 +3220719415 +4059158410 +1011334579 +1231003062 +2134445901 +3254642584 +1191962849 +2317417929 +3535407621 +398169996 +2271145348 +2305008591 +3399853640 +595858878 +3597620309 +3747963020 +991449772 +512330298 +2905615893 +541788562 +2316528591 +3712175997 +1668264912 +2729201056 +841513999 +1617128581 +2710639368 +532645081 +2899867308 +1675815720 +4114838097 +2463004200 +2148077196 +2949141814 +2293925651 +594154854 +3708485132 +3409294965 +3695511114 +2035488763 +1513634233 +4046615385 +3622342502 +2675043127 +689236315 +2703195176 +4283073535 +2713015807 +191250567 +1477666714 +127178869 +2440286674 +2808849115 +1115580105 +3810377386 +3386044672 +2294636114 +483255793 +3759169502 +1656008257 +309323435 +2674945640 +3360787696 +1784423692 +501422200 +3025736043 +731020356 +1772676243 +1175816334 +727245809 +770391884 +573876373 +857847454 +2982653472 +1429440140 +2201679787 +3730525643 +536700475 +4145334724 +48771505 +3340417167 +4099830573 +958857246 +2251289559 +1813060961 +4132200375 +1249199860 +1120669515 +2513010015 +3959007433 +337860382 +3619297004 +2078406934 +4293027460 +3071349580 +4010280375 +503898996 +2671542878 +2140297962 +3131696409 +2972866258 +1275237612 +2601347399 +2694005693 +1521187928 +3484568315 +2910684460 +3507702140 +2598847027 +2738975448 +2757960766 +3310974482 +1535484096 +705373410 +1049733700 +989184954 +61060348 +2797687264 +392547146 +3188002665 +1623364721 +2166775961 +4212126388 +2195837218 +1733799713 +934170246 +934950936 +4001208537 +989072333 +1324503152 +405941817 +3963822912 +1076167863 +3854373162 +4237067789 +859673005 +1344015591 +1089043174 +1112149325 +621931598 +2288163518 +1970828627 +2367836018 +2649297164 +2102180681 +1604769237 +2117528291 +203539547 +575615003 +2543745269 +1915751919 +3841308677 +1291935899 +3170163709 +3820883648 +3483408410 +3906010760 +4038374606 +4129767217 +469365683 +3059250631 +338999412 +1468711634 +3415658357 +2674019779 +929176153 +1834663573 +2504644124 +3693474114 +658438337 +2962624967 +4030715259 +1698273259 +179543369 +3988707443 +4139845559 +2144958133 +1275856505 +1124923250 +482856845 +2493737622 +3837591564 +93557415 +1044265321 +2611056804 +15064051 +2434951573 +3362935165 +2079431651 +4189872877 +3885101754 +1422631042 +2670735775 +4200705529 +3653141840 +3377810567 +2563335046 +3318998883 +864595373 +3632521141 +3789650941 +2793114170 +2956165912 +2487446629 +1416973871 +1150296071 +2524065988 +1237907238 +1886638652 +3866144674 +3888713740 +894386581 +1617683464 +2592411 +1513808223 +1736222609 +1121077821 +718469993 +304048163 +869231666 +3972317940 +4138287829 +1483019385 +925105553 +383912399 +3322463284 +3729197148 +3104650608 +2908782832 +2934605117 +3242514653 +1329004398 +2418294429 +3158688974 +1197303719 +2408675635 +738026694 +4082815940 +3011981434 +3420435341 +432064619 +672457503 +2628384122 +4233461196 +2423806022 +2369840347 +4104669828 +2636540820 +497346805 +2927469842 +1052366076 +318817583 +1177944495 +689237361 +2682042411 +2229276317 +1613578233 +1924614074 +4106739492 +2091084652 +2092331271 +2913224719 +168428324 +2357263342 +3422115895 +2607496061 +3147042577 +934095551 +145035794 +859772029 +2625694116 +1229834055 +2390255214 +3011597964 +104963460 +1003219059 +881927680 +2245209344 +2961527999 +4041086898 +2077431062 +3143403809 +3680044939 +2246517347 +2279704033 +2954631272 +2194732960 +3543379667 +1162643960 +3731418634 +2622241917 +296187331 +1809401482 +2809037910 +83490358 +1858217959 +282548897 +3636258734 +3571960751 +4203965387 +528274621 +3712165566 +651207474 +3714635581 +1577538685 +1400777546 +2048632056 +2683680224 +571464905 +3309179557 +79666099 +3142802840 +3331425290 +896619580 +2365851259 +673532624 +877511892 +720250859 +1724838938 +3997003299 +2746970930 +2211634420 +2361646279 +1797251097 +2278449903 +3720233432 +3530134728 +4093044754 +2728500213 +4048806213 +3709203622 +2040062920 +381930837 +2299529538 +2128865771 +1592492301 +3009749409 +1457750084 +571132770 +2693083246 +2013231260 +3714498560 +464953906 +1349459366 +858600816 +696096440 +2008807875 +2987583724 +2537297081 +2388969680 +3529187101 +1386785012 +357580294 +3674938714 +1578131871 +3665480461 +3524120014 +1024979456 +2524370630 +3120078624 +184502714 +3878224599 +3055908752 +2247435689 +537504824 +2750190610 +1251897105 +1942822668 +350565330 +1457163877 +3134889676 +1336407957 +3441142268 +152522557 +3088177633 +858467730 +459763377 +3085947924 +1252155455 +1723497561 +913103063 +1234626560 +2294331055 +535563528 +902876111 +4082172307 +4038845661 +1820004721 +4284953194 +1533312352 +982450520 +1854435329 +549487898 +2693130425 +3491907154 +2004400782 +3350296433 +3958160802 +3253117091 +349103893 +3542718798 +3502617015 +141041758 +141799095 +3002942017 +1150919132 +1977754013 +111654600 +2945685510 +3778891727 +3078563533 +2051660871 +396829123 +196430701 +1751932029 +3583645169 +2686031124 +385761245 +2849420050 +656568602 +3312472415 +2046971767 +2251413451 +2272506301 +1103647428 +116219050 +374294936 +3869683014 +4135994621 +124031717 +387288184 +1262873913 +2729468640 +4156681656 +1649565184 +762658891 +2663567873 +2478580687 +1464411726 +1160935820 +2045468762 +1374342776 +3376809110 +3593864109 +1955102909 +2327149720 +390662748 +1600598903 +2882400385 +3176040286 +858308729 +18672801 +1395574858 +1100634171 +3389489837 +3319320030 +1316189783 +676216971 +4072604478 +2054136755 +1136927436 +290842516 +4286639772 +1200309649 +3065978823 +1031467618 +824309092 +3147976540 +3797580393 +3639538467 +2114241601 +2659272069 +1296946066 +3460904902 +175919893 +3416789940 +2481370920 +3122983483 +1204621525 +3219769560 +2989265309 +4035389369 +3183265172 +2606458035 +3736102623 +479835703 +3556454436 +2992076989 +3431023618 +2854245652 +1179211647 +3201376865 +2550640750 +3264095991 +3733475872 +3204493175 +3405496446 +2464499422 +2779423147 +74060002 +3234204377 +100702390 +3009986903 +1497561451 +2821672018 +3206920567 +581042866 +3764833032 +2286743733 +941115816 +421248397 +1904000469 +2350684838 +47477030 +1396502537 +716435473 +1434109981 +1675521123 +3776221307 +3069224790 +781822954 +3635602475 +2705340553 +2755293099 +3479765995 +2945686834 +2914933146 +524651912 +2645919654 +3170572201 +2498221693 +3626824599 +2912708361 +2424554219 +4001963417 +1236919624 +523949585 +195898784 +296780871 +425792094 +660828101 +703807211 +147381160 +3075073263 +3955897607 +895338069 +4247325493 +391228013 +246416619 +3734402006 +1807163628 +2055366548 +2890053397 +1325925186 +491497440 +3401141480 +718743508 +3992033828 +3638171362 +2084777333 +1404725987 +2164596684 +128173915 +2179495898 +2734114249 +2302874173 +2601881294 +4266300959 +3240459746 +2133359060 +1892190220 +1329873257 +2923613920 +1566152290 +4072741564 +3183115975 +1474936216 +1349197057 +4198799347 +2467396884 +2590642268 +3791533802 +1595935286 +255184872 +403772478 +2546814948 +484181795 +1950244862 +4234789605 +1131157061 +2426901753 +1821521908 +721463250 +2907076902 +2839650622 +555262840 +279700534 +3885044850 +2335489663 +1301933164 +2913222502 +531554497 +636685354 +4035405012 +3972797376 +1011285494 +226388886 +2260756705 +3684747658 +1149327496 +2255188808 +806745978 +3417751566 +1029876525 +1905359153 +333548365 +3781144604 +1062851850 +799991703 +3668925388 +3706193134 +3732627677 +1416306132 +255452023 +2733696998 +2917540045 +4221795939 +1405259783 +1310761112 +4088589390 +2327832942 +3439418546 +168373216 +2676437115 +3515356815 +4286244001 +2964044278 +3239534839 +2512366498 +4028616461 +1444402675 +1659262127 +728312508 +1744056746 +3895499534 +4178674268 +3507784757 +2007925811 +3564085609 +2562405976 +2993912585 +868824647 +1489881978 +3789813094 +1608935769 +3685737463 +1439475295 +3613203929 +177644277 +3891819318 +1315586475 +2902682147 +1080100360 +1575641188 +2882709374 +1300016074 +121814969 +3303738950 +2109637858 +2289453523 +557549741 +3230395678 +2337573720 +1906679805 +2627109496 +2331603173 +3835827713 +3074701200 +2398997384 +946104350 +3717332233 +1840146004 +1500125935 +2459926681 +1605680944 +3812264274 +1594207619 +2108806447 +975340799 +252600584 +712967480 +1900612252 +3477871533 +2403724612 +3029093907 +3063669052 +3417401902 +3632964791 +2749472820 +3947203876 +1299587653 +3724872946 +1699653916 +2302370527 +2939592507 +1141633219 +2759177202 +1036599797 +2856925484 +148682033 +2931421735 +2969086108 +2722419252 +883744333 +963484265 +2861402087 +1997976234 +2921575197 +2004127043 +83306711 +869078965 +1441684959 +2909480351 +2914307132 +821713555 +2816571323 +2233178877 +2838249514 +3498271939 +95749581 +3994159664 +2919169989 +1299115737 +255713330 +3125730252 +864390226 +1137818541 +2511557946 +4103625997 +873624455 +4172651489 +1466094926 +3348254321 +532827909 +581668196 +429551152 +3670022772 +3550527352 +666920983 +2668862259 +3844026082 +2574152349 +2825178606 +650749480 +1398489453 +2728501801 +1348983443 +1944286902 +282971941 +1508544916 +221370481 +1570820839 +341554239 +4257845782 +1128280778 +363567321 +3723356570 +2272630765 +1443557240 +2771163105 +4243468085 +2605698549 +1279967098 +1659641145 +1745178144 +2710071267 +1861159942 +1894647285 +4186478662 +2102001670 +506842409 +3579200791 +719316900 +1086323391 +293216066 +747509797 +2538342550 +3785184606 +730516389 +3854788274 +1542499626 +2874947170 +382509271 +1640202176 +3391620234 +2861715973 +2085480314 +1749823641 +3256695095 +2742533682 +640087641 +111084889 +152961903 +4135700579 +1640937371 +2752700969 +655479307 +3436581929 +2004772165 +771124812 +1593410233 +1495299531 +165122413 +20298560 +522007774 +3370555087 +337578245 +2985977919 +180231306 +3679565792 +1184276752 +462696065 +1546640587 +489183138 +3374754299 +585133177 +729555041 +3463326567 +3397566478 +2439950996 +465988396 +286439368 +602152676 +392322034 +3986175605 +3444905240 +834863455 +238586625 +2944535029 +2107816550 +2053054796 +2009377405 +2254132870 +3611099551 +1536388679 +2230947490 +2070444982 +1996422208 +315543082 +3684513943 +2462999354 +41858162 +1107908514 +3929572687 +1693869588 +484967879 +1129747240 +2927303129 +3759920508 +1526007968 +3352516882 +2128381140 +3179082674 +3101177106 +1407655263 +1683886129 +631149128 +1066078783 +3495737156 +704327144 +1920392141 +3767847133 +3350433455 +531512539 +4205601449 +4234243800 +784505716 +588381900 +3278698588 +750416718 +4247086052 +1332040368 +2558356578 +2888023581 +2355328495 +3619820326 +2645545850 +3419028931 +2056022879 +3292367168 +30662872 +411448512 +1001717975 +2159513957 +3680913186 +2164988300 +2499034413 +3676804712 +2669447257 +3528362527 +2495636313 +3640214579 +2812867293 +2575481548 +1627493244 +4183079529 +517155430 +239509252 +1052368697 +1130875679 +3777888046 +3748371646 +2987082293 +2804697514 +114094292 +3138082668 +3977383203 +1129320653 +4220464076 +3853852083 +2241435394 +2365354109 +1163167511 +2367770426 +1122173048 +2967912775 +2112563482 +2045460909 +506501023 +1749536332 +2818517916 +4116453605 +4040285586 +1526142943 +379590964 +1489272606 +3151538279 +2373624697 +4263911452 +54891012 +3720855813 +2462929773 +2944141759 +1053989631 +3112720102 +115587857 +950018837 +4208116316 +3415051725 +2204598748 +2080506005 +2409958989 +2647437697 +2888324936 +2992400773 +3060221925 +1068576226 +3377172190 +2362902872 +2976883897 +3891519035 +1570884661 +2744438013 +3507384579 +2325984945 +983118447 +4133418653 +1080048420 +29486424 +1146113079 +2760999731 +1731008859 +363323578 +406246129 +2561429708 +1699224558 +385034092 +1112601917 +351101763 +1380200004 +131880954 +2220597461 +3170871714 +1768459158 +4207228358 +3853633283 +1442528840 +3348757387 +216399614 +1071160795 +2271713000 +3509220831 +664666994 +3181054847 +2623311149 +4146123211 +1298594172 +2862787255 +3965889668 +2024747788 +3499583245 +334700360 +930969908 +1501129089 +1376104624 +4036483047 +1188127895 +2645058266 +2159857434 +1891541399 +3435361256 +886974405 +2606774233 +821203751 +1337048843 +4228921359 +3828540593 +3666563079 +3147982290 +2747196915 +235969178 +1512654471 +2247253528 +3004910733 +537047904 +1284160052 +453839274 +125983218 +3069485239 +3516027764 +3775387554 +1807471530 +995878972 +2113038138 +2951645359 +4045063974 +838621307 +3073049951 +325384071 +3156938914 +1733791967 +3711068358 +499899994 +2193642345 +2878657186 +3497235927 +921388204 +1276842544 +1650669765 +2815698338 +2015568132 +2169363790 +2207494414 +626234535 +3390661097 +3627384365 +2856969574 +2086463376 +671700941 +1444332958 +3395716568 +3083310143 +3555173304 +2880418596 +666378732 +217490159 +1984252846 +3307090273 +3646816439 +3349652492 +1758256389 +218952160 +2547721987 +4264940937 +500505482 +1511381814 +2265844968 +1404695264 +662037438 +2830753425 +2183144013 +2416171731 +239089 +2408993301 +4164085145 +3023807980 +2617161161 +1396418354 +23903724 +2557465761 +2959948022 +1202139767 +2288354242 +3717275946 +1531237897 +3717050484 +1798919815 +10453811 +3166742689 +3840197167 +508173281 +2371816529 +3907819242 +2686561690 +2833227397 +340708720 +3098008890 +754354495 +1737791930 +590581035 +880732413 +1217283368 +2504525922 +2990244313 +3638281530 +1495454918 +4007908465 +1380361231 +137038918 +1275548140 +1327117624 +1859935168 +2015356366 +3385792273 +803794504 +1830236439 +1014507384 +606233517 +749832081 +3510820556 +21013678 +2052712434 +2264670336 +1116268591 +3194915770 +1990714280 +2157551963 +4145178618 +160406550 +2050948661 +3456183617 +1179717328 +1359566892 +3671913293 +385235395 +580914903 +3428444128 +487197493 +397184427 +224080487 +248643906 +73474141 +2801387908 +923837979 +1744477066 +40295137 +1006871735 +3590287266 +2611067302 +3890354545 +1097165365 +2919776849 +492938146 +1877842715 +532355130 +2497748398 +825174820 +3400484565 +2443454323 +335717192 +4174701395 +1667663418 +1297144242 +4034911091 +3114663925 +3875953020 +3406826494 +4170542378 +3259376106 +1495817045 +681986754 +2402082840 +313625689 +3859095505 +3520587148 +1898287522 +4185053173 +2687317946 +4221456660 +1466878574 +4056347827 +1538035519 +4212021115 +1976719359 +1388694684 +3982937127 +529071658 +1763198779 +3938092633 +329152793 +3215384138 +3581317521 +2876713275 +2720016332 +260552591 +2367732503 +2889343241 +2962649310 +2243878420 +2758051345 +2898042504 +3953760581 +4094359656 +1946722482 +309177396 +3151944758 +3344123925 +1007843940 +227565023 +1249162708 +2273481299 +403651676 +3128271769 +221436924 +967537651 +3729264471 +4113960392 +3792869111 +3755536648 +217297177 +693537418 +4159929091 +1947993409 +142841376 +3178564834 +3908369097 +419896682 +4170608191 +2287665559 +1743133626 +66641149 +3497520716 +1577913420 +1417785518 +953494455 +3009907683 +2452620312 +910777280 +458478297 +3948162523 +2588747450 +1640424815 +195573730 +1541506813 +4158116662 +499597045 +1216367600 +1235880268 +3702648292 +123211833 +472470565 +160825984 +1827018719 +2083491238 +1518034867 +1302715601 +2285825824 +504376673 +2203565979 +3989683272 +3883934327 +1325770737 +2338171981 +4062966416 +812583977 +579193275 +3025980484 +1355239681 +3631829658 +3010395689 +1277305016 +989396865 +4130296320 +2344194833 +1881535515 +2253729246 +1572984857 +1962731392 +1849247801 +3169095141 +1640073185 +1719949274 +3472596611 +3255498585 +2614948729 +891649237 +3533805142 +1668750833 +146997259 +361521300 +1143110198 +506668448 +3586280221 +2167764137 +747575613 +1088314588 +3845503413 +431875899 +3561266038 +887439992 +35738395 +3494614507 +3652877444 +1548337394 +3730513197 +3112346635 +2613504478 +482085716 +1344823843 +1713974446 +3593850166 +549993909 +3737024227 +25985045 +3022396722 +1907543786 +346460543 +3177644821 +1947353596 +2506665786 +2450526091 +579220959 +2135433432 +3401645336 +3688866333 +2068178873 +2332153107 +3846872092 +1539441969 +3512442631 +714507038 +3686685415 +2029278077 +3820284361 +3298625370 +2099083491 +2908485358 +2165238415 +1253169593 +2529779911 +893273087 +4286822781 +2247596142 +3353550176 +1889333322 +2684233939 +2980698423 +965946207 +2280741219 +291345692 +1828876337 +898348271 +1430113884 +1816861405 +1955501397 +2748793905 +1672451639 +3064406516 +527443227 +1592007060 +2986847903 +3173611934 +1628952837 +982936281 +3005865441 +1514081602 +3930404586 +1168633772 +1926694073 +1643106987 +2906330488 +3514592598 +930525285 +2250007080 +4156461518 +2981792954 +926638533 +2569593161 +2752866206 +2486055074 +3022971174 +4201761617 +808876182 +2744522977 +558819861 +3705281150 +2377841877 +380024119 +2221633290 +959824527 +3064164387 +262910254 +2860694961 +1216652347 +603515618 +1603155781 +2192759489 +1687788593 +1432370136 +3377618138 +4244327881 +2430045185 +1758012738 +1661983556 +717602905 +155757706 +1624613476 +2819969279 +2925498968 +2329215801 +2753150104 +18368422 +1225234004 +1531669815 +2695793657 +2208467220 +3384229855 +493383887 +2944931249 +610108837 +3449045070 +2415338722 +730378507 +58146413 +713151698 +171548561 +2384294991 +1784588158 +344952671 +1595156862 +3512943303 +1263142545 +1487234313 +208308988 +2611286967 +2263826321 +1461404405 +3355048848 +3855288307 +3039496339 +1907807048 +3986340226 +1597144457 +3439389035 +2557620623 +1000667149 +2203034589 +659560676 +1960937087 +489427974 +2938813875 +3235880223 +1235054562 +2798347680 +500036966 +1953547268 +1458970961 +3211718673 +186035483 +1381165908 +1484160093 +1201816283 +2871350537 +157355940 +2738456099 +1334746043 +1209839783 +3520882396 +3896444127 +2734873611 +2994494616 +3310644043 +3714979892 +96561537 +1479543853 +2537865518 +3454652374 +1236210394 +1821093041 +2769915180 +2774635081 +4102350142 +3181768644 +3677396387 +1540787810 +3280997560 +3990245557 +3341986999 +1823040315 +43747362 +2557029908 +4177893061 +1418321397 +2610921694 +3504515723 +4002229345 +35195014 +1576113018 +3616469320 +2076918295 +22618575 +1850499835 +991523898 +1936186308 +1305497145 +1074743611 +1457730283 +2828790831 +3173781719 +386976119 +2527024950 +1986484886 +1835348583 +1600855865 +3919620390 +2436371997 +1026481977 +343816799 +2549795084 +2046833845 +2390732922 +973803486 +113382490 +2003038972 +2895949424 +620431151 +2409506185 +3092770647 +1035127443 +2772670250 +2834130534 +2638025922 +3309966895 +3699735418 +495224770 +507001101 +1132676279 +1181565256 +190724225 +321457424 +2224414004 +3942849238 +3077219038 +1299288571 +2873654541 +632384157 +1170936730 +1817638124 +832895356 +4196103826 +2442838050 +1065647439 +1760529669 +617138305 +720027422 +321584115 +2684225844 +4044870854 +3452691844 +1648977980 +659269104 +3576456117 +3376451309 +1626575974 +598598718 +2309761113 +3920481444 +3025131466 +2239291367 +502905054 +781496848 +120419232 +2950413194 +3979070382 +3305947242 +3272478287 +1894552671 +440133326 +1539580888 +1668424719 +802195636 +414564658 +2877638458 +40064875 +3969873291 +1735994386 +3652533802 +3797062581 +2786611167 +771817238 +1817514435 +348079630 +1493822763 +2063802892 +3899154048 +504657309 +1345724284 +3630820328 +1979836110 +1730048573 +2351773573 +4048118357 +940665252 +705429113 +1095974328 +2318146563 +1642343847 +1963555453 +3305638511 +1603342723 +1863339511 +1306856932 +431114555 +871194123 +315861685 +1107998110 +3239944661 +228108625 +2537984756 +231941070 +579240412 +1276071694 +3754463056 +413855047 +1138063437 +1858707615 +2571710371 +2881431562 +2399010881 +2534746832 +3353158906 +3059971187 +3668932381 +1994784429 +1880395777 +642182973 +535892469 +473249233 +3667302988 +606823587 +4001953640 +2746246903 +791682079 +321244103 +990499594 +3302129330 +857175635 +3162269444 +3099085573 +3355417583 +4266856989 +4076380971 +976587134 +13875701 +3465422130 +3487365904 +1916668216 +1698106993 +3987658088 +3800886711 +3898270924 +1668152428 +759902756 +38500267 +1329352634 +3558344006 +2408528227 +2030019924 +2709356463 +2570060188 +3065632212 +3550991866 +1055133468 +794643714 +3189033613 +1850578141 +543232603 +2531536920 +1670800555 +1370833977 +638676539 +3079857437 +3018320100 +1285946567 +3947934608 +2353554768 +1982229237 +859209163 +2113494441 +3242892618 +4221819686 +1586667642 +2794174222 +513884152 +637277095 +3293821722 +1978410147 +838259627 +1512869048 +3773974563 +3352481125 +3291251994 +737890149 +176196758 +1068457053 +80991262 +2061424389 +1083796489 +89744099 +542074160 +838140952 +1153469645 +2141484804 +440571006 +2699004560 +2820453938 +3481716873 +2327426246 +3138905005 +2609579082 +242055820 +4020840466 +4213252442 +2850554962 +3600085570 +1518928758 +3207254709 +955362020 +673262224 +3856125218 +585864117 +3913901438 +2822887807 +1458447516 +3124538217 +3818085787 +75691821 +3064254412 +3920403997 +284497933 +4089163437 +3740817311 +3975924235 +3904521080 +1568642359 +1436428435 +450284343 +632718713 +4059827473 +1605963839 +1413873979 +3434305825 +1029604545 +1378973229 +2804130682 +3790086184 +187162723 +3699275437 +1174132993 +2496946271 +665243596 +2014906435 +1567607193 +742625051 +743582739 +1095928154 +1091419874 +3102256886 +2697812355 +1120296753 +1974148979 +458594771 +4178283424 +941868245 +1407577250 +1941321475 +2338590934 +656039399 +978341962 +2827396440 +2149998604 +2377384569 +3164784125 +264087350 +2223721228 +939642335 +3744516721 +35727078 +2471454139 +1739018553 +2830999054 +2235871694 +3274813394 +1026921713 +1796939476 +1255586826 +3552170981 +3910220444 +1320410735 +1031448754 +206404787 +1009030109 +3202086692 +205886940 +528608119 +3087578803 +2463014388 +3586661888 +1149327337 +746388374 +1827434927 +4126030034 +2423361820 +1783260481 +1997576377 +2361088250 +1053678058 +3920263600 +812660058 +673798856 +3977369103 +3118334417 +2113388210 +518382108 +696293087 +2743747427 +2231755225 +1165759097 +3576579812 +2404024062 +1443719985 +3771755811 +4172022504 +2720914838 +372340268 +57071857 +630763047 +263066305 +2661725600 +160510393 +2135448292 +2806920896 +2197476939 +2864801668 +1820485381 +3868261945 +1660883187 +2671077744 +76640626 +4114139631 +4090839991 +4132640287 +2094075027 +88954570 +1338850666 +1460724443 +2247248471 +3381564867 +3255792861 +67213855 +1423013997 +1643154088 +1419393906 +1998922245 +4088229638 +1652556796 +755106968 +726043871 +77223714 +482771764 +4239430633 +4088369133 +2709199325 +3143666423 +3905721157 +32176221 +1232877010 +1712278130 +1567224761 +3667973753 +1788249585 +4078855602 +3619417574 +2100065394 +4292027049 +3341835089 +3543381009 +718071118 +1133860786 +1261964024 +3500106325 +1631865991 +287494383 +1153384850 +3809546444 +1219472756 +403628951 +392584103 +1870002443 +1189131201 +2090260511 +4240508428 +1375970864 +114150700 +3652182152 +1807933623 +4051276277 +3918935575 +2699753353 +4255311595 +2148684689 +1073490883 +731815518 +3602335217 +1391461885 +95024448 +1386730845 +3729953259 +2198902703 +1222429746 +1614548884 +4059647857 +2827390599 +3941964856 +647775422 +3051443337 +2168149575 +3485180939 +1701508669 +2274864299 +1248023704 +3491075110 +66399684 +1542420577 +4146840313 +2655652529 +956468454 +3830587408 +1073273231 +2359469923 +2612790532 +3498518631 +3931858329 +2281546021 +1942462873 +3697441301 +119263991 +3056277062 +2597081962 +1216560876 +3059458710 +2875728150 +202588449 +1878179243 +144609223 +186363964 +986472083 +3112720015 +2091182147 +2744462395 +231166311 +1098189721 +1334416098 +995202488 +820184628 +1279751318 +1017032701 +3797592561 +2261001351 +3958816107 +1975879472 +2305436702 +430538321 +1824432583 +4285924527 +2078016407 +618986233 +3942601742 +4196949753 +1945317691 +1295718627 +1197287571 +3365186168 +4115090915 +298486585 +2204665687 +3902925707 +1068152916 +1285585396 +1343057571 +2535604156 +2778575334 +2001410696 +461947886 +1941369449 +497311100 +1437954055 +374506549 +387574293 +2860931374 +711180482 +2643111328 +3764995851 +4133291748 +1307820557 +4045241749 +2388138519 +4214890970 +2102707402 +4211923569 +3480494043 +545271501 +2131610456 +2408741211 +6685723 +1122693306 +3633057924 +1454970004 +1207087185 +2766988777 +1741698704 +2903602860 +748601843 +1253606279 +4002070084 +43500948 +4207002745 +2188166465 +3003347921 +2721696049 +678533320 +1012713788 +1221953238 +1716345360 +4236857414 +2536863746 +1288534412 +651179493 +2671036949 +3238794161 +3938263373 +261428601 +3679469516 +889977346 +1096313438 +572489062 +3597260124 +2044200486 +3431209092 +3667390888 +890713873 +3158573635 +2425085803 +2654782011 +1149547427 +3074719654 +2954091292 +1520558319 +2897700141 +4075107972 +3984712904 +3492998691 +3584945153 +157059909 +3105715516 +2423774549 +3354982108 +972055604 +1607290044 +689097511 +2161235519 +3716589231 +1856791025 +277241991 +3198292035 +3749976705 +3477355501 +3254059476 +2850721284 +3588883923 +1052802696 +3042389521 +2536332254 +1610194125 +572347458 +3649401588 +3022774135 +4274160765 +1233870224 +2460629663 +2356733375 +2826928701 +864298512 +2110529792 +26087410 +3189182994 +1485495356 +1738997443 +719375970 +2852493262 +145688773 +3392373290 +1874726300 +1989338225 +1449266640 +140459625 +1967964236 +2163496078 +2260922878 +3371887181 +201572796 +966683881 +4004240145 +548812281 +523786466 +3827014781 +1696020677 +4254086247 +2395606084 +1316342703 +2090465861 +1313066711 +3117386894 +2687485633 +88031661 +4063726086 +1549502250 +1119968828 +2226659139 +3070649030 +1054116806 +3021607016 +2384841054 +4203023022 +199145142 +3251797998 +384244118 +3079232538 +3685776252 +1177201119 +4010732782 +3381782161 +1930326567 +4218622504 +2439876892 +3760204526 +768752021 +302838223 +4149607289 +4026955591 +1324704856 +1501619189 +3733336615 +4230853973 +3425119375 +561678861 +3999201550 +1140135343 +840509395 +3990020652 +3068944636 +2721743222 +3735067546 +2122726720 +2928243760 +2883323044 +330081647 +2505235370 +2048745453 +1391648394 +1865562206 +3256165458 +2203104838 +2730011154 +603436132 +3007357817 +1204617648 +412608262 +3217821653 +3317917593 +2481882446 +536245606 +4284878055 +767736354 +123452334 +491702126 +1007395197 +1011069285 +720144863 +212784053 +3125021341 +3546377315 +1178868756 +2993748216 +1500036122 +503170430 +2081421147 +1555871489 +2191563541 +388863252 +1304395075 +1541193067 +2840508260 +792815884 +1588193044 +4055272331 +1322491999 +2611429860 +733915131 +3718470383 +3968769673 +924051523 +1371441456 +276785750 +2270006690 +4285741645 +4119487197 +1595815221 +2248201894 +3811649936 +386675256 +3457431902 +3505759188 +98053617 +2848960688 +361223118 +581796503 +2455526949 +1275671174 +2554246301 +1778039118 +3009875956 +546011388 +2426401521 +3404788417 +2542031964 +4086191489 +1993135567 +430143264 +1018952251 +4290481898 +313984199 +4208395857 +4119948456 +2695154929 +4147857887 +3039994113 +4134573109 +164702563 +2485202271 +551203756 +891655868 +1136271593 +4045998175 +3087388288 +1746176017 +235855641 +3668719330 +3703153824 +2727288475 +2782328201 +2906220608 +2719244702 +2313263904 +4071034138 +2278031502 +2517343902 +3749716208 +1132393289 +46512500 +3630555378 +3687497954 +3225784855 +1167165635 +1491638449 +1873415248 +1322465299 +2057483350 +995792768 +499002956 +2806798114 +3338644162 +1815073086 +1051001570 +3284951703 +3604527400 +1682996945 +1828268417 +1108274971 +1649581844 +2159872829 +1608704430 +272920022 +1823493011 +2339231821 +3932770733 +2607064663 +1005502182 +2953206407 +959257110 +697314104 +1027657085 +662176647 +3452461270 +885211232 +2343636617 +2521884733 +3350975903 +3245129675 +2304049068 +904617921 +2334338698 +815645090 +3010044679 +959239210 +386800128 +1795782428 +4259087301 +2834660243 +582635565 +279257586 +4087164756 +1111526645 +1174963640 +1997448503 +3451860510 +2435266061 +657198260 +1262812094 +1714005226 +3520345061 +1940575363 +723454963 +1586688728 +3527236454 +969122353 +2937676343 +3153547039 +2515491421 +1413470218 +4050782944 +1740902892 +3720648105 +3107287350 +2413952014 +1348084707 +554841786 +42017340 +3353776772 +1258499069 +25964327 +724224339 +3865246716 +2501648133 +603637611 +4259993309 +1719753114 +2977999173 +2039970841 +470136194 +406728064 +1675130202 +1907605957 +3163192753 +2685409749 +2318993452 +3782182086 +3522990799 +3900922325 +3668611672 +4088200491 +4140002401 +3467904978 +4106520801 +1105545219 +1341510853 +1376555431 +1125175467 +969230045 +2130255174 +1346140080 +3357957790 +303096358 +1932688356 +1306419243 +1523027946 +1771103553 +3514470461 +479236528 +1061071730 +1086566311 +934298154 +2090475332 +1555388121 +2652289869 +200114477 +2936611051 +1465082961 +1627315631 +408440779 +2447219610 +3321432911 +2262519071 +1817530191 +2987722351 +810234055 +2307022554 +1773740942 +726322100 +2559994876 +2047566407 +3810734025 +722405820 +3256805969 +2975804943 +3418664909 +2870187008 +1641292263 +1268751284 +416804544 +993294680 +1269879104 +2131537056 +2997957661 +1551127881 +158997699 +2919313286 +769851064 +2236604595 +1469834680 +3286898471 +832837303 +904283770 +1007266790 +2989682849 +1642413432 +2563335637 +3099505417 +1117930543 +4269621952 +3317512601 +1595607172 +3274362544 +3661696127 +303444582 +3271652665 +2209713100 +1651646276 +1863087740 +3189636080 +1719648054 +2303490738 +3979018844 +3470065908 +1664129538 +1296348308 +961515059 +3448517081 +3547789628 +3101969569 +890249750 +3141265253 +3580575502 +979260776 +1684249844 +3021902992 +3247292980 +367670687 +4286469710 +3203766256 +3233850820 +1016090612 +3796709534 +3008019124 +3347466231 +3000607769 +1885025608 +1642736676 +2457434153 +423559931 +2757980018 +3898963679 +2656161255 +2062234482 +264488990 +1222237842 +1116494059 +3859525863 +3571183164 +474712723 +1013519750 +2121055489 +1047596584 +2478669552 +1784465788 +1109959648 +1517512032 +3520343392 +2817021861 +797525109 +464321255 +3110074068 +3796704633 +2910914879 +2643163744 +2732897840 +1570809933 +2642813812 +326011216 +3118676015 +85603845 +190554251 +3527182501 +2269322664 +2814046902 +3896548332 +2871444946 +665223191 +1138081332 +638307386 +3891779567 +2712644368 +4219189534 +2228666807 +1822602606 +1561837711 +2745405361 +2058761244 +747638751 +2295964179 +1704707267 +1695959529 +3469840680 +3273200600 +2930532520 +1430138581 +3531777910 +3647853276 +568536218 +3219163007 +3575109584 +2601547666 +2649477903 +1753728020 +2245866882 +389620450 +3991126150 +748400701 +3745621805 +2376010063 +63168280 +741214787 +2290875388 +1142300521 +2554347721 +3212719536 +1911930527 +1086443233 +486354983 +447712436 +3555701869 +915220479 +2062159572 +954004320 +2110934952 +2133425378 +86013173 +104529263 +3629989067 +1647240814 +536394018 +1100221418 +2196524826 +1222047729 +3376405225 +1585692487 +831925213 +2829053522 +3261206808 +256711986 +1554703650 +1264382986 +1563351278 +2231358679 +2544787192 +1302519723 +922405852 +4282050713 +716008080 +1672765103 +3246898635 +3201435528 +2541100882 +4160116323 +1777620878 +2894041440 +4518657 +1402285851 +2151107070 +2761647310 +1694402346 +2929112031 +1080931708 +2551808960 +2506397826 +2302909093 +2574776940 +2909706703 +2340693617 +3177914124 +2633961455 +4251735176 +3831770441 +2664871191 +2019456794 +3865961477 +512341036 +1414406874 +2836659989 +2344230887 +3234444826 +1839754738 +3666586150 +3894922229 +3357993695 +3791693383 +3266341883 +3928108616 +3700764 +3693673014 +3980973227 +300093387 +3970606027 +646535704 +3012267583 +4270877338 +551154779 +3907690012 +2411428804 +1114928378 +145577341 +3898255853 +1417185800 +3389946788 +357145387 +1132161886 +2062981208 +3361318147 +684601572 +907128630 +1711769941 +455901926 +3432194994 +4044992782 +21412635 +142617545 +4194590139 +3205299017 +1851038347 +998285231 +2599421785 +3133289994 +922658994 +3990669040 +4282068978 +1593007793 +4222391985 +3778200911 +1949731948 +2084073038 +548342824 +1167039618 +925496933 +3808730263 +4097819490 +859582689 +91662937 +3299429702 +2719867697 +3246069991 +2602921029 +1482204624 +354753144 +2114356418 +2764357171 +2277834570 +2571892748 +3581178337 +3190772566 +3920995077 +3819607045 +2544538508 +924010400 +3226254478 +1935936408 +4170425973 +3140283321 +86089535 +1687371054 +3056675746 +15749197 +2014549893 +681909291 +2807125111 +4215087032 +1169469377 +3359218063 +3995570901 +3897994399 +3464073405 +3859530597 +611901582 +2235613054 +3110476438 +3476151626 +728973716 +3577587482 +3300079175 +1315300938 +3305289524 +2310600617 +2635168465 +413514935 +1985958980 +4242194753 +2332292220 +2509751826 +107663188 +2075238323 +2296342812 +1715299226 +4120141298 +3701854833 +1273421034 +2498522228 +1585996375 +688925138 +2403652969 +1169307327 +1513181013 +593091938 +1113159458 +2854588702 +3951009993 +709654296 +488217526 +2342091114 +4060933144 +1595462419 +432914696 +244063615 +3498043078 +3890133189 +1639352175 +3161983716 +254913281 +243537107 +1450617465 +2475089377 +1503305090 +2420770754 +3088213837 +706014818 +2378486672 +1163749934 +3457788758 +403563352 +1206664553 +3732826076 +495768048 +3407503233 +4099483874 +3003213645 +1180211643 +3305967813 +4016799797 +2977120247 +3439172445 +2916821613 +3676907444 +3137967215 +2333812713 +1167237448 +2554022150 +3272116956 +728695877 +2537048518 +604975855 +1122207590 +1959835585 +2688522408 +319020534 +1869016376 +2520364565 +1769508128 +1931617916 +283270538 +1318650814 +323305912 +2624088869 +1127673825 +3174125874 +348421557 +989616646 +983447954 +3820933087 +3366480613 +3719414801 +1351441064 +3494735545 +3394343385 +1381923814 +2731181651 +1597604914 +4127390819 +1011808644 +4225460828 +2568040766 +1103592338 +2348409222 +493877571 +3652641400 +2340227043 +31589455 +4088912185 +1994253417 +366963886 +1410667377 +1912841378 +1644259964 +2904358882 +1423364125 +3546746591 +3205652103 +3086281816 +4119070113 +389993289 +1994059320 +1565748270 +2587238064 +3890216247 +2174262617 +700526129 +950247615 +3257207135 +187715505 +2883860989 +654318417 +1916626307 +3243155560 +2898449745 +1359582709 +2379901840 +4138898665 +3258932095 +2962458514 +2333989340 +1550701911 +2515363552 +3431732258 +570975880 +659726807 +1540621235 +4085120661 +1215570553 +614250768 +2274129721 +3762297794 +300408936 +935760425 +2387420303 +1879061790 +789135785 +2620801692 +1897744224 +1233560420 +4293937827 +3863422825 +889556538 +984762230 +1660774021 +246961605 +148898692 +75353862 +2775846389 +1614467902 +4213471216 +3787966156 +1143076552 +3105741455 +492635229 +78279706 +1723054671 +848088575 +2699204194 +4253599485 +3531677433 +3202071124 +3775183363 +101829091 +1430210969 +1134097213 +2738657562 +3373788991 +4235298509 +1739441099 +570829850 +4004242795 +199838422 +3633247063 +2534034021 +327457288 +2360648012 +1497582539 +2908707531 +2870036176 +2533538087 +1926696766 +3556435611 +2114985740 +1813280634 +693182873 +4120063613 +3993201887 +2381140586 +2815208387 +1678577401 +3895343737 +3185263781 +1312724037 +332942652 +2902364420 +3832715097 +626858484 +1817609147 +2777494239 +1903337418 +1267423945 +433250846 +3460267435 +1955823685 +3282902411 +2626465831 +1012921598 +1982593511 +1354115159 +2511041366 +3459615824 +3840479084 +2045485035 +2989404475 +3018066568 +1029401771 +46869989 +593984290 +2406366651 +1649272217 +752103925 +2542804474 +2596709735 +2148401611 +1427733637 +1468817772 +297613365 +2885509003 +4040904959 +1214360889 +555730374 +3343483310 +913747674 +3990909507 +3324530962 +1433596024 +3764718372 +1712034860 +3722061696 +2637893601 +2013431086 +4004494837 +3860121610 +3558245116 +4144785402 +3452614293 +3267073121 +590449518 +3048956163 +2919891890 +1872121021 +2518880008 +3611830248 +3698156881 +3398366646 +1280650543 +3381299957 +2966448616 +1526232011 +2707575701 +2862424146 +2907808426 +1278168644 +1260948974 +2180313519 +1545574722 +3818720766 +3126864476 +4026004049 +996185053 +391695759 +4046473609 +2381283128 +576116512 +2485755640 +1166044480 +1215600698 +98861443 +1930185283 +4273156780 +1271547370 +100946444 +2086757724 +3530579631 +1380405743 +127068075 +2060776468 +2591956639 +587940579 +560653262 +3160882714 +550483061 +4102928092 +1556846375 +1358658217 +2036041551 +3971100883 +2586632962 +3260478323 +3306008699 +4105877295 +678671427 +950224419 +3337746296 +1583209339 +3389796102 +2310119293 +943158217 +3131236744 +4162744324 +3076088216 +1039317016 +316948167 +3909308352 +2065325187 +846561747 +348457288 +1123284842 +2976484843 +680123906 +2859458447 +3769530701 +1437941488 +1853370124 +3577295503 +3852460794 +2291145207 +4226327685 +854136262 +2142371490 +1929225034 +332980441 +290923663 +3655429442 +609100276 +1258593835 +2422948925 +4118541687 +3450499965 +3873167760 +1427705654 +3418113155 +2509275638 +1778117924 +2918033938 +1117112809 +1314567503 +308009613 +170536045 +235641132 +2137049359 +2910150131 +4232940091 +3259396399 +1555680191 +3768199637 +73683976 +184560404 +2359263659 +4005992297 +1776654680 +3058581805 +2452402546 +3306643395 +145818801 +3853041741 +3119501846 +4183221914 +1748563038 +1081839534 +1564747391 +2235659606 +1924049210 +2734344895 +3387681961 +666045978 +106922768 +3207463249 +3254103179 +285409590 +199243554 +3313628298 +2421103579 +3190833396 +1085791489 +81005956 +773827889 +862017238 +64986087 +1865775623 +3846451262 +785309661 +1568250176 +1108267908 +2040999636 +1951736775 +2869997108 +2765644687 +3564226535 +2943254350 +2452251238 +1182395690 +3332544078 +3797415315 +2260775512 +2639078793 +1413777825 +3457595233 +753889790 +1413716907 +4032964755 +1048006416 +1565271178 +1619905889 +2241168849 +1198315922 +2857611169 +3755916042 +1724949528 +3272286083 +3928322836 +3109571125 +1636075120 +220234164 +688860373 +1024754059 +1622086307 +2682589429 +4015981128 +2568722610 +1052016364 +2271201587 +2006949452 +825825116 +3645863497 +3885014151 +3383638413 +1686683208 +3602643385 +3070882317 +3523516553 +822475119 +2577977576 +572555322 +206451510 +1459678024 +2114829743 +2621897991 +1099796082 +2231027344 +4080996668 +3655292261 +2226120052 +1572905438 +3021595037 +3541753830 +3010747041 +1663963608 +37757510 +4165548567 +1560001869 +803949350 +1378694442 +882090931 +1265223675 +652784888 +438586555 +1244477522 +3978005172 +1831567861 +3051274390 +502267113 +1816466285 +3187021320 +1343335589 +3947618478 +625012630 +517583311 +3106085262 +688566026 +2350352268 +3390657116 +2409373147 +629961949 +8886558 +1864175451 +615464218 +3483795322 +3527085664 +1101018600 +587458808 +116874854 +4213678657 +1546179650 +3012049036 +1815559072 +153209534 +3253917904 +1729871793 +3449859029 +3283332432 +177390239 +3532860442 +2951314177 +3235876711 +3847593100 +2789649297 +2082911325 +820884183 +396302470 +744559517 +2422178488 +2551216385 +3449431310 +4131325867 +2574489521 +553481123 +1772461904 +2823202728 +4167554889 +1156807069 +1170341136 +2421438308 +3964952720 +1687575624 +2008295267 +426677890 +1120026207 +908813129 +1846362616 +54046780 +1496542346 +1676873614 +438572891 +32610173 +2173634522 +2554999083 +2086572204 +2028683752 +468044055 +3889480198 +940217064 +2633994360 +2681313147 +3333375464 +2671600567 +156620654 +1479022794 +1378710085 +353641987 +2891251523 +1681188715 +1587307283 +2958722749 +4224579283 +1575669296 +514988098 +3036082750 +483922025 +1699248949 +3526102593 +2319732014 +405771195 +2958520902 +4148130739 +1392961631 +2245645632 +3313896062 +2442997175 +1956378475 +2527447648 +2499832737 +2316880467 +748147483 +541437170 +1866613861 +3827606678 +605053352 +3298429222 +1114036903 +2292674074 +3496833384 +2462574571 +627653782 +2654972727 +1364110099 +3965046257 +4250918339 +4256837596 +935418396 +3958545796 +2068153039 +2963953871 +3439717889 +1892281026 +1635632595 +3893030508 +3041473048 +1933515266 +1062482484 +3564626916 +3352976015 +1040117730 +2956317060 +1814412183 +2585522301 +2255561323 +1162882485 +2993329249 +2793419263 +3452966919 +328919105 +1954885212 +1694105838 +3701164224 +1687992118 +3336122236 +4078687910 +4176409195 +3065954556 +828186723 +501919780 +421973824 +1268860327 +4220996283 +675541680 +2804022984 +208772670 +1691605127 +3850767053 +869928997 +4293630758 +3710750316 +3882968574 +3642314298 +26068493 +893617 +2906616610 +3670065283 +2883425811 +3000571255 +38773332 +2859042416 +537658632 +2121869306 +3097563390 +756755712 +3900568271 +3064779954 +3503963953 +3358281327 +3519130633 +1075677913 +1184013843 +2571517359 +1681568829 +2058911862 +3076957747 +3474069852 +4148568659 +1559965065 +1240166184 +779809320 +1065863614 +1970846316 +1098115873 +1413471094 +3896081771 +2151500705 +3073459242 +3467751947 +2914231044 +3841534256 +2825693292 +49233561 +2519977699 +506383578 +55825026 +1555806263 +4119637578 +828725181 +635436646 +2112556265 +3175837002 +2754754982 +1869438428 +2932744018 +1346756735 +1827639253 +507001757 +1769794090 +3939858447 +4054219182 +3657001080 +3328782693 +2544054886 +3445347546 +1641621781 +2065158940 +1715630719 +1452894287 +617900520 +3796238798 +715822626 +2047507838 +3945292150 +418379627 +2439927918 +2018222494 +1280154243 +621693280 +3914923819 +1497386188 +4056545177 +2455464504 +1420964556 +2206323700 +3944257808 +3177315735 +994517881 +2174069467 +2720870928 +2452155011 +4153079789 +3057008460 +1874437087 +119655371 +2749131273 +2989760342 +1875116545 +2203466065 +3963653812 +2000408074 +3846075801 +1251367398 +4236836710 +2942664404 +124171670 +4244213651 +2180707473 +478970770 +328894772 +1406696466 +1608319893 +3087141632 +3718533764 +3986579081 +3313413643 +1513803973 +2076734743 +2574589148 +3432203270 +636014348 +4112804385 +1787481058 +3386438495 +1056530663 +1142103510 +2678038683 +3129841795 +3313495897 +1737703875 +3679602268 +3289197418 +507059657 +4155331789 +3635502122 +1984992541 +3490155484 +3365126823 +65441661 +426284004 +3733580638 +1361765873 +421444083 +3220312512 +3784350457 +1057067792 +559063689 +4008486557 +2405781304 +678990900 +2986431613 +420864881 +2409223444 +1788399344 +3723942554 +4245681938 +2927557257 +1958120000 +3402195570 +4293053636 +62694539 +243005694 +3447142467 +1809913658 +4276675102 +2209856137 +410364493 +3453718543 +3683518859 +2158200544 +3557336824 +693909692 +4036711593 +3636463778 +2220033316 +1537596761 +2400010537 +170832633 +660123427 +1574194523 +3047269085 +498901171 +1787697892 +1577423548 +4217807669 +805914932 +1998313203 +2444847242 +182949353 +824769156 +2954614439 +2079277564 +3111380286 +1019326346 +2733836448 +2337891929 +2631052965 +1865968084 +1471495900 +1323143394 +4148638366 +3943966090 +120843286 +607873130 +4114181129 +280714105 +3447748995 +1766272800 +3562964027 +1891181102 +3338663433 +2121899031 +1016779947 +992464055 +1410069349 +419756287 +993953785 +3858708060 +656815936 +3380303416 +34482750 +2239772603 +3555159540 +1848688107 +2997178695 +889178495 +3092136693 +2766742239 +2849975745 +41376166 +3418214835 +240341045 +3879918340 +2324624837 +3797339934 +901815099 +4213036359 +480642412 +256000688 +88631464 +3219031076 +1997004392 +3744437412 +2418612464 +1070292164 +3892150067 +3232320887 +3685993244 +1664570747 +4100894641 +1399429588 +2819490061 +3250836832 +3876378415 +447208723 +1123805522 +3340314468 +3669754326 +2891964484 +86726792 +917042954 +2802424031 +263484366 +1090661056 +3353143779 +3793114504 +3062310162 +2371480706 +387157664 +1884453537 +3596204867 +783842611 +1572524019 +2712497247 +3086814070 +1329519266 +2728267527 +2588723306 +2633970606 +2771854336 +3893622916 +1861386951 +1857548845 +1735370601 +3774694229 +4105490382 +2983318246 +3846440367 +3906378346 +3790258500 +3058294979 +2743232407 +3796460459 +1329670968 +558036066 +2995904535 +552095575 +421105496 +1300801564 +3553777525 +535440885 +131675115 +2351729596 +164499297 +821269494 +1126658472 +2156851181 +4041337734 +3008454788 +2202425537 +1478253109 +2264420978 +2826518118 +4281800759 +3708656885 +168680347 +3666135065 +1384479668 +3045541073 +293827752 +18755160 +3678209655 +8309771 +1051148036 +1615972515 +336547522 +2806526384 +1827493271 +416319814 +1007195160 +2907002940 +2815472371 +2925370590 +1521501532 +2123347620 +1209347056 +2770227228 +675167439 +2889175664 +3761258556 +1835612690 +1750006146 +2852024045 +2126767964 +1644064134 +414621226 +795552231 +123467492 +2480787260 +4154724416 +2558156595 +298360706 +871252985 +2087316233 +3169957086 +3145619917 +3391144555 +687896070 +3201917690 +2626256489 +2195558808 +3798158420 +1476012165 +2032566723 +1685654889 +3276928186 +1663578120 +2856758055 +450876383 +3220782130 +1233751029 +3899142102 +1215466183 +4129351493 +3503500157 +3263374164 +2591743025 +1292467631 +2775542496 +1870164820 +2885669738 +1567895397 +101379293 +3206883432 +3976036813 +3580871903 +1801323385 +4084674170 +1679612235 +110818972 +3916914234 +4212586027 +3547809697 +518587537 +921748809 +1049164984 +734779916 +2528453700 +2958872953 +1866443159 +2428060379 +2870989769 +546049989 +202279501 +797117606 +3861784438 +1574003147 +4249171507 +3112857088 +1684423569 +514702011 +2506487 +2739432870 +1939639428 +855838814 +1682247456 +425407380 +1180811761 +1080415432 +615719060 +517857226 +780217891 +2808562224 +3103042699 +412800308 +500796276 +4276413542 +4180392422 +4187580856 +3356279381 +1983179837 +1281098873 +3043489471 +3665838883 +32306238 +371138280 +3870122287 +4066614927 +3013408381 +1306851986 +1670654669 +2530967770 +4199756930 +2829773944 +793860439 +3399523266 +1996201228 +84356378 +1549066948 +2127747971 +4287712956 +1706203580 +81422143 +510765217 +456078660 +1172884950 +3381704832 +1831482468 +3047547522 +1473063401 +3280356908 +3171699393 +3330213002 +1957317535 +3236670852 +3468471137 +1577197874 +3929414539 +34011551 +2584656913 +1945700734 +4165159799 +3661162412 +3985990894 +653159003 +525771990 +2257018628 +3451713689 +1299868865 +1463402181 +2599921354 +4224671589 +2757188129 +2997706235 +473019452 +4075197625 +2563938751 +2639426885 +717332315 +3370478779 +3714218865 +500565206 +3711159256 +664258271 +2659029349 +1454351334 +2076437311 +2497279872 +3730819681 +3993664661 +3060820203 +2326382327 +176453594 +4043576358 +2383314407 +1168302285 +3083307711 +3607198708 +2417219852 +2245090728 +3116402723 +656635797 +770654614 +2276669898 +2802712775 +4137383058 +220001583 +3949406174 +1111848996 +3137641960 +2075937483 +1378518811 +1152421154 +1755385854 +4249606422 +3424345637 +1430377541 +4095233558 +1416530531 +3526084027 +162031461 +1874683636 +2857595291 +75289490 +1643707900 +3060286631 +3456547209 +1651891731 +958792170 +423102359 +2630526644 +4052805086 +146782352 +2725329996 +3948440685 +231440866 +882693352 +1498999482 +3487821068 +1051203497 +1858388839 +534682610 +1217117129 +1069119803 +258829614 +2092649195 +589365781 +284146840 +2250651385 +2189020020 +1121627329 +1243492144 +2879479936 +1768251559 +215473831 +343604735 +3547060882 +2697256223 +1727825672 +4089570552 +2283771350 +3626147775 +3662368200 +3455346667 +3663876995 +3164667483 +47232703 +1011395074 +188067148 +1969624808 +4224399205 +2500645876 +4168686710 +1950867452 +3832275590 +2827201890 +3889026072 +933734906 +2550421838 +2588852789 +1660367448 +1656859271 +3814992389 +2217020991 +1698911829 +893701738 +702061805 +1976915030 +1173880487 +2037617372 +3490237518 +645229793 +471362879 +391180536 +45792520 +3316811287 +656218986 +2634579842 +2480763258 +1843229857 +2836416081 +55680835 +2376267458 +4031665684 +1035974830 +503421778 +3670674522 +2128584897 +2472607085 +617470049 +2954380216 +3791929953 +3863441347 +2029161048 +34912193 +3532930034 +4255933260 +1524474519 +1456846584 +290374611 +2361938417 +2325430527 +2745805690 +1286474344 +2645905688 +3605928561 +3341337954 +2266332555 +2494236833 +2886697143 +1148219251 +1882203850 +1310306441 +3865991802 +1244898557 +2652717041 +183938628 +1026191639 +3904213070 +587201362 +3739011724 +1877245079 +1937536376 +2853719407 +2852696310 +795033414 +3933274673 +3304461737 +3836605412 +2769944515 +1645991135 +3902719851 +3154746500 +50868407 +2864645906 +2720685458 +2379574863 +1285273913 +1625023461 +2062479328 +2012574854 +774022303 +2529886796 +894650366 +3320354804 +32168014 +1674947082 +3872303801 +1619461880 +2154187290 +1465585512 +666604655 +1834580780 +1717899553 +3421789599 +217017104 +3689662524 +3054850227 +3603119695 +1211868770 +2694008590 +3571833659 +265083876 +1720200024 +3677511197 +3021978365 +3701756657 +3239651473 +294260635 +2381771655 +3787537850 +2261515650 +3742967017 +1059165413 +2462367003 +2372304608 +1026688560 +1280983184 +3953377589 +2268184215 +727581986 +1228998064 +3223606296 +1741603698 +2522876532 +2644723330 +3115490289 +1587067604 +604567524 +1102455212 +1900717306 +739996971 +484344570 +2637119921 +603099145 +3220337429 +869925004 +1540236502 +2866461632 +836924076 +3250666188 +1674099374 +98258413 +940838178 +1000967596 +1249907692 +2901627194 +322114319 +2058274886 +341959458 +4064946171 +3829050426 +2064898765 +1041395861 +3040787583 +592111588 +779786817 +1372794386 +2508780575 +1073896215 +2136657615 +122080316 +2255009774 +542108537 +1766458714 +3206096321 +3760867405 +1927467239 +2024503556 +3585047915 +32523224 +817728304 +2865366057 +2256901047 +625551656 +3707838231 +3689199951 +974759093 +3692651196 +3987028986 +2050846306 +774983967 +1404403536 +468803222 +2623304241 +86827951 +2442812196 +1425769192 +2020650723 +1609851916 +3420628632 +2609503301 +2695742516 +1641336730 +3037955365 +216740153 +3569264553 +4106175801 +2187652554 +3518672046 +624819386 +3995356556 +2938407341 +2525553033 +4226780745 +1707693478 +228284394 +588555993 +2020861182 +3513527466 +110198645 +4106398315 +3194503949 +2132595662 +3291667199 +1836218137 +3213682800 +3181458143 +1656193439 +2992479764 +3785627349 +1670095967 +3613450789 +3624709072 +3672993746 +3906581763 +733449440 +723727400 +4137089377 +2819845198 +3408112981 +517736066 +2351988689 +2150029035 +525401623 +3005401556 +4232003899 +3646561526 +2685852710 +3351100607 +1813592525 +813337108 +3244938501 +1927095688 +4058339668 +953304972 +17068881 +2790795306 +372799090 +1098681292 +1285067491 +3125192702 +2167533171 +1903690867 +365346454 +1970316206 +1060937690 +809320934 +93732366 +2685363011 +2566454073 +1412322312 +3581394359 +1378610753 +1087241222 +3527071001 +2064377062 +4230016194 +2492606524 +1263759721 +260745997 +3033730374 +3910324280 +495968906 +1577110475 +2724013849 +4027755276 +1962061579 +2244037683 +1711553483 +3716316005 +3373160971 +3572014839 +3964823674 +690205633 +86386128 +1761003034 +2303191404 +2294550480 +911598721 +1872619645 +652519622 +410363304 +4192988373 +1278109672 +3778472461 +2997170389 +1460749199 +3049333147 +1074046646 +1834197 +4081822672 +3204913148 +2393314101 +3041981888 +258868050 +225930035 +2372393459 +3052715 +525367785 +542482471 +2437965097 +3970345214 +2958663722 +2436762510 +1995035605 +578952871 +2804550389 +4226216718 +649975543 +24537894 +4114579607 +1626908866 +4051116824 +3207222945 +384599419 +452828943 +2284560732 +3667613826 +2878899769 +3405841836 +3955195262 +1440538163 +1989087786 +2063832255 +2460396254 +2927514288 +16393764 +936398144 +423333643 +79152013 +401752307 +4229977588 +4280006737 +4134316593 +638012716 +1312245617 +2716784038 +1043382896 +1694973730 +2265845953 +855153160 +955499406 +2100201308 +1717925440 +1975003084 +2150753951 +1353523075 +3082042153 +1633279453 +195178627 +555743674 +1644879090 +726940015 +3222933413 +2377698329 +317752903 +3682853792 +4152278751 +2722787625 +3192128027 +3985282311 +2335593078 +94854686 +2599524617 +1400254647 +952318966 +2809472656 +1160750384 +2732187268 +1778657700 +4238360042 +2949723658 +4125400839 +37063521 +664807451 +3844480644 +561932581 +844958396 +1146386194 +4031372154 +1290711298 +2571168702 +1840655054 +3927760729 +1186009917 +4196686190 +81271580 +2161061426 +2391918038 +37917762 +1482669440 +1381280970 +2992926049 +3962758965 +3653535759 +2648243031 +326373918 +3936217602 +1119722463 +2729572690 +3629375996 +3007010419 +3712553175 +111883003 +2905310633 +1722925636 +2097689812 +1987814624 +2177666103 +1791930626 +2106913079 +1699848236 +3358926613 +1525440903 +2430426939 +841021652 +1674035698 +1449898481 +1142885914 +3519154251 +1547866820 +2700363160 +3129430618 +207589714 +2730156735 +1441420905 +2979218555 +1105541536 +666087697 +1729978133 +2045666751 +2580384774 +4253801860 +2837736922 +268327616 +1227507604 +3317224580 +546503909 +987518999 +2839280669 +2377223433 +3607116722 +772305783 +2501850747 +4251281816 +2911388138 +2647036657 +1986127638 +155983432 +3699771428 +924425435 +1187601274 +576044981 +1702770185 +2201702105 +2963647522 +4100122789 +802434560 +2870193323 +3420978964 +1093556301 +1106216297 +4085591986 +2718690645 +3839272521 +275257894 +1254402028 +4043045274 +1428760728 +2002504859 +1865282348 +3433004354 +1328336383 +2530792398 +800818908 +3980669797 +3838166675 +2164687931 +286457881 +73538778 +1854667295 +4034274716 +3428446097 +2384568205 +2016490737 +3293551587 +1461801523 +905386605 +1064162352 +3509854969 +45218853 +3646378796 +3449712563 +3813929454 +2584212306 +2580229288 +1715189468 +3757295317 +1174341066 +3482150468 +3326896816 +214817257 +1243173389 +85637275 +4031677226 +464279235 +261520021 +588916057 +2809675203 +2636199919 +562987856 +1259962955 +2941330039 +352583081 +87932080 +2637892584 +2235900762 +791509149 +3545886983 +2435282081 +2540277476 +2350533209 +3059748429 +326377422 +2064233640 +1183200901 +4059295914 +2317616406 +1940274640 +3460749403 +1878674569 +982954037 +2000309220 +968966005 +2973567671 +2627979352 +2784452792 +527654190 +3745740953 +820728947 +3335608193 +733989556 +119054399 +1815492686 +2302849814 +3716176338 +488151596 +2045170354 +2756809784 +649452408 +2909953595 +2402993912 +2872668465 +1454770155 +601269344 +1207576455 +1785965567 +1549702859 +3060791232 +1055645718 +4075880119 +1056955441 +750161179 +670275466 +3060020730 +145744292 +3228229761 +1781815560 +3325286054 +280861153 +819143563 +2978636144 +1131173915 +2012131374 +4177638586 +3048441847 +316789848 +162651937 +1725214066 +3731992520 +2926418155 +4004167967 +2951604035 +1493351926 +285403702 +280866785 +622776690 +2816941914 +281143193 +3925905273 +242068980 +1827602810 +2064119673 +656897814 +1744063361 +3049614781 +2228133080 +3317682170 +147522037 +4286865575 +1029177678 +3842179430 +2086780490 +2057515767 +107036323 +1850864007 +3499519519 +2910420444 +2079052509 +872752585 +2805527551 +1093302558 +3480710628 +2662225695 +1583073368 +1921386545 +2702922186 +3154711048 +4191950843 +1765333009 +1766949543 +2859897529 +2258730055 +279635104 +1143272010 +1116555883 +1810420665 +598207074 +4203847135 +988956558 +994090688 +2367600310 +2204384394 +3076795666 +99043818 +3753071599 +449077234 +3241176583 +2375408000 +3516640787 +1003450559 +3624826054 +1244771795 +1134517922 +1110568293 +2760366126 +3090654099 +3732964854 +4128740095 +3280161234 +1477473101 +3105004358 +1781504743 +788953215 +3144425921 +1864998750 +977346976 +3729200064 +1279548784 +123044720 +1433638639 +2288300471 +1608053724 +1643595346 +302538304 +861789927 +2137369553 +2396673979 +4221526419 +379555766 +869365264 +432837339 +3472050915 +154674025 +3736316029 +342444950 +2450291925 +1902543511 +2383219436 +2416804812 +2917900838 +2714382024 +3659113199 +1343405740 +3187244027 +4046811924 +2721082265 +1144770207 +1288663311 +192232710 +2304888796 +4084244476 +2837755379 +1893374208 +1333071200 +2380660788 +3778809788 +3537582497 +1255091012 +4275429175 +3500918094 +2054063359 +1552459504 +1971712635 +3205890703 +2180844833 +3633899284 +3958483067 +3715614844 +2627272961 +2257518108 +4050762587 +222038706 +2329197015 +1871159873 +2269576253 +2993924957 +1940487426 +929673490 +3755977767 +3832854283 +3964888921 +3635993017 +1830203206 +3995372197 +1115937869 +1343193127 +2930409282 +1308286751 +2598761849 +453652296 +2858570393 +656089164 +1408514251 +1135660103 +736805891 +4058616821 +1863222848 +2915982888 +2248972607 +2270958981 +2235421711 +2228230089 +2642196119 +536631574 +4165905783 +1887377025 +909830203 +4278625781 +3459810952 +93837558 +3943188413 +1731154030 +3329098574 +1097630575 +1235067997 +3322764381 +4050340592 +430781656 +2726890051 +4190936143 +3219458924 +1069819656 +3278601380 +1838718903 +1054442605 +3423235093 +4191758551 +1006995462 +1100237261 +2999994965 +2353994596 +3799792828 +2502805841 +1376349759 +2635945477 +3107024587 +611185048 +3414157184 +1616574323 +1502123553 +2988396031 +771463002 +2455142441 +1004361206 +1032615199 +2467712489 +3790171037 +1671882599 +2460542425 +377353591 +187950191 +3367194083 +4203127898 +2447293922 +2310055325 +1412135662 +1634801938 +452489433 +2883213635 +1513339993 +1720081424 +4136086783 +3585417991 +328317943 +2273007396 +3418723856 +2655125327 +2046316022 +332688795 +317515761 +3784116120 +2995011669 +1092785611 +4116755553 +52518225 +504600204 +2997557872 +48990032 +3245304417 +713495558 +3347756791 +1222153199 +3594124429 +3296839291 +3202470045 +950236893 +3095371843 +2356970324 +2101833962 +3844946020 +1798154573 +1096769788 +2821769685 +3245425876 +1175970595 +207671419 +964903438 +3609311060 +4267091104 +1333630893 +2333180405 +2438938185 +3612165206 +2263012188 +768178690 +2498993157 +1450286941 +2200264798 +4264641287 +502085093 +3024493827 +697196334 +1370562038 +3712052136 +3346214691 +2419457038 +1615101073 +1661051938 +1736526149 +1213709633 +4144646183 +2993293397 +2550071824 +4085620723 +3320167501 +1728423775 +950226007 +2237530382 +50134116 +2239604805 +3810334975 +3045984272 +1079020632 +1306200598 +3533335549 +1502665288 +3235965884 +1136651567 +3399380997 +4105552205 +158604928 +1971722827 +1571052166 +3153820260 +3157221919 +18379379 +1266918239 +1151089391 +1977143951 +359622084 +4021084821 +918061950 +4076104308 +2892851811 +3924414309 +533797605 +2113555911 +1671942707 +449964910 +2532073357 +4179073025 +648127981 +1487171161 +248542441 +730859485 +941003934 +3092391910 +3184414568 +275441145 +2051113017 +2744368780 +1907071140 +2109876179 +234511306 +1736264083 +3548140219 +1273899527 +4268217196 +2021378163 +2632330822 +787395630 +2620691752 +2817198825 +2434452645 +1067028860 +3360442717 +3297840056 +439305996 +4147211852 +2903235443 +1701374147 +2667466375 +859473894 +2316626841 +736453485 +1644585020 +1982976740 +558633308 +2298588424 +510141549 +3568252836 +1511201303 +2850307307 +2638949452 +3341893561 +3638796834 +1790715083 +3131118784 +3195661187 +2601941456 +2469126131 +442587067 +2223254268 +3780123891 +1906425421 +323411870 +2783739155 +1294416119 +2487954086 +2158473206 +1753180387 +3062733042 +3393624395 +3633760422 +2202284861 +514136950 +600507479 +552503063 +3201116915 +1687446503 +1166709360 +1427392789 +1249308021 +3735156557 +1109861844 +2427095059 +2138232626 +3309059649 +4216175672 +1072860659 +325302908 +3809690463 +2354530248 +4034645712 +2427644950 +3008594209 +2522568941 +2566158289 +2395090236 +4222894352 +1757146280 +2135127268 +3007549953 +4064194070 +756549389 +1730433250 +129199388 +4050328696 +3144942283 +797747296 +3936123808 +2310451478 +2013035892 +4221983546 +1938897696 +1767966426 +748129255 +2409422531 +2179923799 +2389893340 +2723763559 +2299330078 +1394028942 +1350536413 +1815170592 +2814086583 +3936854976 +1344098076 +1361028778 +2402497023 +367425949 +1395963243 +2203850229 +645987606 +867117062 +980652979 +299945665 +737221108 +1029483530 +3273043719 +3207348536 +1381668376 +878067666 +2434590097 +3062321211 +2993906210 +2829992177 +2744346612 +2155474596 +342552282 +2193060660 +2234198432 +3951108425 +526740835 +876345668 +3813179243 +470157867 +840974941 +581228776 +3145990871 +75673665 +3056828225 +1227670822 +3563934850 +4076768190 +370607915 +3345246600 +3612615697 +4103151527 +1122340424 +2580941900 +3597888950 +2688101827 +4204367988 +1328479955 +936653208 +4044330368 +1582799062 +847800392 +2901732221 +1494866940 +121790524 +1198211324 +3340662352 +82971621 +2326048025 +1910343825 +1101465652 +2623589887 +1598028989 +3108596263 +4061538657 +4148262192 +2089571320 +1878267777 +968449070 +1579011945 +2594880826 +1227429319 +1003400311 +567049260 +2340850418 +2772387579 +1244011204 +2580877435 +303969607 +746700661 +623918672 +1894515645 +2435667998 +4276379783 +943873709 +2306366821 +1111409740 +2689747756 +3637181669 +2301558307 +915058040 +2836817706 +3089466052 +2784015183 +148210839 +533542693 +1327770750 +844341923 +1847673909 +2993629076 +3575010593 +1646871484 +1393406630 +4201559672 +4281494443 +3440095830 +4075257615 +2846285570 +329397681 +3169116718 +1285563445 +3263469974 +2364035402 +3969706508 +174197931 +2352453073 +1212305052 +2786914155 +148856790 +1542273851 +4256851842 +2368517997 +4150387975 +1854556131 +1889717457 +641025297 +720525978 +879426841 +3496702501 +1474842209 +314799157 +555366782 +1473148962 +1588745970 +3638307538 +526743794 +3182690827 +2844303348 +606677160 +2747421735 +4077165140 +2397509764 +2317991948 +3884830254 +360514055 +254287459 +1176338918 +3468215394 +2988555824 +2845403510 +425993695 +1502221577 +341728381 +543810389 +2541259236 +258359233 +3934215849 +911354382 +3556473929 +3874431060 +2106386799 +2444976788 +2524049321 +1056610707 +3472401263 +4210263971 +3460738597 +2482123570 +2608149438 +3175031456 +1721782685 +2716985038 +2995828555 +2725839450 +2223594524 +3845078897 +2376855950 +1053795996 +1540781832 +3149940619 +2596616071 +1153370150 +3573985153 +1215360342 +3910545234 +2046891610 +668354220 +226991937 +3379807772 +3945977183 +3000284149 +2199830372 +3000453618 +2262863696 +3120778859 +2261540245 +3370067416 +2247424712 +1261487012 +3153664849 +729402233 +1973322576 +1146744915 +3662403529 +575923875 +3642953901 +238029916 +2973805704 +3984350269 +484499534 +4068215609 +1656561307 +3896496210 +265403194 +1432274269 +634086724 +2007303682 +3189944393 +2307626287 +1968357421 +556020988 +3688242484 +1323979567 +2166867774 +2874206063 +1066722466 +456738888 +3119227910 +884375220 +204482646 +2274864235 +2829858318 +4032855716 +4150346382 +1402273300 +1465642068 +1617270708 +2374205215 +4219360741 +745286611 +3430930443 +4122441979 +1282444598 +3212767537 +3220589904 +1735812846 +712168114 +4024275027 +1175545639 +2333907516 +2344923673 +22063183 +1378781112 +3662504125 +586152780 +3020884033 +1078368754 +1853096601 +930354344 +4263823286 +2051403186 +590686265 +3090505471 +2968663180 +3161550345 +1700058587 +3003811300 +4055894108 +547583729 +474971655 \ No newline at end of file diff --git a/RHF_64/router_mega/input_old.txt b/RHF_64/router_mega/input_old.txt new file mode 100755 index 0000000..eee2d25 --- /dev/null +++ b/RHF_64/router_mega/input_old.txt @@ -0,0 +1,10000 @@ +778811513 +1063237924 +3685135375 +4094692148 +738302150 +1708982478 +776078598 +681695007 +3371734728 +964116898 +24841534 +2541479794 +301514700 +556914513 +3688838751 +1057352269 +1558330715 +3087432192 +3027886038 +2585682343 +1537439719 +2853228254 +2077676637 +1346244092 +342880177 +2357129890 +3244027396 +2062771998 +3615838673 +2102161970 +3315026194 +3250334772 +4214040227 +3912203814 +4276800463 +925122657 +3588628974 +2387094105 +3137002209 +542909226 +180217230 +4221952878 +3466088066 +2495602076 +3831440895 +2668103963 +682340288 +1547091897 +192632519 +1255724976 +3361516963 +2387906820 +697598441 +122083473 +2841744000 +3941997463 +1014524645 +3072299353 +3440793128 +712913258 +3830556860 +891389339 +309715734 +100968533 +3393197076 +870123673 +3786778704 +1824262562 +868165922 +910573621 +2689084153 +1354284708 +1493878062 +32548274 +1185232325 +919077567 +422683006 +369242120 +4026828026 +239778016 +1789045434 +1130971854 +4215301270 +1266627442 +688081274 +2267737841 +120935679 +1270335868 +3544459091 +1701053597 +730202924 +18038067 +1877056753 +1892172318 +3537318847 +360177770 +1045295465 +1821934158 +2301026881 +2552393277 +930790783 +2041609025 +1150402656 +2484856340 +1204112845 +4063113763 +2442718541 +2724783230 +2185906739 +1791103043 +1995116521 +3141166147 +2000500087 +230051770 +3005983766 +1585582 +1593384806 +301718160 +4146286786 +3015946570 +209185739 +2401515731 +2289112551 +2873583264 +1623402501 +4227888539 +803203689 +385518795 +1954175922 +1814180704 +3147514146 +124873210 +4262326043 +4170534338 +1624342186 +2272343046 +3257113525 +3570620451 +481243255 +104261775 +1076929803 +3503679013 +19587503 +2064758204 +2763535046 +2813389998 +1716226809 +884059282 +2836896248 +2791323761 +3510181597 +363275417 +1344567441 +3337143513 +2425163555 +578556237 +2686947647 +197809951 +2137518203 +3168083452 +3414918912 +2996039931 +1670942023 +2242871316 +1810382283 +598127230 +1996543753 +4213496887 +3106656999 +3700540845 +1405932927 +3377327048 +1292115009 +2792396852 +1672273361 +2938323297 +3258320856 +1269674575 +2369332346 +423228144 +3765449180 +619792269 +2553898755 +2524267855 +2383177549 +3070283759 +1374333345 +2161452502 +1524939201 +2042251106 +4145798847 +963977339 +2156108251 +2576866911 +3296137191 +93221342 +3074735520 +1040698855 +256826547 +1731030274 +2022760082 +683379771 +3842977484 +1251865141 +1524655029 +3568984389 +4078958757 +3004538966 +2957707453 +3054460281 +2244717010 +32047771 +4018829294 +3443240386 +2279648438 +164786819 +2964610919 +1937767774 +619333454 +2859815388 +959230412 +1998489083 +1675267566 +1002763601 +2177182112 +1155306276 +600526106 +2391027078 +1157573051 +3771268201 +1760348344 +635235190 +349645816 +3031529691 +3159454237 +1141993085 +1642567973 +961824789 +1274176708 +3878828273 +4256283075 +3229229250 +1598915771 +3427299457 +657015335 +2983607232 +1590090265 +4211133504 +1707455017 +3096744580 +2880536434 +134264932 +2881990586 +3622309328 +2504536436 +1014358437 +1666429482 +632327569 +1504944942 +3817571902 +2934108500 +2371803987 +2810572883 +2930050889 +3335946013 +1924993106 +2896756703 +3934282541 +1653366529 +1909472852 +3056707061 +1216217881 +743365674 +3007709281 +2390457306 +2843897752 +4036408238 +1599686282 +3740852171 +126140730 +2006098449 +11729886 +2401626114 +82609913 +23383632 +1499742265 +2635376812 +430154059 +420428413 +1662355072 +2671360785 +3696009889 +1525067710 +643816705 +86336115 +2021568045 +1324295439 +1444451475 +181535900 +1234588294 +2654449851 +1375923253 +2092295209 +3365472778 +4020161127 +1441142598 +1685174156 +2920580644 +574144978 +2534913071 +4229161126 +2680406960 +670748237 +2795288017 +870353681 +760693127 +1073271141 +3351010044 +3007588268 +3262594031 +2884703015 +4072444359 +2420317867 +3689955548 +1467022419 +582014527 +3315306221 +3729115658 +143730671 +2825803357 +738315915 +1058274789 +2179751961 +1989006167 +2833210456 +2024298278 +4224782315 +6773064 +3918241994 +1678728942 +4167275815 +3017095254 +1752072126 +3527904919 +3888009173 +4200082843 +2675003215 +3629377676 +1687331437 +2347411119 +2111916503 +73507813 +340018646 +755661608 +4289530080 +2020813813 +3388031012 +3685045159 +11011475 +1170135569 +2302318178 +4026158878 +1022734833 +969079369 +1810729043 +946066116 +2201819007 +2240504015 +3800402167 +1537031059 +2807367013 +1876603392 +3756133793 +226153656 +2483486703 +2979947547 +1973813960 +1792340693 +4267999819 +306673659 +2916594205 +1090397113 +3380554972 +958115313 +68523283 +551222100 +567812117 +2149047017 +221923873 +1769081419 +700782776 +1103224199 +1543768192 +3629949919 +3789728135 +1197843908 +3427455912 +3575918648 +782831265 +205252792 +2226236639 +2391382458 +836352060 +3280259725 +81579478 +3951670184 +3050403929 +2369607578 +374345845 +2011448608 +2498455407 +1996134649 +2736511863 +1544119586 +41564901 +2948426426 +2450519609 +1802897585 +3466493203 +707797537 +2457492590 +584833594 +3069736931 +1612949799 +2161754281 +2300787951 +3170510216 +4133606507 +2888910753 +648235639 +2679269429 +289973491 +3622724707 +2816859572 +2165438566 +2782521230 +971896230 +1306563968 +2399336415 +2256020907 +2472932898 +2183480251 +3552466575 +3668477327 +1143121586 +2031528394 +1433955404 +1087110368 +560494488 +889565425 +3581589292 +3746104938 +3992451066 +4131703377 +284614152 +2753059618 +1808491798 +3026975411 +1024725646 +1438055547 +355062003 +2019083275 +1058617444 +2916240756 +726937652 +65389804 +2525404621 +4147362910 +1414975217 +3653577139 +305685881 +1281231655 +3981756106 +351657690 +4133925010 +1540326267 +1296682247 +1047532107 +2493424202 +4187550423 +627614373 +543232494 +1105528938 +1216726660 +3331003467 +608692398 +1546330078 +1436687679 +1933926741 +2450297232 +2223524580 +531655060 +2695158487 +3108006631 +723069206 +2610455401 +890629264 +3745225969 +4010966074 +2344964623 +1763243330 +2568109355 +2322558121 +3986983777 +3104280171 +3999660989 +3548979993 +3113165660 +346568856 +1015686825 +2328532572 +2031820560 +864706438 +532129347 +3088687602 +510314921 +3948728163 +506049452 +2961270106 +3453931268 +1940191707 +1527926240 +3397220158 +2383992219 +2077878324 +2660344132 +3751034531 +1570907325 +2013939312 +2698759280 +230294330 +1863049049 +192192415 +2885485784 +681354027 +647214709 +1563191236 +2228251913 +1648300813 +1393235514 +2223492809 +3699307415 +2907644556 +277329445 +2790563727 +162869772 +2686210925 +1869131197 +3470449651 +1927414161 +3497875176 +2288010610 +1815616598 +3706389119 +4014780503 +242612919 +510683292 +4191858551 +3963296248 +1265227870 +2208450911 +384590148 +2446567534 +3503445391 +1163998526 +619219105 +3384228418 +4288235276 +2887839453 +910652810 +350430772 +2006753656 +2028156921 +4245135334 +3338193267 +2576232252 +3023285489 +183626243 +745702531 +447331047 +2498542693 +700740092 +512428417 +3074974333 +2198928927 +2233388922 +1485323738 +1879848043 +539023381 +415227053 +1974138452 +3451788049 +370919743 +1610339435 +1074700976 +617043533 +1431605783 +2240867090 +2316923929 +1397325598 +694554429 +3376690286 +2538507913 +3908010725 +2480414065 +1332234689 +1188252366 +3155921484 +2185210809 +2549410973 +199958116 +1219210638 +2881150671 +3054008503 +2122111538 +3511205995 +4099015256 +4054786773 +3619422785 +2803527382 +4218221783 +1553080280 +3527481981 +3132529363 +3445084157 +150803614 +3867797883 +3158888046 +1138912882 +2565784244 +2274327483 +1875454524 +2391516075 +1878120720 +3573510224 +1194188475 +3467866870 +2361049644 +4267858805 +983187173 +406803811 +2492102906 +3037399513 +3052091214 +2385839143 +1991659102 +1022043902 +576163274 +3353405946 +2701434698 +3439613567 +1606792364 +2649347904 +1844529818 +1376597253 +2496587295 +3397211131 +1403282301 +3180249553 +841744593 +4150573941 +2291441011 +2962825922 +1691798755 +958691591 +3444834198 +3855597097 +796274374 +2131724222 +273985945 +604018992 +139431150 +2007941777 +132526955 +572524896 +3642002613 +2841292446 +2270222699 +1700107010 +3033025137 +3395448850 +2338015304 +3800673249 +3296899170 +3389796198 +2705935636 +3941948125 +2824563903 +1041746506 +2764737690 +629141203 +3827534448 +2496733690 +3771048792 +257259403 +1813264289 +2275915180 +340629151 +2339356455 +4226674305 +1747309313 +414977315 +1318122749 +809220958 +3661247488 +2297755550 +2829807063 +3849006616 +3532921134 +520302185 +4001439606 +879836358 +3255461740 +296852079 +2394869172 +2808132424 +3365797897 +3018589274 +3751495381 +854930494 +1063681300 +2770235442 +1202470662 +2760577726 +3867768820 +932185951 +3392823612 +3216536790 +2981922952 +4226608942 +2934318280 +666274893 +3222712841 +1614369461 +2621772923 +3569815847 +419205255 +3855260115 +3338647910 +990950484 +161514121 +1445856577 +744241940 +3399122899 +1612973984 +3223353285 +1110560041 +3947710130 +1709676154 +1521101811 +981856788 +3292491788 +1724414982 +2841423095 +2768566625 +1868586477 +412283004 +2672471809 +854005554 +2372342975 +3114830882 +3647618780 +405621806 +2952356295 +951172191 +1693550456 +2729249486 +1370615184 +3695068035 +1429206996 +3485455464 +2216333379 +2091665446 +1578877703 +2020468572 +3507063398 +3544093078 +1070057120 +3057098986 +1084984567 +3491795254 +2010344777 +600326297 +1820110080 +155569993 +3162266615 +4121221077 +137394337 +2886101556 +3610340617 +3526658786 +1900013772 +1681922230 +1761400503 +846559695 +2884100689 +103590516 +2797483721 +1919482316 +1489379609 +3624821625 +2410565015 +3801266944 +4179230254 +3791578769 +2943855026 +2949745983 +2111163097 +2563689530 +2818974594 +1888759349 +1620482232 +1172190041 +624172372 +3151871902 +512806332 +2572714684 +2194045185 +555979778 +1305895878 +2062360696 +3171652120 +3175444147 +3010728610 +3601528967 +298322987 +2533906327 +572376593 +1940835291 +4217433080 +219022893 +2540360366 +4229203981 +1409090471 +1456676784 +2249288963 +3063628987 +3945468532 +3657455174 +2060004989 +2256245176 +2914185363 +3301584331 +2216223905 +3476358587 +1031420155 +267418024 +3732624299 +2416406002 +3962018319 +3788881180 +2082945394 +2737812934 +1561465813 +3584860367 +4043238120 +1978104890 +1470211338 +1448218089 +2297756385 +222870515 +2639648518 +1703406592 +2073037564 +594667303 +4287769442 +891588757 +3430863258 +1313749268 +2688535526 +1270903865 +3926353657 +559589907 +305861846 +221132382 +4233458869 +3603006477 +1764198503 +1110497532 +3600196245 +989374976 +3117932566 +274084344 +4152316239 +3068372426 +1188645879 +2709182773 +1778763483 +2572048654 +3578256769 +494918715 +1735044960 +2732063306 +206839077 +1980605336 +772904786 +2030425664 +3359182816 +2399223650 +3284739359 +3190063897 +3328834493 +572840543 +3592797520 +2823929486 +1381023599 +2410071285 +205209676 +1900334632 +3525296981 +2476558880 +2461276927 +2767124784 +1303557591 +1338332168 +954693741 +2520019259 +2141903239 +388769453 +2479620301 +4215832411 +961791517 +3730769197 +916858728 +2429577885 +2860676729 +622542404 +1048633215 +3911683274 +1731586924 +3877739898 +523703347 +3659465004 +3481930364 +2671000029 +3110634016 +2539145405 +2048326813 +2203811558 +376741547 +1726267754 +377057678 +2170317930 +1407906002 +1427085152 +684832823 +287147675 +3465453952 +3502135169 +3141733444 +3821566519 +2808140822 +1043826826 +3308512117 +748880208 +2154067931 +1331778236 +1416054923 +1483567973 +3744337007 +2924861474 +4060106740 +2180859127 +1015350366 +2365152769 +3072055231 +502151159 +2354480356 +3408220401 +2421596078 +2903569442 +3781462862 +225807864 +453352935 +1780740007 +196351086 +3574078103 +2727276400 +2811181071 +3758279354 +3057754178 +1431431741 +249842208 +133650047 +1830095298 +2919137286 +2086863249 +1094784438 +1867701270 +2214059545 +72383588 +3677472615 +3976225192 +243507670 +1801965784 +3021488371 +3616342325 +2082680587 +3426477864 +1569242205 +920984506 +3708202614 +276646862 +3172817765 +122882490 +53433808 +1373824730 +2577965487 +2945445854 +3508159640 +2321321106 +1556506744 +3056881906 +3561258991 +2795111127 +2353881462 +1615765259 +381629487 +3844467169 +2429227880 +3787380300 +3333677126 +1460446346 +1370231931 +366782699 +3631190007 +3038848903 +2293508970 +2951631458 +3985410053 +426502099 +3990398870 +1506336571 +2160390817 +3813838055 +3642202369 +3276525856 +143972327 +3730341912 +2414272691 +1480316249 +4246258246 +185718600 +3753810076 +4213405490 +608195011 +2125431726 +1912725976 +3101512367 +204337747 +1246877984 +823001596 +1335457742 +884532131 +1875830461 +959062794 +3790967107 +1726687393 +3247188586 +1388347946 +491153925 +515723688 +592890272 +2765285025 +479985818 +3005618678 +3781344133 +2103464528 +3956614645 +2279720050 +2326107064 +279820843 +3269989243 +4078941939 +3378881313 +1093378729 +53576666 +2611338969 +774057771 +2096786781 +1117847958 +1311749970 +3207620796 +776180534 +1905150276 +3667834481 +2643068852 +551221159 +3268829671 +1875773110 +1582970252 +4024581210 +2809901705 +855324854 +363213217 +2090744016 +270537780 +100275919 +2652563406 +3815184701 +2706427688 +1978149537 +457036652 +1154561904 +1437809806 +3156833241 +227115851 +3254685499 +2683686231 +2365276760 +4104858930 +2887522465 +3242225314 +3772243877 +3423145623 +314914184 +4133021167 +1206039608 +3841777476 +3712756265 +1681754749 +2429633805 +3829925204 +1963688389 +2219327996 +2186620173 +1604242449 +597348420 +2892369266 +2890100616 +1939199126 +2370896505 +1143852599 +1987282544 +661600347 +3772781023 +4188872507 +2803346586 +4230179551 +515885799 +1768432791 +2829563133 +1233262434 +3624819848 +3244021897 +3984786420 +1573942958 +539896483 +71615499 +3012598306 +3694697599 +2089604667 +1460603390 +868564416 +3440558005 +3773543263 +217372474 +2582866198 +433516556 +562061660 +3975414344 +2500136917 +988124743 +164941843 +805584351 +2005838247 +3479625772 +2389454457 +3936709520 +3478116389 +3406437909 +3368754613 +222930557 +1551906670 +3335941549 +1902094223 +3786455292 +1737106492 +3190639082 +3696667049 +2345980722 +3875543188 +965574844 +2759616268 +1783802242 +2754948705 +2265223909 +2971124385 +1184481461 +190005186 +1320608656 +1998190226 +2608399986 +2701864409 +946040083 +2017386745 +3240520514 +648562207 +1020621283 +3040956648 +1158822216 +1542338554 +2228922387 +986387683 +2546616515 +1310197048 +1411891182 +2245373629 +2529841618 +3836998476 +1658060776 +3266231642 +708423423 +2969152989 +1377439373 +3639587212 +1709865561 +3006092337 +1604109441 +103724329 +2763736200 +1435945146 +1999211774 +2627927691 +2659343649 +1040588929 +3329127176 +1935917500 +2386222378 +4039708592 +683881218 +3533551341 +1154740507 +187589798 +876350236 +466210116 +145199074 +2324250370 +1756399988 +1569658253 +3162331237 +1386831495 +3206987642 +1718183576 +2390292180 +3634847260 +2828622129 +1103547007 +2336519566 +2146873702 +4130200851 +2062322324 +4293802201 +2664945351 +2472554067 +1199873990 +2467004858 +2811235483 +3554691316 +4088839366 +335856067 +4208997331 +287362468 +2253755913 +279637036 +3738679120 +4178497930 +370985761 +1620269758 +942238710 +1450947312 +3545549931 +3986533624 +2016474366 +3122239119 +524191516 +9002602 +3686217844 +443843460 +1221631358 +4292900957 +3881717333 +3868320366 +1298359435 +2016092359 +2716474860 +2955416645 +3036814695 +1287793323 +2478700576 +1942716384 +1043485235 +4290980762 +241835435 +1138037975 +1783083675 +2819404252 +3049200562 +987940466 +4290379338 +3566641376 +3596366743 +1691043774 +1574928679 +1241045866 +258203182 +525670711 +1733757981 +1946104481 +702791414 +964985353 +2790709632 +1365343755 +284756906 +3200174484 +1896307750 +894843547 +1383248660 +271317162 +1913891208 +1068542233 +1331868263 +1243290473 +3307448564 +4244641898 +1966079218 +1507554021 +174850129 +2822872155 +50482525 +2280740401 +31759324 +3402838475 +2776898886 +981066811 +1001309863 +4226605442 +3866444648 +1702267992 +1495239609 +3733925706 +827519437 +2237244860 +3781251739 +1844506449 +3909476694 +3284065372 +1341851916 +4075085866 +720858485 +3255315153 +1807284125 +2348033122 +222327499 +3597605731 +771234247 +3686445802 +446237896 +3749448365 +3618355783 +2944473295 +1805350788 +3497865368 +2886446646 +1601675715 +49723276 +1606848440 +2396345192 +1750552231 +2891812432 +3163267331 +1307591001 +252682830 +444145401 +3536811651 +3427012290 +3537164770 +389953580 +3673368955 +2024076663 +3754701362 +3649205416 +1167908420 +1467102813 +1381660205 +3071617106 +3937978790 +2599467044 +2914935995 +3931381065 +1656477972 +2756278064 +3504386564 +4089717941 +2325843187 +3700343931 +45784896 +3617344896 +3877575341 +702021475 +887460739 +1313248149 +3014046749 +3004599481 +890880173 +345302975 +2671435022 +1448811742 +995958250 +23233856 +3165011153 +1777259669 +3957577372 +473588333 +3545677811 +1368304500 +2162342347 +401228293 +1402456615 +3007681504 +1174159706 +1338080363 +1096559404 +53431832 +3874211069 +364470294 +2969614896 +3554467399 +1655955500 +275326227 +4279781070 +1476858683 +3254696613 +1140428275 +1435479616 +166335556 +2622679062 +802094909 +1226819114 +4222716075 +2736404757 +246801058 +1888992915 +2376109303 +578778270 +3348697287 +305912057 +1870396388 +1100188582 +444162667 +4179461176 +582675837 +1489481350 +3681560580 +219640879 +1260276003 +1609176812 +2457968635 +3681700742 +1108708763 +2062343522 +2332468689 +2013973328 +2440267245 +1880042125 +2479144458 +3851060896 +4202201329 +2804051959 +3097160476 +1493260751 +844932776 +1328827490 +3062465959 +1034664499 +526914341 +1975260406 +558977446 +1081168291 +653726756 +744886885 +2706768682 +3995355546 +1615610309 +859714395 +1050226271 +462519671 +3153669617 +1599641338 +296982529 +2785489362 +3952593461 +4187899589 +2390980325 +746501720 +3891526435 +618113810 +3663715591 +4146466405 +844933655 +236954220 +3530692069 +2009332414 +3028569467 +726989284 +1618804725 +1469974902 +4247147233 +3486835849 +823406253 +89655308 +605184997 +2016919074 +1076532984 +3120162974 +2805094505 +3058997108 +4073471404 +1002559333 +68670525 +2411294403 +2446056988 +3208512060 +3169605631 +1246780580 +309560915 +1357956638 +1568319318 +2111107704 +3641984454 +2920352574 +3611185399 +1460324282 +3589204372 +1312834059 +2042809951 +424617434 +4003096491 +875447613 +2176953375 +3216384845 +713833830 +128366005 +473214943 +4287469375 +303301402 +1207768122 +1544796248 +2568392976 +609894704 +2097765646 +500338280 +1011116093 +923371999 +3564994512 +2302347346 +3654078486 +594204172 +1411819550 +2237974516 +2040283025 +1614821896 +3678486867 +2903306524 +1039104095 +3059680981 +650879304 +2941173928 +3790080720 +3742536194 +1834142188 +2427036758 +2220214543 +2321379205 +147020004 +2880208688 +2956307561 +2854753046 +2374969057 +4131528681 +2053847711 +1267236020 +3979052556 +2294384328 +3707192197 +403356914 +1526103939 +1480890261 +3654301200 +161063190 +2591365535 +3499691771 +1032422393 +1791015440 +1540140882 +1456601438 +1718298025 +3966000187 +47096785 +3246169377 +3945301419 +3603330203 +1904733512 +2922604824 +2707857194 +2449599371 +1550427606 +2752566317 +1022073250 +2876390225 +2446183464 +3971958864 +2283656337 +2668257879 +3153190275 +1027990220 +388404622 +3383994013 +140865061 +3046947016 +3050359425 +1621937696 +2050320315 +1278917208 +4260548424 +1959450215 +3379585733 +840349688 +2161584341 +2846862040 +3169977041 +4284652845 +235263861 +3966265912 +2651415946 +1270956370 +4236812429 +1810719399 +1006305617 +3207897174 +3169224617 +3063878239 +1189515107 +2936265649 +3670266418 +3262502959 +1734117983 +3842389524 +3377967075 +3830586663 +2574927399 +4005320525 +4095565242 +1731308565 +1832857748 +1725932342 +2868637101 +3396725430 +2039366520 +3949716122 +3406698571 +545447507 +3707182165 +475758429 +948031129 +1960822995 +1986825278 +2191142566 +757136206 +521210428 +2341152158 +2125266076 +3086180432 +2912503620 +2408579864 +705641314 +4210448724 +3004785421 +1676677820 +3298009135 +4103511991 +3372997368 +1037337903 +741665724 +1081282844 +2753260321 +3311516655 +2743140387 +3870201205 +781429605 +34551850 +1313394142 +4188942942 +592029569 +3934559585 +3412826062 +1565866088 +2788594585 +3861864443 +948671901 +888821971 +3858185888 +3419051160 +4200344241 +1673791162 +520202599 +89184195 +2565960821 +3100415134 +3042959777 +451176194 +267971558 +2857071992 +1292628033 +1831645679 +4006337195 +483394981 +344799064 +2514786318 +4069521437 +72707309 +1247438754 +1642727646 +1771252348 +2076594854 +937276002 +1562442364 +2231285456 +3583538319 +316602599 +864267328 +3443019746 +1438143924 +1658871137 +909189605 +1408523034 +2269118058 +2829847284 +1291254668 +2307773284 +875903277 +892462635 +3980283864 +2604251259 +2046759221 +1191842891 +2404304305 +2687925062 +2353278085 +3666460920 +527197832 +1395867018 +1101383026 +969178579 +3481879696 +2458334152 +1360443017 +275955178 +4006349292 +2272068689 +1097703873 +1242044275 +2186789847 +803988605 +2475616877 +2931144012 +3172762609 +3584126299 +4094757986 +3225667484 +3615066192 +2355951703 +1030993332 +1973398994 +3918266638 +1450907483 +1506499030 +3726397253 +2214186027 +1764079917 +2875558261 +4033557720 +2849089949 +1107905933 +786527819 +160089831 +578036469 +3826089804 +1806995083 +3068746321 +1316776561 +1580303750 +2346643145 +3148370371 +1811036366 +2113025622 +2585737219 +2346380700 +441364662 +496832132 +3197805516 +2332623409 +3704851418 +1301045766 +4098495421 +1423227316 +3368295243 +3550023993 +1820102656 +4162882225 +3226392410 +2590579479 +2856639332 +3733132827 +4035546381 +3242347560 +3714311877 +4181227575 +191566137 +868051402 +1953218376 +3112220559 +272091119 +307558045 +2274260927 +3886184361 +3506822230 +3560578354 +1745431567 +3036361947 +3263659024 +2561958138 +1373979315 +419451214 +1966513205 +1950309709 +4004630215 +2502850551 +50332894 +3744363271 +3270331002 +1909788651 +2298512630 +4138759596 +1405504574 +1622332567 +3160699401 +1264799611 +1199923336 +2485596312 +2587114688 +4116905342 +1363350667 +452791472 +3507531479 +1161276589 +425459941 +2701754973 +3887732691 +2989720413 +535182909 +3190986415 +3892600076 +3728573138 +3874392303 +1804818703 +1380064754 +2630753079 +305197562 +2976538301 +1463159063 +3947703083 +1210343433 +2329624060 +248879169 +2738955977 +1643606618 +1450166572 +2841410274 +3085165001 +1093728027 +2094864623 +1010410624 +2012609397 +3564480875 +1730977937 +3856612948 +1252809417 +1087699862 +2589222858 +2003804608 +1014791141 +2590039774 +3006620510 +3635828860 +3014512046 +857528380 +3289573786 +2998894695 +2105881353 +248543458 +4130222167 +1069047682 +494204099 +1266192304 +1639634815 +613081384 +3399483049 +3507004009 +2884928435 +1973449501 +3324102210 +1662696447 +1009687318 +1822876173 +681627 +2211598846 +3924266000 +2128121253 +3675395879 +1762869492 +2373187384 +2991456777 +2898189041 +4015061365 +541844495 +3650212568 +1166065726 +1223027427 +757808419 +316885862 +118448594 +2578431574 +2605336946 +2692585251 +1069937984 +2893681182 +55899522 +842227075 +2491338887 +3718298326 +3912246679 +4082287674 +2145599198 +1948584060 +3816822785 +3560394185 +2660719257 +151429112 +1553055436 +3572158706 +1856686434 +492573259 +4115666409 +2283558525 +4065030629 +521919243 +525781399 +932029644 +64926338 +342110371 +3870094031 +2896651483 +1220614363 +2220057381 +2720211920 +3952604616 +2987707172 +3815736324 +2341996241 +1741167778 +692112630 +1773962257 +4151214724 +2089050352 +441249049 +4277094769 +2596328076 +4007864336 +2249488718 +721059004 +1433625585 +1928815360 +2141568176 +4155164844 +2765711731 +2764939420 +1608239911 +54198067 +3821317399 +3583298005 +1799748186 +3542351415 +1597305209 +173937408 +3987470252 +3157301676 +2785669017 +1077146827 +1741986836 +2699319696 +1684997344 +1420528368 +3857273274 +680631761 +3664170241 +1081978728 +95848940 +4159378333 +1846366656 +3684644216 +2916471035 +1863594157 +1705009111 +1302543317 +1222447947 +1230589967 +2544670596 +2553871258 +3358451777 +1899172158 +2598788225 +3085481584 +2450622847 +2298853226 +2880469259 +1261814099 +461832425 +1475905473 +1986163123 +2544136074 +3314099210 +2847247451 +3341938740 +2062397282 +2131176255 +1249469415 +1783205294 +3641090191 +882715020 +1420390892 +810641627 +2511253556 +1235867264 +2556991360 +3329876123 +4200271419 +2146472011 +2803890062 +1993782637 +1506602407 +287184466 +2257302319 +479813069 +3488451688 +141746695 +3292410142 +2118820296 +3135275320 +2565695542 +326282699 +2017454189 +3994076959 +2853847578 +2340099350 +3624408566 +2963504674 +1342814842 +100534661 +364985624 +3149318050 +4277860397 +3104385548 +945077053 +2971224444 +1270768207 +3951941458 +2853066178 +2383680851 +2853762361 +2629703130 +3411970079 +2649049065 +4097482853 +1829255860 +3866519007 +4210347225 +4174827596 +2233294901 +1222757534 +3453322046 +289122064 +172576852 +36594091 +4109917761 +1295052900 +3072291647 +1449493328 +154011128 +3298387892 +3274556598 +3320824802 +10737369 +3415461801 +2039494887 +2237079554 +1932871910 +3040408012 +2858714003 +1506673542 +109200606 +3638690992 +1359908132 +3052399868 +985961152 +2231586576 +2971100703 +3278687756 +1852872374 +153090975 +2300974661 +3806658882 +2009452807 +1452816366 +2592534223 +4282304853 +3056911368 +2069358482 +346571663 +524688985 +3699247183 +1252373335 +1431475388 +3420591758 +3340951257 +1665972785 +3591950725 +1968923694 +3797286561 +3845110989 +1111034497 +1082580120 +657400774 +1180240401 +4253263650 +819596598 +208942214 +1207483538 +118921550 +3796447180 +203552072 +2804237380 +2795674871 +2246586174 +305447625 +1170912332 +3897605636 +3037067529 +3193288730 +1684363568 +1559242041 +4153591442 +2500661331 +3409099271 +3251538921 +2604140617 +104305663 +2865538040 +703626179 +680884900 +3416765395 +1548601006 +277333709 +1018560630 +681466004 +3161103875 +2849623614 +427451283 +327994402 +3681564665 +790374616 +648002061 +2292046077 +2676161034 +3258173586 +3290338785 +799145151 +1188158511 +3037103758 +3877559298 +3664076581 +1907180383 +2765098727 +452653304 +1734734020 +33358819 +3037315631 +3700215667 +1679491511 +1564575743 +3881108504 +4287732308 +676255484 +82309000 +2949313316 +2161759799 +1943882663 +3446726007 +1568604542 +2772010068 +2753445706 +2445205758 +1758714839 +1927958515 +2437389236 +333242671 +4195176758 +3003672155 +2500506563 +1929193880 +3268308806 +2559199071 +2573040258 +433214791 +1033368540 +3243928949 +67555307 +1850990275 +385381264 +3594488345 +727437580 +1506768616 +2037101019 +4046754456 +3900185315 +1718815054 +2737924656 +3861548422 +1320045067 +485871260 +2067236316 +550346878 +669210104 +1370731304 +1233071993 +1075159790 +2751328505 +442730808 +1418466029 +284990818 +1700751072 +262302870 +1977185296 +4060018736 +4198606146 +295869732 +2157974675 +1665278659 +1277867899 +3690011785 +65329723 +3108820879 +905624128 +3034577811 +2310720076 +315985637 +1236230939 +967334082 +3315545921 +4084333530 +4020869882 +3402264068 +1830787321 +1315213838 +1140054279 +48195888 +797236325 +3749660757 +3528937278 +1742717301 +1536145267 +3435164017 +3938473369 +1302966766 +3920031835 +3500814523 +1400714039 +171714496 +82058641 +4108819020 +1715819143 +3798922915 +3482843783 +1924460613 +2561814944 +810802980 +1263955903 +661937397 +3574893796 +1359530952 +2848739373 +460310082 +3706194873 +710717533 +3328895650 +1506141162 +1979873207 +2060242378 +462133289 +1777833110 +1277103609 +3589565174 +1756109906 +3256104886 +3434714280 +3301985511 +1858665990 +3301640308 +774161168 +904252622 +2410446061 +1550935706 +1359694489 +3831971256 +278336206 +1285685805 +2739601311 +3735425201 +3100909096 +3483484684 +2452868847 +102461272 +3808318974 +109959724 +2038422516 +1179084288 +1735081703 +2659437846 +2390698394 +2132053996 +4224459905 +3239945681 +3959892374 +2953509719 +2675864630 +2975595431 +1264991952 +3251607805 +800472573 +3297482074 +2998851090 +2762465280 +4167876078 +1757159994 +3985758123 +1217117112 +722544836 +1017859254 +4133529935 +2542092420 +901465735 +197768578 +1557816262 +3854176169 +1097012631 +2521840571 +2350634398 +2431832251 +4293865816 +294749209 +2786760549 +2727362545 +615905568 +1221182844 +1475012471 +855811087 +4207377477 +3792290137 +2982240316 +2336164100 +48161586 +4248782395 +2821938119 +305824345 +1665858596 +705157120 +1694182675 +3879981750 +2725970635 +3317320693 +667356638 +1317132175 +1958205867 +3613247819 +4011755679 +2468397140 +240091716 +544534602 +809582542 +2849798049 +1419064716 +3982227068 +1906195289 +1138863879 +1158720442 +3452399205 +642182185 +649256370 +2304563821 +4177566540 +480628367 +2968350860 +2491790659 +677876906 +2635777556 +3943791002 +1994362364 +86262019 +1216813333 +3430429015 +3267072865 +2909997938 +2201445665 +3067379612 +2077296731 +2471447919 +1690186390 +959014927 +4212807365 +2133642604 +3554603995 +3307799063 +3089545274 +1944278622 +1639239019 +506931761 +2400204268 +1632591221 +4129564289 +1391163249 +86431545 +2530841827 +3567099397 +1107960883 +1170021920 +4031336597 +2573349675 +2628181637 +1378548318 +3670352236 +2715312139 +1867156574 +3420585470 +3539421085 +3704792621 +2175153388 +442412631 +1248713619 +3588352605 +4213040999 +3391274057 +3773618582 +3871512271 +299581896 +2552034429 +3122320947 +2747736160 +2145162619 +646058579 +3816717020 +1150079056 +2319076847 +1778767535 +2183133983 +51929980 +3890198668 +3519505196 +1584300366 +781855291 +1095936723 +298984256 +1716813487 +3182683224 +3343612914 +1524749993 +4036726232 +3990074634 +1798831712 +908011121 +287507484 +1597152083 +494960856 +2048740130 +1725194988 +3073256275 +694047295 +3066535539 +4116869712 +2938057179 +1633268824 +3926082665 +137525817 +1490219079 +2278388743 +791976205 +3069385968 +737218729 +2587097498 +2361124073 +1174571919 +302248182 +1234469635 +2557139926 +1201247443 +2787962745 +919061122 +1386350868 +4214294567 +2103715438 +2666024349 +960348132 +519596022 +1058628888 +3644575319 +1571431400 +3264987977 +1539098852 +726968473 +609774029 +1433912899 +3147161873 +2910057471 +264199859 +4054893310 +2613200627 +4201843838 +1267956256 +735695641 +4191655721 +934270467 +4140870675 +3341370036 +192925632 +1483260511 +3904477639 +3385173091 +4203994564 +160214813 +1172117757 +533300857 +2530536155 +3545359615 +3457113676 +3099940972 +3543637012 +1101442815 +1016457826 +2268306961 +3206204511 +2133109964 +2473475866 +1554617865 +1989872058 +206989013 +3040556353 +1619780992 +2848759445 +3870076929 +1267834968 +3196875219 +3982638382 +2510677862 +1445526417 +1587110185 +1962975124 +1507846119 +2273645059 +3063037528 +2516458088 +1559506331 +965774651 +128513876 +246051818 +4005463546 +780665289 +2447955534 +1472850621 +3218125748 +2436093102 +1823437338 +1976884000 +3571700050 +2686986264 +3553512847 +640676110 +1584886061 +4116268763 +2920545861 +2579442243 +2980770906 +3708805869 +2057104820 +4127719638 +3757530654 +816636382 +193348080 +337666550 +330270645 +2325494100 +2547522873 +2842976881 +3895060558 +2323702411 +1959876176 +4231023352 +2541080545 +2343860287 +2389308709 +2525603995 +904331257 +4089130329 +3908736735 +787636561 +4213391914 +3447112258 +4170871188 +1928519818 +2146531810 +1120789644 +2342752372 +38052119 +800212363 +1502267488 +4282249057 +2235629224 +1141701538 +3757529763 +310184418 +2812774180 +73792644 +1108171483 +1789750631 +2330216681 +4029472767 +2349036324 +690855663 +3927725852 +3374643589 +1294859019 +152697120 +110683560 +1538472970 +724364904 +4059186445 +3915443666 +1901968465 +3403735562 +4091865357 +3328179296 +502367929 +3994898429 +1841942899 +3928766393 +3800370125 +3612889686 +4286925152 +2030587663 +3076950998 +2775317770 +3397811437 +1448423227 +1320848193 +218334748 +2085251098 +1586156705 +3425761372 +899471964 +3238099692 +285838681 +757957444 +1567610568 +716911824 +1625768841 +1780989069 +2287591745 +1678854336 +2540639770 +4042696942 +3186200269 +3498857221 +2828688666 +2950547993 +68396871 +312551665 +100324 +4271538400 +2994540440 +917271533 +1058548232 +114284593 +1139574359 +3145193846 +3455516031 +899155824 +1630571943 +2180184910 +1533860609 +64593723 +2882141659 +4133423643 +3581106218 +1782284273 +681692883 +3581661944 +135884901 +1294821231 +2634534762 +1033767630 +57197309 +2938006596 +420398152 +978196329 +1261864793 +2214912903 +14064853 +357273529 +1715149661 +1084836420 +3567653057 +1980676662 +4238023937 +1155083221 +3493489066 +2715076275 +1789259460 +2993648484 +3324814973 +3816766364 +1618490347 +4043838493 +1332872921 +3006804379 +2351718287 +2999972756 +3110593463 +3541048609 +1859009272 +1996781533 +422381195 +154487946 +3798537245 +3007054038 +3390589478 +3258174461 +3987087626 +10157928 +4076392521 +2083063640 +3280849298 +2589785335 +666396975 +688269817 +1001210686 +2258449405 +1378109824 +135679069 +525538644 +1057184524 +3316228037 +1281967106 +2381216368 +2440442242 +4023696080 +1155357449 +1610275911 +3997983540 +1679591931 +3523618221 +990978654 +2910081258 +893612356 +2270633763 +2185375766 +3135608597 +695091554 +462791031 +1898815988 +2042156125 +1045786848 +3628278501 +1873041682 +1212206088 +2377815585 +533423621 +3681306320 +1980309136 +1630387881 +1278724922 +4244026289 +2793210173 +3961434064 +692381657 +492336289 +1116813470 +245390318 +1225572000 +684718165 +3102340469 +76678671 +3302497002 +772950309 +2781375365 +2607084348 +3275099575 +865660768 +298216863 +1898110510 +2639156447 +1635164058 +2389725293 +1480503409 +1639966806 +924860624 +657443257 +3122991514 +3156066364 +2547463771 +1848077594 +2253447164 +18795538 +3513052840 +1016313000 +4160188930 +2550156521 +1578498927 +2859490850 +2987529643 +4145522430 +3055172815 +3071633503 +392401133 +3297084886 +4219526834 +1720355809 +2806856492 +3276171296 +2928083227 +4246881146 +2295769999 +1537659344 +4252042533 +2014150551 +2574699 +4164537865 +1735685736 +1212655339 +169403734 +3592390911 +735526154 +3071154720 +116129218 +3728746115 +899710995 +3641957934 +221596297 +1608044186 +3598288211 +3749690398 +1715793851 +3970471065 +866781183 +366756151 +1759783167 +719017209 +709262837 +3782591348 +284679996 +1304998977 +370065306 +4080630850 +3236277460 +2847588948 +3804629116 +3451392775 +2703597770 +3845563995 +399572548 +3881966168 +4267996604 +3347231991 +3743985813 +3384279176 +388178694 +4056405304 +3027103713 +2069215473 +662918945 +3808818337 +3446122995 +3079281841 +107410102 +2367369011 +262232788 +1375149939 +60428633 +3861845950 +2152376962 +2744894587 +2338926380 +3682717513 +1419335689 +946844558 +3661409212 +2454258347 +23652321 +181901667 +3972386019 +458732346 +801326422 +3517414487 +3773765287 +1247743045 +3761451350 +874175027 +2588747636 +3084502310 +3137827561 +1289654719 +371211303 +3805257914 +2650736360 +1199758454 +2794925679 +1759023627 +4291175927 +4192373067 +3061223835 +2730031742 +1322260676 +3366419686 +1876209681 +3161596855 +2327387253 +1235761429 +873520321 +2036957540 +2626904824 +3730714375 +846144149 +1310055263 +3039818603 +201500069 +994915838 +622722391 +3126090078 +1126386818 +1019946663 +3038719144 +4125456350 +3964903286 +3909805333 +590008506 +3603946824 +1023098525 +3480063426 +1905962813 +324545705 +4242755422 +975640662 +1939487526 +1136512978 +2769794253 +2457124066 +2223812304 +293510038 +3746910824 +615570632 +3043441239 +3856622725 +3337475143 +1045388002 +3332499830 +3894311370 +432114424 +1629055184 +2171362423 +1610522166 +2225134772 +3979440134 +692242947 +2158889258 +272545546 +2652229803 +956412310 +20296591 +3561974213 +458542507 +2504468766 +1609281005 +1327949003 +132382344 +2059343508 +865514247 +3538984440 +1788827678 +768553672 +4201337400 +3215091347 +3192723901 +3464985486 +2378524730 +1183286253 +1936206216 +1677349458 +3541079912 +3338651812 +3437792122 +3274021848 +3032153338 +4237517405 +3642905590 +3767401435 +3412700309 +696990869 +1606428386 +3848000113 +1060571127 +427649896 +3057201970 +2099900397 +354962871 +956093047 +3167994352 +467108945 +242014417 +2591307849 +970147845 +1711554177 +2927532747 +3311240480 +233823844 +1490405275 +3091089244 +1177046766 +140127572 +390881463 +1563820324 +1668726467 +3038906396 +1339834079 +38756055 +2895003853 +3017860594 +2550225482 +3138155558 +456981431 +2666131776 +2004169841 +2915369396 +1064854979 +2107853225 +2751635533 +4007133480 +3152902300 +4089607097 +4059385692 +2388703341 +2268092547 +4000025189 +915299000 +172507675 +535504676 +1048876211 +2789253566 +2445558095 +568982716 +805214628 +145927037 +3442814866 +2464837072 +876627990 +876711790 +1779187840 +971481749 +3480603585 +835677863 +2407894173 +2424266220 +3805725123 +3506823155 +95520013 +4144296011 +4149406982 +1314774452 +2030397498 +4114163365 +1578371985 +3873690626 +753146936 +2460219386 +3647192245 +4152243527 +2171574105 +2583602045 +2475961736 +1300617001 +2567426573 +1256987014 +654739786 +2438708745 +4122182622 +2573455067 +4008577158 +683245356 +3423476535 +1454869903 +4292657578 +2646463476 +1515300342 +2977377239 +3519358888 +2234845992 +669671045 +219551405 +3769137522 +855659236 +927306551 +4097146616 +3712320027 +2770352858 +646105471 +1396736932 +3888673238 +3898814608 +3817389876 +843764647 +2080808246 +4231223259 +3379545386 +730383754 +1838604017 +2511401449 +36137904 +3971620417 +637367410 +3725059043 +4159147939 +4087967528 +352118195 +2011011094 +499462091 +3693348893 +3350599522 +2211172521 +363177596 +3715591520 +1158356693 +84205290 +2109280674 +4255290381 +2294218509 +2125304438 +3518846616 +3864464022 +3645523342 +1791032545 +2936881886 +2357709987 +632617441 +2579301931 +3065854881 +3525153831 +1470312976 +2528284210 +2109673680 +3730776369 +2265504624 +2197826190 +818613023 +3529089755 +4211593295 +2331984755 +3689954530 +2953827894 +2216976157 +379862339 +1497571640 +3220262400 +2682518452 +1427315383 +4062427419 +4060654711 +938722785 +932179417 +4223803353 +2181345329 +637285217 +725885086 +2754922976 +2380192144 +1703131031 +3612715602 +1558780109 +3434423085 +732411436 +1698301248 +3183274698 +3019231010 +1109178120 +3762232002 +2254243665 +1408870630 +2754798830 +3210487469 +3850936031 +1555755613 +3068674980 +1597594097 +125744005 +3322524553 +2984631851 +2237032090 +484866710 +1339670276 +2479616643 +3727386267 +1897614562 +2725604450 +4220747551 +724694769 +2489946658 +3864046581 +2173952570 +452495098 +2705965901 +522286402 +2162096080 +1961194555 +2249786016 +882312451 +1749316854 +3572445598 +1152474633 +1711928688 +3550901497 +1529714918 +458450378 +3148070282 +2247732624 +428594761 +1655542756 +2321376557 +1738830577 +4213730399 +2841909133 +2396171524 +3330810263 +3742994873 +4115885510 +2663624715 +773993883 +3988851122 +3249284269 +1730071722 +3811691317 +2721857887 +913244339 +850238829 +271607029 +443451295 +3917995426 +1678905139 +3410160262 +557380185 +1705448930 +3791914730 +1747599707 +2647773092 +258153484 +1947166323 +3837406536 +2346411552 +2799897692 +816619890 +3146808934 +3774836105 +3513552036 +4262301109 +3487413729 +2266651422 +1354866187 +3674025806 +2351187194 +1596393321 +3508090876 +1792717098 +3169867420 +3665286717 +3054539346 +3589380370 +1520608557 +1694037275 +3354652398 +2570079167 +914015430 +1128471678 +1868118795 +1011770085 +2512988922 +4065158727 +1079709898 +576536311 +1772865737 +3808607493 +1580368362 +1922469615 +2097078465 +4114613481 +3922466335 +2461278756 +1781951611 +3898529045 +859638586 +2001842142 +3553384410 +1297934536 +588370892 +4102922740 +3616228103 +1144188500 +3179179082 +2730784216 +4226474911 +3958423843 +3113426039 +2253783688 +230903799 +2117235617 +85671711 +1184001762 +2606095659 +1210912196 +3029720449 +2850497999 +3068285163 +3446726017 +526008134 +863383306 +1200291461 +26565348 +3356124154 +408471192 +291403094 +2175350380 +3700479163 +1542383195 +4167281378 +3736569408 +4122285434 +2635509658 +795076805 +664976254 +1837289464 +1645153610 +1261618058 +1877760457 +177675804 +4135760900 +1715571218 +2303279841 +1984818231 +2841254870 +1107173415 +36001402 +2595170931 +520799140 +2253645260 +4282205805 +227204355 +3078478215 +535277384 +3441673476 +1955171462 +1840039662 +1330821699 +1367045897 +2232944899 +2586248380 +848616007 +324281571 +4161952755 +415977128 +3828115507 +1460955585 +2454605375 +1362912143 +4251220562 +325809929 +2409283233 +3680913929 +1818638540 +663882289 +1668961360 +4174115227 +2766416591 +784622354 +3180417591 +4218982982 +3983834505 +3269974801 +444200171 +2185080009 +3791094323 +1033572923 +2738093960 +2817222031 +3237598307 +4144977219 +1732629925 +142256877 +1001583544 +3152745534 +635892363 +167856937 +3361981969 +1482487028 +1958050978 +1065331877 +1176024459 +3980484983 +851802843 +3403848289 +1417481339 +1514354961 +2432299837 +1728673987 +3077164644 +2081397140 +3162950391 +1662424666 +3598801205 +1737244006 +2354895735 +2078385437 +2293711400 +337391481 +3186289910 +610664566 +1735854572 +2440900633 +2100660927 +771187835 +3893273431 +1689996949 +1221840967 +587475042 +1105346822 +3411038446 +2778726311 +3207972698 +2517280837 +862482174 +444968719 +3878995916 +1992142092 +2596500329 +1996689856 +348678078 +3620621991 +2343485059 +3766424494 +3074872325 +134894453 +2667901508 +3271347740 +3060800733 +781116290 +858707231 +3048040057 +4275992127 +2698914881 +715664411 +3941737127 +2918078775 +2706897130 +3394162639 +3933019412 +1014919462 +1152966377 +1580902791 +305700054 +2850343285 +3129374471 +2960710019 +4163955107 +514107213 +3111201879 +841948619 +2200189733 +3099796692 +3487994384 +3118039730 +3807782030 +3158944909 +921734905 +213184410 +2069418313 +1269638018 +3549833390 +1098442913 +3571146690 +3841348005 +3013196428 +3954893146 +852903583 +947196392 +556179377 +3789385621 +1244184147 +2793942289 +3042281707 +2731008489 +3753067776 +403240420 +3452081862 +1539040053 +3532097793 +3437259620 +3831491016 +1545110615 +765744147 +1895632127 +2888907107 +3920675289 +3322448830 +2694595544 +1173788879 +175166250 +2821191239 +4102932259 +1678215201 +3337041854 +3487943562 +572263605 +1767509508 +3597646150 +1928478931 +1508361503 +619704792 +1186871186 +624069524 +2486168375 +2423795671 +344275692 +1739363666 +534898174 +3631092436 +1159224489 +30593155 +1684516730 +2063526531 +38524401 +2899747241 +2627909029 +2164936070 +3462930510 +3568123678 +3239492890 +2355642212 +2663998116 +827186071 +4173684842 +1169377211 +85361770 +2354414908 +2979306472 +1411076615 +1310765090 +207515965 +3128424705 +431468783 +2295960275 +864250972 +3186744563 +1569070696 +2787245114 +2474758353 +4223680517 +3257660154 +2050418644 +1971526599 +384333398 +3513988425 +3799697132 +2711864333 +2964515377 +3011062932 +264330771 +1818152349 +1632946799 +299698423 +572198572 +312285161 +3219821908 +1797603804 +714786470 +2943482701 +1223489690 +3923730002 +757100827 +662021419 +504381960 +3692708929 +681307766 +3189144310 +930503831 +368026549 +3867510991 +1320891777 +4078934193 +3402798464 +4080584628 +4031830415 +1201924586 +738660615 +1915678703 +541472717 +117991749 +784798261 +2716312514 +2913044904 +2219229797 +2957815540 +2721569189 +1896875807 +1419316209 +1838203255 +101456285 +3520061602 +309754281 +3959774275 +2168820224 +931530538 +3911882990 +4244435754 +142734797 +2776288401 +2198240298 +238333983 +3370096338 +3210143253 +1776246384 +1698866473 +4181474795 +3278667869 +2205264524 +331688175 +4127363199 +2530695711 +395458647 +1844962223 +3446124319 +1651570259 +4016355469 +1877377352 +425813622 +709315460 +1343809251 +1991860581 +3435049590 +256631425 +3435660028 +1295202772 +1722154275 +2589690876 +346183066 +607862700 +2808661518 +4286256687 +3233180005 +1354625206 +3663105928 +3978086523 +2059232008 +3336762050 +2498525930 +3913430710 +3183157967 +1053888679 +2962764947 +3049258653 +1113624749 +3511264073 +3405268963 +3814493178 +1703017297 +2119908538 +3461200283 +3074948568 +3328858153 +4240115991 +378521091 +3646210481 +1692330771 +2415930643 +687957540 +2618506767 +2656886717 +2920650294 +3867847250 +3622307349 +403349408 +2499447282 +2442492521 +1221616724 +3323440659 +3479897113 +34649248 +1466631365 +463303666 +1739261723 +693230977 +985347775 +1952777620 +3086702423 +468108863 +2636053475 +3130821608 +779336416 +3173623636 +2472237534 +1739147908 +3687019095 +3527150042 +1494700463 +3178458253 +2801222012 +2454110390 +2839717403 +1102028296 +3735309026 +2497979646 +63820576 +2741310506 +1096389060 +692991188 +2546195316 +2570673524 +4003067514 +1630357707 +2204287662 +1320989492 +2337015555 +1073767250 +3771743859 +3339760058 +1617437311 +2885553955 +3129654827 +1762508798 +3696257785 +1627280815 +4243230696 +2829962916 +3404596283 +3736473541 +2074424329 +4146461143 +2734355121 +4274159302 +2102216882 +3298173887 +1335849302 +3544194517 +1690392061 +980854589 +259360492 +66477433 +1811488023 +1226390107 +1692510210 +3261836380 +363769830 +3135199972 +100055430 +1962759202 +1103587504 +559468264 +2107871149 +927789529 +444563795 +260104391 +4181850156 +2389247047 +3216347176 +2984698749 +1528067135 +3283965590 +1617805347 +2339379904 +3061726345 +2881130400 +722188549 +1962298420 +3946984638 +2781429857 +2319331619 +4050783585 +878670942 +3626727300 +2074591441 +2377203483 +756127103 +4208852016 +503521391 +1682864996 +4206916085 +2702129810 +2147646394 +1336156508 +3182721268 +2706928488 +1786744665 +4283579494 +3956059635 +2043484888 +1571318201 +3170377531 +2251989723 +2106070424 +2786005639 +3799705634 +506816940 +328583271 +992468734 +2582438552 +3056611 +3991913846 +1914714869 +2009224044 +4027983593 +3273224376 +3646928309 +3175163557 +3207097808 +822823411 +706308071 +172795527 +3244757236 +307995918 +622474186 +2158805782 +1953259898 +2608418909 +998891915 +3166923558 +1788835997 +4163610164 +3864131845 +1645472902 +625257234 +1888692642 +2488554946 +1602645412 +2797412005 +4090795862 +340375790 +2665590742 +4110648504 +3869396850 +2753892773 +525248707 +698161852 +3553761076 +2261156614 +1079192541 +3267250233 +2886180938 +1686473520 +265540119 +2913571966 +1019810476 +3461909546 +3551790422 +17321689 +1313738733 +1427461746 +1133910550 +500962802 +1378600811 +505229958 +3218060946 +1756237059 +681267856 +3828131827 +885279682 +2731387363 +4051168106 +1532596017 +3213243156 +3977135224 +1473552780 +1741000713 +3362896462 +1702997637 +2853068883 +3082063841 +2818636689 +2288415591 +1670201639 +449233450 +434201185 +3437943132 +989808428 +3834380803 +4112874873 +4120343998 +967332983 +2338046384 +1215931780 +3281429921 +2365435060 +3586665023 +712660773 +937833055 +4232678571 +2670321166 +1301225785 +60551272 +503764927 +3854733643 +1528540062 +1502293179 +1007517788 +2933865957 +3564759715 +2770755492 +3945507118 +3369306016 +3241904974 +1512887688 +2816494953 +3326476 +792035793 +1867854628 +1316234807 +2087029811 +2513968403 +406899359 +343532096 +1520202783 +4073615880 +30269998 +1496026206 +1389067294 +996567952 +4092325377 +1243111399 +3381623885 +2591260058 +1601368403 +3344013986 +1366619404 +1810734582 +2456881482 +2891431513 +3738374423 +1789350323 +4093710770 +1381543110 +3567169646 +3352780699 +2878170015 +2609134546 +1172051856 +2106924473 +3376735623 +3622883371 +1146868095 +1331309109 +3913812117 +847497927 +1567941802 +3346245326 +3651853610 +2077247523 +710713434 +699785371 +3898137385 +3291409895 +2134528090 +1382654708 +2851841003 +2936109746 +1853163921 +3749103683 +3177268895 +2559454670 +3687369748 +2988961616 +814177939 +2141491560 +1136066322 +3304982762 +651027890 +2925303025 +2838960400 +3772820843 +3412421810 +2621379117 +697233830 +568830757 +3486177856 +2752823379 +1116645087 +2747060764 +271018595 +1175857531 +2587893568 +2173309441 +1133032195 +1039102075 +2652579117 +2447602990 +4181249545 +702760834 +3265564470 +3331181027 +2108596890 +3761017409 +4139515811 +809946129 +2246972259 +696905195 +1872256528 +2657343727 +217352588 +2778283789 +3832555375 +3564418552 +2867887182 +1093389718 +2547784494 +3277308739 +2872037510 +3409835435 +1684928240 +4031773307 +281272137 +3031155756 +1158147065 +2174856092 +1595779326 +3984938906 +1127283475 +1346375699 +582606257 +4167534639 +2762633295 +1552069320 +2663992228 +3502692642 +3065283303 +3444942960 +1984294084 +881778952 +717723916 +1872668995 +332658517 +4009286806 +3380852301 +3604126699 +2671967170 +4253042082 +3688183888 +288257248 +288529477 +736094790 +2325985632 +119779202 +1922377141 +2412006071 +3105370238 +88589478 +2184363924 +1633907367 +3514701589 +2077103965 +4169590145 +3470346995 +4140506753 +950731651 +3171289408 +22597875 +1237049894 +2093583140 +2599559453 +749121511 +3037957435 +2116037254 +409627304 +2639924917 +3416860960 +3987562357 +2277618669 +797520023 +3857322309 +635188213 +1713630461 +3015233417 +3888074618 +3537255462 +2811714790 +727466979 +1448310458 +267456581 +62313241 +1596165161 +2689365340 +3990987862 +3055284544 +2781985022 +400065902 +584376750 +1877863938 +1181614013 +813838246 +2734277859 +3881571112 +3239787570 +803950060 +359775428 +2355909938 +3510134830 +984699712 +1590587719 +4100767246 +1126050589 +1696947619 +3030111298 +3890001436 +2583036552 +4066858375 +1324730671 +3420289456 +2845557480 +1206123599 +778144218 +2714051039 +3679724249 +2995009381 +2410390881 +560597184 +3360068778 +299608150 +1788111185 +2388207471 +4028053920 +3666753550 +2187275460 +299771603 +2704947793 +3444435455 +393631831 +397920821 +538112111 +454130018 +228913473 +1931239356 +1127539883 +3418114479 +3547833440 +1420997996 +1094291778 +2366763202 +760984801 +948237479 +2671237963 +4055631026 +254788673 +3963827753 +113637006 +3936954028 +807635013 +215253544 +2484109981 +3113044378 +4139283585 +1822489907 +2130574711 +3342367026 +1867838110 +1452102297 +1889067628 +1874376841 +555964447 +1953319833 +30231579 +4144642831 +892451142 +2363041293 +2353638903 +811384272 +1490707522 +1844667740 +2646816610 +15456221 +3684071784 +1183236091 +2615311154 +3727175002 +3826013175 +1714659929 +3800429974 +2826906120 +1470708545 +2742203268 +3544523320 +25022474 +1077206782 +2362939249 +1962813686 +2719900355 +1710461286 +70617010 +3751203366 +3474388819 +3929278306 +190486863 +3607768820 +56586034 +4023941073 +316367320 +2981104018 +3653036075 +3409120583 +4079901893 +3475755374 +646248615 +1535774140 +750483809 +806213542 +2540135368 +2781630360 +1192602262 +25930740 +4034240655 +785989218 +3369044596 +2469343248 +3068430966 +3241721216 +3492318249 +1941608930 +2521757486 +3900759040 +3917899741 +1885942295 +3211067784 +517299883 +217277587 +3432352980 +3084360896 +1099829388 +3906814956 +1025034751 +3635923432 +1442486989 +3082277868 +426048926 +2385313053 +2997228573 +1654318151 +757170958 +3783053583 +937718621 +827011114 +740290508 +271446082 +3681142836 +2906909984 +1058727485 +2372497098 +3801108750 +1141531116 +3608437244 +2719616105 +2103398551 +314985408 +3714157556 +1079971091 +195878905 +1287178673 +2026590775 +2944897196 +2590688 +2107718528 +2512693325 +3978233901 +1316468361 +700763417 +3802658636 +1029205336 +3629518198 +2435103449 +1225177095 +341499023 +58414935 +707266658 +2842437467 +3501353190 +3368302646 +1926739548 +3587772681 +3165683088 +1307281469 +208268187 +2632047631 +3500676920 +2011447215 +2401237940 +2675967714 +906605930 +3737647842 +829718805 +2190416849 +3152855857 +1688745313 +1360598559 +1367948872 +2141982655 +1358499970 +570807805 +1997194924 +443597235 +630741193 +1270499162 +2021746958 +2711155636 +732012281 +2627550473 +1869284135 +579563955 +4004616136 +3858708917 +3318950534 +232883734 +369994456 +1239918746 +3679205916 +3475738899 +2626006828 +2395573335 +2131477957 +2210544244 +187307053 +923581557 +4258592812 +1690320689 +2527951380 +1243646324 +3056405614 +1885423367 +1581579975 +2442996698 +2250946206 +3415147246 +3800323715 +4026299382 +1785270150 +2384627156 +2730852433 +3164876517 +3047957256 +4222849871 +371111311 +277717066 +1609955773 +3955147777 +2012677828 +2916924073 +3261652559 +3077745383 +563697439 +2295132613 +3549969317 +2609154510 +2726896649 +1285145843 +3308414581 +2298261478 +2876927320 +3733240692 +835518909 +1112498786 +3833309630 +860896958 +539923793 +655556106 +1520145903 +577218032 +1297519093 +3707739658 +1176625417 +3097816109 +2868171997 +4284083471 +3883537215 +3829871606 +3416032022 +669669505 +602259027 +2997533663 +2379821999 +3593649914 +2984756943 +3295007956 +2227272293 +2210223731 +572358874 +2551944509 +1794664291 +1686701792 +2822718182 +2193570414 +1067669245 +3911664471 +561297268 +4119477204 +3577943608 +2828068434 +1758506283 +1337091899 +1339473484 +4100188433 +2211852199 +4161762346 +580630157 +86854939 +1955303706 +3852254123 +111098316 +3299130517 +3607561279 +3648393271 +1316686027 +677932328 +2156733600 +3655302731 +869554235 +1263972666 +595388499 +2542548537 +1344704354 +1032283213 +767495645 +2804697417 +540780067 +2643410639 +3944550966 +2296010030 +351594264 +2815002476 +2758501059 +2806304291 +1826821485 +2343809259 +3460754733 +3145768109 +3960301556 +4226081480 +3237743590 +2404793849 +4267041522 +3643328747 +64521869 +1438443536 +3614359774 +3800110573 +1236085441 +2841437052 +44512265 +1985920545 +2798316919 +2440259138 +3016543507 +631371469 +3809287385 +1500615390 +2404711822 +1147390550 +737965400 +2205971326 +1512098396 +1317583810 +3273572724 +3809135837 +4210856979 +3529339498 +4189396771 +429543748 +2122439245 +2751606535 +1332359295 +2802610791 +2588278433 +1010089025 +634860075 +2717185385 +3882864166 +1751695371 +1149004772 +11992011 +411822984 +4209465871 +1345626121 +2347395658 +3237101479 +2032709883 +3914458269 +2516067469 +1360983660 +260080249 +2360620844 +3279160740 +2485830462 +3534816180 +2694989312 +1890051183 +1616172452 +2176033030 +3321933866 +2533696228 +4264018408 +3344820903 +3623757532 +2886098849 +874310355 +3823229275 +1652203502 +1656156589 +2434541162 +991172077 +1567777821 +632943244 +27147383 +535264340 +2170034156 +3870215836 +3571003510 +3943616086 +4026800975 +862462653 +4294624160 +1048551020 +8318971 +2799631345 +4033121383 +249776911 +4185344706 +3563928614 +4201501747 +2996251292 +3367812329 +3326905897 +1624165077 +1437165123 +2705952138 +4262957767 +1436008715 +2434653528 +1061051190 +938652743 +2266985220 +580682735 +2353027131 +376598261 +1776150550 +399191036 +472329071 +2332264466 +2201185473 +3890135391 +423531920 +3736297891 +3407578755 +1314429545 +2388899488 +3268110307 +1607223305 +1603486505 +2056745785 +314486434 +2588566711 +1656717214 +711187511 +1026594829 +2892621429 +3780457231 +2446106115 +3440747737 +3808836909 +886464786 +1350675731 +123273061 +3170063217 +2014550101 +4145396290 +1771049474 +122149521 +274113951 +4161634903 +2285600256 +1843075185 +1222478560 +2344401965 +3690415963 +1416615693 +2107243711 +2202329526 +1865413358 +1409166258 +3473701151 +3013942643 +874781237 +1065766193 +532945017 +240791373 +2157182688 +1060940217 +508595268 +700958480 +374567650 +400564456 +1286018011 +329831986 +4126489576 +1718906076 +2270874335 +837917606 +832618917 +2274310832 +3556031011 +977188775 +725901180 +2933748491 +802402855 +2261959429 +2519463561 +1566236273 +3106630142 +1684418180 +2276846147 +1629333204 +2640415435 +12713719 +838012252 +2482502326 +48833275 +1984429505 +3343994079 +2558556624 +3939839458 +3074290271 +837638359 +2186469426 +1357735247 +1460254068 +2189814712 +3808419719 +2012287073 +2405389042 +4088687755 +3982123000 +2245874452 +1234381598 +4201661377 +3389151305 +2334139366 +2634651900 +2059286508 +1420803221 +3861952235 +1260349354 +1463741215 +3750733011 +111288712 +1405331091 +57641330 +1468072056 +3996369271 +4004541666 +1769755979 +1180135265 +413669601 +2778764979 +3301208693 +1014393805 +3864427148 +3416678521 +1852613421 +488168680 +2444788984 +1498280832 +174275114 +2679191822 +621120473 +1392453342 +1709785324 +3737148741 +229781842 +1852606324 +3524629353 +30987184 +2705756765 +2508873219 +3941392335 +3284891120 +1558316051 +3023145729 +2598815293 +2341426895 +378595350 +2496408794 +3589344411 +3826282394 +2076892336 +3261050065 +1954601300 +1595753950 +1154925787 +3030347765 +779498388 +2132602385 +614977064 +705534277 +2953010506 +2620662696 +3221911911 +4239103060 +2743101528 +148619729 +1350780530 +1110922989 +3909114239 +2163855716 +1996013020 +1250104406 +2803496622 +946498437 +366797245 +1461586356 +3247633109 +2631549012 +788215142 +2778061071 +2144285498 +3769533361 +1991928359 +3644505171 +1116680769 +2807008429 +1424981237 +873358435 +3486246516 +2972491891 +121238938 +1876151625 +2876245705 +1644241793 +2702328351 +2703333427 +898852683 +346605928 +1213389120 +1292839516 +2369977660 +3103968989 +2359132437 +1872042659 +1784086356 +2226667360 +3732049109 +3419927844 +2993212312 +284776589 +4108200497 +2585181384 +3678315590 +2403124189 +2597015492 +3382494040 +2237238938 +2306473338 +2639541002 +823999533 +415780169 +3355564115 +2556321148 +3251223299 +2819621591 +3288381665 +3474018650 +3774356960 +2393878713 +3225419818 +3351573188 +3300698378 +3823315237 +3196912580 +3072058753 +1170435355 +2955304046 +460082555 +2857033288 +2464912104 +3100949535 +551723785 +26639195 +4290539230 +3691626071 +1719943115 +3925107542 +3226188055 +3840790445 +4170817712 +420232139 +301056619 +3257703844 +829537484 +2976476925 +351403071 +3756778812 +1336941596 +648381928 +3965835449 +3148983286 +3376247769 +742731604 +3917278794 +1501242965 +3543618985 +438672550 +1718601589 +3896744113 +1440769510 +3851334342 +3308084039 +2025980085 +1394722753 +1276466688 +4057695608 +1204649814 +1893280316 +4084476055 +3179635210 +1937453685 +799316885 +76113341 +3944990045 +2072874771 +1851937361 +2435682937 +3879195398 +1739115397 +759622605 +3618712049 +4223584634 +3093596315 +3015838837 +1407622427 +3539326893 +2188276217 +3708519367 +3741876604 +849730858 +1767409589 +4084622489 +2348473885 +2149525023 +2715098505 +2108923461 +574884110 +403054 +1835076740 +2718420487 +3798956101 +3002484852 +4270113829 +1519217108 +1182214720 +4202960297 +4211161672 +1684744495 +2787944414 +1101780907 +1307693187 +1333361279 +1038920302 +2820549766 +433443851 +3096795213 +369022175 +2440478724 +1780915009 +3406100931 +681709934 +3011796951 +4067059452 +3532312705 +3990014403 +1087273897 +1508294145 +3109858015 +2662206711 +117982344 +1537425861 +581367772 +201406187 +3628547686 +1793695510 +458699616 +652139163 +81318337 +1174637431 +2884913091 +2172012643 +2550656183 +713668683 +3448284645 +1901901990 +3916140154 +3187021418 +2457660501 +303736427 +1415156058 +2068056840 +1442483282 +1220555286 +2636380705 +11760685 +4156745798 +557934027 +2497247655 +3567729091 +4142613184 +569038453 +4250033845 +1548090693 +1477185350 +2562504433 +2963875728 +3036006502 +1630113742 +760239684 +2514124399 +423582821 +594760057 +944298821 +1051145167 +1145497376 +3478648909 +535114724 +2032797268 +1988560261 +1879100592 +1015906449 +3762163430 +1898690951 +2723943714 +4278571987 +71873501 +1768740687 +451263350 +1514527116 +3233337628 +1732349161 +3631857813 +1872477969 +1101950439 +3417250888 +350980188 +36350493 +2160271997 +2863951735 +3443187110 +3059211241 +3299994288 +1162083387 +2198229070 +1202353714 +2212336023 +1755039248 +4163680071 +3426807178 +4011053067 +2635285650 +3239716981 +3561251101 +2366635374 +2410018439 +1168874403 +2813206424 +3582122583 +3851402805 +3856558808 +1356557305 +931675409 +3943358293 +990644962 +2286554260 +461048328 +1530072896 +2373132061 +1528457768 +1556967227 +1705494031 +3361156370 +2207080730 +3220596596 +4099026328 +1572435817 +181348544 +3916383901 +107195889 +1430199582 +424176916 +3979547858 +484525210 +217315626 +381481200 +3132133074 +3968428188 +3847324843 +127047306 +805387222 +3291868011 +2672501480 +241188081 +2531637719 +4213638174 +66050257 +2904906746 +89337478 +2980389102 +878803755 +2172448929 +4121512328 +2683591285 +1025674583 +2456951840 +1110067214 +2990211884 +130982237 +3308774060 +586998063 +1034009971 +655640026 +326565745 +2993928568 +880977465 +373330691 +2268642636 +2495935236 +2568363462 +4023084902 +3351108039 +4138200052 +275318660 +1876065917 +4133957824 +759457830 +4020908873 +1935579567 +2031790128 +2017604324 +463238299 +2497191054 +1129033957 +2686953944 +961548319 +2992376105 +2727445645 +2698272232 +3765395267 +1833289839 +1221934835 +1079719113 +520559496 +3280503901 +2466665840 +867258505 +183777483 +1967278477 +1342101682 +3685806180 +3169259951 +3174108910 +861537624 +2088101160 +221291421 +2619461948 +683023935 +3479266868 +2851449545 +394215565 +1999799571 +3481528722 +3196837961 +1085951635 +3957738890 +205600107 +1534955263 +3992943105 +2271478780 +824736298 +3666805134 +491117910 +741376810 +2159784068 +548801491 +4139669354 +2347061342 +596360044 +3388004554 +1173812951 +1204568784 +1863006430 +2002028900 +666979166 +1565963937 +3952013108 +3276911018 +3171692455 +2059386606 +1027031528 +4241001457 +2893860820 +4006785918 +692361463 +208006737 +1068997917 +3735990836 +163487092 +2591677116 +2629781402 +96554468 +3758411608 +2161392402 +1036967338 +974850811 +3154466810 +2672415303 +469313063 +206783466 +1839329682 +407484930 +1273071899 +2871948764 +2477603119 +1338417920 +3731275749 +1372332854 +2764115047 +626695256 +2443762275 +1425980958 +3663936456 +566893660 +962610943 +1864451186 +3338410595 +4213430871 +166883724 +205465860 +3091561362 +4133714937 +3624467405 +517333544 +79730626 +2794286785 +2267662213 +1304941859 +1328866020 +1717043216 +3439567266 +1526757529 +773596808 +1190422469 +3244929405 +3201889080 +2782140197 +3677802305 +176536505 +1678989751 +2325942233 +2523130369 +2567335774 +3284026454 +1152167658 +607413397 +2154752906 +701028817 +2031607803 +2743339927 +1865403467 +3693827214 +3665498571 +1471423687 +1981220074 +2237708340 +3861703214 +4099976157 +1137654133 +929625725 +647849376 +1710422657 +3231426777 +1890575831 +4012856308 +3703617338 +3922991757 +1635672218 +1187399578 +364738103 +1369785308 +3675815736 +2384449422 +1399830589 +1250373066 +4236170819 +3569191084 +2492251831 +1528303041 +959504744 +4291541191 +3328739030 +1385939171 +3302413947 +1146216939 +2358521037 +2463690188 +3502868731 +30485376 +1430742455 +3024039536 +216313557 +1461757662 +493860314 +974335480 +1088896775 +1554343052 +1510917933 +88379433 +2156078733 +2661628742 +1865126178 +2655215360 +1460557151 +3217015061 +3926016669 +2253707980 +1411149570 +3714368384 +2396376667 +2904637894 +3868912623 +3718498299 +1296075109 +363437177 +1787097928 +1012955954 +3149837713 +3429466282 +1521406011 +3585897689 +2943072512 +4288318684 +67274473 +2017635894 +3072202382 +4202099609 +1629388537 +582038331 +3407004279 +4276638416 +3975793212 +3561119669 +2018433884 +2139632283 +2693701564 +3510927582 +330001708 +1878860163 +4136801221 +26623706 +3150753808 +2624641609 +2271504217 +24438696 +3976531001 +2845977630 +2040120531 +744404766 +3630391287 +1536934359 +408143093 +2321999048 +4009104842 +1398549256 +1417781765 +4035811405 +4273169187 +2516093672 +3329186776 +2699727255 +4029230906 +4233442604 +2304196863 +303056347 +4189005717 +2266376594 +2409949178 +3349207928 +1696301941 +3429512685 +339892132 +2209738 +62108758 +2258747418 +3332991656 +4090678497 +1621232756 +4252918857 +42011194 +853089329 +4178662212 +4086312084 +2861834397 +1681933849 +3163742729 +2191880791 +4170707433 +2736556377 +542017952 +3440928266 +4221062731 +4068507968 +1790987014 +4056849326 +479172204 +1124128162 +3842157704 +2323496897 +967617865 +3505442907 +934615153 +828619364 +1969512003 +352226066 +2765994587 +1747662128 +714198024 +25239576 +4045609146 +4004866134 +3422311538 +1308905507 +4119141273 +2934090822 +2198307845 +2574708820 +2221533799 +3390890580 +851537312 +3543184338 +1465629492 +17908406 +3276527939 +3276828744 +3493647346 +1069358112 +3307055502 +2017648930 +10457825 +1711998839 +1187323665 +4084383201 +247750883 +2500272918 +1261896402 +1950557525 +176970727 +1387814049 +3839202133 +2334446980 +936857021 +3534172341 +2571606499 +249901951 +4232678130 +1427847332 +1305584777 +4225862846 +451059154 +3958158280 +3591750489 +849290691 +2514090407 +1427315404 +2703121468 +472016707 +1424274347 +2752239996 +2703362555 +2902370430 +2804763555 +1251992092 +2822178516 +2648226358 +950487772 +1874958362 +3530613938 +645937155 +1237100331 +4002433864 +3564466840 +2481059693 +2538190270 +810992202 +347413590 +3370823394 +1211205103 +1206349961 +3299671279 +685538428 +3568732384 +3686790577 +699513099 +3580643368 +73630694 +2381865874 +141886784 +805138367 +1191216868 +2673386236 +2014867525 +33051800 +1568374813 +3361849718 +861528071 +1801998437 +4050328359 +2896319688 +3665969727 +3405468366 +3858869436 +920784801 +2122241156 +1072926364 +2980261265 +429562122 +1345413266 +1287981706 +720717823 +222144288 +3510652159 +1231406855 +4198238947 +2887135323 +1506846161 +1287389156 +220567206 +4070858560 +1618802764 +1454035774 +3032155443 +2045980460 +1572056008 +587349206 +3363458813 +3369940376 +4133163152 +142300618 +1425095548 +183387298 +3427414669 +1088913041 +1527910220 +2878244062 +2653616572 +3885120539 +3063038432 +585717385 +3609392079 +2039717178 +3745383226 +2850437490 +992439795 +2941876700 +3034189065 +698345372 +2044578814 +4028130121 +2214072740 +3152661048 +961784359 +3214513481 +1428017460 +1393323684 +2245677057 +4026341977 +12224882 +528044180 +3216915862 +828087042 +230581205 +713582553 +3422168291 +738237229 +3063733189 +961214995 +1796593429 +2134709685 +3571434687 +2999451183 +2435882636 +4004120908 +1515362810 +375521426 +992667718 +1225682409 +504719173 +2828144522 +828269836 +78087301 +3468047910 +3228342463 +381678958 +320665676 +2030715566 +2001120295 +2498374122 +3540761087 +3324087287 +1267947849 +642157893 +586276471 +3427527438 +3468131894 +3590477529 +397708590 +4269699649 +4055525555 +793110441 +3301630427 +3851517726 +332869135 +3484001661 +2692944386 +2064006802 +1605470559 +4000357812 +60012344 +3255816561 +2739770564 +77291021 +1731285427 +3750062232 +2134305854 +173115341 +525459789 +2428228813 +2480777954 +886051417 +3684422356 +1589671925 +3311871808 +2713895171 +1972831944 +3030834661 +895474710 +228371438 +3706300877 +3092907596 +592731379 +3436344512 +204047373 +1100821781 +1952916849 +4142047603 +2455232689 +2444648242 +1429119375 +932539953 +3056189382 +4180132021 +3295914078 +2871758024 +2390057383 +1733819261 +1860847873 +2182913330 +2809948132 +3133712476 +3091439636 +3399474032 +61395015 +2807545293 +2653132656 +114547004 +2587918625 +1435903640 +1653590642 +903863965 +2221021242 +4202130243 +217911720 +1408998485 +4080211050 +789931160 +3796990800 +2411254947 +960238785 +3958458902 +148222763 +3693925546 +4058413777 +4151484070 +3890489278 +3432519631 +266722861 +3468895161 +428378139 +1600206844 +3936888952 +4103100424 +3650132775 +3315185174 +260127671 +1975608357 +416719259 +1792153393 +1259041471 +1332730553 +541300111 +1644910940 +843601482 +1834165926 +1936969591 +885038259 +2621041169 +541157262 +225028448 +519397549 +1025414087 +2558776515 +4282220846 +3038750409 +1153865380 +577420596 +3073443845 +3551845354 +1730971376 +3154305075 +3428030193 +2204918000 +1915233793 +2659287403 +1863157623 +3014600873 +149901391 +3897658999 +941642478 +1378494323 +3499446793 +2129760150 +842915957 +931062318 +4242984508 +2639244852 +2027580658 +3362955878 +3335698313 +1507406159 +2712281935 +1962817041 +2195316310 +1171288067 +3038887124 +3166690773 +2636041332 +3772532099 +2907616538 +1875784085 +643404769 +1046756321 +3436823771 +1387571444 +761300907 +2724660944 +2686594858 +908010875 +2878024547 +1407180869 +2689678935 +574526324 +1555916961 +3005366358 +4207317917 +2346836453 +4077192312 +2112298250 +2435282545 +3201976620 +148399575 +3179195762 +2273303406 +2725772047 +1540364277 +3533979917 +1111434174 +3659897915 +3743819363 +2535922915 +1240192426 +3438311623 +727387054 +2553268584 +2826099494 +1580758397 +1840995720 +1091817873 +2974367752 +2026795900 +967502851 +784083290 +1781201487 +2735362831 +985125741 +881850294 +1752300752 +2182682301 +2092695568 +3703575222 +1073413097 +2418402375 +239600548 +3692360246 +2980955049 +3917513594 +3278974819 +2280964684 +1335719767 +3116838368 +2710645010 +1389350601 +1267910605 +2071413019 +1065827231 +3990642861 +1988836921 +2619408974 +347008440 +1178906119 +2732274355 +2024293927 +3190425616 +799178782 +3376055349 +3675237935 +733734085 +790652935 +2689741927 +642257746 +3122739454 +3434072167 +427537226 +1033670232 +1665449072 +1405795741 +2498612955 +2453061187 +2248088039 +2252863689 +1319945191 +2126341108 +2487011379 +2134054886 +3467066788 +3403160199 +2153324560 +1891356935 +1420335705 +1967161563 +119179838 +200459836 +2496111769 +780690135 +3814266233 +2579017409 +2882393692 +2532903437 +146465037 +3411210531 +2486522286 +1928812469 +3128921869 +3051317752 +1883793361 +1115800497 +1953433277 +738570621 +3052385780 +1588697712 +206768368 +1976033836 +1468136626 +3928555474 +528445315 +2121247226 +1655584184 +3249415289 +1815099766 +4249282043 +2467975508 +3630348332 +2023134996 +304453104 +804796502 +306346341 +2956257336 +3671427084 +272453733 +636182650 +395286328 +4156208602 +887837538 +2882877550 +3360676089 +103170751 +3476187367 +3967542417 +1062446392 +2735547855 +1706144317 +120367478 +2032732985 +3793979782 +1235059099 +114510815 +3536042876 +3480974053 +3549766309 +3061780958 +651819686 +1951754482 +68704921 +2117512530 +4044115467 +384467087 +1862323167 +1001829673 +888584137 +586377664 +3297766921 +3384730110 +3799132537 +2185481043 +2170140904 +2285801891 +3023714283 +2377703059 +1591927547 +3397333662 +3921250752 +4087768973 +3077425105 +1321727233 +2688835846 +61679875 +1798157285 +3909260680 +289153992 +3338595119 +1844703594 +1950970286 +1097904318 +3106920218 +4089397606 +1175484102 +4075468977 +2955205570 +1867495677 +3160823812 +1906402316 +1237890829 +24390745 +2144190278 +1416736241 +726794034 +1578241165 +120594920 +227968066 +848611305 +3684440078 +1620571811 +1283307013 +1464285667 +2970810865 +2925035417 +3378962992 +2268693073 +4014595296 +1556887234 +1056107217 +908509215 +1352289343 +2489230146 +1937383935 +1692332669 +3644140315 +3096305732 +607530485 +900132808 +3152176535 +493452401 +3071405491 +1829016615 +3772639900 +4178800624 +2336731081 +1192757206 +1284808945 +3414738828 +3507309724 +1704178409 +3021876869 +275018012 +3971259576 +3315432935 +3020928524 +2130657272 +2408029043 +3071455141 +3260916720 +1238488000 +3096002468 +177674259 +2735863934 +3416842520 +262362884 +1479573582 +2482367017 +3844489337 +3579552714 +531331993 +2592019831 +3303442733 +1285659179 +276351199 +2553921423 +4254416693 +4235621524 +2493017133 +2173036824 +1517412301 +3740441531 +3387672975 +3871233533 +2893984453 +4282653403 +669605093 +3102504325 +2214965753 +3547555361 +1254778019 +1811829809 +949663435 +2402521844 +1715143009 +1730843408 +2671677729 +3314264945 +1260458624 +3268904884 +1660431719 +3646078153 +1171601796 +2224609615 +3550475622 +2321498491 +826918925 +620276685 +2738374684 +1468138776 +1619595041 +1464213407 +1837482532 +739979674 +3798851365 +1910846710 +2783494460 +3500978742 +428824684 +3075008464 +1442964813 +2823294026 +948792938 +3034977912 +2793383897 +2910047699 +3798095939 +835183398 +3283142257 +3941542110 +2418670646 +1074207065 +1536642434 +194021006 +61981449 +281296196 +1686130660 +3715466488 +411538539 +1538076668 +1176451177 +2529566732 +313108045 +104466553 +2176018761 +107926549 +1378492980 +1170984216 +261290226 +1284429397 +947603353 +649695875 +942266352 +3419118451 +2492403717 +2749743890 +160728147 +2361399606 +2125888038 +455296937 +845263652 +174465973 +1234017800 +1321432320 +4266832494 +1629108357 +2675441550 +2379506206 +1894334269 +1216028965 +1748036431 +1176167725 +4152666404 +4065279347 +3810838865 +3522978520 +2332034620 +1826198270 +3778443012 +1849453283 +3551981013 +1659346119 +4105698186 +2882663989 +2864429091 +2463971033 +1187563978 +1942259106 +1001446270 +427068890 +819559857 +3943406000 +1637198932 +2283185646 +1527692143 +1982842453 +366250430 +2903157248 +3032152079 +540474849 +222181477 +155551923 +3917261205 +1717817580 +3883903834 +1266711892 +489309603 +757740141 +2566809733 +3738405725 +1752835110 +86737671 +3317505541 +2044012217 +2057345636 +1941128422 +2848158735 +148152098 +2379428003 +450040227 +2687786644 +1518321143 +3961743609 +2439533451 +1199215647 +2873204222 +2549673597 +4268295760 +1655191608 +1345531891 +1720302694 +754298977 +547072190 +4256897740 +1390775696 +919716682 +1354527683 +1661957149 +580204383 +1104911072 +2941624089 +3794686187 +3981940406 +2446149177 +1918981124 +4176822145 +4126863258 +3447948742 +411356433 +1830219076 +4196330833 +3069169743 +3834882482 +2634031462 +4167469251 +2006687966 +446302994 +2602616628 +3955815744 +345615324 +852385344 +1281921102 +651354444 +431713449 +3526127097 +428654054 +2588604137 +1176804536 +682126905 +79451667 +4206376189 +3722757387 +2766757703 +1832239507 +2708568329 +2408275494 +1061303601 +2762333882 +2157093838 +2084871488 +578891519 +3559803334 +2405340198 +1712666034 +4202915333 +1778565140 +2056795201 +3712745452 +1873435136 +2564697293 +1497661996 +1651691175 +2287013582 +1375986588 +3269206676 +2934496605 +1959335696 +3890972328 +2631040786 +4213540898 +1123526 +3710291108 +3714521461 +2516321962 +4015817636 +2953659268 +546870473 +35157516 +1317115887 +2576590919 +3069768180 +3664014203 +1537967839 +827734506 +3331846421 +1701677523 +1624439680 +3731818359 +4160654774 +819627636 +2733389515 +2959450445 +2115455082 +2089489207 +2314487495 +883998342 +3822153453 +256130494 +1429201942 +853081377 +1359548900 +2997086994 +3625083428 +639603461 +3327077813 +1011712237 +4106949805 +3738721812 +1332942453 +1682545478 +585705389 +2286805447 +2455082425 +483456302 +4159218117 +1265799043 +423409136 +1020639151 +2270718267 +2996577883 +30133665 +1080523377 +870650999 +813052370 +919483306 +4227430090 +1394654538 +3991411684 +885917442 +2532406314 +3691070130 +471384460 +2526587732 +4129388919 +3829514091 +353923880 +3591821946 +3944766701 +4209888911 +696293201 +771583967 +729729341 +1556125300 +344511441 +3848518077 +1246362159 +4160059119 +1269749442 +3652433317 +2570113089 +4091470022 +2120761531 +4055187549 +86445919 +3418185927 +4049745543 +643760810 +610415970 +1620719125 +961519350 +2308399434 +714363222 +2539591858 +2441622115 +3264439468 +2004630596 +44012329 +962421530 +159427067 +2619741753 +2870456227 +2735263193 +88690149 +808802577 +3895791055 +23421554 +4093011877 +3432646420 +3054895037 +1071787866 +455730138 +255992060 +1276417573 +3100882509 +1038024937 +2839555592 +655378824 +2704576581 +2123209192 +1041838118 +4258116460 +3648299117 +3664855140 +3702086441 +3871016128 +693916810 +1246179945 +1001457809 +768345406 +2046593644 +229420089 +793188594 +571685214 +4005839032 +737276034 +1603775092 +1355955217 +2304498775 +2592905770 +328273844 +3826273428 +3715816375 +2703112480 +42037841 +2819120801 +1838363193 +1835946911 +818587824 +1218189601 +2343269141 +4102278307 +87388052 +3427175345 +3500474260 +380893524 +3955472353 +443836203 +3066742129 +3095692390 +3948174608 +4074909665 +3356247683 +2631415352 +1668242463 +590882665 +1377331737 +687839528 +4004221326 +3177612329 +4044276508 +1822871759 +3268271842 +2525782224 +2442902479 +1602488068 +214645542 +675451485 +878853775 +3178532003 +3132201601 +3679673913 +192270933 +3941160986 +2132309213 +2895611996 +505683218 +2687148684 +2810345197 +544891610 +790950578 +1322742689 +488699247 +2921247313 +2557401554 +653765816 +363111865 +1111224711 +744158949 +191945893 +3481280394 +1234853781 +5034834 +1336471548 +2801764047 +2051263022 +3108554351 +556209370 +2250753874 +2416640089 +4123586379 +2621482221 +1194951628 +2194974432 +514011356 +2635953786 +3805744118 +436198278 +1346088444 +159832462 +1161661327 +2041454327 +50940874 +2433258657 +3618889846 +138380691 +4113638585 +294547739 +4132592056 +1608316736 +2827650332 +863759627 +3092032744 +724312943 +3326735026 +852303748 +3382316963 +3971815651 +1332138044 +2363723867 +2859501826 +2638337248 +3029541912 +1893946723 +3571683892 +339202083 +3711023076 +2625877258 +1854976730 +933177061 +3122076153 +2603750980 +2729921122 +4037756155 +3943405002 +1332087827 +4122772092 +1908912014 +3294695062 +2045937756 +1101123342 +1837849916 +1671787557 +4268133763 +2680405699 +851852191 +245861003 +2225934840 +276282347 +3369056641 +186014305 +3948666103 +2107202480 +160605671 +4124260152 +1081673319 +113165711 +189844463 +702113205 +1677502396 +3571501399 +3186883901 +1439836319 +693929926 +4016135200 +1048544529 +500940277 +1243611051 +166530982 +948517310 +3808825541 +3151647835 +2056697037 +1223744257 +2696766511 +3894618902 +298261241 +755739977 +4142768637 +2886019975 +2085877313 +3234128154 +2735843125 +1374947742 +2439224768 +769325088 +1472452414 +4012947543 +3199673745 +3750307555 +2021226496 +606652236 +1654530948 +3413643749 +539067185 +1595251978 +643889839 +3512618157 +1161216925 +2227749157 +1088714253 +1381201867 +276896601 +3659944895 +1004866958 +3462673144 +3020949438 +2644283637 +407057497 +2255527690 +1937475712 +2561280282 +2768745262 +3231677538 +2347737797 +2895695836 +1763865205 +3558301192 +3655912512 +1164645964 +832026897 +650354934 +738023214 +2730850501 +3038018017 +1666925741 +1398001964 +1122791645 +1183365344 +2299766879 +1151622492 +1404194043 +640204787 +2778458095 +3419188544 +3712657295 +403983769 +2195619591 +3178954781 +2624596698 +2937603555 +3418545188 +823892322 +1824594336 +624434618 +3604287698 +2365395973 +361844252 +956506564 +1456185765 +550821411 +2406641082 +723944293 +3379397896 +1972715576 +2668265852 +3893275887 +3980499483 +4273050607 +1106627184 +1970622123 +3141674187 +2970367544 +1679555963 +639782317 +681222619 +4248580881 +619245573 +1725296638 +3590901940 +751131644 +2332353712 +1064694426 +2662748511 +724759262 +2893552143 +403598619 +823452605 +1333560458 +4042807972 +3978671103 +2733302040 +4272658681 +1062072208 +3080493445 +286591255 +4211789465 +3758605687 +109616711 +2055515111 +1496869262 +2988147911 +320262909 +1550747666 +322187027 +3157314827 +3078526441 +881679706 +604533624 +1243210717 +1279621473 +3158207857 +2606430357 +4059406231 +4150652401 +3133902618 +911095967 +2046402753 +1017754454 +2357192974 +402309390 +1920107449 +438470775 +904557180 +1052581536 +1051992797 +1830682990 +2425481323 +1566478241 +4137832421 +942545707 +3147101195 +3134764259 +1809623613 +3943451706 +1059802951 +4115221613 +1197261304 +949010088 +2592384710 +2999414601 +2022299612 +3422368456 +2502244353 +2758659750 +1432653259 +1033505791 +1847538313 +1949782325 +3402904183 +3549712414 +2209795858 +2372114266 +2365051385 +1048086437 +3732705309 +3254615597 +7251743 +2901002300 +4123371450 +2457131727 +1943516283 +2159964564 +1450548701 +2562603535 +410800373 +815936907 +3842489888 +2366463240 +2391371770 +3211382451 +3816038264 +2881562721 +491812265 +4206510464 +4259501154 +891955609 +4258580613 +3548541235 +2830087063 +4113174998 +1081632035 +383559621 +897787203 +25414831 +431086276 +3673071212 +3076629404 +2436023212 +3433709155 +1413382441 +4199364315 +4182931060 +3623859977 +365590674 +3808496540 +2266104718 +2881231001 +2697123188 +1295743377 +74780360 +2420704961 +1122474641 +2208726402 +3552382019 +1951152727 +4100891943 +3292464599 +3037003850 +2828037812 +3868077493 +96575514 +2073476766 +2205287369 +179878744 +439282470 +533518348 +2790525737 +3785704594 +2019854506 +3617120681 +947529964 +1771853535 +1111704074 +1787865707 +2734494110 +3269435387 +1261366062 +365014305 +2231374882 +3966202924 +1562376000 +4233918131 +2017314725 +419663712 +1437476329 +1516013722 +1293920737 +2325595276 +2619358006 +3324881193 +3677720286 +1065837365 +1138613603 +743617797 +3138086884 +2209565628 +2839988552 +2972769717 +3331263991 +3248995178 +3570667487 +2186266075 +2710850189 +307316433 +457945400 +2767409363 +2613110897 +2790269499 +82176554 +3283053595 +3256663627 +2586463272 +1857103732 +1087785411 +2023932868 +2572360345 +364428931 +3919709547 +1324919032 +3263947105 +2957220038 +971145531 +912025279 +2787868748 +659648337 +4190368482 +3032958390 +3071348395 +2849342078 +454892596 +637069025 +2913223163 +725216588 +3932502912 +3951808089 +3500835786 +2489114591 +2623075813 +3033833061 +137917399 +2026700121 +2014478772 +677375760 +3006529210 +2399269550 +65804542 +2647966733 +569933445 +2173830992 +3956366857 +1314168419 +1999843512 +3182335237 +1303224641 +2035440609 +3945682512 +2625030999 +4246529974 +445843990 +8198449 +888730408 +2114690531 +3207314851 +1751766817 +1485568354 +1628779909 +2034806765 +282349137 +561124129 +1327169739 +2269008161 +122092741 +2811027098 +1788730495 +2924801249 +1538354500 +4189765745 +2821480338 +3279158273 +642819952 +112368117 +1578494787 +344034356 +2936357242 +3864839024 +3380678879 +634871649 +1142666525 +628390737 +1141424793 +765763989 +2826726181 +2621806924 +694582857 +1893550649 +1933076078 +3442106214 +1447695418 +3591533566 +3943576284 +3499259690 +4214055991 +115286095 +2520395884 +3109983115 +3996322209 +31026978 +2135750522 +178054523 +1641897040 +3873952949 +3113278458 +3990508134 +2668394565 +2219000759 +3882368681 +2917430324 +3726466546 +2106369348 +1333900900 +1336750748 +2979493097 +3805253549 +2102103081 +1395830415 +4263223852 +232993068 +4149326453 +4114911568 +840142979 +196716632 +2780430677 +22111305 +851610237 +4138767325 +3293482137 +2821355305 +2933024771 +1625702823 +1086987284 +2606194473 +2391546977 +3858052957 +1050684900 +1646225236 +3470943947 +3909253649 +2878138320 +2330839778 +2697832125 +4098527336 +370699065 +3428362127 +2995811473 +251291219 +2680714853 +1768278888 +1394154888 +735447760 +2061484489 +537767856 +1167420056 +3924214310 +3124407285 +1827394370 +307095210 +3943200274 +1879161169 +728554018 +1827770708 +1362897930 +1808097212 +3512153509 +3834764794 +1363143988 +1673408731 +1170564239 +3680755924 +297488542 +135686317 +2068173212 +4285378651 +3110874371 +3818443202 +851088443 +2427875415 +259256351 +3038001084 +14207041 +2780085191 +1127609769 +1704464752 +1192477560 +2638327284 +4154594737 +3792809899 +1232057727 +2576757559 +2328174768 +886034223 +2632371122 +904539496 +477915549 +682355128 +616239882 +456690517 +87297952 +3568918311 +956028819 +3378697691 +1064517300 +732128049 +2290650275 +1830252770 +3694949201 +1947960420 +627507 +2868422856 +2268265428 +2197522784 +1803956195 +966705863 +3481713186 +3953057202 +3341727663 +1014216277 +3946137141 +1474235184 +2313900424 +4213828863 +3036712376 +3483334803 +500101465 +3585765261 +1953547059 +4115017564 +1504601287 +1235524177 +2190711373 +349363682 +58474828 +76568506 +2775347963 +238593615 +2964565428 +2212814740 +2016803050 +3571421317 +2620199224 +427760785 +2917296023 +2057637068 +4272181832 +3841366014 +406732892 +3726728354 +1610226424 +1259129174 +981499560 +3714719207 +1411200861 +3740814925 +260628946 +2469229858 +2709167145 +3618885489 +502161725 +187375548 +824803770 +1483722002 +4212965296 +556559766 +4277022696 +1265249471 +3058299124 +11522025 +376856761 +653738304 +1640153730 +3948817570 +106859380 +2326649958 +1079418577 +257513973 +2073508997 +2502151551 +1494743737 +3143307008 +2324359584 +427949562 +4133979748 +86841259 +2149216359 +3956461321 +359116687 +3959102627 +3239422301 +3048173673 +2493648071 +550972959 +129846297 +3624437749 +2027304806 +4161859008 +1143949618 +1769747881 +1031982095 +2785341835 +90865931 +568311333 +2118266382 +919523412 +330289393 +461647237 +2032541083 +1111862287 +537858522 +1738876388 +2872917483 +4966733 +2120497033 +3035343671 +2837398086 +2070193165 +79975048 +3357071622 +4004352476 +3234428262 +1437119506 +3200821430 +2201226817 +534062494 +1062643343 +2566234904 +1117291602 +2064271265 +3956988108 +2400923202 +1730682318 +3130618301 +2879972445 +1303557224 +555110885 +3425481486 +2160751533 +57185378 +1490783683 +3417487160 +960828564 +3502965959 +2968266594 +3988007655 +3472455460 +1695381209 +1199686243 +1661634358 +687009676 +3525284697 +1010535776 +2990215493 +1578821965 +654638169 +1184346389 +831516016 +1044144161 +3295606139 +2823917711 +2277257375 +1747666566 +1965561985 +984016622 +1227847321 +3799984556 +1401055781 +4028859580 +3854983279 +3568613722 +740568593 +1336643291 +2536847094 +3057019600 +1753558496 +2189110940 +1856927700 +1078797340 +2039105901 +2098401331 +1065689101 +1129210032 +1165603961 +3312902950 +257645604 +3661604390 +2564247261 +1574849237 +1419457753 +979420444 +2713314482 +2599364676 +3919630525 +3395908717 +3388582837 +1547569302 +569400893 +3975452407 +652382147 +2948522323 +1571079540 +1430320174 +1237185075 +3324389388 +2140142695 +1696378110 +1033825761 +1584801858 +3548518286 +848535614 +422361537 +540283634 +4047421719 +3699651108 +1283262102 +2515700902 +1504813060 +1047628206 +3135716444 +354389004 +1719533358 +485749072 +3193394253 +2522148587 +814851187 +475188116 +3456143784 +784308641 +1454572136 +2206295561 +2582931286 +3582502706 +2081031986 +1353002028 +1954910564 +174887008 +1826938325 +3542686830 +3338905570 +3331980178 +1001487085 +3672297220 +693510382 +1085555291 +1179618513 +3388836609 +1583591624 +1298540050 +3071310489 +3251145565 +3585996475 +3747992368 +2403320267 +4159525382 +3366327417 +3948709626 +3495304735 +1440054019 +2567670212 +3474804187 +1920046304 +2778785887 +3623544253 +3086267699 +1466025989 +511192721 +4042403881 +1740996913 +2775692812 +243910278 +3932430417 +456028279 +669684702 +3103591881 +3972883927 +3979045037 +2029483153 +2541579542 +2463014173 +3199475108 +1221574448 +2293236063 +3297101820 +3419023831 +1966212922 +2895050039 +3375279992 +3847855233 +4215401336 +1038229631 +3088562976 +3158190815 +38627986 +3195840103 +1124721008 +2543807271 +1377957809 +3551053832 +1249493177 +861854950 +3145111742 +2187623294 +3113148841 +2481203011 +1920440890 +2052414526 +2538384065 +2614425226 +3907545073 +3278120243 +230499582 +2830525878 +3890171170 +1580142047 +1365753257 +586608421 +3521691348 +674682802 +78334441 +4131969635 +3781527431 +4197093247 +1001910330 +2899619297 +2061313288 +437512285 +1667502525 +3539914739 +1905295680 +2007738300 +2159919388 +2194204617 +1271756796 +2731974240 +279960852 +1346398873 +3894516232 +4020086717 +995538847 +2174817357 +2574300665 +1250390630 +2854055030 +1160380890 +4270934618 +3957450589 +1715291259 +3118062742 +942207907 +2944212361 +1818444132 +1793532962 +1868188463 +796725577 +1977113024 +1495535719 +2762654481 +1633775501 +3966963591 +3519334456 +3762808651 +1313870810 +2857862643 +4215528004 +1343869488 +2240622175 +3864816215 +471328752 +2961326125 +3929884868 +3602835188 +1475811002 +3376353819 +14551495 +555338804 +1402759037 +920212353 +2709854088 +2955161868 +3218209025 +3798210781 +1632987166 +2470334477 +1968737803 +1082016283 +973097546 +3904132793 +638317718 +2231273382 +3660955166 +1553244833 +2865860036 +3311351298 +373803340 +2444817473 +2560110605 +1606023378 +4053274272 +3141061426 +1114205549 +4190427725 +1141303323 +1617210200 +2187498758 +2234769138 +2045586289 +3917101340 +4223041177 +3071636693 +1916078496 +2728365386 +3073123341 +192222592 +1163044467 +1276609401 +2486231917 +2581498629 +3211092220 +1881582485 +1809120517 +1506327702 +663666776 +810748310 +747896229 +635697672 +2503388486 +4111357621 +2376584548 +3261067765 +2621572286 +2382682997 +2825703135 +2987928556 +4152146825 +4215519439 +2913417111 +702269456 +3469565028 +3538162315 +2583439491 +1993122706 +2358153527 +3109483807 +3273744846 +742047884 +4204709771 +2875190641 +2772695303 +3258941821 +773574164 +3507702345 +3773622811 +488450899 +1417205252 +3819846469 +1048890222 +3110229089 +1059121213 +3164168437 +1923096487 +2488111972 +2532621703 +545165541 +2280322163 +2527919609 +581535122 +1656243594 +3438825455 +3623024080 +3603759079 +553536063 +1360658972 +2266979897 +1842536836 +2441527400 +2584777872 +3889924797 +2454274321 +1909626278 +3502201176 +1011944564 +2005140742 +3056546718 +1532224040 +2705477577 +2722238027 +2797585035 +91277745 +1177985959 +3129439203 +3775913675 +3955581289 +3895104496 +644819948 +2839607495 +1591702848 +533975839 +2998801015 +3191910656 +2525129377 +892866140 +1289584669 +180637227 +2277496728 +1070744964 +4168527060 +3748376247 +455153379 +1669872953 +1807047211 +3822441596 +34602338 +3517383201 +2999137847 +844937650 +2274423993 +2536848332 +1288331786 +1473236006 +3677818765 +233522712 +3219744272 +3349049480 +973116022 +3022554976 +1029632706 +2603273293 +3250923407 +192367100 +1585989170 +3160237393 +2534899970 +3365821323 +1766930047 +2570594104 +1093120084 +4068185501 +4016853893 +930827465 +2763445361 +2020852400 +1219629210 +2849503366 +3786744098 +3669899282 +4250738127 +4106805442 +3266797034 +3572614198 +1908669965 +3559666220 +2201771320 +117239886 +2931278044 +3805096014 +130702233 +121682733 +4133232521 +2096192303 +1257617016 +2218406981 +3616780115 +3287362939 +329570115 +1483084483 +1807959366 +1573789133 +3674538420 +673047576 +892087890 +406118830 +216933075 +3726248076 +1128102871 +3065090837 +580152723 +139751156 +1843514301 +823147773 +1697619504 +103716126 +3840149569 +4056367216 +1053454658 +3842266633 +242187453 +3883127726 +2528169343 +90175313 +1047911116 +2261561727 +2837339686 +1514452447 +3931898976 +2632537105 +3516925736 +3600746384 +1518675507 +3388305056 +4167955691 +4241530023 +2089352669 +4174072305 +1036648898 +1705172752 +3890037526 +1299221389 +1078057559 +561292002 +2725230489 +3670499752 +3157132692 +1198023555 +1948398153 +440330376 +1813304857 +1914641801 +2428939257 +509225851 +2984335490 +1845437197 +2982832673 +4258948911 +1325361040 +2334043480 +2142212424 +2701631692 +2351162315 +1225483177 +1212968412 +1164502127 +2061391997 +3104379087 +2032239633 +1523317519 +3806945524 +1288332366 +3834704085 +750743289 +680155249 +2826978674 +2900180608 +1516232726 +21608327 +2674949571 +807102749 +4264323409 +2043896680 +4285407354 +2885086253 +2233151700 +3117493252 +2829901993 +364402583 +2295291566 +3843326471 +439518148 +740460441 +4220095096 +3292751417 +803127036 +2390926221 +3509791318 +1150060511 +1372861703 +2227013762 +1252127808 +3912401516 +1861510608 +2674727706 +751933186 +1727348366 +3279690800 +2663171835 +2114048065 +1110463857 +880388812 +316017955 +4096080188 +2883124903 +1764641573 +667166311 +127970148 +2583033758 +890669286 +1437813933 +4217145002 +3121764298 +1735005006 +1667670075 +1621647327 +3082681277 +2730597185 +4108564300 +2917409655 +4144355895 +1083493848 +869295626 +1650780896 +2460991285 +3783207791 +1380457101 +1722961877 +1490346991 +3475913011 +954553833 +1934172245 +1116881440 +2274856860 +3613549791 +3981375862 +3739845791 +4230352887 +3198615882 +2517971389 +1023673523 +4228696435 +2834320420 +199002503 +3132406078 +737846556 +2532001086 +742367403 +3061344349 +2783838502 +1036252826 +668577834 +201619975 +3975640730 +4251836727 +2535319495 +1123597689 +1185558880 +1066680294 +1648789517 +630483075 +2677013069 +1679082605 +1758638582 +1201702725 +1630583948 +3160143025 +3679244768 +4105970769 +2405073664 +4219078030 +4170606146 +560466872 +4164661322 +2481183022 +1855014004 +2382914325 +2580139681 +2938404297 +341224329 +998147048 +2728601245 +3863237289 +1040290322 +2463953671 +2301117105 +279264763 +905349829 +2483597707 +671313970 +2199289224 +3537551704 +3290408152 +1832507197 +2135893976 +3526258178 +82165406 +4228721514 +29122496 +3100417180 +1437811140 +3408207732 +3295197549 +1939906747 +3558321612 +771646127 +2357260784 +3617640287 +2931313177 +2795494888 +1475409812 +2270297037 +373238097 +145104198 +1203449238 +3147945685 +1287422970 +1708864971 +3810557898 +3824874262 +358485834 +484627583 +1817136936 +2320518268 +2353105598 +2435112714 +1898580108 +3110158713 +3070727809 +1741604120 +3148335737 +632635807 +3716044032 +1355092873 +2209626681 +3343351259 +3309567489 +1794624322 +2153376046 +1292275448 +2005876782 +2306320691 +2784073952 +150560755 +1746679278 +1415520119 +4232385111 +1234410751 +1027994325 +3193852994 +3512998795 +2899607158 +573703198 +4270532226 +1478169991 +3369978151 +3064172272 +1354241469 +468456273 +3722328746 +1349187311 +1169880966 +43411398 +541882703 +504248883 +2776787366 +637890010 +3238985962 +3254113452 +777408357 +3936225732 +2149491253 +613286409 +593490162 +3250367716 +645078780 +3665023976 +2671292421 +4139920409 +1010386665 +1545640421 +240768646 +2147360438 +314118952 +2939335800 +231293007 +2451017202 +743737993 +2475695906 +3105384417 +3000175106 +793378528 +2334604573 +2085445033 +99483760 +3514360729 +3194767500 +3161559887 +209329820 +919948349 +1848864455 +3400785438 +405668389 +226804376 +3000187426 +2891504067 +3175465444 +3537012738 +2676856186 +760847874 +1712267558 +1746315012 +4005464293 +4293802191 +3540962696 +1180422881 +3657904196 +3594133682 +3953496676 +1669999873 +77369717 +2107719787 +3907527567 +4047382516 +2920893943 +1938849395 +1531105812 +2949210071 +3010388930 +1941473765 +1172464846 +321667517 +1009684340 +2947010391 +3828451376 +1914358863 +4202913050 +552743572 +2680534739 +806125083 +3638245651 +3323754880 +2274296243 +4002194679 +1987003484 +1787712180 +4204018035 +2268578178 +3073670346 +1883931273 +1002385416 +3982049098 +1127540999 +717472303 +1032332801 +198454634 +1837969909 +2149498356 +3857245402 +3673960861 +3855257644 +242163199 +62290772 +2239708349 +3270896179 +1671631658 +2535761498 +1314902854 +3985978870 +852497043 +1754923538 +3546575893 +2411653554 +3540642652 +2915407795 +1432771915 +984882135 +979698464 +3665711494 +3676632206 +1842527588 +391349251 +3794716484 +298482301 +2417502643 +560803584 +3792650301 +2685077004 +2377811223 +3237932437 +1495574946 +3699540283 +2438149291 +2424706863 +3638658353 +1824397128 +3312042895 +3176731469 +1863565847 +1182137677 +3125816748 +1082122131 +3184720564 +1702942447 +1736721248 +1786047117 +811102657 +45272591 +4242097113 +3147986842 +2810655042 +1350521188 +2805899446 +610616862 +2269842159 +3139143315 +3130431806 +2197970925 +1259326172 +3512272612 +1072708648 +3294408806 +3539201476 +1165384573 +369571060 +2818198859 +1612857273 +3886959570 +777832482 +589063105 +4247125072 +3198088565 +1139303397 +1765880470 +3782887815 +2527708144 +3736260674 +3962306046 +3795917941 +3802264824 +2248122671 +3911880659 +2575883393 +3676866659 +1942751699 +2515053386 +3190779923 +2293493190 +1726695284 +1848189624 +3981844492 +3727045854 +3573786379 +1205708913 +1352515479 +2484621019 +1701943601 +3042628333 +3756913890 +3754244896 +1748970673 +2197594500 +4016865674 +30648917 +4178336172 +814383984 +4021658367 +3244807855 +821048037 +2429115881 +1630677 +2883694327 +1576837560 +3312570387 +2232918640 +3202515940 +2852776265 +3243860354 +2960618591 +1272212522 +386149039 +1696272380 +737170071 +3077642563 +3153935123 +2424612444 +3426471013 +3874152499 +2529563586 +1908205192 +1895792526 +3968983807 +4181675842 +3173318695 +3891222097 +3511780041 +3774885167 +1231000516 +268867381 +3430843525 +1607114329 +1152411842 +78872116 +1615172996 +568102712 +3852036678 +2906091875 +2487751274 +1458134676 +921788241 +893691332 +4093462991 +2629300973 +2255251926 +1736095068 +4049894137 +3549415321 +227474446 +3723953367 +554121293 +2768425672 +2941802615 +754005926 +3208292543 +820661713 +1638636594 +2877326654 +3773513951 +3804856539 +3974142790 +97437780 +3297479383 +4124576685 +1153254233 +2783873585 +1844735116 +1245509183 +2323235929 +106141933 +2222765144 +1635864909 +3916062122 +3336139553 +2673725081 +3849900294 +4243935165 +1233105603 +601968535 +3300172697 +3655340651 +1120988159 +2379107162 +1217249828 +1904413614 +787848120 +2181219751 +1335881685 +1406108637 +1292851273 +3524091113 +3908648789 +912628047 +3656817000 +421616813 +1587683698 +226606498 +1303162415 +2336387639 +414746058 +3906109461 +2873763573 +3220461520 +3361278613 +1341822081 +2037590094 +1158979678 +3788174236 +1677812733 +1793275460 +11513390 +2255597121 +3599462653 +2667101606 +3948010174 +897149933 +2747444033 +1439579621 +1419865035 +550393454 +3653617360 +277627245 +1166550819 +1973491000 +1202322695 +142794836 +1071364915 +1948505279 +2555012474 +3263116841 +3475325755 +31485500 +4067848109 +2347710852 +3261656895 +3030749337 +3767578525 +676730830 +2286086919 +484219005 +756931786 +2199532277 +2801465280 +2730220613 +1790285377 +3659068847 +2996635398 +2403867722 +522435194 +2316722272 +2101553477 +1965151143 +2228829069 +157728167 +2755788580 +2653394299 +1567850574 +2263727674 +795961373 +1320201478 +830340576 +2358857202 +2820085529 +1215440120 +2706308359 +2997217038 +1342588616 +414358041 +1176209934 +2762091374 +664750965 +1571365059 +851968097 +3840137192 +2220717735 +844829939 +2510032654 +1523891002 +1458199703 +3703065183 +3410406664 +3768489927 +2573454198 +4063668688 +1651207092 +1823567233 +1947583429 +2783918849 +458104066 +1459927173 +2245957955 +3264630060 +1487407047 +1506087954 +2110635965 +4103080592 +1869932125 +3575090973 +799989423 +3698547977 +832528613 +2867171463 +888021838 +721429830 +2054881707 +3502563533 +2095968609 +749406934 +1721408477 +2821041966 +115970313 +107143994 +767875364 +2658898470 +3459815862 +642742119 +1465686492 +3107415597 +3760711885 +3255644132 +3005079269 +2815874886 +1435646202 +482021522 +1881561319 +192572615 +3642845822 +3829667776 +1745087220 +4048912059 +1124604254 +1842583491 +1001791989 +826768309 +3466039674 +1464129994 +527375475 +901055550 +1149649866 +2321401144 +3755048837 +3462129823 +4069525988 +2106685820 +1545334581 +535464594 +3308539909 +722564964 +614722912 +3680203555 +3707706706 +435304012 +2413600856 +368431186 +3512204806 +1886559157 +2432899868 +563322935 +3075115590 +183384060 +426572827 +803818859 +3039329339 +3504330494 +2000780022 +2789655050 +40260938 +1802440166 +2953065887 +810937877 +1219815957 +729425635 +4214054197 +250849959 +3332845357 +241647959 +990067371 +844342662 +2325057594 +646551864 +2754321913 +1350646705 +3848953796 +3255756824 +2293588539 +1315602968 +4293362602 +1010821015 +1413511860 +3342927606 +4245149978 +177973272 +3716087031 +646732513 +3134659418 +3731750657 +110239033 +1895046372 +3343268524 +322461707 +2909156252 +3943185415 +438966344 +454621581 +360318118 +2117814934 +3793241905 +1354768585 +1335328350 +362173598 +2753064895 +3896534733 +354716536 +2434220261 +1014408654 +2481419199 +1931437026 +1650384808 +3256944447 +2263577200 +2640421592 +2877764687 +3167973437 +379622190 +1644056211 +557090343 +2389744095 +330584955 +1392005969 +1775180708 +1518169383 +3909400964 +1038181507 +1179345120 +827866398 +2541914063 +1804567473 +3077949744 +3317711383 +2795913579 +292052429 +3276851815 +2099733707 +3479892307 +2354108868 +2936575537 +3263296872 +3839119323 +3542097937 +3357084214 +2998219139 +4288311723 +2976737709 +3672286984 +1888838763 +2611686645 +2018700648 +1312750005 +985349720 +1021167204 +2444080756 +3817670201 +160452112 +3825566107 +996298136 +1064492627 +2744516097 +492942930 +1233879253 +274534957 +4018317915 +3992163477 +2674868744 +60260087 +1471234432 +1753065244 +1712371127 +3944049981 +2202160274 +93148526 +2991262027 +2537150703 +3939311388 +2547416547 +3400901005 +1837952134 +1475361329 +276760840 +2834311945 +4273971852 +2963896838 +1032781578 +2679477920 +1631961839 +1774754839 +2298558375 +3711001931 +2704592232 +1968149586 +933945870 +2410503612 +642742352 +842872998 +1081593216 +359616533 +2985353885 +4119707080 +3102159912 +3538303479 +2027335645 +3705801980 +3589776716 +1736637618 +1508759852 +3964638258 +760173274 +1819862992 +428117135 +4009334080 +1314275854 +433755871 +771729011 +953467825 +320921020 +461122149 +3152728836 +1732278072 +1424297115 +2121765153 +3845517433 +655658050 +1922445038 +1741818379 +658772038 +2484964372 +3062772230 +2959213709 +863831380 +2674064850 +2739100444 +497238521 +647325075 +1507128668 +2163397022 +155514468 +39998512 +4241888673 +2314420490 +3204845808 +3234320347 +656988874 +4239379393 +2327513971 +1506864761 +1087226519 +2816236003 +1430208384 +2830207360 +2623168185 +2739750532 +3309914686 +3031190171 +2121738596 +3723928359 +3580703826 +2061078820 +1869837261 +3107333026 +3866569471 +2145977940 +3830459788 +749702072 +1999419607 +1976157905 +3350382542 +2218094216 +3696025040 +268624846 +3345496717 +1427276974 +3678534722 +50161221 +4073974376 +1095145658 +3511786899 +1737413872 +3825719949 +2641594474 +4232536063 +1826546834 +1308612763 +3428528776 +1421794699 +2622003254 +1929247528 +402163804 +1428596032 +3421094313 +2537226306 +300616022 +4092375773 +1030019295 +2402643031 +3574662640 +1009559920 +2386636536 +1248345367 +2830937543 +1432172777 +4119938779 +629372488 +2615090427 +3167546757 +2009394699 +1033623051 +2126048518 +2432148759 +414459683 +2311344848 +321615538 +2614034375 +2265803041 +821049197 +2495833769 +4027737508 +3357052485 +1929438975 +84042293 +2012711441 +3757965808 +1285542084 +2179749595 +3399873284 +1041964885 +1072688326 +1471301955 +3661757383 +3673517948 +1469551272 +111814458 +1193322423 +4294129911 +1722053043 +3389456910 +3034623242 +313685491 +3498835391 +2725795163 +792852118 +1165990085 +477953420 +969934732 +978126462 +2872351117 +650934675 +1103907536 +475777613 +1505581549 +497158132 +3590869676 +4235372960 +2557725244 +2338373128 +945347843 +3930977220 +41070193 +439000825 +3874657293 +2524530374 +1772001048 +3039426648 +1362710736 +815839122 +1435126051 +2971989262 +928184841 +2052590414 +1069888576 +3845273864 +1697527880 +3007747575 +2829980650 +3678147787 +747439057 +2150784953 +1864013843 +3139457259 +3626109310 +1648704635 +902497634 +131052180 +19538588 +4066790377 +1975612807 +310624641 +3771810310 +140254235 +3430576182 +1195291631 +783677963 +1322455698 +452551357 +4143456547 +2969205842 +3086432128 +2231505721 +3429192351 +1405783623 +3055309397 +1076705841 +2355568530 +4029609084 +4199284192 +1846012869 +2913978022 +2674068331 +4173563046 +3394945449 +3994866650 +4050555568 +1478360964 +686562872 +3382425147 +2796264598 +3855328401 +3180659750 +2489087350 +649216031 +1765932086 +2568550456 +1896304672 +469604984 +2938620288 +951642020 +2687931526 +3308188406 +632853436 +622722437 +932661297 +3136340365 +3875505837 +4177334263 +1477319509 +3537839986 +4127841284 +14703365 +1780700061 +2869269986 +4249813649 +2346768584 +1497843649 +1760139418 +2671399241 +1217296879 +2889879227 +1632548423 +205192667 +1612556576 +3636769341 +3159255368 +1036683124 +1045653521 +1466630807 +3966436154 +2559333245 +2967067738 +2715751022 +2153907312 +4188459978 +3874760149 +1069885184 +2467805962 +2459969269 +1421737635 +2891280023 +1522991069 +1984680560 +3860693213 +2516797564 +3641682582 +2716837137 +1604891797 +4131627134 +3501277906 +4234390954 +86650570 +2550528758 +1442962772 +748952443 +4073879385 +1946403965 +3755905514 +345903119 +4059069503 +1012504148 +3733105834 +1689107990 +889997706 +503173829 +1569409817 +2107544919 +2582998581 +1008536342 +1045692649 +3346797164 +3537310219 +3535546479 +323203622 +3364306637 +1221241982 +3842498086 +108490471 +336356236 +851760096 +4188074570 +1225538520 +556910391 +138588392 +2346397872 +3841745359 +4123797156 +2362076708 +906732144 +936777559 +2894361693 +192754320 +1711268461 +1307154606 +2168618277 +994638931 +802805192 +1296205379 +214412975 +1227517035 +1135502033 +107252367 +1451578797 +4184772990 +2053665319 +2075940582 +170040113 +2418063894 +3986874895 +4016588945 +4102306616 +1377065531 +3165388235 +1798950222 +1369764025 +1373427611 +1208744820 +3616050928 +4258307005 +2073006940 +1906344534 +3069371985 +2473476849 +1566493255 +2928485521 +4168363623 +1522903800 +569908344 +1394418387 +3306445201 +2764912099 +1198849298 +2591086437 +1229294953 +3593237304 +3158068266 +545060772 +3630110382 +4046647412 +684687430 +3210415432 +3667391863 +2809327761 +319310372 +2255820478 +4019094602 +1434913739 +176726805 +3742896851 +1209122351 +423482621 +2283621941 +1697214908 +3982098841 +3119631351 +1214760809 +3670223782 +3572267424 +3960534795 +1988839256 +1385931971 +2282704582 +2374358825 +3065639610 +432131062 +3811823590 +3128266903 +2580982438 +2729361015 +375465320 +2555715066 +1137356754 +686570593 +3897256818 +2622951346 +2632233258 +128690079 +4203391975 +2146405201 +1548107179 +2729830230 +3354459722 +2193794789 +982807096 +3667061550 +1864245005 +2790608796 +3079972515 +652632964 +3593000533 +2577500895 +3087171535 +3166555356 +1958028182 +2434123269 +989337448 +291591490 +671807319 +2675566760 +3480770367 +3813308525 +2308083457 +648604816 +2698830246 +225707511 +96980645 +3456204247 +1483386727 +3074735899 +2602970674 +1154362357 +2765066180 +379652979 +3734491417 +268634966 +162117467 +782125888 +127885344 +1938597353 +4081886656 +1704433350 +1930452096 +2307910644 +1260456313 +234352000 +2709210556 +249364111 +3894968516 +2524918380 +3428335561 +2096546394 +2420689378 +886380180 +1392937966 +837642190 +1913611157 +1842634191 +972866535 +1174752698 +1618834792 +1783188248 +1186876694 +2656066126 +1105658971 +456654574 +3242906387 +1771708709 +3196415747 +3442840467 +1399912378 +905721945 +2771280787 +2672431696 +73573641 +4076068229 +1577051681 +940525325 +3442145465 +2056010480 +2995680464 +2308226944 +3414431549 +350983020 +380717290 +1896814877 +4203320568 +2140176585 +1093356680 +2317777436 +4217480917 +2926940732 +1131371703 +2543577757 +3312084486 +4026135506 +3181297767 +1400838689 +4199780720 +2127605342 +190581734 +3367983425 +2520457529 +827112341 +3311442840 +3647325222 +3086339083 +2526101688 +3544280103 +43098543 +1062164878 +1299274590 +346684094 +3620422820 +2427990251 +2058925026 +1831738821 +2160068965 +259341914 +2851651099 +3967241974 +2859814399 +4287416308 +3045031609 +796193656 +1521709496 +2203498461 +3038900931 +1495027375 +4288107146 +60168310 +4150045696 +1544410816 +527940897 +1697578619 +3869568837 +1096179468 +1417666233 +1620656711 +3193924938 +3435315846 +3178075257 +1357013790 +1236597904 +1019090016 +3650314098 +1994560435 +1178550642 +3897822831 +2081107576 +2668258198 +2723384316 +3410787297 +2471812090 +2208256286 +1188411410 +2958541194 +2250672850 +2729583582 +4271347217 +3357053193 +256251708 +1380689704 +2341841341 +2457891776 +484294031 +2891033717 +1764612950 +655951011 +411593760 +996949864 +199452963 +2379941764 +566099460 +2904287949 +180849287 +2786050480 +3949342853 +1947289715 +1162436939 +2594822735 +409153181 +2522048043 +1881499536 +3665783612 +1737304298 +2448528685 +4021116354 +2155714296 +3927005866 +2916813710 +641039166 +857947414 +3024613418 +547768614 +1630265725 +1053090128 +1536291133 +2948248263 +4544826 +480337307 +1823910283 +1436396079 +217151838 +2121472296 +514837070 +2531584073 +4127487337 +3920452823 +1321403993 +2623122114 +3699773365 +3583787828 +1194683458 +977468293 +1866683686 +723288596 +1076232422 +1928452230 +1738877256 +1620628753 +1611163489 +1659260626 +2916449807 +9607824 +1423322338 +3742439235 +619101443 +1381116109 +2402661641 +3291662392 +2262992977 +112522387 +1016552684 +2687041852 +16590652 +2479017913 +1698009570 +543003626 +3206932020 +2362965247 +197064949 +2683077597 +2843268821 +966670814 +3794566136 +2550237309 +3050642072 +3018017116 +1233394953 +85857325 +3503558327 +1124696296 +1425364397 +3129668566 +445835523 +634736838 +3705742433 +2258483110 +2813719074 +2746139666 +2746176509 +1236691129 +690529152 +2651081556 +3986923223 +2901033691 +246402282 +3293496782 +2533979990 +1002994705 +2760990227 +1566386166 +2159026112 +2089336265 +1220646875 +971187813 +3806949624 +146856580 +2714506187 +1619115712 +704303694 +4129845994 +4067516017 +1656597150 +235952856 +450828891 +909393563 +4190593805 +2975093709 +4029669235 +935397164 +3020319922 +2682221411 +2655730248 +4191665392 +3155385789 +144024820 +2680222599 +1861701557 +993545297 +3433606395 +1279384155 +3439500931 +2796860889 +4113059215 +3477854778 +1400148242 +1716607618 +1517382925 +1255787279 +682998979 +3190693246 +925873818 +851640528 +3779948754 +550897061 +2592785710 +3524580474 +2757152653 +3251452261 +2044590017 +1277277575 +2389524713 +3346744905 +384309164 +1807042051 +2052941519 +814108979 +2489360199 +3693513898 +4008360493 +983475868 +2283863441 +4119853686 +4091468853 +1785727230 +3733867029 +4215646218 +3591826185 +949754527 +3040695745 +3317046560 +1040226994 +420435368 +3046239126 +3605111368 +585997752 +2367624150 +1063432639 +506371613 +3537832756 +4109431542 +3045185865 +2494519092 +333807286 +2021397217 +1048494684 +3536829388 +5925694 +4001805999 +2657099112 +2391973310 +1220198782 +187854061 +1809644595 +4256039763 +3521929975 +3099979282 +3123954121 +1362950112 +4028018381 +756356850 +3228431838 +3589514660 +441226538 +3872128730 +2416574708 +1798533263 +1919924008 +3914669025 +2514913950 +2275205238 +797402889 +4207995118 +326466310 +2528164685 +2657206680 +1301116937 +516401801 +3120409631 +1439123768 +2446200769 +1202412782 +2532719467 +4078760919 +3030418481 +4209133810 +1525724471 +66929599 +2015272900 +3039420031 +2483306352 +4163510888 +533565591 +1574786985 +44175917 +488165013 +2113986102 +2533711108 +3652224958 +3704307714 +2534601485 +2185303970 +3833779119 +2052939920 +3096064009 +1090978723 +3491773841 +3651980967 +3220865993 +1843923513 +2601736268 +3331580048 +994602956 +819692871 +1941912763 +867949714 +1554943970 +2598552386 +1784919730 +2574113993 +3864496522 +3493553794 +358627478 +2620106464 +2280057081 +3431019389 +8681985 +1075138026 +3716336177 +1626816162 +2086710847 +3711073953 +2048728761 +2262766454 +983687106 +57843311 +156212852 +2788450450 +585411433 +3306924119 +4000948681 +4160734368 +3185371862 +619438071 +1091996534 +909994702 +1941284518 +4040651466 +4275502885 +1421634123 +2709291097 +3979033949 +1453545950 +2078133916 +2421700549 +2983592477 +912240990 +32501539 +1919323061 +2430823579 +1583494737 +456395793 +1112894738 +4073066779 +1317674801 +848631027 +81163773 +201493910 +2743921984 +47644241 +415794744 +3895019014 +655125800 +1104117392 +4047321166 +1691817026 +1256060507 +2057841357 +182195390 +2145453882 +2376399530 +3799121114 +1687349411 +4239527539 +312702550 +3699924345 +980640622 +3455654763 +362355377 +2639366037 +3867751773 +2690670739 +3352077513 +1021525852 +4010280386 +2699635849 +2016225971 +734476414 +4119586636 +461617616 +2662184298 +875960735 +98116498 +4260837713 +2896406263 +1412127820 +592731846 +74205883 +4216389857 +3684945793 +293881971 +3797147805 +4098220832 +3543167619 +422337481 +860410884 +1000806237 +3667146701 +2688478547 +2149318143 +1256478717 +1765437153 +2853032876 +553743688 +2263713523 +2797882505 +1611784785 +4008107453 +3357908480 +2066366343 +3666395546 +3003557890 +3419181997 +627263719 +3251928923 +2914460490 +1838044466 +1116220002 +3141537749 +268606457 +1378182521 +2301708546 +2692270655 +1112358384 +3288637192 +287284081 +418175848 +2783272652 +1832994196 +4019155722 +3447520291 +3725411851 +185961690 +1616723639 +2281390114 +24723624 +202332214 +3487628343 +3896666185 +2414645761 +2559902909 +898800082 +1731131451 +1309131274 +2796908053 +135301914 +4201114689 +4202423305 +3014286823 +800458814 +2457426475 +1074075292 +375662802 +3254488826 +3206371271 +591814155 +3915941409 +166632850 +4211442599 +1688025836 +3118913086 +2832167515 +3317167602 +2797704316 +2201511188 +2761599312 +973935537 +2539446465 +1540421784 +2961358757 +3926128478 +3720311229 +1110323772 +1701005300 +2288746317 +51754297 +634794087 +3836834840 +257438877 +468247098 +2140849186 +591376344 +152410514 +2563294784 +3187361892 +681216511 +3789138972 +470364536 +3785126022 +1809489669 +1740557599 +88675917 +3483745176 +723379522 +3500073841 +3901622860 +1626328462 +1066909070 +1276380429 +245734004 +522623178 +3976666732 +3611578357 +4144186790 +3863106468 +3679250388 +1419673021 +2523788070 +1361838109 +3763303753 +1533853442 +1916240136 +657136291 +1572562483 +75177333 +3314855337 +3687198868 +756423119 +979072315 +3062681149 +2660208801 +2396764954 +1616591993 +1862900712 +1798792955 +2563429484 +691009202 +2690536081 +2605519353 +1451829335 +1337755668 +4122939591 +423600858 +2368200938 +1770159874 +630655247 +2919806484 +1686323224 +3764830808 +3666452744 +3754766404 +2368679209 +2381190276 +3244441465 +293822737 +1148866304 +3169843732 +72898389 +1873971794 +260318628 +4186972197 +4143384819 +539963134 +3802555726 +3238273819 +1230088268 +272362039 +3068300620 +1453458732 +4180178797 +64540786 +3007517937 +2905918988 +1589032690 +1779490414 +1053176264 +3634412787 +2852197021 +4252339805 +1974706770 +173750364 +442094662 +1787112918 +1554414530 +3987022170 +2316005475 +1001713270 +2351059849 +3128924877 +3353757427 +2360637748 +2952423703 +513292762 +2231010615 +1944671525 +4090007580 +2486535858 +974107844 +1354115708 +2222288417 +2346483033 +1508234101 +557036436 +2877530492 +2809062250 +4141665649 +1246119530 +2619957350 +2693893332 +3564235791 +4115443541 +404342050 +693464453 +1769572708 +728437813 +585807213 +4110041715 +1573959724 +575205405 +3595140224 +3521035952 +1408794797 +1733675737 +1822501973 +2770382496 +4109408653 +960674086 +72933496 +280970587 +1066333672 +709471984 +1496904716 +1748639696 +4293714565 +1038612537 +1446748786 +1274966880 +1149113484 +2142501232 +3610667607 +202256502 +2963987093 +499228278 +1268635386 +2617768678 +3327973261 +1268937836 +4290463523 +1954777581 +4083562623 +3842190942 +532863772 +4050091422 +377022836 +2927281276 +695676359 +3259924869 +4000308167 +3134350526 +1944471538 +1573382886 +342634845 +2809585505 +572027065 +2036890627 +1279988514 +1732192917 +1398390554 +988172833 +2071762561 +3720778444 +1004642434 +4274768958 +1921826994 +3884146192 +3213320865 +4254172836 +2852170291 +1689348646 +634185703 +2864233247 +3666616638 +1955965287 +3647438155 +1235538333 +1298366500 +4057864 +599332391 +2695947983 +2543248388 +3691810639 +2458923978 +3150501918 +1717061788 +4048224861 +2328195480 +2534436250 +1549205792 +4010004281 +1497055831 +1008640225 +2866438780 +165089977 +1137128194 +3731172953 +3231695590 +3184401575 +1359377703 +2244328339 +1302197120 +3259820326 +2636049985 +1489007233 +4220317654 +3686252922 +3356397961 +1947919652 +1238954762 +4182275442 +4263806246 +2982927003 +4210689153 +1810767444 +122020046 +4172832613 +206741283 +4260511768 +3577150024 +166581813 +1219377852 +1829779835 +4263240209 +4069026901 +4233581059 +3060594888 +429656485 +3681931268 +3894652311 +3546080434 +4268732684 +1190665490 +1165952672 +3919735250 +3550581189 +768384218 +2082176439 +3673914692 +1732789241 +869979440 +1968958465 +2643608487 +2577804135 +1534059921 +4017664130 +1079152925 +960236142 +2225597659 +798114930 +1839760720 +971003057 +2788920785 +395697651 +2440244884 +3082714497 +2779571075 +3268858467 +2532290032 +301154006 +4175568237 +1241102357 +775563276 +1490174146 +2702156777 +3653082642 +831274288 +105980315 +345881168 +26235453 +2564688774 +3751988942 +3416802831 +2486450451 +102682152 +2856455936 +288831755 +2322664205 +622945223 +654303825 +1531064776 +3988351586 +1121695785 +3479880689 +1946053934 +1749303636 +1943850349 +1427293593 +3081375949 +1587870746 +3102073336 +1786034024 +714693431 +1172534455 +479302607 +1483021974 +1699228912 +172505982 +2886039316 +4072154283 +758399873 +3205946373 +2512439691 +2405715873 +2820064598 +162133001 +3739900635 +2645851237 +1649313846 +2510058622 +2328652997 +1488088457 +3369703476 +3494767680 +3381476904 +4055302653 +1604234824 +2655233587 +522086614 +4036375811 +29402942 +1737194505 +1543069873 +932465208 +82375551 +2931286844 +4150201357 +1696333980 +3892714892 +1246739162 +1191378500 +2886582209 +3730095293 +4152307202 +2891250669 +1111780501 +681123710 +2122885843 +2702662468 +3066329673 +1790305884 +39801420 +3535277523 +1401872800 +720450550 +2541254183 +3118309828 +2737702438 +2678971228 +3073480779 +695233935 +225536466 +3242034192 +3348531610 +2160931698 +1345377208 +2422668467 +341814941 +285754034 +2058724763 +4207222214 +659540072 +3826032203 +1708910605 +3875108972 +1881686668 +1824463384 +1643022017 +186199390 +1446862923 +731133117 +1725762681 +367521914 +495998514 +1150820911 +4080466267 +1816093426 +389718925 +3775236958 +442252791 +840520303 +2843344613 +4222843729 +3366449401 +2142402737 +2240895204 +250610674 +2130563415 +2899313971 +2693238329 +663575081 +3098514941 +388418518 +2328306820 +1471835105 +3044599854 +377714408 +880987740 +2703334856 +3646918425 +4196054536 +1049612092 +867486951 +530868554 +3174854197 +2389700125 +455242512 +3662454679 +2691007714 +2100192620 +797302076 +1445609229 +1527074721 +3531527925 +2921108405 +597487302 +1061767068 +3555471078 +2094703631 +1936268646 +1645611122 +1435652967 +1384130335 +4066478464 +3467504269 +2875542555 +19650294 +3289781908 +3306026504 +1936990085 +2746195468 +4103362556 +4187925416 +91282968 +2232225910 +2218205635 +2602675329 +3880613183 +3733526634 +4015464775 +2940103964 +3633449805 +2222100003 +1310934219 +3385403625 +770480866 +2816772122 +2119019982 +1160922696 +1429347785 +1513635899 +1024866089 +147068340 +3742431667 +2993386300 +2652673274 +2771105597 +3760404279 +2323505008 +2113703013 +3781841393 +2631981897 +2133388362 +2792358112 +881109110 +1401152779 +484719121 +1310413364 +811593585 +1447438491 +834888786 +373214476 +165970625 +2185208742 +2958577917 +2671089987 +3250880403 +1115436396 +624856979 +2165577655 +2592119612 +775227040 +740832145 +3673169441 +2584938655 +2246126392 +55545992 +2385320892 +780808140 +497821964 +3705382535 +1484365356 +927887451 +1632352584 +2961244003 +2124390162 +4148267467 +3237430772 +367790344 +2999893878 +3244496621 +2044692506 +2319623025 +3441750759 +241244872 +2211020188 +3784523176 +1853820916 +3660205298 +2185773305 +1774497013 +4276182338 +3159111009 +578229621 +2366239960 +918562559 +2072523050 +299171320 +820254181 +2921970716 +2053245979 +1427216469 +2998044702 +919479073 +408316139 +278268733 +3252080692 +2200669628 +2416843468 +414557415 +1761558718 +94898634 +1513890548 +3574207097 +1478460888 +336147789 +3640363661 +2492395346 +1153414810 +1381044458 +3962133256 +3464413806 +2636622271 +3001876335 +655113965 +1346386461 +4039013819 +2072355938 +5256070 +1386514033 +307330504 +4267282814 +1097093402 +1693308967 +1579045984 +2666125903 +3670369723 +207554654 +462579107 +2950520985 \ No newline at end of file diff --git a/RHF_64/router_mega/main.cpp b/RHF_64/router_mega/main.cpp new file mode 100755 index 0000000..457a3a8 --- /dev/null +++ b/RHF_64/router_mega/main.cpp @@ -0,0 +1,261 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Generator.h" +#include "Tester/PerfectRouterTester1.h" +#include "Tester/PerfectRouterTester2.h" +#include "Tester/PerfectRouterTester3.h" +#include "CTimer1.h" +#include "CTimer2.h" +#include "CTimer3.h" +// #include "Performance/Performance.h" + +//------------------------------------------------------------------------------ +using namespace std; +vector filePath; +// Resource memory calculation +// typedef struct { +// unsigned long size,resident,share,text,lib,data,dt; +// } statm_t; +int listdir(string path) { + struct dirent *entry; + DIR *dp; + + dp = opendir(path.c_str()); + if (dp == NULL) { + perror("opendir: Path does not exist or could not be read."); + return -1; + } + + while ((entry = readdir(dp))) + { + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + else if (entry->d_type == 8) + { + string filePathName = (path + entry->d_name); + // fprintf(stderr,"%s\n", filePathName); + filePath.push_back(filePathName); + } + else if (entry->d_type == 10) + continue; + else if (entry->d_type == 4) // this is a folder, not a file + { + listdir(path + entry->d_name + "/"); + } + + } + + closedir(dp); + return 0; +} +// statm_t getCurrentRSS() +// { +// statm_t result; +// FILE* fp = NULL; +// if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL ) +// { +// fprintf(stderr,"can not open /proc/self/statm \r\n"); +// return result; +// } +// if(7 != fscanf(fp,"%ld %ld %ld %ld %ld %ld %ld", +// &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt)) +// { +// fprintf(stderr,"wrong information in /proc/self/statm \r\n"); +// return result; +// } +// fclose( fp ); +// return result; // in pages +// } + +// int RoundUpPow2(int val) +// { +// int base2 = 2; +// while( base2 < val) +// { +// base2 *= 2; +// } +// return base2; +// } + +//------------------------------------------------------------------------------ +int main(int argc, char *argv[]) +{ + // struct rusage start, end, gStart, gEnd; + // getrusage(RUSAGE_SELF, &start); + // make sure two args + if( (argc<3) || (argc>5) ) + { + fprintf(stderr,"%d", argc); + fprintf(stderr,"Check command:\r\n"); + fprintf(stderr,"Please specify the router n = 1/2/3\r\n"); + + fprintf(stderr,"Report construction time: ./Generate n FolderPath\r\n"); + fprintf(stderr," terminal print time information.\r\n"); + fprintf(stderr,"Generate function: ./Generate n input.txt function.txt\r\n"); + fprintf(stderr," function.txt will be generated.\r\n"); + fprintf(stderr,"Test generated function: ./Generate n input.txt function.txt -t\r\n"); + fprintf(stderr," function.txt will be tested based on input.txt\r\n"); + return 1; + } + // Check n is 1/2/3 + if ((strcmp(argv[1],"1")!=0) && strcmp(argv[1],"2")!=0 && strcmp(argv[1],"3")!=0) + { + fprintf(stderr,"Please specify the router n = 1/2/3\r\n"); + return 1; + } + + //////////////////////////////////////////////////////////////////////// + // Add more checking logic for bad input args + //////////////////////////////////////////////////////////////////////// + if (argc==3) // compare construction time + { + string path = argv[2]; + listdir(path); + + int fileNum = filePath.size(); + double accTime = 0.0; + double maxTime = 0.0; + uint64_t maxStorageCost = 0; + for (int i=0;i maxTime){ + maxTime = curTime; + } + } + fprintf(stderr,"Maximum storage cost is: %d bit\n", maxStorageCost); + fprintf(stderr,"Total time for all key sets is: %.09f sec\n", accTime); + fprintf(stderr,"avg time for one key set is: %.012f sec\n", accTime/fileNum); + fprintf(stderr,"max time for all key set is: %.012f sec\n", maxTime); + return 0; + } + + // import from input file + const char * inFileName = (argv[2]); + // define hash array for input hash keys + // uint32_t key[10000]; + uint64_t key[10000]; + int port[10000]; + int ind = 0; + ifstream input(inFileName, ios::in); + string line; + while (getline(input, line)) { + string l = line.data(); + int len = line.length(); //strlen(line); + if (len == 0) { + fprintf(stderr,"no data in current line, check %s.\r\n", inFileName); + return 0; + } + else if (len > 20) { // check the length of IP address + fprintf(stderr,"string %s is too long \r\n",l.c_str()); + return 0; + } + // uint32_t h = atoi(l.c_str()); + uint64_t h = strtoull(l.c_str(), NULL, 10); + + // int idx = (int)((h << 51) >> 51); + // if(idx == 8191){ + // fprintf(stderr,"h: %lld\r\n", h); + // fprintf(stderr,"lower %d bits\r\n", 13); + // fprintf(stderr,"idx: %d\r\n", idx); + // } + + key[ind++] = h; // load the string hash value + } + // system("pause"); + + // fprintf(stderr,"Hash keys loaded for file: %s\r\n", inFileName); + int nHash = ind; + int nHash1 = (int)(sizeof(key) / sizeof(key[0])); + if (nHash != nHash1) { + fprintf(stderr,"num of input keys doesn't match. \r\n"); + return 0; + } + + // get port number, default 1-4 + int count = 0; + while ( count < nHash ) { + if (count < (int)(nHash/4)) + port[count++] = 1; + else if (count < (int)(nHash/2)) + port[count++] = 2; + else if (count < (int)(nHash*3/4)) + port[count++] = 3; + else + port[count++] = 4; + } + + // uint32_t *hash = key; + uint64_t *hash = key; + int *pn = port; + // Test the correctness generated function for Interface Mapping + // or, Generate the function + const char *funcFileName = argv[3]; + if (argc==4) // generate function + { + if(strcmp(argv[1],"1")==0) { + bool gFinish = generateFunction1(argv[3], hash, pn, nHash); + } else if(strcmp(argv[1],"2")==0) { + bool gFinish = generateFunction2(argv[3], hash, pn, nHash); + } else if(strcmp(argv[1],"3")==0) { + bool gFinish = generateFunction3(argv[3], hash, pn, nHash); + } + } else if((argc==5) && strcmp(argv[4],"-t")==0) // verify function + { + if(strcmp(argv[1],"1")==0) { + TPerfectRouterTester1 myT; + bool tFinish = myT.Test(funcFileName, hash, pn, nHash); + myT.Close(); + } else if(strcmp(argv[1],"2")==0) { + TPerfectRouterTester2 myT; + bool tFinish = myT.Test(funcFileName, hash, pn, nHash); + myT.Close(); + } else if(strcmp(argv[1],"3")==0) { + TPerfectRouterTester3 myT; + bool tFinish = myT.Test(funcFileName, hash, pn, nHash); + myT.Close(); + } + } + // fprintf(stderr,"pageSize: %ld kB\r\n", (size_t)(sysconf( _SC_PAGESIZE)/1024)); + // Get statistics about the performance + // getrusage(RUSAGE_SELF, &end); + // fprintf(stderr,"Peak resident set size: %ld kB\n", end.ru_maxrss); + + // statm_t result = getCurrentRSS(); + // long pageKB = (long)(sysconf( _SC_PAGESIZE)/1024); + // fprintf(stderr,"resident set (VmRSS) size: %lu kB\r\n", result.resident * pageKB); + // fprintf(stderr,"virtual memory (VmSize) usage: %lu kB\r\n", result.size * pageKB); + // fprintf(stderr,"share memory (RssFile+RssShmem) usage: %lu kB\r\n", result.share * pageKB); + // fprintf(stderr,"code text usage: %lu kB\r\n", result.text * pageKB); + // fprintf(stderr,"data + stack usage: %lu kB\r\n", result.data * pageKB); + + return 0; +} +//------------------------------------------------------------------------------ diff --git a/RHF_64/router_mega/output.txt b/RHF_64/router_mega/output.txt new file mode 100755 index 0000000..b5e5ab1 --- /dev/null +++ b/RHF_64/router_mega/output.txt @@ -0,0 +1,17410 @@ +1024 +16384 +4 +159 +28 +6 +2 +1 +1 +39 +3 +2 +1 +20 +5 +7 +13 +1 +9 +19 +5 +31 +2 +9 +11 +1 +2 +4 +36 +1 +31 +25 +28 +3 +2 +3 +13 +1 +22 +5 +29 +7 +23 +12 +7 +35 +2 +21 +24 +15 +1 +1 +11 +22 +1 +1 +3 +17 +7 +2 +4 +2 +2 +2 +25 +14 +60 +5 +2 +1 +1 +1 +54 +1 +6 +45 +17 +3 +2 +1 +4 +13 +3 +4 +7 +5 +3 +13 +4 +15 +1 +8 +82 +5 +1 +1 +45 +22 +16 +2 +16 +3 +62 +17 +10 +80 +40 +16 +19 +8 +5 +36 +2 +2 +8 +13 +6 +1 +90 +1 +5 +16 +1 +1 +17 +1 +24 +2 +5 +47 +34 +9 +16 +4 +1 +1 +17 +7 +12 +1 +17 +15 +17 +3 +8 +29 +24 +9 +35 +11 +3 +2 +1 +35 +1 +3 +2 +29 +1 +1 +16 +59 +11 +1 +1 +16 +2 +3 +25 +2 +1 +42 +10 +1 +9 +6 +15 +22 +15 +63 +12 +7 +12 +10 +1 +1 +5 +66 +38 +1 +22 +2 +20 +13 +3 +8 +6 +12 +68 +8 +27 +13 +4 +53 +7 +15 +2 +41 +47 +2 +31 +6 +37 +66 +3 +2 +5 +3 +3 +5 +17 +76 +2 +8 +12 +2 +42 +22 +1 +15 +36 +15 +9 +27 +36 +4 +11 +28 +7 +6 +12 +5 +16 +16 +23 +10 +1 +17 +4 +21 +1 +9 +19 +11 +3 +16 +8 +6 +11 +2 +14 +38 +31 +2 +5 +30 +1 +3 +13 +36 +12 +5 +4 +26 +31 +13 +5 +6 +7 +5 +5 +6 +1 +1 +6 +4 +15 +5 +12 +2 +26 +1 +11 +91 +3 +38 +2 +1 +11 +17 +17 +2 +3 +32 +17 +1 +14 +1 +1 +21 +1 +15 +6 +1 +19 +6 +2 +9 +1 +20 +8 +4 +1 +4 +4 +6 +13 +29 +2 +30 +10 +2 +10 +6 +35 +23 +4 +2 +43 +7 +72 +14 +22 +6 +17 +3 +1 +9 +1 +12 +16 +8 +17 +12 +17 +36 +6 +11 +6 +3 +3 +1 +72 +2 +4 +5 +73 +12 +26 +6 +2 +5 +12 +14 +40 +15 +27 +3 +52 +7 +17 +6 +1 +34 +2 +2 +1 +23 +4 +4 +1 +31 +16 +6 +7 +9 +3 +18 +9 +19 +27 +1 +5 +26 +2 +11 +40 +2 +9 +7 +12 +2 +4 +22 +1 +8 +21 +6 +1 +2 +51 +45 +23 +2 +6 +13 +10 +6 +18 +2 +5 +15 +18 +4 +3 +3 +4 +52 +72 +6 +8 +2 +29 +4 +13 +5 +174 +8 +8 +1 +26 +47 +14 +1 +20 +4 +1 +39 +5 +38 +1 +2 +7 +5 +28 +33 +29 +6 +5 +21 +2 +4 +111 +41 +1 +1 +2 +7 +9 +5 +6 +16 +3 +2 +55 +7 +54 +23 +5 +6 +5 +4 +4 +33 +1 +8 +1 +161 +15 +1 +4 +2 +5 +1 +4 +7 +55 +4 +60 +3 +10 +16 +2 +1 +1 +10 +6 +14 +14 +1 +1 +1 +49 +54 +3 +4 +2 +5 +7 +24 +1 +3 +7 +5 +4 +12 +21 +1 +1 +9 +34 +40 +30 +1 +33 +75 +20 +3 +3 +3 +43 +8 +22 +1 +1 +37 +4 +6 +86 +19 +21 +41 +12 +7 +11 +1 +5 +5 +3 +4 +1 +18 +7 +16 +1 +36 +4 +25 +7 +4 +13 +7 +1 +14 +10 +1 +2 +3 +14 +30 +2 +4 +46 +3 +42 +1 +12 +1 +4 +14 +17 +6 +20 +1 +44 +11 +1 +81 +18 +6 +21 +3 +4 +7 +57 +3 +2 +45 +46 +5 +1 +25 +10 +6 +11 +4 +15 +9 +5 +14 +18 +8 +30 +56 +40 +10 +7 +18 +49 +8 +65 +5 +14 +1 +1 +25 +16 +9 +2 +26 +23 +50 +4 +110 +8 +20 +73 +2 +12 +20 +41 +1 +14 +3 +23 +32 +2 +22 +3 +66 +2 +3 +50 +14 +4 +35 +1 +19 +19 +6 +2 +31 +15 +16 +21 +5 +10 +56 +32 +70 +11 +16 +1 +11 +12 +18 +9 +18 +26 +27 +50 +10 +2 +6 +10 +12 +50 +3 +3 +1 +32 +30 +3 +9 +9 +3 +25 +14 +5 +16 +18 +6 +129 +21 +6 +12 +11 +49 +27 +24 +66 +2 +3 +5 +1 +4 +1 +2 +1 +47 +5 +42 +3 +11 +4 +79 +3 +2 +7 +56 +24 +1 +20 +5 +1 +73 +4 +16 +76 +4 +9 +1 +9 +1 +27 +9 +1 +23 +25 +1 +52 +14 +7 +2 +69 +8 +25 +11 +3 +18 +12 +8 +1 +2 +47 +15 +5 +1 +46 +26 +2 +2 +33 +42 +25 +36 +11 +11 +3 +3 +2 +5 +10 +16 +3 +45 +2 +4 +10 +2 +15 +1 +46 +62 +1 +7 +7 +1 +13 +3 +131 +9 +21 +36 +5 +2 +35 +2 +12 +14 +10 +17 +28 +43 +19 +5 +8 +1 +3 +47 +39 +8 +2 +75 +7 +21 +19 +1 +37 +1 +30 +11 +24 +13 +67 +81 +5 +26 +6 +10 +45 +2 +8 +31 +11 +26 +6 +19 +10 +7 +1 +1 +30 +7 +6 +14 +25 +1 +1 +33 +4 +1 +17 +65 +10 +6 +21 +5 +9 +5 +23 +1 +1 +25 +114 +13 +4 +11 +31 +16 +3 +6 +5 +21 +94 +1 +18 +13 +6 +1 +66 +15 +8 +9 +8 +3 +1 +27 +13 +5 +11 +51 +5 +1 +19 +4 +10 +8 +16 +22 +10 +42 +41 +67 +1 +12 +3 +14 +3 +3 +24 +1 +2 +4 +24 +16 +54 +2 +49 +2 +3 +2 +27 +9 +2 +4 +45 +45 +6 +14 +1 +21 +2 +11 +11 +4 +50 +97 +19 +52 +1 +6 +25 +1 +2 +14 +13 +29 +18 +3 +12 +13 +2 +1 +23 +2 +3 +2 +50 +17 +24 +33 +15 +2 +52 +11 +6 +1 +8 +164 +1 +4 +3 +50 +66 +4 +1 +48 +6 +9 +77 +8 +8 +1 +1 +6 +13 +128 +10 +8 +7 +4 +1 +31 +65 +1 +3 +3 +0 +0 +1 +1 +0 +4 +3 +4 +3 +4 +1 +4 +0 +1 +0 +2 +2 +1 +0 +2 +0 +0 +3 +3 +1 +3 +4 +0 +0 +3 +0 +0 +0 +0 +0 +1 +2 +0 +4 +0 +0 +1 +2 +0 +0 +0 +0 +2 +4 +0 +3 +1 +4 +0 +2 +2 +3 +2 +3 +0 +1 +2 +0 +3 +1 +0 +0 +3 +4 +3 +0 +2 +0 +0 +2 +0 +4 +1 +0 +0 +2 +2 +0 +0 +0 +0 +2 +0 +2 +3 +0 +2 +4 +2 +0 +0 +2 +2 +3 +4 +0 +2 +1 +2 +3 +1 +3 +0 +0 +1 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +3 +1 +0 +2 +0 +1 +0 +3 +4 +0 +2 +0 +3 +0 +1 +3 +0 +0 +2 +4 +0 +0 +0 +3 +3 +0 +0 +4 +1 +3 +3 +0 +0 +0 +1 +2 +0 +3 +1 +2 +4 +4 +1 +0 +0 +0 +1 +0 +0 +2 +0 +4 +4 +0 +2 +3 +1 +0 +3 +0 +0 +1 +0 +4 +0 +0 +0 +0 +0 +0 +0 +4 +1 +1 +3 +3 +0 +0 +0 +4 +0 +0 +0 +0 +0 +4 +0 +3 +0 +4 +1 +0 +0 +0 +0 +0 +0 +3 +0 +2 +0 +0 +0 +4 +0 +2 +0 +2 +3 +1 +2 +4 +0 +0 +2 +2 +2 +1 +3 +0 +0 +0 +0 +2 +0 +0 +0 +0 +1 +0 +2 +4 +2 +2 +3 +0 +1 +0 +0 +2 +4 +1 +3 +3 +0 +0 +3 +0 +0 +0 +0 +2 +1 +3 +0 +1 +0 +3 +0 +3 +0 +0 +3 +3 +4 +0 +4 +2 +3 +4 +0 +0 +0 +0 +3 +0 +1 +4 +1 +0 +1 +2 +0 +0 +0 +0 +4 +0 +0 +0 +1 +3 +0 +0 +4 +0 +0 +2 +1 +0 +0 +0 +3 +3 +4 +0 +3 +0 +2 +1 +3 +0 +0 +3 +1 +4 +3 +0 +1 +0 +3 +0 +2 +0 +0 +2 +3 +3 +0 +0 +0 +1 +0 +0 +0 +3 +0 +1 +0 +3 +0 +4 +4 +0 +1 +0 +1 +0 +0 +4 +0 +3 +0 +0 +1 +0 +0 +4 +0 +0 +4 +3 +1 +0 +1 +4 +1 +0 +0 +0 +3 +4 +0 +0 +0 +2 +2 +3 +4 +0 +1 +0 +4 +4 +2 +4 +2 +0 +0 +4 +4 +1 +3 +4 +0 +0 +3 +0 +2 +2 +0 +4 +1 +0 +0 +1 +0 +2 +0 +0 +0 +2 +0 +0 +3 +0 +0 +3 +1 +1 +0 +0 +1 +4 +4 +0 +0 +3 +0 +1 +4 +3 +4 +4 +0 +0 +2 +3 +0 +0 +4 +0 +1 +0 +1 +0 +2 +1 +0 +4 +1 +3 +0 +0 +0 +1 +2 +4 +0 +0 +2 +4 +2 +0 +3 +3 +0 +4 +0 +2 +0 +4 +4 +2 +4 +0 +0 +4 +0 +0 +2 +2 +0 +0 +0 +2 +1 +1 +3 +3 +1 +4 +2 +0 +2 +0 +0 +0 +3 +3 +2 +0 +0 +4 +0 +2 +0 +0 +1 +0 +1 +0 +3 +0 +0 +0 +1 +1 +0 +2 +4 +3 +3 +0 +0 +1 +0 +1 +2 +1 +0 +4 +0 +1 +3 +2 +2 +1 +0 +4 +0 +1 +0 +0 +3 +3 +1 +0 +0 +2 +2 +0 +3 +0 +2 +0 +1 +4 +0 +3 +3 +2 +0 +0 +2 +0 +0 +0 +4 +0 +1 +1 +1 +0 +0 +2 +0 +3 +4 +0 +1 +3 +0 +0 +3 +0 +0 +4 +0 +3 +0 +2 +0 +3 +3 +4 +3 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +0 +4 +3 +0 +3 +0 +1 +0 +0 +1 +2 +4 +0 +1 +0 +0 +0 +2 +1 +4 +2 +1 +0 +3 +3 +0 +1 +3 +2 +4 +0 +2 +4 +3 +3 +0 +4 +4 +0 +0 +3 +0 +0 +0 +0 +1 +0 +1 +1 +0 +0 +0 +0 +4 +1 +4 +3 +0 +0 +1 +0 +0 +1 +0 +0 +2 +2 +2 +1 +4 +0 +1 +0 +2 +2 +2 +0 +0 +0 +4 +0 +1 +0 +0 +4 +4 +0 +0 +2 +2 +4 +2 +1 +0 +0 +0 +0 +2 +0 +3 +1 +4 +0 +0 +0 +0 +0 +0 +3 +4 +0 +1 +1 +3 +0 +3 +1 +3 +3 +2 +0 +2 +0 +1 +0 +0 +0 +0 +0 +1 +2 +3 +0 +0 +3 +0 +3 +1 +4 +1 +3 +4 +0 +4 +4 +0 +4 +1 +2 +0 +1 +0 +0 +0 +2 +0 +1 +1 +0 +2 +4 +1 +3 +0 +3 +0 +2 +0 +2 +1 +2 +3 +0 +0 +4 +4 +4 +3 +0 +0 +1 +3 +0 +0 +1 +1 +0 +2 +0 +3 +4 +0 +0 +0 +3 +0 +3 +1 +0 +4 +0 +0 +0 +1 +2 +1 +1 +4 +1 +0 +2 +4 +3 +4 +0 +4 +2 +0 +3 +0 +2 +0 +0 +3 +3 +3 +1 +1 +2 +1 +4 +0 +4 +3 +1 +0 +4 +4 +4 +1 +0 +2 +3 +2 +1 +3 +0 +0 +0 +3 +0 +3 +2 +2 +3 +4 +0 +0 +0 +4 +3 +0 +0 +4 +0 +0 +3 +1 +4 +0 +1 +0 +0 +0 +0 +1 +4 +1 +0 +2 +1 +4 +2 +3 +4 +1 +3 +1 +0 +3 +0 +0 +0 +0 +0 +0 +0 +4 +4 +4 +2 +0 +3 +0 +4 +3 +0 +4 +3 +0 +2 +0 +4 +2 +0 +4 +1 +0 +0 +4 +1 +3 +3 +3 +0 +4 +3 +1 +0 +4 +0 +3 +2 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +4 +4 +3 +4 +3 +3 +4 +0 +2 +4 +1 +0 +0 +4 +0 +0 +4 +0 +0 +2 +0 +0 +3 +4 +1 +2 +4 +1 +1 +4 +4 +1 +1 +3 +2 +2 +1 +2 +3 +0 +3 +0 +2 +0 +0 +0 +4 +0 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +1 +0 +0 +0 +0 +3 +0 +1 +4 +0 +0 +3 +1 +0 +2 +1 +0 +0 +4 +1 +0 +3 +0 +3 +0 +0 +4 +0 +2 +1 +1 +2 +1 +0 +1 +0 +4 +4 +0 +4 +1 +4 +0 +1 +0 +0 +0 +1 +2 +0 +4 +3 +3 +0 +0 +3 +1 +0 +0 +3 +2 +4 +3 +0 +3 +2 +2 +0 +0 +2 +1 +0 +0 +0 +1 +0 +0 +2 +0 +0 +0 +0 +3 +2 +0 +0 +1 +4 +2 +1 +1 +2 +1 +1 +0 +2 +3 +1 +3 +3 +0 +1 +4 +0 +0 +0 +4 +0 +0 +0 +2 +3 +0 +1 +0 +3 +0 +0 +0 +0 +0 +0 +0 +2 +0 +1 +2 +0 +2 +0 +0 +0 +2 +0 +3 +0 +0 +0 +0 +3 +0 +0 +0 +2 +0 +0 +3 +0 +3 +0 +1 +0 +0 +0 +4 +2 +0 +4 +3 +2 +3 +3 +3 +1 +0 +4 +1 +4 +1 +3 +0 +0 +0 +0 +2 +4 +1 +0 +0 +4 +1 +0 +3 +2 +4 +1 +0 +1 +1 +3 +4 +4 +0 +3 +1 +1 +0 +0 +0 +0 +0 +0 +3 +0 +0 +0 +1 +3 +3 +0 +1 +0 +0 +1 +0 +4 +1 +0 +3 +0 +1 +4 +3 +0 +1 +0 +0 +0 +4 +2 +0 +0 +0 +3 +4 +0 +1 +4 +0 +3 +1 +0 +1 +2 +0 +0 +4 +0 +0 +0 +1 +2 +2 +1 +0 +3 +0 +4 +4 +4 +2 +0 +1 +4 +0 +1 +0 +0 +2 +0 +4 +0 +3 +3 +1 +3 +2 +4 +1 +0 +1 +0 +0 +0 +1 +0 +0 +2 +0 +0 +0 +2 +4 +2 +0 +4 +2 +3 +4 +1 +1 +0 +2 +3 +1 +0 +3 +4 +0 +3 +1 +3 +2 +1 +0 +4 +4 +0 +2 +2 +0 +4 +4 +0 +3 +4 +4 +0 +0 +4 +0 +3 +0 +0 +0 +3 +2 +3 +2 +1 +2 +4 +4 +0 +0 +0 +0 +0 +2 +0 +4 +0 +1 +3 +0 +0 +2 +0 +0 +0 +1 +0 +0 +1 +0 +1 +1 +3 +3 +4 +2 +0 +0 +4 +1 +4 +0 +0 +0 +4 +0 +0 +4 +2 +2 +0 +0 +4 +3 +0 +0 +1 +0 +1 +3 +3 +0 +4 +4 +4 +4 +2 +1 +0 +0 +0 +3 +4 +2 +1 +4 +1 +3 +0 +2 +3 +3 +4 +1 +2 +1 +0 +2 +1 +0 +0 +1 +4 +4 +0 +2 +4 +1 +0 +0 +3 +3 +3 +3 +0 +0 +0 +3 +2 +3 +0 +4 +0 +3 +2 +0 +0 +2 +1 +4 +0 +2 +3 +0 +4 +0 +4 +0 +2 +0 +0 +3 +0 +3 +4 +3 +2 +2 +0 +0 +4 +0 +0 +4 +1 +3 +0 +0 +0 +1 +0 +0 +0 +0 +1 +1 +0 +3 +1 +2 +0 +3 +1 +0 +3 +0 +1 +0 +0 +0 +4 +3 +0 +2 +0 +2 +2 +2 +0 +0 +4 +1 +3 +3 +0 +0 +0 +0 +0 +0 +3 +1 +0 +0 +0 +4 +0 +3 +4 +0 +2 +1 +4 +0 +1 +0 +4 +0 +0 +3 +2 +0 +0 +3 +0 +1 +2 +0 +2 +0 +0 +3 +2 +0 +0 +4 +3 +4 +0 +0 +0 +0 +1 +3 +3 +2 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +4 +1 +4 +0 +0 +3 +0 +1 +3 +1 +4 +0 +4 +0 +0 +0 +0 +0 +0 +2 +2 +0 +0 +3 +0 +0 +1 +3 +0 +2 +1 +0 +4 +0 +0 +0 +3 +0 +4 +2 +0 +0 +0 +4 +1 +2 +0 +3 +4 +1 +0 +2 +0 +0 +0 +0 +4 +0 +4 +1 +4 +4 +4 +3 +0 +0 +0 +0 +0 +0 +4 +3 +1 +0 +1 +0 +0 +2 +4 +0 +0 +3 +0 +2 +0 +2 +0 +2 +2 +2 +2 +2 +0 +0 +0 +0 +0 +2 +2 +3 +4 +2 +2 +4 +2 +2 +0 +4 +2 +0 +1 +3 +0 +2 +2 +0 +1 +0 +2 +0 +0 +1 +0 +0 +4 +1 +0 +0 +3 +0 +1 +0 +0 +4 +0 +2 +1 +0 +1 +0 +0 +2 +3 +2 +0 +0 +0 +1 +1 +3 +3 +1 +0 +1 +0 +0 +4 +2 +2 +0 +2 +0 +3 +1 +0 +0 +1 +0 +0 +3 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +2 +4 +0 +0 +0 +2 +1 +3 +2 +0 +0 +0 +1 +1 +1 +3 +4 +0 +0 +0 +0 +4 +0 +0 +2 +0 +2 +0 +4 +4 +2 +3 +4 +0 +0 +0 +4 +2 +1 +1 +0 +0 +2 +1 +0 +0 +4 +2 +2 +1 +2 +2 +1 +4 +4 +2 +1 +0 +1 +0 +0 +3 +0 +3 +0 +2 +2 +3 +0 +0 +0 +1 +3 +2 +0 +0 +2 +0 +0 +4 +0 +0 +0 +2 +4 +3 +0 +0 +1 +2 +1 +0 +0 +1 +0 +2 +0 +1 +0 +0 +1 +4 +3 +3 +3 +1 +0 +0 +0 +2 +4 +1 +0 +1 +0 +1 +0 +2 +1 +4 +0 +3 +0 +0 +0 +1 +0 +3 +1 +4 +0 +0 +3 +0 +3 +4 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +0 +3 +2 +2 +3 +3 +0 +4 +0 +0 +3 +1 +0 +3 +0 +0 +0 +0 +0 +0 +1 +2 +3 +2 +0 +0 +4 +0 +0 +2 +0 +3 +1 +0 +4 +1 +0 +2 +0 +1 +3 +0 +0 +1 +1 +3 +2 +0 +4 +0 +4 +3 +3 +0 +3 +1 +0 +3 +2 +0 +0 +2 +2 +4 +2 +0 +2 +4 +4 +2 +0 +2 +4 +0 +2 +0 +1 +4 +1 +1 +3 +4 +0 +0 +0 +0 +4 +2 +0 +0 +2 +3 +0 +3 +0 +1 +0 +0 +4 +0 +4 +4 +3 +3 +0 +0 +4 +0 +3 +0 +4 +0 +0 +4 +1 +1 +2 +0 +1 +0 +0 +1 +0 +1 +4 +2 +4 +1 +0 +4 +0 +0 +0 +3 +3 +2 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +1 +1 +0 +0 +4 +4 +4 +4 +0 +2 +4 +2 +4 +2 +4 +0 +0 +2 +0 +1 +4 +2 +2 +0 +4 +0 +2 +1 +4 +2 +1 +1 +4 +2 +3 +1 +1 +4 +0 +2 +2 +2 +1 +0 +4 +0 +1 +0 +4 +1 +2 +0 +0 +0 +3 +4 +3 +4 +2 +4 +0 +3 +0 +0 +0 +1 +0 +3 +1 +2 +3 +0 +0 +1 +0 +4 +0 +4 +2 +0 +0 +4 +3 +0 +1 +0 +0 +0 +2 +3 +2 +1 +2 +0 +0 +2 +4 +1 +1 +0 +4 +0 +1 +1 +2 +0 +2 +0 +2 +0 +1 +0 +3 +4 +0 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +2 +4 +3 +1 +3 +0 +1 +2 +0 +0 +0 +0 +2 +0 +4 +0 +1 +0 +1 +4 +3 +4 +1 +1 +0 +0 +1 +0 +4 +0 +2 +0 +3 +0 +4 +2 +0 +0 +1 +0 +1 +4 +4 +0 +0 +2 +0 +0 +0 +1 +2 +2 +2 +1 +2 +0 +2 +1 +0 +3 +1 +4 +0 +4 +1 +3 +0 +1 +4 +4 +3 +3 +0 +0 +2 +3 +2 +3 +0 +2 +2 +0 +0 +0 +1 +0 +3 +0 +0 +2 +3 +2 +0 +2 +4 +0 +3 +2 +4 +3 +0 +1 +4 +3 +0 +0 +4 +4 +3 +0 +4 +0 +1 +4 +0 +0 +3 +0 +3 +0 +0 +0 +2 +0 +2 +2 +0 +0 +0 +0 +0 +3 +4 +1 +1 +1 +0 +2 +0 +0 +3 +3 +3 +0 +3 +0 +1 +0 +0 +3 +0 +4 +1 +0 +3 +3 +0 +0 +1 +2 +3 +0 +0 +0 +4 +0 +0 +2 +0 +0 +1 +0 +4 +0 +4 +0 +2 +4 +2 +0 +3 +2 +4 +4 +0 +2 +0 +0 +4 +2 +1 +0 +1 +2 +3 +2 +4 +1 +3 +0 +1 +0 +3 +1 +0 +0 +0 +3 +4 +0 +0 +3 +0 +0 +4 +0 +3 +1 +0 +3 +0 +0 +0 +2 +1 +1 +2 +0 +4 +3 +4 +0 +0 +0 +2 +4 +2 +3 +1 +0 +2 +3 +3 +2 +0 +1 +0 +0 +0 +4 +0 +0 +1 +3 +3 +0 +2 +0 +0 +1 +2 +1 +0 +0 +0 +0 +4 +4 +3 +0 +3 +0 +2 +0 +1 +0 +0 +0 +4 +2 +0 +0 +0 +0 +0 +3 +4 +4 +0 +4 +4 +1 +0 +3 +0 +2 +0 +0 +0 +0 +1 +0 +1 +0 +2 +3 +0 +3 +1 +3 +0 +3 +0 +3 +3 +0 +3 +0 +0 +0 +0 +0 +4 +1 +4 +3 +0 +0 +2 +3 +3 +0 +3 +2 +0 +3 +3 +0 +0 +0 +0 +3 +4 +0 +3 +0 +1 +0 +0 +3 +0 +1 +0 +1 +2 +0 +0 +0 +3 +0 +3 +4 +1 +3 +3 +2 +0 +0 +0 +2 +0 +0 +3 +3 +4 +3 +4 +4 +4 +0 +0 +3 +0 +0 +1 +4 +0 +3 +1 +1 +1 +0 +0 +1 +3 +4 +1 +1 +0 +3 +0 +0 +3 +1 +0 +1 +0 +0 +1 +2 +2 +0 +4 +2 +0 +1 +0 +1 +2 +1 +0 +4 +0 +3 +0 +0 +3 +0 +2 +0 +0 +3 +2 +3 +0 +1 +0 +1 +1 +0 +1 +0 +4 +4 +1 +1 +0 +2 +0 +0 +2 +3 +0 +3 +0 +0 +0 +1 +0 +0 +1 +0 +2 +0 +0 +2 +0 +3 +1 +2 +1 +0 +0 +1 +4 +0 +2 +4 +2 +0 +0 +2 +0 +4 +4 +0 +3 +0 +3 +2 +4 +3 +0 +0 +1 +4 +4 +3 +3 +1 +0 +0 +1 +0 +4 +0 +0 +4 +0 +4 +0 +3 +1 +0 +0 +3 +3 +0 +0 +1 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +0 +3 +0 +0 +1 +0 +4 +3 +1 +0 +3 +2 +3 +0 +0 +1 +0 +2 +2 +0 +1 +0 +4 +0 +4 +3 +0 +0 +3 +0 +4 +1 +0 +4 +2 +4 +0 +1 +0 +2 +0 +3 +4 +0 +0 +2 +0 +0 +0 +0 +2 +0 +0 +0 +0 +0 +1 +1 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +0 +0 +3 +0 +1 +1 +4 +0 +2 +1 +0 +0 +1 +4 +0 +0 +0 +2 +0 +1 +0 +3 +4 +4 +0 +0 +4 +2 +3 +0 +3 +1 +4 +0 +3 +0 +2 +0 +0 +3 +0 +0 +1 +2 +0 +2 +0 +1 +0 +0 +2 +4 +4 +2 +1 +0 +1 +4 +0 +1 +1 +0 +4 +3 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +0 +4 +3 +0 +2 +2 +0 +4 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +1 +0 +0 +1 +0 +0 +0 +1 +4 +0 +4 +3 +4 +0 +4 +2 +0 +2 +2 +4 +0 +3 +3 +0 +0 +0 +3 +1 +0 +1 +0 +3 +1 +0 +0 +1 +0 +0 +0 +3 +0 +4 +4 +0 +1 +0 +0 +2 +0 +4 +0 +1 +0 +0 +2 +3 +1 +2 +0 +4 +3 +0 +4 +0 +0 +4 +0 +1 +3 +4 +0 +0 +3 +0 +4 +2 +3 +1 +1 +3 +0 +0 +0 +4 +2 +4 +3 +3 +2 +4 +0 +2 +0 +3 +0 +4 +0 +0 +1 +3 +0 +3 +0 +2 +4 +2 +0 +0 +0 +4 +4 +4 +0 +0 +1 +1 +4 +0 +1 +3 +0 +3 +0 +0 +1 +2 +1 +0 +0 +1 +2 +2 +0 +3 +0 +2 +0 +2 +0 +0 +3 +1 +4 +2 +3 +4 +0 +0 +1 +1 +0 +1 +4 +0 +0 +4 +1 +1 +3 +0 +3 +4 +0 +3 +0 +4 +3 +0 +3 +3 +2 +4 +0 +0 +1 +3 +3 +4 +0 +0 +3 +4 +0 +1 +4 +0 +0 +1 +4 +0 +4 +3 +1 +1 +0 +3 +0 +0 +3 +0 +4 +2 +2 +1 +0 +0 +2 +0 +3 +2 +0 +4 +1 +0 +0 +4 +1 +3 +0 +4 +0 +4 +0 +3 +0 +3 +4 +3 +2 +3 +2 +0 +0 +1 +2 +4 +2 +0 +2 +0 +2 +0 +0 +0 +0 +1 +0 +0 +1 +3 +0 +0 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +2 +1 +0 +2 +1 +4 +3 +0 +0 +3 +0 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +0 +2 +0 +4 +3 +0 +3 +3 +0 +0 +4 +1 +0 +0 +0 +1 +1 +2 +0 +2 +0 +0 +4 +2 +4 +0 +3 +3 +0 +0 +2 +0 +2 +2 +0 +0 +2 +0 +4 +4 +0 +0 +4 +2 +2 +3 +0 +3 +4 +0 +2 +3 +4 +2 +0 +4 +3 +4 +0 +0 +0 +0 +1 +0 +4 +4 +0 +2 +0 +0 +1 +3 +1 +4 +0 +3 +3 +0 +1 +1 +0 +3 +4 +0 +4 +4 +3 +0 +2 +0 +0 +3 +0 +1 +1 +0 +0 +0 +2 +0 +0 +0 +0 +0 +3 +2 +2 +0 +1 +1 +3 +0 +0 +0 +4 +4 +0 +1 +0 +2 +0 +3 +0 +4 +0 +3 +0 +1 +0 +3 +2 +2 +0 +0 +0 +0 +0 +0 +2 +3 +1 +4 +0 +0 +4 +0 +0 +0 +4 +0 +3 +0 +0 +4 +0 +0 +2 +2 +0 +3 +1 +4 +4 +0 +1 +0 +0 +1 +2 +0 +1 +3 +3 +0 +1 +0 +0 +2 +1 +3 +0 +0 +0 +2 +1 +0 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +4 +0 +3 +4 +2 +3 +4 +0 +3 +0 +0 +0 +0 +0 +2 +4 +0 +3 +3 +3 +4 +0 +0 +0 +4 +4 +0 +0 +2 +3 +0 +0 +4 +1 +3 +2 +0 +0 +0 +0 +0 +0 +3 +4 +0 +0 +3 +0 +0 +2 +4 +3 +0 +2 +2 +3 +0 +2 +1 +0 +0 +0 +0 +1 +0 +1 +2 +4 +0 +1 +2 +3 +4 +0 +0 +0 +0 +0 +1 +3 +0 +2 +0 +0 +0 +0 +0 +3 +0 +2 +0 +0 +2 +4 +3 +0 +2 +0 +0 +0 +2 +0 +3 +3 +1 +0 +1 +0 +3 +3 +0 +1 +0 +3 +0 +3 +0 +1 +1 +3 +1 +1 +0 +4 +0 +3 +2 +3 +0 +0 +0 +1 +3 +1 +0 +3 +4 +0 +2 +0 +4 +4 +0 +3 +0 +4 +0 +2 +1 +0 +1 +0 +1 +0 +0 +2 +2 +0 +0 +0 +4 +0 +3 +0 +3 +0 +3 +2 +3 +0 +0 +2 +4 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +4 +1 +0 +4 +2 +0 +1 +0 +2 +0 +0 +0 +3 +3 +1 +4 +1 +0 +0 +4 +0 +0 +2 +0 +0 +2 +2 +0 +0 +0 +0 +0 +2 +4 +0 +0 +4 +1 +0 +4 +4 +0 +0 +2 +0 +3 +1 +0 +0 +0 +3 +3 +0 +0 +0 +4 +1 +3 +1 +0 +0 +4 +0 +0 +1 +4 +1 +2 +0 +3 +0 +0 +0 +2 +1 +1 +1 +0 +3 +1 +0 +0 +0 +0 +0 +0 +2 +0 +4 +0 +3 +0 +4 +0 +4 +3 +1 +1 +2 +0 +0 +1 +0 +0 +2 +0 +0 +2 +3 +0 +0 +0 +4 +0 +1 +0 +0 +1 +3 +0 +1 +0 +2 +0 +0 +0 +1 +0 +0 +0 +2 +0 +0 +1 +2 +0 +3 +2 +0 +0 +1 +0 +0 +0 +0 +0 +0 +2 +0 +1 +4 +4 +1 +0 +2 +0 +4 +3 +0 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +1 +3 +0 +4 +3 +2 +0 +0 +3 +4 +0 +0 +2 +0 +2 +4 +3 +3 +3 +0 +0 +4 +4 +4 +1 +0 +0 +2 +2 +4 +2 +4 +0 +0 +0 +1 +2 +0 +0 +4 +0 +2 +1 +3 +1 +1 +4 +4 +3 +3 +2 +2 +2 +0 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +2 +0 +4 +3 +0 +3 +0 +3 +3 +2 +0 +1 +1 +0 +4 +0 +3 +1 +0 +0 +2 +4 +2 +3 +4 +2 +3 +0 +3 +2 +3 +4 +3 +2 +4 +3 +3 +3 +4 +0 +2 +4 +0 +2 +0 +2 +3 +0 +4 +4 +0 +1 +0 +3 +1 +0 +2 +1 +3 +3 +2 +4 +3 +0 +0 +0 +3 +2 +4 +0 +0 +4 +2 +2 +4 +0 +0 +4 +0 +4 +0 +0 +0 +0 +2 +1 +2 +0 +0 +0 +0 +0 +1 +0 +2 +0 +3 +0 +3 +3 +0 +0 +0 +4 +0 +0 +3 +2 +0 +0 +4 +0 +0 +0 +0 +0 +4 +4 +2 +4 +4 +0 +3 +0 +0 +0 +0 +4 +0 +1 +1 +0 +3 +0 +2 +3 +0 +1 +3 +0 +1 +0 +0 +3 +3 +0 +2 +4 +2 +2 +1 +2 +0 +0 +4 +4 +0 +2 +2 +3 +4 +1 +0 +0 +2 +0 +2 +0 +0 +0 +4 +3 +2 +4 +3 +3 +0 +2 +2 +0 +0 +4 +4 +0 +3 +0 +3 +2 +3 +2 +1 +2 +0 +1 +2 +3 +2 +0 +0 +3 +0 +1 +0 +0 +2 +0 +1 +0 +0 +0 +3 +4 +0 +0 +2 +0 +0 +1 +0 +3 +3 +4 +3 +0 +1 +1 +0 +0 +0 +0 +4 +0 +0 +4 +2 +3 +2 +0 +0 +0 +1 +0 +0 +2 +2 +0 +0 +4 +0 +4 +0 +1 +0 +3 +0 +3 +0 +3 +0 +4 +4 +0 +4 +1 +4 +3 +2 +4 +0 +3 +0 +2 +0 +3 +2 +2 +0 +0 +0 +1 +0 +1 +1 +0 +3 +0 +4 +0 +0 +2 +1 +2 +0 +0 +4 +2 +4 +0 +0 +1 +3 +1 +4 +2 +0 +0 +4 +2 +4 +4 +2 +0 +1 +3 +2 +0 +0 +0 +0 +3 +3 +4 +0 +2 +2 +0 +0 +3 +2 +4 +0 +0 +1 +2 +2 +0 +0 +4 +3 +2 +0 +2 +0 +1 +0 +0 +0 +3 +1 +0 +1 +4 +3 +1 +0 +1 +0 +3 +2 +0 +4 +4 +2 +2 +0 +0 +3 +0 +0 +1 +3 +3 +0 +0 +3 +0 +2 +4 +2 +3 +0 +4 +0 +2 +4 +2 +2 +0 +4 +0 +0 +4 +4 +0 +0 +3 +0 +1 +0 +4 +2 +0 +1 +2 +2 +0 +0 +4 +1 +0 +0 +2 +4 +4 +0 +0 +3 +0 +0 +0 +1 +0 +4 +0 +0 +4 +2 +4 +0 +1 +0 +0 +0 +2 +2 +0 +1 +4 +4 +0 +1 +0 +2 +3 +4 +3 +4 +0 +3 +0 +3 +3 +0 +4 +1 +1 +1 +4 +0 +3 +2 +2 +3 +0 +4 +0 +3 +3 +4 +0 +3 +0 +3 +1 +0 +1 +1 +1 +0 +1 +3 +0 +3 +0 +0 +0 +4 +2 +0 +0 +0 +4 +3 +2 +0 +1 +0 +0 +3 +1 +0 +0 +0 +2 +4 +4 +3 +3 +4 +1 +3 +0 +0 +2 +3 +0 +4 +4 +1 +4 +0 +1 +4 +3 +0 +4 +0 +3 +4 +0 +3 +3 +1 +0 +0 +1 +1 +0 +0 +1 +3 +0 +2 +0 +0 +0 +1 +0 +0 +0 +1 +3 +0 +0 +2 +3 +3 +2 +3 +0 +0 +4 +4 +4 +3 +2 +0 +3 +2 +0 +2 +0 +0 +0 +0 +0 +1 +2 +0 +0 +1 +0 +4 +2 +4 +0 +3 +0 +0 +1 +4 +1 +0 +0 +1 +4 +0 +0 +4 +0 +3 +1 +1 +3 +1 +0 +4 +1 +0 +0 +3 +1 +2 +0 +1 +0 +2 +0 +3 +3 +0 +0 +2 +3 +2 +0 +0 +1 +0 +3 +0 +0 +3 +0 +0 +1 +3 +0 +4 +0 +0 +0 +0 +2 +2 +1 +1 +0 +0 +0 +0 +0 +1 +1 +1 +4 +0 +0 +4 +3 +0 +0 +0 +0 +3 +4 +3 +0 +1 +4 +1 +0 +0 +0 +0 +3 +0 +4 +2 +1 +4 +0 +0 +1 +2 +0 +2 +0 +0 +1 +1 +1 +0 +0 +4 +3 +4 +1 +0 +2 +1 +1 +1 +4 +0 +3 +0 +0 +0 +1 +0 +4 +1 +2 +3 +3 +0 +2 +0 +4 +4 +0 +0 +4 +1 +2 +0 +0 +2 +0 +0 +0 +3 +2 +0 +2 +0 +3 +0 +2 +0 +0 +1 +0 +3 +4 +2 +0 +0 +1 +0 +3 +0 +2 +1 +2 +3 +0 +1 +1 +4 +1 +0 +1 +0 +3 +1 +0 +2 +0 +2 +2 +3 +2 +2 +2 +0 +1 +2 +2 +0 +3 +4 +3 +1 +2 +0 +1 +4 +0 +1 +4 +1 +3 +2 +1 +4 +4 +0 +0 +2 +3 +2 +4 +0 +0 +4 +4 +1 +0 +0 +1 +0 +2 +1 +4 +0 +1 +1 +0 +0 +0 +0 +3 +1 +0 +3 +0 +0 +0 +0 +1 +0 +4 +0 +3 +1 +3 +3 +0 +0 +4 +4 +2 +3 +0 +0 +0 +1 +2 +1 +0 +0 +2 +0 +0 +0 +0 +0 +4 +4 +3 +0 +0 +4 +0 +0 +0 +0 +0 +2 +0 +3 +0 +1 +0 +0 +0 +2 +0 +3 +4 +2 +0 +0 +1 +0 +1 +1 +1 +0 +0 +0 +1 +0 +4 +0 +2 +3 +0 +4 +4 +4 +3 +1 +1 +1 +0 +0 +1 +0 +0 +1 +3 +4 +0 +1 +0 +0 +4 +1 +0 +4 +0 +0 +0 +0 +0 +2 +3 +0 +2 +2 +4 +0 +2 +0 +0 +0 +1 +0 +0 +0 +2 +4 +0 +0 +0 +0 +3 +3 +0 +2 +3 +0 +0 +0 +0 +4 +2 +3 +0 +0 +3 +0 +3 +3 +3 +3 +0 +0 +0 +3 +2 +0 +4 +0 +4 +3 +3 +0 +0 +0 +0 +1 +0 +1 +1 +3 +2 +0 +2 +0 +3 +4 +0 +4 +4 +2 +0 +4 +0 +4 +0 +3 +3 +0 +3 +0 +0 +2 +3 +0 +3 +0 +0 +2 +0 +4 +0 +3 +3 +1 +2 +2 +0 +0 +1 +2 +2 +0 +0 +3 +4 +3 +1 +1 +4 +0 +0 +3 +0 +0 +1 +3 +0 +2 +4 +0 +4 +0 +0 +0 +1 +0 +3 +2 +4 +0 +0 +0 +1 +3 +0 +0 +4 +3 +3 +4 +4 +1 +3 +3 +0 +2 +4 +4 +4 +0 +0 +0 +0 +0 +0 +2 +0 +2 +0 +1 +0 +0 +1 +0 +3 +4 +3 +1 +0 +0 +0 +2 +0 +1 +0 +0 +0 +0 +0 +0 +1 +0 +2 +0 +0 +1 +4 +1 +0 +0 +4 +0 +2 +0 +0 +0 +1 +2 +0 +0 +3 +0 +0 +1 +0 +2 +2 +1 +3 +0 +0 +0 +0 +3 +3 +0 +3 +3 +4 +0 +0 +4 +4 +1 +0 +0 +2 +0 +2 +3 +0 +0 +3 +2 +0 +0 +0 +0 +1 +3 +2 +4 +0 +2 +2 +0 +0 +2 +4 +0 +2 +0 +2 +0 +3 +2 +0 +4 +4 +4 +0 +3 +0 +2 +1 +0 +4 +1 +4 +4 +3 +1 +0 +4 +2 +0 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +4 +1 +0 +3 +0 +4 +4 +0 +0 +0 +1 +0 +3 +0 +2 +2 +2 +0 +0 +2 +0 +0 +4 +2 +0 +4 +0 +2 +3 +0 +3 +0 +4 +4 +1 +2 +0 +1 +0 +0 +3 +3 +4 +0 +0 +4 +4 +1 +2 +0 +3 +2 +4 +0 +0 +0 +2 +1 +3 +2 +4 +0 +0 +2 +0 +1 +0 +4 +2 +1 +1 +3 +2 +0 +2 +0 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +0 +0 +0 +4 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +0 +2 +1 +0 +0 +1 +0 +0 +0 +0 +0 +4 +4 +0 +3 +4 +0 +3 +4 +1 +0 +2 +1 +4 +3 +0 +0 +0 +0 +0 +0 +0 +3 +2 +1 +0 +0 +2 +0 +0 +1 +2 +0 +0 +0 +0 +0 +2 +2 +3 +1 +0 +4 +0 +0 +0 +0 +3 +4 +3 +2 +2 +2 +3 +0 +0 +4 +1 +1 +0 +4 +0 +2 +1 +1 +4 +3 +0 +0 +0 +2 +0 +0 +2 +0 +0 +2 +0 +0 +0 +3 +0 +4 +1 +0 +0 +0 +0 +1 +1 +2 +3 +0 +0 +0 +4 +1 +0 +1 +0 +3 +0 +1 +2 +0 +2 +0 +0 +3 +1 +4 +1 +0 +1 +0 +0 +0 +4 +3 +3 +2 +1 +4 +1 +0 +0 +2 +3 +4 +0 +0 +0 +4 +4 +4 +0 +0 +0 +0 +3 +2 +2 +0 +1 +0 +0 +3 +0 +1 +1 +4 +0 +3 +4 +2 +2 +2 +4 +0 +3 +0 +4 +3 +3 +0 +0 +3 +0 +3 +1 +1 +0 +1 +1 +3 +2 +0 +0 +0 +0 +0 +1 +3 +0 +0 +3 +0 +0 +4 +0 +2 +4 +4 +0 +0 +0 +2 +4 +1 +2 +4 +2 +0 +4 +1 +2 +4 +2 +0 +0 +2 +2 +1 +0 +0 +0 +3 +0 +0 +0 +3 +1 +2 +1 +0 +0 +0 +2 +2 +0 +0 +3 +1 +1 +0 +0 +4 +0 +0 +2 +4 +1 +0 +0 +0 +0 +0 +0 +1 +4 +3 +4 +3 +3 +4 +0 +0 +1 +3 +4 +0 +2 +0 +1 +3 +0 +0 +4 +2 +0 +3 +1 +3 +4 +0 +1 +0 +3 +0 +1 +0 +0 +0 +0 +3 +1 +1 +2 +4 +0 +2 +1 +0 +0 +2 +1 +0 +0 +2 +4 +0 +3 +2 +4 +1 +0 +4 +0 +4 +0 +3 +3 +4 +3 +0 +0 +0 +3 +4 +2 +0 +0 +2 +0 +0 +2 +1 +0 +2 +0 +4 +0 +1 +0 +4 +0 +1 +0 +0 +1 +0 +0 +0 +0 +0 +3 +3 +4 +1 +2 +4 +3 +0 +2 +1 +3 +0 +4 +0 +2 +0 +1 +1 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +3 +0 +0 +0 +3 +0 +0 +2 +0 +4 +1 +3 +0 +1 +0 +3 +0 +1 +2 +4 +0 +0 +2 +0 +1 +3 +0 +0 +3 +0 +0 +0 +0 +1 +0 +0 +4 +0 +2 +0 +1 +0 +0 +2 +0 +3 +1 +4 +2 +3 +0 +2 +3 +0 +0 +3 +0 +2 +1 +2 +4 +2 +2 +1 +0 +4 +3 +2 +1 +2 +3 +3 +0 +3 +0 +0 +1 +4 +1 +0 +3 +0 +4 +1 +2 +1 +0 +3 +2 +2 +2 +2 +0 +0 +4 +4 +0 +1 +1 +0 +2 +1 +4 +3 +0 +3 +0 +4 +1 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +4 +2 +4 +0 +0 +0 +4 +0 +1 +0 +0 +0 +1 +0 +0 +4 +0 +1 +0 +3 +0 +1 +3 +0 +1 +4 +4 +2 +3 +0 +0 +3 +0 +1 +1 +3 +0 +0 +0 +1 +0 +3 +0 +4 +0 +4 +1 +0 +4 +0 +2 +3 +1 +3 +0 +0 +3 +0 +2 +0 +0 +2 +0 +0 +3 +3 +0 +3 +3 +0 +0 +0 +4 +2 +3 +1 +2 +0 +2 +3 +2 +3 +4 +0 +0 +2 +0 +2 +4 +0 +0 +3 +3 +1 +2 +1 +1 +4 +2 +0 +1 +0 +4 +4 +0 +0 +2 +0 +3 +2 +0 +0 +2 +4 +0 +0 +0 +0 +0 +4 +0 +4 +3 +4 +0 +0 +2 +0 +2 +0 +0 +1 +2 +3 +4 +1 +0 +0 +0 +0 +1 +0 +4 +0 +0 +0 +0 +0 +0 +2 +3 +0 +1 +0 +0 +0 +1 +4 +2 +2 +0 +3 +0 +3 +4 +3 +0 +2 +0 +4 +0 +0 +2 +2 +4 +0 +0 +0 +1 +2 +0 +0 +1 +1 +4 +0 +3 +2 +4 +4 +0 +4 +4 +0 +0 +0 +2 +0 +2 +0 +0 +3 +2 +0 +0 +2 +0 +3 +0 +1 +3 +4 +3 +0 +4 +0 +0 +2 +3 +0 +3 +0 +3 +0 +0 +0 +2 +4 +0 +1 +3 +2 +4 +0 +0 +3 +0 +0 +0 +4 +2 +0 +3 +1 +0 +0 +0 +0 +0 +1 +0 +2 +0 +3 +0 +0 +1 +0 +1 +1 +0 +2 +0 +0 +4 +1 +0 +0 +0 +2 +2 +0 +0 +0 +0 +0 +3 +4 +2 +3 +2 +0 +4 +2 +1 +3 +0 +1 +0 +3 +0 +0 +4 +2 +1 +3 +4 +0 +0 +0 +0 +1 +1 +0 +1 +0 +0 +0 +0 +3 +0 +0 +2 +0 +0 +1 +0 +0 +0 +4 +3 +0 +0 +0 +0 +0 +2 +1 +2 +0 +0 +2 +0 +3 +2 +4 +2 +0 +0 +0 +0 +3 +0 +0 +0 +0 +0 +4 +0 +1 +4 +4 +4 +3 +2 +0 +3 +1 +0 +2 +0 +0 +3 +1 +4 +2 +3 +1 +4 +1 +1 +0 +0 +0 +2 +0 +0 +0 +0 +2 +0 +1 +3 +1 +0 +4 +4 +0 +2 +0 +0 +0 +0 +2 +3 +2 +0 +1 +3 +0 +0 +0 +2 +2 +2 +0 +0 +0 +4 +0 +0 +1 +1 +1 +2 +0 +3 +0 +0 +0 +0 +4 +4 +0 +0 +0 +0 +2 +0 +2 +0 +2 +0 +0 +3 +0 +0 +0 +2 +0 +0 +0 +2 +3 +0 +0 +2 +0 +3 +2 +0 +0 +0 +0 +1 +0 +3 +2 +0 +0 +0 +3 +0 +4 +1 +0 +3 +4 +0 +2 +4 +1 +2 +0 +0 +3 +1 +2 +0 +0 +2 +0 +4 +0 +0 +0 +0 +0 +2 +1 +1 +0 +0 +3 +3 +1 +4 +0 +2 +0 +2 +0 +3 +1 +1 +3 +3 +2 +0 +4 +0 +0 +0 +0 +0 +1 +0 +0 +4 +0 +0 +3 +0 +0 +0 +2 +4 +1 +2 +2 +0 +0 +0 +1 +0 +2 +0 +2 +2 +3 +4 +0 +0 +2 +1 +0 +2 +2 +1 +0 +1 +3 +0 +0 +3 +0 +0 +0 +3 +0 +3 +0 +1 +0 +0 +1 +3 +0 +4 +4 +0 +0 +0 +1 +2 +0 +0 +0 +0 +0 +0 +0 +0 +3 +0 +3 +0 +1 +2 +1 +0 +1 +2 +0 +3 +0 +0 +1 +0 +4 +1 +0 +1 +4 +4 +0 +0 +2 +1 +3 +3 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +0 +3 +3 +0 +2 +0 +0 +0 +0 +0 +4 +0 +0 +3 +3 +1 +0 +0 +2 +4 +4 +0 +4 +3 +0 +4 +2 +1 +0 +0 +0 +0 +0 +2 +0 +3 +0 +4 +0 +0 +0 +3 +0 +2 +3 +0 +0 +4 +1 +0 +1 +1 +2 +3 +3 +1 +4 +0 +4 +0 +1 +0 +3 +3 +2 +1 +4 +1 +0 +0 +0 +0 +3 +4 +3 +4 +0 +4 +0 +2 +2 +0 +4 +3 +0 +4 +0 +4 +1 +1 +4 +0 +4 +0 +3 +2 +4 +2 +1 +3 +4 +1 +0 +0 +2 +4 +0 +4 +2 +1 +4 +4 +4 +3 +3 +1 +0 +0 +0 +0 +4 +3 +3 +2 +0 +0 +4 +4 +0 +0 +0 +0 +0 +0 +1 +3 +1 +2 +0 +3 +0 +0 +0 +3 +1 +0 +3 +0 +0 +4 +0 +4 +4 +3 +2 +4 +3 +2 +4 +3 +3 +2 +4 +2 +1 +0 +2 +2 +0 +0 +0 +3 +3 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +0 +2 +0 +0 +3 +0 +0 +0 +4 +3 +3 +2 +4 +4 +2 +0 +0 +0 +0 +4 +3 +0 +0 +0 +0 +0 +4 +0 +0 +1 +0 +2 +0 +4 +0 +0 +4 +0 +1 +0 +0 +1 +4 +4 +1 +1 +1 +0 +4 +1 +0 +0 +2 +0 +0 +0 +4 +0 +2 +1 +0 +0 +0 +0 +0 +1 +2 +2 +4 +0 +0 +0 +1 +2 +4 +0 +0 +0 +2 +0 +4 +2 +0 +1 +0 +0 +1 +0 +1 +0 +4 +0 +3 +0 +0 +4 +3 +4 +4 +2 +0 +2 +0 +0 +3 +1 +2 +0 +4 +0 +0 +4 +3 +3 +3 +3 +3 +3 +4 +4 +4 +3 +0 +1 +0 +3 +0 +0 +0 +0 +1 +3 +0 +3 +2 +3 +1 +3 +4 +1 +4 +1 +1 +0 +3 +3 +1 +3 +0 +2 +0 +0 +1 +2 +1 +2 +0 +0 +4 +0 +0 +2 +2 +0 +0 +0 +4 +4 +2 +3 +4 +1 +2 +0 +0 +0 +2 +0 +3 +0 +3 +0 +0 +1 +0 +0 +3 +0 +0 +0 +3 +4 +0 +2 +4 +1 +3 +0 +0 +3 +0 +4 +4 +3 +3 +4 +4 +3 +0 +0 +2 +0 +0 +4 +2 +3 +0 +0 +2 +1 +3 +0 +0 +0 +2 +0 +0 +2 +0 +1 +2 +1 +1 +1 +1 +0 +0 +4 +0 +0 +0 +0 +0 +0 +3 +3 +3 +3 +0 +0 +0 +2 +0 +2 +0 +0 +4 +0 +0 +0 +1 +4 +4 +3 +0 +0 +2 +3 +4 +0 +0 +0 +2 +1 +0 +0 +4 +4 +2 +4 +0 +4 +4 +2 +2 +3 +0 +2 +0 +1 +1 +4 +4 +0 +2 +4 +3 +0 +0 +4 +0 +0 +2 +2 +4 +0 +0 +2 +3 +2 +4 +3 +1 +0 +2 +3 +1 +0 +0 +0 +1 +0 +0 +1 +0 +2 +0 +4 +0 +0 +4 +0 +2 +2 +1 +0 +2 +2 +2 +0 +3 +1 +0 +4 +2 +1 +2 +2 +0 +4 +0 +0 +0 +4 +4 +0 +4 +3 +0 +1 +0 +2 +1 +4 +4 +2 +1 +2 +3 +2 +0 +0 +1 +3 +0 +3 +1 +0 +4 +0 +1 +2 +0 +3 +2 +0 +0 +3 +4 +2 +4 +0 +2 +1 +1 +2 +0 +0 +0 +3 +2 +0 +0 +3 +2 +0 +3 +0 +2 +2 +0 +0 +0 +0 +4 +0 +3 +2 +0 +0 +0 +3 +0 +0 +0 +0 +2 +0 +0 +2 +4 +4 +1 +2 +0 +1 +0 +4 +2 +2 +2 +0 +2 +0 +1 +1 +0 +0 +0 +2 +0 +3 +2 +1 +1 +0 +0 +3 +1 +1 +2 +0 +3 +3 +0 +0 +4 +0 +2 +0 +3 +0 +0 +3 +0 +1 +2 +3 +1 +2 +1 +1 +0 +4 +4 +0 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +0 +0 +0 +3 +3 +0 +1 +0 +1 +1 +2 +4 +0 +2 +2 +0 +4 +0 +3 +2 +0 +0 +2 +0 +3 +0 +3 +3 +0 +4 +3 +0 +0 +0 +4 +2 +0 +4 +0 +0 +0 +4 +0 +1 +0 +0 +3 +1 +1 +4 +3 +4 +0 +0 +0 +4 +4 +4 +1 +1 +0 +0 +0 +2 +3 +1 +3 +0 +4 +2 +1 +3 +1 +0 +3 +0 +1 +4 +3 +2 +0 +0 +0 +3 +1 +0 +0 +0 +1 +0 +4 +1 +0 +0 +0 +0 +2 +0 +2 +0 +2 +4 +4 +0 +3 +4 +1 +1 +0 +2 +0 +2 +1 +0 +2 +0 +4 +0 +4 +4 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +3 +0 +0 +0 +0 +0 +0 +0 +3 +0 +4 +2 +0 +0 +4 +2 +0 +0 +0 +1 +1 +0 +1 +3 +2 +0 +0 +0 +1 +3 +3 +0 +4 +3 +1 +2 +1 +3 +0 +3 +0 +0 +4 +4 +1 +0 +0 +2 +0 +4 +4 +0 +0 +2 +0 +4 +0 +4 +0 +1 +3 +1 +0 +3 +1 +1 +3 +2 +0 +0 +0 +3 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +3 +0 +0 +1 +1 +0 +0 +0 +3 +3 +0 +1 +2 +0 +0 +0 +1 +3 +0 +0 +0 +0 +0 +3 +4 +4 +0 +2 +0 +0 +0 +3 +2 +0 +3 +3 +0 +0 +0 +0 +4 +1 +3 +3 +4 +3 +1 +1 +0 +0 +4 +3 +0 +1 +2 +1 +0 +4 +3 +1 +1 +1 +2 +2 +3 +0 +2 +2 +0 +1 +0 +0 +3 +4 +1 +1 +2 +0 +0 +2 +2 +2 +3 +2 +2 +3 +0 +1 +0 +0 +3 +1 +0 +0 +0 +3 +2 +0 +1 +3 +2 +2 +0 +0 +0 +0 +3 +4 +0 +3 +0 +1 +0 +1 +1 +0 +0 +1 +0 +0 +4 +3 +1 +0 +0 +2 +3 +1 +0 +0 +4 +4 +0 +2 +0 +1 +3 +4 +2 +0 +0 +0 +0 +0 +2 +0 +1 +3 +0 +0 +2 +2 +0 +0 +4 +0 +0 +0 +4 +4 +2 +0 +1 +1 +0 +0 +0 +4 +4 +0 +3 +0 +0 +0 +4 +2 +2 +1 +4 +3 +3 +3 +1 +0 +0 +4 +0 +4 +0 +4 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +0 +2 +0 +1 +0 +1 +0 +4 +4 +0 +1 +4 +0 +2 +4 +2 +0 +0 +0 +0 +0 +3 +3 +0 +2 +2 +0 +4 +1 +0 +0 +0 +0 +2 +0 +4 +1 +3 +0 +2 +0 +4 +1 +1 +3 +2 +1 +0 +2 +0 +4 +4 +0 +0 +4 +2 +2 +4 +0 +1 +2 +3 +4 +3 +0 +4 +2 +0 +0 +3 +3 +0 +4 +4 +2 +0 +0 +1 +0 +0 +4 +2 +0 +0 +4 +2 +4 +0 +0 +3 +0 +0 +0 +1 +4 +1 +0 +2 +0 +4 +1 +4 +2 +2 +1 +0 +0 +2 +3 +2 +1 +4 +3 +2 +0 +4 +2 +0 +4 +0 +4 +3 +2 +0 +1 +2 +0 +1 +0 +1 +4 +0 +0 +0 +2 +1 +0 +1 +0 +4 +2 +4 +1 +0 +0 +2 +4 +0 +0 +0 +1 +3 +3 +0 +0 +0 +0 +3 +0 +2 +3 +4 +1 +4 +2 +4 +4 +1 +0 +3 +0 +3 +1 +0 +1 +0 +2 +4 +0 +1 +3 +3 +0 +0 +3 +0 +1 +3 +0 +0 +0 +0 +2 +1 +0 +3 +0 +3 +3 +0 +2 +0 +2 +2 +1 +1 +4 +0 +0 +0 +0 +1 +3 +1 +4 +3 +3 +1 +0 +0 +1 +0 +1 +2 +0 +4 +0 +0 +4 +0 +0 +0 +2 +3 +2 +0 +3 +0 +0 +0 +3 +1 +0 +0 +2 +0 +4 +3 +0 +0 +0 +3 +2 +4 +3 +3 +2 +0 +0 +0 +0 +0 +4 +2 +4 +2 +0 +0 +4 +1 +3 +0 +0 +1 +0 +3 +4 +3 +3 +0 +4 +3 +2 +3 +1 +0 +0 +2 +2 +1 +0 +0 +2 +0 +0 +0 +0 +0 +3 +1 +1 +0 +0 +1 +0 +2 +0 +3 +4 +0 +2 +0 +0 +1 +0 +0 +0 +1 +2 +3 +3 +4 +4 +2 +3 +2 +0 +2 +0 +2 +1 +4 +0 +0 +3 +0 +4 +3 +0 +4 +0 +0 +4 +0 +3 +0 +2 +1 +2 +3 +0 +0 +0 +2 +3 +0 +0 +2 +2 +0 +0 +0 +0 +0 +3 +1 +3 +0 +4 +1 +0 +1 +0 +4 +3 +1 +0 +0 +2 +3 +0 +3 +2 +1 +0 +0 +0 +3 +0 +3 +0 +2 +0 +4 +0 +0 +4 +0 +0 +0 +0 +1 +0 +4 +2 +1 +1 +4 +0 +2 +0 +4 +1 +0 +4 +4 +0 +0 +0 +0 +3 +0 +0 +2 +4 +2 +2 +1 +0 +3 +4 +3 +4 +0 +0 +1 +0 +3 +0 +0 +3 +4 +1 +1 +4 +0 +2 +2 +0 +0 +0 +2 +0 +1 +0 +2 +0 +0 +1 +4 +0 +4 +3 +2 +0 +0 +4 +0 +3 +0 +2 +1 +3 +2 +0 +3 +1 +0 +0 +0 +3 +1 +0 +0 +3 +3 +4 +4 +0 +3 +0 +1 +3 +0 +2 +2 +0 +1 +0 +0 +0 +0 +0 +0 +3 +0 +4 +0 +0 +0 +4 +4 +0 +2 +0 +1 +4 +3 +4 +0 +0 +0 +4 +0 +4 +0 +0 +3 +0 +0 +2 +4 +4 +2 +1 +0 +4 +2 +3 +0 +0 +3 +0 +4 +0 +0 +4 +0 +2 +1 +0 +0 +2 +0 +0 +1 +2 +1 +1 +1 +0 +2 +0 +1 +2 +0 +0 +0 +2 +0 +3 +1 +0 +1 +1 +4 +0 +0 +0 +0 +3 +2 +0 +0 +0 +0 +2 +4 +0 +1 +2 +0 +3 +2 +0 +2 +2 +0 +2 +3 +1 +0 +0 +4 +0 +2 +4 +0 +1 +4 +0 +0 +0 +3 +0 +1 +0 +4 +0 +4 +4 +0 +1 +0 +4 +2 +0 +0 +1 +2 +1 +3 +4 +0 +2 +3 +3 +4 +0 +3 +0 +0 +1 +0 +1 +1 +4 +2 +2 +2 +1 +4 +0 +2 +0 +0 +0 +0 +2 +0 +4 +0 +2 +0 +0 +4 +0 +4 +0 +1 +2 +0 +2 +1 +4 +2 +3 +0 +0 +2 +0 +1 +0 +0 +0 +2 +3 +2 +0 +0 +0 +0 +3 +3 +0 +4 +0 +4 +0 +0 +1 +1 +3 +3 +0 +3 +3 +0 +0 +3 +2 +0 +3 +0 +0 +1 +0 +2 +0 +3 +4 +2 +2 +2 +2 +0 +4 +4 +0 +0 +3 +1 +2 +4 +4 +3 +4 +0 +0 +3 +0 +0 +0 +0 +0 +1 +2 +4 +3 +0 +4 +0 +4 +4 +1 +3 +0 +0 +0 +4 +2 +4 +1 +2 +0 +0 +0 +3 +1 +2 +0 +4 +0 +0 +2 +0 +0 +0 +0 +0 +0 +3 +1 +0 +0 +0 +0 +0 +3 +3 +0 +1 +2 +2 +3 +0 +3 +1 +2 +4 +2 +3 +4 +4 +2 +0 +1 +0 +0 +2 +0 +0 +1 +4 +2 +0 +1 +0 +4 +4 +3 +1 +0 +0 +2 +0 +1 +0 +0 +3 +4 +3 +0 +0 +0 +1 +3 +4 +2 +3 +3 +0 +4 +4 +2 +0 +2 +0 +0 +4 +3 +0 +4 +1 +2 +0 +0 +3 +2 +2 +1 +3 +3 +3 +4 +0 +3 +3 +4 +0 +2 +0 +0 +0 +4 +0 +0 +1 +0 +0 +0 +0 +2 +3 +0 +2 +0 +0 +0 +0 +4 +0 +0 +0 +4 +4 +0 +3 +3 +0 +2 +0 +0 +4 +0 +4 +0 +2 +0 +2 +4 +0 +1 +4 +1 +2 +0 +0 +4 +1 +0 +1 +4 +0 +0 +0 +3 +1 +3 +0 +0 +3 +0 +1 +0 +2 +0 +3 +0 +1 +4 +4 +0 +1 +0 +0 +0 +0 +0 +3 +2 +1 +0 +0 +2 +2 +0 +0 +0 +0 +2 +3 +0 +0 +2 +1 +0 +2 +0 +0 +3 +0 +0 +3 +2 +4 +0 +4 +1 +1 +4 +3 +0 +0 +3 +0 +4 +3 +0 +0 +1 +0 +2 +0 +3 +4 +4 +2 +0 +0 +0 +3 +0 +4 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +0 +1 +0 +0 +3 +1 +0 +4 +0 +0 +4 +0 +0 +0 +0 +0 +4 +0 +3 +2 +0 +0 +0 +0 +2 +0 +4 +0 +0 +0 +2 +3 +4 +0 +1 +4 +0 +0 +0 +0 +0 +3 +2 +2 +0 +0 +1 +3 +1 +2 +4 +4 +0 +0 +2 +1 +2 +2 +0 +3 +4 +2 +4 +4 +0 +0 +0 +4 +2 +0 +2 +4 +0 +0 +0 +0 +1 +2 +2 +0 +3 +3 +0 +4 +2 +0 +3 +0 +3 +0 +3 +4 +3 +1 +2 +2 +0 +2 +2 +0 +0 +0 +1 +1 +2 +0 +2 +1 +0 +1 +4 +4 +1 +1 +4 +0 +3 +3 +0 +0 +2 +2 +2 +4 +0 +4 +3 +3 +3 +3 +0 +0 +0 +4 +0 +2 +0 +2 +3 +0 +1 +0 +0 +0 +0 +0 +3 +0 +1 +2 +0 +0 +3 +3 +3 +0 +0 +3 +1 +2 +0 +0 +2 +0 +1 +0 +4 +0 +2 +3 +0 +4 +0 +4 +4 +3 +0 +0 +1 +0 +0 +4 +3 +0 +1 +4 +4 +4 +1 +0 +1 +0 +0 +4 +1 +1 +4 +3 +2 +0 +2 +0 +1 +2 +3 +4 +4 +1 +0 +1 +4 +3 +0 +4 +3 +0 +3 +0 +2 +0 +0 +4 +0 +0 +2 +3 +3 +3 +1 +4 +4 +2 +3 +3 +0 +0 +1 +2 +0 +0 +1 +1 +0 +4 +0 +2 +0 +4 +1 +3 +1 +1 +0 +0 +0 +0 +0 +0 +0 +1 +4 +0 +2 +1 +4 +0 +0 +3 +0 +1 +2 +1 +0 +4 +4 +0 +2 +0 +1 +2 +1 +2 +1 +2 +0 +1 +1 +4 +4 +0 +1 +1 +0 +2 +3 +0 +4 +2 +3 +1 +3 +1 +2 +1 +0 +2 +1 +2 +2 +2 +3 +1 +0 +0 +0 +3 +3 +0 +3 +0 +0 +3 +0 +0 +1 +0 +0 +4 +4 +4 +0 +2 +1 +0 +0 +2 +4 +3 +3 +2 +2 +0 +0 +4 +1 +1 +0 +1 +0 +2 +0 +0 +1 +0 +3 +3 +0 +0 +0 +1 +0 +2 +0 +0 +0 +0 +0 +0 +4 +4 +0 +3 +0 +0 +0 +1 +0 +3 +0 +0 +4 +0 +3 +0 +1 +3 +0 +1 +3 +1 +4 +2 +0 +3 +2 +1 +1 +0 +0 +0 +0 +2 +2 +0 +0 +4 +4 +1 +0 +0 +2 +0 +4 +0 +3 +4 +2 +1 +1 +4 +4 +0 +0 +0 +0 +4 +1 +3 +0 +0 +3 +3 +3 +3 +1 +4 +3 +0 +3 +0 +2 +2 +1 +3 +0 +0 +4 +0 +1 +1 +3 +0 +0 +1 +2 +4 +2 +1 +0 +0 +0 +0 +4 +0 +4 +2 +3 +0 +0 +2 +0 +3 +4 +4 +2 +0 +0 +1 +0 +2 +1 +4 +4 +1 +0 +4 +0 +0 +0 +0 +0 +2 +2 +2 +3 +0 +0 +0 +0 +0 +3 +0 +0 +0 +0 +1 +3 +3 +2 +0 +0 +0 +1 +1 +1 +4 +0 +4 +4 +0 +3 +3 +4 +0 +0 +0 +1 +3 +2 +0 +0 +0 +2 +4 +0 +3 +0 +0 +0 +0 +0 +0 +1 +0 +4 +1 +3 +4 +2 +0 +0 +3 +1 +1 +0 +3 +2 +3 +0 +3 +1 +1 +4 +3 +0 +0 +0 +3 +4 +4 +3 +4 +4 +1 +1 +2 +3 +2 +2 +2 +0 +0 +0 +2 +3 +4 +3 +2 +1 +3 +2 +1 +3 +1 +0 +1 +0 +1 +3 +4 +2 +3 +3 +1 +0 +4 +0 +1 +1 +2 +4 +3 +4 +0 +1 +3 +3 +0 +4 +3 +3 +0 +2 +4 +2 +4 +0 +0 +0 +4 +4 +1 +1 +0 +3 +0 +0 +0 +3 +3 +0 +0 +3 +0 +0 +1 +0 +0 +0 +4 +0 +0 +0 +4 +4 +3 +0 +3 +0 +0 +0 +3 +3 +0 +0 +0 +4 +1 +2 +1 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +1 +1 +0 +0 +2 +0 +1 +3 +0 +0 +1 +0 +2 +4 +0 +0 +3 +1 +3 +0 +0 +3 +1 +0 +3 +4 +0 +4 +0 +0 +0 +3 +1 +2 +0 +0 +0 +0 +1 +1 +2 +1 +0 +0 +2 +4 +0 +4 +1 +4 +1 +2 +4 +2 +4 +0 +1 +0 +0 +0 +4 +0 +1 +0 +0 +1 +0 +0 +2 +3 +0 +0 +2 +0 +3 +4 +0 +1 +4 +0 +0 +0 +0 +0 +1 +0 +3 +0 +3 +0 +2 +4 +2 +0 +3 +0 +1 +2 +1 +3 +4 +1 +3 +0 +0 +0 +4 +0 +4 +4 +0 +3 +0 +3 +2 +3 +4 +0 +0 +0 +3 +0 +1 +4 +1 +1 +0 +0 +4 +0 +0 +0 +0 +2 +1 +0 +0 +0 +0 +1 +2 +0 +1 +1 +0 +0 +1 +2 +0 +4 +0 +1 +3 +0 +3 +4 +2 +0 +0 +1 +3 +4 +0 +0 +1 +0 +1 +2 +0 +0 +4 +0 +0 +1 +4 +4 +2 +3 +0 +0 +0 +2 +0 +3 +1 +0 +4 +1 +0 +0 +3 +1 +0 +0 +3 +1 +0 +0 +2 +3 +4 +4 +2 +1 +1 +0 +4 +2 +0 +0 +0 +4 +0 +4 +3 +4 +0 +0 +1 +2 +4 +1 +0 +1 +2 +0 +0 +0 +0 +1 +0 +2 +4 +0 +2 +0 +0 +4 +4 +2 +0 +0 +1 +0 +0 +4 +3 +0 +1 +0 +0 +0 +2 +4 +0 +3 +0 +0 +3 +1 +3 +3 +0 +0 +1 +0 +0 +0 +2 +3 +0 +0 +1 +0 +4 +3 +0 +0 +4 +1 +4 +0 +0 +0 +1 +1 +0 +0 +0 +0 +0 +1 +1 +0 +1 +2 +4 +0 +0 +0 +0 +0 +0 +1 +0 +2 +1 +0 +0 +0 +3 +0 +3 +0 +0 +0 +0 +0 +4 +0 +3 +1 +0 +0 +4 +0 +1 +0 +4 +0 +4 +0 +0 +0 +0 +0 +3 +1 +0 +3 +0 +1 +0 +0 +2 +4 +0 +4 +2 +4 +4 +1 +3 +2 +3 +0 +4 +3 +1 +2 +3 +0 +1 +1 +3 +3 +1 +0 +0 +1 +4 +0 +2 +0 +0 +0 +0 +1 +4 +0 +0 +4 +4 +2 +4 +0 +0 +2 +0 +0 +0 +0 +3 +2 +2 +2 +0 +4 +2 +3 +1 +2 +0 +3 +3 +2 +0 +1 +0 +0 +0 +3 +2 +3 +0 +2 +3 +0 +0 +3 +0 +0 +4 +1 +0 +0 +3 +2 +0 +1 +1 +3 +4 +0 +1 +0 +0 +4 +0 +2 +0 +4 +0 +0 +1 +0 +2 +3 +2 +0 +0 +0 +1 +2 +1 +2 +0 +2 +3 +1 +4 +4 +1 +3 +3 +2 +3 +3 +0 +0 +3 +1 +1 +1 +0 +0 +4 +1 +4 +3 +1 +0 +0 +1 +0 +0 +0 +3 +0 +0 +4 +4 +0 +2 +3 +0 +4 +4 +2 +3 +0 +0 +0 +4 +4 +0 +0 +2 +0 +0 +0 +4 +2 +2 +0 +3 +4 +1 +2 +0 +4 +2 +0 +0 +0 +1 +0 +0 +0 +0 +0 +0 +0 +0 +1 +3 +3 +0 +2 +0 +2 +0 +2 +0 +0 +0 +0 +0 +1 +0 +1 +0 +4 +0 +2 +3 +1 +1 +4 +4 +0 +0 +0 +0 +2 +3 +0 +0 +2 +2 +0 +4 +0 +0 +2 +0 +2 +3 +1 +0 +4 +2 +4 +0 +1 +0 +1 +2 +4 +1 +1 +2 +0 +0 +0 +2 +0 +0 +1 +3 +0 +0 +4 +0 +0 +4 +0 +1 +0 +4 +1 +0 +0 +2 +2 +0 +2 +0 +0 +0 +2 +0 +0 +3 +2 +0 +0 +2 +4 +2 +0 +0 +1 +0 +3 +0 +2 +3 +0 +1 +0 +3 +4 +2 +0 +2 +0 +3 +0 +2 +4 +1 +0 +4 +3 +0 +0 +2 +0 +0 +0 +3 +2 +0 +1 +4 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +1 +4 +2 +4 +0 +1 +4 +0 +4 +0 +0 +0 +0 +0 +0 +4 +0 +0 +0 +4 +3 +0 +1 +0 +3 +0 +2 +3 +4 +3 +0 +3 +0 +2 +0 +0 +2 +0 +4 +2 +0 +0 +1 +3 +3 +1 +0 +0 +0 +0 +4 +0 +2 +3 +0 +0 +0 +2 +0 +0 +0 +3 +0 +1 +0 +0 +1 +0 +4 +0 +0 +3 +2 +0 +0 +0 +0 +2 +2 +1 +0 +0 +3 +1 +0 +0 +0 +4 +2 +0 +4 +0 +3 +2 +1 +0 +4 +1 +3 +1 +0 +0 +2 +0 +2 +0 +0 +2 +3 +3 +1 +1 +1 +0 +0 +2 +3 +1 +0 +0 +0 +2 +0 +0 +0 +0 +0 +0 +0 +3 +4 +4 +1 +4 +0 +2 +0 +4 +0 +0 +2 +2 +1 +2 +0 +3 +3 +0 +1 +0 +1 +2 +0 +4 +3 +0 +0 +2 +0 +0 +2 +1 +0 +0 +2 +0 +2 +1 +1 +0 +3 +0 +0 +0 +4 +0 +0 +0 +0 +3 +0 +0 +3 +0 +4 +0 +2 +2 +0 +0 +4 +1 +0 +4 +3 +0 +0 +1 +4 +3 +0 +2 +1 +0 +0 +1 +2 +0 +1 +1 +0 +2 +3 +0 +3 +4 +1 +3 +0 +0 +1 +0 +3 +4 +3 +0 +1 +3 +0 +3 +0 +0 +2 +0 +0 +3 +0 +4 +0 +0 +1 +2 +4 +4 +4 +0 +0 +1 +3 +2 +0 +1 +1 +2 +2 +4 +0 +0 +3 +0 +3 +0 +0 +3 +4 +1 +1 +0 +0 +2 +0 +0 +4 +2 +3 +0 +3 +2 +0 +2 +0 +1 +0 +1 +0 +0 +3 +1 +2 +3 +0 +0 +1 +2 +1 +0 +4 +0 +4 +0 +3 +2 +1 +4 +0 +3 +1 +2 +0 +0 +1 +0 +4 +0 +4 +1 +4 +4 +2 +2 +4 +3 +0 +2 +3 +3 +0 +1 +2 +4 +3 +0 +3 +0 +2 +4 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +3 +3 +1 +0 +0 +0 +0 +0 +1 +2 +0 +0 +4 +2 +2 +1 +4 +1 +0 +1 +2 +2 +1 +1 +3 +3 +4 +1 +1 +0 +4 +0 +0 +3 +0 +4 +3 +2 +0 +4 +4 +0 +3 +0 +0 +0 +1 +1 +0 +0 +4 +0 +0 +1 +0 +0 +0 +0 +1 +3 +0 +0 +0 +0 +0 +0 +1 +4 +4 +2 +4 +2 +0 +0 +0 +0 +2 +0 +0 +2 +0 +0 +2 +4 +1 +2 +2 +3 +3 +0 +1 +4 +4 +1 +3 +3 +1 +0 +2 +2 +4 +2 +0 +4 +0 +2 +2 +0 +0 +1 +1 +1 +2 +0 +3 +0 +0 +2 +0 +0 +0 +0 +1 +0 +1 +2 +1 +0 +0 +2 +4 +1 +0 +4 +1 +0 +0 +0 +0 +0 +1 +0 +2 +0 +0 +0 +4 +3 +1 +0 +0 +3 +4 +2 +2 +0 +2 +1 +0 +0 +0 +1 +2 +2 +2 +1 +2 +0 +4 +0 +0 +0 +0 +0 +4 +2 +0 +4 +3 +0 +0 +3 +0 +4 +2 +4 +0 +1 +0 +0 +0 +3 +2 +1 +0 +3 +4 +4 +0 +0 +0 +4 +4 +0 +0 +1 +0 +0 +2 +1 +1 +3 +1 +1 +0 +1 +0 +1 +1 +0 +2 +2 +0 +0 +0 +4 +0 +0 +0 +0 +4 +2 +0 +4 +0 +3 +0 +2 +0 +0 +3 +3 +4 +0 +0 +2 +0 +0 +1 +0 +1 +1 +4 +0 +0 +0 +0 +3 +0 +3 +4 +2 +3 +1 +4 +0 +2 +1 +0 +0 +1 +0 +1 +0 +2 +2 +2 +2 +3 +0 +3 +3 +0 +3 +0 +0 +2 +0 +0 +0 +3 +2 +2 +0 +0 +3 +0 +2 +0 +2 +2 +0 +1 +1 +3 +0 +2 +0 +4 +2 +1 +0 +0 +3 +3 +2 +0 +1 +1 +1 +0 +4 +4 +2 +3 +3 +0 +0 +3 +3 +0 +4 +4 +1 +1 +1 +2 +0 +1 +1 +0 +0 +0 +2 +0 +1 +2 +1 +0 +0 +2 +0 +0 +2 +3 +1 +3 +1 +4 +0 +4 +3 +3 +4 +4 +0 +2 +2 +0 +0 +3 +3 +0 +3 +2 +0 +3 +0 +3 +3 +4 +0 +0 +3 +4 +0 +3 +3 +4 +2 +1 +3 +3 +2 +0 +4 +1 +1 +0 +4 +3 +0 +0 +0 +0 +2 +4 +1 +1 +1 +4 +0 +0 +1 +1 +0 +4 +0 +3 +1 +2 +4 +4 +4 +2 +4 +4 +3 +0 +0 +3 +0 +0 +2 +0 +0 +0 +1 +0 +3 +0 +1 +1 +0 +3 +2 +0 +3 +0 +0 +2 +0 +3 +1 +3 +0 +0 +4 +0 +2 +3 +4 +0 +0 +2 +0 +4 +3 +1 +4 +0 +2 +1 +0 +4 +0 +1 +3 +0 +0 +0 +1 +0 +2 +0 +2 +0 +3 +0 +1 +0 +0 +4 +0 +2 +0 +0 +0 +0 +0 +3 +0 +3 +0 +2 +0 +0 +0 +0 +2 +4 +0 +0 +3 +4 +3 +0 +0 +2 +0 +1 +0 +2 +0 +3 +2 +2 +3 +3 +4 +0 +4 +0 +3 +2 +1 +0 +4 +0 +0 +1 +2 +0 +0 +3 +0 +0 +4 +1 +1 +0 +0 +3 +1 +0 +1 +1 +4 +0 +0 +0 +0 +4 +1 +0 +2 +0 +0 +0 +4 +0 +0 +4 +4 +0 +1 +0 +2 +2 +4 +0 +2 +3 +3 +1 +0 +0 +4 +0 +1 +0 +0 +0 +0 +0 +1 +3 +1 +4 +0 +0 +1 +0 +0 +2 +1 +0 +0 +3 +4 +1 +0 +0 +3 +0 +2 +3 +4 +4 +0 +2 +0 +3 +0 +0 +3 +2 +0 +3 +0 +1 +3 +4 +0 +1 +4 +0 +0 +3 +2 +4 +0 +3 +0 +4 +3 +1 +2 +1 +2 +0 +0 +2 +0 +4 +3 +0 +2 +4 +0 +4 +0 +2 +0 +2 +0 +0 +4 +4 +2 +0 +2 +3 +0 +0 +0 +1 +1 +2 +0 +0 +3 +0 +0 +4 +0 +0 +0 +3 +0 +2 +4 +4 +0 +0 +0 +0 +0 +0 +2 +4 +4 +4 +4 +0 +3 +3 +0 +3 +1 +4 +0 +3 +0 +4 +0 +0 +2 +0 +3 +0 +0 +2 +0 +0 +2 +0 +3 +4 +0 +4 +0 +0 +0 +3 +3 +4 +2 +0 +1 +2 +4 +1 +1 +3 +0 +0 +3 +2 +3 +3 +1 +4 +1 +2 +2 +1 +2 +4 +0 +0 +3 +4 +4 +4 +1 +0 +0 +3 +0 +0 +1 +0 +3 +0 +0 +0 +3 +3 +2 +4 +0 +0 +4 +0 +0 +0 +4 +3 +4 +4 +0 +4 +0 +0 +1 +0 +2 +0 +1 +1 +0 +4 +4 +0 +2 +0 +3 +0 +2 +2 +0 +0 +0 +0 +0 +4 +1 +0 +0 +0 +4 +0 +4 +0 +0 +0 +0 +0 +0 +0 +2 +3 +1 +0 +3 +3 +0 +0 +3 +4 +0 +2 +0 +3 +3 +0 +1 +1 +2 +4 +0 +0 +4 +0 +3 +0 +1 +3 +0 +1 +0 +0 +0 +0 +4 +1 +0 +0 +0 +4 +3 +1 +0 +0 +3 +2 +4 +1 +3 +3 +4 +0 +4 +0 +4 +0 +4 +0 +0 +4 +2 +0 +2 +2 +1 +2 +1 +3 +0 +4 +0 +4 +0 +1 +0 +4 +0 +0 +4 +2 +0 +1 +1 +0 +3 +4 +2 +3 +3 +0 +3 +1 +3 +0 +2 +0 +0 +2 +1 +0 +0 +3 +3 +0 +1 +2 +0 +0 +3 +3 +0 +2 +2 +0 +1 +0 +3 +0 +4 +0 +2 +0 +4 +2 +2 +0 +0 +3 +0 +1 +3 +0 +1 +0 +4 +3 +0 +0 +3 +0 +4 +1 +4 +0 +2 +1 +0 +0 +1 +1 +3 +0 +0 +1 +0 +3 +3 +4 +3 +0 +2 +0 +0 +4 +0 +0 +2 +0 +1 +2 +0 +0 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +0 +4 +0 +1 +2 +2 +0 +1 +0 +0 +0 +1 +1 +0 +0 +4 +0 +0 +3 +0 +4 +0 +2 +0 +0 +0 +2 +2 +2 +3 +3 +0 +0 +0 +1 +2 +1 +4 +0 +0 +0 +1 +2 +0 +0 +3 +0 +4 +1 +1 +3 +3 +4 +0 +0 +0 +1 +0 +4 +0 +2 +3 +1 +2 +2 +4 +0 +3 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +0 +0 +3 +0 +1 +3 +4 +1 +1 +4 +0 +3 +2 +0 +1 +0 +3 +0 +4 +3 +3 +2 +0 +2 +0 +4 +3 +0 +0 +3 +2 +3 +3 +2 +1 +0 +3 +2 +0 +1 +2 +1 +3 +2 +2 +0 +1 +0 +3 +0 +0 +0 +4 +2 +3 +0 +4 +0 +0 +3 +0 +0 +4 +2 +0 +3 +0 +0 +3 +1 +4 +3 +3 +3 +4 +3 +2 +3 +0 +2 +0 +3 +3 +0 +2 +3 +3 +4 +0 +2 +4 +0 +0 +0 +0 +2 +0 +0 +0 +1 +0 +3 +0 +1 +2 +0 +2 +1 +3 +4 +0 +0 +0 +0 +2 +0 +0 +0 +2 +0 +4 +0 +1 +0 +1 +0 +2 +4 +0 +1 +0 +1 +0 +4 +1 +0 +2 +0 +0 +2 +4 +2 +3 +2 +0 +0 +0 +1 +1 +0 +4 +0 +3 +4 +0 +2 +4 +0 +3 +0 +2 +0 +0 +0 +0 +0 +1 +0 +4 +0 +0 +0 +3 +0 +0 +1 +3 +2 +0 +2 +1 +2 +2 +3 +0 +0 +0 +4 +3 +3 +4 +4 +0 +4 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +1 +0 +0 +0 +4 +0 +2 +0 +3 +0 +4 +1 +4 +0 +0 +4 +3 +0 +0 +3 +1 +0 +4 +2 +1 +0 +0 +0 +0 +0 +0 +0 +2 +3 +0 +2 +4 +0 +2 +0 +1 +3 +3 +0 +0 +4 +2 +3 +1 +1 +3 +3 +3 +1 +3 +3 +4 +2 +0 +2 +0 +4 +2 +2 +4 +4 +3 +0 +1 +3 +4 +0 +0 +1 +4 +1 +2 +0 +0 +2 +2 +0 +0 +4 +0 +0 +0 +1 +2 +1 +4 +0 +4 +1 +0 +0 +2 +0 +0 +4 +1 +3 +4 +0 +2 +1 +0 +0 +0 +3 +4 +0 +0 +0 +0 +1 +3 +0 +3 +4 +1 +0 +4 +3 +2 +0 +0 +3 +0 +0 +1 +0 +4 +2 +0 +2 +4 +0 +1 +0 +4 +3 +2 +0 +1 +0 +3 +3 +3 +0 +1 +0 +2 +0 +0 +1 +3 +3 +0 +4 +0 +3 +0 +3 +0 +4 +1 +1 +0 +3 +2 +0 +0 +4 +4 +3 +0 +2 +0 +0 +3 +0 +4 +0 +4 +0 +1 +3 +0 +3 +1 +2 +1 +2 +4 +3 +0 +2 +1 +0 +1 +0 +0 +0 +4 +0 +3 +0 +1 +0 +0 +0 +2 +0 +0 +4 +3 +4 +2 +1 +0 +1 +0 +4 +0 +4 +3 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +4 +0 +3 +1 +2 +1 +2 +0 +0 +4 +0 +0 +0 +2 +3 +0 +3 +0 +1 +0 +0 +2 +0 +0 +4 +3 +3 +0 +0 +2 +4 +0 +4 +0 +0 +0 +3 +1 +0 +1 +0 +0 +0 +0 +0 +0 +4 +3 +1 +3 +3 +2 +2 +0 +3 +0 +3 +0 +1 +2 +4 +0 +1 +4 +2 +0 +0 +4 +2 +2 +4 +4 +0 +2 +4 +0 +0 +0 +3 +3 +0 +3 +0 +0 +3 +0 +1 +2 +0 +1 +1 +0 +2 +3 +3 +3 +0 +1 +0 +1 +0 +3 +0 +4 +1 +2 +4 +0 +0 +3 +0 +0 +0 +0 +3 +0 +3 +3 +4 +2 +3 +0 +2 +0 +2 +2 +2 +0 +4 +0 +2 +0 +0 +0 +0 +4 +1 +1 +2 +0 +4 +0 +1 +0 +4 +3 +0 +0 +1 +0 +0 +0 +4 +0 +2 +2 +0 +2 +1 +0 +0 +4 +2 +0 +4 +4 +3 +0 +2 +4 +3 +0 +4 +1 +3 +0 +0 +1 +4 +1 +4 +0 +3 +0 +3 +3 +0 +4 +0 +3 +0 +0 +4 +2 +1 +4 +4 +0 +3 +2 +0 +4 +0 +4 +0 +2 +1 +0 +0 +2 +0 +0 +1 +2 +4 +1 +0 +0 +4 +0 +0 +0 +1 +0 +0 +0 +0 +1 +0 +0 +1 +4 +0 +0 +0 +0 +2 +2 +1 +0 +3 +3 +3 +0 +3 +2 +0 +0 +2 +3 +4 +0 +3 +0 +3 +1 +2 +1 +1 +0 +3 +4 +1 +0 +4 +4 +1 +4 +0 +2 +0 +0 +0 +3 +0 +0 +2 +3 +0 +2 +3 +4 +0 +4 +4 +0 +4 +0 +4 +2 +1 +3 +0 +0 +0 +4 +4 +0 +1 +4 +1 +0 +0 +4 +0 +4 +0 +0 +1 +0 +2 +0 +4 +0 +2 +1 +2 +0 +0 +3 +1 +0 +2 +0 +1 +0 +0 +0 +0 +4 +2 +1 +1 +0 +1 +4 +0 +0 +2 +3 +3 +0 +3 +2 +0 +0 +0 +4 +0 +0 +0 +4 +2 +2 +4 +4 +0 +2 +0 +0 +0 +3 +0 +4 +4 +0 +3 +1 +0 +4 +0 +0 +0 +3 +2 +3 +4 +3 +1 +3 +0 +0 +2 +2 +0 +0 +0 +4 +2 +3 +0 +4 +4 +4 +4 +1 +3 +2 +3 +3 +0 +2 +2 +2 +2 +4 +2 +0 +0 +0 +3 +0 +2 +2 +0 +4 +2 +0 +2 +3 +2 +4 +0 +4 +1 +0 +0 +0 +0 +0 +1 +0 +1 +0 +0 +4 +0 +4 +0 +2 +0 +4 +3 +2 +0 +3 +0 +0 +0 +3 +2 +1 +4 +3 +1 +0 +0 +2 +3 +0 +1 +0 +1 +4 +3 +3 +0 +2 +0 +4 +0 +2 +0 +1 +4 +1 +3 +0 +2 +0 +0 +1 +3 +0 +2 +0 +0 +3 +1 +0 +2 +0 +4 +0 +0 +1 +0 +4 +4 +0 +0 +4 +3 +0 +0 +1 +0 +0 +3 +0 +1 +0 +0 +0 +0 +4 +1 +0 +0 +2 +0 +0 +3 +3 +0 +0 +2 +3 +4 +3 +1 +4 +3 +2 +1 +1 +2 +0 +3 +2 +1 +0 +0 +0 +4 +0 +1 +2 +0 +0 +1 +0 +0 +0 +1 +1 +4 +0 +0 +0 +0 +0 +1 +3 +0 +0 +0 +2 +0 +0 +3 +0 +0 +2 +4 +2 +3 +3 +0 +4 +0 +0 +2 +4 +0 +2 +3 +0 +0 +0 +4 +2 +0 +3 +0 +0 +2 +0 +4 +0 +1 +2 +2 +0 +2 +0 +0 +3 +0 +0 +4 +0 +1 +0 +0 +3 +0 +3 +0 +0 +3 +4 +0 +4 +1 +0 +3 +0 +0 +1 +1 +3 +4 +0 +0 +3 +1 +0 +2 +2 +0 +0 +0 +0 +2 +0 +0 +1 +0 +2 +4 +3 +1 +0 +0 +0 +3 +0 +1 +4 +0 +0 +4 +0 +0 +0 +0 +0 +0 +0 +4 +0 +0 +4 +0 +2 +2 +2 +1 +2 +0 +0 +3 +4 +1 +4 +2 +2 +4 +1 +4 +1 +2 +0 +0 +0 +0 +1 +2 +3 +4 +0 +2 +0 +0 +0 +3 +0 +3 +0 +0 +0 +3 +0 +2 +0 +0 +0 +1 +4 +0 +0 +0 +0 +2 +0 +2 +0 +4 +0 +0 +0 +0 +4 +2 +1 +2 +0 +2 +0 +3 +0 +0 +0 +1 +4 +1 +2 +0 +1 +4 +0 +1 +4 +4 +0 +2 +0 +0 +0 +1 +0 +2 +0 +0 +0 +3 +1 +0 +2 +2 +4 +0 +4 +4 +2 +4 +0 +0 +0 +4 +1 +0 +0 +3 +2 +3 +1 +1 +2 +4 +3 +1 +4 +0 +0 +4 +3 +0 +0 +1 +0 +0 +1 +3 +0 +1 +3 +1 +4 +0 +3 +3 +0 +0 +1 +0 +4 +0 +0 +2 +2 +0 +3 +0 +0 +4 +0 +0 +4 +3 +3 +0 +4 +3 +2 +0 +1 +0 +0 +4 +2 +0 +0 +0 +0 +3 +3 +3 +4 +3 +2 +0 +0 +4 +2 +0 +2 +3 +1 +1 +0 +0 +3 +0 +2 +3 +1 +0 +0 +0 +0 +0 +2 +0 +1 +4 +0 +3 +3 +0 +1 +0 +2 +0 +0 +0 +0 +0 +4 +3 +1 +0 +0 +1 +3 +2 +0 +0 +4 +0 +4 +0 +1 +0 +2 +3 +0 +4 +0 +1 +0 +3 +0 +3 +4 +0 +0 +1 +2 +3 +4 +1 +4 +0 +1 +4 +3 +0 +0 +0 +4 +2 +2 +0 +4 +0 +0 +1 +3 +2 +1 +0 +2 +1 +0 +4 +1 +0 +1 +1 +3 +0 +3 +4 +1 +2 +0 +4 +1 +0 +0 +2 +4 +4 +0 +3 +1 +0 +4 +4 +2 +3 +1 +0 +0 +3 +0 +1 +0 +3 +1 +2 +3 +0 +4 +0 +3 +4 +4 +3 +1 +3 +1 +4 +3 +2 +0 +2 +4 +0 +2 +0 +3 +0 +4 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +4 +4 +0 +0 +3 +4 +0 +0 +3 +1 +2 +0 +4 +2 +0 +0 +0 +0 +4 +2 +0 +0 +1 +0 +2 +2 +2 +0 +1 +1 +0 +2 +2 +0 +0 +1 +0 +1 +0 +0 +0 +0 +4 +4 +4 +0 +3 +0 +0 +1 +1 +0 +0 +0 +1 +4 +4 +0 +3 +1 +3 +1 +0 +0 +2 +4 +0 +4 +0 +2 +3 +1 +3 +3 +3 +0 +0 +4 +4 +1 +2 +0 +1 +0 +2 +2 +0 +1 +4 +2 +0 +0 +0 +0 +0 +4 +0 +1 +3 +4 +0 +3 +1 +2 +4 +0 +1 +3 +1 +2 +3 +0 +4 +3 +0 +2 +0 +0 +0 +1 +2 +2 +4 +0 +3 +0 +0 +4 +2 +3 +1 +3 +4 +0 +0 +0 +0 +4 +3 +0 +4 +0 +0 +4 +4 +0 +2 +0 +0 +0 +4 +3 +0 +0 +1 +0 +2 +4 +0 +2 +4 +2 +1 +0 +3 +4 +0 +0 +0 +0 +0 +2 +4 +3 +0 +3 +0 +4 +3 +0 +1 +0 +2 +2 +3 +2 +0 +2 +3 +0 +3 +0 +2 +2 +1 +1 +2 +0 +0 +2 +0 +1 +1 +3 +3 +0 +0 +1 +0 +1 +3 +3 +0 +0 +2 +0 +2 +4 +1 +4 +0 +1 +0 +1 +4 +0 +4 +1 +4 +2 +0 +0 +0 +1 +0 +0 +2 +0 +0 +4 +3 +0 +3 +4 +3 +4 +1 +4 +3 +2 +4 +4 +0 +0 +1 +0 +0 +0 +4 +0 +3 +3 +0 +0 +4 +0 +1 +1 +1 +0 +3 +3 +3 +1 +3 +1 +1 +0 +0 +0 +0 +0 +4 +4 +4 +0 +3 +4 +0 +3 +0 +0 +2 +1 +4 +0 +0 +0 +2 +4 +2 +2 +0 +0 +4 +3 +2 +0 +1 +4 +4 +4 +0 +2 +0 +2 +1 +0 +3 +0 +1 +3 +2 +1 +4 +0 +0 +0 +0 +3 +2 +0 +0 +2 +3 +0 +2 +1 +4 +2 +0 +0 +3 +3 +0 +0 +0 +1 +0 +4 +0 +2 +1 +0 +2 +1 +0 +4 +4 +2 +2 +0 +0 +0 +3 +0 +3 +0 +0 +0 +2 +0 +0 +4 +0 +1 +0 +3 +0 +3 +2 +2 +0 +4 +4 +2 +0 +0 +0 +1 +1 +0 +2 +2 +0 +1 +0 +2 +2 +4 +0 +3 +0 +1 +0 +4 +3 +3 +1 +4 +0 +0 +0 +1 +0 +0 +0 +3 +0 +1 +4 +4 +0 +4 +0 +2 +0 +0 +0 +3 +0 +4 +3 +4 +0 +0 +2 +2 +2 +0 +0 +3 +0 +3 +4 +0 +0 +1 +0 +1 +4 +4 +0 +3 +0 +0 +4 +0 +2 +0 +4 +0 +0 +4 +3 +3 +0 +2 +0 +2 +0 +3 +1 +0 +0 +2 +3 +0 +2 +3 +0 +2 +4 +0 +0 +0 +2 +0 +2 +3 +3 +0 +3 +0 +1 +4 +0 +0 +1 +2 +3 +1 +0 +1 +2 +0 +2 +0 +1 +4 +0 +0 +0 +0 +4 +0 +0 +0 +4 +4 +0 +3 +0 +0 +1 +4 +4 +0 +0 +3 +3 +3 +4 +0 +0 +0 +2 +0 +0 +4 +1 +0 +4 +3 +1 +3 +2 +4 +1 +0 +4 +4 +0 +0 +1 +3 +1 +0 +2 +1 +3 +0 +0 +2 +4 +4 +4 +0 +1 +0 +1 +0 +0 +0 +1 +2 +1 +1 +1 +0 +1 +3 +0 +0 +2 +0 +2 +4 +4 +1 +1 +1 +0 +0 +4 +3 +1 +4 +0 +0 +1 +0 +1 +1 +2 +3 +0 +1 +0 +3 +0 +3 +4 +0 +2 +0 +3 +3 +2 +1 +0 +1 +0 +0 +3 +0 +1 +3 +2 +1 +4 +1 +0 +1 +0 +0 +4 +2 +0 +4 +0 +0 +2 +1 +0 +1 +0 +0 +0 +0 +0 +3 +4 +1 +1 +4 +2 +0 +3 +0 +0 +0 +1 +4 +0 +0 +0 +0 +0 +4 +3 +3 +0 +4 +2 +1 +4 +0 +2 +4 +0 +2 +4 +3 +2 +3 +0 +0 +3 +1 +0 +0 +4 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +3 +0 +0 +0 +2 +2 +1 +0 +4 +4 +0 +0 +2 +0 +0 +1 +1 +1 +0 +0 +2 +1 +0 +0 +0 +3 +0 +3 +0 +0 +3 +2 +1 +0 +3 +1 +0 +0 +0 +2 +2 +0 +4 +0 +3 +1 +0 +0 +0 +3 +0 +1 +4 +3 +0 +2 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +3 +2 +3 +1 +4 +0 +0 +0 +0 +4 +4 +2 +0 +1 +0 +2 +0 +2 +0 +0 +0 +0 +1 +4 +2 +1 +0 +0 +0 +1 +0 +3 +2 +4 +3 +3 +4 +0 +0 +0 +0 +2 +4 +1 +1 +2 +2 +1 +0 +3 +4 +0 +3 +3 +3 +0 +2 +0 +0 +4 +0 +0 +4 +1 +0 +0 +0 +0 +4 +3 +0 +0 +0 +0 +1 +4 +0 +0 +0 +0 +2 +0 +4 +0 +0 +1 +0 +0 +0 +4 +0 +0 +3 +4 +2 +4 +2 +3 +0 +0 +1 +0 +0 +0 +0 +3 +4 +2 +0 +2 +2 +4 +3 +0 +0 +0 +0 +0 +1 +1 +1 +0 +0 +2 +0 +2 +2 +0 +0 +2 +0 +4 +0 +0 +0 +0 +0 +2 +0 +0 +0 +3 +0 +1 +0 +0 +0 +3 +0 +0 +0 +4 +0 +3 +3 +2 +0 +1 +0 +0 +0 +1 +0 +1 +4 +3 +0 +1 +0 +4 +0 +4 +1 +1 +1 +4 +0 +2 +0 +4 +0 +0 +0 +4 +0 +2 +0 +1 +2 +1 +0 +0 +1 +1 +4 +3 +0 +0 +0 +2 +0 +1 +1 +2 +0 +0 +3 +4 +0 +2 +0 +2 +1 +0 +3 +0 +0 +3 +0 +0 +2 +1 +0 +4 +3 +0 +3 +0 +0 +2 +2 +0 +4 +0 +3 +0 +1 +0 +0 +2 +0 +0 +0 +3 +0 +0 +0 +4 +1 +0 +1 +0 +0 +0 +0 +2 +0 +0 +4 +4 +0 +4 +0 +0 +2 +1 +0 +0 +0 +0 +3 +1 +4 +1 +0 +0 +0 +1 +0 +3 +1 +0 +0 +2 +0 +1 +1 +1 +1 +0 +0 +3 +4 +0 +0 +1 +1 +0 +2 +2 +0 +2 +3 +3 +0 +0 +2 +1 +0 +2 +0 +4 +2 +0 +3 +2 +0 +0 +1 +2 +0 +3 +0 +2 +3 +4 +0 +3 +1 +0 +2 +2 +4 +4 +1 +0 +2 +3 +4 +4 +0 +1 +1 +0 +0 +1 +1 +0 +0 +0 +4 +0 +0 +0 +4 +0 +2 +0 +3 +4 +0 +1 +3 +1 +0 +2 +2 +0 +0 +0 +0 +4 +1 +0 +0 +3 +0 +2 +3 +0 +0 +4 +0 +0 +0 +0 +2 +4 +0 +0 +4 +4 +0 +4 +3 +0 +2 +2 +2 +0 +4 +0 +4 +4 +3 +0 +3 +0 +0 +1 +2 +0 +4 +0 +4 +0 +4 +4 +1 +1 +0 +0 +1 +1 +0 +4 +4 +0 +0 +0 +0 +0 +2 +2 +0 +4 +0 +0 +0 +0 +1 +3 +2 +0 +0 +1 +1 +2 +0 +0 +0 +0 +0 +0 +2 +3 +0 +0 +3 +0 +0 +0 +1 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +3 +1 +2 +0 +0 +1 +3 +3 +1 +0 +3 +2 +0 +0 +0 +1 +3 +3 +0 +0 +4 +0 +0 +0 +0 +4 +1 +2 +2 +0 +0 +0 +3 +0 +3 +0 +0 +3 +3 +0 +0 +0 +0 +2 +3 +1 +3 +4 +2 +0 +4 +0 +0 +0 +3 +0 +4 +4 +4 +3 +0 +4 +0 +3 +0 +0 +2 +4 +4 +0 +0 +1 +0 +0 +3 +3 +1 +1 +0 +1 +2 +0 +3 +3 +4 +4 +1 +3 +0 +1 +3 +2 +0 +0 +0 +0 +0 +4 +4 +1 +1 +0 +0 +0 +1 +4 +4 +2 +0 +3 +0 +3 +0 +0 +0 +4 +1 +4 +2 +0 +2 +2 +0 +4 +0 +0 +0 +0 +4 +1 +4 +0 +0 +0 +0 +0 +2 +2 +3 +2 +0 +0 +0 +2 +0 +2 +0 +0 +2 +0 +4 +1 +0 +2 +2 +3 +4 +3 +0 +2 +2 +0 +4 +4 +0 +0 +3 +2 +2 +0 +0 +2 +0 +0 +1 +2 +4 +0 +2 +1 +0 +2 +2 +0 +4 +4 +3 +0 +2 +0 +0 +1 +0 +0 +4 +1 +0 +2 +0 +0 +1 +2 +0 +0 +1 +0 +3 +0 +0 +4 +0 +0 +4 +3 +3 +0 +0 +4 +4 +3 +0 +1 +0 +2 +0 +0 +0 +0 +1 +4 +4 +4 +3 +4 +4 +0 +0 +1 +0 +3 +2 +4 +0 +0 +0 +4 +1 +0 +2 +2 +0 +3 +0 +0 +2 +0 +3 +0 +1 +0 +2 +3 +0 +2 +0 +1 +1 +2 +0 +3 +1 +2 +1 +0 +0 +2 +3 +0 +3 +0 +0 +1 +0 +0 +0 +2 +1 +3 +0 +1 +0 +0 +3 +0 +4 +3 +3 +1 +3 +0 +0 +1 +4 +2 +1 +2 +1 +0 +1 +0 +1 +4 +0 +4 +2 +0 +1 +2 +4 +3 +0 +1 +4 +1 +4 +0 +2 +0 +1 +0 +0 +2 +0 +0 +4 +1 +3 +1 +3 +3 +3 +2 +0 +4 +2 +0 +4 +1 +4 +1 +0 +0 +0 +3 +1 +2 +4 +0 +3 +0 +2 +0 +0 +2 +2 +0 +0 +0 +0 +4 +4 +0 +2 +2 +0 +1 +2 +0 +4 +0 +2 +2 +1 +0 +4 +0 +1 +0 +2 +3 +4 +0 +1 +4 +4 +0 +4 +3 +0 +0 +1 +4 +0 +4 +3 +3 +4 +0 +2 +0 +1 +1 +3 +2 +2 +0 +3 +0 +0 +2 +0 +2 +1 +2 +0 +2 +0 +0 +4 +4 +0 +4 +4 +0 +4 +0 +0 +0 +0 +0 +4 +3 +2 +0 +2 +0 +2 +4 +4 +1 +0 +0 +0 +3 +1 +0 +0 +0 +0 +2 +0 +0 +2 +2 +0 +2 +1 +4 +1 +4 +0 +2 +0 +1 +3 +0 +3 +3 +1 +2 +0 +1 +0 +1 +2 +2 +2 +0 +0 +0 +3 +0 +0 +0 +4 +2 +4 +0 +1 +3 +3 +3 +2 +4 +0 +0 +2 +0 +0 +1 +0 +4 +4 +0 +0 +0 +1 +4 +0 +3 +1 +2 +0 +0 +0 +3 +3 +3 +1 +0 +2 +0 +4 +0 +1 +0 +0 +0 +0 +4 +0 +4 +4 +0 +3 +4 +0 +4 +0 +0 +2 +2 +3 +3 +2 +1 +3 +2 +4 +0 +0 +0 +4 +3 +3 +0 +0 +0 +0 +3 +4 +3 +1 +2 +0 +4 +0 +0 +3 +0 +0 +1 +0 +3 +4 +0 +0 +2 +3 +2 +0 +3 +0 +0 +0 +3 +1 +0 +3 +0 +2 +1 +2 +1 +0 +0 +4 +0 +0 +0 +1 +2 +3 +0 +4 +0 +3 +3 +0 +1 +0 +1 +0 +0 +0 +1 +3 +0 +0 +0 +4 +0 +2 +4 +3 +0 +0 +0 +4 +3 +1 +2 +0 +0 +0 +0 +4 +4 +3 +0 +3 +0 +4 +0 +0 +0 +2 +2 +1 +0 +0 +2 +1 +0 +1 +0 +1 +3 +4 +3 +0 +0 +2 +0 +0 +4 +3 +1 +1 +3 +4 +3 +1 +3 +1 +0 +1 +4 +0 +3 +0 +0 +0 +0 +4 +1 +4 +4 +0 +4 +2 +4 +4 +3 +3 +1 +1 +0 +2 +3 +4 +2 +0 +3 +2 +0 +4 +2 +3 +3 +0 +2 +0 +0 +3 +0 +2 +3 +3 +0 +0 +2 +2 +0 +1 +0 +0 +1 +0 +0 +0 +3 +0 +4 +0 +2 +3 +0 +0 +4 +0 +1 +0 +0 +1 +0 +1 +0 +0 +0 +3 +0 +0 +0 +1 +0 +0 +3 +2 +0 +0 +2 +0 +0 +4 +0 +0 +0 +4 +2 +3 +0 +0 +0 +2 +0 +2 +0 +0 +4 +0 +0 +0 +3 +0 +0 +0 +4 +4 +0 +1 +2 +4 +0 +0 +1 +0 +1 +0 +1 +2 +0 +2 +0 +0 +0 +0 +0 +1 +0 +0 +0 +0 +2 +2 +0 +1 +4 +2 +1 +0 +1 +0 +0 +0 +4 +3 +0 +0 +0 +3 +1 +1 +0 +0 +1 +4 +0 +0 +0 +2 +2 +3 +0 +3 +0 +2 +0 +0 +0 +1 +2 +0 +0 +0 +2 +0 +4 +0 +3 +3 +1 +0 +4 +1 +0 +3 +0 +4 +1 +0 +4 +2 +1 +4 +3 +2 +3 +1 +2 +3 +3 +3 +0 +0 +3 +1 +1 +3 +0 +0 +4 +0 +2 +0 +0 +0 +0 +0 +0 +0 +4 +4 +0 +0 +0 +4 +0 +0 +0 +2 +0 +0 +2 +0 +3 +3 +0 +0 +0 +2 +0 +4 +3 +0 +4 +2 +3 +2 +1 +3 +0 +0 +0 +0 +4 +0 +0 +2 +3 +2 +1 +1 +0 +3 +3 +0 +0 +1 +3 +4 +0 +0 +3 +3 +0 +0 +3 +0 +1 +0 +4 +3 +3 +0 +4 +0 +2 +0 +0 +0 +1 +1 +3 +2 +4 +0 +4 +4 +0 +2 +0 +4 +1 +2 +1 +2 +0 +2 +1 +4 +0 +0 +0 +0 +1 +3 +0 +0 +0 +1 +0 +3 +3 +0 +0 +4 +3 +2 +3 +0 +0 +2 +2 +0 +3 +0 +2 +0 +3 +4 +0 +0 +0 +0 +4 +3 +0 +2 +0 +3 +0 +3 +0 +1 +4 +2 +0 +1 +4 +1 +4 +3 +3 +0 +4 +3 +4 +2 +0 +0 +4 +1 +1 +3 +4 +2 +3 +0 +2 +3 +0 +0 +0 +2 +4 +3 +0 +2 +0 +1 +2 +0 +3 +0 +0 +0 +0 +0 +4 +0 +0 +0 +2 +0 +2 +2 +3 +0 +0 +0 +0 +1 +3 +0 +2 +2 +0 +0 +0 +2 +0 +0 +2 +2 +1 +2 +0 +4 +0 +0 +0 +1 +0 +4 +3 +1 +2 +0 +3 +0 +2 +0 +1 +2 +0 +0 +4 +0 +0 +0 +0 +3 +0 +0 +1 +0 +0 +0 +3 +0 +2 +4 +2 +2 +0 +0 +4 +3 +0 +0 +4 +3 +3 +0 +0 +0 +0 +4 +0 +3 +0 +4 +2 +2 +3 +1 +4 +4 +0 +1 +0 +0 +0 +0 +3 +2 +1 +2 +0 +4 +0 +0 +0 +1 +0 +3 +0 +0 +1 +0 +1 +0 +0 +0 +0 +0 +4 +0 +4 +0 +1 +0 +0 +0 +0 +4 +1 +1 +0 +0 +0 +0 +4 +0 +0 +0 +1 +1 +0 +1 +0 +4 +0 +0 +2 +0 +1 +1 +2 +0 +2 +1 +1 +0 +0 +3 +0 +4 +0 +2 +0 +3 +4 +4 +1 +1 +0 +4 +4 +1 +0 +2 +0 +2 +0 +0 +0 +0 +0 +0 +4 +0 +4 +4 +3 +3 +3 +4 +0 +3 +3 +4 +1 +4 +1 +1 +0 +1 +0 +0 +4 +4 +2 +3 +0 +3 +0 +0 +0 +3 +2 +0 +4 +4 +0 +4 +0 +1 +1 +0 +0 +0 +1 +2 +0 +0 +4 +0 +0 +2 +3 +0 +0 +1 +0 +3 +3 +1 +4 +0 +0 +3 +4 +3 +0 +0 +0 +0 +2 +2 +2 +1 +1 +0 +3 +1 +3 +0 +3 +4 +1 +0 +1 +3 +3 +2 +1 +0 +0 +0 +0 +4 +2 +0 +2 +2 +0 +0 +0 +1 +3 +1 +0 +0 +1 +0 +0 +0 +0 +0 +0 +2 +2 +0 +1 +0 +0 +3 +0 +0 +0 +0 +1 +0 +1 +3 +3 +2 +1 +0 +3 +2 +0 +4 +0 +1 +0 +1 +0 +0 +4 +0 +2 +3 +0 +0 +0 +1 +0 +3 +3 +3 +4 +4 +0 +3 +2 +1 +2 +1 +0 +0 +3 +0 +3 +0 +0 +1 +2 +2 +3 +0 +4 +0 +1 +3 +0 +2 +3 +0 +0 +1 +0 +2 +0 +0 +3 +1 +4 +2 +0 +1 +3 +0 +2 +1 +4 +1 +2 +4 +1 +1 +4 +0 +3 +0 +1 +0 +1 +0 +3 +3 +0 +0 +0 +0 +4 +4 +4 +3 +0 +3 +1 +1 +2 +0 +4 +0 +3 +2 +3 +0 +2 +0 +4 +2 +0 +1 +2 +0 +0 +4 +0 +0 +0 +0 +3 +4 +0 +0 +4 +2 +4 +0 +0 +4 +0 +0 +4 +2 +0 +1 +3 +0 +1 +0 +4 +3 +3 +1 +2 +4 +0 +2 +1 +0 +4 +3 +0 +0 +0 +4 +4 +0 +0 +0 +4 +0 +0 +0 +0 +0 +0 +0 +2 +4 +0 +2 +0 +0 +3 +0 +0 +0 +4 +0 +0 +3 +3 +4 +3 +1 +0 +4 +0 +0 +1 +3 +0 +0 +4 +0 +1 +0 +0 +1 +1 +4 +0 +3 +0 +3 +0 +0 +0 +0 +3 +0 +0 +0 +0 +2 +2 +0 +0 +1 +3 +4 +0 +4 +0 +4 +0 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +0 +1 +3 +4 +2 +1 +3 +0 +2 +1 +0 +0 +0 +0 +0 +3 +2 +4 +1 +2 +0 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +3 +4 +0 +4 +2 +0 +0 +0 +1 +1 +2 +0 +0 +4 +2 +1 +0 +1 +1 +1 +0 +0 +0 +4 +0 +4 +1 +0 +1 +1 +0 +2 +0 +0 +4 +2 +0 +0 +0 +0 +4 +0 +1 +2 +0 +3 +2 +2 +0 +4 +4 +1 +2 +3 +0 +0 +0 +0 +3 +0 +0 +3 +4 +4 +0 +1 +0 +3 +4 +0 +1 +0 +4 +3 +2 +2 +0 +0 +1 +2 +0 +0 +2 +4 +2 +2 +4 +0 +4 +3 +0 +1 +0 +4 +0 +0 +1 +1 +2 +0 +0 +1 +3 +0 +4 +0 +3 +0 +3 +0 +1 +2 +0 +0 +1 +2 +0 +4 +0 +1 +0 +4 +0 +1 +0 +0 +3 +3 +0 +0 +0 +4 +0 +0 +4 +2 +1 +4 +0 +1 +2 +1 +1 +4 +0 +4 +0 +1 +2 +0 +0 +0 +0 +4 +3 +2 +4 +0 +0 +4 +1 +0 +4 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +0 +2 +0 +2 +0 +4 +0 +4 +0 +2 +2 +0 +1 +3 +2 +0 +2 +1 +0 +3 +0 +1 +2 +0 +2 +4 +1 +0 +0 +1 +1 +1 +1 +2 +0 +0 +1 +4 +3 +0 +3 +3 +4 +0 +0 +2 +0 +1 +3 +2 +0 +0 +4 +1 +4 +0 +2 +0 +3 +0 +1 +0 +4 +4 +0 +1 +0 +1 +2 +0 +0 +3 +0 +2 +2 +3 +3 +3 +0 +0 +1 +0 +0 +1 +2 +0 +0 +0 +1 +0 +0 +0 +2 +4 +1 +1 +3 +1 +3 +4 +0 +0 +4 +1 +4 +3 +1 +0 +0 +0 +4 +0 +4 +1 +4 +0 +0 +0 +3 +0 +1 +3 +0 +2 +0 +0 +0 +0 +4 +0 +4 +0 +3 +1 +0 +3 +2 +0 +1 +0 +0 +0 +0 +0 +0 +4 +0 +4 +3 +0 +1 +1 +0 +3 +4 +1 +0 +2 +2 +0 +0 +0 +0 +0 +0 +0 +0 +2 +4 +0 +4 +2 +0 +0 +1 +3 +3 +2 +0 +1 +0 +0 +3 +0 +1 +4 +4 +2 +4 +0 +4 +2 +1 +4 +0 +0 +1 +0 +0 +0 +2 +4 +2 +0 +1 +2 +0 +2 +4 +3 +0 +0 +3 +1 +0 +0 +0 +0 +1 +1 +0 +0 +0 +4 +0 +4 +3 +4 +0 +2 +0 +1 +3 +0 +1 +4 +0 +0 +0 +2 +0 +2 +1 +3 +0 +0 +0 +0 +0 +4 +4 +1 +3 +0 +0 +0 +0 +2 +1 +0 +2 +0 +0 +0 +2 +1 +0 +0 +1 +2 +0 +3 +0 +3 +0 +1 +1 +0 +1 +0 +0 +1 +2 +0 +0 +2 +2 +3 +2 +2 +0 +4 +1 +3 +0 +0 +1 +0 +0 +2 +2 +0 +4 +2 +0 +1 +4 +0 +3 +2 +0 +2 +0 +3 +0 +1 +0 +0 +0 +0 +3 +0 +0 +3 +1 +2 +0 +2 +1 +0 +1 +0 +0 +0 +4 +4 +0 +0 +0 +3 +4 +0 +2 +0 +0 +0 +2 +0 +0 +0 +3 +3 +3 +0 +0 +3 +3 +0 +0 +0 +0 +0 +2 +2 +0 +2 +0 +1 +3 +0 +0 +4 +0 +0 +0 +3 +2 +2 +2 +0 +3 +2 +4 +0 +3 +0 +0 +0 +3 +1 +0 +0 +0 +1 +4 +3 +1 +0 +2 +0 +0 +0 +0 +0 +0 +1 +2 +0 +2 +0 +3 +3 +0 +1 +2 +0 +0 +4 +4 +0 +2 +4 +1 +0 +2 +4 +0 +0 +2 +0 +0 +2 +0 +1 +2 +3 +0 +0 +1 +4 +1 +2 +4 +0 +0 +2 +4 +0 +0 +2 +2 +2 +4 +2 +2 +0 +4 +3 +4 +0 +0 +0 +1 +2 +0 +4 +2 +4 +2 +0 +2 +0 +0 +2 +1 +1 +0 +3 +0 +0 +0 +4 +0 +0 +0 +3 +0 +0 +4 +3 +0 +0 +2 +0 +0 +0 +2 +0 +1 +1 +0 +0 +2 +0 +0 +1 +2 +3 +0 +0 +0 +0 +4 +2 +1 +0 +0 +0 +4 +0 +1 +3 +0 +0 +3 +4 +3 +1 +3 +4 +0 +0 +0 +0 +4 +1 +0 +4 +0 +3 +4 +1 +4 +2 +1 +2 +3 +1 +0 +2 +1 +4 +0 +1 +4 +3 +1 +3 +0 +1 +4 +1 +0 +3 +1 +0 +0 +3 +2 +4 +2 +1 +1 +0 +1 +0 +3 +0 +3 +3 +3 +0 +0 +2 +4 +0 +0 +0 +0 +3 +0 +2 +4 +0 +0 +0 +2 +0 +1 +4 +0 +4 +3 +1 +2 +2 +0 +3 +1 +0 +1 +0 +4 +3 +3 +0 +0 +0 +3 +4 +4 +1 +0 +3 +4 +4 +0 +0 +0 +0 +0 +4 +0 +1 +0 +4 +0 +2 +0 +4 +0 +2 +4 +4 +0 +0 +0 +1 +3 +0 +3 +1 +1 +3 +3 +0 +3 +3 +3 +0 +2 +0 +1 +0 +0 +0 +0 +0 +0 +1 +0 +0 +3 +0 +1 +0 +2 +0 +0 +1 +0 +2 +0 +3 +0 +0 +0 diff --git a/RHF_64/test.sh b/RHF_64/test.sh new file mode 100755 index 0000000..90bcc97 --- /dev/null +++ b/RHF_64/test.sh @@ -0,0 +1,19 @@ +#!/bin/sh +#获取文件夹下所有文件 +# +folder="./Input_data/Data_10000/" +funcFolder="./routerFuncData/Function_10000/" + +softFolder=$(ls $folder) +for subFolder in ${softFolder} +do + # build the same dirs for funcFolder + # echo "subFolder: ${folder}${subFolder}" + sFile=$(ls ${folder}${subFolder}) + for inFIle in ${sFile} + do + # echo "inFIle: ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle}" + ./router_mega/Generate 1 ${folder}${subFolder}/${inFIle} ${funcFolder}${subFolder}/out_${inFIle} -t + done +done +